@claudecam/server 0.1.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 (52) hide show
  1. package/dist/db/index.js +68 -0
  2. package/dist/db/index.js.map +1 -0
  3. package/dist/db/queries.js +658 -0
  4. package/dist/db/queries.js.map +1 -0
  5. package/dist/db/schema.sql +259 -0
  6. package/dist/index.js +128 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/routes/agents.js +68 -0
  9. package/dist/routes/agents.js.map +1 -0
  10. package/dist/routes/correlation-audit.js +31 -0
  11. package/dist/routes/correlation-audit.js.map +1 -0
  12. package/dist/routes/events.js +81 -0
  13. package/dist/routes/events.js.map +1 -0
  14. package/dist/routes/files.js +24 -0
  15. package/dist/routes/files.js.map +1 -0
  16. package/dist/routes/parse-prd.js +38 -0
  17. package/dist/routes/parse-prd.js.map +1 -0
  18. package/dist/routes/projects.js +96 -0
  19. package/dist/routes/projects.js.map +1 -0
  20. package/dist/routes/registry.js +88 -0
  21. package/dist/routes/registry.js.map +1 -0
  22. package/dist/routes/session-groups.js +182 -0
  23. package/dist/routes/session-groups.js.map +1 -0
  24. package/dist/routes/sessions.js +109 -0
  25. package/dist/routes/sessions.js.map +1 -0
  26. package/dist/routes/sprints.js +58 -0
  27. package/dist/routes/sprints.js.map +1 -0
  28. package/dist/routes/stats.js +63 -0
  29. package/dist/routes/stats.js.map +1 -0
  30. package/dist/routes/stream.js +21 -0
  31. package/dist/routes/stream.js.map +1 -0
  32. package/dist/routes/tasks.js +198 -0
  33. package/dist/routes/tasks.js.map +1 -0
  34. package/dist/services/correlation-engine.js +577 -0
  35. package/dist/services/correlation-engine.js.map +1 -0
  36. package/dist/services/event-processor.js +857 -0
  37. package/dist/services/event-processor.js.map +1 -0
  38. package/dist/services/prd-parser.js +142 -0
  39. package/dist/services/prd-parser.js.map +1 -0
  40. package/dist/services/project-manager.js +351 -0
  41. package/dist/services/project-manager.js.map +1 -0
  42. package/dist/services/project-router.js +56 -0
  43. package/dist/services/project-router.js.map +1 -0
  44. package/dist/services/session-manager.js +76 -0
  45. package/dist/services/session-manager.js.map +1 -0
  46. package/dist/services/sse-manager.js +115 -0
  47. package/dist/services/sse-manager.js.map +1 -0
  48. package/dist/services/string-similarity.js +256 -0
  49. package/dist/services/string-similarity.js.map +1 -0
  50. package/dist/services/task-completion.js +251 -0
  51. package/dist/services/task-completion.js.map +1 -0
  52. package/package.json +59 -0
