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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/dist/context.d.ts +17 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +37 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/db.d.ts +10 -0
  8. package/dist/db.d.ts.map +1 -0
  9. package/dist/db.js +112 -0
  10. package/dist/db.js.map +1 -0
  11. package/dist/domain/agent-bridge.d.ts +13 -0
  12. package/dist/domain/agent-bridge.d.ts.map +1 -0
  13. package/dist/domain/agent-bridge.js +99 -0
  14. package/dist/domain/agent-bridge.js.map +1 -0
  15. package/dist/domain/approvals.d.ts +18 -0
  16. package/dist/domain/approvals.d.ts.map +1 -0
  17. package/dist/domain/approvals.js +89 -0
  18. package/dist/domain/approvals.js.map +1 -0
  19. package/dist/domain/cleanup.d.ts +28 -0
  20. package/dist/domain/cleanup.d.ts.map +1 -0
  21. package/dist/domain/cleanup.js +68 -0
  22. package/dist/domain/cleanup.js.map +1 -0
  23. package/dist/domain/collaborators.d.ts +14 -0
  24. package/dist/domain/collaborators.d.ts.map +1 -0
  25. package/dist/domain/collaborators.js +59 -0
  26. package/dist/domain/collaborators.js.map +1 -0
  27. package/dist/domain/comments.d.ts +14 -0
  28. package/dist/domain/comments.d.ts.map +1 -0
  29. package/dist/domain/comments.js +63 -0
  30. package/dist/domain/comments.js.map +1 -0
  31. package/dist/domain/events.d.ts +9 -0
  32. package/dist/domain/events.d.ts.map +1 -0
  33. package/dist/domain/events.js +52 -0
  34. package/dist/domain/events.js.map +1 -0
  35. package/dist/domain/rules.d.ts +2 -0
  36. package/dist/domain/rules.d.ts.map +1 -0
  37. package/dist/domain/rules.js +67 -0
  38. package/dist/domain/rules.js.map +1 -0
  39. package/dist/domain/tasks.d.ts +60 -0
  40. package/dist/domain/tasks.d.ts.map +1 -0
  41. package/dist/domain/tasks.js +616 -0
  42. package/dist/domain/tasks.js.map +1 -0
  43. package/dist/domain/validate.d.ts +14 -0
  44. package/dist/domain/validate.d.ts.map +1 -0
  45. package/dist/domain/validate.js +29 -0
  46. package/dist/domain/validate.js.map +1 -0
  47. package/dist/event-bus.d.ts +10 -0
  48. package/dist/event-bus.d.ts.map +1 -0
  49. package/dist/event-bus.js +38 -0
  50. package/dist/event-bus.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +121 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/server.d.ts +10 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +95 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/session.d.ts +7 -0
  60. package/dist/session.d.ts.map +1 -0
  61. package/dist/session.js +11 -0
  62. package/dist/session.js.map +1 -0
  63. package/dist/storage/database.d.ts +15 -0
  64. package/dist/storage/database.d.ts.map +1 -0
  65. package/dist/storage/database.js +215 -0
  66. package/dist/storage/database.js.map +1 -0
  67. package/dist/tasks.d.ts +32 -0
  68. package/dist/tasks.d.ts.map +1 -0
  69. package/dist/tasks.js +410 -0
  70. package/dist/tasks.js.map +1 -0
  71. package/dist/transport/mcp.d.ts +6 -0
  72. package/dist/transport/mcp.d.ts.map +1 -0
  73. package/dist/transport/mcp.js +573 -0
  74. package/dist/transport/mcp.js.map +1 -0
  75. package/dist/transport/rest.d.ts +4 -0
  76. package/dist/transport/rest.d.ts.map +1 -0
  77. package/dist/transport/rest.js +382 -0
  78. package/dist/transport/rest.js.map +1 -0
  79. package/dist/transport/ws.d.ts +10 -0
  80. package/dist/transport/ws.d.ts.map +1 -0
  81. package/dist/transport/ws.js +177 -0
  82. package/dist/transport/ws.js.map +1 -0
  83. package/dist/types.d.ts +146 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +35 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/ui/app.js +648 -0
  88. package/dist/ui/index.html +82 -0
  89. package/dist/ui/morphdom.min.js +1 -0
  90. package/dist/ui/styles.css +805 -0
  91. package/package.json +78 -0
