@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.
- package/dist/db/index.js +68 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/queries.js +658 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.sql +259 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/agents.js +68 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/correlation-audit.js +31 -0
- package/dist/routes/correlation-audit.js.map +1 -0
- package/dist/routes/events.js +81 -0
- package/dist/routes/events.js.map +1 -0
- package/dist/routes/files.js +24 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/parse-prd.js +38 -0
- package/dist/routes/parse-prd.js.map +1 -0
- package/dist/routes/projects.js +96 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/registry.js +88 -0
- package/dist/routes/registry.js.map +1 -0
- package/dist/routes/session-groups.js +182 -0
- package/dist/routes/session-groups.js.map +1 -0
- package/dist/routes/sessions.js +109 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/sprints.js +58 -0
- package/dist/routes/sprints.js.map +1 -0
- package/dist/routes/stats.js +63 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/stream.js +21 -0
- package/dist/routes/stream.js.map +1 -0
- package/dist/routes/tasks.js +198 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/services/correlation-engine.js +577 -0
- package/dist/services/correlation-engine.js.map +1 -0
- package/dist/services/event-processor.js +857 -0
- package/dist/services/event-processor.js.map +1 -0
- package/dist/services/prd-parser.js +142 -0
- package/dist/services/prd-parser.js.map +1 -0
- package/dist/services/project-manager.js +351 -0
- package/dist/services/project-manager.js.map +1 -0
- package/dist/services/project-router.js +56 -0
- package/dist/services/project-router.js.map +1 -0
- package/dist/services/session-manager.js +76 -0
- package/dist/services/session-manager.js.map +1 -0
- package/dist/services/sse-manager.js +115 -0
- package/dist/services/sse-manager.js.map +1 -0
- package/dist/services/string-similarity.js +256 -0
- package/dist/services/string-similarity.js.map +1 -0
- package/dist/services/task-completion.js +251 -0
- package/dist/services/task-completion.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { taskCompletionQueries, correlationAuditQueries, agentTaskBindingQueries, prdTaskQueries, projectQueries, sprintQueries, } from '../db/queries.js';
|
|
3
|
+
import { sseManager } from './sse-manager.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Configuration
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/** Minimum confidence score for auto-completion */
|
|
8
|
+
export const CONFIDENCE_THRESHOLD = 0.75;
|
|
9
|
+
/** Feature flag for auto-completion */
|
|
10
|
+
export const AUTO_COMPLETE_ENABLED = true;
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Core: Mark a single PRD task as completed
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Mark a PRD task as completed with audit logging.
|
|
16
|
+
* Returns false if the task was already completed, not found, or in a backlog sprint.
|
|
17
|
+
* Tasks in backlog sprints (order > 1) are protected from auto-completion.
|
|
18
|
+
* Use `force: true` to override backlog protection (for manual batch operations).
|
|
19
|
+
*/
|
|
20
|
+
export function markPrdTaskCompleted(taskId, reason, force = false) {
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
const task = prdTaskQueries.getById().get(taskId);
|
|
23
|
+
if (!task)
|
|
24
|
+
return false;
|
|
25
|
+
if (task.status === 'completed')
|
|
26
|
+
return false;
|
|
27
|
+
if (task.status === 'deferred' || task.status === 'backlog')
|
|
28
|
+
return false;
|
|
29
|
+
// Protect backlog sprint tasks from auto-completion
|
|
30
|
+
if (!force && task.sprint_id) {
|
|
31
|
+
const sprint = sprintQueries.getById().get(task.sprint_id);
|
|
32
|
+
if (sprint && sprint.order > 1) {
|
|
33
|
+
console.log(`[task-completion] Skipping backlog task "${task.title}" (sprint order=${sprint.order})`);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Update the task status
|
|
38
|
+
const result = taskCompletionQueries.completePrdTask().run(now, now, taskId);
|
|
39
|
+
if (result.changes === 0)
|
|
40
|
+
return false;
|
|
41
|
+
// Update sprint and project totals
|
|
42
|
+
if (task.sprint_id) {
|
|
43
|
+
updateSprintTotals(task.sprint_id);
|
|
44
|
+
}
|
|
45
|
+
updateProjectTotals(task.project_id);
|
|
46
|
+
// Log to correlation audit
|
|
47
|
+
try {
|
|
48
|
+
correlationAuditQueries.insert().run(randomUUID(), 'system', // event_id - system-generated
|
|
49
|
+
taskId, // prd_task_id
|
|
50
|
+
'system', // session_id
|
|
51
|
+
'system', // agent_id
|
|
52
|
+
'auto_complete', // layer
|
|
53
|
+
1.0, // score
|
|
54
|
+
1, // matched
|
|
55
|
+
reason, // reason
|
|
56
|
+
now);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Audit must never break the completion
|
|
60
|
+
}
|
|
61
|
+
// Broadcast SSE events
|
|
62
|
+
sseManager.broadcast('task_status_changed', {
|
|
63
|
+
taskId,
|
|
64
|
+
oldStatus: task.status,
|
|
65
|
+
newStatus: 'completed',
|
|
66
|
+
reason,
|
|
67
|
+
source: 'auto_complete',
|
|
68
|
+
});
|
|
69
|
+
const project = projectQueries.getById().get(task.project_id);
|
|
70
|
+
if (project) {
|
|
71
|
+
sseManager.broadcast('project_progress', {
|
|
72
|
+
projectId: project.id,
|
|
73
|
+
completedTasks: project.completed_tasks,
|
|
74
|
+
totalTasks: project.total_tasks,
|
|
75
|
+
percent: project.total_tasks > 0
|
|
76
|
+
? Math.round((project.completed_tasks / project.total_tasks) * 1000) / 10
|
|
77
|
+
: 0,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
console.log(`[task-completion] Auto-completed task "${task.title}" (${taskId}) - ${reason}`);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// Auto-complete tasks for a session (called on SessionEnd)
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
/**
|
|
87
|
+
* Check all agent_task_bindings for this session and auto-complete
|
|
88
|
+
* tasks with confidence >= CONFIDENCE_THRESHOLD.
|
|
89
|
+
*/
|
|
90
|
+
export function autoCompleteTasksForSession(sessionId) {
|
|
91
|
+
if (!AUTO_COMPLETE_ENABLED)
|
|
92
|
+
return [];
|
|
93
|
+
const results = [];
|
|
94
|
+
try {
|
|
95
|
+
const bindings = taskCompletionQueries.getHighConfidenceBindings().all(sessionId, CONFIDENCE_THRESHOLD);
|
|
96
|
+
// Deduplicate by task ID (pick highest confidence binding per task)
|
|
97
|
+
const taskBindingMap = new Map();
|
|
98
|
+
for (const binding of bindings) {
|
|
99
|
+
const existing = taskBindingMap.get(binding.prd_task_id);
|
|
100
|
+
if (!existing || binding.confidence > existing.confidence) {
|
|
101
|
+
taskBindingMap.set(binding.prd_task_id, binding);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const [, binding] of taskBindingMap) {
|
|
105
|
+
const reason = `Auto-completed on SessionEnd (session: ${sessionId}, agent: ${binding.agent_id}, confidence: ${(binding.confidence * 100).toFixed(0)}%)`;
|
|
106
|
+
const completed = markPrdTaskCompleted(binding.prd_task_id, reason);
|
|
107
|
+
// Expire the binding after completion attempt
|
|
108
|
+
const now = new Date().toISOString();
|
|
109
|
+
agentTaskBindingQueries.expireByTask().run(now, binding.prd_task_id);
|
|
110
|
+
results.push({
|
|
111
|
+
taskId: binding.prd_task_id,
|
|
112
|
+
taskTitle: binding.task_title,
|
|
113
|
+
confidence: binding.confidence,
|
|
114
|
+
agentId: binding.agent_id,
|
|
115
|
+
autoCompleted: completed,
|
|
116
|
+
reason,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (results.length > 0) {
|
|
120
|
+
const completedCount = results.filter(r => r.autoCompleted).length;
|
|
121
|
+
console.log(`[task-completion] SessionEnd ${sessionId}: auto-completed ${completedCount}/${results.length} tasks`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
console.error(`[task-completion] Error in autoCompleteTasksForSession:`, err);
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Auto-complete tasks for a specific agent (called on agent shutdown)
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/**
|
|
133
|
+
* Check agent_task_bindings for a specific agent and auto-complete
|
|
134
|
+
* tasks with confidence >= CONFIDENCE_THRESHOLD.
|
|
135
|
+
*/
|
|
136
|
+
export function autoCompleteTasksForAgent(agentId, sessionId) {
|
|
137
|
+
if (!AUTO_COMPLETE_ENABLED)
|
|
138
|
+
return [];
|
|
139
|
+
const results = [];
|
|
140
|
+
try {
|
|
141
|
+
const bindings = taskCompletionQueries.getHighConfidenceBindingsForAgent().all(agentId, sessionId, CONFIDENCE_THRESHOLD);
|
|
142
|
+
for (const binding of bindings) {
|
|
143
|
+
const reason = `Auto-completed on agent shutdown (agent: ${agentId}, session: ${sessionId}, confidence: ${(binding.confidence * 100).toFixed(0)}%)`;
|
|
144
|
+
const completed = markPrdTaskCompleted(binding.prd_task_id, reason);
|
|
145
|
+
// Expire the binding
|
|
146
|
+
const now = new Date().toISOString();
|
|
147
|
+
agentTaskBindingQueries.expireByTask().run(now, binding.prd_task_id);
|
|
148
|
+
results.push({
|
|
149
|
+
taskId: binding.prd_task_id,
|
|
150
|
+
taskTitle: binding.task_title,
|
|
151
|
+
confidence: binding.confidence,
|
|
152
|
+
agentId: binding.agent_id,
|
|
153
|
+
autoCompleted: completed,
|
|
154
|
+
reason,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (results.length > 0) {
|
|
158
|
+
const completedCount = results.filter(r => r.autoCompleted).length;
|
|
159
|
+
console.log(`[task-completion] Agent ${agentId} shutdown: auto-completed ${completedCount}/${results.length} tasks`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error(`[task-completion] Error in autoCompleteTasksForAgent:`, err);
|
|
164
|
+
}
|
|
165
|
+
return results;
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Totals recalculation
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
/** Recalculate completed_tasks count for a sprint from actual prd_tasks data */
|
|
171
|
+
export function updateSprintTotals(sprintId) {
|
|
172
|
+
try {
|
|
173
|
+
taskCompletionQueries.recalculateSprintTotals().run(sprintId, sprintId, sprintId);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
console.error(`[task-completion] Error recalculating sprint totals for ${sprintId}:`, err);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Recalculate completed_tasks and total_tasks for a project */
|
|
180
|
+
export function updateProjectTotals(projectId) {
|
|
181
|
+
try {
|
|
182
|
+
const now = new Date().toISOString();
|
|
183
|
+
taskCompletionQueries.recalculateProjectTotals().run(projectId, projectId, now, projectId);
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.error(`[task-completion] Error recalculating project totals for ${projectId}:`, err);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Batch completion
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
/**
|
|
193
|
+
* Batch-complete all tasks in a PRD section (e.g., "Sprint 8 - Project-First Architecture").
|
|
194
|
+
* Returns the count of tasks that were actually updated.
|
|
195
|
+
*/
|
|
196
|
+
export function batchCompleteBySection(prdSection, status) {
|
|
197
|
+
const tasks = taskCompletionQueries.getTasksBySection().all(prdSection);
|
|
198
|
+
let completedCount = 0;
|
|
199
|
+
for (const task of tasks) {
|
|
200
|
+
if (status && task.status !== status)
|
|
201
|
+
continue;
|
|
202
|
+
const reason = `Batch-completed by section: "${prdSection}"`;
|
|
203
|
+
if (markPrdTaskCompleted(task.id, reason, true)) {
|
|
204
|
+
completedCount++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (completedCount > 0) {
|
|
208
|
+
console.log(`[task-completion] Batch-completed ${completedCount} tasks in section "${prdSection}"`);
|
|
209
|
+
}
|
|
210
|
+
return completedCount;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Batch-complete tasks by IDs.
|
|
214
|
+
* Returns list of task IDs that were actually completed.
|
|
215
|
+
*/
|
|
216
|
+
export function batchCompleteByIds(taskIds, reason) {
|
|
217
|
+
const completed = [];
|
|
218
|
+
for (const taskId of taskIds) {
|
|
219
|
+
const completionReason = reason ?? `Batch-completed by ID`;
|
|
220
|
+
if (markPrdTaskCompleted(taskId, completionReason, true)) {
|
|
221
|
+
completed.push(taskId);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (completed.length > 0) {
|
|
225
|
+
console.log(`[task-completion] Batch-completed ${completed.length}/${taskIds.length} tasks by IDs`);
|
|
226
|
+
}
|
|
227
|
+
return completed;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get completion status summary for a project.
|
|
231
|
+
*/
|
|
232
|
+
export function getCompletionStatus(projectId) {
|
|
233
|
+
const stats = taskCompletionQueries.getCompletionStats().get(projectId, projectId);
|
|
234
|
+
const autoCompletedRow = taskCompletionQueries.getAutoCompletedCount().get(projectId);
|
|
235
|
+
const pendingRows = taskCompletionQueries.getPendingHighConfidenceTasks().all(CONFIDENCE_THRESHOLD);
|
|
236
|
+
// Filter to this project
|
|
237
|
+
const projectPending = pendingRows.filter(r => r.project_id === projectId);
|
|
238
|
+
return {
|
|
239
|
+
total: stats?.total ?? 0,
|
|
240
|
+
completed: stats?.completed ?? 0,
|
|
241
|
+
autoCompleted: autoCompletedRow?.count ?? 0,
|
|
242
|
+
pendingWithHighConfidence: projectPending.map(r => ({
|
|
243
|
+
taskId: r.id,
|
|
244
|
+
title: r.title,
|
|
245
|
+
status: r.status,
|
|
246
|
+
maxConfidence: r.max_confidence,
|
|
247
|
+
agentId: r.binding_agent_id,
|
|
248
|
+
})),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=task-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-completion.js","sourceRoot":"","sources":["../../src/services/task-completion.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@claudecam/server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Backend server for Claude Agent Monitor - Express + SQLite + REST API + SSE",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"better-sqlite3": "11.6.0",
|
|
20
|
+
"cors": "^2.8.5",
|
|
21
|
+
"express": "^4.21.0",
|
|
22
|
+
"uuid": "^11.0.0",
|
|
23
|
+
"@claudecam/shared": "0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
27
|
+
"@types/cors": "^2.8.17",
|
|
28
|
+
"@types/express": "^5.0.0",
|
|
29
|
+
"@types/express-serve-static-core": "^5.0.0",
|
|
30
|
+
"@types/uuid": "^10.0.0",
|
|
31
|
+
"tsx": "^4.19.0",
|
|
32
|
+
"typescript": "^5.7.0"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/pedropauloai/claude-agent-monitor.git",
|
|
37
|
+
"directory": "packages/server"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/pedropauloai/claude-agent-monitor",
|
|
40
|
+
"bugs": "https://github.com/pedropauloai/claude-agent-monitor/issues",
|
|
41
|
+
"keywords": [
|
|
42
|
+
"claude",
|
|
43
|
+
"agent",
|
|
44
|
+
"monitor",
|
|
45
|
+
"observability",
|
|
46
|
+
"claude-code"
|
|
47
|
+
],
|
|
48
|
+
"author": "CAM Contributors",
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc && node -e \"const fs=require('fs');const p=require('path');fs.mkdirSync(p.join('dist','db'),{recursive:true});fs.copyFileSync(p.join('src','db','schema.sql'),p.join('dist','db','schema.sql'));\"",
|
|
54
|
+
"dev": "tsx watch src/index.ts",
|
|
55
|
+
"start": "node dist/index.js",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"clean": "rm -rf dist"
|
|
58
|
+
}
|
|
59
|
+
}
|