agent-tasks 1.6.0 → 1.6.2
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 -21
- package/README.md +181 -188
- package/package.json +84 -84
- package/dist/context.d.ts +0 -21
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -48
- package/dist/context.js.map +0 -1
- package/dist/db.d.ts +0 -10
- package/dist/db.d.ts.map +0 -1
- package/dist/db.js +0 -112
- package/dist/db.js.map +0 -1
- package/dist/domain/agent-bridge.d.ts +0 -13
- package/dist/domain/agent-bridge.d.ts.map +0 -1
- package/dist/domain/agent-bridge.js +0 -99
- package/dist/domain/agent-bridge.js.map +0 -1
- package/dist/domain/approvals.d.ts +0 -19
- package/dist/domain/approvals.d.ts.map +0 -1
- package/dist/domain/approvals.js +0 -99
- package/dist/domain/approvals.js.map +0 -1
- package/dist/domain/cleanup.d.ts +0 -28
- package/dist/domain/cleanup.d.ts.map +0 -1
- package/dist/domain/cleanup.js +0 -68
- package/dist/domain/cleanup.js.map +0 -1
- package/dist/domain/collaborators.d.ts +0 -15
- package/dist/domain/collaborators.d.ts.map +0 -1
- package/dist/domain/collaborators.js +0 -72
- package/dist/domain/collaborators.js.map +0 -1
- package/dist/domain/comments.d.ts +0 -14
- package/dist/domain/comments.d.ts.map +0 -1
- package/dist/domain/comments.js +0 -66
- package/dist/domain/comments.js.map +0 -1
- package/dist/domain/events.d.ts +0 -10
- package/dist/domain/events.d.ts.map +0 -1
- package/dist/domain/events.js +0 -61
- package/dist/domain/events.js.map +0 -1
- package/dist/domain/rules.d.ts +0 -2
- package/dist/domain/rules.d.ts.map +0 -1
- package/dist/domain/rules.js +0 -67
- package/dist/domain/rules.js.map +0 -1
- package/dist/domain/tasks.d.ts +0 -66
- package/dist/domain/tasks.d.ts.map +0 -1
- package/dist/domain/tasks.js +0 -655
- package/dist/domain/tasks.js.map +0 -1
- package/dist/domain/validate.d.ts +0 -16
- package/dist/domain/validate.d.ts.map +0 -1
- package/dist/domain/validate.js +0 -32
- package/dist/domain/validate.js.map +0 -1
- package/dist/event-bus.d.ts +0 -10
- package/dist/event-bus.d.ts.map +0 -1
- package/dist/event-bus.js +0 -38
- package/dist/event-bus.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -132
- package/dist/index.js.map +0 -1
- package/dist/server.d.ts +0 -10
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -95
- package/dist/server.js.map +0 -1
- package/dist/session.d.ts +0 -7
- package/dist/session.d.ts.map +0 -1
- package/dist/session.js +0 -11
- package/dist/session.js.map +0 -1
- package/dist/storage/database.d.ts +0 -15
- package/dist/storage/database.d.ts.map +0 -1
- package/dist/storage/database.js +0 -224
- package/dist/storage/database.js.map +0 -1
- package/dist/tasks.d.ts +0 -32
- package/dist/tasks.d.ts.map +0 -1
- package/dist/tasks.js +0 -410
- package/dist/tasks.js.map +0 -1
- package/dist/transport/mcp.d.ts +0 -6
- package/dist/transport/mcp.d.ts.map +0 -1
- package/dist/transport/mcp.js +0 -731
- package/dist/transport/mcp.js.map +0 -1
- package/dist/transport/rest.d.ts +0 -4
- package/dist/transport/rest.d.ts.map +0 -1
- package/dist/transport/rest.js +0 -534
- package/dist/transport/rest.js.map +0 -1
- package/dist/transport/ws.d.ts +0 -10
- package/dist/transport/ws.d.ts.map +0 -1
- package/dist/transport/ws.js +0 -191
- package/dist/transport/ws.js.map +0 -1
- package/dist/types.d.ts +0 -147
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -35
- package/dist/types.js.map +0 -1
- package/dist/ui/app.js +0 -1973
- package/dist/ui/index.html +0 -172
- package/dist/ui/morphdom.min.js +0 -1
- package/dist/ui/styles.css +0 -2435
package/dist/context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oCAAoC;AACpC,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,gFAAgF;AAEhF,OAAO,EAAE,QAAQ,EAA2B,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAcrD,MAAM,UAAU,aAAa,CAAC,SAAqB;IACjD,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAEtD,WAAW,CAAC,KAAK,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,OAAO;QACL,EAAE;QACF,MAAM;QACN,KAAK;QACL,QAAQ;QACR,aAAa;QACb,SAAS;QACT,WAAW;QACX,OAAO;QACP,KAAK;YACH,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/db.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
export declare function log(level: string, msg: string): void;
|
|
3
|
-
export declare function initDb(): Promise<Database.Database>;
|
|
4
|
-
export declare function getDb(): Database.Database;
|
|
5
|
-
export declare function transaction<T>(fn: () => T): T;
|
|
6
|
-
export declare function queryAll<T>(sql: string, params?: unknown[]): T[];
|
|
7
|
-
export declare function queryOne<T>(sql: string, params?: unknown[]): T | null;
|
|
8
|
-
export declare function run(sql: string, params?: unknown[]): Database.RunResult;
|
|
9
|
-
export declare function closeDb(): void;
|
|
10
|
-
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAqBzD;AAED,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAGzC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAG7C;AAuDD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAIhE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAKrE;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,SAAS,CAIvE;AAED,wBAAgB,OAAO,IAAI,IAAI,CAS9B"}
|
package/dist/db.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
import { homedir } from 'os';
|
|
3
|
-
import { join } from 'path';
|
|
4
|
-
import { mkdirSync } from 'fs';
|
|
5
|
-
let db = null;
|
|
6
|
-
export function log(level, msg) {
|
|
7
|
-
process.stderr.write(`[agent-tasks:${level}] ${new Date().toISOString()} ${msg}\n`);
|
|
8
|
-
}
|
|
9
|
-
export async function initDb() {
|
|
10
|
-
if (db)
|
|
11
|
-
return db;
|
|
12
|
-
const inMemory = !!process.env.AGENT_TASKS_TEST;
|
|
13
|
-
if (inMemory) {
|
|
14
|
-
db = new Database(':memory:');
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
const dir = join(homedir(), '.claude');
|
|
18
|
-
mkdirSync(dir, { recursive: true });
|
|
19
|
-
const dbPath = process.env.AGENT_TASKS_DB || join(dir, 'agent-tasks.db');
|
|
20
|
-
db = new Database(dbPath);
|
|
21
|
-
}
|
|
22
|
-
db.pragma('journal_mode = WAL');
|
|
23
|
-
db.pragma('busy_timeout = 5000');
|
|
24
|
-
db.pragma('synchronous = NORMAL');
|
|
25
|
-
db.pragma('foreign_keys = ON');
|
|
26
|
-
initSchema(db);
|
|
27
|
-
return db;
|
|
28
|
-
}
|
|
29
|
-
export function getDb() {
|
|
30
|
-
if (!db)
|
|
31
|
-
throw new Error('Database not initialized. Call initDb() first.');
|
|
32
|
-
return db;
|
|
33
|
-
}
|
|
34
|
-
export function transaction(fn) {
|
|
35
|
-
const database = getDb();
|
|
36
|
-
return database.transaction(fn)();
|
|
37
|
-
}
|
|
38
|
-
function initSchema(database) {
|
|
39
|
-
database.exec(`
|
|
40
|
-
CREATE TABLE IF NOT EXISTS tasks (
|
|
41
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
42
|
-
title TEXT NOT NULL,
|
|
43
|
-
description TEXT,
|
|
44
|
-
created_by TEXT NOT NULL,
|
|
45
|
-
assigned_to TEXT,
|
|
46
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
47
|
-
stage TEXT NOT NULL DEFAULT 'backlog',
|
|
48
|
-
priority INTEGER NOT NULL DEFAULT 0,
|
|
49
|
-
project TEXT,
|
|
50
|
-
tags TEXT,
|
|
51
|
-
result TEXT,
|
|
52
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
53
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
54
|
-
)
|
|
55
|
-
`);
|
|
56
|
-
database.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to, status)`);
|
|
57
|
-
database.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_stage ON tasks(stage, priority)`);
|
|
58
|
-
database.exec(`
|
|
59
|
-
CREATE TABLE IF NOT EXISTS task_dependencies (
|
|
60
|
-
task_id INTEGER NOT NULL,
|
|
61
|
-
depends_on INTEGER NOT NULL,
|
|
62
|
-
PRIMARY KEY (task_id, depends_on)
|
|
63
|
-
)
|
|
64
|
-
`);
|
|
65
|
-
database.exec(`
|
|
66
|
-
CREATE TABLE IF NOT EXISTS task_artifacts (
|
|
67
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
68
|
-
task_id INTEGER NOT NULL,
|
|
69
|
-
stage TEXT NOT NULL,
|
|
70
|
-
name TEXT NOT NULL,
|
|
71
|
-
content TEXT NOT NULL,
|
|
72
|
-
created_by TEXT NOT NULL,
|
|
73
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
74
|
-
)
|
|
75
|
-
`);
|
|
76
|
-
database.exec(`CREATE INDEX IF NOT EXISTS idx_task_artifacts_task ON task_artifacts(task_id, stage)`);
|
|
77
|
-
database.exec(`
|
|
78
|
-
CREATE TABLE IF NOT EXISTS pipeline_config (
|
|
79
|
-
project TEXT PRIMARY KEY,
|
|
80
|
-
stages TEXT NOT NULL DEFAULT '["backlog","spec","plan","implement","test","review","done","cancelled"]',
|
|
81
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
82
|
-
)
|
|
83
|
-
`);
|
|
84
|
-
}
|
|
85
|
-
export function queryAll(sql, params) {
|
|
86
|
-
const database = getDb();
|
|
87
|
-
const stmt = database.prepare(sql);
|
|
88
|
-
return (params?.length ? stmt.all(...params) : stmt.all());
|
|
89
|
-
}
|
|
90
|
-
export function queryOne(sql, params) {
|
|
91
|
-
const database = getDb();
|
|
92
|
-
const stmt = database.prepare(sql);
|
|
93
|
-
const row = params?.length ? stmt.get(...params) : stmt.get();
|
|
94
|
-
return row ?? null;
|
|
95
|
-
}
|
|
96
|
-
export function run(sql, params) {
|
|
97
|
-
const database = getDb();
|
|
98
|
-
const stmt = database.prepare(sql);
|
|
99
|
-
return params?.length ? stmt.run(...params) : stmt.run();
|
|
100
|
-
}
|
|
101
|
-
export function closeDb() {
|
|
102
|
-
if (db) {
|
|
103
|
-
try {
|
|
104
|
-
db.close();
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
log('warn', `Error closing db: ${e}`);
|
|
108
|
-
}
|
|
109
|
-
db = null;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { EventBus } from './events.js';
|
|
2
|
-
export declare class AgentBridge {
|
|
3
|
-
private readonly events;
|
|
4
|
-
private unsubs;
|
|
5
|
-
constructor(events: EventBus);
|
|
6
|
-
start(): void;
|
|
7
|
-
stop(): void;
|
|
8
|
-
fetchAgents(): Promise<unknown[]>;
|
|
9
|
-
private notify;
|
|
10
|
-
private notifyChannel;
|
|
11
|
-
private postMessage;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=agent-bridge.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/domain/agent-bridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,MAAM,CAAsB;gBAEP,MAAM,EAAE,QAAQ;IAE7C,KAAK,IAAI,IAAI;IAiDb,IAAI,IAAI,IAAI;IAKZ,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAuBjC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;CA6BpB"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// agent-tasks — Agent-comm bridge
|
|
3
|
-
//
|
|
4
|
-
// Listens to task events and forwards notifications to agents via
|
|
5
|
-
// agent-comm's REST API. Lightweight runtime integration — no npm dependency.
|
|
6
|
-
// =============================================================================
|
|
7
|
-
import http from 'http';
|
|
8
|
-
const AGENT_COMM_URL = process.env.AGENT_COMM_URL || 'http://localhost:3421';
|
|
9
|
-
export class AgentBridge {
|
|
10
|
-
events;
|
|
11
|
-
unsubs = [];
|
|
12
|
-
constructor(events) {
|
|
13
|
-
this.events = events;
|
|
14
|
-
}
|
|
15
|
-
start() {
|
|
16
|
-
this.unsubs.push(this.events.on('task:claimed', (e) => {
|
|
17
|
-
const task = e.data.task;
|
|
18
|
-
if (task.assigned_to) {
|
|
19
|
-
this.notify(`Task #${task.id} "${task.title}" has been assigned to you.`, task.assigned_to);
|
|
20
|
-
}
|
|
21
|
-
}));
|
|
22
|
-
this.unsubs.push(this.events.on('task:advanced', (e) => {
|
|
23
|
-
const task = e.data.task;
|
|
24
|
-
const toStage = e.data.to_stage;
|
|
25
|
-
if (task.assigned_to) {
|
|
26
|
-
this.notify(`Task #${task.id} "${task.title}" advanced to ${toStage}.`, task.assigned_to);
|
|
27
|
-
}
|
|
28
|
-
}));
|
|
29
|
-
this.unsubs.push(this.events.on('comment:created', (e) => {
|
|
30
|
-
const comment = e.data.comment;
|
|
31
|
-
this.notifyChannel(`Comment on task #${comment.task_id} by ${comment.agent_id}: ${comment.content.slice(0, 100)}`);
|
|
32
|
-
}));
|
|
33
|
-
this.unsubs.push(this.events.on('approval:requested', (e) => {
|
|
34
|
-
const approval = e.data.approval;
|
|
35
|
-
if (approval.reviewer) {
|
|
36
|
-
this.notify(`Approval requested for task #${approval.task_id} at stage ${approval.stage}.`, approval.reviewer);
|
|
37
|
-
}
|
|
38
|
-
}));
|
|
39
|
-
}
|
|
40
|
-
stop() {
|
|
41
|
-
for (const unsub of this.unsubs)
|
|
42
|
-
unsub();
|
|
43
|
-
this.unsubs = [];
|
|
44
|
-
}
|
|
45
|
-
fetchAgents() {
|
|
46
|
-
return new Promise((resolve) => {
|
|
47
|
-
const url = new URL('/api/agents', AGENT_COMM_URL);
|
|
48
|
-
http
|
|
49
|
-
.get(url, { timeout: 3000 }, (res) => {
|
|
50
|
-
let body = '';
|
|
51
|
-
res.on('data', (c) => (body += c));
|
|
52
|
-
res.on('end', () => {
|
|
53
|
-
try {
|
|
54
|
-
resolve(JSON.parse(body));
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
resolve([]);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
})
|
|
61
|
-
.on('error', () => resolve([]))
|
|
62
|
-
.on('timeout', function () {
|
|
63
|
-
this.destroy();
|
|
64
|
-
resolve([]);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
notify(content, agentName) {
|
|
69
|
-
this.postMessage({ to: agentName, content }).catch(() => { });
|
|
70
|
-
}
|
|
71
|
-
notifyChannel(content) {
|
|
72
|
-
this.postMessage({ channel: 'general', content }).catch(() => { });
|
|
73
|
-
}
|
|
74
|
-
postMessage(payload) {
|
|
75
|
-
return new Promise((resolve) => {
|
|
76
|
-
const data = JSON.stringify({ ...payload, from: 'agent-tasks' });
|
|
77
|
-
const url = new URL('/api/messages', AGENT_COMM_URL);
|
|
78
|
-
const req = http.request({
|
|
79
|
-
hostname: url.hostname,
|
|
80
|
-
port: url.port,
|
|
81
|
-
path: url.pathname,
|
|
82
|
-
method: 'POST',
|
|
83
|
-
headers: {
|
|
84
|
-
'Content-Type': 'application/json',
|
|
85
|
-
'Content-Length': Buffer.byteLength(data),
|
|
86
|
-
},
|
|
87
|
-
timeout: 3000,
|
|
88
|
-
}, () => resolve());
|
|
89
|
-
req.on('error', () => resolve());
|
|
90
|
-
req.on('timeout', () => {
|
|
91
|
-
req.destroy();
|
|
92
|
-
resolve();
|
|
93
|
-
});
|
|
94
|
-
req.write(data);
|
|
95
|
-
req.end();
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=agent-bridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.js","sourceRoot":"","sources":["../../src/domain/agent-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Db } from '../storage/database.js';
|
|
2
|
-
import type { EventBus } from './events.js';
|
|
3
|
-
import type { TaskApproval } from '../types.js';
|
|
4
|
-
export declare class ApprovalService {
|
|
5
|
-
private readonly db;
|
|
6
|
-
private readonly events;
|
|
7
|
-
constructor(db: Db, events: EventBus);
|
|
8
|
-
request(taskId: number, stage: string, reviewer?: string): TaskApproval;
|
|
9
|
-
approve(approvalId: number, reviewer: string, comment?: string): TaskApproval;
|
|
10
|
-
reject(approvalId: number, reviewer: string, comment?: string): TaskApproval;
|
|
11
|
-
getPending(reviewer?: string): TaskApproval[];
|
|
12
|
-
getForTask(taskId: number): TaskApproval[];
|
|
13
|
-
isApprovalRequired(stage: string, project?: string): boolean;
|
|
14
|
-
hasPendingApproval(taskId: number, stage: string): boolean;
|
|
15
|
-
isApproved(taskId: number, stage: string): boolean;
|
|
16
|
-
private validateReviewer;
|
|
17
|
-
private resolve;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=approvals.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/domain/approvals.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAIhE,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,QAAQ;IAGnC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY;IAiCvE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IAK7E,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IAM5E,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAY7C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAO1C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO;IAkB5D,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ1D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAQlD,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,OAAO;CA4BhB"}
|
package/dist/domain/approvals.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// agent-tasks — Approval domain service
|
|
3
|
-
//
|
|
4
|
-
// Stage-gated approvals for pipeline advancement.
|
|
5
|
-
// =============================================================================
|
|
6
|
-
import { NotFoundError, ConflictError, ValidationError } from '../types.js';
|
|
7
|
-
import { rejectNullBytes, rejectControlChars, MAX_AGENT_ID_LENGTH } from './validate.js';
|
|
8
|
-
export class ApprovalService {
|
|
9
|
-
db;
|
|
10
|
-
events;
|
|
11
|
-
constructor(db, events) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
this.events = events;
|
|
14
|
-
}
|
|
15
|
-
request(taskId, stage, reviewer) {
|
|
16
|
-
const task = this.db.queryOne('SELECT id, project FROM tasks WHERE id = ?', [taskId]);
|
|
17
|
-
if (!task)
|
|
18
|
-
throw new NotFoundError('Task', taskId);
|
|
19
|
-
if (reviewer) {
|
|
20
|
-
this.validateReviewer(reviewer);
|
|
21
|
-
}
|
|
22
|
-
const existing = this.db.queryOne(`SELECT * FROM task_approvals WHERE task_id = ? AND stage = ? AND status = 'pending'`, [taskId, stage]);
|
|
23
|
-
if (existing)
|
|
24
|
-
throw new ConflictError(`Pending approval already exists for task ${taskId} at stage ${stage}.`);
|
|
25
|
-
const result = this.db.run(`INSERT INTO task_approvals (task_id, stage, reviewer) VALUES (?, ?, ?)`, [taskId, stage, reviewer ?? null]);
|
|
26
|
-
const approval = this.db.queryOne('SELECT * FROM task_approvals WHERE id = ?', [
|
|
27
|
-
Number(result.lastInsertRowid),
|
|
28
|
-
]);
|
|
29
|
-
this.events.emit('approval:requested', { approval });
|
|
30
|
-
return approval;
|
|
31
|
-
}
|
|
32
|
-
approve(approvalId, reviewer, comment) {
|
|
33
|
-
this.validateReviewer(reviewer);
|
|
34
|
-
return this.resolve(approvalId, 'approved', reviewer, comment);
|
|
35
|
-
}
|
|
36
|
-
reject(approvalId, reviewer, comment) {
|
|
37
|
-
this.validateReviewer(reviewer);
|
|
38
|
-
if (!comment?.trim())
|
|
39
|
-
throw new ValidationError('Rejection requires a comment.');
|
|
40
|
-
return this.resolve(approvalId, 'rejected', reviewer, comment);
|
|
41
|
-
}
|
|
42
|
-
getPending(reviewer) {
|
|
43
|
-
if (reviewer) {
|
|
44
|
-
return this.db.queryAll(`SELECT * FROM task_approvals WHERE status = 'pending' AND (reviewer = ? OR reviewer IS NULL) ORDER BY requested_at ASC`, [reviewer]);
|
|
45
|
-
}
|
|
46
|
-
return this.db.queryAll(`SELECT * FROM task_approvals WHERE status = 'pending' ORDER BY requested_at ASC`);
|
|
47
|
-
}
|
|
48
|
-
getForTask(taskId) {
|
|
49
|
-
return this.db.queryAll('SELECT * FROM task_approvals WHERE task_id = ? ORDER BY requested_at DESC', [taskId]);
|
|
50
|
-
}
|
|
51
|
-
isApprovalRequired(stage, project) {
|
|
52
|
-
if (!project)
|
|
53
|
-
return false;
|
|
54
|
-
const config = this.db.queryOne('SELECT * FROM pipeline_config WHERE project = ?', [project]);
|
|
55
|
-
if (!config?.approval_config)
|
|
56
|
-
return false;
|
|
57
|
-
try {
|
|
58
|
-
const approvalConfig = JSON.parse(config.approval_config);
|
|
59
|
-
return !!approvalConfig[stage]?.required;
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
hasPendingApproval(taskId, stage) {
|
|
66
|
-
const pending = this.db.queryOne(`SELECT id FROM task_approvals WHERE task_id = ? AND stage = ? AND status = 'pending'`, [taskId, stage]);
|
|
67
|
-
return !!pending;
|
|
68
|
-
}
|
|
69
|
-
isApproved(taskId, stage) {
|
|
70
|
-
const approved = this.db.queryOne(`SELECT id FROM task_approvals WHERE task_id = ? AND stage = ? AND status = 'approved'`, [taskId, stage]);
|
|
71
|
-
return !!approved;
|
|
72
|
-
}
|
|
73
|
-
validateReviewer(reviewer) {
|
|
74
|
-
rejectNullBytes(reviewer, 'reviewer');
|
|
75
|
-
rejectControlChars(reviewer, 'reviewer');
|
|
76
|
-
if (reviewer.length > MAX_AGENT_ID_LENGTH) {
|
|
77
|
-
throw new ValidationError(`Reviewer name too long (max ${MAX_AGENT_ID_LENGTH} chars).`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
resolve(approvalId, status, reviewer, comment) {
|
|
81
|
-
const approval = this.db.queryOne('SELECT * FROM task_approvals WHERE id = ?', [
|
|
82
|
-
approvalId,
|
|
83
|
-
]);
|
|
84
|
-
if (!approval)
|
|
85
|
-
throw new NotFoundError('Approval', approvalId);
|
|
86
|
-
if (approval.status !== 'pending') {
|
|
87
|
-
throw new ConflictError(`Approval ${approvalId} is already ${approval.status}.`);
|
|
88
|
-
}
|
|
89
|
-
this.db.run(`UPDATE task_approvals SET status = ?, reviewer = ?, resolved_at = datetime('now'), comment = ? WHERE id = ?`, [status, reviewer, comment ?? null, approvalId]);
|
|
90
|
-
const resolved = this.db.queryOne('SELECT * FROM task_approvals WHERE id = ?', [
|
|
91
|
-
approvalId,
|
|
92
|
-
]);
|
|
93
|
-
this.events.emit(status === 'approved' ? 'approval:approved' : 'approval:rejected', {
|
|
94
|
-
approval: resolved,
|
|
95
|
-
});
|
|
96
|
-
return resolved;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=approvals.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/domain/approvals.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/cleanup.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { Db } from '../storage/database.js';
|
|
2
|
-
export declare class CleanupService {
|
|
3
|
-
private readonly db;
|
|
4
|
-
private readonly retentionDays;
|
|
5
|
-
private timer;
|
|
6
|
-
constructor(db: Db, retentionDays?: number);
|
|
7
|
-
start(): void;
|
|
8
|
-
stop(): void;
|
|
9
|
-
run(): {
|
|
10
|
-
purgedTasks: number;
|
|
11
|
-
purgedComments: number;
|
|
12
|
-
purgedArtifacts: number;
|
|
13
|
-
purgedApprovals: number;
|
|
14
|
-
};
|
|
15
|
-
purgeAll(): {
|
|
16
|
-
purgedTasks: number;
|
|
17
|
-
purgedComments: number;
|
|
18
|
-
purgedArtifacts: number;
|
|
19
|
-
purgedApprovals: number;
|
|
20
|
-
};
|
|
21
|
-
purgeEverything(): {
|
|
22
|
-
purgedTasks: number;
|
|
23
|
-
purgedComments: number;
|
|
24
|
-
purgedArtifacts: number;
|
|
25
|
-
purgedApprovals: number;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/domain/cleanup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAEjD,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAJhC,OAAO,CAAC,KAAK,CAA+C;gBAGzC,EAAE,EAAE,EAAE,EACN,aAAa,GAAE,MAAW;IAG7C,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAOZ,GAAG,IAAI;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB;IAmCD,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB;IAoBD,eAAe,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB;CAaF"}
|
package/dist/domain/cleanup.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
export class CleanupService {
|
|
2
|
-
db;
|
|
3
|
-
retentionDays;
|
|
4
|
-
timer = null;
|
|
5
|
-
constructor(db, retentionDays = 30) {
|
|
6
|
-
this.db = db;
|
|
7
|
-
this.retentionDays = retentionDays;
|
|
8
|
-
}
|
|
9
|
-
start() {
|
|
10
|
-
// Run cleanup every hour
|
|
11
|
-
this.timer = setInterval(() => this.run(), 60 * 60 * 1000);
|
|
12
|
-
this.timer.unref();
|
|
13
|
-
// Run once on start (delayed 10s)
|
|
14
|
-
setTimeout(() => this.run(), 10_000).unref();
|
|
15
|
-
}
|
|
16
|
-
stop() {
|
|
17
|
-
if (this.timer) {
|
|
18
|
-
clearInterval(this.timer);
|
|
19
|
-
this.timer = null;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
run() {
|
|
23
|
-
const cutoff = new Date(Date.now() - this.retentionDays * 24 * 60 * 60 * 1000)
|
|
24
|
-
.toISOString()
|
|
25
|
-
.replace('T', ' ')
|
|
26
|
-
.slice(0, 19);
|
|
27
|
-
const tasks = this.db.run(`DELETE FROM tasks WHERE status IN ('completed', 'cancelled') AND updated_at < ?`, [cutoff]);
|
|
28
|
-
// Orphaned comments (task deleted via CASCADE should handle this, but just in case)
|
|
29
|
-
const comments = this.db.run(`DELETE FROM task_comments WHERE task_id NOT IN (SELECT id FROM tasks)`);
|
|
30
|
-
// Orphaned artifacts (defensive — CASCADE should handle this)
|
|
31
|
-
const artifacts = this.db.run(`DELETE FROM task_artifacts WHERE task_id NOT IN (SELECT id FROM tasks)`);
|
|
32
|
-
// Resolved approvals older than retention
|
|
33
|
-
const approvals = this.db.run(`DELETE FROM task_approvals WHERE status != 'pending' AND resolved_at < ?`, [cutoff]);
|
|
34
|
-
return {
|
|
35
|
-
purgedTasks: tasks.changes,
|
|
36
|
-
purgedComments: comments.changes,
|
|
37
|
-
purgedArtifacts: artifacts.changes,
|
|
38
|
-
purgedApprovals: approvals.changes,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
purgeAll() {
|
|
42
|
-
// Purge completed/cancelled by status OR tasks in done/cancelled stage
|
|
43
|
-
const tasks = this.db.run(`DELETE FROM tasks WHERE status IN ('completed', 'cancelled') OR stage IN ('done', 'cancelled')`);
|
|
44
|
-
const comments = this.db.run(`DELETE FROM task_comments WHERE task_id NOT IN (SELECT id FROM tasks)`);
|
|
45
|
-
const artifacts = this.db.run(`DELETE FROM task_artifacts WHERE task_id NOT IN (SELECT id FROM tasks)`);
|
|
46
|
-
const approvals = this.db.run(`DELETE FROM task_approvals WHERE status != 'pending'`);
|
|
47
|
-
return {
|
|
48
|
-
purgedTasks: tasks.changes,
|
|
49
|
-
purgedComments: comments.changes,
|
|
50
|
-
purgedArtifacts: artifacts.changes,
|
|
51
|
-
purgedApprovals: approvals.changes,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
purgeEverything() {
|
|
55
|
-
// Nuclear option — delete ALL tasks regardless of status/stage
|
|
56
|
-
const tasks = this.db.run(`DELETE FROM tasks`);
|
|
57
|
-
const comments = this.db.run(`DELETE FROM task_comments`);
|
|
58
|
-
const artifacts = this.db.run(`DELETE FROM task_artifacts`);
|
|
59
|
-
const approvals = this.db.run(`DELETE FROM task_approvals`);
|
|
60
|
-
return {
|
|
61
|
-
purgedTasks: tasks.changes,
|
|
62
|
-
purgedComments: comments.changes,
|
|
63
|
-
purgedArtifacts: artifacts.changes,
|
|
64
|
-
purgedApprovals: approvals.changes,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=cleanup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/domain/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Db } from '../storage/database.js';
|
|
2
|
-
import type { EventBus } from './events.js';
|
|
3
|
-
import type { CollaboratorRole, TaskCollaborator } from '../types.js';
|
|
4
|
-
export declare class CollaboratorService {
|
|
5
|
-
private readonly db;
|
|
6
|
-
private readonly events;
|
|
7
|
-
constructor(db: Db, events: EventBus);
|
|
8
|
-
add(taskId: number, agentId: string, role?: CollaboratorRole): TaskCollaborator;
|
|
9
|
-
remove(taskId: number, agentId: string): void;
|
|
10
|
-
list(taskId: number): TaskCollaborator[];
|
|
11
|
-
listAllByTask(): Record<number, TaskCollaborator[]>;
|
|
12
|
-
getTasksForAgent(agentId: string): number[];
|
|
13
|
-
private validateAgent;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=collaborators.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collaborators.d.ts","sourceRoot":"","sources":["../../src/domain/collaborators.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMtE,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,QAAQ;IAGnC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAiC,GAAG,gBAAgB;IA4B/F,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAW7C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAOxC,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAYnD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAQ3C,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
// =============================================================================
|
|
2
|
-
// agent-tasks — Collaborator domain service
|
|
3
|
-
//
|
|
4
|
-
// Multiple agents can collaborate on a single task with defined roles.
|
|
5
|
-
// =============================================================================
|
|
6
|
-
import { NotFoundError, ValidationError, ConflictError } from '../types.js';
|
|
7
|
-
import { rejectNullBytes, rejectControlChars, MAX_AGENT_ID_LENGTH } from './validate.js';
|
|
8
|
-
const VALID_ROLES = ['collaborator', 'reviewer', 'watcher'];
|
|
9
|
-
export class CollaboratorService {
|
|
10
|
-
db;
|
|
11
|
-
events;
|
|
12
|
-
constructor(db, events) {
|
|
13
|
-
this.db = db;
|
|
14
|
-
this.events = events;
|
|
15
|
-
}
|
|
16
|
-
add(taskId, agentId, role = 'collaborator') {
|
|
17
|
-
this.validateAgent(agentId);
|
|
18
|
-
if (!VALID_ROLES.includes(role)) {
|
|
19
|
-
throw new ValidationError(`Invalid role: ${role}. Valid: ${VALID_ROLES.join(', ')}`);
|
|
20
|
-
}
|
|
21
|
-
const task = this.db.queryOne('SELECT id FROM tasks WHERE id = ?', [taskId]);
|
|
22
|
-
if (!task)
|
|
23
|
-
throw new NotFoundError('Task', taskId);
|
|
24
|
-
try {
|
|
25
|
-
this.db.run(`INSERT INTO task_collaborators (task_id, agent_id, role) VALUES (?, ?, ?)`, [
|
|
26
|
-
taskId,
|
|
27
|
-
agentId,
|
|
28
|
-
role,
|
|
29
|
-
]);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
throw new ConflictError(`Agent ${agentId} is already a collaborator on task ${taskId}.`);
|
|
33
|
-
}
|
|
34
|
-
const collab = this.db.queryOne('SELECT * FROM task_collaborators WHERE task_id = ? AND agent_id = ?', [taskId, agentId]);
|
|
35
|
-
this.events.emit('collaborator:added', { task_id: taskId, agent_id: agentId, role });
|
|
36
|
-
return collab;
|
|
37
|
-
}
|
|
38
|
-
remove(taskId, agentId) {
|
|
39
|
-
const result = this.db.run('DELETE FROM task_collaborators WHERE task_id = ? AND agent_id = ?', [taskId, agentId]);
|
|
40
|
-
if (result.changes === 0) {
|
|
41
|
-
throw new NotFoundError('Collaborator', `${agentId} on task ${taskId}`);
|
|
42
|
-
}
|
|
43
|
-
this.events.emit('collaborator:removed', { task_id: taskId, agent_id: agentId });
|
|
44
|
-
}
|
|
45
|
-
list(taskId) {
|
|
46
|
-
return this.db.queryAll('SELECT * FROM task_collaborators WHERE task_id = ? ORDER BY added_at ASC', [taskId]);
|
|
47
|
-
}
|
|
48
|
-
listAllByTask() {
|
|
49
|
-
const rows = this.db.queryAll('SELECT * FROM task_collaborators ORDER BY added_at ASC');
|
|
50
|
-
const result = {};
|
|
51
|
-
for (const r of rows) {
|
|
52
|
-
if (!result[r.task_id])
|
|
53
|
-
result[r.task_id] = [];
|
|
54
|
-
result[r.task_id].push(r);
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
getTasksForAgent(agentId) {
|
|
59
|
-
const rows = this.db.queryAll('SELECT task_id FROM task_collaborators WHERE agent_id = ?', [agentId]);
|
|
60
|
-
return rows.map((r) => r.task_id);
|
|
61
|
-
}
|
|
62
|
-
validateAgent(agentId) {
|
|
63
|
-
rejectNullBytes(agentId, 'agent_id');
|
|
64
|
-
rejectControlChars(agentId, 'agent_id');
|
|
65
|
-
if (!agentId.trim())
|
|
66
|
-
throw new ValidationError('Agent ID must not be empty.');
|
|
67
|
-
if (agentId.length > MAX_AGENT_ID_LENGTH) {
|
|
68
|
-
throw new ValidationError(`Agent ID too long (max ${MAX_AGENT_ID_LENGTH} chars).`);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=collaborators.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collaborators.js","sourceRoot":"","sources":["../../src/domain/collaborators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Db } from '../storage/database.js';
|
|
2
|
-
import type { EventBus } from './events.js';
|
|
3
|
-
import type { TaskComment } from '../types.js';
|
|
4
|
-
export declare class CommentService {
|
|
5
|
-
private readonly db;
|
|
6
|
-
private readonly events;
|
|
7
|
-
constructor(db: Db, events: EventBus);
|
|
8
|
-
add(taskId: number, agentId: string, content: string, parentCommentId?: number): TaskComment;
|
|
9
|
-
list(taskId: number, limit?: number, offset?: number): TaskComment[];
|
|
10
|
-
thread(commentId: number): TaskComment[];
|
|
11
|
-
countByTask(): Record<number, number>;
|
|
12
|
-
private validateContent;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=comments.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/domain/comments.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,QAAQ;IAGnC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW;IAgC5F,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,EAAE,MAAM,SAAI,GAAG,WAAW,EAAE;IAO5D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAaxC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IASrC,OAAO,CAAC,eAAe;CAQxB"}
|