@@ -0,0 +1,32 @@
1
+ import type { Task, TaskArtifact, TaskDependency, PipelineConfig } from './types.js';
2
+ export declare const DEFAULT_STAGES: string[];
3
+ export declare function getPipelineStages(project?: string): string[];
4
+ export declare function setPipelineConfig(project: string, stages: string[]): PipelineConfig;
5
+ export declare function createTask(title: string, description?: string, assignTo?: string, stage?: string, priority?: number, project?: string, tags?: string[]): Task;
6
+ export declare function updateTask(taskId: number, updates: {
7
+ title?: string;
8
+ description?: string;
9
+ priority?: number;
10
+ project?: string;
11
+ tags?: string[];
12
+ assigned_to?: string;
13
+ }): Task;
14
+ export declare function listTasks(status?: string, assignedTo?: string, stage?: string, project?: string, limit?: number, offset?: number): Task[];
15
+ export declare function claimTask(taskId: number, claimerName?: string): Task;
16
+ export declare function completeTask(taskId: number, result: string): Task;
17
+ export declare function failTask(taskId: number, result: string): Task;
18
+ export declare function cancelTask(taskId: number, reason: string): Task;
19
+ export declare function advanceTask(taskId: number, toStage?: string): Task;
20
+ export declare function regressTask(taskId: number, toStage: string, reason?: string): Task;
21
+ export declare function nextTask(project?: string, stage?: string): Task | null;
22
+ export declare function addDependency(taskId: number, dependsOn: number): void;
23
+ export declare function removeDependency(taskId: number, dependsOn: number): void;
24
+ export declare function getTaskDependencies(taskId: number): {
25
+ blockers: Task[];
26
+ blocking: Task[];
27
+ };
28
+ export declare function getAllDependencies(): TaskDependency[];
29
+ export declare function addArtifact(taskId: number, stage: string, name: string, content: string): TaskArtifact;
30
+ export declare function getArtifacts(taskId: number, stage?: string): TaskArtifact[];
31
+ export declare function getArtifactCounts(): Record<number, number>;
32
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
package/dist/tasks.js ADDED
@@ -0,0 +1,410 @@
1
+ import { queryAll, queryOne, run, transaction } from './db.js';
2
+ import { eventBus } from './event-bus.js';
3
+ import { getCurrentSession } from './session.js';
4
+ export const DEFAULT_STAGES = [
5
+ 'backlog',
6
+ 'spec',
7
+ 'plan',
8
+ 'implement',
9
+ 'test',
10
+ 'review',
11
+ 'done',
12
+ 'cancelled',
13
+ ];
14
+ const VALID_STATUSES = ['pending', 'in_progress', 'completed', 'failed', 'cancelled'];
15
+ // ---- Input Validation ----
16
+ function validateStage(stage, stages) {
17
+ if (!stages.includes(stage)) {
18
+ throw new Error(`Invalid stage: ${stage}. Valid: ${stages.join(', ')}`);
19
+ }
20
+ }
21
+ function validatePositiveInt(value, name) {
22
+ if (value !== undefined && (!Number.isInteger(value) || value < 0)) {
23
+ throw new Error(`${name} must be a non-negative integer.`);
24
+ }
25
+ }
26
+ // ---- Pipeline Config ----
27
+ export function getPipelineStages(project) {
28
+ if (project) {
29
+ const config = queryOne('SELECT * FROM pipeline_config WHERE project = ?', [
30
+ project,
31
+ ]);
32
+ if (config) {
33
+ try {
34
+ return JSON.parse(config.stages);
35
+ }
36
+ catch {
37
+ /* fall through */
38
+ }
39
+ }
40
+ }
41
+ return [...DEFAULT_STAGES];
42
+ }
43
+ export function setPipelineConfig(project, stages) {
44
+ if (!stages.length)
45
+ throw new Error('Stages array cannot be empty.');
46
+ const seen = new Set();
47
+ for (const s of stages) {
48
+ if (seen.has(s))
49
+ throw new Error(`Duplicate stage: ${s}`);
50
+ seen.add(s);
51
+ }
52
+ const json = JSON.stringify(stages);
53
+ run(`INSERT INTO pipeline_config (project, stages, updated_at) VALUES (?, ?, datetime('now'))
54
+ ON CONFLICT(project) DO UPDATE SET stages = ?, updated_at = datetime('now')`, [project, json, json]);
55
+ return queryOne('SELECT * FROM pipeline_config WHERE project = ?', [project]);
56
+ }
57
+ // ---- Stage/Status Sync ----
58
+ function syncStatusForStage(stage, stages) {
59
+ if (stage === 'cancelled')
60
+ return 'cancelled';
61
+ if (stage === 'done')
62
+ return 'completed';
63
+ if (stage === stages[0])
64
+ return 'pending';
65
+ return 'in_progress';
66
+ }
67
+ // ---- CRUD ----
68
+ export function createTask(title, description, assignTo, stage, priority, project, tags) {
69
+ const session = getCurrentSession();
70
+ const createdBy = session?.name || 'system';
71
+ const stages = getPipelineStages(project);
72
+ const effectiveStage = stage || stages[0];
73
+ validateStage(effectiveStage, stages);
74
+ const status = syncStatusForStage(effectiveStage, stages);
75
+ const result = run(`INSERT INTO tasks (title, description, created_by, assigned_to, status, stage, priority, project, tags)
76
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
77
+ title,
78
+ description ?? null,
79
+ createdBy,
80
+ assignTo ?? null,
81
+ status,
82
+ effectiveStage,
83
+ priority ?? 0,
84
+ project ?? null,
85
+ tags ? JSON.stringify(tags) : null,
86
+ ]);
87
+ eventBus.emit('task:create');
88
+ return getTask(Number(result.lastInsertRowid));
89
+ }
90
+ export function updateTask(taskId, updates) {
91
+ const task = getTask(taskId);
92
+ if (!task)
93
+ throw new Error(`Task ${taskId} not found.`);
94
+ const sets = [];
95
+ const params = [];
96
+ if (updates.title !== undefined) {
97
+ sets.push('title = ?');
98
+ params.push(updates.title);
99
+ }
100
+ if (updates.description !== undefined) {
101
+ sets.push('description = ?');
102
+ params.push(updates.description);
103
+ }
104
+ if (updates.priority !== undefined) {
105
+ sets.push('priority = ?');
106
+ params.push(updates.priority);
107
+ }
108
+ if (updates.project !== undefined) {
109
+ sets.push('project = ?');
110
+ params.push(updates.project);
111
+ }
112
+ if (updates.tags !== undefined) {
113
+ sets.push('tags = ?');
114
+ params.push(JSON.stringify(updates.tags));
115
+ }
116
+ if (updates.assigned_to !== undefined) {
117
+ sets.push('assigned_to = ?');
118
+ params.push(updates.assigned_to || null);
119
+ }
120
+ if (!sets.length)
121
+ throw new Error('No fields to update.');
122
+ sets.push("updated_at = datetime('now')");
123
+ params.push(taskId);
124
+ run(`UPDATE tasks SET ${sets.join(', ')} WHERE id = ?`, params);
125
+ eventBus.emit('task:update');
126
+ return getTask(taskId);
127
+ }
128
+ export function listTasks(status, assignedTo, stage, project, limit, offset) {
129
+ validatePositiveInt(limit, 'limit');
130
+ validatePositiveInt(offset, 'offset');
131
+ if (status && !VALID_STATUSES.includes(status)) {
132
+ throw new Error(`Invalid status: ${status}. Valid: ${VALID_STATUSES.join(', ')}`);
133
+ }
134
+ let sql = 'SELECT * FROM tasks WHERE 1=1';
135
+ const params = [];
136
+ if (status) {
137
+ sql += ' AND status = ?';
138
+ params.push(status);
139
+ }
140
+ if (assignedTo) {
141
+ sql += ' AND assigned_to = ?';
142
+ params.push(assignedTo);
143
+ }
144
+ if (stage) {
145
+ sql += ' AND stage = ?';
146
+ params.push(stage);
147
+ }
148
+ if (project) {
149
+ sql += ' AND project = ?';
150
+ params.push(project);
151
+ }
152
+ sql += ' ORDER BY priority DESC, created_at DESC';
153
+ if (limit && limit > 0) {
154
+ sql += ' LIMIT ?';
155
+ params.push(Math.min(limit, 500));
156
+ if (offset && offset > 0) {
157
+ sql += ' OFFSET ?';
158
+ params.push(offset);
159
+ }
160
+ }
161
+ return queryAll(sql, params);
162
+ }
163
+ export function claimTask(taskId, claimerName) {
164
+ const session = getCurrentSession();
165
+ const name = claimerName || session?.name;
166
+ if (!name)
167
+ throw new Error('No session or claimer name provided.');
168
+ return transaction(() => {
169
+ const task = getTask(taskId);
170
+ if (!task)
171
+ throw new Error(`Task ${taskId} not found.`);
172
+ if (task.status !== 'pending')
173
+ throw new Error(`Task ${taskId} is not pending (status: ${task.status}).`);
174
+ const stages = getPipelineStages(task.project ?? undefined);
175
+ const firstStage = stages[0];
176
+ const nextStage = stages.length > 1 ? stages[1] : firstStage;
177
+ const newStage = task.stage === firstStage ? nextStage : task.stage;
178
+ const newStatus = syncStatusForStage(newStage, stages);
179
+ run(`UPDATE tasks SET status = ?, stage = ?, assigned_to = ?, updated_at = datetime('now') WHERE id = ?`, [newStatus, newStage, name, taskId]);
180
+ eventBus.emit('task:update');
181
+ return getTask(taskId);
182
+ });
183
+ }
184
+ export function completeTask(taskId, result) {
185
+ return transaction(() => {
186
+ const task = getTask(taskId);
187
+ if (!task)
188
+ throw new Error(`Task ${taskId} not found.`);
189
+ if (task.status !== 'in_progress')
190
+ throw new Error(`Task ${taskId} not in progress.`);
191
+ const stages = getPipelineStages(task.project ?? undefined);
192
+ const doneStage = stages[stages.length - 1];
193
+ run(`UPDATE tasks SET status = 'completed', stage = ?, result = ?, updated_at = datetime('now') WHERE id = ?`, [doneStage, result, taskId]);
194
+ eventBus.emit('task:update');
195
+ return getTask(taskId);
196
+ });
197
+ }
198
+ export function failTask(taskId, result) {
199
+ const res = run(`UPDATE tasks SET status = 'failed', result = ?, updated_at = datetime('now') WHERE id = ? AND status = 'in_progress'`, [result, taskId]);
200
+ if (res.changes === 0)
201
+ throw new Error(`Task ${taskId} not found or not in progress.`);
202
+ eventBus.emit('task:update');
203
+ return getTask(taskId);
204
+ }
205
+ export function cancelTask(taskId, reason) {
206
+ return transaction(() => {
207
+ const task = getTask(taskId);
208
+ if (!task)
209
+ throw new Error(`Task ${taskId} not found.`);
210
+ if (task.status === 'completed' || task.status === 'cancelled') {
211
+ throw new Error(`Task ${taskId} is already ${task.status}.`);
212
+ }
213
+ run(`UPDATE tasks SET status = 'cancelled', stage = 'cancelled', result = ?, updated_at = datetime('now') WHERE id = ?`, [reason, taskId]);
214
+ eventBus.emit('task:update');
215
+ return getTask(taskId);
216
+ });
217
+ }
218
+ // ---- Pipeline Advancement ----
219
+ export function advanceTask(taskId, toStage) {
220
+ return transaction(() => {
221
+ const task = getTask(taskId);
222
+ if (!task)
223
+ throw new Error(`Task ${taskId} not found.`);
224
+ if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {
225
+ throw new Error(`Task ${taskId} is ${task.status} — cannot advance.`);
226
+ }
227
+ const stages = getPipelineStages(task.project ?? undefined);
228
+ const activeStages = stages.filter((s) => s !== 'cancelled');
229
+ const currentIdx = activeStages.indexOf(task.stage);
230
+ if (currentIdx === -1)
231
+ throw new Error(`Task stage '${task.stage}' not in pipeline.`);
232
+ let targetIdx;
233
+ if (toStage) {
234
+ if (toStage === 'cancelled')
235
+ throw new Error(`Use task_cancel to cancel a task.`);
236
+ targetIdx = activeStages.indexOf(toStage);
237
+ if (targetIdx === -1)
238
+ throw new Error(`Invalid target stage: ${toStage}. Valid: ${activeStages.join(', ')}`);
239
+ if (targetIdx <= currentIdx)
240
+ throw new Error(`Target stage '${toStage}' is not ahead of current stage '${task.stage}'. Use task_regress to move backward.`);
241
+ }
242
+ else {
243
+ targetIdx = currentIdx + 1;
244
+ if (targetIdx >= activeStages.length)
245
+ throw new Error(`Task is already at the final stage: ${task.stage}.`);
246
+ }
247
+ checkDependencies(taskId);
248
+ const newStage = activeStages[targetIdx];
249
+ const newStatus = syncStatusForStage(newStage, activeStages);
250
+ run(`UPDATE tasks SET stage = ?, status = ?, updated_at = datetime('now') WHERE id = ?`, [
251
+ newStage,
252
+ newStatus,
253
+ taskId,
254
+ ]);
255
+ eventBus.emit('task:update');
256
+ return getTask(taskId);
257
+ });
258
+ }
259
+ export function regressTask(taskId, toStage, reason) {
260
+ return transaction(() => {
261
+ const task = getTask(taskId);
262
+ if (!task)
263
+ throw new Error(`Task ${taskId} not found.`);
264
+ const stages = getPipelineStages(task.project ?? undefined);
265
+ const currentIdx = stages.indexOf(task.stage);
266
+ const targetIdx = stages.indexOf(toStage);
267
+ if (targetIdx === -1)
268
+ throw new Error(`Invalid target stage: ${toStage}. Valid: ${stages.join(', ')}`);
269
+ if (targetIdx >= currentIdx)
270
+ throw new Error(`Target stage '${toStage}' is not before current stage '${task.stage}'.`);
271
+ const newStatus = syncStatusForStage(toStage, stages);
272
+ run(`UPDATE tasks SET stage = ?, status = ?, updated_at = datetime('now') WHERE id = ?`, [
273
+ toStage,
274
+ newStatus,
275
+ taskId,
276
+ ]);
277
+ if (reason) {
278
+ const session = getCurrentSession();
279
+ const createdBy = session?.name || 'system';
280
+ run(`INSERT INTO task_artifacts (task_id, stage, name, content, created_by) VALUES (?, ?, ?, ?, ?)`, [
281
+ taskId,
282
+ task.stage,
283
+ 'rejection',
284
+ `Regressed from ${task.stage} to ${toStage}: ${reason}`,
285
+ createdBy,
286
+ ]);
287
+ }
288
+ eventBus.emit('task:update');
289
+ return getTask(taskId);
290
+ });
291
+ }
292
+ // ---- Next Task (agent picks work) ----
293
+ export function nextTask(project, stage) {
294
+ let sql = `SELECT t.* FROM tasks t WHERE t.status IN ('pending', 'in_progress') AND t.assigned_to IS NULL`;
295
+ const params = [];
296
+ if (project) {
297
+ sql += ' AND t.project = ?';
298
+ params.push(project);
299
+ }
300
+ if (stage) {
301
+ sql += ' AND t.stage = ?';
302
+ params.push(stage);
303
+ }
304
+ sql += ` AND NOT EXISTS (
305
+ SELECT 1 FROM task_dependencies d
306
+ JOIN tasks dep ON dep.id = d.depends_on
307
+ WHERE d.task_id = t.id AND dep.stage NOT IN ('done', 'cancelled')
308
+ )`;
309
+ sql += ' ORDER BY t.priority DESC, t.created_at ASC LIMIT 1';
310
+ return queryOne(sql, params);
311
+ }
312
+ // ---- Dependencies ----
313
+ export function addDependency(taskId, dependsOn) {
314
+ if (taskId === dependsOn)
315
+ throw new Error('A task cannot depend on itself.');
316
+ const task = getTask(taskId);
317
+ if (!task)
318
+ throw new Error(`Task ${taskId} not found.`);
319
+ const dep = getTask(dependsOn);
320
+ if (!dep)
321
+ throw new Error(`Dependency task ${dependsOn} not found.`);
322
+ if (wouldCreateCycle(taskId, dependsOn)) {
323
+ throw new Error(`Adding dependency ${taskId} → ${dependsOn} would create a cycle.`);
324
+ }
325
+ try {
326
+ run('INSERT INTO task_dependencies (task_id, depends_on) VALUES (?, ?)', [taskId, dependsOn]);
327
+ }
328
+ catch {
329
+ throw new Error(`Dependency ${taskId} → ${dependsOn} already exists.`);
330
+ }
331
+ eventBus.emit('task:update');
332
+ }
333
+ export function removeDependency(taskId, dependsOn) {
334
+ const result = run('DELETE FROM task_dependencies WHERE task_id = ? AND depends_on = ?', [
335
+ taskId,
336
+ dependsOn,
337
+ ]);
338
+ if (result.changes === 0)
339
+ throw new Error(`Dependency ${taskId} → ${dependsOn} not found.`);
340
+ eventBus.emit('task:update');
341
+ }
342
+ export function getTaskDependencies(taskId) {
343
+ return {
344
+ blockers: queryAll('SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.depends_on WHERE d.task_id = ?', [taskId]),
345
+ blocking: queryAll('SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.task_id WHERE d.depends_on = ?', [taskId]),
346
+ };
347
+ }
348
+ export function getAllDependencies() {
349
+ return queryAll('SELECT * FROM task_dependencies');
350
+ }
351
+ function wouldCreateCycle(taskId, dependsOn) {
352
+ const visited = new Set();
353
+ const stack = [dependsOn];
354
+ while (stack.length) {
355
+ const current = stack.pop();
356
+ if (current === taskId)
357
+ return true;
358
+ if (visited.has(current))
359
+ continue;
360
+ visited.add(current);
361
+ // Follow: what does `current` depend on?
362
+ const deps = queryAll('SELECT * FROM task_dependencies WHERE task_id = ?', [
363
+ current,
364
+ ]);
365
+ for (const d of deps)
366
+ stack.push(d.depends_on);
367
+ }
368
+ return false;
369
+ }
370
+ function checkDependencies(taskId) {
371
+ const blockers = queryAll(`SELECT t.* FROM tasks t JOIN task_dependencies d ON t.id = d.depends_on
372
+ WHERE d.task_id = ? AND t.stage NOT IN ('done', 'cancelled')`, [taskId]);
373
+ if (blockers.length > 0) {
374
+ const names = blockers.map((b) => `#${b.id} "${b.title}" (${b.stage})`).join(', ');
375
+ throw new Error(`Blocked by incomplete dependencies: ${names}`);
376
+ }
377
+ }
378
+ // ---- Artifacts ----
379
+ export function addArtifact(taskId, stage, name, content) {
380
+ const task = getTask(taskId);
381
+ if (!task)
382
+ throw new Error(`Task ${taskId} not found.`);
383
+ if (!stage || stage === '_current_')
384
+ stage = task.stage;
385
+ const session = getCurrentSession();
386
+ const createdBy = session?.name || 'system';
387
+ const result = run(`INSERT INTO task_artifacts (task_id, stage, name, content, created_by) VALUES (?, ?, ?, ?, ?)`, [taskId, stage, name, content, createdBy]);
388
+ eventBus.emit('task:update');
389
+ return queryOne('SELECT * FROM task_artifacts WHERE id = ?', [
390
+ Number(result.lastInsertRowid),
391
+ ]);
392
+ }
393
+ export function getArtifacts(taskId, stage) {
394
+ if (stage) {
395
+ return queryAll('SELECT * FROM task_artifacts WHERE task_id = ? AND stage = ? ORDER BY created_at ASC', [taskId, stage]);
396
+ }
397
+ return queryAll('SELECT * FROM task_artifacts WHERE task_id = ? ORDER BY created_at ASC', [taskId]);
398
+ }
399
+ export function getArtifactCounts() {
400
+ const rows = queryAll('SELECT task_id, COUNT(*) as cnt FROM task_artifacts GROUP BY task_id');
401
+ const counts = {};
402
+ for (const r of rows)
403
+ counts[r.task_id] = r.cnt;
404
+ return counts;
405
+ }
406
+ // ---- Internal ----
407
+ function getTask(id) {
408
+ return queryOne('SELECT * FROM tasks WHERE id = ?', [id]);
409
+ }
410
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { AppContext } from '../context.js';
2
+ import type { ToolDefinition } from '../types.js';
3
+ export declare const tools: ToolDefinition[];
4
+ export type ToolHandler = (name: string, args: Record<string, unknown>) => unknown;
5
+ export declare function createToolHandler(ctx: AppContext): ToolHandler;
6
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/transport/mcp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAgC,cAAc,EAAE,MAAM,aAAa,CAAC;AAOhF,eAAO,MAAM,KAAK,EAAE,cAAc,EA8XjC,CAAC;AAwDF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAoM9D"}