agent-tasks 1.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/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +37 -0
- package/dist/context.js.map +1 -0
- package/dist/db.d.ts +10 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +112 -0
- package/dist/db.js.map +1 -0
- package/dist/domain/agent-bridge.d.ts +13 -0
- package/dist/domain/agent-bridge.d.ts.map +1 -0
- package/dist/domain/agent-bridge.js +99 -0
- package/dist/domain/agent-bridge.js.map +1 -0
- package/dist/domain/approvals.d.ts +18 -0
- package/dist/domain/approvals.d.ts.map +1 -0
- package/dist/domain/approvals.js +89 -0
- package/dist/domain/approvals.js.map +1 -0
- package/dist/domain/cleanup.d.ts +28 -0
- package/dist/domain/cleanup.d.ts.map +1 -0
- package/dist/domain/cleanup.js +68 -0
- package/dist/domain/cleanup.js.map +1 -0
- package/dist/domain/collaborators.d.ts +14 -0
- package/dist/domain/collaborators.d.ts.map +1 -0
- package/dist/domain/collaborators.js +59 -0
- package/dist/domain/collaborators.js.map +1 -0
- package/dist/domain/comments.d.ts +14 -0
- package/dist/domain/comments.d.ts.map +1 -0
- package/dist/domain/comments.js +63 -0
- package/dist/domain/comments.js.map +1 -0
- package/dist/domain/events.d.ts +9 -0
- package/dist/domain/events.d.ts.map +1 -0
- package/dist/domain/events.js +52 -0
- package/dist/domain/events.js.map +1 -0
- package/dist/domain/rules.d.ts +2 -0
- package/dist/domain/rules.d.ts.map +1 -0
- package/dist/domain/rules.js +67 -0
- package/dist/domain/rules.js.map +1 -0
- package/dist/domain/tasks.d.ts +60 -0
- package/dist/domain/tasks.d.ts.map +1 -0
- package/dist/domain/tasks.js +616 -0
- package/dist/domain/tasks.js.map +1 -0
- package/dist/domain/validate.d.ts +14 -0
- package/dist/domain/validate.d.ts.map +1 -0
- package/dist/domain/validate.js +29 -0
- package/dist/domain/validate.js.map +1 -0
- package/dist/event-bus.d.ts +10 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +38 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +95 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +7 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +11 -0
- package/dist/session.js.map +1 -0
- package/dist/storage/database.d.ts +15 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +215 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/tasks.d.ts +32 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +410 -0
- package/dist/tasks.js.map +1 -0
- package/dist/transport/mcp.d.ts +6 -0
- package/dist/transport/mcp.d.ts.map +1 -0
- package/dist/transport/mcp.js +573 -0
- package/dist/transport/mcp.js.map +1 -0
- package/dist/transport/rest.d.ts +4 -0
- package/dist/transport/rest.d.ts.map +1 -0
- package/dist/transport/rest.js +382 -0
- package/dist/transport/rest.js.map +1 -0
- package/dist/transport/ws.d.ts +10 -0
- package/dist/transport/ws.d.ts.map +1 -0
- package/dist/transport/ws.js +177 -0
- package/dist/transport/ws.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +35 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/app.js +648 -0
- package/dist/ui/index.html +82 -0
- package/dist/ui/morphdom.min.js +1 -0
- package/dist/ui/styles.css +805 -0
- package/package.json +78 -0
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// agent-tasks — Task domain service
|
|
3
|
+
//
|
|
4
|
+
// Core pipeline logic: CRUD, stage advancement, dependencies, artifacts.
|
|
5
|
+
// All mutations emit events. All inputs are validated.
|
|
6
|
+
// =============================================================================
|
|
7
|
+
import { NotFoundError, ConflictError, ValidationError } from '../types.js';
|
|
8
|
+
import { MAX_TITLE_LENGTH, MAX_DESCRIPTION_LENGTH, MAX_RESULT_LENGTH, MAX_ARTIFACT_CONTENT_LENGTH, MAX_ARTIFACT_NAME_LENGTH, MAX_PROJECT_NAME_LENGTH, MAX_TAG_LENGTH, MAX_TAGS_COUNT, MAX_STAGE_NAME_LENGTH, MAX_STAGES_COUNT, MAX_LIST_LIMIT, rejectNullBytes, rejectControlChars, } from './validate.js';
|
|
9
|
+
export const DEFAULT_STAGES = [
|
|
10
|
+
'backlog',
|
|
11
|
+
'spec',
|
|
12
|
+
'plan',
|
|
13
|
+
'implement',
|
|
14
|
+
'test',
|
|
15
|
+
'review',
|
|
16
|
+
'done',
|
|
17
|
+
'cancelled',
|
|
18
|
+
];
|
|
19
|
+
const VALID_STATUSES = [
|
|
20
|
+
'pending',
|
|
21
|
+
'in_progress',
|
|
22
|
+
'completed',
|
|
23
|
+
'failed',
|
|
24
|
+
'cancelled',
|
|
25
|
+
];
|
|
26
|
+
export class TaskService {
|
|
27
|
+
db;
|
|
28
|
+
events;
|
|
29
|
+
constructor(db, events) {
|
|
30
|
+
this.db = db;
|
|
31
|
+
this.events = events;
|
|
32
|
+
}
|
|
33
|
+
// ---- Pipeline Config ----
|
|
34
|
+
getPipelineStages(project) {
|
|
35
|
+
if (project) {
|
|
36
|
+
const config = this.db.queryOne('SELECT * FROM pipeline_config WHERE project = ?', [project]);
|
|
37
|
+
if (config) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(config.stages);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* fall through */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return [...DEFAULT_STAGES];
|
|
47
|
+
}
|
|
48
|
+
setPipelineConfig(project, stages) {
|
|
49
|
+
this.validateProjectName(project);
|
|
50
|
+
if (!stages.length)
|
|
51
|
+
throw new ValidationError('Stages array cannot be empty.');
|
|
52
|
+
if (stages.length > MAX_STAGES_COUNT) {
|
|
53
|
+
throw new ValidationError(`Too many stages (max ${MAX_STAGES_COUNT}).`);
|
|
54
|
+
}
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
for (const s of stages) {
|
|
57
|
+
if (s.length > MAX_STAGE_NAME_LENGTH) {
|
|
58
|
+
throw new ValidationError(`Stage name too long: "${s}" (max ${MAX_STAGE_NAME_LENGTH}).`);
|
|
59
|
+
}
|
|
60
|
+
rejectControlChars(s, 'stage name');
|
|
61
|
+
rejectNullBytes(s, 'stage name');
|
|
62
|
+
if (seen.has(s))
|
|
63
|
+
throw new ConflictError(`Duplicate stage: ${s}`);
|
|
64
|
+
seen.add(s);
|
|
65
|
+
}
|
|
66
|
+
const json = JSON.stringify(stages);
|
|
67
|
+
this.db.run(`INSERT INTO pipeline_config (project, stages, updated_at) VALUES (?, ?, datetime('now'))
|
|
68
|
+
ON CONFLICT(project) DO UPDATE SET stages = ?, updated_at = datetime('now')`, [project, json, json]);
|
|
69
|
+
this.events.emit('pipeline:configured', { project, stages });
|
|
70
|
+
return this.db.queryOne('SELECT * FROM pipeline_config WHERE project = ?', [
|
|
71
|
+
project,
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
// ---- CRUD ----
|
|
75
|
+
create(input, createdBy) {
|
|
76
|
+
this.validateTitle(input.title);
|
|
77
|
+
if (input.description !== undefined)
|
|
78
|
+
this.validateDescription(input.description);
|
|
79
|
+
if (input.project !== undefined)
|
|
80
|
+
this.validateProjectName(input.project);
|
|
81
|
+
if (input.tags !== undefined)
|
|
82
|
+
this.validateTags(input.tags);
|
|
83
|
+
if (input.assign_to !== undefined)
|
|
84
|
+
this.validateAssignee(input.assign_to);
|
|
85
|
+
if (input.parent_id !== undefined)
|
|
86
|
+
this.requireTask(input.parent_id);
|
|
87
|
+
const stages = this.getPipelineStages(input.project);
|
|
88
|
+
const effectiveStage = input.stage || stages[0];
|
|
89
|
+
this.validateStage(effectiveStage, stages);
|
|
90
|
+
const status = syncStatusForStage(effectiveStage, stages);
|
|
91
|
+
const result = this.db.run(`INSERT INTO tasks (title, description, created_by, assigned_to, status, stage, priority, project, tags, parent_id)
|
|
92
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
93
|
+
input.title.trim(),
|
|
94
|
+
input.description?.trim() ?? null,
|
|
95
|
+
createdBy,
|
|
96
|
+
input.assign_to ?? null,
|
|
97
|
+
status,
|
|
98
|
+
effectiveStage,
|
|
99
|
+
input.priority ?? 0,
|
|
100
|
+
input.project ?? null,
|
|
101
|
+
input.tags ? JSON.stringify(input.tags) : null,
|
|
102
|
+
input.parent_id ?? null,
|
|
103
|
+
]);
|
|
104
|
+
const task = this.getById(Number(result.lastInsertRowid));
|
|
105
|
+
this.events.emit('task:created', { task });
|
|
106
|
+
return task;
|
|
107
|
+
}
|
|
108
|
+
update(taskId, updates) {
|
|
109
|
+
const task = this.requireTask(taskId);
|
|
110
|
+
if (updates.title !== undefined)
|
|
111
|
+
this.validateTitle(updates.title);
|
|
112
|
+
if (updates.description !== undefined)
|
|
113
|
+
this.validateDescription(updates.description);
|
|
114
|
+
if (updates.project !== undefined)
|
|
115
|
+
this.validateProjectName(updates.project);
|
|
116
|
+
if (updates.tags !== undefined)
|
|
117
|
+
this.validateTags(updates.tags);
|
|
118
|
+
if (updates.assigned_to !== undefined && updates.assigned_to !== '') {
|
|
119
|
+
this.validateAssignee(updates.assigned_to);
|
|
120
|
+
}
|
|
121
|
+
const sets = [];
|
|
122
|
+
const params = [];
|
|
123
|
+
if (updates.title !== undefined) {
|
|
124
|
+
sets.push('title = ?');
|
|
125
|
+
params.push(updates.title.trim());
|
|
126
|
+
}
|
|
127
|
+
if (updates.description !== undefined) {
|
|
128
|
+
sets.push('description = ?');
|
|
129
|
+
params.push(updates.description.trim());
|
|
130
|
+
}
|
|
131
|
+
if (updates.priority !== undefined) {
|
|
132
|
+
sets.push('priority = ?');
|
|
133
|
+
params.push(updates.priority);
|
|
134
|
+
}
|
|
135
|
+
if (updates.project !== undefined) {
|
|
136
|
+
sets.push('project = ?');
|
|
137
|
+
params.push(updates.project);
|
|
138
|
+
}
|
|
139
|
+
if (updates.tags !== undefined) {
|
|
140
|
+
sets.push('tags = ?');
|
|
141
|
+
params.push(JSON.stringify(updates.tags));
|
|
142
|
+
}
|
|
143
|
+
if (updates.assigned_to !== undefined) {
|
|
144
|
+
sets.push('assigned_to = ?');
|
|
145
|
+
params.push(updates.assigned_to || null);
|
|
146
|
+
}
|
|
147
|
+
if (!sets.length)
|
|
148
|
+
throw new ValidationError('No fields to update.');
|
|
149
|
+
sets.push("updated_at = datetime('now')");
|
|
150
|
+
params.push(taskId);
|
|
151
|
+
this.db.run(`UPDATE tasks SET ${sets.join(', ')} WHERE id = ?`, params);
|
|
152
|
+
const updated = this.getById(taskId);
|
|
153
|
+
this.events.emit('task:updated', { task: updated, previous: task });
|
|
154
|
+
return updated;
|
|
155
|
+
}
|
|
156
|
+
list(filter = {}) {
|
|
157
|
+
if (filter.status && !VALID_STATUSES.includes(filter.status)) {
|
|
158
|
+
throw new ValidationError(`Invalid status: ${filter.status}. Valid: ${VALID_STATUSES.join(', ')}`);
|
|
159
|
+
}
|
|
160
|
+
let sql = 'SELECT DISTINCT t.* FROM tasks t';
|
|
161
|
+
const params = [];
|
|
162
|
+
if (filter.collaborator) {
|
|
163
|
+
sql += ' JOIN task_collaborators tc ON tc.task_id = t.id';
|
|
164
|
+
}
|
|
165
|
+
sql += ' WHERE 1=1';
|
|
166
|
+
if (filter.status) {
|
|
167
|
+
sql += ' AND t.status = ?';
|
|
168
|
+
params.push(filter.status);
|
|
169
|
+
}
|
|
170
|
+
if (filter.assigned_to) {
|
|
171
|
+
sql += ' AND t.assigned_to = ?';
|
|
172
|
+
params.push(filter.assigned_to);
|
|
173
|
+
}
|
|
174
|
+
if (filter.stage) {
|
|
175
|
+
sql += ' AND t.stage = ?';
|
|
176
|
+
params.push(filter.stage);
|
|
177
|
+
}
|
|
178
|
+
if (filter.project) {
|
|
179
|
+
sql += ' AND t.project = ?';
|
|
180
|
+
params.push(filter.project);
|
|
181
|
+
}
|
|
182
|
+
if (filter.parent_id !== undefined) {
|
|
183
|
+
sql += ' AND t.parent_id = ?';
|
|
184
|
+
params.push(filter.parent_id);
|
|
185
|
+
}
|
|
186
|
+
if (filter.root_only) {
|
|
187
|
+
sql += ' AND t.parent_id IS NULL';
|
|
188
|
+
}
|
|
189
|
+
if (filter.collaborator) {
|
|
190
|
+
sql += ' AND tc.agent_id = ?';
|
|
191
|
+
params.push(filter.collaborator);
|
|
192
|
+
}
|
|
193
|
+
sql += ' ORDER BY t.priority DESC, t.created_at DESC';
|
|
194
|
+
const limit = Math.min(filter.limit ?? MAX_LIST_LIMIT, MAX_LIST_LIMIT);
|
|
195
|
+
sql += ' LIMIT ?';
|
|
196
|
+
params.push(limit);
|
|
197
|
+
if (filter.offset && filter.offset > 0) {
|
|
198
|
+
sql += ' OFFSET ?';
|
|
199
|
+
params.push(filter.offset);
|
|
200
|
+
}
|
|
201
|
+
return this.db.queryAll(sql, params);
|
|
202
|
+
}
|
|
203
|
+
getById(id) {
|
|
204
|
+
return this.db.queryOne('SELECT * FROM tasks WHERE id = ?', [id]);
|
|
205
|
+
}
|
|
206
|
+
// ---- Claiming ----
|
|
207
|
+
claim(taskId, claimerName) {
|
|
208
|
+
this.validateAssignee(claimerName);
|
|
209
|
+
return this.db.transaction(() => {
|
|
210
|
+
const task = this.requireTask(taskId);
|
|
211
|
+
if (task.status !== 'pending') {
|
|
212
|
+
throw new ConflictError(`Task ${taskId} is not pending (status: ${task.status}).`);
|
|
213
|
+
}
|
|
214
|
+
const stages = this.getPipelineStages(task.project ?? undefined);
|
|
215
|
+
const firstStage = stages[0];
|
|
216
|
+
const nextStage = stages.length > 1 ? stages[1] : firstStage;
|
|
217
|
+
const newStage = task.stage === firstStage ? nextStage : task.stage;
|
|
218
|
+
const newStatus = syncStatusForStage(newStage, stages);
|
|
219
|
+
this.db.run(`UPDATE tasks SET status = ?, stage = ?, assigned_to = ?, updated_at = datetime('now') WHERE id = ?`, [newStatus, newStage, claimerName, taskId]);
|
|
220
|
+
const claimed = this.getById(taskId);
|
|
221
|
+
this.events.emit('task:claimed', { task: claimed, claimer: claimerName });
|
|
222
|
+
return claimed;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
// ---- Completion / Failure / Cancellation ----
|
|
226
|
+
complete(taskId, result) {
|
|
227
|
+
this.validateResult(result);
|
|
228
|
+
return this.db.transaction(() => {
|
|
229
|
+
const task = this.requireTask(taskId);
|
|
230
|
+
if (task.status !== 'in_progress') {
|
|
231
|
+
throw new ConflictError(`Task ${taskId} not in progress (status: ${task.status}).`);
|
|
232
|
+
}
|
|
233
|
+
const stages = this.getPipelineStages(task.project ?? undefined);
|
|
234
|
+
const doneStage = stages.filter((s) => s !== 'cancelled').pop() ?? 'done';
|
|
235
|
+
this.db.run(`UPDATE tasks SET status = 'completed', stage = ?, result = ?, updated_at = datetime('now') WHERE id = ?`, [doneStage, result, taskId]);
|
|
236
|
+
const completed = this.getById(taskId);
|
|
237
|
+
this.events.emit('task:completed', { task: completed });
|
|
238
|
+
return completed;
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
fail(taskId, result) {
|
|
242
|
+
this.validateResult(result);
|
|
243
|
+
const res = this.db.run(`UPDATE tasks SET status = 'failed', result = ?, updated_at = datetime('now') WHERE id = ? AND status = 'in_progress'`, [result, taskId]);
|
|
244
|
+
if (res.changes === 0) {
|
|
245
|
+
const task = this.getById(taskId);
|
|
246
|
+
if (!task)
|
|
247
|
+
throw new NotFoundError('Task', taskId);
|
|
248
|
+
throw new ConflictError(`Task ${taskId} not in progress (status: ${task.status}).`);
|
|
249
|
+
}
|
|
250
|
+
const failed = this.getById(taskId);
|
|
251
|
+
this.events.emit('task:failed', { task: failed });
|
|
252
|
+
return failed;
|
|
253
|
+
}
|
|
254
|
+
cancel(taskId, reason) {
|
|
255
|
+
this.validateResult(reason);
|
|
256
|
+
return this.db.transaction(() => {
|
|
257
|
+
const task = this.requireTask(taskId);
|
|
258
|
+
if (task.status === 'completed' || task.status === 'cancelled') {
|
|
259
|
+
throw new ConflictError(`Task ${taskId} is already ${task.status}.`);
|
|
260
|
+
}
|
|
261
|
+
this.db.run(`UPDATE tasks SET status = 'cancelled', stage = 'cancelled', result = ?, updated_at = datetime('now') WHERE id = ?`, [reason, taskId]);
|
|
262
|
+
const cancelled = this.getById(taskId);
|
|
263
|
+
this.events.emit('task:cancelled', { task: cancelled });
|
|
264
|
+
return cancelled;
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// ---- Pipeline Advancement ----
|
|
268
|
+
advance(taskId, toStage) {
|
|
269
|
+
return this.db.transaction(() => {
|
|
270
|
+
const task = this.requireTask(taskId);
|
|
271
|
+
if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {
|
|
272
|
+
throw new ConflictError(`Task ${taskId} is ${task.status} — cannot advance.`);
|
|
273
|
+
}
|
|
274
|
+
const stages = this.getPipelineStages(task.project ?? undefined);
|
|
275
|
+
const activeStages = stages.filter((s) => s !== 'cancelled');
|
|
276
|
+
const currentIdx = activeStages.indexOf(task.stage);
|
|
277
|
+
if (currentIdx === -1) {
|
|
278
|
+
throw new ValidationError(`Task stage '${task.stage}' not in pipeline.`);
|
|
279
|
+
}
|
|
280
|
+
let targetIdx;
|
|
281
|
+
if (toStage) {
|
|
282
|
+
if (toStage === 'cancelled') {
|
|
283
|
+
throw new ValidationError('Use task_cancel to cancel a task.');
|
|
284
|
+
}
|
|
285
|
+
targetIdx = activeStages.indexOf(toStage);
|
|
286
|
+
if (targetIdx === -1) {
|
|
287
|
+
throw new ValidationError(`Invalid target stage: ${toStage}. Valid: ${activeStages.join(', ')}`);
|
|
288
|
+
}
|
|
289
|
+
if (targetIdx <= currentIdx) {
|
|
290
|
+
throw new ValidationError(`Target stage '${toStage}' is not ahead of current stage '${task.stage}'. Use task_regress to move backward.`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
targetIdx = currentIdx + 1;
|
|
295
|
+
if (targetIdx >= activeStages.length) {
|
|
296
|
+
throw new ConflictError(`Task is already at the final stage: ${task.stage}.`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
this.checkDependencies(taskId);
|
|
300
|
+
const newStage = activeStages[targetIdx];
|
|
301
|
+
const newStatus = syncStatusForStage(newStage, activeStages);
|
|
302
|
+
this.db.run(`UPDATE tasks SET stage = ?, status = ?, updated_at = datetime('now') WHERE id = ?`, [newStage, newStatus, taskId]);
|
|
303
|
+
const advanced = this.getById(taskId);
|
|
304
|
+
this.events.emit('task:advanced', {
|
|
305
|
+
task: advanced,
|
|
306
|
+
from_stage: task.stage,
|
|
307
|
+
to_stage: newStage,
|
|
308
|
+
});
|
|
309
|
+
return advanced;
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
regress(taskId, toStage, reason) {
|
|
313
|
+
return this.db.transaction(() => {
|
|
314
|
+
const task = this.requireTask(taskId);
|
|
315
|
+
const stages = this.getPipelineStages(task.project ?? undefined);
|
|
316
|
+
const currentIdx = stages.indexOf(task.stage);
|
|
317
|
+
const targetIdx = stages.indexOf(toStage);
|
|
318
|
+
if (targetIdx === -1) {
|
|
319
|
+
throw new ValidationError(`Invalid target stage: ${toStage}. Valid: ${stages.join(', ')}`);
|
|
320
|
+
}
|
|
321
|
+
if (targetIdx >= currentIdx) {
|
|
322
|
+
throw new ValidationError(`Target stage '${toStage}' is not before current stage '${task.stage}'.`);
|
|
323
|
+
}
|
|
324
|
+
const newStatus = syncStatusForStage(toStage, stages);
|
|
325
|
+
this.db.run(`UPDATE tasks SET stage = ?, status = ?, updated_at = datetime('now') WHERE id = ?`, [toStage, newStatus, taskId]);
|
|
326
|
+
if (reason) {
|
|
327
|
+
this.validateResult(reason);
|
|
328
|
+
this.db.run(`INSERT INTO task_artifacts (task_id, stage, name, content, created_by) VALUES (?, ?, ?, ?, ?)`, [
|
|
329
|
+
taskId,
|
|
330
|
+
task.stage,
|
|
331
|
+
'rejection',
|
|
332
|
+
`Regressed from ${task.stage} to ${toStage}: ${reason}`,
|
|
333
|
+
'system',
|
|
334
|
+
]);
|
|
335
|
+
}
|
|
336
|
+
const regressed = this.getById(taskId);
|
|
337
|
+
this.events.emit('task:regressed', {
|
|
338
|
+
task: regressed,
|
|
339
|
+
from_stage: task.stage,
|
|
340
|
+
to_stage: toStage,
|
|
341
|
+
reason,
|
|
342
|
+
});
|
|
343
|
+
return regressed;
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// ---- Next Task ----
|
|
347
|
+
next(project, stage) {
|
|
348
|
+
let sql = `SELECT t.* FROM tasks t WHERE t.status IN ('pending', 'in_progress') AND t.assigned_to IS NULL`;
|
|
349
|
+
const params = [];
|
|
350
|
+
if (project) {
|
|
351
|
+
sql += ' AND t.project = ?';
|
|
352
|
+
params.push(project);
|
|
353
|
+
}
|
|
354
|
+
if (stage) {
|
|
355
|
+
sql += ' AND t.stage = ?';
|
|
356
|
+
params.push(stage);
|
|
357
|
+
}
|
|
358
|
+
sql += ` AND NOT EXISTS (
|
|
359
|
+
SELECT 1 FROM task_dependencies d
|
|
360
|
+
JOIN tasks dep ON dep.id = d.depends_on
|
|
361
|
+
WHERE d.task_id = t.id AND dep.stage NOT IN ('done', 'cancelled')
|
|
362
|
+
)`;
|
|
363
|
+
sql += ' ORDER BY t.priority DESC, t.created_at ASC LIMIT 1';
|
|
364
|
+
return this.db.queryOne(sql, params);
|
|
365
|
+
}
|
|
366
|
+
// ---- Dependencies ----
|
|
367
|
+
addDependency(taskId, dependsOn) {
|
|
368
|
+
if (taskId === dependsOn) {
|
|
369
|
+
throw new ValidationError('A task cannot depend on itself.');
|
|
370
|
+
}
|
|
371
|
+
this.requireTask(taskId);
|
|
372
|
+
this.requireTask(dependsOn);
|
|
373
|
+
if (this.wouldCreateCycle(taskId, dependsOn)) {
|
|
374
|
+
throw new ConflictError(`Adding dependency ${taskId} → ${dependsOn} would create a cycle.`);
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
this.db.run('INSERT INTO task_dependencies (task_id, depends_on) VALUES (?, ?)', [
|
|
378
|
+
taskId,
|
|
379
|
+
dependsOn,
|
|
380
|
+
]);
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
throw new ConflictError(`Dependency ${taskId} → ${dependsOn} already exists.`);
|
|
384
|
+
}
|
|
385
|
+
this.events.emit('dependency:added', { task_id: taskId, depends_on: dependsOn });
|
|
386
|
+
}
|
|
387
|
+
removeDependency(taskId, dependsOn) {
|
|
388
|
+
const result = this.db.run('DELETE FROM task_dependencies WHERE task_id = ? AND depends_on = ?', [taskId, dependsOn]);
|
|
389
|
+
if (result.changes === 0) {
|
|
390
|
+
throw new NotFoundError('Dependency', `${taskId} → ${dependsOn}`);
|
|
391
|
+
}
|
|
392
|
+
this.events.emit('dependency:removed', { task_id: taskId, depends_on: dependsOn });
|
|
393
|
+
}
|
|
394
|
+
getDependencies(taskId) {
|
|
395
|
+
return {
|
|
396
|
+
blockers: this.db.queryAll('SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.depends_on WHERE d.task_id = ?', [taskId]),
|
|
397
|
+
blocking: this.db.queryAll('SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.task_id WHERE d.depends_on = ?', [taskId]),
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
getAllDependencies() {
|
|
401
|
+
return this.db.queryAll('SELECT * FROM task_dependencies');
|
|
402
|
+
}
|
|
403
|
+
// ---- Artifacts ----
|
|
404
|
+
addArtifact(taskId, name, content, createdBy, stage) {
|
|
405
|
+
const task = this.requireTask(taskId);
|
|
406
|
+
this.validateArtifactName(name);
|
|
407
|
+
this.validateArtifactContent(content);
|
|
408
|
+
const effectiveStage = stage && stage !== '_current_' ? stage : task.stage;
|
|
409
|
+
const existing = this.db.queryOne('SELECT * FROM task_artifacts WHERE task_id = ? AND stage = ? AND name = ? ORDER BY version DESC LIMIT 1', [taskId, effectiveStage, name]);
|
|
410
|
+
const version = existing ? existing.version + 1 : 1;
|
|
411
|
+
const previousId = existing?.id ?? null;
|
|
412
|
+
const result = this.db.run(`INSERT INTO task_artifacts (task_id, stage, name, content, created_by, version, previous_id) VALUES (?, ?, ?, ?, ?, ?, ?)`, [taskId, effectiveStage, name, content, createdBy, version, previousId]);
|
|
413
|
+
const artifact = this.db.queryOne('SELECT * FROM task_artifacts WHERE id = ?', [
|
|
414
|
+
Number(result.lastInsertRowid),
|
|
415
|
+
]);
|
|
416
|
+
this.events.emit('artifact:created', { artifact });
|
|
417
|
+
return artifact;
|
|
418
|
+
}
|
|
419
|
+
getArtifacts(taskId, stage) {
|
|
420
|
+
this.requireTask(taskId);
|
|
421
|
+
if (stage) {
|
|
422
|
+
return this.db.queryAll('SELECT * FROM task_artifacts WHERE task_id = ? AND stage = ? ORDER BY created_at ASC', [taskId, stage]);
|
|
423
|
+
}
|
|
424
|
+
return this.db.queryAll('SELECT * FROM task_artifacts WHERE task_id = ? ORDER BY created_at ASC', [taskId]);
|
|
425
|
+
}
|
|
426
|
+
getArtifactCounts() {
|
|
427
|
+
const rows = this.db.queryAll('SELECT task_id, COUNT(*) as cnt FROM task_artifacts GROUP BY task_id');
|
|
428
|
+
const counts = {};
|
|
429
|
+
for (const r of rows)
|
|
430
|
+
counts[r.task_id] = r.cnt;
|
|
431
|
+
return counts;
|
|
432
|
+
}
|
|
433
|
+
// ---- Subtasks ----
|
|
434
|
+
getSubtasks(taskId) {
|
|
435
|
+
this.requireTask(taskId);
|
|
436
|
+
return this.db.queryAll('SELECT * FROM tasks WHERE parent_id = ? ORDER BY priority DESC, created_at ASC', [taskId]);
|
|
437
|
+
}
|
|
438
|
+
getSubtaskProgress(taskId) {
|
|
439
|
+
const rows = this.db.queryAll(`SELECT status, COUNT(*) as cnt FROM tasks WHERE parent_id = ? GROUP BY status`, [taskId]);
|
|
440
|
+
let total = 0;
|
|
441
|
+
let done = 0;
|
|
442
|
+
for (const r of rows) {
|
|
443
|
+
total += r.cnt;
|
|
444
|
+
if (r.status === 'completed')
|
|
445
|
+
done += r.cnt;
|
|
446
|
+
}
|
|
447
|
+
return { total, done };
|
|
448
|
+
}
|
|
449
|
+
getAllSubtaskProgress() {
|
|
450
|
+
const rows = this.db.queryAll(`SELECT parent_id, status, COUNT(*) as cnt FROM tasks WHERE parent_id IS NOT NULL GROUP BY parent_id, status`);
|
|
451
|
+
const progress = {};
|
|
452
|
+
for (const r of rows) {
|
|
453
|
+
if (!progress[r.parent_id])
|
|
454
|
+
progress[r.parent_id] = { total: 0, done: 0 };
|
|
455
|
+
progress[r.parent_id].total += r.cnt;
|
|
456
|
+
if (r.status === 'completed')
|
|
457
|
+
progress[r.parent_id].done += r.cnt;
|
|
458
|
+
}
|
|
459
|
+
return progress;
|
|
460
|
+
}
|
|
461
|
+
// ---- Search ----
|
|
462
|
+
search(query, options) {
|
|
463
|
+
if (!query.trim())
|
|
464
|
+
return [];
|
|
465
|
+
const sanitized = this.sanitizeFtsQuery(query);
|
|
466
|
+
if (!sanitized)
|
|
467
|
+
return [];
|
|
468
|
+
let sql = `
|
|
469
|
+
SELECT t.*, snippet(tasks_fts, 0, '<mark>', '</mark>', '...', 32) as snippet,
|
|
470
|
+
rank
|
|
471
|
+
FROM tasks_fts
|
|
472
|
+
JOIN tasks t ON t.id = tasks_fts.rowid
|
|
473
|
+
WHERE tasks_fts MATCH ?`;
|
|
474
|
+
const params = [sanitized];
|
|
475
|
+
if (options?.project) {
|
|
476
|
+
sql += ' AND t.project = ?';
|
|
477
|
+
params.push(options.project);
|
|
478
|
+
}
|
|
479
|
+
sql += ' ORDER BY rank LIMIT ?';
|
|
480
|
+
params.push(Math.min(options?.limit ?? 50, 200));
|
|
481
|
+
const rows = this.db.queryAll(sql, params);
|
|
482
|
+
return rows.map((r) => ({
|
|
483
|
+
task: r,
|
|
484
|
+
snippet: r.snippet,
|
|
485
|
+
rank: r.rank,
|
|
486
|
+
}));
|
|
487
|
+
}
|
|
488
|
+
sanitizeFtsQuery(query) {
|
|
489
|
+
const cleaned = query
|
|
490
|
+
.replace(/["*^{}[\]:()\\/]/g, '')
|
|
491
|
+
.replace(/\b(AND|OR|NOT|NEAR)\b/gi, '')
|
|
492
|
+
.trim();
|
|
493
|
+
if (!cleaned)
|
|
494
|
+
return '';
|
|
495
|
+
return cleaned
|
|
496
|
+
.split(/\s+/)
|
|
497
|
+
.filter((w) => w.length > 0)
|
|
498
|
+
.map((w) => `"${w}"`)
|
|
499
|
+
.join(' ');
|
|
500
|
+
}
|
|
501
|
+
// ---- Delete ----
|
|
502
|
+
delete(taskId) {
|
|
503
|
+
const task = this.requireTask(taskId);
|
|
504
|
+
this.db.run('DELETE FROM tasks WHERE id = ?', [taskId]);
|
|
505
|
+
this.events.emit('task:deleted', { task });
|
|
506
|
+
}
|
|
507
|
+
// ---- Internal ----
|
|
508
|
+
requireTask(id) {
|
|
509
|
+
const task = this.getById(id);
|
|
510
|
+
if (!task)
|
|
511
|
+
throw new NotFoundError('Task', id);
|
|
512
|
+
return task;
|
|
513
|
+
}
|
|
514
|
+
validateStage(stage, stages) {
|
|
515
|
+
if (!stages.includes(stage)) {
|
|
516
|
+
throw new ValidationError(`Invalid stage: ${stage}. Valid: ${stages.join(', ')}`);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
validateTitle(title) {
|
|
520
|
+
rejectNullBytes(title, 'title');
|
|
521
|
+
rejectControlChars(title, 'title');
|
|
522
|
+
const trimmed = title.trim();
|
|
523
|
+
if (!trimmed)
|
|
524
|
+
throw new ValidationError('Title must not be empty.');
|
|
525
|
+
if (trimmed.length > MAX_TITLE_LENGTH) {
|
|
526
|
+
throw new ValidationError(`Title too long (max ${MAX_TITLE_LENGTH} chars).`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
validateDescription(desc) {
|
|
530
|
+
rejectNullBytes(desc, 'description');
|
|
531
|
+
if (desc.length > MAX_DESCRIPTION_LENGTH) {
|
|
532
|
+
throw new ValidationError(`Description too long (max ${MAX_DESCRIPTION_LENGTH} chars).`);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
validateResult(result) {
|
|
536
|
+
rejectNullBytes(result, 'result');
|
|
537
|
+
if (result.length > MAX_RESULT_LENGTH) {
|
|
538
|
+
throw new ValidationError(`Result too long (max ${MAX_RESULT_LENGTH} chars).`);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
validateProjectName(project) {
|
|
542
|
+
rejectNullBytes(project, 'project');
|
|
543
|
+
rejectControlChars(project, 'project');
|
|
544
|
+
if (project.length > MAX_PROJECT_NAME_LENGTH) {
|
|
545
|
+
throw new ValidationError(`Project name too long (max ${MAX_PROJECT_NAME_LENGTH} chars).`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
validateAssignee(name) {
|
|
549
|
+
rejectNullBytes(name, 'assign_to');
|
|
550
|
+
rejectControlChars(name, 'assign_to');
|
|
551
|
+
if (!name.trim())
|
|
552
|
+
throw new ValidationError('Assignee name must not be empty.');
|
|
553
|
+
}
|
|
554
|
+
validateTags(tags) {
|
|
555
|
+
if (tags.length > MAX_TAGS_COUNT) {
|
|
556
|
+
throw new ValidationError(`Too many tags (max ${MAX_TAGS_COUNT}).`);
|
|
557
|
+
}
|
|
558
|
+
for (const tag of tags) {
|
|
559
|
+
rejectNullBytes(tag, 'tag');
|
|
560
|
+
rejectControlChars(tag, 'tag');
|
|
561
|
+
if (tag.length > MAX_TAG_LENGTH) {
|
|
562
|
+
throw new ValidationError(`Tag too long: "${tag}" (max ${MAX_TAG_LENGTH} chars).`);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
validateArtifactName(name) {
|
|
567
|
+
rejectNullBytes(name, 'artifact name');
|
|
568
|
+
rejectControlChars(name, 'artifact name');
|
|
569
|
+
if (!name.trim())
|
|
570
|
+
throw new ValidationError('Artifact name must not be empty.');
|
|
571
|
+
if (name.length > MAX_ARTIFACT_NAME_LENGTH) {
|
|
572
|
+
throw new ValidationError(`Artifact name too long (max ${MAX_ARTIFACT_NAME_LENGTH} chars).`);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
validateArtifactContent(content) {
|
|
576
|
+
rejectNullBytes(content, 'artifact content');
|
|
577
|
+
if (content.length > MAX_ARTIFACT_CONTENT_LENGTH) {
|
|
578
|
+
throw new ValidationError(`Artifact content too long (max ${MAX_ARTIFACT_CONTENT_LENGTH} chars).`);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
checkDependencies(taskId) {
|
|
582
|
+
const blockers = this.db.queryAll(`SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.depends_on
|
|
583
|
+
WHERE d.task_id = ? AND t.stage NOT IN ('done', 'cancelled')`, [taskId]);
|
|
584
|
+
if (blockers.length > 0) {
|
|
585
|
+
const names = blockers.map((b) => `#${b.id} "${b.title}" (${b.stage})`).join(', ');
|
|
586
|
+
throw new ConflictError(`Blocked by incomplete dependencies: ${names}`);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
wouldCreateCycle(taskId, dependsOn) {
|
|
590
|
+
const visited = new Set();
|
|
591
|
+
const stack = [dependsOn];
|
|
592
|
+
while (stack.length) {
|
|
593
|
+
const current = stack.pop();
|
|
594
|
+
if (current === taskId)
|
|
595
|
+
return true;
|
|
596
|
+
if (visited.has(current))
|
|
597
|
+
continue;
|
|
598
|
+
visited.add(current);
|
|
599
|
+
const deps = this.db.queryAll('SELECT * FROM task_dependencies WHERE task_id = ?', [current]);
|
|
600
|
+
for (const d of deps)
|
|
601
|
+
stack.push(d.depends_on);
|
|
602
|
+
}
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
// ---- Helpers ----
|
|
607
|
+
function syncStatusForStage(stage, stages) {
|
|
608
|
+
if (stage === 'cancelled')
|
|
609
|
+
return 'cancelled';
|
|
610
|
+
if (stage === 'done')
|
|
611
|
+
return 'completed';
|
|
612
|
+
if (stage === stages[0])
|
|
613
|
+
return 'pending';
|
|
614
|
+
return 'in_progress';
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/domain/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const MAX_TITLE_LENGTH = 500;
|
|
2
|
+
export declare const MAX_DESCRIPTION_LENGTH = 50000;
|
|
3
|
+
export declare const MAX_RESULT_LENGTH = 50000;
|
|
4
|
+
export declare const MAX_ARTIFACT_CONTENT_LENGTH = 100000;
|
|
5
|
+
export declare const MAX_ARTIFACT_NAME_LENGTH = 128;
|
|
6
|
+
export declare const MAX_PROJECT_NAME_LENGTH = 128;
|
|
7
|
+
export declare const MAX_TAG_LENGTH = 64;
|
|
8
|
+
export declare const MAX_TAGS_COUNT = 20;
|
|
9
|
+
export declare const MAX_STAGE_NAME_LENGTH = 64;
|
|
10
|
+
export declare const MAX_STAGES_COUNT = 20;
|
|
11
|
+
export declare const MAX_LIST_LIMIT = 500;
|
|
12
|
+
export declare function rejectControlChars(value: string, field: string): void;
|
|
13
|
+
export declare function rejectNullBytes(value: string, field: string): void;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|