nodebench-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +237 -0
  2. package/dist/__tests__/tools.test.d.ts +1 -0
  3. package/dist/__tests__/tools.test.js +402 -0
  4. package/dist/__tests__/tools.test.js.map +1 -0
  5. package/dist/db.d.ts +4 -0
  6. package/dist/db.js +198 -0
  7. package/dist/db.js.map +1 -0
  8. package/dist/index.d.ts +19 -0
  9. package/dist/index.js +237 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/documentTools.d.ts +5 -0
  12. package/dist/tools/documentTools.js +524 -0
  13. package/dist/tools/documentTools.js.map +1 -0
  14. package/dist/tools/documentationTools.d.ts +12 -0
  15. package/dist/tools/documentationTools.js +647 -0
  16. package/dist/tools/documentationTools.js.map +1 -0
  17. package/dist/tools/evalTools.d.ts +6 -0
  18. package/dist/tools/evalTools.js +335 -0
  19. package/dist/tools/evalTools.js.map +1 -0
  20. package/dist/tools/financialTools.d.ts +10 -0
  21. package/dist/tools/financialTools.js +403 -0
  22. package/dist/tools/financialTools.js.map +1 -0
  23. package/dist/tools/flywheelTools.d.ts +6 -0
  24. package/dist/tools/flywheelTools.js +366 -0
  25. package/dist/tools/flywheelTools.js.map +1 -0
  26. package/dist/tools/githubTools.d.ts +12 -0
  27. package/dist/tools/githubTools.js +432 -0
  28. package/dist/tools/githubTools.js.map +1 -0
  29. package/dist/tools/learningTools.d.ts +6 -0
  30. package/dist/tools/learningTools.js +199 -0
  31. package/dist/tools/learningTools.js.map +1 -0
  32. package/dist/tools/memoryTools.d.ts +5 -0
  33. package/dist/tools/memoryTools.js +137 -0
  34. package/dist/tools/memoryTools.js.map +1 -0
  35. package/dist/tools/metaTools.d.ts +7 -0
  36. package/dist/tools/metaTools.js +837 -0
  37. package/dist/tools/metaTools.js.map +1 -0
  38. package/dist/tools/planningTools.d.ts +5 -0
  39. package/dist/tools/planningTools.js +147 -0
  40. package/dist/tools/planningTools.js.map +1 -0
  41. package/dist/tools/qualityGateTools.d.ts +6 -0
  42. package/dist/tools/qualityGateTools.js +347 -0
  43. package/dist/tools/qualityGateTools.js.map +1 -0
  44. package/dist/tools/reconTools.d.ts +8 -0
  45. package/dist/tools/reconTools.js +729 -0
  46. package/dist/tools/reconTools.js.map +1 -0
  47. package/dist/tools/searchTools.d.ts +5 -0
  48. package/dist/tools/searchTools.js +145 -0
  49. package/dist/tools/searchTools.js.map +1 -0
  50. package/dist/tools/uiCaptureTools.d.ts +8 -0
  51. package/dist/tools/uiCaptureTools.js +339 -0
  52. package/dist/tools/uiCaptureTools.js.map +1 -0
  53. package/dist/tools/verificationTools.d.ts +6 -0
  54. package/dist/tools/verificationTools.js +472 -0
  55. package/dist/tools/verificationTools.js.map +1 -0
  56. package/dist/tools/visionTools.d.ts +12 -0
  57. package/dist/tools/visionTools.js +553 -0
  58. package/dist/tools/visionTools.js.map +1 -0
  59. package/dist/tools/webTools.d.ts +12 -0
  60. package/dist/tools/webTools.js +443 -0
  61. package/dist/tools/webTools.js.map +1 -0
  62. package/dist/types.d.ts +16 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +66 -0
