nodebench-mcp 2.69.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.
Files changed (214) hide show
  1. package/README.md +95 -39
  2. package/dist/agents/alertRouter.d.ts +38 -0
  3. package/dist/agents/alertRouter.js +151 -0
  4. package/dist/agents/alertRouter.js.map +1 -0
  5. package/dist/agents/entityMemory.d.ts +40 -0
  6. package/dist/agents/entityMemory.js +64 -0
  7. package/dist/agents/entityMemory.js.map +1 -0
  8. package/dist/agents/subAgents.d.ts +35 -0
  9. package/dist/agents/subAgents.js +62 -0
  10. package/dist/agents/subAgents.js.map +1 -0
  11. package/dist/benchmarks/benchmarkRunner.js +14 -0
  12. package/dist/benchmarks/benchmarkRunner.js.map +1 -1
  13. package/dist/benchmarks/chainEval.js +107 -0
  14. package/dist/benchmarks/chainEval.js.map +1 -1
  15. package/dist/benchmarks/llmJudgeEval.js +85 -0
  16. package/dist/benchmarks/llmJudgeEval.js.map +1 -1
  17. package/dist/benchmarks/searchQualityEval.js +118 -5
  18. package/dist/benchmarks/searchQualityEval.js.map +1 -1
  19. package/dist/cli/search.d.ts +13 -0
  20. package/dist/cli/search.js +130 -0
  21. package/dist/cli/search.js.map +1 -0
  22. package/dist/db.d.ts +6 -2
  23. package/dist/db.js +470 -3
  24. package/dist/db.js.map +1 -1
  25. package/dist/index.js +349 -64
  26. package/dist/index.js.map +1 -1
  27. package/dist/profiler/behaviorStore.d.ts +97 -0
  28. package/dist/profiler/behaviorStore.js +276 -0
  29. package/dist/profiler/behaviorStore.js.map +1 -0
  30. package/dist/profiler/eventCollector.d.ts +119 -0
  31. package/dist/profiler/eventCollector.js +267 -0
  32. package/dist/profiler/eventCollector.js.map +1 -0
  33. package/dist/profiler/index.d.ts +15 -0
  34. package/dist/profiler/index.js +16 -0
  35. package/dist/profiler/index.js.map +1 -0
  36. package/dist/profiler/mcpProxy.d.ts +49 -0
  37. package/dist/profiler/mcpProxy.js +123 -0
  38. package/dist/profiler/mcpProxy.js.map +1 -0
  39. package/dist/profiler/modelRouter.d.ts +30 -0
  40. package/dist/profiler/modelRouter.js +99 -0
  41. package/dist/profiler/modelRouter.js.map +1 -0
  42. package/dist/profiler/otelReceiver.d.ts +17 -0
  43. package/dist/profiler/otelReceiver.js +62 -0
  44. package/dist/profiler/otelReceiver.js.map +1 -0
  45. package/dist/profiler/proofEngine.d.ts +41 -0
  46. package/dist/profiler/proofEngine.js +93 -0
  47. package/dist/profiler/proofEngine.js.map +1 -0
  48. package/dist/profiler/workflowTemplates.d.ts +41 -0
  49. package/dist/profiler/workflowTemplates.js +95 -0
  50. package/dist/profiler/workflowTemplates.js.map +1 -0
  51. package/dist/providers/localMemoryProvider.js +3 -2
  52. package/dist/providers/localMemoryProvider.js.map +1 -1
  53. package/dist/runtimeConfig.d.ts +11 -0
  54. package/dist/runtimeConfig.js +27 -0
  55. package/dist/runtimeConfig.js.map +1 -0
  56. package/dist/security/auditLog.js +8 -3
  57. package/dist/security/auditLog.js.map +1 -1
  58. package/dist/subconscious/blocks.d.ts +43 -0
  59. package/dist/subconscious/blocks.js +158 -0
  60. package/dist/subconscious/blocks.js.map +1 -0
  61. package/dist/subconscious/classifier.d.ts +22 -0
  62. package/dist/subconscious/classifier.js +118 -0
  63. package/dist/subconscious/classifier.js.map +1 -0
  64. package/dist/subconscious/graphEngine.d.ts +65 -0
  65. package/dist/subconscious/graphEngine.js +234 -0
  66. package/dist/subconscious/graphEngine.js.map +1 -0
  67. package/dist/subconscious/index.d.ts +19 -0
  68. package/dist/subconscious/index.js +20 -0
  69. package/dist/subconscious/index.js.map +1 -0
  70. package/dist/subconscious/tools.d.ts +5 -0
  71. package/dist/subconscious/tools.js +255 -0
  72. package/dist/subconscious/tools.js.map +1 -0
  73. package/dist/subconscious/whisperPolicy.d.ts +20 -0
  74. package/dist/subconscious/whisperPolicy.js +171 -0
  75. package/dist/subconscious/whisperPolicy.js.map +1 -0
  76. package/dist/sweep/engine.d.ts +27 -0
  77. package/dist/sweep/engine.js +244 -0
  78. package/dist/sweep/engine.js.map +1 -0
  79. package/dist/sweep/index.d.ts +9 -0
  80. package/dist/sweep/index.js +8 -0
  81. package/dist/sweep/index.js.map +1 -0
  82. package/dist/sweep/sources/github_trending.d.ts +6 -0
  83. package/dist/sweep/sources/github_trending.js +37 -0
  84. package/dist/sweep/sources/github_trending.js.map +1 -0
  85. package/dist/sweep/sources/hackernews.d.ts +7 -0
  86. package/dist/sweep/sources/hackernews.js +57 -0
  87. package/dist/sweep/sources/hackernews.js.map +1 -0
  88. package/dist/sweep/sources/openbb_finance.d.ts +9 -0
  89. package/dist/sweep/sources/openbb_finance.js +46 -0
  90. package/dist/sweep/sources/openbb_finance.js.map +1 -0
  91. package/dist/sweep/sources/producthunt.d.ts +6 -0
  92. package/dist/sweep/sources/producthunt.js +41 -0
  93. package/dist/sweep/sources/producthunt.js.map +1 -0
  94. package/dist/sweep/sources/web_signals.d.ts +7 -0
  95. package/dist/sweep/sources/web_signals.js +63 -0
  96. package/dist/sweep/sources/web_signals.js.map +1 -0
  97. package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
  98. package/dist/sweep/sources/yahoo_finance.js +47 -0
  99. package/dist/sweep/sources/yahoo_finance.js.map +1 -0
  100. package/dist/sweep/types.d.ts +50 -0
  101. package/dist/sweep/types.js +9 -0
  102. package/dist/sweep/types.js.map +1 -0
  103. package/dist/sync/founderEpisodeStore.d.ts +98 -0
  104. package/dist/sync/founderEpisodeStore.js +230 -0
  105. package/dist/sync/founderEpisodeStore.js.map +1 -0
  106. package/dist/sync/hyperloopArchive.d.ts +51 -0
  107. package/dist/sync/hyperloopArchive.js +153 -0
  108. package/dist/sync/hyperloopArchive.js.map +1 -0
  109. package/dist/sync/hyperloopEval.d.ts +123 -0
  110. package/dist/sync/hyperloopEval.js +389 -0
  111. package/dist/sync/hyperloopEval.js.map +1 -0
  112. package/dist/sync/hyperloopEval.test.d.ts +4 -0
  113. package/dist/sync/hyperloopEval.test.js +60 -0
  114. package/dist/sync/hyperloopEval.test.js.map +1 -0
  115. package/dist/sync/protocol.d.ts +172 -0
  116. package/dist/sync/protocol.js +9 -0
  117. package/dist/sync/protocol.js.map +1 -0
  118. package/dist/sync/sessionMemory.d.ts +47 -0
  119. package/dist/sync/sessionMemory.js +138 -0
  120. package/dist/sync/sessionMemory.js.map +1 -0
  121. package/dist/sync/store.d.ts +384 -0
  122. package/dist/sync/store.js +1435 -0
  123. package/dist/sync/store.js.map +1 -0
  124. package/dist/sync/store.test.d.ts +4 -0
  125. package/dist/sync/store.test.js +43 -0
  126. package/dist/sync/store.test.js.map +1 -0
  127. package/dist/sync/syncBridgeClient.d.ts +30 -0
  128. package/dist/sync/syncBridgeClient.js +172 -0
  129. package/dist/sync/syncBridgeClient.js.map +1 -0
  130. package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
  131. package/dist/tools/autonomousDeliveryTools.js +1104 -0
  132. package/dist/tools/autonomousDeliveryTools.js.map +1 -0
  133. package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
  134. package/dist/tools/claudeCodeIngestTools.js +347 -0
  135. package/dist/tools/claudeCodeIngestTools.js.map +1 -0
  136. package/dist/tools/coreWorkflowTools.d.ts +2 -0
  137. package/dist/tools/coreWorkflowTools.js +488 -0
  138. package/dist/tools/coreWorkflowTools.js.map +1 -0
  139. package/dist/tools/deltaTools.d.ts +15 -0
  140. package/dist/tools/deltaTools.js +1522 -0
  141. package/dist/tools/deltaTools.js.map +1 -0
  142. package/dist/tools/entityLookupTools.d.ts +14 -0
  143. package/dist/tools/entityLookupTools.js +159 -0
  144. package/dist/tools/entityLookupTools.js.map +1 -0
  145. package/dist/tools/entityTemporalTools.d.ts +12 -0
  146. package/dist/tools/entityTemporalTools.js +330 -0
  147. package/dist/tools/entityTemporalTools.js.map +1 -0
  148. package/dist/tools/founderLocalPipeline.d.ts +215 -0
  149. package/dist/tools/founderLocalPipeline.js +1516 -2
  150. package/dist/tools/founderLocalPipeline.js.map +1 -1
  151. package/dist/tools/founderOperatingModel.d.ts +120 -0
  152. package/dist/tools/founderOperatingModel.js +469 -0
  153. package/dist/tools/founderOperatingModel.js.map +1 -0
  154. package/dist/tools/founderOperatingModelTools.d.ts +2 -0
  155. package/dist/tools/founderOperatingModelTools.js +169 -0
  156. package/dist/tools/founderOperatingModelTools.js.map +1 -0
  157. package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
  158. package/dist/tools/founderStrategicOpsTools.js +1310 -0
  159. package/dist/tools/founderStrategicOpsTools.js.map +1 -0
  160. package/dist/tools/graphifyTools.d.ts +19 -0
  161. package/dist/tools/graphifyTools.js +375 -0
  162. package/dist/tools/graphifyTools.js.map +1 -0
  163. package/dist/tools/index.d.ts +3 -0
  164. package/dist/tools/index.js +4 -0
  165. package/dist/tools/index.js.map +1 -1
  166. package/dist/tools/monteCarloTools.d.ts +16 -0
  167. package/dist/tools/monteCarloTools.js +225 -0
  168. package/dist/tools/monteCarloTools.js.map +1 -0
  169. package/dist/tools/packetCompilerTools.d.ts +12 -0
  170. package/dist/tools/packetCompilerTools.js +322 -0
  171. package/dist/tools/packetCompilerTools.js.map +1 -0
  172. package/dist/tools/planSynthesisTools.d.ts +15 -0
  173. package/dist/tools/planSynthesisTools.js +455 -0
  174. package/dist/tools/planSynthesisTools.js.map +1 -0
  175. package/dist/tools/profilerTools.d.ts +20 -0
  176. package/dist/tools/profilerTools.js +364 -0
  177. package/dist/tools/profilerTools.js.map +1 -0
  178. package/dist/tools/savingsTools.d.ts +11 -0
  179. package/dist/tools/savingsTools.js +155 -0
  180. package/dist/tools/savingsTools.js.map +1 -0
  181. package/dist/tools/scenarioCompilerTools.d.ts +14 -0
  182. package/dist/tools/scenarioCompilerTools.js +290 -0
  183. package/dist/tools/scenarioCompilerTools.js.map +1 -0
  184. package/dist/tools/sharedContextTools.d.ts +2 -0
  185. package/dist/tools/sharedContextTools.js +423 -0
  186. package/dist/tools/sharedContextTools.js.map +1 -0
  187. package/dist/tools/sitemapTools.d.ts +15 -0
  188. package/dist/tools/sitemapTools.js +560 -0
  189. package/dist/tools/sitemapTools.js.map +1 -0
  190. package/dist/tools/sweepTools.d.ts +9 -0
  191. package/dist/tools/sweepTools.js +112 -0
  192. package/dist/tools/sweepTools.js.map +1 -0
  193. package/dist/tools/syncBridgeTools.d.ts +2 -0
  194. package/dist/tools/syncBridgeTools.js +258 -0
  195. package/dist/tools/syncBridgeTools.js.map +1 -0
  196. package/dist/tools/toolRegistry.js +1216 -49
  197. package/dist/tools/toolRegistry.js.map +1 -1
  198. package/dist/tools/workspaceTools.d.ts +19 -0
  199. package/dist/tools/workspaceTools.js +762 -0
  200. package/dist/tools/workspaceTools.js.map +1 -0
  201. package/dist/toolsetRegistry.js +88 -2
  202. package/dist/toolsetRegistry.js.map +1 -1
  203. package/package.json +36 -36
  204. package/rules/nodebench-agentic-reliability.md +32 -0
  205. package/rules/nodebench-analyst-diagnostic.md +25 -0
  206. package/rules/nodebench-auto-qa.md +31 -0
  207. package/rules/nodebench-completion-traceability.md +22 -0
  208. package/rules/nodebench-flywheel-continuous.md +25 -0
  209. package/rules/nodebench-pre-release-review.md +24 -0
  210. package/rules/nodebench-qa-dogfood.md +26 -0
  211. package/rules/nodebench-scenario-testing.md +30 -0
  212. package/rules/nodebench-self-direction.md +23 -0
  213. package/rules/nodebench-self-judge-loop.md +24 -0
  214. 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 useEngine = cliArgs.includes("--engine");
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: ~19 tools. Just decision intelligence + discovery/meta overhead.
61
- // Users call discover_tools → load_toolset to expand. Under Google's 50-tool IDE limit.
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: starter (~19 tools). Progressive discovery is the gateway to 338.
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 starter (19 tools) and full (338 tools)
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 (all under 50 tools for IDE compatibility) ──
81
- // Founder: decision intelligence + company tracking + session memory + local dashboard (~40 tools)
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 (~40 tools)
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: "Starter (~19 tools)decision intelligence + progressive discovery. Use discover_tools load_toolset to expand.",
95
- starter: "Starter (~19 tools)decision intelligence + progressive discovery. Use discover_tools load_toolset to expand.",
108
+ default: "Default v3 surface7 workflow tools plus discovery/meta helpers. Fast boot, one artifact-shaped workflow.",
109
+ starter: "Default v3 surface7 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 (~40 tools)decision intelligence, company tracking, session memory, local dashboard",
121
+ founder: "Founder decision presetcompany tracking, decision intelligence, shared context, local dashboard",
106
122
  banker: "Banker/Analyst (~39 tools) — decision intelligence, company profiling, web research, recon",
