@opengoat/core 2026.2.9 → 2026.2.13
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/README.md +3 -3
- package/dist/core/acp/application/acp-agent.js +4 -8
- package/dist/core/acp/application/acp-agent.js.map +1 -1
- package/dist/core/agents/application/agent-manifest.service.d.ts +1 -4
- package/dist/core/agents/application/agent-manifest.service.js +39 -52
- package/dist/core/agents/application/agent-manifest.service.js.map +1 -1
- package/dist/core/agents/application/agent.service.d.ts +42 -4
- package/dist/core/agents/application/agent.service.js +439 -55
- package/dist/core/agents/application/agent.service.js.map +1 -1
- package/dist/core/agents/domain/agent-manifest.d.ts +10 -4
- package/dist/core/agents/domain/agent-manifest.js +118 -25
- package/dist/core/agents/domain/agent-manifest.js.map +1 -1
- package/dist/core/agents/index.d.ts +1 -3
- package/dist/core/agents/index.js +1 -3
- package/dist/core/agents/index.js.map +1 -1
- package/dist/core/boards/application/board.service.d.ts +64 -0
- package/dist/core/boards/application/board.service.js +590 -0
- package/dist/core/boards/application/board.service.js.map +1 -0
- package/dist/core/boards/domain/board.d.ts +30 -0
- package/dist/core/boards/domain/board.js +2 -0
- package/dist/core/boards/domain/board.js.map +1 -0
- package/dist/core/boards/index.d.ts +2 -0
- package/dist/core/boards/index.js +2 -0
- package/dist/core/boards/index.js.map +1 -0
- package/dist/core/bootstrap/application/bootstrap.service.d.ts +1 -2
- package/dist/core/bootstrap/application/bootstrap.service.js +14 -19
- package/dist/core/bootstrap/application/bootstrap.service.js.map +1 -1
- package/dist/core/domain/agent-id.d.ts +1 -1
- package/dist/core/domain/agent-id.js +1 -1
- package/dist/core/domain/agent-id.js.map +1 -1
- package/dist/core/domain/agent.d.ts +31 -8
- package/dist/core/opengoat/application/opengoat.service.d.ts +106 -27
- package/dist/core/opengoat/application/opengoat.service.js +1006 -136
- package/dist/core/opengoat/application/opengoat.service.js.map +1 -1
- package/dist/core/opengoat/index.d.ts +1 -0
- package/dist/core/orchestration/application/orchestration.service.d.ts +8 -21
- package/dist/core/orchestration/application/orchestration.service.js +59 -871
- package/dist/core/orchestration/application/orchestration.service.js.map +1 -1
- package/dist/core/orchestration/application/routing.service.js +10 -8
- package/dist/core/orchestration/application/routing.service.js.map +1 -1
- package/dist/core/orchestration/domain/routing.d.ts +0 -17
- package/dist/core/orchestration/domain/run-events.d.ts +1 -1
- package/dist/core/orchestration/index.d.ts +0 -2
- package/dist/core/orchestration/index.js +0 -1
- package/dist/core/orchestration/index.js.map +1 -1
- package/dist/core/providers/application/provider.service.d.ts +15 -32
- package/dist/core/providers/application/provider.service.js +115 -201
- package/dist/core/providers/application/provider.service.js.map +1 -1
- package/dist/core/providers/cli-provider.d.ts +1 -0
- package/dist/core/providers/cli-provider.js +66 -1
- package/dist/core/providers/cli-provider.js.map +1 -1
- package/dist/core/providers/image-input.d.ts +16 -0
- package/dist/core/providers/image-input.js +158 -0
- package/dist/core/providers/image-input.js.map +1 -0
- package/dist/core/providers/index.d.ts +1 -7
- package/dist/core/providers/index.js +0 -13
- package/dist/core/providers/index.js.map +1 -1
- package/dist/core/providers/loader.js +1 -95
- package/dist/core/providers/loader.js.map +1 -1
- package/dist/core/providers/providers/openclaw/provider.js +213 -32
- package/dist/core/providers/providers/openclaw/provider.js.map +1 -1
- package/dist/core/providers/types.d.ts +8 -3
- package/dist/core/scenarios/application/scenario-runner.service.d.ts +0 -1
- package/dist/core/scenarios/application/scenario-runner.service.js +30 -87
- package/dist/core/scenarios/application/scenario-runner.service.js.map +1 -1
- package/dist/core/scenarios/domain/scenario.d.ts +0 -15
- package/dist/core/sessions/application/session.service.d.ts +10 -4
- package/dist/core/sessions/application/session.service.js +87 -89
- package/dist/core/sessions/application/session.service.js.map +1 -1
- package/dist/core/sessions/domain/session.d.ts +3 -3
- package/dist/core/sessions/domain/transcript.d.ts +1 -1
- package/dist/core/sessions/index.d.ts +1 -1
- package/dist/core/sessions/index.js.map +1 -1
- package/dist/core/skills/application/skill.service.d.ts +2 -3
- package/dist/core/skills/application/skill.service.js +153 -56
- package/dist/core/skills/application/skill.service.js.map +1 -1
- package/dist/core/skills/domain/skill.d.ts +2 -2
- package/dist/core/skills/domain/skill.js +4 -2
- package/dist/core/skills/domain/skill.js.map +1 -1
- package/dist/core/templates/assets/ceo/AGENTS.md +20 -0
- package/dist/core/templates/assets/ceo/ROLE.md +13 -0
- package/dist/core/templates/assets/ceo/SOUL.md +15 -0
- package/dist/core/templates/assets/skills/og-board-individual/SKILL.md +148 -0
- package/dist/core/templates/assets/skills/og-board-manager/SKILL.md +140 -0
- package/dist/core/templates/default-templates.d.ts +12 -14
- package/dist/core/templates/default-templates.js +81 -213
- package/dist/core/templates/default-templates.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/package.json +16 -13
- package/dist/core/agents/application/workspace-context.service.d.ts +0 -28
- package/dist/core/agents/application/workspace-context.service.js +0 -157
- package/dist/core/agents/application/workspace-context.service.js.map +0 -1
- package/dist/core/agents/domain/workspace-context.d.ts +0 -13
- package/dist/core/agents/domain/workspace-context.js +0 -14
- package/dist/core/agents/domain/workspace-context.js.map +0 -1
- package/dist/core/gateway/domain/protocol.d.ts +0 -113
- package/dist/core/gateway/domain/protocol.js +0 -394
- package/dist/core/gateway/domain/protocol.js.map +0 -1
- package/dist/core/gateway/index.d.ts +0 -2
- package/dist/core/gateway/index.js +0 -2
- package/dist/core/gateway/index.js.map +0 -1
- package/dist/core/llm/application/vercel-ai-text-runtime.d.ts +0 -26
- package/dist/core/llm/application/vercel-ai-text-runtime.js +0 -223
- package/dist/core/llm/application/vercel-ai-text-runtime.js.map +0 -1
- package/dist/core/llm/domain/text-runtime.d.ts +0 -22
- package/dist/core/llm/domain/text-runtime.js +0 -2
- package/dist/core/llm/domain/text-runtime.js.map +0 -1
- package/dist/core/llm/index.d.ts +0 -2
- package/dist/core/llm/index.js +0 -2
- package/dist/core/llm/index.js.map +0 -1
- package/dist/core/orchestration/application/orchestration-planner.service.d.ts +0 -28
- package/dist/core/orchestration/application/orchestration-planner.service.js +0 -279
- package/dist/core/orchestration/application/orchestration-planner.service.js.map +0 -1
- package/dist/core/orchestration/domain/loop.d.ts +0 -119
- package/dist/core/orchestration/domain/loop.js +0 -2
- package/dist/core/orchestration/domain/loop.js.map +0 -1
- package/dist/core/plugins/application/plugin.service.d.ts +0 -32
- package/dist/core/plugins/application/plugin.service.js +0 -236
- package/dist/core/plugins/application/plugin.service.js.map +0 -1
- package/dist/core/plugins/domain/openclaw-compat.d.ts +0 -60
- package/dist/core/plugins/domain/openclaw-compat.js +0 -9
- package/dist/core/plugins/domain/openclaw-compat.js.map +0 -1
- package/dist/core/plugins/index.d.ts +0 -3
- package/dist/core/plugins/index.js +0 -3
- package/dist/core/plugins/index.js.map +0 -1
- package/dist/core/providers/onboarding.d.ts +0 -13
- package/dist/core/providers/onboarding.js +0 -149
- package/dist/core/providers/onboarding.js.map +0 -1
- package/dist/core/providers/providers/claude/index.d.ts +0 -4
- package/dist/core/providers/providers/claude/index.js +0 -19
- package/dist/core/providers/providers/claude/index.js.map +0 -1
- package/dist/core/providers/providers/claude/provider.d.ts +0 -8
- package/dist/core/providers/providers/claude/provider.js +0 -106
- package/dist/core/providers/providers/claude/provider.js.map +0 -1
- package/dist/core/providers/providers/codex/index.d.ts +0 -4
- package/dist/core/providers/providers/codex/index.js +0 -19
- package/dist/core/providers/providers/codex/index.js.map +0 -1
- package/dist/core/providers/providers/codex/provider.d.ts +0 -7
- package/dist/core/providers/providers/codex/provider.js +0 -31
- package/dist/core/providers/providers/codex/provider.js.map +0 -1
- package/dist/core/providers/providers/cursor/index.d.ts +0 -4
- package/dist/core/providers/providers/cursor/index.js +0 -19
- package/dist/core/providers/providers/cursor/index.js.map +0 -1
- package/dist/core/providers/providers/cursor/provider.d.ts +0 -11
- package/dist/core/providers/providers/cursor/provider.js +0 -90
- package/dist/core/providers/providers/cursor/provider.js.map +0 -1
- package/dist/core/providers/providers/extended-http/catalog.d.ts +0 -40
- package/dist/core/providers/providers/extended-http/catalog.js +0 -728
- package/dist/core/providers/providers/extended-http/catalog.js.map +0 -1
- package/dist/core/providers/providers/extended-http/index.d.ts +0 -5
- package/dist/core/providers/providers/extended-http/index.js +0 -13
- package/dist/core/providers/providers/extended-http/index.js.map +0 -1
- package/dist/core/providers/providers/extended-http/provider.d.ts +0 -31
- package/dist/core/providers/providers/extended-http/provider.js +0 -580
- package/dist/core/providers/providers/extended-http/provider.js.map +0 -1
- package/dist/core/providers/providers/gemini/index.d.ts +0 -4
- package/dist/core/providers/providers/gemini/index.js +0 -37
- package/dist/core/providers/providers/gemini/index.js.map +0 -1
- package/dist/core/providers/providers/gemini/provider.d.ts +0 -7
- package/dist/core/providers/providers/gemini/provider.js +0 -59
- package/dist/core/providers/providers/gemini/provider.js.map +0 -1
- package/dist/core/providers/providers/grok/index.d.ts +0 -4
- package/dist/core/providers/providers/grok/index.js +0 -41
- package/dist/core/providers/providers/grok/index.js.map +0 -1
- package/dist/core/providers/providers/grok/provider.d.ts +0 -13
- package/dist/core/providers/providers/grok/provider.js +0 -95
- package/dist/core/providers/providers/grok/provider.js.map +0 -1
- package/dist/core/providers/providers/openai/index.d.ts +0 -4
- package/dist/core/providers/providers/openai/index.js +0 -45
- package/dist/core/providers/providers/openai/index.js.map +0 -1
- package/dist/core/providers/providers/openai/provider.d.ts +0 -14
- package/dist/core/providers/providers/openai/provider.js +0 -203
- package/dist/core/providers/providers/openai/provider.js.map +0 -1
- package/dist/core/providers/providers/opencode/index.d.ts +0 -4
- package/dist/core/providers/providers/opencode/index.js +0 -23
- package/dist/core/providers/providers/opencode/index.js.map +0 -1
- package/dist/core/providers/providers/opencode/provider.d.ts +0 -11
- package/dist/core/providers/providers/opencode/provider.js +0 -215
- package/dist/core/providers/providers/opencode/provider.js.map +0 -1
- package/dist/core/providers/providers/openrouter/index.d.ts +0 -4
- package/dist/core/providers/providers/openrouter/index.js +0 -37
- package/dist/core/providers/providers/openrouter/index.js.map +0 -1
- package/dist/core/providers/providers/openrouter/provider.d.ts +0 -13
- package/dist/core/providers/providers/openrouter/provider.js +0 -80
- package/dist/core/providers/providers/openrouter/provider.js.map +0 -1
- package/dist/platform/node/opengoat-gateway-client.d.ts +0 -19
- package/dist/platform/node/opengoat-gateway-client.js +0 -194
- package/dist/platform/node/opengoat-gateway-client.js.map +0 -1
- package/dist/platform/node/opengoat-gateway-server.d.ts +0 -53
- package/dist/platform/node/opengoat-gateway-server.js +0 -906
- package/dist/platform/node/opengoat-gateway-server.js.map +0 -1
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFile as readFileBuffer, stat as statFile, writeFile as writeFileBuffer, } from "node:fs/promises";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import initSqlJs from "sql.js";
|
|
5
|
+
import { DEFAULT_AGENT_ID, normalizeAgentId } from "../../domain/agent-id.js";
|
|
6
|
+
const TASK_STATUSES = ["todo", "doing", "pending", "blocked", "done"];
|
|
7
|
+
const DEFAULT_TASK_PROJECT = "~";
|
|
8
|
+
const MAX_TASK_LIST_LIMIT = 100;
|
|
9
|
+
const INTERNAL_TASK_BUCKET_ID = "tasks";
|
|
10
|
+
const INTERNAL_TASK_BUCKET_TITLE = "Tasks";
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
export class BoardService {
|
|
13
|
+
fileSystem;
|
|
14
|
+
pathPort;
|
|
15
|
+
nowIso;
|
|
16
|
+
agentManifestService;
|
|
17
|
+
sqlPromise;
|
|
18
|
+
dbPromise;
|
|
19
|
+
dbPath;
|
|
20
|
+
dbFileFingerprint;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.fileSystem = deps.fileSystem;
|
|
23
|
+
this.pathPort = deps.pathPort;
|
|
24
|
+
this.nowIso = deps.nowIso;
|
|
25
|
+
this.agentManifestService = deps.agentManifestService;
|
|
26
|
+
}
|
|
27
|
+
async createTask(paths, actorId, options) {
|
|
28
|
+
const db = await this.getDatabase(paths);
|
|
29
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
30
|
+
const title = options.title.trim();
|
|
31
|
+
if (!title) {
|
|
32
|
+
throw new Error("Task title cannot be empty.");
|
|
33
|
+
}
|
|
34
|
+
const description = options.description.trim();
|
|
35
|
+
if (!description) {
|
|
36
|
+
throw new Error("Task description cannot be empty.");
|
|
37
|
+
}
|
|
38
|
+
const assignedTo = normalizeAgentId(options.assignedTo ?? normalizedActorId) ||
|
|
39
|
+
normalizedActorId;
|
|
40
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
41
|
+
const manifestsById = new Map(manifests.map((manifest) => [manifest.agentId, manifest]));
|
|
42
|
+
if (!manifestsById.has(normalizedActorId)) {
|
|
43
|
+
throw new Error(`Agent \"${normalizedActorId}\" does not exist.`);
|
|
44
|
+
}
|
|
45
|
+
if (!manifestsById.has(assignedTo)) {
|
|
46
|
+
throw new Error(`Agent \"${assignedTo}\" does not exist.`);
|
|
47
|
+
}
|
|
48
|
+
const allowedAssignees = collectAssignableAgents(manifests, normalizedActorId);
|
|
49
|
+
if (!allowedAssignees.has(assignedTo)) {
|
|
50
|
+
throw new Error("Agents can only assign tasks to themselves or their reportees (direct or indirect).");
|
|
51
|
+
}
|
|
52
|
+
const status = normalizeTaskStatus(options.status);
|
|
53
|
+
const project = normalizeTaskProject(options.project);
|
|
54
|
+
const taskId = createEntityId(`task-${title}`);
|
|
55
|
+
const createdAt = this.nowIso();
|
|
56
|
+
this.execute(db, `INSERT INTO tasks (
|
|
57
|
+
task_id,
|
|
58
|
+
board_id,
|
|
59
|
+
created_at,
|
|
60
|
+
project,
|
|
61
|
+
owner_agent_id,
|
|
62
|
+
assigned_to_agent_id,
|
|
63
|
+
title,
|
|
64
|
+
description,
|
|
65
|
+
status,
|
|
66
|
+
status_reason
|
|
67
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
68
|
+
taskId,
|
|
69
|
+
INTERNAL_TASK_BUCKET_ID,
|
|
70
|
+
createdAt,
|
|
71
|
+
project,
|
|
72
|
+
normalizedActorId,
|
|
73
|
+
assignedTo,
|
|
74
|
+
title,
|
|
75
|
+
description,
|
|
76
|
+
status,
|
|
77
|
+
null,
|
|
78
|
+
]);
|
|
79
|
+
await this.persistDatabase(paths, db);
|
|
80
|
+
return this.requireTask(db, taskId);
|
|
81
|
+
}
|
|
82
|
+
async listTasks(paths, options = {}) {
|
|
83
|
+
const db = await this.getDatabase(paths);
|
|
84
|
+
const limit = resolveTaskListLimit(options.limit);
|
|
85
|
+
const assignee = normalizeOptionalAssignee(options.assignee);
|
|
86
|
+
const rows = assignee
|
|
87
|
+
? this.queryAll(db, `SELECT task_id, board_id, created_at, project, owner_agent_id, assigned_to_agent_id, title, description, status, status_reason
|
|
88
|
+
FROM tasks
|
|
89
|
+
WHERE assigned_to_agent_id = ?
|
|
90
|
+
ORDER BY created_at DESC, task_id DESC
|
|
91
|
+
LIMIT ?`, [assignee, limit])
|
|
92
|
+
: this.queryAll(db, `SELECT task_id, board_id, created_at, project, owner_agent_id, assigned_to_agent_id, title, description, status, status_reason
|
|
93
|
+
FROM tasks
|
|
94
|
+
ORDER BY created_at DESC, task_id DESC
|
|
95
|
+
LIMIT ?`, [limit]);
|
|
96
|
+
return this.hydrateTaskRows(db, rows);
|
|
97
|
+
}
|
|
98
|
+
async listLatestTasks(paths, options = {}) {
|
|
99
|
+
return this.listTasks(paths, options);
|
|
100
|
+
}
|
|
101
|
+
async listLatestTasksPage(paths, options = {}) {
|
|
102
|
+
const db = await this.getDatabase(paths);
|
|
103
|
+
const limit = resolveTaskListLimit(options.limit);
|
|
104
|
+
const offset = Math.max(0, options.offset ?? 0);
|
|
105
|
+
const assignee = normalizeOptionalAssignee(options.assignee);
|
|
106
|
+
const owner = options.owner
|
|
107
|
+
? normalizeEntityId(options.owner, "owner")
|
|
108
|
+
: undefined;
|
|
109
|
+
const status = options.status?.trim() || undefined;
|
|
110
|
+
const conditions = [];
|
|
111
|
+
const params = [];
|
|
112
|
+
if (assignee) {
|
|
113
|
+
conditions.push("assigned_to_agent_id = ?");
|
|
114
|
+
params.push(assignee);
|
|
115
|
+
}
|
|
116
|
+
if (owner) {
|
|
117
|
+
conditions.push("owner_agent_id = ?");
|
|
118
|
+
params.push(owner);
|
|
119
|
+
}
|
|
120
|
+
if (status) {
|
|
121
|
+
conditions.push("status = ?");
|
|
122
|
+
params.push(status);
|
|
123
|
+
}
|
|
124
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
125
|
+
const countRow = this.queryOne(db, `SELECT COUNT(*) as count FROM tasks ${whereClause}`, params);
|
|
126
|
+
const total = countRow?.count ?? 0;
|
|
127
|
+
const rows = this.queryAll(db, `SELECT task_id, board_id, created_at, project, owner_agent_id, assigned_to_agent_id, title, description, status, status_reason
|
|
128
|
+
FROM tasks
|
|
129
|
+
${whereClause}
|
|
130
|
+
ORDER BY created_at DESC, task_id DESC
|
|
131
|
+
LIMIT ? OFFSET ?`, [...params, limit, offset]);
|
|
132
|
+
const tasks = this.hydrateTaskRows(db, rows);
|
|
133
|
+
return {
|
|
134
|
+
tasks,
|
|
135
|
+
total,
|
|
136
|
+
limit,
|
|
137
|
+
offset,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
async getTask(paths, taskId) {
|
|
141
|
+
const db = await this.getDatabase(paths);
|
|
142
|
+
const resolvedTaskId = this.resolveTaskId(db, taskId);
|
|
143
|
+
return this.requireTask(db, resolvedTaskId);
|
|
144
|
+
}
|
|
145
|
+
async deleteTasks(paths, actorId, taskIds) {
|
|
146
|
+
const db = await this.getDatabase(paths);
|
|
147
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
148
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
149
|
+
const seenTaskIds = new Set();
|
|
150
|
+
const resolvedTaskIds = [];
|
|
151
|
+
for (const taskId of taskIds) {
|
|
152
|
+
const normalizedTaskId = taskId.trim();
|
|
153
|
+
if (!normalizedTaskId) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const resolvedTaskId = this.resolveTaskId(db, normalizedTaskId);
|
|
157
|
+
if (seenTaskIds.has(resolvedTaskId)) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const task = this.requireTask(db, resolvedTaskId);
|
|
161
|
+
this.assertTaskUpdatePermission(task, normalizedActorId, manifests);
|
|
162
|
+
seenTaskIds.add(resolvedTaskId);
|
|
163
|
+
resolvedTaskIds.push(resolvedTaskId);
|
|
164
|
+
}
|
|
165
|
+
if (resolvedTaskIds.length === 0) {
|
|
166
|
+
return {
|
|
167
|
+
deletedTaskIds: [],
|
|
168
|
+
deletedCount: 0,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const placeholders = resolvedTaskIds.map(() => "?").join(", ");
|
|
172
|
+
this.execute(db, `DELETE FROM tasks WHERE task_id IN (${placeholders})`, resolvedTaskIds);
|
|
173
|
+
await this.persistDatabase(paths, db);
|
|
174
|
+
return {
|
|
175
|
+
deletedTaskIds: resolvedTaskIds,
|
|
176
|
+
deletedCount: resolvedTaskIds.length,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
async updateTaskStatus(paths, actorId, taskId, status, reason) {
|
|
180
|
+
const db = await this.getDatabase(paths);
|
|
181
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
182
|
+
const resolvedTaskId = this.resolveTaskId(db, taskId);
|
|
183
|
+
const task = this.requireTask(db, resolvedTaskId);
|
|
184
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
185
|
+
this.assertTaskUpdatePermission(task, normalizedActorId, manifests);
|
|
186
|
+
const nextStatus = normalizeTaskStatus(status, true);
|
|
187
|
+
const nextStatusReason = normalizeTaskStatusReason(nextStatus, reason);
|
|
188
|
+
this.execute(db, `UPDATE tasks SET status = ?, status_reason = ? WHERE task_id = ?`, [nextStatus, nextStatusReason, resolvedTaskId]);
|
|
189
|
+
await this.persistDatabase(paths, db);
|
|
190
|
+
return this.requireTask(db, resolvedTaskId);
|
|
191
|
+
}
|
|
192
|
+
async addTaskBlocker(paths, actorId, taskId, blocker) {
|
|
193
|
+
const db = await this.getDatabase(paths);
|
|
194
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
195
|
+
const resolvedTaskId = this.resolveTaskId(db, taskId);
|
|
196
|
+
const content = blocker.trim();
|
|
197
|
+
if (!content) {
|
|
198
|
+
throw new Error("Blocker content cannot be empty.");
|
|
199
|
+
}
|
|
200
|
+
const task = this.requireTask(db, resolvedTaskId);
|
|
201
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
202
|
+
this.assertTaskUpdatePermission(task, normalizedActorId, manifests);
|
|
203
|
+
this.execute(db, `INSERT INTO task_blockers (task_id, created_at, created_by_agent_id, content)
|
|
204
|
+
VALUES (?, ?, ?, ?)`, [resolvedTaskId, this.nowIso(), normalizedActorId, content]);
|
|
205
|
+
await this.persistDatabase(paths, db);
|
|
206
|
+
return this.requireTask(db, resolvedTaskId);
|
|
207
|
+
}
|
|
208
|
+
async addTaskArtifact(paths, actorId, taskId, content) {
|
|
209
|
+
const db = await this.getDatabase(paths);
|
|
210
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
211
|
+
const resolvedTaskId = this.resolveTaskId(db, taskId);
|
|
212
|
+
const cleaned = content.trim();
|
|
213
|
+
if (!cleaned) {
|
|
214
|
+
throw new Error("Artifact content cannot be empty.");
|
|
215
|
+
}
|
|
216
|
+
const task = this.requireTask(db, resolvedTaskId);
|
|
217
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
218
|
+
this.assertTaskUpdatePermission(task, normalizedActorId, manifests);
|
|
219
|
+
this.execute(db, `INSERT INTO task_artifacts (task_id, created_at, created_by_agent_id, content)
|
|
220
|
+
VALUES (?, ?, ?, ?)`, [resolvedTaskId, this.nowIso(), normalizedActorId, cleaned]);
|
|
221
|
+
await this.persistDatabase(paths, db);
|
|
222
|
+
return this.requireTask(db, resolvedTaskId);
|
|
223
|
+
}
|
|
224
|
+
async addTaskWorklog(paths, actorId, taskId, content) {
|
|
225
|
+
const db = await this.getDatabase(paths);
|
|
226
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
227
|
+
const resolvedTaskId = this.resolveTaskId(db, taskId);
|
|
228
|
+
const cleaned = content.trim();
|
|
229
|
+
if (!cleaned) {
|
|
230
|
+
throw new Error("Worklog content cannot be empty.");
|
|
231
|
+
}
|
|
232
|
+
const task = this.requireTask(db, resolvedTaskId);
|
|
233
|
+
const manifests = await this.agentManifestService.listManifests(paths);
|
|
234
|
+
this.assertTaskUpdatePermission(task, normalizedActorId, manifests);
|
|
235
|
+
this.execute(db, `INSERT INTO task_worklog (task_id, created_at, created_by_agent_id, content)
|
|
236
|
+
VALUES (?, ?, ?, ?)`, [resolvedTaskId, this.nowIso(), normalizedActorId, cleaned]);
|
|
237
|
+
await this.persistDatabase(paths, db);
|
|
238
|
+
return this.requireTask(db, resolvedTaskId);
|
|
239
|
+
}
|
|
240
|
+
assertTaskUpdatePermission(task, actorId, manifests) {
|
|
241
|
+
if (task.owner === actorId || task.assignedTo === actorId) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const reportees = collectAssignableAgents(manifests, actorId);
|
|
245
|
+
if (reportees.has(task.owner) || reportees.has(task.assignedTo)) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
throw new Error("Agents can only update their own tasks or tasks owned/assigned to their reportees (direct or indirect).");
|
|
249
|
+
}
|
|
250
|
+
hydrateTaskRows(db, rows) {
|
|
251
|
+
const tasks = [];
|
|
252
|
+
for (const row of rows) {
|
|
253
|
+
tasks.push(this.hydrateTaskRow(db, row));
|
|
254
|
+
}
|
|
255
|
+
return tasks;
|
|
256
|
+
}
|
|
257
|
+
requireTask(db, taskId) {
|
|
258
|
+
const row = this.queryOne(db, `SELECT task_id, board_id, created_at, project, owner_agent_id, assigned_to_agent_id, title, description, status, status_reason
|
|
259
|
+
FROM tasks
|
|
260
|
+
WHERE task_id = ?`, [taskId]);
|
|
261
|
+
if (!row) {
|
|
262
|
+
throw new Error(`Task \"${taskId}\" does not exist.`);
|
|
263
|
+
}
|
|
264
|
+
return this.hydrateTaskRow(db, row);
|
|
265
|
+
}
|
|
266
|
+
resolveTaskId(db, taskId) {
|
|
267
|
+
const normalizedTaskId = normalizeEntityId(taskId, "task id");
|
|
268
|
+
const exactMatch = this.queryOne(db, `SELECT task_id
|
|
269
|
+
FROM tasks
|
|
270
|
+
WHERE task_id = ?`, [normalizedTaskId]);
|
|
271
|
+
if (exactMatch?.task_id) {
|
|
272
|
+
return exactMatch.task_id;
|
|
273
|
+
}
|
|
274
|
+
const caseInsensitiveMatches = this.queryAll(db, `SELECT task_id
|
|
275
|
+
FROM tasks
|
|
276
|
+
WHERE task_id = ? COLLATE NOCASE
|
|
277
|
+
ORDER BY task_id ASC`, [normalizedTaskId]);
|
|
278
|
+
if (caseInsensitiveMatches.length === 0) {
|
|
279
|
+
throw new Error(`Task \"${normalizedTaskId}\" does not exist.`);
|
|
280
|
+
}
|
|
281
|
+
if (caseInsensitiveMatches.length > 1) {
|
|
282
|
+
throw new Error(`Task id \"${normalizedTaskId}\" is ambiguous by case. Use exact task id.`);
|
|
283
|
+
}
|
|
284
|
+
return caseInsensitiveMatches[0].task_id;
|
|
285
|
+
}
|
|
286
|
+
hydrateTaskRow(db, row) {
|
|
287
|
+
const blockersRows = this.queryAll(db, `SELECT created_at, created_by_agent_id, content
|
|
288
|
+
FROM task_blockers
|
|
289
|
+
WHERE task_id = ?
|
|
290
|
+
ORDER BY id ASC`, [row.task_id]);
|
|
291
|
+
const artifactsRows = this.queryAll(db, `SELECT created_at, created_by_agent_id, content
|
|
292
|
+
FROM task_artifacts
|
|
293
|
+
WHERE task_id = ?
|
|
294
|
+
ORDER BY id ASC`, [row.task_id]);
|
|
295
|
+
const worklogRows = this.queryAll(db, `SELECT created_at, created_by_agent_id, content
|
|
296
|
+
FROM task_worklog
|
|
297
|
+
WHERE task_id = ?
|
|
298
|
+
ORDER BY id ASC`, [row.task_id]);
|
|
299
|
+
return {
|
|
300
|
+
taskId: row.task_id,
|
|
301
|
+
createdAt: row.created_at,
|
|
302
|
+
project: row.project || DEFAULT_TASK_PROJECT,
|
|
303
|
+
owner: row.owner_agent_id,
|
|
304
|
+
assignedTo: row.assigned_to_agent_id,
|
|
305
|
+
title: row.title,
|
|
306
|
+
description: row.description,
|
|
307
|
+
status: row.status,
|
|
308
|
+
statusReason: row.status_reason?.trim() || undefined,
|
|
309
|
+
blockers: blockersRows.map((entry) => entry.content),
|
|
310
|
+
artifacts: artifactsRows.map((entry) => toTaskEntry(entry)),
|
|
311
|
+
worklog: worklogRows.map((entry) => toTaskEntry(entry)),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async getDatabase(paths) {
|
|
315
|
+
const dbPath = this.pathPort.join(paths.homeDir, "boards.sqlite");
|
|
316
|
+
const pathChanged = this.dbPath !== dbPath;
|
|
317
|
+
const diskFingerprint = await this.readDbFileFingerprint(dbPath);
|
|
318
|
+
const fileChangedExternally = !pathChanged &&
|
|
319
|
+
Boolean(this.dbPromise) &&
|
|
320
|
+
this.dbFileFingerprint !== undefined &&
|
|
321
|
+
this.dbFileFingerprint !== diskFingerprint;
|
|
322
|
+
if (!this.dbPromise || pathChanged || fileChangedExternally) {
|
|
323
|
+
this.dbPath = dbPath;
|
|
324
|
+
this.dbFileFingerprint = diskFingerprint;
|
|
325
|
+
this.dbPromise = this.openAndMigrate(dbPath, paths);
|
|
326
|
+
}
|
|
327
|
+
return this.dbPromise;
|
|
328
|
+
}
|
|
329
|
+
async openAndMigrate(dbPath, paths) {
|
|
330
|
+
await this.fileSystem.ensureDir(paths.homeDir);
|
|
331
|
+
const SQL = await this.getSqlJs();
|
|
332
|
+
const exists = await this.fileSystem.exists(dbPath);
|
|
333
|
+
const db = exists
|
|
334
|
+
? new SQL.Database(new Uint8Array(await readFileBuffer(dbPath)))
|
|
335
|
+
: new SQL.Database();
|
|
336
|
+
this.execute(db, "PRAGMA foreign_keys = ON;");
|
|
337
|
+
this.execute(db, `CREATE TABLE IF NOT EXISTS boards (
|
|
338
|
+
board_id TEXT PRIMARY KEY,
|
|
339
|
+
title TEXT NOT NULL,
|
|
340
|
+
created_at TEXT NOT NULL,
|
|
341
|
+
owner_agent_id TEXT NOT NULL,
|
|
342
|
+
is_default INTEGER NOT NULL DEFAULT 0
|
|
343
|
+
);`);
|
|
344
|
+
this.ensureBoardDefaultColumn(db);
|
|
345
|
+
this.ensureInternalTaskBucket(db);
|
|
346
|
+
this.execute(db, `CREATE TABLE IF NOT EXISTS tasks (
|
|
347
|
+
task_id TEXT PRIMARY KEY,
|
|
348
|
+
board_id TEXT NOT NULL,
|
|
349
|
+
created_at TEXT NOT NULL,
|
|
350
|
+
project TEXT NOT NULL DEFAULT '${DEFAULT_TASK_PROJECT}',
|
|
351
|
+
owner_agent_id TEXT NOT NULL,
|
|
352
|
+
assigned_to_agent_id TEXT NOT NULL,
|
|
353
|
+
title TEXT NOT NULL,
|
|
354
|
+
description TEXT NOT NULL,
|
|
355
|
+
status TEXT NOT NULL,
|
|
356
|
+
status_reason TEXT,
|
|
357
|
+
FOREIGN KEY(board_id) REFERENCES boards(board_id) ON DELETE CASCADE
|
|
358
|
+
);`);
|
|
359
|
+
this.ensureTaskProjectColumn(db);
|
|
360
|
+
this.ensureTaskStatusReasonColumn(db);
|
|
361
|
+
this.execute(db, `CREATE TABLE IF NOT EXISTS task_blockers (
|
|
362
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
363
|
+
task_id TEXT NOT NULL,
|
|
364
|
+
created_at TEXT NOT NULL,
|
|
365
|
+
created_by_agent_id TEXT NOT NULL,
|
|
366
|
+
content TEXT NOT NULL,
|
|
367
|
+
FOREIGN KEY(task_id) REFERENCES tasks(task_id) ON DELETE CASCADE
|
|
368
|
+
);`);
|
|
369
|
+
this.execute(db, `CREATE TABLE IF NOT EXISTS task_artifacts (
|
|
370
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
371
|
+
task_id TEXT NOT NULL,
|
|
372
|
+
created_at TEXT NOT NULL,
|
|
373
|
+
created_by_agent_id TEXT NOT NULL,
|
|
374
|
+
content TEXT NOT NULL,
|
|
375
|
+
FOREIGN KEY(task_id) REFERENCES tasks(task_id) ON DELETE CASCADE
|
|
376
|
+
);`);
|
|
377
|
+
this.execute(db, `CREATE TABLE IF NOT EXISTS task_worklog (
|
|
378
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
379
|
+
task_id TEXT NOT NULL,
|
|
380
|
+
created_at TEXT NOT NULL,
|
|
381
|
+
created_by_agent_id TEXT NOT NULL,
|
|
382
|
+
content TEXT NOT NULL,
|
|
383
|
+
FOREIGN KEY(task_id) REFERENCES tasks(task_id) ON DELETE CASCADE
|
|
384
|
+
);`);
|
|
385
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_tasks_board_id ON tasks(board_id);");
|
|
386
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);");
|
|
387
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_tasks_created_at ON tasks(created_at, task_id);");
|
|
388
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_tasks_assignee_created_at ON tasks(assigned_to_agent_id, created_at, task_id);");
|
|
389
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_task_blockers_task_id ON task_blockers(task_id);");
|
|
390
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_task_artifacts_task_id ON task_artifacts(task_id);");
|
|
391
|
+
this.execute(db, "CREATE INDEX IF NOT EXISTS idx_task_worklog_task_id ON task_worklog(task_id);");
|
|
392
|
+
await this.persistDatabase(paths, db);
|
|
393
|
+
return db;
|
|
394
|
+
}
|
|
395
|
+
ensureInternalTaskBucket(db) {
|
|
396
|
+
const existing = this.queryOne(db, `SELECT board_id, title, created_at, owner_agent_id, is_default
|
|
397
|
+
FROM boards
|
|
398
|
+
WHERE board_id = ?`, [INTERNAL_TASK_BUCKET_ID]);
|
|
399
|
+
if (existing) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
this.execute(db, `INSERT INTO boards (board_id, title, created_at, owner_agent_id, is_default)
|
|
403
|
+
VALUES (?, ?, ?, ?, 0)`, [
|
|
404
|
+
INTERNAL_TASK_BUCKET_ID,
|
|
405
|
+
INTERNAL_TASK_BUCKET_TITLE,
|
|
406
|
+
this.nowIso(),
|
|
407
|
+
DEFAULT_AGENT_ID,
|
|
408
|
+
]);
|
|
409
|
+
}
|
|
410
|
+
async getSqlJs() {
|
|
411
|
+
if (!this.sqlPromise) {
|
|
412
|
+
const wasmPath = require.resolve("sql.js/dist/sql-wasm.wasm");
|
|
413
|
+
this.sqlPromise = initSqlJs({
|
|
414
|
+
locateFile: () => wasmPath,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
return this.sqlPromise;
|
|
418
|
+
}
|
|
419
|
+
async persistDatabase(paths, db) {
|
|
420
|
+
const dbPath = this.pathPort.join(paths.homeDir, "boards.sqlite");
|
|
421
|
+
const data = db.export();
|
|
422
|
+
await writeFileBuffer(dbPath, data);
|
|
423
|
+
if (this.dbPath === dbPath) {
|
|
424
|
+
this.dbFileFingerprint = await this.readDbFileFingerprint(dbPath);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async readDbFileFingerprint(dbPath) {
|
|
428
|
+
try {
|
|
429
|
+
const fileStats = await statFile(dbPath);
|
|
430
|
+
return `${fileStats.size}:${fileStats.mtimeMs}`;
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
if (isNotFound(error)) {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
throw error;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
execute(db, sql, params = []) {
|
|
440
|
+
const statement = db.prepare(sql);
|
|
441
|
+
statement.bind(params);
|
|
442
|
+
while (statement.step()) {
|
|
443
|
+
// no-op
|
|
444
|
+
}
|
|
445
|
+
statement.free();
|
|
446
|
+
}
|
|
447
|
+
queryAll(db, sql, params = []) {
|
|
448
|
+
const statement = db.prepare(sql);
|
|
449
|
+
statement.bind(params);
|
|
450
|
+
const rows = [];
|
|
451
|
+
while (statement.step()) {
|
|
452
|
+
rows.push(statement.getAsObject());
|
|
453
|
+
}
|
|
454
|
+
statement.free();
|
|
455
|
+
return rows;
|
|
456
|
+
}
|
|
457
|
+
queryOne(db, sql, params = []) {
|
|
458
|
+
const all = this.queryAll(db, sql, params);
|
|
459
|
+
return all[0];
|
|
460
|
+
}
|
|
461
|
+
ensureTaskProjectColumn(db) {
|
|
462
|
+
const columns = this.queryAll(db, "PRAGMA table_info(tasks);");
|
|
463
|
+
const hasProject = columns.some((column) => column.name === "project");
|
|
464
|
+
if (hasProject) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
this.execute(db, `ALTER TABLE tasks ADD COLUMN project TEXT NOT NULL DEFAULT '${DEFAULT_TASK_PROJECT}';`);
|
|
468
|
+
const hasWorkspace = columns.some((column) => column.name === "workspace");
|
|
469
|
+
if (hasWorkspace) {
|
|
470
|
+
this.execute(db, `UPDATE tasks
|
|
471
|
+
SET project = workspace
|
|
472
|
+
WHERE workspace IS NOT NULL
|
|
473
|
+
AND TRIM(workspace) <> '';`);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
ensureTaskStatusReasonColumn(db) {
|
|
477
|
+
const columns = this.queryAll(db, "PRAGMA table_info(tasks);");
|
|
478
|
+
const hasStatusReason = columns.some((column) => column.name === "status_reason");
|
|
479
|
+
if (hasStatusReason) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
this.execute(db, "ALTER TABLE tasks ADD COLUMN status_reason TEXT;");
|
|
483
|
+
}
|
|
484
|
+
ensureBoardDefaultColumn(db) {
|
|
485
|
+
const columns = this.queryAll(db, "PRAGMA table_info(boards);");
|
|
486
|
+
const hasDefaultColumn = columns.some((column) => column.name === "is_default");
|
|
487
|
+
if (hasDefaultColumn) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
this.execute(db, "ALTER TABLE boards ADD COLUMN is_default INTEGER NOT NULL DEFAULT 0;");
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
function normalizeEntityId(value, label) {
|
|
494
|
+
const normalized = normalizeAgentId(value);
|
|
495
|
+
if (!normalized) {
|
|
496
|
+
throw new Error(`${label} cannot be empty.`);
|
|
497
|
+
}
|
|
498
|
+
return normalized;
|
|
499
|
+
}
|
|
500
|
+
function normalizeTaskStatus(rawStatus, allowEmpty = false) {
|
|
501
|
+
const normalized = (rawStatus?.trim().toLowerCase() || (allowEmpty ? "" : TASK_STATUSES[0])).trim();
|
|
502
|
+
if (!normalized) {
|
|
503
|
+
throw new Error("Task status cannot be empty.");
|
|
504
|
+
}
|
|
505
|
+
if (!TASK_STATUSES.includes(normalized)) {
|
|
506
|
+
throw new Error(`Task status must be one of: ${TASK_STATUSES.join(", ")}.`);
|
|
507
|
+
}
|
|
508
|
+
return normalized;
|
|
509
|
+
}
|
|
510
|
+
function normalizeTaskStatusReason(status, rawReason) {
|
|
511
|
+
const reason = rawReason?.trim();
|
|
512
|
+
if ((status === "pending" || status === "blocked") && !reason) {
|
|
513
|
+
throw new Error(`Reason is required when task status is \"${status}\".`);
|
|
514
|
+
}
|
|
515
|
+
return reason || null;
|
|
516
|
+
}
|
|
517
|
+
function normalizeTaskProject(rawProject) {
|
|
518
|
+
const normalized = rawProject?.trim();
|
|
519
|
+
if (!normalized) {
|
|
520
|
+
return DEFAULT_TASK_PROJECT;
|
|
521
|
+
}
|
|
522
|
+
return normalized;
|
|
523
|
+
}
|
|
524
|
+
function toTaskEntry(row) {
|
|
525
|
+
return {
|
|
526
|
+
createdAt: row.created_at,
|
|
527
|
+
createdBy: row.created_by_agent_id,
|
|
528
|
+
content: row.content,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
function createEntityId(prefixSource) {
|
|
532
|
+
const prefix = normalizeAgentId(prefixSource) || "item";
|
|
533
|
+
return `${prefix}-${randomUUID().slice(0, 8)}`;
|
|
534
|
+
}
|
|
535
|
+
function resolveTaskListLimit(rawLimit) {
|
|
536
|
+
if (!Number.isFinite(rawLimit)) {
|
|
537
|
+
return MAX_TASK_LIST_LIMIT;
|
|
538
|
+
}
|
|
539
|
+
const parsedLimit = Math.trunc(rawLimit ?? MAX_TASK_LIST_LIMIT);
|
|
540
|
+
if (parsedLimit <= 0) {
|
|
541
|
+
return 1;
|
|
542
|
+
}
|
|
543
|
+
return Math.min(parsedLimit, MAX_TASK_LIST_LIMIT);
|
|
544
|
+
}
|
|
545
|
+
function normalizeOptionalAssignee(rawAssignee) {
|
|
546
|
+
if (rawAssignee === undefined) {
|
|
547
|
+
return undefined;
|
|
548
|
+
}
|
|
549
|
+
const normalized = normalizeAgentId(rawAssignee);
|
|
550
|
+
if (!normalized) {
|
|
551
|
+
throw new Error("assignee cannot be empty.");
|
|
552
|
+
}
|
|
553
|
+
return normalized;
|
|
554
|
+
}
|
|
555
|
+
function collectAssignableAgents(manifests, actorId) {
|
|
556
|
+
const normalizedActorId = normalizeAgentId(actorId) || DEFAULT_AGENT_ID;
|
|
557
|
+
const directReporteesByManager = new Map();
|
|
558
|
+
for (const manifest of manifests) {
|
|
559
|
+
const managerId = normalizeAgentId(manifest.metadata.reportsTo ?? "");
|
|
560
|
+
if (!managerId) {
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
563
|
+
const reportees = directReporteesByManager.get(managerId) ?? [];
|
|
564
|
+
reportees.push(manifest.agentId);
|
|
565
|
+
directReporteesByManager.set(managerId, reportees);
|
|
566
|
+
}
|
|
567
|
+
const allowed = new Set([normalizedActorId]);
|
|
568
|
+
const queue = [...(directReporteesByManager.get(normalizedActorId) ?? [])];
|
|
569
|
+
while (queue.length > 0) {
|
|
570
|
+
const current = queue.shift();
|
|
571
|
+
if (!current || allowed.has(current)) {
|
|
572
|
+
continue;
|
|
573
|
+
}
|
|
574
|
+
allowed.add(current);
|
|
575
|
+
const nested = directReporteesByManager.get(current) ?? [];
|
|
576
|
+
for (const reporteeId of nested) {
|
|
577
|
+
if (!allowed.has(reporteeId)) {
|
|
578
|
+
queue.push(reporteeId);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
return allowed;
|
|
583
|
+
}
|
|
584
|
+
function isNotFound(error) {
|
|
585
|
+
if (typeof error !== "object" || error === null) {
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
return error.code === "ENOENT";
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=board.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.service.js","sourceRoot":"","sources":["../../../../src/core/boards/application/board.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface TaskEntry {
|
|
2
|
+
createdAt: string;
|
|
3
|
+
createdBy: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TaskRecord {
|
|
7
|
+
taskId: string;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
project: string;
|
|
10
|
+
owner: string;
|
|
11
|
+
assignedTo: string;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
status: string;
|
|
15
|
+
statusReason?: string;
|
|
16
|
+
blockers: string[];
|
|
17
|
+
artifacts: TaskEntry[];
|
|
18
|
+
worklog: TaskEntry[];
|
|
19
|
+
}
|
|
20
|
+
export interface CreateTaskOptions {
|
|
21
|
+
title: string;
|
|
22
|
+
description: string;
|
|
23
|
+
project?: string;
|
|
24
|
+
assignedTo?: string;
|
|
25
|
+
status?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ListTasksOptions {
|
|
28
|
+
assignee?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../../src/core/boards/domain/board.ts"],"names":[],"mappings":""}
|