@@ -0,0 +1,472 @@
1
+ /**
2
+ * Verification tools — 6-Phase Iterative Deep-Dive Verification Process.
3
+ * Guides agents through systematic verification of non-trivial implementations.
4
+ */
5
+ import { getDb, genId } from "../db.js";
6
+ const PHASE_NAMES = [
7
+ "context_gathering",
8
+ "gap_analysis",
9
+ "implementation",
10
+ "testing",
11
+ "self_verify",
12
+ "document",
13
+ ];
14
+ const PHASE_INSTRUCTIONS = {
15
+ context_gathering: `Phase 1: Context Gathering (Parallel Research)
16
+ Launch parallel research into:
17
+ - SDK/Protocol specs: Latest versions, blogs, announcements, GitHub repos, official SDKs
18
+ - Implementation audit: Current codebase patterns, inconsistencies, unused code
19
+ - Dispatcher/backend audit: Function signatures, allowlists, argument shapes
20
+ - External API research: Check if third-party APIs still work, find known breaking changes
21
+
22
+ Goal: Build a comprehensive picture of "what production looks like" vs "what we have."
23
+ TIP: Call search_learnings first to check for known issues related to this work.`,
24
+ gap_analysis: `Phase 2: Gap Analysis
25
+ Compare Phase 1 findings against current implementation. For each gap found, call log_gap with:
26
+ - severity: CRITICAL (protocol violations, security), HIGH (API incompatibilities, silent failures), MEDIUM (outdated versions, missing features), LOW (edge case handling)
27
+ - root_cause: Why the gap exists
28
+ - fix_strategy: How to fix it
29
+
30
+ Output: A numbered gap list. Fix CRITICAL and HIGH first.`,
31
+ implementation: `Phase 3: Implementation
32
+ Apply fixes following production patterns exactly. Rules:
33
+ - Fix CRITICAL and HIGH gaps first
34
+ - Each fix is a discrete, testable change
35
+ - Follow the reference pattern found in Phase 1 — don't invent new patterns
36
+ - Document why each change was made (comments in code where non-obvious)
37
+ - Call resolve_gap as you fix each gap`,
38
+ testing: `Phase 4: Testing & Validation (Multi-Layer — CRITICAL)
39
+ Run tests at all 5 layers. Call log_test_result for each:
40
+ - Layer 1: static — TypeScript tsc --noEmit, type checking
41
+ - Layer 2: unit — Run existing test suites, add targeted tests for fixes
42
+ - Layer 3: integration — End-to-end flow through handler chain
43
+ - Layer 4: manual — Spot-check critical paths with curl or direct invocation
44
+ - Layer 5: live_e2e — Deploy to staging, hit real endpoints, verify real responses
45
+
46
+ ALL layers must pass before proceeding to Phase 5.`,
47
+ self_verify: `Phase 5: Self-Closed-Loop Verification (Parallel Checks)
48
+ Launch parallel verification checks, each targeting a different dimension:
49
+ - Spec compliance: Does every response match the protocol spec exactly?
50
+ - Functional correctness: Do tools return correct data for known inputs?
51
+ - Argument compatibility: Do all handler-backend function pairs have matching shapes?
52
+
53
+ Each check produces PASS/FAIL. Any FAIL loops back to Phase 3 (Implementation).`,
54
+ document: `Phase 6: Document Learnings
55
+ Record what you discovered. For each edge case, gotcha, or pattern, call record_learning with:
56
+ - key: Short identifier (e.g. 'convex-use-node-export-restriction')
57
+ - content: What happened, why, and how to avoid it
58
+ - category: edge_case | gotcha | pattern | regression | convention
59
+ - sourceCycle: This verification cycle's ID
60
+
61
+ This prevents future regressions and expands the knowledge base.`,
62
+ };
63
+ export const verificationTools = [
64
+ {
65
+ name: "start_verification_cycle",
66
+ description: "Start a new 6-phase verification cycle for a non-trivial implementation. Returns the cycle ID and Phase 1 instructions. Call this before declaring any integration, migration, or protocol-level change done.",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ title: {
71
+ type: "string",
72
+ description: "What you are verifying (e.g. 'MCP protocol compliance', 'Auth migration')",
73
+ },
74
+ description: {
75
+ type: "string",
76
+ description: "Context about the change being verified",
77
+ },
78
+ },
79
+ required: ["title"],
80
+ },
81
+ handler: async (args) => {
82
+ const { title, description } = args;
83
+ if (!title)
84
+ throw new Error("Title is required");
85
+ const db = getDb();
86
+ const cycleId = genId("cycle");
87
+ const now = new Date().toISOString();
88
+ db.prepare("INSERT INTO verification_cycles (id, title, description, status, current_phase, created_at, updated_at) VALUES (?, ?, ?, 'active', 1, ?, ?)").run(cycleId, title, description ?? null, now, now);
89
+ // Create all 6 phase rows
90
+ const insertPhase = db.prepare("INSERT INTO verification_phases (id, cycle_id, phase_number, phase_name, status, started_at) VALUES (?, ?, ?, ?, ?, ?)");
91
+ for (let i = 0; i < PHASE_NAMES.length; i++) {
92
+ const phaseId = genId("phase");
93
+ const status = i === 0 ? "in_progress" : "pending";
94
+ const startedAt = i === 0 ? now : null;
95
+ insertPhase.run(phaseId, cycleId, i + 1, PHASE_NAMES[i], status, startedAt);
96
+ }
97
+ return {
98
+ cycleId,
99
+ title,
100
+ currentPhase: 1,
101
+ phaseName: PHASE_NAMES[0],
102
+ instructions: PHASE_INSTRUCTIONS[PHASE_NAMES[0]],
103
+ allPhases: PHASE_NAMES.map((name, i) => ({
104
+ number: i + 1,
105
+ name,
106
+ status: i === 0 ? "in_progress" : "pending",
107
+ })),
108
+ };
109
+ },
110
+ },
111
+ {
112
+ name: "log_phase_findings",
113
+ description: "Record findings for the current phase of a verification cycle. Advances the cycle to the next phase if the current phase passes. If it fails, returns guidance to loop back.",
114
+ inputSchema: {
115
+ type: "object",
116
+ properties: {
117
+ cycleId: { type: "string", description: "Verification cycle ID" },
118
+ phaseNumber: {
119
+ type: "number",
120
+ description: "Phase to record (1-6)",
121
+ },
122
+ status: {
123
+ type: "string",
124
+ enum: ["passed", "failed"],
125
+ description: "Did this phase pass?",
126
+ },
127
+ findings: {
128
+ type: "object",
129
+ description: "Phase-specific structured findings",
130
+ },
131
+ },
132
+ required: ["cycleId", "phaseNumber", "status"],
133
+ },
134
+ handler: async (args) => {
135
+ const { cycleId, phaseNumber, status, findings } = args;
136
+ const db = getDb();
137
+ const now = new Date().toISOString();
138
+ const cycle = db
139
+ .prepare("SELECT * FROM verification_cycles WHERE id = ?")
140
+ .get(cycleId);
141
+ if (!cycle)
142
+ throw new Error(`Cycle not found: ${cycleId}`);
143
+ const phase = db
144
+ .prepare("SELECT * FROM verification_phases WHERE cycle_id = ? AND phase_number = ?")
145
+ .get(cycleId, phaseNumber);
146
+ if (!phase)
147
+ throw new Error(`Phase ${phaseNumber} not found in cycle`);
148
+ // Update this phase
149
+ db.prepare("UPDATE verification_phases SET status = ?, findings = ?, completed_at = ? WHERE id = ?").run(status, findings ? JSON.stringify(findings) : null, now, phase.id);
150
+ let nextPhase = null;
151
+ let nextPhaseInstructions = null;
152
+ let cycleComplete = false;
153
+ if (status === "passed") {
154
+ if (phaseNumber < 6) {
155
+ nextPhase = phaseNumber + 1;
156
+ const nextPhaseName = PHASE_NAMES[nextPhase - 1];
157
+ nextPhaseInstructions = PHASE_INSTRUCTIONS[nextPhaseName];
158
+ // Advance cycle and start next phase
159
+ db.prepare("UPDATE verification_cycles SET current_phase = ?, updated_at = ? WHERE id = ?").run(nextPhase, now, cycleId);
160
+ db.prepare("UPDATE verification_phases SET status = 'in_progress', started_at = ? WHERE cycle_id = ? AND phase_number = ?").run(now, cycleId, nextPhase);
161
+ }
162
+ else {
163
+ // Phase 6 passed — cycle complete
164
+ cycleComplete = true;
165
+ db.prepare("UPDATE verification_cycles SET status = 'completed', updated_at = ? WHERE id = ?").run(now, cycleId);
166
+ }
167
+ }
168
+ else {
169
+ // Phase failed
170
+ const loopBackPhase = phaseNumber === 5 ? 3 : phaseNumber; // Phase 5 failure loops to Phase 3
171
+ nextPhaseInstructions = `Phase ${phaseNumber} FAILED. ${phaseNumber === 5
172
+ ? "Loop back to Phase 3 (Implementation) to fix the issues found."
173
+ : "Review the failures and retry this phase."}`;
174
+ }
175
+ return {
176
+ cycleId,
177
+ phaseRecorded: phaseNumber,
178
+ phaseStatus: status,
179
+ nextPhase,
180
+ nextPhaseInstructions,
181
+ cycleComplete,
182
+ ...(cycleComplete
183
+ ? {
184
+ _contributeBack: {
185
+ instruction: "Cycle complete! Record what you learned so future agents benefit:",
186
+ actions: [
187
+ "record_learning — for each edge case, gotcha, or pattern discovered",
188
+ "log_recon_finding — for any SDK/API discoveries made during research",
189
+ "search_all_knowledge — check what the system already knows before your next task",
190
+ ],
191
+ },
192
+ }
193
+ : {}),
194
+ };
195
+ },
196
+ },
197
+ {
198
+ name: "log_gap",
199
+ description: "Record a gap found during Phase 2 (Gap Analysis). Gaps are categorized by severity: CRITICAL (protocol violations, security), HIGH (API incompatibilities), MEDIUM (outdated versions), LOW (edge cases).",
200
+ inputSchema: {
201
+ type: "object",
202
+ properties: {
203
+ cycleId: { type: "string", description: "Verification cycle ID" },
204
+ severity: {
205
+ type: "string",
206
+ enum: ["CRITICAL", "HIGH", "MEDIUM", "LOW"],
207
+ },
208
+ title: { type: "string", description: "Short gap description" },
209
+ description: { type: "string", description: "Detailed description" },
210
+ rootCause: { type: "string", description: "Why this gap exists" },
211
+ fixStrategy: { type: "string", description: "How to fix it" },
212
+ },
213
+ required: ["cycleId", "severity", "title"],
214
+ },
215
+ handler: async (args) => {
216
+ const { cycleId, severity, title, description, rootCause, fixStrategy } = args;
217
+ const db = getDb();
218
+ const gapId = genId("gap");
219
+ db.prepare("INSERT INTO gaps (id, cycle_id, severity, title, description, root_cause, fix_strategy) VALUES (?, ?, ?, ?, ?, ?, ?)").run(gapId, cycleId, severity, title, description ?? null, rootCause ?? null, fixStrategy ?? null);
220
+ return {
221
+ gapId,
222
+ severity,
223
+ title,
224
+ message: "Fix CRITICAL and HIGH gaps first.",
225
+ };
226
+ },
227
+ },
228
+ {
229
+ name: "resolve_gap",
230
+ description: "Mark a gap as resolved after implementing the fix. Returns remaining gap counts by severity.",
231
+ inputSchema: {
232
+ type: "object",
233
+ properties: {
234
+ gapId: { type: "string", description: "Gap ID to resolve" },
235
+ resolution: {
236
+ type: "string",
237
+ description: "What was done to fix it",
238
+ },
239
+ },
240
+ required: ["gapId"],
241
+ },
242
+ handler: async (args) => {
243
+ const db = getDb();
244
+ const now = new Date().toISOString();
245
+ const gap = db
246
+ .prepare("SELECT * FROM gaps WHERE id = ?")
247
+ .get(args.gapId);
248
+ if (!gap)
249
+ throw new Error(`Gap not found: ${args.gapId}`);
250
+ db.prepare("UPDATE gaps SET status = 'resolved', fix_strategy = COALESCE(?, fix_strategy), resolved_at = ? WHERE id = ?").run(args.resolution ?? null, now, args.gapId);
251
+ // Count remaining open gaps for this cycle
252
+ const remaining = db
253
+ .prepare("SELECT severity, COUNT(*) as count FROM gaps WHERE cycle_id = ? AND status = 'open' GROUP BY severity")
254
+ .all(gap.cycle_id);
255
+ const counts = {
256
+ CRITICAL: 0,
257
+ HIGH: 0,
258
+ MEDIUM: 0,
259
+ LOW: 0,
260
+ };
261
+ for (const r of remaining)
262
+ counts[r.severity] = r.count;
263
+ return {
264
+ gapId: args.gapId,
265
+ status: "resolved",
266
+ remainingGaps: counts,
267
+ _contributeBack: {
268
+ instruction: "Gap resolved. Record what you learned so it's searchable for future work:",
269
+ actions: [
270
+ "record_learning — capture the root cause and fix as a reusable pattern",
271
+ ],
272
+ },
273
+ };
274
+ },
275
+ },
276
+ {
277
+ name: "log_test_result",
278
+ description: "Record a test result for Phase 4 (Testing & Validation). Tests are organized by layer: static, unit, integration, manual, live_e2e. All layers must pass before proceeding.",
279
+ inputSchema: {
280
+ type: "object",
281
+ properties: {
282
+ cycleId: { type: "string", description: "Verification cycle ID" },
283
+ layer: {
284
+ type: "string",
285
+ enum: ["static", "unit", "integration", "manual", "live_e2e"],
286
+ description: "Test layer",
287
+ },
288
+ label: {
289
+ type: "string",
290
+ description: "What was tested (e.g. 'tsc --noEmit', 'jest auth.test')",
291
+ },
292
+ passed: { type: "boolean", description: "Did the test pass?" },
293
+ output: {
294
+ type: "string",
295
+ description: "Error message or success detail",
296
+ },
297
+ },
298
+ required: ["cycleId", "layer", "label", "passed"],
299
+ },
300
+ handler: async (args) => {
301
+ const { cycleId, layer, label, passed, output } = args;
302
+ const db = getDb();
303
+ const testId = genId("test");
304
+ db.prepare("INSERT INTO test_results (id, cycle_id, layer, label, passed, output) VALUES (?, ?, ?, ?, ?, ?)").run(testId, cycleId, layer, label, passed ? 1 : 0, output ?? null);
305
+ // Summarize this layer
306
+ const layerResults = db
307
+ .prepare("SELECT passed, COUNT(*) as count FROM test_results WHERE cycle_id = ? AND layer = ? GROUP BY passed")
308
+ .all(cycleId, layer);
309
+ const layerTotal = layerResults.reduce((s, r) => s + r.count, 0);
310
+ const layerPassed = layerResults.find((r) => r.passed === 1)?.count ?? 0;
311
+ const layerFailed = layerTotal - layerPassed;
312
+ // Check all layers
313
+ const allResults = db
314
+ .prepare("SELECT layer, MIN(passed) as all_passed FROM test_results WHERE cycle_id = ? GROUP BY layer")
315
+ .all(cycleId);
316
+ const allLayersPassing = allResults.length > 0 &&
317
+ allResults.every((r) => r.all_passed === 1);
318
+ return {
319
+ testId,
320
+ layer,
321
+ passed,
322
+ layerSummary: {
323
+ total: layerTotal,
324
+ passed: layerPassed,
325
+ failed: layerFailed,
326
+ },
327
+ allLayersPassing,
328
+ };
329
+ },
330
+ },
331
+ {
332
+ name: "get_verification_status",
333
+ description: "Get the current status of a verification cycle including all phases, gaps, and test results. Use this to understand where you are in the process and what to do next.",
334
+ inputSchema: {
335
+ type: "object",
336
+ properties: {
337
+ cycleId: { type: "string", description: "Verification cycle ID" },
338
+ },
339
+ required: ["cycleId"],
340
+ },
341
+ handler: async (args) => {
342
+ const db = getDb();
343
+ const cycle = db
344
+ .prepare("SELECT * FROM verification_cycles WHERE id = ?")
345
+ .get(args.cycleId);
346
+ if (!cycle)
347
+ throw new Error(`Cycle not found: ${args.cycleId}`);
348
+ const phases = db
349
+ .prepare("SELECT * FROM verification_phases WHERE cycle_id = ? ORDER BY phase_number")
350
+ .all(args.cycleId);
351
+ const gaps = db
352
+ .prepare("SELECT severity, status, COUNT(*) as count FROM gaps WHERE cycle_id = ? GROUP BY severity, status")
353
+ .all(args.cycleId);
354
+ const tests = db
355
+ .prepare("SELECT layer, passed, COUNT(*) as count FROM test_results WHERE cycle_id = ? GROUP BY layer, passed")
356
+ .all(args.cycleId);
357
+ const completedPhases = phases.filter((p) => p.status === "passed").length;
358
+ const progress = Math.round((completedPhases / 6) * 100);
359
+ const currentPhaseName = PHASE_NAMES[cycle.current_phase - 1];
360
+ const nextAction = cycle.status === "completed"
361
+ ? "Cycle complete. Consider promoting findings to eval suite with promote_to_eval."
362
+ : PHASE_INSTRUCTIONS[currentPhaseName];
363
+ return {
364
+ cycleId: cycle.id,
365
+ title: cycle.title,
366
+ status: cycle.status,
367
+ currentPhase: cycle.current_phase,
368
+ progress: `${progress}%`,
369
+ phases: phases.map((p) => ({
370
+ number: p.phase_number,
371
+ name: p.phase_name,
372
+ status: p.status,
373
+ findings: p.findings ? JSON.parse(p.findings) : null,
374
+ })),
375
+ gaps: gaps.map((g) => ({
376
+ severity: g.severity,
377
+ status: g.status,
378
+ count: g.count,
379
+ })),
380
+ tests: tests.map((t) => ({
381
+ layer: t.layer,
382
+ passed: t.passed === 1,
383
+ count: t.count,
384
+ })),
385
+ nextAction,
386
+ };
387
+ },
388
+ },
389
+ {
390
+ name: "list_verification_cycles",
391
+ description: "List all verification cycles, optionally filtered by status. Use this to find a cycle ID or review past verifications.",
392
+ inputSchema: {
393
+ type: "object",
394
+ properties: {
395
+ status: {
396
+ type: "string",
397
+ enum: ["active", "completed", "abandoned"],
398
+ description: "Filter by status (optional, returns all if omitted)",
399
+ },
400
+ limit: {
401
+ type: "number",
402
+ description: "Max results (default 20)",
403
+ },
404
+ },
405
+ },
406
+ handler: async (args) => {
407
+ const db = getDb();
408
+ const limit = args.limit ?? 20;
409
+ const rows = args.status
410
+ ? db
411
+ .prepare("SELECT * FROM verification_cycles WHERE status = ? ORDER BY created_at DESC LIMIT ?")
412
+ .all(args.status, limit)
413
+ : db
414
+ .prepare("SELECT * FROM verification_cycles ORDER BY created_at DESC LIMIT ?")
415
+ .all(limit);
416
+ return {
417
+ count: rows.length,
418
+ cycles: rows.map((r) => ({
419
+ cycleId: r.id,
420
+ title: r.title,
421
+ status: r.status,
422
+ currentPhase: r.current_phase,
423
+ createdAt: r.created_at,
424
+ updatedAt: r.updated_at,
425
+ })),
426
+ };
427
+ },
428
+ },
429
+ {
430
+ name: "abandon_cycle",
431
+ description: "Abandon an active verification cycle that will not be completed. Use this to clean up orphaned or stale cycles.",
432
+ inputSchema: {
433
+ type: "object",
434
+ properties: {
435
+ cycleId: {
436
+ type: "string",
437
+ description: "The verification cycle ID to abandon",
438
+ },
439
+ reason: {
440
+ type: "string",
441
+ description: "Why this cycle is being abandoned (optional)",
442
+ },
443
+ },
444
+ required: ["cycleId"],
445
+ },
446
+ handler: async (args) => {
447
+ const db = getDb();
448
+ const cycle = db
449
+ .prepare("SELECT * FROM verification_cycles WHERE id = ?")
450
+ .get(args.cycleId);
451
+ if (!cycle)
452
+ throw new Error(`Cycle not found: ${args.cycleId}`);
453
+ if (cycle.status !== "active") {
454
+ return {
455
+ skipped: true,
456
+ reason: `Cycle is already '${cycle.status}', cannot abandon`,
457
+ cycleId: args.cycleId,
458
+ };
459
+ }
460
+ const now = new Date().toISOString();
461
+ db.prepare("UPDATE verification_cycles SET status = 'abandoned', updated_at = ? WHERE id = ?").run(now, args.cycleId);
462
+ return {
463
+ abandoned: true,
464
+ cycleId: args.cycleId,
465
+ title: cycle.title,
466
+ reason: args.reason ?? "No reason provided",
467
+ abandonedAt: now,
468
+ };
469
+ },
470
+ },
471
+ ];
472
+ //# sourceMappingURL=verificationTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verificationTools.js","sourceRoot":"","sources":["../../src/tools/verificationTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Vision tools — AI-powered visual analysis, environment discovery, and image manipulation.
3
+ * Enables the agentic vision loop: Capture → Analyze → Manipulate → Iterate → Gate.
4
+ *
5
+ * - discover_vision_env: Scans for available API keys and SDKs
6
+ * - analyze_screenshot: Sends screenshots to vision models for analysis
7
+ * - manipulate_screenshot: Crop, resize, annotate images using sharp
8
+ *
9
+ * All AI SDKs and sharp are optional dependencies — tools fail gracefully if missing.
10
+ */
11
+ import type { McpTool } from "../types.js";
12
+ export declare const visionTools: McpTool[];