nodebench-mcp 2.25.0 → 2.27.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 +210 -14
  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 +50 -115
  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 +243 -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 +6 -2
  85. package/dist/toolsetRegistry.js.map +1 -1
  86. package/package.json +2 -2
@@ -0,0 +1,616 @@
1
+ /**
2
+ * Forecasting OS — MCP Tools
3
+ *
4
+ * 9 tools for agent-driven forecast lifecycle:
5
+ * create, update, evidence, resolve, track record, calibration, audit trail.
6
+ *
7
+ * Storage: SQLite (local, mirrors Convex schema for offline use).
8
+ * Convex crons handle LinkedIn integration independently.
9
+ */
10
+ import { getDb } from "../db.js";
11
+ // ─── SQLite Schema ──────────────────────────────────────────────────────────
12
+ function ensureForecastTables() {
13
+ const db = getDb();
14
+ db.exec(`
15
+ CREATE TABLE IF NOT EXISTS forecasts (
16
+ id TEXT PRIMARY KEY,
17
+ question TEXT NOT NULL,
18
+ forecast_type TEXT NOT NULL DEFAULT 'binary',
19
+ probability REAL,
20
+ confidence_lower REAL,
21
+ confidence_upper REAL,
22
+ base_rate REAL,
23
+ resolution_date TEXT NOT NULL,
24
+ resolution_criteria TEXT NOT NULL,
25
+ status TEXT NOT NULL DEFAULT 'active',
26
+ top_drivers TEXT DEFAULT '[]',
27
+ top_counterarguments TEXT DEFAULT '[]',
28
+ refresh_frequency TEXT DEFAULT 'weekly',
29
+ last_refreshed_at INTEGER,
30
+ update_count INTEGER DEFAULT 0,
31
+ tags TEXT DEFAULT '[]',
32
+ created_at INTEGER NOT NULL,
33
+ updated_at INTEGER NOT NULL
34
+ );
35
+
36
+ CREATE TABLE IF NOT EXISTS forecast_evidence (
37
+ id TEXT PRIMARY KEY,
38
+ forecast_id TEXT NOT NULL,
39
+ source_url TEXT NOT NULL,
40
+ source_title TEXT NOT NULL,
41
+ source_type TEXT NOT NULL,
42
+ excerpt TEXT NOT NULL,
43
+ signal TEXT NOT NULL,
44
+ impact_on_probability REAL,
45
+ added_at INTEGER NOT NULL,
46
+ FOREIGN KEY (forecast_id) REFERENCES forecasts(id)
47
+ );
48
+
49
+ CREATE TABLE IF NOT EXISTS forecast_resolutions (
50
+ id TEXT PRIMARY KEY,
51
+ forecast_id TEXT NOT NULL UNIQUE,
52
+ outcome TEXT NOT NULL,
53
+ brier_score REAL,
54
+ log_score REAL,
55
+ resolution_notes TEXT NOT NULL,
56
+ resolution_source_url TEXT,
57
+ resolved_at INTEGER NOT NULL,
58
+ FOREIGN KEY (forecast_id) REFERENCES forecasts(id)
59
+ );
60
+
61
+ CREATE TABLE IF NOT EXISTS forecast_update_history (
62
+ id TEXT PRIMARY KEY,
63
+ forecast_id TEXT NOT NULL,
64
+ previous_probability REAL NOT NULL,
65
+ new_probability REAL NOT NULL,
66
+ reasoning TEXT NOT NULL,
67
+ evidence_ids TEXT DEFAULT '[]',
68
+ updated_at INTEGER NOT NULL,
69
+ FOREIGN KEY (forecast_id) REFERENCES forecasts(id)
70
+ );
71
+
72
+ CREATE TABLE IF NOT EXISTS forecast_calibration_log (
73
+ id TEXT PRIMARY KEY,
74
+ window_start TEXT NOT NULL,
75
+ window_end TEXT NOT NULL,
76
+ bins TEXT NOT NULL,
77
+ overall_brier REAL NOT NULL,
78
+ mean_log_score REAL,
79
+ forecast_count INTEGER NOT NULL,
80
+ resolved_count INTEGER NOT NULL,
81
+ created_at INTEGER NOT NULL
82
+ );
83
+ `);
84
+ }
85
+ function genId() {
86
+ return `fc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
87
+ }
88
+ // ─── Scoring (pure functions, duplicated from Convex for offline use) ───────
89
+ function brierScore(p, outcome) {
90
+ const o = outcome === "yes" ? 1 : 0;
91
+ return (p - o) ** 2;
92
+ }
93
+ function logScoreFn(p, outcome) {
94
+ const clamped = Math.max(0.001, Math.min(0.999, p));
95
+ return outcome === "yes" ? -Math.log(clamped) : -Math.log(1 - clamped);
96
+ }
97
+ // ─── Tools ──────────────────────────────────────────────────────────────────
98
+ export const forecastingTools = [
99
+ // 1. create_forecast
100
+ {
101
+ name: "create_forecast",
102
+ description: "Create a new forecast with a question, resolution date, and criteria. Optionally set initial probability, base rate, and evidence. Returns forecast ID for subsequent updates.",
103
+ inputSchema: {
104
+ type: "object",
105
+ properties: {
106
+ question: {
107
+ type: "string",
108
+ description: 'The forecast question, e.g. "Will X happen by date D?"',
109
+ },
110
+ forecastType: {
111
+ type: "string",
112
+ enum: ["binary", "numeric", "categorical"],
113
+ description: "Forecast type (default: binary)",
114
+ },
115
+ resolutionDate: {
116
+ type: "string",
117
+ description: "ISO date (YYYY-MM-DD) when the forecast should be resolved",
118
+ },
119
+ resolutionCriteria: {
120
+ type: "string",
121
+ description: "Objective criteria for resolving the forecast",
122
+ },
123
+ probability: {
124
+ type: "number",
125
+ description: "Initial probability estimate (0-1)",
126
+ },
127
+ baseRate: {
128
+ type: "number",
129
+ description: "Historical base rate for this type of event (0-1)",
130
+ },
131
+ refreshFrequency: {
132
+ type: "string",
133
+ enum: ["daily", "weekly", "on_trigger"],
134
+ description: "How often to auto-refresh (default: weekly)",
135
+ },
136
+ topDrivers: {
137
+ type: "array",
138
+ items: { type: "string" },
139
+ description: "Top 1-3 reasons supporting the forecast",
140
+ },
141
+ topCounterarguments: {
142
+ type: "array",
143
+ items: { type: "string" },
144
+ description: "Top 1-3 disconfirming signals",
145
+ },
146
+ tags: {
147
+ type: "array",
148
+ items: { type: "string" },
149
+ description: "Category tags (e.g. ai_tech, econ, company, geo)",
150
+ },
151
+ },
152
+ required: ["question", "resolutionDate", "resolutionCriteria"],
153
+ },
154
+ handler: async (args) => {
155
+ ensureForecastTables();
156
+ const db = getDb();
157
+ const id = genId();
158
+ const now = Date.now();
159
+ const p = args.probability;
160
+ if (p != null && (p < 0 || p > 1)) {
161
+ return [{ type: "text", text: JSON.stringify({ error: "Probability must be between 0 and 1" }) }];
162
+ }
163
+ db.prepare(`
164
+ INSERT INTO forecasts (id, question, forecast_type, probability, base_rate,
165
+ resolution_date, resolution_criteria, status, top_drivers, top_counterarguments,
166
+ refresh_frequency, update_count, tags, created_at, updated_at)
167
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'active', ?, ?, ?, 0, ?, ?, ?)
168
+ `).run(id, args.question, args.forecastType || "binary", p ?? null, args.baseRate ?? null, args.resolutionDate, args.resolutionCriteria, JSON.stringify(args.topDrivers || []), JSON.stringify(args.topCounterarguments || []), args.refreshFrequency || "weekly", JSON.stringify(args.tags || []), now, now);
169
+ return [{
170
+ type: "text",
171
+ text: JSON.stringify({
172
+ forecastId: id,
173
+ question: args.question,
174
+ status: "active",
175
+ probability: p ?? null,
176
+ resolutionDate: args.resolutionDate,
177
+ }),
178
+ }];
179
+ },
180
+ },
181
+ // 2. update_forecast_probability
182
+ {
183
+ name: "update_forecast_probability",
184
+ description: "Update a forecast's probability with reasoning. Records the change in update history for audit trail and forecast diffs.",
185
+ inputSchema: {
186
+ type: "object",
187
+ properties: {
188
+ forecastId: { type: "string", description: "Forecast ID" },
189
+ probability: { type: "number", description: "New probability (0-1)" },
190
+ topDrivers: {
191
+ type: "array",
192
+ items: { type: "string" },
193
+ description: "Updated top drivers (max 3)",
194
+ },
195
+ topCounterarguments: {
196
+ type: "array",
197
+ items: { type: "string" },
198
+ description: "Updated counterarguments (max 3)",
199
+ },
200
+ reasoning: {
201
+ type: "string",
202
+ description: "Why the probability changed (1-2 sentences)",
203
+ },
204
+ },
205
+ required: ["forecastId", "probability", "reasoning"],
206
+ },
207
+ handler: async (args) => {
208
+ ensureForecastTables();
209
+ const db = getDb();
210
+ const fId = args.forecastId;
211
+ const newP = args.probability;
212
+ if (newP < 0 || newP > 1) {
213
+ return [{ type: "text", text: JSON.stringify({ error: "Probability must be between 0 and 1" }) }];
214
+ }
215
+ const forecast = db.prepare("SELECT * FROM forecasts WHERE id = ?").get(fId);
216
+ if (!forecast) {
217
+ return [{ type: "text", text: JSON.stringify({ error: `Forecast ${fId} not found` }) }];
218
+ }
219
+ if (forecast.status !== "active") {
220
+ return [{ type: "text", text: JSON.stringify({ error: `Cannot update ${forecast.status} forecast` }) }];
221
+ }
222
+ const prevP = forecast.probability ?? 0.5;
223
+ const now = Date.now();
224
+ // Record history
225
+ db.prepare(`
226
+ INSERT INTO forecast_update_history (id, forecast_id, previous_probability, new_probability, reasoning, updated_at)
227
+ VALUES (?, ?, ?, ?, ?, ?)
228
+ `).run(genId(), fId, prevP, newP, args.reasoning, now);
229
+ // Update forecast
230
+ const drivers = args.topDrivers ? JSON.stringify(args.topDrivers) : forecast.top_drivers;
231
+ const counters = args.topCounterarguments ? JSON.stringify(args.topCounterarguments) : forecast.top_counterarguments;
232
+ db.prepare(`
233
+ UPDATE forecasts SET probability = ?, top_drivers = ?, top_counterarguments = ?,
234
+ update_count = update_count + 1, last_refreshed_at = ?, updated_at = ?
235
+ WHERE id = ?
236
+ `).run(newP, drivers, counters, now, now, fId);
237
+ const deltaPct = ((newP - prevP) * 100).toFixed(0);
238
+ const dir = newP >= prevP ? "+" : "";
239
+ return [{
240
+ type: "text",
241
+ text: JSON.stringify({
242
+ forecastId: fId,
243
+ previousProbability: prevP,
244
+ newProbability: newP,
245
+ diff: `${(prevP * 100).toFixed(0)}% → ${(newP * 100).toFixed(0)}% (${dir}${deltaPct}pp)`,
246
+ reasoning: args.reasoning,
247
+ }),
248
+ }];
249
+ },
250
+ },
251
+ // 3. add_forecast_evidence
252
+ {
253
+ name: "add_forecast_evidence",
254
+ description: "Add evidence to a forecast's ledger. Each entry includes source URL, excerpt, and directional signal (supporting/disconfirming/neutral). Deduplicates by source URL.",
255
+ inputSchema: {
256
+ type: "object",
257
+ properties: {
258
+ forecastId: { type: "string", description: "Forecast ID" },
259
+ sourceUrl: { type: "string", description: "URL of the evidence source" },
260
+ sourceTitle: { type: "string", description: "Title of the source" },
261
+ sourceType: {
262
+ type: "string",
263
+ enum: ["news", "filing", "macro_data", "poll", "market_signal", "manual"],
264
+ description: "Type of source",
265
+ },
266
+ excerpt: {
267
+ type: "string",
268
+ description: "Grounded snippet from the source (max 500 chars)",
269
+ },
270
+ signal: {
271
+ type: "string",
272
+ enum: ["supporting", "disconfirming", "neutral"],
273
+ description: "Direction of evidence relative to the forecast",
274
+ },
275
+ impactOnProbability: {
276
+ type: "number",
277
+ description: "Estimated impact on probability (e.g. +0.05)",
278
+ },
279
+ },
280
+ required: ["forecastId", "sourceUrl", "sourceTitle", "sourceType", "excerpt", "signal"],
281
+ },
282
+ handler: async (args) => {
283
+ ensureForecastTables();
284
+ const db = getDb();
285
+ // Dedup check
286
+ const existing = db.prepare("SELECT id FROM forecast_evidence WHERE forecast_id = ? AND source_url = ?").get(args.forecastId, args.sourceUrl);
287
+ if (existing) {
288
+ return [{ type: "text", text: JSON.stringify({ error: "Evidence from this URL already exists for this forecast" }) }];
289
+ }
290
+ const id = genId();
291
+ db.prepare(`
292
+ INSERT INTO forecast_evidence (id, forecast_id, source_url, source_title, source_type, excerpt, signal, impact_on_probability, added_at)
293
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
294
+ `).run(id, args.forecastId, args.sourceUrl, args.sourceTitle, args.sourceType, args.excerpt.slice(0, 500), args.signal, args.impactOnProbability ?? null, Date.now());
295
+ return [{ type: "text", text: JSON.stringify({ evidenceId: id, forecastId: args.forecastId, signal: args.signal }) }];
296
+ },
297
+ },
298
+ // 4. get_forecast_evidence
299
+ {
300
+ name: "get_forecast_evidence",
301
+ description: "Query evidence ledger for a forecast. Optionally filter by signal direction (supporting/disconfirming/neutral).",
302
+ inputSchema: {
303
+ type: "object",
304
+ properties: {
305
+ forecastId: { type: "string", description: "Forecast ID" },
306
+ signal: {
307
+ type: "string",
308
+ enum: ["supporting", "disconfirming", "neutral"],
309
+ description: "Filter by signal direction",
310
+ },
311
+ limit: { type: "number", description: "Max results (default 20)" },
312
+ },
313
+ required: ["forecastId"],
314
+ },
315
+ handler: async (args) => {
316
+ ensureForecastTables();
317
+ const db = getDb();
318
+ const limit = args.limit || 20;
319
+ const signal = args.signal;
320
+ let sql = "SELECT * FROM forecast_evidence WHERE forecast_id = ?";
321
+ const params = [args.forecastId];
322
+ if (signal) {
323
+ sql += " AND signal = ?";
324
+ params.push(signal);
325
+ }
326
+ sql += " ORDER BY added_at DESC LIMIT ?";
327
+ params.push(limit);
328
+ const evidence = db.prepare(sql).all(...params);
329
+ return [{ type: "text", text: JSON.stringify({ evidence, count: evidence.length }) }];
330
+ },
331
+ },
332
+ // 5. resolve_forecast
333
+ {
334
+ name: "resolve_forecast",
335
+ description: "Resolve a forecast with an outcome. Auto-computes Brier and log scores for binary forecasts. Ambiguous outcomes are excluded from scoring.",
336
+ inputSchema: {
337
+ type: "object",
338
+ properties: {
339
+ forecastId: { type: "string", description: "Forecast ID" },
340
+ outcome: {
341
+ type: "string",
342
+ enum: ["yes", "no", "ambiguous"],
343
+ description: "Resolution outcome",
344
+ },
345
+ resolutionNotes: {
346
+ type: "string",
347
+ description: "Justification for the resolution",
348
+ },
349
+ resolutionSourceUrl: {
350
+ type: "string",
351
+ description: "URL to resolution source (optional)",
352
+ },
353
+ },
354
+ required: ["forecastId", "outcome", "resolutionNotes"],
355
+ },
356
+ handler: async (args) => {
357
+ ensureForecastTables();
358
+ const db = getDb();
359
+ const fId = args.forecastId;
360
+ const outcome = args.outcome;
361
+ const forecast = db.prepare("SELECT * FROM forecasts WHERE id = ?").get(fId);
362
+ if (!forecast) {
363
+ return [{ type: "text", text: JSON.stringify({ error: `Forecast ${fId} not found` }) }];
364
+ }
365
+ if (forecast.status === "resolved") {
366
+ return [{ type: "text", text: JSON.stringify({ error: "Forecast already resolved" }) }];
367
+ }
368
+ let brier = null;
369
+ let log = null;
370
+ if (forecast.forecast_type === "binary" && forecast.probability != null && outcome !== "ambiguous") {
371
+ brier = brierScore(forecast.probability, outcome);
372
+ log = logScoreFn(forecast.probability, outcome);
373
+ }
374
+ const id = genId();
375
+ const now = Date.now();
376
+ db.prepare(`
377
+ INSERT INTO forecast_resolutions (id, forecast_id, outcome, brier_score, log_score, resolution_notes, resolution_source_url, resolved_at)
378
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
379
+ `).run(id, fId, outcome, brier, log, args.resolutionNotes, args.resolutionSourceUrl ?? null, now);
380
+ db.prepare("UPDATE forecasts SET status = 'resolved', updated_at = ? WHERE id = ?").run(now, fId);
381
+ return [{
382
+ type: "text",
383
+ text: JSON.stringify({
384
+ resolutionId: id,
385
+ forecastId: fId,
386
+ outcome,
387
+ brierScore: brier,
388
+ logScore: log,
389
+ status: "resolved",
390
+ }),
391
+ }];
392
+ },
393
+ },
394
+ // 6. get_forecast_track_record
395
+ {
396
+ name: "get_forecast_track_record",
397
+ description: "Get aggregate Brier scores, calibration summary, and track record statistics across all resolved forecasts.",
398
+ inputSchema: {
399
+ type: "object",
400
+ properties: {
401
+ startDate: { type: "string", description: "Filter resolutions after this ISO date" },
402
+ endDate: { type: "string", description: "Filter resolutions before this ISO date" },
403
+ },
404
+ required: [],
405
+ },
406
+ handler: async (args) => {
407
+ ensureForecastTables();
408
+ const db = getDb();
409
+ let sql = "SELECT * FROM forecast_resolutions WHERE 1=1";
410
+ const params = [];
411
+ if (args.startDate) {
412
+ sql += " AND resolved_at >= ?";
413
+ params.push(new Date(args.startDate).getTime());
414
+ }
415
+ if (args.endDate) {
416
+ sql += " AND resolved_at <= ?";
417
+ params.push(new Date(args.endDate).getTime());
418
+ }
419
+ const resolutions = db.prepare(sql).all(...params);
420
+ const scored = resolutions.filter((r) => r.brier_score != null && r.outcome !== "ambiguous");
421
+ if (scored.length === 0) {
422
+ return [{
423
+ type: "text",
424
+ text: JSON.stringify({
425
+ totalResolved: resolutions.length,
426
+ scoredCount: 0,
427
+ overallBrier: null,
428
+ meanLogScore: null,
429
+ message: "No scoreable resolutions yet",
430
+ }),
431
+ }];
432
+ }
433
+ const totalBrier = scored.reduce((s, r) => s + r.brier_score, 0);
434
+ const totalLog = scored.reduce((s, r) => s + r.log_score, 0);
435
+ return [{
436
+ type: "text",
437
+ text: JSON.stringify({
438
+ totalResolved: resolutions.length,
439
+ scoredCount: scored.length,
440
+ overallBrier: totalBrier / scored.length,
441
+ meanLogScore: totalLog / scored.length,
442
+ interpretation: totalBrier / scored.length < 0.25
443
+ ? "Better than random — well calibrated"
444
+ : totalBrier / scored.length < 0.5
445
+ ? "Moderate calibration — room to improve"
446
+ : "Poor calibration — review methodology",
447
+ }),
448
+ }];
449
+ },
450
+ },
451
+ // 7. get_active_forecasts
452
+ {
453
+ name: "get_active_forecasts",
454
+ description: "List active forecasts. Optionally filter by those needing refresh (based on last refresh time and frequency).",
455
+ inputSchema: {
456
+ type: "object",
457
+ properties: {
458
+ limit: { type: "number", description: "Max results (default 20)" },
459
+ needsRefresh: { type: "boolean", description: "Only show forecasts due for refresh" },
460
+ tags: {
461
+ type: "array",
462
+ items: { type: "string" },
463
+ description: "Filter by tags",
464
+ },
465
+ },
466
+ required: [],
467
+ },
468
+ handler: async (args) => {
469
+ ensureForecastTables();
470
+ const db = getDb();
471
+ const limit = args.limit || 20;
472
+ let forecasts = db.prepare("SELECT * FROM forecasts WHERE status = 'active' ORDER BY updated_at DESC LIMIT ?").all(limit);
473
+ // Parse JSON fields
474
+ forecasts = forecasts.map((f) => ({
475
+ ...f,
476
+ top_drivers: JSON.parse(f.top_drivers || "[]"),
477
+ top_counterarguments: JSON.parse(f.top_counterarguments || "[]"),
478
+ tags: JSON.parse(f.tags || "[]"),
479
+ }));
480
+ // Filter by tags
481
+ if (args.tags && args.tags.length > 0) {
482
+ const filterTags = new Set(args.tags);
483
+ forecasts = forecasts.filter((f) => f.tags.some((t) => filterTags.has(t)));
484
+ }
485
+ // Filter by needs refresh
486
+ if (args.needsRefresh) {
487
+ const now = Date.now();
488
+ const DAY = 86_400_000;
489
+ const WEEK = 7 * DAY;
490
+ forecasts = forecasts.filter((f) => {
491
+ const last = f.last_refreshed_at || 0;
492
+ const freq = f.refresh_frequency;
493
+ if (freq === "daily")
494
+ return now - last > DAY * 0.8;
495
+ if (freq === "weekly")
496
+ return now - last > WEEK * 0.8;
497
+ return false; // on_trigger not auto-refreshed
498
+ });
499
+ }
500
+ return [{ type: "text", text: JSON.stringify({ forecasts, count: forecasts.length }) }];
501
+ },
502
+ },
503
+ // 8. compute_calibration
504
+ {
505
+ name: "compute_calibration",
506
+ description: "Compute calibration bins and Brier aggregates across all resolved forecasts. Returns 10 bins (0-10%, 10-20%, ..., 90-100%) with predicted vs observed frequency.",
507
+ inputSchema: {
508
+ type: "object",
509
+ properties: {
510
+ startDate: { type: "string", description: "Window start (ISO date)" },
511
+ endDate: { type: "string", description: "Window end (ISO date)" },
512
+ },
513
+ required: [],
514
+ },
515
+ handler: async (args) => {
516
+ ensureForecastTables();
517
+ const db = getDb();
518
+ // Get resolved forecasts with probabilities
519
+ const sql = `
520
+ SELECT f.probability, r.outcome
521
+ FROM forecasts f
522
+ JOIN forecast_resolutions r ON f.id = r.forecast_id
523
+ WHERE f.forecast_type = 'binary'
524
+ AND f.probability IS NOT NULL
525
+ AND r.outcome != 'ambiguous'
526
+ `;
527
+ const pairs = db.prepare(sql).all();
528
+ if (pairs.length === 0) {
529
+ return [{
530
+ type: "text",
531
+ text: JSON.stringify({ error: "No resolved binary forecasts with probabilities" }),
532
+ }];
533
+ }
534
+ // Compute 10 calibration bins
535
+ const bins = [];
536
+ for (let i = 0; i < 10; i++) {
537
+ const lower = i * 0.1;
538
+ const upper = (i + 1) * 0.1;
539
+ const inBin = pairs.filter((p) => {
540
+ if (i === 9)
541
+ return p.probability >= lower && p.probability <= upper;
542
+ return p.probability >= lower && p.probability < upper;
543
+ });
544
+ const yesCount = inBin.filter((p) => p.outcome === "yes").length;
545
+ bins.push({
546
+ binLabel: `${i * 10}-${(i + 1) * 10}%`,
547
+ predictedProb: (lower + upper) / 2,
548
+ observedFreq: inBin.length > 0 ? yesCount / inBin.length : 0,
549
+ count: inBin.length,
550
+ });
551
+ }
552
+ // Overall Brier
553
+ const totalBrier = pairs.reduce((s, p) => {
554
+ const o = p.outcome === "yes" ? 1 : 0;
555
+ return s + (p.probability - o) ** 2;
556
+ }, 0);
557
+ const result = {
558
+ bins,
559
+ overallBrier: totalBrier / pairs.length,
560
+ forecastCount: pairs.length,
561
+ windowStart: args.startDate ?? "all_time",
562
+ windowEnd: args.endDate ?? "now",
563
+ };
564
+ // Store in calibration log
565
+ const id = genId();
566
+ db.prepare(`
567
+ INSERT INTO forecast_calibration_log (id, window_start, window_end, bins, overall_brier, forecast_count, resolved_count, created_at)
568
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
569
+ `).run(id, result.windowStart, result.windowEnd, JSON.stringify(bins), result.overallBrier, pairs.length, pairs.length, Date.now());
570
+ return [{ type: "text", text: JSON.stringify(result) }];
571
+ },
572
+ },
573
+ // 9. get_forecast_chain
574
+ {
575
+ name: "get_forecast_chain",
576
+ description: "Get full audit trail for a forecast: the forecast itself, all evidence entries, update history, and resolution (if resolved). Complete chain of custody.",
577
+ inputSchema: {
578
+ type: "object",
579
+ properties: {
580
+ forecastId: { type: "string", description: "Forecast ID" },
581
+ },
582
+ required: ["forecastId"],
583
+ },
584
+ handler: async (args) => {
585
+ ensureForecastTables();
586
+ const db = getDb();
587
+ const fId = args.forecastId;
588
+ const forecast = db.prepare("SELECT * FROM forecasts WHERE id = ?").get(fId);
589
+ if (!forecast) {
590
+ return [{ type: "text", text: JSON.stringify({ error: `Forecast ${fId} not found` }) }];
591
+ }
592
+ // Parse JSON fields
593
+ forecast.top_drivers = JSON.parse(forecast.top_drivers || "[]");
594
+ forecast.top_counterarguments = JSON.parse(forecast.top_counterarguments || "[]");
595
+ forecast.tags = JSON.parse(forecast.tags || "[]");
596
+ const evidence = db.prepare("SELECT * FROM forecast_evidence WHERE forecast_id = ? ORDER BY added_at DESC").all(fId);
597
+ const updates = db.prepare("SELECT * FROM forecast_update_history WHERE forecast_id = ? ORDER BY updated_at DESC").all(fId);
598
+ const resolution = db.prepare("SELECT * FROM forecast_resolutions WHERE forecast_id = ?").get(fId);
599
+ return [{
600
+ type: "text",
601
+ text: JSON.stringify({
602
+ forecast,
603
+ evidence,
604
+ updateHistory: updates,
605
+ resolution: resolution || null,
606
+ summary: {
607
+ evidenceCount: evidence.length,
608
+ updateCount: updates.length,
609
+ isResolved: !!resolution,
610
+ },
611
+ }),
612
+ }];
613
+ },
614
+ },
615
+ ];
616
+ //# sourceMappingURL=forecastingTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecastingTools.js","sourceRoot":"","sources":["../../src/tools/forecastingTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Local Dashboard MCP Tools
3
+ *
4
+ * 5 tools for operating the local Daily Brief dashboard via Claude Code.
5
+ * All tools read from local SQLite — zero network dependency.
6
+ */
7
+ import type { McpTool } from "../types.js";
8
+ export declare const localDashboardTools: McpTool[];