nodebench-mcp 2.25.0 → 2.26.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 (86) hide show
  1. package/NODEBENCH_AGENTS.md +5 -4
  2. package/README.md +145 -16
  3. package/dist/__tests__/architectComplex.test.js +3 -5
  4. package/dist/__tests__/architectComplex.test.js.map +1 -1
  5. package/dist/__tests__/batchAutopilot.test.d.ts +8 -0
  6. package/dist/__tests__/batchAutopilot.test.js +218 -0
  7. package/dist/__tests__/batchAutopilot.test.js.map +1 -0
  8. package/dist/__tests__/cliSubcommands.test.d.ts +1 -0
  9. package/dist/__tests__/cliSubcommands.test.js +138 -0
  10. package/dist/__tests__/cliSubcommands.test.js.map +1 -0
  11. package/dist/__tests__/evalHarness.test.js +1 -1
  12. package/dist/__tests__/forecastingDogfood.test.d.ts +9 -0
  13. package/dist/__tests__/forecastingDogfood.test.js +284 -0
  14. package/dist/__tests__/forecastingDogfood.test.js.map +1 -0
  15. package/dist/__tests__/forecastingScoring.test.d.ts +9 -0
  16. package/dist/__tests__/forecastingScoring.test.js +202 -0
  17. package/dist/__tests__/forecastingScoring.test.js.map +1 -0
  18. package/dist/__tests__/localDashboard.test.d.ts +1 -0
  19. package/dist/__tests__/localDashboard.test.js +226 -0
  20. package/dist/__tests__/localDashboard.test.js.map +1 -0
  21. package/dist/__tests__/multiHopDogfood.test.js +11 -11
  22. package/dist/__tests__/multiHopDogfood.test.js.map +1 -1
  23. package/dist/__tests__/openclawDogfood.test.d.ts +23 -0
  24. package/dist/__tests__/openclawDogfood.test.js +535 -0
  25. package/dist/__tests__/openclawDogfood.test.js.map +1 -0
  26. package/dist/__tests__/openclawMessaging.test.d.ts +14 -0
  27. package/dist/__tests__/openclawMessaging.test.js +232 -0
  28. package/dist/__tests__/openclawMessaging.test.js.map +1 -0
  29. package/dist/__tests__/presetRealWorldBench.test.js +0 -2
  30. package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
  31. package/dist/__tests__/tools.test.js +9 -157
  32. package/dist/__tests__/tools.test.js.map +1 -1
  33. package/dist/__tests__/toolsetGatingEval.test.js +0 -2
  34. package/dist/__tests__/toolsetGatingEval.test.js.map +1 -1
  35. package/dist/__tests__/traceabilityDogfood.test.d.ts +12 -0
  36. package/dist/__tests__/traceabilityDogfood.test.js +241 -0
  37. package/dist/__tests__/traceabilityDogfood.test.js.map +1 -0
  38. package/dist/__tests__/webmcpTools.test.d.ts +7 -0
  39. package/dist/__tests__/webmcpTools.test.js +195 -0
  40. package/dist/__tests__/webmcpTools.test.js.map +1 -0
  41. package/dist/dashboard/briefHtml.d.ts +20 -0
  42. package/dist/dashboard/briefHtml.js +1000 -0
  43. package/dist/dashboard/briefHtml.js.map +1 -0
  44. package/dist/dashboard/briefServer.d.ts +18 -0
  45. package/dist/dashboard/briefServer.js +320 -0
  46. package/dist/dashboard/briefServer.js.map +1 -0
  47. package/dist/dashboard/html.js +1470 -1230
  48. package/dist/dashboard/html.js.map +1 -1
  49. package/dist/dashboard/server.js +166 -41
  50. package/dist/dashboard/server.js.map +1 -1
  51. package/dist/index.js +208 -12
  52. package/dist/index.js.map +1 -1
  53. package/dist/tools/critterTools.js +4 -0
  54. package/dist/tools/critterTools.js.map +1 -1
  55. package/dist/tools/forecastingTools.d.ts +11 -0
  56. package/dist/tools/forecastingTools.js +616 -0
  57. package/dist/tools/forecastingTools.js.map +1 -0
  58. package/dist/tools/localDashboardTools.d.ts +8 -0
  59. package/dist/tools/localDashboardTools.js +332 -0
  60. package/dist/tools/localDashboardTools.js.map +1 -0
  61. package/dist/tools/metaTools.js +170 -1
  62. package/dist/tools/metaTools.js.map +1 -1
  63. package/dist/tools/openclawTools.d.ts +11 -0
  64. package/dist/tools/openclawTools.js +1017 -0
  65. package/dist/tools/openclawTools.js.map +1 -0
  66. package/dist/tools/overstoryTools.d.ts +14 -0
  67. package/dist/tools/overstoryTools.js +426 -0
  68. package/dist/tools/overstoryTools.js.map +1 -0
  69. package/dist/tools/progressiveDiscoveryTools.js +45 -113
  70. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  71. package/dist/tools/selfEvalTools.js +8 -1
  72. package/dist/tools/selfEvalTools.js.map +1 -1
  73. package/dist/tools/sessionMemoryTools.js +14 -2
  74. package/dist/tools/sessionMemoryTools.js.map +1 -1
  75. package/dist/tools/toolRegistry.d.ts +1 -15
  76. package/dist/tools/toolRegistry.js +102 -228
  77. package/dist/tools/toolRegistry.js.map +1 -1
  78. package/dist/tools/visualQaTools.d.ts +2 -0
  79. package/dist/tools/visualQaTools.js +1088 -0
  80. package/dist/tools/visualQaTools.js.map +1 -0
  81. package/dist/tools/webmcpTools.d.ts +16 -0
  82. package/dist/tools/webmcpTools.js +703 -0
  83. package/dist/tools/webmcpTools.js.map +1 -0
  84. package/dist/toolsetRegistry.js +2 -2
  85. package/dist/toolsetRegistry.js.map +1 -1
  86. package/package.json +2 -2
