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,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerMemoryTools = registerMemoryTools;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../db/client.js");
6
+ const crypto_1 = require("crypto");
7
+ const memoryStatus = zod_1.z.enum(['active', 'superseded', 'stale', 'archived']);
8
+ const feedbackRating = zod_1.z.enum([
9
+ 'used',
10
+ 'not_used',
11
+ 'helpful',
12
+ 'irrelevant',
13
+ 'stale',
14
+ 'incorrect',
15
+ 'too_verbose',
16
+ ]);
17
+ function registerMemoryTools(server) {
18
+ server.registerTool('memory_write', {
19
+ description: 'Create or replace a named memory node (project-scoped, or global if no project_id).',
20
+ inputSchema: zod_1.z.object({
21
+ project_id: zod_1.z.string().optional().describe('omit for global'),
22
+ name: zod_1.z.string().describe('kebab-case slug'),
23
+ description: zod_1.z.string().describe('one-line summary'),
24
+ type: zod_1.z.enum(['user', 'feedback', 'project', 'reference', 'handoff', 'decision'])
25
+ .default('project'),
26
+ body: zod_1.z.string().describe('markdown body'),
27
+ tags: zod_1.z.array(zod_1.z.string()).optional(),
28
+ surface: zod_1.z.string().default('claude-code'),
29
+ agent_id: zod_1.z.string().optional(),
30
+ origin_session: zod_1.z.string().optional(),
31
+ status: memoryStatus.optional(),
32
+ importance: zod_1.z.number().int().min(0).max(100).optional(),
33
+ confidence: zod_1.z.number().int().min(0).max(100).optional(),
34
+ source_type: zod_1.z.string().optional(),
35
+ source_ref: zod_1.z.string().optional(),
36
+ valid_from: zod_1.z.string().optional(),
37
+ valid_until: zod_1.z.string().optional(),
38
+ supersedes_id: zod_1.z.string().optional().describe('id this record replaces'),
39
+ last_verified_at: zod_1.z.string().optional(),
40
+ }),
41
+ }, ({ project_id, name, description, type, body, tags, surface, agent_id, origin_session, status, importance, confidence, source_type, source_ref, valid_from, valid_until, supersedes_id, last_verified_at, }) => {
42
+ const db = (0, client_js_1.getDb)();
43
+ const tagsJson = tags ? JSON.stringify(tags) : null;
44
+ const now = new Date().toISOString();
45
+ if (agent_id && !db.prepare('SELECT 1 FROM agents WHERE id = ?').get(agent_id)) {
46
+ return { content: [{ type: 'text', text: `Agent "${agent_id}" not found.` }], isError: true };
47
+ }
48
+ if (supersedes_id && !db.prepare('SELECT 1 FROM memory_nodes WHERE id = ?').get(supersedes_id)) {
49
+ return {
50
+ content: [{ type: 'text', text: `Memory node "${supersedes_id}" not found.` }],
51
+ isError: true,
52
+ };
53
+ }
54
+ const existing = db.prepare('SELECT id FROM memory_nodes WHERE name = ? AND (project_id = ? OR (project_id IS NULL AND ? IS NULL))').get(name, project_id ?? null, project_id ?? null);
55
+ if (existing) {
56
+ if (supersedes_id === existing.id) {
57
+ return { content: [{ type: 'text', text: 'A memory cannot supersede itself.' }], isError: true };
58
+ }
59
+ db.transaction(() => {
60
+ db.prepare(`
61
+ UPDATE memory_nodes SET
62
+ description = ?, type = ?, body = ?, tags = ?,
63
+ surface = ?, created_by_agent = COALESCE(?, created_by_agent),
64
+ origin_session = ?, status = COALESCE(?, status),
65
+ importance = COALESCE(?, importance),
66
+ confidence = COALESCE(?, confidence),
67
+ source_type = COALESCE(?, source_type),
68
+ source_ref = COALESCE(?, source_ref),
69
+ valid_from = COALESCE(?, valid_from),
70
+ valid_until = COALESCE(?, valid_until),
71
+ supersedes_id = COALESCE(?, supersedes_id),
72
+ last_verified_at = COALESCE(?, last_verified_at),
73
+ updated_at = ?
74
+ WHERE id = ?
75
+ `).run(description, type, body, tagsJson, surface, agent_id ?? null, origin_session ?? null, status ?? null, importance ?? null, confidence ?? null, source_type ?? null, source_ref ?? null, valid_from ?? null, valid_until ?? null, supersedes_id ?? null, last_verified_at ?? null, now, existing.id);
76
+ if (supersedes_id) {
77
+ db.prepare("UPDATE memory_nodes SET status = 'superseded', updated_at = ? WHERE id = ?").run(now, supersedes_id);
78
+ }
79
+ })();
80
+ const row = db.prepare('SELECT * FROM memory_nodes WHERE id = ?').get(existing.id);
81
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
82
+ }
83
+ const id = (0, crypto_1.randomUUID)();
84
+ db.transaction(() => {
85
+ db.prepare(`
86
+ INSERT INTO memory_nodes
87
+ (
88
+ id, project_id, surface, name, description, type, body, tags,
89
+ origin_session, created_at, updated_at, created_by_agent,
90
+ status, importance, confidence, source_type, source_ref,
91
+ valid_from, valid_until, supersedes_id, last_verified_at
92
+ )
93
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
94
+ `).run(id, project_id ?? null, surface, name, description, type, body, tagsJson, origin_session ?? null, now, now, agent_id ?? null, status ?? 'active', importance ?? 50, confidence ?? 50, source_type ?? null, source_ref ?? null, valid_from ?? null, valid_until ?? null, supersedes_id ?? null, last_verified_at ?? null);
95
+ if (supersedes_id) {
96
+ db.prepare("UPDATE memory_nodes SET status = 'superseded', updated_at = ? WHERE id = ?").run(now, supersedes_id);
97
+ }
98
+ })();
99
+ const row = db.prepare('SELECT * FROM memory_nodes WHERE id = ?').get(id);
100
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
101
+ });
102
+ server.registerTool('memory_read', {
103
+ description: 'Read a single memory node by id or by project+name.',
104
+ inputSchema: zod_1.z.object({
105
+ id: zod_1.z.string().optional().describe('Memory node UUID'),
106
+ project_id: zod_1.z.string().optional(),
107
+ name: zod_1.z.string().optional().describe('Memory node name slug'),
108
+ }),
109
+ annotations: { readOnlyHint: true },
110
+ }, ({ id, project_id, name }) => {
111
+ const db = (0, client_js_1.getDb)();
112
+ let row;
113
+ if (id) {
114
+ row = db.prepare('SELECT * FROM memory_nodes WHERE id = ?').get(id);
115
+ }
116
+ else if (name) {
117
+ row = db.prepare(`SELECT * FROM memory_nodes
118
+ WHERE name = ? AND (project_id = ? OR project_id IS NULL)
119
+ ORDER BY CASE WHEN project_id = ? THEN 0 ELSE 1 END
120
+ LIMIT 1`).get(name, project_id ?? null, project_id ?? null);
121
+ }
122
+ if (!row)
123
+ return { content: [{ type: 'text', text: 'Memory node not found.' }], isError: true };
124
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
125
+ });
126
+ server.registerTool('memory_list', {
127
+ description: 'List all memory nodes for a project. Omit project_id for global memory. ' +
128
+ 'Returns name, description, type, surface, updated_at (not full body to save context).',
129
+ inputSchema: zod_1.z.object({
130
+ project_id: zod_1.z.string().optional().describe('Project id. Omit for global memory.'),
131
+ type: zod_1.z.enum(['user', 'feedback', 'project', 'reference', 'handoff', 'decision']).optional(),
132
+ status: memoryStatus.optional(),
133
+ include_body: zod_1.z.boolean().default(false).describe('Include full body in results (use sparingly)'),
134
+ }),
135
+ annotations: { readOnlyHint: true },
136
+ }, ({ project_id, type, status, include_body }) => {
137
+ const db = (0, client_js_1.getDb)();
138
+ const cols = include_body
139
+ ? '*'
140
+ : `id, project_id, surface, name, description, type, tags,
141
+ status, importance, confidence, source_type, source_ref,
142
+ valid_from, valid_until, supersedes_id, last_verified_at,
143
+ created_by_agent, updated_at`;
144
+ let sql = `SELECT ${cols} FROM memory_nodes WHERE 1=1`;
145
+ const params = [];
146
+ if (project_id !== undefined) {
147
+ sql += ' AND project_id = ?';
148
+ params.push(project_id);
149
+ }
150
+ else {
151
+ sql += ' AND project_id IS NULL';
152
+ }
153
+ if (type) {
154
+ sql += ' AND type = ?';
155
+ params.push(type);
156
+ }
157
+ if (status) {
158
+ sql += ' AND status = ?';
159
+ params.push(status);
160
+ }
161
+ sql += ' ORDER BY updated_at DESC';
162
+ const rows = db.prepare(sql).all(...params);
163
+ return { content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }] };
164
+ });
165
+ server.registerTool('memory_search', {
166
+ description: 'Full-text search across all memory nodes. Use to find anything known about a topic.',
167
+ inputSchema: zod_1.z.object({
168
+ query: zod_1.z.string().describe('Search terms'),
169
+ project_id: zod_1.z.string().optional().describe('Limit to a specific project. Omit to search all.'),
170
+ include_inactive: zod_1.z.boolean().default(false)
171
+ .describe('Include stale, superseded, archived, and expired records'),
172
+ limit: zod_1.z.number().int().min(1).max(50).default(10),
173
+ }),
174
+ annotations: { readOnlyHint: true },
175
+ }, ({ query, project_id, include_inactive, limit }) => {
176
+ const db = (0, client_js_1.getDb)();
177
+ let sql = `
178
+ SELECT m.id, m.project_id, m.surface, m.name, m.description, m.type, m.tags,
179
+ m.status, m.importance, m.confidence, m.source_type, m.source_ref,
180
+ m.updated_at,
181
+ snippet(memory_fts, 2, '[', ']', '...', 20) AS snippet
182
+ FROM memory_fts
183
+ JOIN memory_nodes m ON m.rowid = memory_fts.rowid
184
+ WHERE memory_fts MATCH ?
185
+ `;
186
+ const params = [query];
187
+ if (!include_inactive) {
188
+ sql += `
189
+ AND m.status = 'active'
190
+ AND (m.valid_from IS NULL OR m.valid_from <= ?)
191
+ AND (m.valid_until IS NULL OR m.valid_until >= ?)
192
+ `;
193
+ const now = new Date().toISOString();
194
+ params.push(now, now);
195
+ }
196
+ if (project_id) {
197
+ sql += ' AND m.project_id = ?';
198
+ params.push(project_id);
199
+ }
200
+ sql += ' ORDER BY rank LIMIT ?';
201
+ params.push(limit);
202
+ try {
203
+ const rows = db.prepare(sql).all(...params);
204
+ return { content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }] };
205
+ }
206
+ catch {
207
+ return {
208
+ content: [{
209
+ type: 'text',
210
+ text: `FTS5 could not parse the query ${JSON.stringify(query)}. ` +
211
+ 'Use plain words ("auth token"), quoted phrases ("\\"session log\\""), or prefix search ("bench*"). ' +
212
+ 'Characters like -, :, ( ) are FTS operators — wrap terms containing them in double quotes.',
213
+ }],
214
+ isError: true,
215
+ };
216
+ }
217
+ });
218
+ server.registerTool('memory_set_status', {
219
+ description: 'Mark a memory record active, superseded, stale, or archived.',
220
+ inputSchema: zod_1.z.object({
221
+ id: zod_1.z.string(),
222
+ status: memoryStatus,
223
+ last_verified_at: zod_1.z.string().optional(),
224
+ }),
225
+ }, ({ id, status, last_verified_at }) => {
226
+ const db = (0, client_js_1.getDb)();
227
+ const result = db.prepare(`
228
+ UPDATE memory_nodes SET
229
+ status = ?,
230
+ last_verified_at = COALESCE(?, last_verified_at),
231
+ updated_at = ?
232
+ WHERE id = ?
233
+ `).run(status, last_verified_at ?? null, new Date().toISOString(), id);
234
+ if (result.changes === 0) {
235
+ return { content: [{ type: 'text', text: `Memory node "${id}" not found.` }], isError: true };
236
+ }
237
+ const row = db.prepare('SELECT * FROM memory_nodes WHERE id = ?').get(id);
238
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
239
+ });
240
+ server.registerTool('memory_feedback', {
241
+ description: 'Record whether a memory was useful, irrelevant, stale, incorrect, or too verbose.',
242
+ inputSchema: zod_1.z.object({
243
+ memory_id: zod_1.z.string(),
244
+ agent_id: zod_1.z.string().optional(),
245
+ session_id: zod_1.z.string().optional(),
246
+ rating: feedbackRating,
247
+ notes: zod_1.z.string().optional(),
248
+ }),
249
+ }, ({ memory_id, agent_id, session_id, rating, notes }) => {
250
+ const db = (0, client_js_1.getDb)();
251
+ if (!db.prepare('SELECT 1 FROM memory_nodes WHERE id = ?').get(memory_id)) {
252
+ return {
253
+ content: [{ type: 'text', text: `Memory node "${memory_id}" not found.` }],
254
+ isError: true,
255
+ };
256
+ }
257
+ if (agent_id && !db.prepare('SELECT 1 FROM agents WHERE id = ?').get(agent_id)) {
258
+ return { content: [{ type: 'text', text: `Agent "${agent_id}" not found.` }], isError: true };
259
+ }
260
+ if (session_id && !db.prepare('SELECT 1 FROM sessions WHERE id = ?').get(session_id)) {
261
+ return { content: [{ type: 'text', text: `Session "${session_id}" not found.` }], isError: true };
262
+ }
263
+ const id = (0, crypto_1.randomUUID)();
264
+ db.prepare(`
265
+ INSERT INTO memory_feedback
266
+ (id, memory_id, agent_id, session_id, rating, notes, created_at)
267
+ VALUES (?, ?, ?, ?, ?, ?, ?)
268
+ `).run(id, memory_id, agent_id ?? null, session_id ?? null, rating, notes ?? null, new Date().toISOString());
269
+ const row = db.prepare('SELECT * FROM memory_feedback WHERE id = ?').get(id);
270
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
271
+ });
272
+ }
273
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerProjectTools(server: McpServer): void;
3
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8G5D"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerProjectTools = registerProjectTools;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../db/client.js");
6
+ function registerProjectTools(server) {
7
+ server.registerTool('project_list', {
8
+ description: 'List all known projects with their status, stack, and last update time.',
9
+ inputSchema: zod_1.z.object({
10
+ status: zod_1.z.enum(['active', 'paused', 'archived']).optional()
11
+ .describe('Filter by status. Omit to get all projects.'),
12
+ }),
13
+ annotations: { readOnlyHint: true },
14
+ }, ({ status }) => {
15
+ const db = (0, client_js_1.getDb)();
16
+ const rows = status
17
+ ? db.prepare('SELECT * FROM projects WHERE status = ? ORDER BY updated_at DESC').all(status)
18
+ : db.prepare('SELECT * FROM projects ORDER BY updated_at DESC').all();
19
+ return {
20
+ content: [{ type: 'text', text: JSON.stringify(rows, null, 2) }],
21
+ };
22
+ });
23
+ server.registerTool('project_get', {
24
+ description: 'Get full details for a single project by its id or name.',
25
+ inputSchema: zod_1.z.object({
26
+ id: zod_1.z.string().optional().describe('Project id (directory slug), e.g. "D--Projects-MyApp"'),
27
+ name: zod_1.z.string().optional().describe('Human name, e.g. "MyApp". Case-insensitive partial match.'),
28
+ }),
29
+ annotations: { readOnlyHint: true },
30
+ }, ({ id, name }) => {
31
+ const db = (0, client_js_1.getDb)();
32
+ let row;
33
+ if (id) {
34
+ row = db.prepare('SELECT * FROM projects WHERE id = ?').get(id);
35
+ }
36
+ else if (name) {
37
+ row = db.prepare("SELECT * FROM projects WHERE lower(name) LIKE lower('%' || ? || '%') LIMIT 1")
38
+ .get(name);
39
+ }
40
+ if (!row) {
41
+ return { content: [{ type: 'text', text: 'Project not found.' }], isError: true };
42
+ }
43
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
44
+ });
45
+ server.registerTool('project_upsert', {
46
+ description: 'Create or update a project record. Use to register a new project or update stack/description.',
47
+ inputSchema: zod_1.z.object({
48
+ id: zod_1.z.string().describe('Directory slug id, e.g. "D--Projects-MyApp"'),
49
+ name: zod_1.z.string().describe('Human-readable project name'),
50
+ root_path: zod_1.z.string().describe('Absolute path on disk, e.g. "D:\\\\Projects\\\\MyApp"'),
51
+ stack: zod_1.z.string().optional().describe('Tech stack description, e.g. "Laravel 12 + Nuxt 4 + MySQL"'),
52
+ description: zod_1.z.string().optional().describe('Short project description'),
53
+ status: zod_1.z.enum(['active', 'paused', 'archived']).optional(),
54
+ }),
55
+ }, ({ id, name, root_path, stack, description, status }) => {
56
+ const db = (0, client_js_1.getDb)();
57
+ const now = new Date().toISOString();
58
+ const existing = db.prepare('SELECT 1 FROM projects WHERE id = ?').get(id);
59
+ if (existing) {
60
+ db.prepare(`
61
+ UPDATE projects SET
62
+ name = ?, root_path = ?, stack = COALESCE(?, stack),
63
+ description = COALESCE(?, description), status = COALESCE(?, status),
64
+ updated_at = ?
65
+ WHERE id = ?
66
+ `).run(name, root_path, stack ?? null, description ?? null, status ?? null, now, id);
67
+ }
68
+ else {
69
+ db.prepare(`
70
+ INSERT INTO projects (id, name, root_path, stack, description, status, created_at, updated_at)
71
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
72
+ `).run(id, name, root_path, stack ?? null, description ?? null, status ?? 'active', now, now);
73
+ }
74
+ const row = db.prepare('SELECT * FROM projects WHERE id = ?').get(id);
75
+ return { content: [{ type: 'text', text: JSON.stringify(row, null, 2) }] };
76
+ });
77
+ server.registerTool('project_set_status', {
78
+ description: 'Quickly change project status to active, paused, or archived.',
79
+ inputSchema: zod_1.z.object({
80
+ id: zod_1.z.string().describe('Project id'),
81
+ status: zod_1.z.enum(['active', 'paused', 'archived']),
82
+ }),
83
+ }, ({ id, status }) => {
84
+ const db = (0, client_js_1.getDb)();
85
+ const result = db.prepare("UPDATE projects SET status = ?, updated_at = datetime('now') WHERE id = ?").run(status, id);
86
+ if (result.changes === 0) {
87
+ return { content: [{ type: 'text', text: `Project "${id}" not found.` }], isError: true };
88
+ }
89
+ return { content: [{ type: 'text', text: `Project "${id}" status set to "${status}".` }] };
90
+ });
91
+ }
92
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSessionTools(server: McpServer): void;
3
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6I5D"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerSessionTools = registerSessionTools;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../db/client.js");
6
+ const crypto_1 = require("crypto");
7
+ const AUTO_HANDOFF_PREFIX = 'auto-handoff';
8
+ function autoHandoffName(projectId) {
9
+ return projectId ? `${AUTO_HANDOFF_PREFIX}:${projectId}` : AUTO_HANDOFF_PREFIX;
10
+ }
11
+ function registerSessionTools(server) {
12
+ server.registerTool('session_log', {
13
+ description: 'Record a session summary at the end of significant agent work. ' +
14
+ 'On outcome "partial"/"blocked" (or when next_steps are given) the hub automatically ' +
15
+ 'writes a handoff memory so the next agent resumes without retelling; ' +
16
+ 'outcome "completed" retires that auto-handoff.',
17
+ inputSchema: zod_1.z.object({
18
+ project_id: zod_1.z.string().optional(),
19
+ agent_id: zod_1.z.string().optional(),
20
+ provider: zod_1.z.string().optional(),
21
+ model: zod_1.z.string().optional(),
22
+ client: zod_1.z.string().optional(),
23
+ client_session_id: zod_1.z.string().optional(),
24
+ surface: zod_1.z.string().default('claude-code'),
25
+ started_at: zod_1.z.string().describe('ISO datetime session started'),
26
+ summary: zod_1.z.string().describe('what was accomplished and decided'),
27
+ files_touched: zod_1.z.array(zod_1.z.string()).optional(),
28
+ commits_made: zod_1.z.array(zod_1.z.string()).optional(),
29
+ outcome: zod_1.z.enum(['completed', 'blocked', 'partial']).default('completed'),
30
+ next_steps: zod_1.z.array(zod_1.z.string()).optional()
31
+ .describe('concrete next actions for whichever agent continues this work'),
32
+ }),
33
+ }, ({ project_id, agent_id, provider, model, client, client_session_id, surface, started_at, summary, files_touched, commits_made, outcome, next_steps, }) => {
34
+ const db = (0, client_js_1.getDb)();
35
+ const id = (0, crypto_1.randomUUID)();
36
+ const now = new Date().toISOString();
37
+ let agent;
38
+ if (agent_id) {
39
+ agent = db.prepare('SELECT * FROM agents WHERE id = ?').get(agent_id);
40
+ if (!agent) {
41
+ return { content: [{ type: 'text', text: `Agent "${agent_id}" not found.` }], isError: true };
42
+ }
43
+ }
44
+ db.prepare(`
45
+ INSERT INTO sessions
46
+ (
47
+ id, project_id, surface, started_at, ended_at, summary,
48
+ files_touched, commits_made, outcome,
49
+ agent_id, provider, model, client, client_session_id
50
+ )
51
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
52
+ `).run(id, project_id ?? null, surface, started_at, now, summary, files_touched ? JSON.stringify(files_touched) : null, commits_made ? JSON.stringify(commits_made) : null, outcome, agent_id ?? null, provider ?? agent?.provider ?? null, model ?? agent?.model ?? null, client ?? agent?.client ?? surface, client_session_id ?? null);
53
+ const handoffName = autoHandoffName(project_id);
54
+ const existingHandoff = db.prepare(`
55
+ SELECT id FROM memory_nodes
56
+ WHERE name = ? AND (project_id IS ? OR project_id = ?) AND status = 'active'
57
+ `).get(handoffName, project_id ?? null, project_id ?? null);
58
+ let handoffNote = '';
59
+ const needsHandoff = outcome !== 'completed' || (next_steps?.length ?? 0) > 0;
60
+ if (needsHandoff) {
61
+ const who = agent?.display_name ?? agent_id ?? client ?? surface;
62
+ const bodyParts = [
63
+ `Outcome: ${outcome} (session ${id}, agent: ${who})`,
64
+ `Done: ${summary}`,
65
+ ];
66
+ if (next_steps?.length)
67
+ bodyParts.push(`Next steps:\n${next_steps.map(s => `- ${s}`).join('\n')}`);
68
+ if (files_touched?.length)
69
+ bodyParts.push(`Files touched: ${files_touched.join(', ')}`);
70
+ if (commits_made?.length)
71
+ bodyParts.push(`Commits: ${commits_made.join(', ')}`);
72
+ const body = bodyParts.join('\n\n');
73
+ const description = `Continue from ${who}: ${summary.slice(0, 200)}`;
74
+ if (existingHandoff) {
75
+ db.prepare(`
76
+ UPDATE memory_nodes
77
+ SET description = ?, body = ?, origin_session = ?, created_by_agent = ?,
78
+ source_type = 'session', source_ref = ?, updated_at = ?
79
+ WHERE id = ?
80
+ `).run(description, body, id, agent_id ?? null, id, now, existingHandoff.id);
81
+ handoffNote = ` Handoff memory updated ("${handoffName}").`;
82
+ }
83
+ else {
84
+ db.prepare(`
85
+ INSERT INTO memory_nodes
86
+ (id, project_id, surface, name, description, type, body,
87
+ origin_session, created_by_agent, status, importance, confidence,
88
+ source_type, source_ref, created_at, updated_at)
89
+ VALUES (?, ?, ?, ?, ?, 'handoff', ?, ?, ?, 'active', 90, 80, 'session', ?, ?, ?)
90
+ `).run((0, crypto_1.randomUUID)(), project_id ?? null, surface, handoffName, description, body, id, agent_id ?? null, id, now, now);
91
+ handoffNote = ` Handoff memory created ("${handoffName}").`;
92
+ }
93
+ }
94
+ else if (existingHandoff) {
95
+ db.prepare(`
96
+ UPDATE memory_nodes SET status = 'superseded', updated_at = ? WHERE id = ?
97
+ `).run(now, existingHandoff.id);
98
+ handoffNote = ` Work completed: auto-handoff "${handoffName}" retired.`;
99
+ }
100
+ const projectWarning = !project_id && needsHandoff
101
+ ? ' WARNING: no project_id — this handoff is global and will NOT surface in any' +
102
+ ' project resume. Re-log with project_id so the next agent finds it.'
103
+ : '';
104
+ return {
105
+ content: [{
106
+ type: 'text',
107
+ text: `Session logged with id "${id}".${handoffNote}${projectWarning}` +
108
+ ' Use memory_write for decisions/facts that should outlive this handoff.',
109
+ }],
110
+ };
111
+ });
112
+ }
113
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTaskTools(server: McpServer): void;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8WzD"}