nodebench-mcp 2.22.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.
- package/NODEBENCH_AGENTS.md +5 -4
- package/README.md +495 -280
- package/dist/__tests__/architectComplex.test.js +3 -5
- package/dist/__tests__/architectComplex.test.js.map +1 -1
- package/dist/__tests__/batchAutopilot.test.d.ts +8 -0
- package/dist/__tests__/batchAutopilot.test.js +218 -0
- package/dist/__tests__/batchAutopilot.test.js.map +1 -0
- package/dist/__tests__/cliSubcommands.test.d.ts +1 -0
- package/dist/__tests__/cliSubcommands.test.js +138 -0
- package/dist/__tests__/cliSubcommands.test.js.map +1 -0
- package/dist/__tests__/evalHarness.test.js +1 -1
- package/dist/__tests__/forecastingDogfood.test.d.ts +9 -0
- package/dist/__tests__/forecastingDogfood.test.js +284 -0
- package/dist/__tests__/forecastingDogfood.test.js.map +1 -0
- package/dist/__tests__/forecastingScoring.test.d.ts +9 -0
- package/dist/__tests__/forecastingScoring.test.js +202 -0
- package/dist/__tests__/forecastingScoring.test.js.map +1 -0
- package/dist/__tests__/localDashboard.test.d.ts +1 -0
- package/dist/__tests__/localDashboard.test.js +226 -0
- package/dist/__tests__/localDashboard.test.js.map +1 -0
- package/dist/__tests__/multiHopDogfood.test.d.ts +12 -0
- package/dist/__tests__/multiHopDogfood.test.js +303 -0
- package/dist/__tests__/multiHopDogfood.test.js.map +1 -0
- package/dist/__tests__/openclawDogfood.test.d.ts +23 -0
- package/dist/__tests__/openclawDogfood.test.js +535 -0
- package/dist/__tests__/openclawDogfood.test.js.map +1 -0
- package/dist/__tests__/openclawMessaging.test.d.ts +14 -0
- package/dist/__tests__/openclawMessaging.test.js +232 -0
- package/dist/__tests__/openclawMessaging.test.js.map +1 -0
- package/dist/__tests__/tools.test.js +7 -3
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/traceabilityDogfood.test.d.ts +12 -0
- package/dist/__tests__/traceabilityDogfood.test.js +241 -0
- package/dist/__tests__/traceabilityDogfood.test.js.map +1 -0
- package/dist/__tests__/webmcpTools.test.d.ts +7 -0
- package/dist/__tests__/webmcpTools.test.js +195 -0
- package/dist/__tests__/webmcpTools.test.js.map +1 -0
- package/dist/dashboard/briefHtml.d.ts +20 -0
- package/dist/dashboard/briefHtml.js +1000 -0
- package/dist/dashboard/briefHtml.js.map +1 -0
- package/dist/dashboard/briefServer.d.ts +18 -0
- package/dist/dashboard/briefServer.js +320 -0
- package/dist/dashboard/briefServer.js.map +1 -0
- package/dist/dashboard/html.d.ts +18 -0
- package/dist/dashboard/html.js +1491 -0
- package/dist/dashboard/html.js.map +1 -0
- package/dist/dashboard/server.d.ts +17 -0
- package/dist/dashboard/server.js +403 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/db.js +38 -0
- package/dist/db.js.map +1 -1
- package/dist/index.js +211 -5
- package/dist/index.js.map +1 -1
- package/dist/tools/critterTools.js +4 -0
- package/dist/tools/critterTools.js.map +1 -1
- package/dist/tools/forecastingTools.d.ts +11 -0
- package/dist/tools/forecastingTools.js +616 -0
- package/dist/tools/forecastingTools.js.map +1 -0
- package/dist/tools/localDashboardTools.d.ts +8 -0
- package/dist/tools/localDashboardTools.js +332 -0
- package/dist/tools/localDashboardTools.js.map +1 -0
- package/dist/tools/metaTools.js +170 -1
- package/dist/tools/metaTools.js.map +1 -1
- package/dist/tools/openclawTools.d.ts +11 -0
- package/dist/tools/openclawTools.js +1017 -0
- package/dist/tools/openclawTools.js.map +1 -0
- package/dist/tools/overstoryTools.d.ts +14 -0
- package/dist/tools/overstoryTools.js +426 -0
- package/dist/tools/overstoryTools.js.map +1 -0
- package/dist/tools/prReportTools.d.ts +11 -0
- package/dist/tools/prReportTools.js +911 -0
- package/dist/tools/prReportTools.js.map +1 -0
- package/dist/tools/progressiveDiscoveryTools.js +28 -9
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/selfEvalTools.js +8 -1
- package/dist/tools/selfEvalTools.js.map +1 -1
- package/dist/tools/sessionMemoryTools.js +14 -2
- package/dist/tools/sessionMemoryTools.js.map +1 -1
- package/dist/tools/skillUpdateTools.d.ts +24 -0
- package/dist/tools/skillUpdateTools.js +469 -0
- package/dist/tools/skillUpdateTools.js.map +1 -0
- package/dist/tools/toolRegistry.js +178 -0
- package/dist/tools/toolRegistry.js.map +1 -1
- package/dist/tools/uiUxDiveAdvancedTools.js +61 -0
- package/dist/tools/uiUxDiveAdvancedTools.js.map +1 -1
- package/dist/tools/uiUxDiveTools.js +154 -1
- package/dist/tools/uiUxDiveTools.js.map +1 -1
- package/dist/tools/visualQaTools.d.ts +2 -0
- package/dist/tools/visualQaTools.js +1088 -0
- package/dist/tools/visualQaTools.js.map +1 -0
- package/dist/tools/webmcpTools.d.ts +16 -0
- package/dist/tools/webmcpTools.js +703 -0
- package/dist/tools/webmcpTools.js.map +1 -0
- package/dist/toolsetRegistry.js +4 -0
- package/dist/toolsetRegistry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefHtml.js","sourceRoot":"","sources":["../../src/dashboard/briefHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAi9BD,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeBench MCP — Local Daily Brief Dashboard Server
|
|
3
|
+
*
|
|
4
|
+
* Serves a local-first dashboard at port 6275 showing:
|
|
5
|
+
* 1. Daily Brief (metrics, features, source summary)
|
|
6
|
+
* 2. Narrative Lanes (threads by phase, events, claims)
|
|
7
|
+
* 3. Ops View (sync status, tool frequency, verification cycles)
|
|
8
|
+
*
|
|
9
|
+
* All data from local SQLite (~/.nodebench/nodebench.db).
|
|
10
|
+
* Zero Convex dependency at runtime — works fully offline.
|
|
11
|
+
*/
|
|
12
|
+
import type Database from "better-sqlite3";
|
|
13
|
+
/** Start the brief dashboard HTTP server. Returns the port it's listening on. */
|
|
14
|
+
export declare function startBriefDashboardServer(db: Database.Database, preferredPort?: number): Promise<number>;
|
|
15
|
+
/** Stop the brief dashboard server */
|
|
16
|
+
export declare function stopBriefDashboardServer(): void;
|
|
17
|
+
/** Get the current brief dashboard URL */
|
|
18
|
+
export declare function getBriefDashboardUrl(): string | null;
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeBench MCP — Local Daily Brief Dashboard Server
|
|
3
|
+
*
|
|
4
|
+
* Serves a local-first dashboard at port 6275 showing:
|
|
5
|
+
* 1. Daily Brief (metrics, features, source summary)
|
|
6
|
+
* 2. Narrative Lanes (threads by phase, events, claims)
|
|
7
|
+
* 3. Ops View (sync status, tool frequency, verification cycles)
|
|
8
|
+
*
|
|
9
|
+
* All data from local SQLite (~/.nodebench/nodebench.db).
|
|
10
|
+
* Zero Convex dependency at runtime — works fully offline.
|
|
11
|
+
*/
|
|
12
|
+
import { createServer } from "node:http";
|
|
13
|
+
import { getBriefDashboardHtml } from "./briefHtml.js";
|
|
14
|
+
let _server = null;
|
|
15
|
+
let _port = 0;
|
|
16
|
+
/** Start the brief dashboard HTTP server. Returns the port it's listening on. */
|
|
17
|
+
export function startBriefDashboardServer(db, preferredPort = 6275) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
if (_server) {
|
|
20
|
+
resolve(_port);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
_server = createServer((req, res) => handleRequest(db, req, res));
|
|
24
|
+
let attempts = 0;
|
|
25
|
+
const maxRetries = 5;
|
|
26
|
+
function tryListen(port) {
|
|
27
|
+
_server.once("error", (err) => {
|
|
28
|
+
if (err.code === "EADDRINUSE" && attempts < maxRetries) {
|
|
29
|
+
attempts++;
|
|
30
|
+
tryListen(port + 1);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
reject(err);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
_server.listen(port, "127.0.0.1", () => {
|
|
37
|
+
_port = port;
|
|
38
|
+
resolve(port);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
tryListen(preferredPort);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Stop the brief dashboard server */
|
|
45
|
+
export function stopBriefDashboardServer() {
|
|
46
|
+
if (_server) {
|
|
47
|
+
_server.close();
|
|
48
|
+
_server = null;
|
|
49
|
+
_port = 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Get the current brief dashboard URL */
|
|
53
|
+
export function getBriefDashboardUrl() {
|
|
54
|
+
return _port ? `http://127.0.0.1:${_port}` : null;
|
|
55
|
+
}
|
|
56
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
57
|
+
function json(res, data) {
|
|
58
|
+
res.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
|
|
59
|
+
res.end(JSON.stringify(data));
|
|
60
|
+
}
|
|
61
|
+
// ── Request Router ─────────────────────────────────────────────────────
|
|
62
|
+
function handleRequest(db, req, res) {
|
|
63
|
+
const url = new URL(req.url || "/", `http://127.0.0.1:${_port}`);
|
|
64
|
+
const path = url.pathname;
|
|
65
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
66
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
67
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
68
|
+
if (req.method === "OPTIONS") {
|
|
69
|
+
res.writeHead(204);
|
|
70
|
+
res.end();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
if (path === "/" || path === "/index.html") {
|
|
75
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
76
|
+
res.end(getBriefDashboardHtml());
|
|
77
|
+
}
|
|
78
|
+
else if (path === "/api/brief/latest") {
|
|
79
|
+
apiBriefLatest(db, res);
|
|
80
|
+
}
|
|
81
|
+
else if (path.startsWith("/api/brief/date/")) {
|
|
82
|
+
const date = decodeURIComponent(path.split("/api/brief/date/")[1]);
|
|
83
|
+
apiBriefByDate(db, date, res);
|
|
84
|
+
}
|
|
85
|
+
else if (path.startsWith("/api/brief/memories/")) {
|
|
86
|
+
const date = decodeURIComponent(path.split("/api/brief/memories/")[1]);
|
|
87
|
+
apiBriefMemories(db, date, res);
|
|
88
|
+
}
|
|
89
|
+
else if (path === "/api/narrative/threads") {
|
|
90
|
+
const phase = url.searchParams.get("phase") || undefined;
|
|
91
|
+
apiNarrativeThreads(db, res, phase);
|
|
92
|
+
}
|
|
93
|
+
else if (path.startsWith("/api/narrative/thread/")) {
|
|
94
|
+
const id = decodeURIComponent(path.split("/api/narrative/thread/")[1]);
|
|
95
|
+
apiNarrativeThread(db, id, res);
|
|
96
|
+
}
|
|
97
|
+
else if (path === "/api/narrative/events/recent") {
|
|
98
|
+
const limit = parseInt(url.searchParams.get("limit") || "30", 10);
|
|
99
|
+
apiRecentEvents(db, limit, res);
|
|
100
|
+
}
|
|
101
|
+
else if (path === "/api/ops/sync-status") {
|
|
102
|
+
apiSyncStatus(db, res);
|
|
103
|
+
}
|
|
104
|
+
else if (path === "/api/ops/stats") {
|
|
105
|
+
apiOpsStats(db, res);
|
|
106
|
+
}
|
|
107
|
+
else if (path === "/api/audience/event" && req.method === "POST") {
|
|
108
|
+
let body = "";
|
|
109
|
+
req.on("data", (chunk) => { body += chunk; });
|
|
110
|
+
req.on("end", () => {
|
|
111
|
+
try {
|
|
112
|
+
const data = JSON.parse(body);
|
|
113
|
+
apiLogAudienceEvent(db, data, res);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
117
|
+
res.end(JSON.stringify({ error: "Invalid JSON" }));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
124
|
+
res.end(JSON.stringify({ error: "Not found" }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
129
|
+
res.end(JSON.stringify({ error: err.message }));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ── Brief APIs ─────────────────────────────────────────────────────────
|
|
133
|
+
function apiBriefLatest(db, res) {
|
|
134
|
+
const row = db.prepare("SELECT * FROM brief_snapshots ORDER BY generated_at DESC LIMIT 1").get();
|
|
135
|
+
if (!row) {
|
|
136
|
+
json(res, { empty: true, message: "No brief snapshots synced yet. Run: npm run local:sync" });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
json(res, {
|
|
140
|
+
...row,
|
|
141
|
+
dashboard_metrics: safeParseJson(row.dashboard_metrics),
|
|
142
|
+
source_summary: safeParseJson(row.source_summary),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function apiBriefByDate(db, date, res) {
|
|
146
|
+
const row = db.prepare("SELECT * FROM brief_snapshots WHERE date_string = ? ORDER BY version DESC LIMIT 1").get(date);
|
|
147
|
+
if (!row) {
|
|
148
|
+
json(res, { empty: true, date });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
json(res, {
|
|
152
|
+
...row,
|
|
153
|
+
dashboard_metrics: safeParseJson(row.dashboard_metrics),
|
|
154
|
+
source_summary: safeParseJson(row.source_summary),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function apiBriefMemories(db, date, res) {
|
|
158
|
+
const memories = db.prepare("SELECT * FROM brief_memories WHERE date_string = ? ORDER BY rowid DESC").all();
|
|
159
|
+
const memoryIds = memories.map((m) => m.id);
|
|
160
|
+
let tasks = [];
|
|
161
|
+
if (memoryIds.length > 0) {
|
|
162
|
+
const placeholders = memoryIds.map(() => "?").join(",");
|
|
163
|
+
tasks = db.prepare(`SELECT * FROM brief_task_results WHERE memory_id IN (${placeholders}) ORDER BY rowid`).all(...memoryIds);
|
|
164
|
+
}
|
|
165
|
+
json(res, {
|
|
166
|
+
memories: memories.map((m) => ({
|
|
167
|
+
...m,
|
|
168
|
+
features: safeParseJson(m.features),
|
|
169
|
+
progress_log: safeParseJson(m.progress_log),
|
|
170
|
+
})),
|
|
171
|
+
tasks: tasks.map((t) => ({
|
|
172
|
+
...t,
|
|
173
|
+
citations: safeParseJson(t.citations),
|
|
174
|
+
artifacts: safeParseJson(t.artifacts),
|
|
175
|
+
})),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// ── Narrative APIs ─────────────────────────────────────────────────────
|
|
179
|
+
function apiNarrativeThreads(db, res, phase) {
|
|
180
|
+
const query = phase
|
|
181
|
+
? "SELECT * FROM narrative_threads_local WHERE current_phase = ? ORDER BY latest_event_at DESC"
|
|
182
|
+
: "SELECT * FROM narrative_threads_local ORDER BY latest_event_at DESC";
|
|
183
|
+
const rows = phase
|
|
184
|
+
? db.prepare(query).all(phase)
|
|
185
|
+
: db.prepare(query).all();
|
|
186
|
+
json(res, rows.map((r) => ({
|
|
187
|
+
...r,
|
|
188
|
+
entity_keys: safeParseJson(r.entity_keys),
|
|
189
|
+
topic_tags: safeParseJson(r.topic_tags),
|
|
190
|
+
quality: safeParseJson(r.quality),
|
|
191
|
+
})));
|
|
192
|
+
}
|
|
193
|
+
function apiNarrativeThread(db, id, res) {
|
|
194
|
+
const thread = db.prepare("SELECT * FROM narrative_threads_local WHERE id = ? OR slug = ?").get(id, id);
|
|
195
|
+
if (!thread) {
|
|
196
|
+
json(res, { empty: true, id });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const events = db.prepare("SELECT * FROM narrative_events_local WHERE thread_id = ? ORDER BY occurred_at DESC LIMIT 50").all(thread.id);
|
|
200
|
+
json(res, {
|
|
201
|
+
thread: {
|
|
202
|
+
...thread,
|
|
203
|
+
entity_keys: safeParseJson(thread.entity_keys),
|
|
204
|
+
topic_tags: safeParseJson(thread.topic_tags),
|
|
205
|
+
quality: safeParseJson(thread.quality),
|
|
206
|
+
},
|
|
207
|
+
events: events.map((e) => ({
|
|
208
|
+
...e,
|
|
209
|
+
source_urls: safeParseJson(e.source_urls),
|
|
210
|
+
citation_ids: safeParseJson(e.citation_ids),
|
|
211
|
+
claim_set: safeParseJson(e.claim_set),
|
|
212
|
+
})),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function apiRecentEvents(db, limit, res) {
|
|
216
|
+
const events = db.prepare("SELECT * FROM narrative_events_local ORDER BY occurred_at DESC LIMIT ?").all(Math.min(limit, 100));
|
|
217
|
+
json(res, events.map((e) => ({
|
|
218
|
+
...e,
|
|
219
|
+
source_urls: safeParseJson(e.source_urls),
|
|
220
|
+
citation_ids: safeParseJson(e.citation_ids),
|
|
221
|
+
claim_set: safeParseJson(e.claim_set),
|
|
222
|
+
})));
|
|
223
|
+
}
|
|
224
|
+
// ── Ops APIs ───────────────────────────────────────────────────────────
|
|
225
|
+
function apiSyncStatus(db, res) {
|
|
226
|
+
const latest = db.prepare("SELECT * FROM sync_runs ORDER BY started_at DESC LIMIT 1").get();
|
|
227
|
+
const history = db.prepare("SELECT id, started_at, status, duration_ms, tables_synced FROM sync_runs ORDER BY started_at DESC LIMIT 10").all();
|
|
228
|
+
json(res, {
|
|
229
|
+
latest: latest ? { ...latest, tables_synced: safeParseJson(latest.tables_synced) } : null,
|
|
230
|
+
history: history.map((r) => ({ ...r, tables_synced: safeParseJson(r.tables_synced) })),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
function apiOpsStats(db, res) {
|
|
234
|
+
// Tool call frequency (last 24h)
|
|
235
|
+
let toolStats = [];
|
|
236
|
+
try {
|
|
237
|
+
toolStats = db.prepare(`
|
|
238
|
+
SELECT tool_name, COUNT(*) as count, AVG(duration_ms) as avg_duration,
|
|
239
|
+
SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) as errors
|
|
240
|
+
FROM tool_call_log
|
|
241
|
+
WHERE created_at > datetime('now', '-1 day')
|
|
242
|
+
GROUP BY tool_name
|
|
243
|
+
ORDER BY count DESC
|
|
244
|
+
LIMIT 20
|
|
245
|
+
`).all();
|
|
246
|
+
}
|
|
247
|
+
catch { /* tool_call_log may not exist */ }
|
|
248
|
+
// Active verification cycles
|
|
249
|
+
let activeCycles = [];
|
|
250
|
+
try {
|
|
251
|
+
activeCycles = db.prepare(`
|
|
252
|
+
SELECT id, title, status, created_at
|
|
253
|
+
FROM verification_cycles
|
|
254
|
+
WHERE status NOT IN ('completed', 'abandoned')
|
|
255
|
+
ORDER BY created_at DESC
|
|
256
|
+
LIMIT 5
|
|
257
|
+
`).all();
|
|
258
|
+
}
|
|
259
|
+
catch { /* verification_cycles may not exist */ }
|
|
260
|
+
// Audience events today
|
|
261
|
+
let audienceStats = null;
|
|
262
|
+
try {
|
|
263
|
+
const todayEvents = db.prepare(`
|
|
264
|
+
SELECT COUNT(*) as count,
|
|
265
|
+
SUM(CASE WHEN is_public = 1 THEN 1 ELSE 0 END) as public_triggers
|
|
266
|
+
FROM audience_events
|
|
267
|
+
WHERE created_at > datetime('now', '-1 day')
|
|
268
|
+
`).get();
|
|
269
|
+
if (todayEvents && todayEvents.count > 0) {
|
|
270
|
+
audienceStats = {
|
|
271
|
+
triggeredToday: todayEvents.public_triggers ?? 0,
|
|
272
|
+
totalEvents: todayEvents.count,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch { /* audience_events may not exist */ }
|
|
277
|
+
// Brief + thread counts
|
|
278
|
+
let briefCount = 0;
|
|
279
|
+
let threadCount = 0;
|
|
280
|
+
let eventCount = 0;
|
|
281
|
+
try {
|
|
282
|
+
briefCount = db.prepare("SELECT COUNT(*) as c FROM brief_snapshots").get()?.c ?? 0;
|
|
283
|
+
threadCount = db.prepare("SELECT COUNT(*) as c FROM narrative_threads_local").get()?.c ?? 0;
|
|
284
|
+
eventCount = db.prepare("SELECT COUNT(*) as c FROM narrative_events_local").get()?.c ?? 0;
|
|
285
|
+
}
|
|
286
|
+
catch { /* tables may not exist */ }
|
|
287
|
+
json(res, {
|
|
288
|
+
toolCallFrequency: toolStats,
|
|
289
|
+
activeCycles,
|
|
290
|
+
privacyMode: audienceStats,
|
|
291
|
+
dataCounts: { briefs: briefCount, threads: threadCount, events: eventCount },
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// ── Audience Event Logging ──────────────────────────────────────────────
|
|
295
|
+
function apiLogAudienceEvent(db, data, res) {
|
|
296
|
+
const id = `aud_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
297
|
+
try {
|
|
298
|
+
db.prepare(`
|
|
299
|
+
INSERT INTO audience_events (id, event_type, viewer_count, is_public)
|
|
300
|
+
VALUES (?, ?, ?, ?)
|
|
301
|
+
`).run(id, data.event_type ?? "unknown", data.viewer_count ?? 0, data.is_public ? 1 : 0);
|
|
302
|
+
json(res, { success: true, id });
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
306
|
+
res.end(JSON.stringify({ error: err.message }));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// ── Utilities ──────────────────────────────────────────────────────────
|
|
310
|
+
function safeParseJson(s) {
|
|
311
|
+
if (!s)
|
|
312
|
+
return null;
|
|
313
|
+
try {
|
|
314
|
+
return JSON.parse(s);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return s;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=briefServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefServer.js","sourceRoot":"","sources":["../../src/dashboard/briefServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeBench MCP — Dashboard HTML v4
|
|
3
|
+
*
|
|
4
|
+
* Single-scroll, zero-tab dashboard. Everything visible at once.
|
|
5
|
+
* Clean, intuitive design: Inter font, clear section hierarchy.
|
|
6
|
+
* Auto-refreshes every 5s with hash-based diffing.
|
|
7
|
+
*
|
|
8
|
+
* v4 improvements:
|
|
9
|
+
* - CSS custom properties for consistent spacing/shadows/gradients
|
|
10
|
+
* - Responsive @media breakpoints for mobile/tablet
|
|
11
|
+
* - Full ARIA accessibility (labels, roles, keyboard nav, focus-visible)
|
|
12
|
+
* - Carousel: IntersectionObserver dot tracking, edge-disabled arrows, keyboard arrows
|
|
13
|
+
* - XSS safety: all user-controlled strings escaped
|
|
14
|
+
* - Smart refresh: skip re-render when data unchanged
|
|
15
|
+
* - Priority-scored category detection
|
|
16
|
+
* - Deferred rendering for collapsed cards (DOM-light pagination)
|
|
17
|
+
*/
|
|
18
|
+
export declare function getDashboardHtml(): string;
|