@@ -0,0 +1,658 @@
1
+ import { getDb } from "./index.js";
2
+ function db() {
3
+ return getDb();
4
+ }
5
+ // === Sessions ===
6
+ export const sessionQueries = {
7
+ insert() {
8
+ return db().prepare(`
9
+ INSERT INTO sessions (id, started_at, working_directory, status, agent_count, event_count, metadata)
10
+ VALUES (?, ?, ?, ?, ?, ?, ?)
11
+ `);
12
+ },
13
+ getById() {
14
+ return db().prepare(`SELECT * FROM sessions WHERE id = ?`);
15
+ },
16
+ getAll() {
17
+ return db().prepare(`
18
+ SELECT * FROM sessions
19
+ ORDER BY started_at DESC
20
+ LIMIT ? OFFSET ?
21
+ `);
22
+ },
23
+ getByStatus() {
24
+ return db().prepare(`
25
+ SELECT * FROM sessions
26
+ WHERE status = ?
27
+ ORDER BY started_at DESC
28
+ LIMIT ? OFFSET ?
29
+ `);
30
+ },
31
+ updateStatus() {
32
+ return db().prepare(`UPDATE sessions SET status = ?, ended_at = ? WHERE id = ?`);
33
+ },
34
+ incrementEventCount() {
35
+ return db().prepare(`UPDATE sessions SET event_count = event_count + 1 WHERE id = ?`);
36
+ },
37
+ updateAgentCount() {
38
+ return db().prepare(`UPDATE sessions SET agent_count = ? WHERE id = ?`);
39
+ },
40
+ updateMetadata() {
41
+ return db().prepare(`UPDATE sessions SET metadata = ? WHERE id = ?`);
42
+ },
43
+ getActiveStaleSessions() {
44
+ return db().prepare(`
45
+ SELECT s.id,
46
+ (SELECT MAX(e.timestamp) FROM events e WHERE e.session_id = s.id) as last_event_at
47
+ FROM sessions s
48
+ WHERE s.status = 'active'
49
+ AND NOT EXISTS (
50
+ SELECT 1 FROM events e
51
+ WHERE e.session_id = s.id AND e.timestamp > ?
52
+ )
53
+ AND s.started_at < ?
54
+ `);
55
+ },
56
+ getByProject() {
57
+ return db().prepare(`
58
+ SELECT s.* FROM sessions s
59
+ JOIN session_project_bindings spb ON s.id = spb.session_id
60
+ WHERE spb.project_id = ?
61
+ ORDER BY s.started_at DESC
62
+ LIMIT ? OFFSET ?
63
+ `);
64
+ },
65
+ deleteById() {
66
+ return db().prepare(`DELETE FROM sessions WHERE id = ?`);
67
+ },
68
+ };
69
+ // === Agents ===
70
+ export const agentQueries = {
71
+ upsert() {
72
+ return db().prepare(`
73
+ INSERT INTO agents (id, session_id, name, type, status, first_seen_at, last_activity_at, tool_call_count, error_count)
74
+ VALUES (?, ?, ?, ?, ?, ?, ?, 0, 0)
75
+ ON CONFLICT(id, session_id) DO UPDATE SET
76
+ last_activity_at = excluded.last_activity_at,
77
+ status = excluded.status
78
+ `);
79
+ },
80
+ getBySession() {
81
+ return db().prepare(`SELECT * FROM agents WHERE session_id = ? ORDER BY first_seen_at ASC`);
82
+ },
83
+ getActiveBySession() {
84
+ return db().prepare(`
85
+ SELECT * FROM agents
86
+ WHERE session_id = ?
87
+ AND (status = 'active' OR last_activity_at > ?)
88
+ ORDER BY
89
+ CASE WHEN status = 'active' THEN 0 ELSE 1 END,
90
+ last_activity_at DESC
91
+ `);
92
+ },
93
+ getById() {
94
+ return db().prepare(`SELECT * FROM agents WHERE id = ? AND session_id = ?`);
95
+ },
96
+ updateStatus() {
97
+ return db().prepare(`UPDATE agents SET status = ?, last_activity_at = ? WHERE id = ? AND session_id = ?`);
98
+ },
99
+ incrementToolCalls() {
100
+ return db().prepare(`
101
+ UPDATE agents SET tool_call_count = tool_call_count + 1, last_activity_at = ?
102
+ WHERE id = ? AND session_id = ?
103
+ `);
104
+ },
105
+ incrementErrors() {
106
+ return db().prepare(`
107
+ UPDATE agents SET error_count = error_count + 1, last_activity_at = ?
108
+ WHERE id = ? AND session_id = ?
109
+ `);
110
+ },
111
+ updateAgentName() {
112
+ return db().prepare(`UPDATE agents SET name = ? WHERE id = ? AND session_id = ?`);
113
+ },
114
+ updateCurrentTask() {
115
+ return db().prepare(`UPDATE agents SET current_task = ? WHERE id = ? AND session_id = ?`);
116
+ },
117
+ getActiveStale() {
118
+ return db().prepare(`
119
+ SELECT a.*, s.id as sess_id FROM agents a
120
+ JOIN sessions s ON a.session_id = s.id
121
+ WHERE a.status = 'active'
122
+ AND s.status = 'active'
123
+ AND a.last_activity_at < ?
124
+ `);
125
+ },
126
+ /** Find agents created recently whose name equals their ID, looks like a UUID, or has a placeholder name. */
127
+ getRecentUnnamed() {
128
+ return db().prepare(`
129
+ SELECT * FROM agents
130
+ WHERE (name = id
131
+ OR name GLOB '[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-*'
132
+ OR name GLOB 'agent-[0-9]*'
133
+ OR name = 'Subagent'
134
+ OR name GLOB 'Subagent #[0-9]*'
135
+ OR name = 'subagent')
136
+ AND first_seen_at > ?
137
+ ORDER BY first_seen_at DESC
138
+ `);
139
+ },
140
+ };
141
+ // === Events ===
142
+ export const eventQueries = {
143
+ insert() {
144
+ return db().prepare(`
145
+ INSERT INTO events (id, session_id, agent_id, timestamp, hook_type, category, tool, file_path, input, output, error, duration, metadata)
146
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
147
+ `);
148
+ },
149
+ getBySession() {
150
+ return db().prepare(`
151
+ SELECT * FROM events
152
+ WHERE session_id = ?
153
+ ORDER BY timestamp DESC
154
+ LIMIT ? OFFSET ?
155
+ `);
156
+ },
157
+ getBySessionAndCategory() {
158
+ return db().prepare(`
159
+ SELECT * FROM events
160
+ WHERE session_id = ? AND category = ?
161
+ ORDER BY timestamp DESC
162
+ LIMIT ? OFFSET ?
163
+ `);
164
+ },
165
+ getBySessionAndAgent() {
166
+ return db().prepare(`
167
+ SELECT * FROM events
168
+ WHERE session_id = ? AND agent_id = ?
169
+ ORDER BY timestamp DESC
170
+ LIMIT ? OFFSET ?
171
+ `);
172
+ },
173
+ getBySessionAndTool() {
174
+ return db().prepare(`
175
+ SELECT * FROM events
176
+ WHERE session_id = ? AND tool = ?
177
+ ORDER BY timestamp DESC
178
+ LIMIT ? OFFSET ?
179
+ `);
180
+ },
181
+ getBySessionSince() {
182
+ return db().prepare(`
183
+ SELECT * FROM events
184
+ WHERE session_id = ? AND timestamp > ?
185
+ ORDER BY timestamp DESC
186
+ LIMIT ? OFFSET ?
187
+ `);
188
+ },
189
+ getByAgentAndCategory() {
190
+ return db().prepare(`
191
+ SELECT * FROM events
192
+ WHERE session_id = ? AND agent_id = ? AND category = ?
193
+ ORDER BY timestamp DESC
194
+ LIMIT ? OFFSET ?
195
+ `);
196
+ },
197
+ countBySession() {
198
+ return db().prepare(`SELECT COUNT(*) as count FROM events WHERE session_id = ?`);
199
+ },
200
+ getToolBreakdown() {
201
+ return db().prepare(`
202
+ SELECT tool, COUNT(*) as count
203
+ FROM events
204
+ WHERE session_id = ? AND tool IS NOT NULL
205
+ GROUP BY tool
206
+ ORDER BY count DESC
207
+ `);
208
+ },
209
+ getAgentBreakdown() {
210
+ return db().prepare(`
211
+ SELECT agent_id, COUNT(*) as events, SUM(CASE WHEN category = 'error' THEN 1 ELSE 0 END) as errors
212
+ FROM events
213
+ WHERE session_id = ?
214
+ GROUP BY agent_id
215
+ `);
216
+ },
217
+ getTimeline() {
218
+ return db().prepare(`
219
+ SELECT strftime('%H:%M', timestamp) as minute, COUNT(*) as events
220
+ FROM events
221
+ WHERE session_id = ?
222
+ GROUP BY minute
223
+ ORDER BY minute ASC
224
+ `);
225
+ },
226
+ };
227
+ // === File Changes ===
228
+ export const fileChangeQueries = {
229
+ upsert() {
230
+ return db().prepare(`
231
+ INSERT INTO file_changes (file_path, session_id, agent_id, change_type, first_touched_at, last_touched_at, touch_count)
232
+ VALUES (?, ?, ?, ?, ?, ?, 1)
233
+ ON CONFLICT(file_path, session_id, agent_id) DO UPDATE SET
234
+ change_type = CASE
235
+ WHEN excluded.change_type IN ('created', 'modified') THEN excluded.change_type
236
+ ELSE file_changes.change_type
237
+ END,
238
+ last_touched_at = excluded.last_touched_at,
239
+ touch_count = file_changes.touch_count + 1
240
+ `);
241
+ },
242
+ getBySession() {
243
+ return db().prepare(`
244
+ SELECT * FROM file_changes
245
+ WHERE session_id = ?
246
+ ORDER BY last_touched_at DESC
247
+ `);
248
+ },
249
+ };
250
+ // === Task Items ===
251
+ export const taskItemQueries = {
252
+ upsert() {
253
+ return db().prepare(`
254
+ INSERT INTO task_items (id, session_id, subject, status, owner, created_at, updated_at)
255
+ VALUES (?, ?, ?, ?, ?, ?, ?)
256
+ ON CONFLICT(id) DO UPDATE SET
257
+ status = excluded.status,
258
+ owner = excluded.owner,
259
+ updated_at = excluded.updated_at
260
+ `);
261
+ },
262
+ getBySession() {
263
+ return db().prepare(`SELECT * FROM task_items WHERE session_id = ? ORDER BY created_at ASC`);
264
+ },
265
+ };
266
+ // === Project Registry (Sprint 8) ===
267
+ export const projectRegistryQueries = {
268
+ register() {
269
+ return db().prepare(`
270
+ INSERT OR REPLACE INTO project_registry (working_directory, project_id, registered_at, prd_path, hooks_installed)
271
+ VALUES (?, ?, datetime('now'), ?, ?)
272
+ `);
273
+ },
274
+ getByWorkingDir() {
275
+ return db().prepare(`
276
+ SELECT working_directory, project_id, registered_at, prd_path, hooks_installed
277
+ FROM project_registry WHERE working_directory = ?
278
+ `);
279
+ },
280
+ getByWorkingDirPrefix() {
281
+ return db().prepare(`
282
+ SELECT working_directory, project_id, registered_at, prd_path, hooks_installed
283
+ FROM project_registry WHERE ? LIKE working_directory || '%'
284
+ ORDER BY length(working_directory) DESC
285
+ LIMIT 1
286
+ `);
287
+ },
288
+ getByProject() {
289
+ return db().prepare(`
290
+ SELECT working_directory, project_id, registered_at, prd_path, hooks_installed
291
+ FROM project_registry WHERE project_id = ?
292
+ `);
293
+ },
294
+ getAll() {
295
+ return db().prepare(`
296
+ SELECT pr.working_directory, pr.project_id, pr.registered_at, pr.prd_path, pr.hooks_installed,
297
+ p.name as project_name, p.status as project_status
298
+ FROM project_registry pr
299
+ JOIN projects p ON pr.project_id = p.id
300
+ ORDER BY pr.registered_at DESC
301
+ `);
302
+ },
303
+ updateHooksInstalled() {
304
+ return db().prepare(`
305
+ UPDATE project_registry SET hooks_installed = ? WHERE working_directory = ?
306
+ `);
307
+ },
308
+ updatePrdPath() {
309
+ return db().prepare(`
310
+ UPDATE project_registry SET prd_path = ? WHERE working_directory = ?
311
+ `);
312
+ },
313
+ delete() {
314
+ return db().prepare(`
315
+ DELETE FROM project_registry WHERE working_directory = ?
316
+ `);
317
+ },
318
+ };
319
+ // === Projects ===
320
+ export const projectQueries = {
321
+ insert() {
322
+ return db().prepare(`
323
+ INSERT INTO projects (id, name, description, prd_source, prd_content, created_at, updated_at, status, total_tasks, completed_tasks, current_sprint_id, metadata)
324
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
325
+ `);
326
+ },
327
+ getById() {
328
+ return db().prepare(`SELECT * FROM projects WHERE id = ?`);
329
+ },
330
+ getAll() {
331
+ return db().prepare(`SELECT * FROM projects ORDER BY updated_at DESC`);
332
+ },
333
+ update() {
334
+ return db().prepare(`
335
+ UPDATE projects SET
336
+ name = COALESCE(?, name),
337
+ description = COALESCE(?, description),
338
+ status = COALESCE(?, status),
339
+ total_tasks = COALESCE(?, total_tasks),
340
+ completed_tasks = COALESCE(?, completed_tasks),
341
+ current_sprint_id = COALESCE(?, current_sprint_id),
342
+ updated_at = ?
343
+ WHERE id = ?
344
+ `);
345
+ },
346
+ updateTaskCounts() {
347
+ return db().prepare(`
348
+ UPDATE projects SET
349
+ total_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ?),
350
+ completed_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ? AND status = 'completed'),
351
+ updated_at = ?
352
+ WHERE id = ?
353
+ `);
354
+ },
355
+ deleteById() {
356
+ return db().prepare(`DELETE FROM projects WHERE id = ?`);
357
+ },
358
+ };
359
+ // === Sprints ===
360
+ export const sprintQueries = {
361
+ insert() {
362
+ return db().prepare(`
363
+ INSERT INTO sprints (id, project_id, name, description, "order", status, started_at, completed_at, total_tasks, completed_tasks, metadata)
364
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
365
+ `);
366
+ },
367
+ getByProject() {
368
+ return db().prepare(`SELECT * FROM sprints WHERE project_id = ? ORDER BY "order" ASC`);
369
+ },
370
+ getById() {
371
+ return db().prepare(`SELECT * FROM sprints WHERE id = ?`);
372
+ },
373
+ update() {
374
+ return db().prepare(`
375
+ UPDATE sprints SET
376
+ name = COALESCE(?, name),
377
+ description = COALESCE(?, description),
378
+ status = COALESCE(?, status),
379
+ started_at = COALESCE(?, started_at),
380
+ completed_at = COALESCE(?, completed_at),
381
+ total_tasks = COALESCE(?, total_tasks),
382
+ completed_tasks = COALESCE(?, completed_tasks)
383
+ WHERE id = ?
384
+ `);
385
+ },
386
+ updateTaskCounts() {
387
+ return db().prepare(`
388
+ UPDATE sprints SET
389
+ total_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE sprint_id = ?),
390
+ completed_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE sprint_id = ? AND status = 'completed')
391
+ WHERE id = ?
392
+ `);
393
+ },
394
+ getNextOrder() {
395
+ return db().prepare(`SELECT COALESCE(MAX("order"), 0) + 1 as next_order FROM sprints WHERE project_id = ?`);
396
+ },
397
+ deleteById() {
398
+ return db().prepare(`DELETE FROM sprints WHERE id = ?`);
399
+ },
400
+ };
401
+ // === PRD Tasks ===
402
+ export const prdTaskQueries = {
403
+ insert() {
404
+ return db().prepare(`
405
+ INSERT INTO prd_tasks (id, project_id, sprint_id, external_id, title, description, acceptance_criteria, status, priority, complexity, tags, depends_on, blocked_by, assigned_agent, started_at, completed_at, session_id, prd_section, prd_subsection, prd_line_start, prd_line_end, created_at, updated_at)
406
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
407
+ `);
408
+ },
409
+ getByProject() {
410
+ return db().prepare(`SELECT * FROM prd_tasks WHERE project_id = ? ORDER BY created_at ASC`);
411
+ },
412
+ getBySprint() {
413
+ return db().prepare(`SELECT * FROM prd_tasks WHERE sprint_id = ? ORDER BY created_at ASC`);
414
+ },
415
+ getByProjectAndStatus() {
416
+ return db().prepare(`SELECT * FROM prd_tasks WHERE project_id = ? AND status = ? ORDER BY created_at ASC`);
417
+ },
418
+ getByProjectAndAgent() {
419
+ return db().prepare(`SELECT * FROM prd_tasks WHERE project_id = ? AND assigned_agent = ? ORDER BY created_at ASC`);
420
+ },
421
+ getByProjectAndPriority() {
422
+ return db().prepare(`SELECT * FROM prd_tasks WHERE project_id = ? AND priority = ? ORDER BY created_at ASC`);
423
+ },
424
+ getById() {
425
+ return db().prepare(`SELECT * FROM prd_tasks WHERE id = ?`);
426
+ },
427
+ update() {
428
+ return db().prepare(`
429
+ UPDATE prd_tasks SET
430
+ status = COALESCE(?, status),
431
+ priority = COALESCE(?, priority),
432
+ assigned_agent = COALESCE(?, assigned_agent),
433
+ sprint_id = COALESCE(?, sprint_id),
434
+ external_id = COALESCE(?, external_id),
435
+ started_at = COALESCE(?, started_at),
436
+ completed_at = COALESCE(?, completed_at),
437
+ session_id = COALESCE(?, session_id),
438
+ updated_at = ?
439
+ WHERE id = ?
440
+ `);
441
+ },
442
+ getStatusSummary() {
443
+ return db().prepare(`
444
+ SELECT status, COUNT(*) as count
445
+ FROM prd_tasks
446
+ WHERE project_id = ?
447
+ GROUP BY status
448
+ `);
449
+ },
450
+ findByTitle() {
451
+ return db().prepare(`SELECT * FROM prd_tasks WHERE project_id = ? AND title LIKE ?`);
452
+ },
453
+ deleteById() {
454
+ return db().prepare(`DELETE FROM prd_tasks WHERE id = ?`);
455
+ },
456
+ };
457
+ // === Task Activities ===
458
+ export const taskActivityQueries = {
459
+ insert() {
460
+ return db().prepare(`
461
+ INSERT INTO task_activities (id, prd_task_id, event_id, session_id, agent_id, activity_type, timestamp, details)
462
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
463
+ `);
464
+ },
465
+ getByTask() {
466
+ return db().prepare(`
467
+ SELECT * FROM task_activities
468
+ WHERE prd_task_id = ?
469
+ ORDER BY timestamp DESC
470
+ `);
471
+ },
472
+ };
473
+ // === PRD Documents ===
474
+ export const prdDocumentQueries = {
475
+ insert() {
476
+ return db().prepare(`
477
+ INSERT INTO prd_documents (id, project_id, version, raw_content, sections, parsed_at, parse_method)
478
+ VALUES (?, ?, ?, ?, ?, ?, ?)
479
+ `);
480
+ },
481
+ getByProject() {
482
+ return db().prepare(`
483
+ SELECT * FROM prd_documents
484
+ WHERE project_id = ?
485
+ ORDER BY version DESC
486
+ LIMIT 1
487
+ `);
488
+ },
489
+ getLatestVersion() {
490
+ return db().prepare(`
491
+ SELECT COALESCE(MAX(version), 0) + 1 as next_version
492
+ FROM prd_documents WHERE project_id = ?
493
+ `);
494
+ },
495
+ };
496
+ // === Correlation Audit Log ===
497
+ export const correlationAuditQueries = {
498
+ insert() {
499
+ return db().prepare(`
500
+ INSERT INTO correlation_audit_log (id, event_id, prd_task_id, session_id, agent_id, layer, score, matched, reason, timestamp)
501
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
502
+ `);
503
+ },
504
+ getRecent() {
505
+ return db().prepare(`
506
+ SELECT cal.*, pt.title as task_title
507
+ FROM correlation_audit_log cal
508
+ LEFT JOIN prd_tasks pt ON cal.prd_task_id = pt.id
509
+ ORDER BY cal.timestamp DESC
510
+ LIMIT ? OFFSET ?
511
+ `);
512
+ },
513
+ getByEvent() {
514
+ return db().prepare(`
515
+ SELECT * FROM correlation_audit_log WHERE event_id = ? ORDER BY score DESC
516
+ `);
517
+ },
518
+ getByTask() {
519
+ return db().prepare(`
520
+ SELECT * FROM correlation_audit_log WHERE prd_task_id = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?
521
+ `);
522
+ },
523
+ };
524
+ // === Session-Project Bindings ===
525
+ export const sessionProjectBindingQueries = {
526
+ bind() {
527
+ return db().prepare(`
528
+ INSERT INTO session_project_bindings (session_id, project_id, bound_at)
529
+ VALUES (?, ?, ?)
530
+ ON CONFLICT(session_id) DO UPDATE SET project_id = excluded.project_id, bound_at = excluded.bound_at
531
+ `);
532
+ },
533
+ getBySession() {
534
+ return db().prepare(`SELECT * FROM session_project_bindings WHERE session_id = ?`);
535
+ },
536
+ getByProject() {
537
+ return db().prepare(`SELECT * FROM session_project_bindings WHERE project_id = ?`);
538
+ },
539
+ };
540
+ // === Task Completion Queries ===
541
+ export const taskCompletionQueries = {
542
+ getHighConfidenceBindings() {
543
+ return db().prepare(`
544
+ SELECT atb.*, pt.title as task_title, pt.status as task_status, pt.sprint_id, pt.project_id
545
+ FROM agent_task_bindings atb
546
+ JOIN prd_tasks pt ON atb.prd_task_id = pt.id
547
+ LEFT JOIN sprints s ON pt.sprint_id = s.id
548
+ WHERE atb.session_id = ? AND atb.confidence >= ? AND atb.expired_at IS NULL
549
+ AND pt.status != 'completed' AND pt.status != 'deferred' AND pt.status != 'backlog'
550
+ AND (s."order" = 1 OR s.id IS NULL)
551
+ ORDER BY atb.confidence DESC
552
+ `);
553
+ },
554
+ getHighConfidenceBindingsForAgent() {
555
+ return db().prepare(`
556
+ SELECT atb.*, pt.title as task_title, pt.status as task_status, pt.sprint_id, pt.project_id
557
+ FROM agent_task_bindings atb
558
+ JOIN prd_tasks pt ON atb.prd_task_id = pt.id
559
+ LEFT JOIN sprints s ON pt.sprint_id = s.id
560
+ WHERE atb.agent_id = ? AND atb.session_id = ? AND atb.confidence >= ? AND atb.expired_at IS NULL
561
+ AND pt.status != 'completed' AND pt.status != 'deferred' AND pt.status != 'backlog'
562
+ AND (s."order" = 1 OR s.id IS NULL)
563
+ ORDER BY atb.confidence DESC
564
+ `);
565
+ },
566
+ completePrdTask() {
567
+ return db().prepare(`
568
+ UPDATE prd_tasks SET status = 'completed', completed_at = ?, updated_at = ?
569
+ WHERE id = ? AND status != 'completed'
570
+ `);
571
+ },
572
+ recalculateSprintTotals() {
573
+ return db().prepare(`
574
+ UPDATE sprints SET
575
+ total_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE sprint_id = ?),
576
+ completed_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE sprint_id = ? AND status = 'completed')
577
+ WHERE id = ?
578
+ `);
579
+ },
580
+ recalculateProjectTotals() {
581
+ return db().prepare(`
582
+ UPDATE projects SET
583
+ total_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ?),
584
+ completed_tasks = (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ? AND status = 'completed'),
585
+ updated_at = ?
586
+ WHERE id = ?
587
+ `);
588
+ },
589
+ getPendingHighConfidenceTasks() {
590
+ return db().prepare(`
591
+ SELECT DISTINCT pt.*, MAX(atb.confidence) as max_confidence, atb.agent_id as binding_agent_id
592
+ FROM prd_tasks pt
593
+ JOIN agent_task_bindings atb ON pt.id = atb.prd_task_id
594
+ WHERE atb.confidence >= ? AND atb.expired_at IS NULL
595
+ AND pt.status != 'completed' AND pt.status != 'deferred'
596
+ GROUP BY pt.id
597
+ ORDER BY max_confidence DESC
598
+ `);
599
+ },
600
+ getCompletionStats() {
601
+ return db().prepare(`
602
+ SELECT
603
+ (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ?) as total,
604
+ (SELECT COUNT(*) FROM prd_tasks WHERE project_id = ? AND status = 'completed') as completed
605
+ `);
606
+ },
607
+ getAutoCompletedCount() {
608
+ return db().prepare(`
609
+ SELECT COUNT(DISTINCT cal.prd_task_id) as count
610
+ FROM correlation_audit_log cal
611
+ WHERE cal.layer = 'auto_complete' AND cal.matched = 1
612
+ AND cal.prd_task_id IN (SELECT id FROM prd_tasks WHERE project_id = ?)
613
+ `);
614
+ },
615
+ getTasksBySection() {
616
+ return db().prepare(`
617
+ SELECT * FROM prd_tasks WHERE prd_section LIKE ('%' || ? || '%') AND status != 'completed' AND status != 'deferred'
618
+ `);
619
+ },
620
+ getTasksByIds() {
621
+ // Note: caller must build the IN clause dynamically
622
+ return db().prepare(`SELECT * FROM prd_tasks WHERE id = ? AND status != 'completed'`);
623
+ },
624
+ };
625
+ // === Agent-Task Bindings ===
626
+ export const agentTaskBindingQueries = {
627
+ bind() {
628
+ return db().prepare(`
629
+ INSERT INTO agent_task_bindings (id, agent_id, session_id, prd_task_id, confidence, bound_at)
630
+ VALUES (?, ?, ?, ?, ?, ?)
631
+ `);
632
+ },
633
+ getActiveByAgent() {
634
+ return db().prepare(`
635
+ SELECT * FROM agent_task_bindings
636
+ WHERE agent_id = ? AND session_id = ? AND expired_at IS NULL
637
+ ORDER BY bound_at DESC LIMIT 1
638
+ `);
639
+ },
640
+ getActiveByTask() {
641
+ return db().prepare(`
642
+ SELECT * FROM agent_task_bindings
643
+ WHERE prd_task_id = ? AND expired_at IS NULL
644
+ `);
645
+ },
646
+ expire() {
647
+ return db().prepare(`
648
+ UPDATE agent_task_bindings SET expired_at = ?
649
+ WHERE agent_id = ? AND session_id = ? AND expired_at IS NULL
650
+ `);
651
+ },
652
+ expireByTask() {
653
+ return db().prepare(`
654
+ UPDATE agent_task_bindings SET expired_at = ? WHERE prd_task_id = ? AND expired_at IS NULL
655
+ `);
656
+ },
657
+ };
658
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/db/queries.ts"],"names":[],"mappings":"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"}