waymark-hub 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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/dashboard/README.md +71 -0
  4. package/dashboard/index.html +520 -0
  5. package/dashboard/server.mjs +343 -0
  6. package/dashboard/vendor/tailwind.js +83 -0
  7. package/dist/cli/benchmark.d.ts +3 -0
  8. package/dist/cli/benchmark.d.ts.map +1 -0
  9. package/dist/cli/benchmark.js +222 -0
  10. package/dist/cli/benchmark.js.map +1 -0
  11. package/dist/cli/waymark.d.ts +3 -0
  12. package/dist/cli/waymark.d.ts.map +1 -0
  13. package/dist/cli/waymark.js +216 -0
  14. package/dist/cli/waymark.js.map +1 -0
  15. package/dist/context/builder.d.ts +67 -0
  16. package/dist/context/builder.d.ts.map +1 -0
  17. package/dist/context/builder.js +270 -0
  18. package/dist/context/builder.js.map +1 -0
  19. package/dist/db/client.d.ts +5 -0
  20. package/dist/db/client.d.ts.map +1 -0
  21. package/dist/db/client.js +67 -0
  22. package/dist/db/client.js.map +1 -0
  23. package/dist/db/migrations/001_initial.sql +85 -0
  24. package/dist/db/migrations/002_usage_experiments.sql +52 -0
  25. package/dist/db/migrations/003_agent_identity.sql +37 -0
  26. package/dist/db/migrations/004_memory_lifecycle.sql +25 -0
  27. package/dist/db/migrations/005_task_coordination.sql +17 -0
  28. package/dist/db/schema.d.ts +132 -0
  29. package/dist/db/schema.d.ts.map +1 -0
  30. package/dist/db/schema.js +3 -0
  31. package/dist/db/schema.js.map +1 -0
  32. package/dist/server.d.ts +12 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +164 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/telemetry/tokens.d.ts +9 -0
  37. package/dist/telemetry/tokens.d.ts.map +1 -0
  38. package/dist/telemetry/tokens.js +23 -0
  39. package/dist/telemetry/tokens.js.map +1 -0
  40. package/dist/tools/agents.d.ts +3 -0
  41. package/dist/tools/agents.d.ts.map +1 -0
  42. package/dist/tools/agents.js +126 -0
  43. package/dist/tools/agents.js.map +1 -0
  44. package/dist/tools/context.d.ts +3 -0
  45. package/dist/tools/context.d.ts.map +1 -0
  46. package/dist/tools/context.js +53 -0
  47. package/dist/tools/context.js.map +1 -0
  48. package/dist/tools/memory.d.ts +3 -0
  49. package/dist/tools/memory.d.ts.map +1 -0
  50. package/dist/tools/memory.js +273 -0
  51. package/dist/tools/memory.js.map +1 -0
  52. package/dist/tools/projects.d.ts +3 -0
  53. package/dist/tools/projects.d.ts.map +1 -0
  54. package/dist/tools/projects.js +92 -0
  55. package/dist/tools/projects.js.map +1 -0
  56. package/dist/tools/sessions.d.ts +3 -0
  57. package/dist/tools/sessions.d.ts.map +1 -0
  58. package/dist/tools/sessions.js +113 -0
  59. package/dist/tools/sessions.js.map +1 -0
  60. package/dist/tools/tasks.d.ts +3 -0
  61. package/dist/tools/tasks.d.ts.map +1 -0
  62. package/dist/tools/tasks.js +304 -0
  63. package/dist/tools/tasks.js.map +1 -0
  64. package/dist/tools/telemetry.d.ts +3 -0
  65. package/dist/tools/telemetry.d.ts.map +1 -0
  66. package/dist/tools/telemetry.js +291 -0
  67. package/dist/tools/telemetry.js.map +1 -0
  68. package/docs/AGENT_IDENTITY.md +67 -0
  69. package/docs/BENCHMARKING.md +161 -0
  70. package/docs/CONTEXT.md +95 -0
  71. package/docs/MEMORY_LIFECYCLE.md +65 -0
  72. package/docs/TASK_COORDINATION.md +27 -0
  73. package/package.json +70 -0
  74. package/scripts/hooks/session-start-resume.cjs +70 -0
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerTaskTools = registerTaskTools;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../db/client.js");
6
+ const crypto_1 = require("crypto");
7
+ function registerTaskTools(server) {
8
+ server.registerTool('task_create', {
9
+ description: 'Create a handoff task for another agent or client.',
10
+ inputSchema: zod_1.z.object({
11
+ title: zod_1.z.string().describe('short imperative title'),
12
+ description: zod_1.z.string().describe('what to do and why'),
13
+ project_id: zod_1.z.string().optional(),
14
+ created_by: zod_1.z.string().default('claude-code'),
15
+ created_by_agent: zod_1.z.string().optional(),
16
+ assigned_to: zod_1.z.string().optional(),
17
+ assigned_agent_id: zod_1.z.string().optional(),
18
+ required_capabilities: zod_1.z.array(zod_1.z.string()).default([])
19
+ .describe('capabilities the claiming agent must have'),
20
+ dependency_ids: zod_1.z.array(zod_1.z.string()).default([])
21
+ .describe('tasks that must finish first'),
22
+ priority: zod_1.z.number().int().min(0).max(100).default(50).describe('0-100, higher = more urgent'),
23
+ context_json: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional()
24
+ .describe('structured handoff data: paths, URLs, selectors'),
25
+ }),
26
+ }, ({ title, description, project_id, created_by, created_by_agent, assigned_to, assigned_agent_id, required_capabilities, dependency_ids, priority, context_json, }) => {
27
+ const db = (0, client_js_1.getDb)();
28
+ const id = (0, crypto_1.randomUUID)();
29
+ const now = new Date().toISOString();
30
+ const uniqueCapabilities = [...new Set(required_capabilities)];
31
+ const uniqueDependencyIds = [...new Set(dependency_ids)];
32
+ for (const agentId of [created_by_agent, assigned_agent_id]) {
33
+ if (agentId && !db.prepare('SELECT 1 FROM agents WHERE id = ?').get(agentId)) {
34
+ return { content: [{ type: 'text', text: `Agent "${agentId}" not found.` }], isError: true };
35
+ }
36
+ }
37
+ for (const dependencyId of uniqueDependencyIds) {
38
+ if (!db.prepare('SELECT 1 FROM tasks WHERE id = ?').get(dependencyId)) {
39
+ return {
40
+ content: [{ type: 'text', text: `Dependency task "${dependencyId}" not found.` }],
41
+ isError: true,
42
+ };
43
+ }
44
+ }
45
+ db.transaction(() => {
46
+ db.prepare(`
47
+ INSERT INTO tasks
48
+ (
49
+ id, project_id, title, description, status, priority,
50
+ created_by, assigned_to, context_json, created_at, updated_at,
51
+ created_by_agent, assigned_agent_id, required_capabilities
52
+ )
53
+ VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?)
54
+ `).run(id, project_id ?? null, title, description, priority, created_by, assigned_to ?? null, context_json ? JSON.stringify(context_json) : null, now, now, created_by_agent ?? null, assigned_agent_id ?? null, JSON.stringify(uniqueCapabilities));
55
+ const insertDependency = db.prepare(`
56
+ INSERT INTO task_dependencies (task_id, depends_on_task_id, created_at)
57
+ VALUES (?, ?, ?)
58
+ `);
59
+ for (const dependencyId of uniqueDependencyIds) {
60
+ insertDependency.run(id, dependencyId, now);
61
+ }
62
+ })();
63
+ const row = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
64
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
65
+ });
66
+ server.registerTool('task_list', {
67
+ description: 'List tasks by status, project, assignee, or blocker.',
68
+ inputSchema: zod_1.z.object({
69
+ status: zod_1.z.enum(['pending', 'in_progress', 'done', 'cancelled']).optional(),
70
+ project_id: zod_1.z.string().optional(),
71
+ assigned_to: zod_1.z.string().optional(),
72
+ assigned_agent_id: zod_1.z.string().optional(),
73
+ created_by: zod_1.z.string().optional(),
74
+ created_by_agent: zod_1.z.string().optional(),
75
+ claimed_by_agent: zod_1.z.string().optional(),
76
+ blocked: zod_1.z.boolean().optional(),
77
+ limit: zod_1.z.number().int().min(1).max(100).default(20),
78
+ }),
79
+ annotations: { readOnlyHint: true },
80
+ }, ({ status, project_id, assigned_to, assigned_agent_id, created_by, created_by_agent, claimed_by_agent, blocked, limit, }) => {
81
+ const db = (0, client_js_1.getDb)();
82
+ let sql = 'SELECT * FROM tasks WHERE 1=1';
83
+ const params = [];
84
+ if (status) {
85
+ sql += ' AND status = ?';
86
+ params.push(status);
87
+ }
88
+ if (project_id) {
89
+ sql += ' AND project_id = ?';
90
+ params.push(project_id);
91
+ }
92
+ if (assigned_to) {
93
+ sql += ' AND assigned_to = ?';
94
+ params.push(assigned_to);
95
+ }
96
+ if (assigned_agent_id) {
97
+ sql += ' AND assigned_agent_id = ?';
98
+ params.push(assigned_agent_id);
99
+ }
100
+ if (created_by) {
101
+ sql += ' AND created_by = ?';
102
+ params.push(created_by);
103
+ }
104
+ if (created_by_agent) {
105
+ sql += ' AND created_by_agent = ?';
106
+ params.push(created_by_agent);
107
+ }
108
+ if (claimed_by_agent) {
109
+ sql += ' AND claimed_by_agent = ?';
110
+ params.push(claimed_by_agent);
111
+ }
112
+ if (blocked === true)
113
+ sql += ' AND blocker IS NOT NULL';
114
+ if (blocked === false)
115
+ sql += ' AND blocker IS NULL';
116
+ sql += ' ORDER BY priority DESC, created_at ASC LIMIT ?';
117
+ params.push(limit);
118
+ const rows = db.prepare(sql).all(...params);
119
+ return { content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }] };
120
+ });
121
+ server.registerTool('task_update', {
122
+ description: 'Update task status, progress, blocker, or notes.',
123
+ inputSchema: zod_1.z.object({
124
+ id: zod_1.z.string(),
125
+ status: zod_1.z.enum(['pending', 'in_progress', 'done', 'cancelled']).optional(),
126
+ description: zod_1.z.string().optional(),
127
+ context_json: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
128
+ blocker: zod_1.z.string().nullable().optional().describe('null clears it'),
129
+ progress: zod_1.z.number().int().min(0).max(100).optional(),
130
+ }),
131
+ }, ({ id, status, description, context_json, blocker, progress }) => {
132
+ const db = (0, client_js_1.getDb)();
133
+ const existing = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
134
+ if (!existing) {
135
+ return { content: [{ type: 'text', text: `Task "${id}" not found.` }], isError: true };
136
+ }
137
+ const now = new Date().toISOString();
138
+ const completedAt = status === 'done' || status === 'cancelled'
139
+ ? now
140
+ : status === 'pending' || status === 'in_progress'
141
+ ? null
142
+ : existing.completed_at;
143
+ const newContext = context_json
144
+ ? JSON.stringify(context_json)
145
+ : existing.context_json;
146
+ const nextProgress = status === 'done' ? 100 : progress ?? existing.progress;
147
+ const nextBlocker = blocker === undefined
148
+ ? status === 'done' ? null : existing.blocker
149
+ : blocker;
150
+ db.prepare(`
151
+ UPDATE tasks SET
152
+ status = COALESCE(?, status),
153
+ description = COALESCE(?, description),
154
+ context_json = ?,
155
+ completed_at = ?,
156
+ blocker = ?,
157
+ progress = ?,
158
+ updated_at = ?
159
+ WHERE id = ?
160
+ `).run(status ?? null, description ?? null, newContext, completedAt, nextBlocker, nextProgress, now, id);
161
+ const row = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
162
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
163
+ });
164
+ server.registerTool('task_add_dependency', {
165
+ description: 'Require one task to be completed before another can be claimed.',
166
+ inputSchema: zod_1.z.object({
167
+ id: zod_1.z.string().describe('Blocked task id'),
168
+ depends_on_id: zod_1.z.string().describe('Dependency task id'),
169
+ }),
170
+ }, ({ id, depends_on_id }) => {
171
+ const db = (0, client_js_1.getDb)();
172
+ if (id === depends_on_id) {
173
+ return { content: [{ type: 'text', text: 'A task cannot depend on itself.' }], isError: true };
174
+ }
175
+ for (const taskId of [id, depends_on_id]) {
176
+ if (!db.prepare('SELECT 1 FROM tasks WHERE id = ?').get(taskId)) {
177
+ return { content: [{ type: 'text', text: `Task "${taskId}" not found.` }], isError: true };
178
+ }
179
+ }
180
+ const createsCycle = db.prepare(`
181
+ WITH RECURSIVE dependency_chain(task_id) AS (
182
+ SELECT depends_on_task_id
183
+ FROM task_dependencies
184
+ WHERE task_id = ?
185
+ UNION
186
+ SELECT d.depends_on_task_id
187
+ FROM task_dependencies d
188
+ JOIN dependency_chain c ON d.task_id = c.task_id
189
+ )
190
+ SELECT 1 FROM dependency_chain WHERE task_id = ? LIMIT 1
191
+ `).get(depends_on_id, id);
192
+ if (createsCycle) {
193
+ return {
194
+ content: [{ type: 'text', text: 'This dependency would create a cycle.' }],
195
+ isError: true,
196
+ };
197
+ }
198
+ db.prepare(`
199
+ INSERT OR IGNORE INTO task_dependencies (task_id, depends_on_task_id, created_at)
200
+ VALUES (?, ?, ?)
201
+ `).run(id, depends_on_id, new Date().toISOString());
202
+ return {
203
+ content: [{
204
+ type: 'text',
205
+ text: `Task "${id}" now depends on "${depends_on_id}".`,
206
+ }],
207
+ };
208
+ });
209
+ server.registerTool('task_claim', {
210
+ description: 'Atomically claim a pending task after validating assignment, capabilities, and dependencies.',
211
+ inputSchema: zod_1.z.object({
212
+ id: zod_1.z.string(),
213
+ agent_id: zod_1.z.string(),
214
+ }),
215
+ }, ({ id, agent_id }) => {
216
+ const db = (0, client_js_1.getDb)();
217
+ const claim = db.transaction(() => {
218
+ const task = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
219
+ if (!task)
220
+ return { error: `Task "${id}" not found.` };
221
+ if (task.status !== 'pending' || task.claimed_by_agent) {
222
+ return { error: `Task "${id}" is not available for claim.` };
223
+ }
224
+ const agent = db.prepare('SELECT capabilities, status FROM agents WHERE id = ?').get(agent_id);
225
+ if (!agent)
226
+ return { error: `Agent "${agent_id}" not found.` };
227
+ if (agent.status !== 'active')
228
+ return { error: `Agent "${agent_id}" is not active.` };
229
+ if (task.assigned_agent_id && task.assigned_agent_id !== agent_id) {
230
+ return { error: `Task "${id}" is assigned to another agent.` };
231
+ }
232
+ const required = task.required_capabilities
233
+ ? JSON.parse(task.required_capabilities)
234
+ : [];
235
+ const capabilities = agent.capabilities
236
+ ? JSON.parse(agent.capabilities)
237
+ : [];
238
+ const missing = required.filter(capability => !capabilities.includes(capability));
239
+ if (missing.length > 0) {
240
+ return { error: `Agent is missing required capabilities: ${missing.join(', ')}.` };
241
+ }
242
+ const incomplete = db.prepare(`
243
+ SELECT d.depends_on_task_id, t.status
244
+ FROM task_dependencies d
245
+ JOIN tasks t ON t.id = d.depends_on_task_id
246
+ WHERE d.task_id = ? AND t.status <> 'done'
247
+ `).all(id);
248
+ if (incomplete.length > 0) {
249
+ return {
250
+ error: `Task has incomplete dependencies: ${incomplete.map(item => item.depends_on_task_id).join(', ')}.`,
251
+ };
252
+ }
253
+ const now = new Date().toISOString();
254
+ const result = db.prepare(`
255
+ UPDATE tasks SET
256
+ status = 'in_progress',
257
+ claimed_by_agent = ?,
258
+ claimed_at = ?,
259
+ updated_at = ?
260
+ WHERE id = ? AND status = 'pending' AND claimed_by_agent IS NULL
261
+ `).run(agent_id, now, now, id);
262
+ if (result.changes !== 1) {
263
+ return { error: `Task "${id}" was claimed by another agent.` };
264
+ }
265
+ return { task: db.prepare('SELECT * FROM tasks WHERE id = ?').get(id) };
266
+ }).immediate();
267
+ if ('error' in claim) {
268
+ return {
269
+ content: [{ type: 'text', text: claim.error ?? `Task "${id}" could not be claimed.` }],
270
+ isError: true,
271
+ };
272
+ }
273
+ return { content: [{ type: 'text', text: JSON.stringify(claim.task, null, 2) }] };
274
+ });
275
+ server.registerTool('task_release', {
276
+ description: 'Release a claimed task back to pending so another agent can take it.',
277
+ inputSchema: zod_1.z.object({
278
+ id: zod_1.z.string(),
279
+ agent_id: zod_1.z.string(),
280
+ blocker: zod_1.z.string().optional(),
281
+ }),
282
+ }, ({ id, agent_id, blocker }) => {
283
+ const db = (0, client_js_1.getDb)();
284
+ const now = new Date().toISOString();
285
+ const result = db.prepare(`
286
+ UPDATE tasks SET
287
+ status = 'pending',
288
+ claimed_by_agent = NULL,
289
+ claimed_at = NULL,
290
+ blocker = COALESCE(?, blocker),
291
+ updated_at = ?
292
+ WHERE id = ? AND claimed_by_agent = ? AND status = 'in_progress'
293
+ `).run(blocker ?? null, now, id, agent_id);
294
+ if (result.changes !== 1) {
295
+ return {
296
+ content: [{ type: 'text', text: `Task "${id}" is not claimed by agent "${agent_id}".` }],
297
+ isError: true,
298
+ };
299
+ }
300
+ const row = db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
301
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
302
+ });
303
+ }
304
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTelemetryTools(server: McpServer): void;
3
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/tools/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsX9D"}
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerTelemetryTools = registerTelemetryTools;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const zod_1 = require("zod");
6
+ const client_js_1 = require("../db/client.js");
7
+ const tokens_js_1 = require("../telemetry/tokens.js");
8
+ function jsonContent(value) {
9
+ return { content: [{ type: 'text', text: JSON.stringify(value, null, 2) }] };
10
+ }
11
+ function errorContent(message) {
12
+ return { content: [{ type: 'text', text: message }], isError: true };
13
+ }
14
+ function median(values) {
15
+ if (values.length === 0)
16
+ return null;
17
+ const sorted = [...values].sort((a, b) => a - b);
18
+ const middle = Math.floor(sorted.length / 2);
19
+ return sorted.length % 2 === 0
20
+ ? (sorted[middle - 1] + sorted[middle]) / 2
21
+ : sorted[middle];
22
+ }
23
+ function cohortKey(row) {
24
+ return [
25
+ row.measurement,
26
+ row.provider ?? 'unknown-provider',
27
+ row.model ?? 'unknown-model',
28
+ row.client ?? 'unknown-client',
29
+ ].join('|');
30
+ }
31
+ function registerTelemetryTools(server) {
32
+ server.registerTool('experiment_create', {
33
+ description: 'Create a reproducible A/B experiment for comparing agent work with and without the Hub.',
34
+ inputSchema: zod_1.z.object({
35
+ project_id: zod_1.z.string().optional(),
36
+ name: zod_1.z.string().min(1),
37
+ description: zod_1.z.string().optional(),
38
+ scenario: zod_1.z.string().min(1).describe('Stable scenario identifier or description'),
39
+ target_runs: zod_1.z.number().int().min(1).max(1000).default(5),
40
+ }),
41
+ }, ({ project_id, name, description, scenario, target_runs }) => {
42
+ const db = (0, client_js_1.getDb)();
43
+ const id = (0, node_crypto_1.randomUUID)();
44
+ const now = new Date().toISOString();
45
+ db.prepare(`
46
+ INSERT INTO experiments
47
+ (id, project_id, name, description, scenario, status, target_runs, created_at, updated_at)
48
+ VALUES (?, ?, ?, ?, ?, 'active', ?, ?, ?)
49
+ `).run(id, project_id ?? null, name, description ?? null, scenario, target_runs, now, now);
50
+ const row = db.prepare('SELECT * FROM experiments WHERE id = ?').get(id);
51
+ return jsonContent(row);
52
+ });
53
+ server.registerTool('experiment_list', {
54
+ description: 'List token-usage experiments and their current run counts.',
55
+ inputSchema: zod_1.z.object({
56
+ project_id: zod_1.z.string().optional(),
57
+ status: zod_1.z.enum(['active', 'completed', 'cancelled']).optional(),
58
+ limit: zod_1.z.number().int().min(1).max(100).default(20),
59
+ }),
60
+ annotations: { readOnlyHint: true },
61
+ }, ({ project_id, status, limit }) => {
62
+ const db = (0, client_js_1.getDb)();
63
+ let sql = `
64
+ SELECT e.*,
65
+ SUM(CASE WHEN u.variant = 'without_hub' THEN 1 ELSE 0 END) AS without_hub_runs,
66
+ SUM(CASE WHEN u.variant = 'with_hub' THEN 1 ELSE 0 END) AS with_hub_runs
67
+ FROM experiments e
68
+ LEFT JOIN usage_reports u ON u.experiment_id = e.id
69
+ WHERE 1=1
70
+ `;
71
+ const params = [];
72
+ if (project_id) {
73
+ sql += ' AND e.project_id = ?';
74
+ params.push(project_id);
75
+ }
76
+ if (status) {
77
+ sql += ' AND e.status = ?';
78
+ params.push(status);
79
+ }
80
+ sql += ' GROUP BY e.id ORDER BY e.updated_at DESC LIMIT ?';
81
+ params.push(limit);
82
+ return jsonContent(db.prepare(sql).all(...params));
83
+ });
84
+ server.registerTool('experiment_update', {
85
+ description: 'Update experiment metadata or mark an experiment completed or cancelled.',
86
+ inputSchema: zod_1.z.object({
87
+ id: zod_1.z.string(),
88
+ name: zod_1.z.string().min(1).optional(),
89
+ description: zod_1.z.string().optional(),
90
+ status: zod_1.z.enum(['active', 'completed', 'cancelled']).optional(),
91
+ target_runs: zod_1.z.number().int().min(1).max(1000).optional(),
92
+ }),
93
+ }, ({ id, name, description, status, target_runs }) => {
94
+ const db = (0, client_js_1.getDb)();
95
+ const existing = db.prepare('SELECT 1 FROM experiments WHERE id = ?').get(id);
96
+ if (!existing)
97
+ return errorContent(`Experiment "${id}" not found.`);
98
+ db.prepare(`
99
+ UPDATE experiments SET
100
+ name = COALESCE(?, name),
101
+ description = COALESCE(?, description),
102
+ status = COALESCE(?, status),
103
+ target_runs = COALESCE(?, target_runs),
104
+ updated_at = ?
105
+ WHERE id = ?
106
+ `).run(name ?? null, description ?? null, status ?? null, target_runs ?? null, new Date().toISOString(), id);
107
+ return jsonContent(db.prepare('SELECT * FROM experiments WHERE id = ?').get(id));
108
+ });
109
+ server.registerTool('usage_report', {
110
+ description: 'Record exact or estimated model usage and task-efficiency metrics for a session or A/B experiment run.',
111
+ inputSchema: zod_1.z.object({
112
+ project_id: zod_1.z.string().optional(),
113
+ session_id: zod_1.z.string().optional(),
114
+ agent_id: zod_1.z.string().optional(),
115
+ experiment_id: zod_1.z.string().optional(),
116
+ variant: zod_1.z.enum(['without_hub', 'with_hub']).optional(),
117
+ provider: zod_1.z.string().optional(),
118
+ model: zod_1.z.string().optional(),
119
+ client: zod_1.z.string().optional(),
120
+ measurement: zod_1.z.enum(['exact', 'estimated']).default('estimated'),
121
+ input_tokens: zod_1.z.number().int().min(0).optional(),
122
+ output_tokens: zod_1.z.number().int().min(0).optional(),
123
+ cached_input_tokens: zod_1.z.number().int().min(0).optional(),
124
+ hub_llm_input_tokens: zod_1.z.number().int().min(0).default(0),
125
+ hub_llm_output_tokens: zod_1.z.number().int().min(0).default(0),
126
+ context_tokens: zod_1.z.number().int().min(0).optional(),
127
+ context_text: zod_1.z.string().optional()
128
+ .describe('Optional context text used only to estimate context_tokens when no count is available'),
129
+ tool_calls: zod_1.z.number().int().min(0).optional(),
130
+ files_read: zod_1.z.array(zod_1.z.string()).optional(),
131
+ repeated_files: zod_1.z.number().int().min(0).optional(),
132
+ clarification_count: zod_1.z.number().int().min(0).optional(),
133
+ duration_ms: zod_1.z.number().int().min(0).optional(),
134
+ result_quality: zod_1.z.number().min(0).max(100).optional(),
135
+ success: zod_1.z.boolean().optional(),
136
+ notes: zod_1.z.string().optional(),
137
+ }).refine(value => !value.experiment_id || Boolean(value.variant), { message: 'variant is required when experiment_id is provided', path: ['variant'] }).refine(value => value.measurement !== 'exact' ||
138
+ value.input_tokens !== undefined ||
139
+ value.output_tokens !== undefined, {
140
+ message: 'exact measurement requires input_tokens or output_tokens',
141
+ path: ['measurement'],
142
+ }),
143
+ }, ({ project_id, session_id, agent_id, experiment_id, variant, provider, model, client, measurement, input_tokens, output_tokens, cached_input_tokens, hub_llm_input_tokens, hub_llm_output_tokens, context_tokens, context_text, tool_calls, files_read, repeated_files, clarification_count, duration_ms, result_quality, success, notes, }) => {
144
+ const db = (0, client_js_1.getDb)();
145
+ let session;
146
+ if (session_id) {
147
+ session = db.prepare('SELECT * FROM sessions WHERE id = ?').get(session_id);
148
+ if (!session)
149
+ return errorContent(`Session "${session_id}" not found.`);
150
+ if (agent_id && session.agent_id && agent_id !== session.agent_id) {
151
+ return errorContent('usage_report agent_id must match the session agent_id.');
152
+ }
153
+ }
154
+ const effectiveAgentId = agent_id ?? session?.agent_id ?? null;
155
+ let agent;
156
+ if (effectiveAgentId) {
157
+ agent = db.prepare('SELECT * FROM agents WHERE id = ?').get(effectiveAgentId);
158
+ if (!agent)
159
+ return errorContent(`Agent "${effectiveAgentId}" not found.`);
160
+ }
161
+ if (project_id && session?.project_id && project_id !== session.project_id) {
162
+ return errorContent('usage_report project_id must match the session project_id.');
163
+ }
164
+ let effectiveProjectId = project_id ?? session?.project_id ?? null;
165
+ if (experiment_id) {
166
+ const experiment = db.prepare('SELECT project_id FROM experiments WHERE id = ?').get(experiment_id);
167
+ if (!experiment)
168
+ return errorContent(`Experiment "${experiment_id}" not found.`);
169
+ if (project_id && experiment.project_id && project_id !== experiment.project_id) {
170
+ return errorContent('usage_report project_id must match the experiment project_id.');
171
+ }
172
+ effectiveProjectId = experiment.project_id ?? effectiveProjectId;
173
+ }
174
+ const id = (0, node_crypto_1.randomUUID)();
175
+ const estimatedContextTokens = context_tokens ??
176
+ (context_text === undefined ? null : (0, tokens_js_1.estimateTokens)(context_text));
177
+ const now = new Date().toISOString();
178
+ db.prepare(`
179
+ INSERT INTO usage_reports (
180
+ id, project_id, session_id, experiment_id, variant,
181
+ provider, model, client, measurement,
182
+ input_tokens, output_tokens, cached_input_tokens,
183
+ hub_llm_input_tokens, hub_llm_output_tokens,
184
+ context_tokens, context_chars, tool_calls, files_read,
185
+ repeated_files, clarification_count, duration_ms,
186
+ result_quality, success, notes, created_at, agent_id
187
+ )
188
+ VALUES (
189
+ ?, ?, ?, ?, ?,
190
+ ?, ?, ?, ?,
191
+ ?, ?, ?,
192
+ ?, ?,
193
+ ?, ?, ?, ?,
194
+ ?, ?, ?,
195
+ ?, ?, ?, ?, ?
196
+ )
197
+ `).run(id, effectiveProjectId, session_id ?? null, experiment_id ?? null, variant ?? null, provider ?? agent?.provider ?? session?.provider ?? null, model ?? agent?.model ?? session?.model ?? null, client ?? agent?.client ?? session?.client ?? null, measurement, input_tokens ?? null, output_tokens ?? null, cached_input_tokens ?? null, hub_llm_input_tokens, hub_llm_output_tokens, estimatedContextTokens, context_text === undefined ? null : context_text.length, tool_calls ?? null, files_read ? JSON.stringify(files_read) : null, repeated_files ?? null, clarification_count ?? null, duration_ms ?? null, result_quality ?? null, success === undefined ? null : Number(success), notes ?? null, now, effectiveAgentId);
198
+ const row = db.prepare('SELECT * FROM usage_reports WHERE id = ?').get(id);
199
+ return jsonContent({
200
+ ...row,
201
+ files_read: row.files_read ? JSON.parse(row.files_read) : null,
202
+ total_model_tokens: (0, tokens_js_1.totalModelTokens)({
203
+ inputTokens: row.input_tokens,
204
+ outputTokens: row.output_tokens,
205
+ hubLlmInputTokens: row.hub_llm_input_tokens,
206
+ hubLlmOutputTokens: row.hub_llm_output_tokens,
207
+ }),
208
+ });
209
+ });
210
+ server.registerTool('experiment_summary', {
211
+ description: 'Summarize A/B token usage without mixing models, clients, or exact and estimated measurements.',
212
+ inputSchema: zod_1.z.object({
213
+ id: zod_1.z.string().describe('Experiment UUID'),
214
+ }),
215
+ annotations: { readOnlyHint: true },
216
+ }, ({ id }) => {
217
+ const db = (0, client_js_1.getDb)();
218
+ const experiment = db.prepare('SELECT * FROM experiments WHERE id = ?').get(id);
219
+ if (!experiment)
220
+ return errorContent(`Experiment "${id}" not found.`);
221
+ const rows = db.prepare('SELECT * FROM usage_reports WHERE experiment_id = ? ORDER BY created_at ASC').all(id);
222
+ const reports = rows.map(row => ({
223
+ ...row,
224
+ total_model_tokens: (0, tokens_js_1.totalModelTokens)({
225
+ inputTokens: row.input_tokens,
226
+ outputTokens: row.output_tokens,
227
+ hubLlmInputTokens: row.hub_llm_input_tokens,
228
+ hubLlmOutputTokens: row.hub_llm_output_tokens,
229
+ }),
230
+ }));
231
+ const cohorts = new Map();
232
+ for (const report of reports) {
233
+ const key = cohortKey(report);
234
+ const group = cohorts.get(key) ?? [];
235
+ group.push(report);
236
+ cohorts.set(key, group);
237
+ }
238
+ const summaries = Array.from(cohorts.entries()).map(([key, cohort]) => {
239
+ const withoutHub = cohort.filter(row => row.variant === 'without_hub' && row.total_model_tokens !== null);
240
+ const withHub = cohort.filter(row => row.variant === 'with_hub' && row.total_model_tokens !== null);
241
+ const withoutMedian = median(withoutHub.map(row => row.total_model_tokens));
242
+ const withMedian = median(withHub.map(row => row.total_model_tokens));
243
+ const netSaving = withoutMedian === null || withMedian === null
244
+ ? null
245
+ : withoutMedian - withMedian;
246
+ let savingPercent = null;
247
+ if (netSaving !== null && withoutMedian !== null && withoutMedian !== 0) {
248
+ savingPercent = netSaving / withoutMedian * 100;
249
+ }
250
+ const [measurement, provider, model, client] = key.split('|');
251
+ return {
252
+ measurement,
253
+ provider,
254
+ model,
255
+ client,
256
+ without_hub: {
257
+ runs: withoutHub.length,
258
+ median_total_model_tokens: withoutMedian,
259
+ median_duration_ms: median(withoutHub.flatMap(row => row.duration_ms === null ? [] : [row.duration_ms])),
260
+ },
261
+ with_hub: {
262
+ runs: withHub.length,
263
+ median_total_model_tokens: withMedian,
264
+ median_duration_ms: median(withHub.flatMap(row => row.duration_ms === null ? [] : [row.duration_ms])),
265
+ },
266
+ net_token_saving: netSaving,
267
+ net_token_saving_percent: savingPercent,
268
+ target_reached: withoutHub.length >= experiment.target_runs &&
269
+ withHub.length >= experiment.target_runs,
270
+ };
271
+ });
272
+ const warnings = [];
273
+ if (reports.length === 0) {
274
+ warnings.push('No usage reports recorded for this experiment yet.');
275
+ }
276
+ for (const cohort of summaries) {
277
+ if (cohort.without_hub.runs === 0 || cohort.with_hub.runs === 0) {
278
+ const missing = cohort.without_hub.runs === 0 ? 'without_hub' : 'with_hub';
279
+ warnings.push(`Cohort ${cohort.measurement}/${cohort.model ?? 'any'}/${cohort.client ?? 'any'} ` +
280
+ `has no "${missing}" runs — savings are not comparable until both variants are recorded.`);
281
+ }
282
+ }
283
+ return jsonContent({
284
+ experiment,
285
+ total_reports: reports.length,
286
+ cohorts: summaries,
287
+ ...(warnings.length ? { warnings } : {}),
288
+ });
289
+ });
290
+ }
291
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/tools/telemetry.ts"],"names":[],"mappings":"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"}