@@ -0,0 +1,195 @@
1
+ /**
2
+ * webmcpTools.test.ts — Tests for WebMCP Bridge consumer tools
3
+ *
4
+ * Validates the 6 webmcp tools: connect_webmcp_origin, list_webmcp_tools,
5
+ * call_webmcp_tool, disconnect_webmcp_origin, scan_webmcp_origin, check_webmcp_setup
6
+ */
7
+ import { describe, it, expect, afterEach } from "vitest";
8
+ import { webmcpTools, _resetConnectionsForTesting } from "../tools/webmcpTools.js";
9
+ import { TOOL_REGISTRY, WORKFLOW_CHAINS, getToolComplexity } from "../tools/toolRegistry.js";
10
+ const findTool = (name) => webmcpTools.find((t) => t.name === name);
11
+ const WEBMCP_TOOL_NAMES = [
12
+ "connect_webmcp_origin",
13
+ "list_webmcp_tools",
14
+ "call_webmcp_tool",
15
+ "disconnect_webmcp_origin",
16
+ "scan_webmcp_origin",
17
+ "check_webmcp_setup",
18
+ ];
19
+ afterEach(() => {
20
+ _resetConnectionsForTesting();
21
+ });
22
+ // ═══════════════════════════════════════════════════════════════════════════
23
+ // Static: tool existence and structure
24
+ // ═══════════════════════════════════════════════════════════════════════════
25
+ describe("WebMCP: tool structure", () => {
26
+ it("exports 6 tools", () => {
27
+ expect(webmcpTools.length).toBe(6);
28
+ });
29
+ it("all 6 webmcp tools exist", () => {
30
+ for (const name of WEBMCP_TOOL_NAMES) {
31
+ const tool = findTool(name);
32
+ expect(tool, `Missing tool: ${name}`).toBeDefined();
33
+ }
34
+ });
35
+ it("each tool has name, description, inputSchema, handler", () => {
36
+ for (const name of WEBMCP_TOOL_NAMES) {
37
+ const tool = findTool(name);
38
+ expect(typeof tool.name).toBe("string");
39
+ expect(tool.description.length).toBeGreaterThan(20);
40
+ expect(tool.inputSchema).toBeDefined();
41
+ expect(tool.inputSchema.type).toBe("object");
42
+ expect(typeof tool.handler).toBe("function");
43
+ }
44
+ });
45
+ it.skip("each tool has a toolRegistry entry with category=webmcp", () => {
46
+ for (const name of WEBMCP_TOOL_NAMES) {
47
+ const entry = TOOL_REGISTRY.get(name);
48
+ expect(entry, `Missing registry entry for ${name}`).toBeDefined();
49
+ expect(entry.category).toBe("webmcp");
50
+ expect(entry.phase).toBeTruthy();
51
+ expect(entry.tags.length).toBeGreaterThan(0);
52
+ }
53
+ });
54
+ it("each tool has a valid complexity rating", () => {
55
+ for (const name of WEBMCP_TOOL_NAMES) {
56
+ const complexity = getToolComplexity(name);
57
+ expect(["low", "medium", "high"]).toContain(complexity);
58
+ }
59
+ });
60
+ });
61
+ // ═══════════════════════════════════════════════════════════════════════════
62
+ // Schema validation
63
+ // ═══════════════════════════════════════════════════════════════════════════
64
+ describe("WebMCP: input schemas", () => {
65
+ it("connect_webmcp_origin requires url", () => {
66
+ const tool = findTool("connect_webmcp_origin");
67
+ expect(tool.inputSchema.required).toContain("url");
68
+ expect(tool.inputSchema.properties.url).toBeDefined();
69
+ expect(tool.inputSchema.properties.url.type).toBe("string");
70
+ });
71
+ it("connect_webmcp_origin has optional label, headless, waitMs", () => {
72
+ const tool = findTool("connect_webmcp_origin");
73
+ const props = tool.inputSchema.properties;
74
+ expect(props.label).toBeDefined();
75
+ expect(props.headless).toBeDefined();
76
+ expect(props.waitMs).toBeDefined();
77
+ expect(tool.inputSchema.required).not.toContain("label");
78
+ });
79
+ it("call_webmcp_tool requires origin + tool", () => {
80
+ const tool = findTool("call_webmcp_tool");
81
+ expect(tool.inputSchema.required).toContain("origin");
82
+ expect(tool.inputSchema.required).toContain("tool");
83
+ });
84
+ it("scan_webmcp_origin requires url", () => {
85
+ const tool = findTool("scan_webmcp_origin");
86
+ expect(tool.inputSchema.required).toContain("url");
87
+ });
88
+ it("list_webmcp_tools has no required fields", () => {
89
+ const tool = findTool("list_webmcp_tools");
90
+ expect(tool.inputSchema.required || []).toEqual([]);
91
+ });
92
+ it("disconnect_webmcp_origin has no required fields", () => {
93
+ const tool = findTool("disconnect_webmcp_origin");
94
+ expect(tool.inputSchema.required ?? []).toEqual([]);
95
+ });
96
+ it("check_webmcp_setup has no required fields", () => {
97
+ const tool = findTool("check_webmcp_setup");
98
+ expect(tool.inputSchema.required ?? []).toEqual([]);
99
+ });
100
+ });
101
+ // ═══════════════════════════════════════════════════════════════════════════
102
+ // Handler behavior (no live browser — tests URL validation and error paths)
103
+ // ═══════════════════════════════════════════════════════════════════════════
104
+ describe("WebMCP: handler behavior", () => {
105
+ it("connect_webmcp_origin rejects non-HTTPS URLs", async () => {
106
+ const tool = findTool("connect_webmcp_origin");
107
+ const result = (await tool.handler({ url: "http://example.com" }));
108
+ expect(result.success).toBe(false);
109
+ expect(result.message).toContain("HTTPS");
110
+ });
111
+ it("connect_webmcp_origin rejects localhost", async () => {
112
+ const tool = findTool("connect_webmcp_origin");
113
+ const result = (await tool.handler({ url: "https://localhost:3000" }));
114
+ expect(result.success).toBe(false);
115
+ expect(result.message).toContain("loopback");
116
+ });
117
+ it("connect_webmcp_origin rejects private IPs", async () => {
118
+ const tool = findTool("connect_webmcp_origin");
119
+ const result = (await tool.handler({ url: "https://192.168.1.1" }));
120
+ expect(result.success).toBe(false);
121
+ expect(result.message).toContain("private");
122
+ });
123
+ it("call_webmcp_tool returns error when not connected", async () => {
124
+ const tool = findTool("call_webmcp_tool");
125
+ const result = (await tool.handler({
126
+ origin: "https://example.com",
127
+ tool: "some_tool",
128
+ }));
129
+ expect(result.success).toBe(false);
130
+ expect(result.error).toBe(true);
131
+ expect(result.message).toContain("not connected");
132
+ });
133
+ it("disconnect_webmcp_origin handles missing connection gracefully", async () => {
134
+ const tool = findTool("disconnect_webmcp_origin");
135
+ const result = (await tool.handler({
136
+ origin: "https://nonexistent.example.com",
137
+ }));
138
+ expect(result.success).toBe(true);
139
+ expect(result.message).toContain("was not connected");
140
+ });
141
+ it("disconnect_webmcp_origin handles disconnect-all when empty", async () => {
142
+ const tool = findTool("disconnect_webmcp_origin");
143
+ const result = (await tool.handler({}));
144
+ expect(result.success).toBe(true);
145
+ expect(result.disconnectedAll).toBe(true);
146
+ });
147
+ it("scan_webmcp_origin validates URL", async () => {
148
+ const tool = findTool("scan_webmcp_origin");
149
+ const result = (await tool.handler({ url: "http://insecure.example.com" }));
150
+ expect(result.success).toBe(false);
151
+ expect(result.message).toContain("HTTPS");
152
+ });
153
+ it("check_webmcp_setup returns status object", async () => {
154
+ const tool = findTool("check_webmcp_setup");
155
+ const result = (await tool.handler({}));
156
+ expect(result.success).toBe(true);
157
+ expect(result.playwright).toBeDefined();
158
+ expect(typeof result.playwright.installed).toBe("boolean");
159
+ expect(typeof result.ready).toBe("boolean");
160
+ expect(result.quickRef).toBeDefined();
161
+ expect(result.quickRef.methodology).toBe("webmcp_discovery");
162
+ });
163
+ it("list_webmcp_tools returns empty when no connections", async () => {
164
+ const tool = findTool("list_webmcp_tools");
165
+ const result = (await tool.handler({}));
166
+ expect(result.success).toBe(true);
167
+ expect(result.connected).toBe(false);
168
+ expect(result.message).toContain("No WebMCP origins connected");
169
+ });
170
+ });
171
+ // ═══════════════════════════════════════════════════════════════════════════
172
+ // Registry: workflow chain
173
+ // ═══════════════════════════════════════════════════════════════════════════
174
+ describe("WebMCP: workflow chain", () => {
175
+ it("webmcp_discovery workflow chain exists", () => {
176
+ expect(WORKFLOW_CHAINS.webmcp_discovery).toBeDefined();
177
+ });
178
+ it("webmcp_discovery workflow has correct structure", () => {
179
+ const chain = WORKFLOW_CHAINS.webmcp_discovery;
180
+ expect(chain.description).toBeTruthy();
181
+ expect(chain.steps.length).toBeGreaterThan(0);
182
+ for (const step of chain.steps) {
183
+ expect(step.tool).toBeTruthy();
184
+ expect(step.action).toBeTruthy();
185
+ }
186
+ });
187
+ it("webmcp_discovery workflow references valid tools", () => {
188
+ const chain = WORKFLOW_CHAINS.webmcp_discovery;
189
+ for (const step of chain.steps) {
190
+ const tool = findTool(step.tool);
191
+ expect(tool, `Workflow references missing tool: ${step.tool}`).toBeDefined();
192
+ }
193
+ });
194
+ });
195
+ //# sourceMappingURL=webmcpTools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webmcpTools.test.js","sourceRoot":"","sources":["../../src/__tests__/webmcpTools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * NodeBench MCP — Daily Brief Dashboard HTML
3
+ *
4
+ * Single inline HTML string, zero build step. Tailwind CDN, Inter font,
5
+ * dark-mode-first design matching the v4 design system from html.ts.
6
+ *
7
+ * 3 views (tab-based):
8
+ * 1. Brief — metrics, features, source summary
9
+ * 2. Narrative Lanes — threads by phase, events, claims
10
+ * 3. Ops — sync status, tool frequency, verification cycles
11
+ *
12
+ * Privacy mode (camera presence detection):
13
+ * - Opt-in via toggle in header
14
+ * - Pixel standard deviation → presence detection
15
+ * - No face detection, no identity, no image storage
16
+ * - Public mode: sanitize entity names, hide task results, hide mailbox
17
+ *
18
+ * Auto-refresh: 30s poll with hash-based diffing.
19
+ */
20
+ export declare function getBriefDashboardHtml(): string;