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.
- package/NODEBENCH_AGENTS.md +5 -4
- package/README.md +145 -16
- 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.js +11 -11
- package/dist/__tests__/multiHopDogfood.test.js.map +1 -1
- 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__/presetRealWorldBench.test.js +0 -2
- package/dist/__tests__/presetRealWorldBench.test.js.map +1 -1
- package/dist/__tests__/tools.test.js +9 -157
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/toolsetGatingEval.test.js +0 -2
- package/dist/__tests__/toolsetGatingEval.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.js +1470 -1230
- package/dist/dashboard/html.js.map +1 -1
- package/dist/dashboard/server.js +166 -41
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.js +210 -14
- 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/progressiveDiscoveryTools.js +50 -115
- 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/toolRegistry.d.ts +1 -15
- package/dist/tools/toolRegistry.js +243 -228
- package/dist/tools/toolRegistry.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 +6 -2
- package/dist/toolsetRegistry.js.map +1 -1
- 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[];
|