107
- operator: "Operator (~40 tools) — decision intelligence, company tracking, causal memory, action tracing",
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
- full: "Everythingall 338 tools for maximum coverage",
126
+ hackathon: "Hackathondecision 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.30.0 — Development Methodology MCP Server",
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 (uses local HuggingFace model or API keys)",
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 (81 tools) - core AI Flywheel",
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 295 tools",
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 starter preset (~19 tools — decision intelligence + discovery)
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 all toolsets to get accurate counts
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 all toolsets to get accurate counts
497
- await loadToolsets(ALL_DOMAIN_KEYS);
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
- : totalTools;
506
- lines.push(`${C}Tools${X} ${presetToolCount} loaded (preset: ${activePreset}) | ${totalTools} total across ${domainCount} domains`);
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 (--no-embedding)`}`);
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} locations${X}`);
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 (99 tools) | --preset full (313 tools)`);
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 = 'default';
1248
- const presetIdx = cliArgs.indexOf("--preset");
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 = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
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
- allTools = [...allToolsWithoutDiscovery, ...discoveryTools, ...dynamicLoadingTools];
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 (non-blocking, best-effort)
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
- try {
3083
- operatingDashboardPort = await startOperatingDashboardServer(getDb(), 6274);
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
- catch { /* operating dashboard is optionaldon't block MCP */ }
3086
- // UI Dive dashboard is secondary — shows UI review sessions
3340
+ // UI Dive dashboard is secondaryalso admin-only
3087
3341
  let dashboardPort = 0;
3088
- try {
3089
- dashboardPort = await startDashboardServer(getDb(), 6278);
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 (non-blocking, best-effort)
3109
- try {
3110
- initObservability(getDb);
3111
- startWatchdog(getDb());
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
- console.error(`nodebench-mcp ready (${allTools.length} tools, ${PROMPTS.length} prompts${toolsetInfo}, SQLite at ~/.nodebench/${dashInfo}${uiDiveInfo}${engineInfo})`);
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