@rk0429/agentic-relay 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,15 +1,18 @@
1
1
  # agentic-relay
2
2
 
3
3
  `agentic-relay` is a TypeScript MCP server that launches Claude Code, Codex CLI,
4
- and Gemini CLI through a single `spawn_agents` tool.
4
+ and Gemini CLI through a single MCP endpoint. It now exposes both agent
5
+ execution tools and Phase 2 task management tools.
5
6
 
6
7
  ## Current scope
7
8
 
8
9
  - Phase 1 foundation from `docs/requirements.md`
10
+ - Phase 2 task management from `docs/requirements.md`
9
11
  - `relay mcp serve` over stdio
10
12
  - Parallel `spawn_agents`
11
13
  - Backend routing, depth guard, response persistence, and session metadata
12
14
  - Automatic cross-backend handoff when `session_id` is resumed with a different backend
15
+ - Task CRUD, status transitions, dependency resolution, review flow, and `spawn_agents`/`task_id` linkage
13
16
 
14
17
  ## Usage
15
18
 
@@ -21,6 +24,17 @@ pnpm relay mcp serve
21
24
 
22
25
  Responses are stored under `.relay/` in the current working directory.
23
26
 
27
+ ## MCP Tools
28
+
29
+ - `spawn_agents`
30
+ - `create_task`
31
+ - `update_task_status`
32
+ - `assign_agent`
33
+ - `list_tasks`
34
+ - `get_task`
35
+ - `update_task`
36
+ - `delete_task`
37
+
24
38
  ## Use From This Workspace
25
39
 
26
40
  This workspace is configured to consume the published package via
@@ -1,4 +1,5 @@
1
1
  import type { SpawnAgentResult, SpawnAgentsInput } from "../core/types.js";
2
+ import { TaskService } from "./task-service.js";
2
3
  import { BackendRegistry } from "../infrastructure/backends/backend-registry.js";
3
4
  import { CliBackendExecutor } from "../infrastructure/backends/cli-backend-executor.js";
4
5
  import { RelayStore } from "../infrastructure/store/relay-store.js";
@@ -8,6 +9,7 @@ export declare class SpawnAgentsService {
8
9
  backendRegistry: BackendRegistry;
9
10
  backendExecutor: Pick<CliBackendExecutor, "execute">;
10
11
  store: RelayStore;
12
+ taskService?: Pick<TaskService, "onAgentSpawned" | "onAgentCompleted" | "onAgentFailed">;
11
13
  cwd: string;
12
14
  env?: NodeJS.ProcessEnv;
13
15
  });
@@ -75,6 +75,13 @@ export class SpawnAgentsService {
75
75
  },
76
76
  }));
77
77
  }
78
+ if (agent.task_id) {
79
+ await this.dependencies.taskService?.onAgentSpawned({
80
+ taskId: agent.task_id,
81
+ sessionId: relaySessionId,
82
+ backend: routing.resolved,
83
+ });
84
+ }
78
85
  const executionResult = await this.dependencies.backendExecutor.execute({
79
86
  relaySessionId,
80
87
  backend: routing.resolved,
@@ -89,6 +96,7 @@ export class SpawnAgentsService {
89
96
  ...(this.dependencies.env ?? {}),
90
97
  RELAY_CALL_DEPTH: String(currentDepth + 1),
91
98
  RELAY_MAX_DEPTH: String(maxDepth),
99
+ RELAY_AGENT_ID: relaySessionId,
92
100
  RELAY_ALLOW_SPAWN_AGENTS: agent.task_type === "orchestration" ? "1" : "0",
93
101
  },
94
102
  signal,
@@ -109,6 +117,7 @@ export class SpawnAgentsService {
109
117
  return await this.persistFailure({
110
118
  relaySessionId,
111
119
  agent,
120
+ taskService: this.dependencies.taskService,
112
121
  error,
113
122
  });
114
123
  }
@@ -134,6 +143,13 @@ export class SpawnAgentsService {
134
143
  eventType: "agent_completed",
135
144
  status: "success",
136
145
  }));
146
+ if (options.agent.task_id) {
147
+ await this.dependencies.taskService?.onAgentCompleted({
148
+ taskId: options.agent.task_id,
149
+ sessionId: options.relaySessionId,
150
+ backend: options.backend,
151
+ });
152
+ }
137
153
  return {
138
154
  session_id: options.relaySessionId,
139
155
  backend: options.backend,
@@ -158,6 +174,14 @@ export class SpawnAgentsService {
158
174
  error: message,
159
175
  },
160
176
  }));
177
+ if (options.agent.task_id) {
178
+ await options.taskService?.onAgentFailed({
179
+ taskId: options.agent.task_id,
180
+ sessionId: options.relaySessionId,
181
+ backend: options.agent.backend,
182
+ message,
183
+ });
184
+ }
161
185
  return {
162
186
  session_id: options.relaySessionId,
163
187
  backend,
@@ -1 +1 @@
1
- {"version":3,"file":"spawn-agents-service.js","sourceRoot":"","sources":["../../src/application/spawn-agents-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn-agents-service.js","sourceRoot":"","sources":["../../src/application/spawn-agents-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AgentLifecycleTaskEvent, AssignAgentInput, CreateTaskInput, DeleteTaskInput, DeleteTaskResult, ListTasksInput, TaskDetail, TaskMutationContext, TaskSummary, UpdateTaskInput, UpdateTaskStatusInput } from "../core/types.js";
2
+ import { RelayStore } from "../infrastructure/store/relay-store.js";
3
+ export declare class TaskService {
4
+ private readonly dependencies;
5
+ constructor(dependencies: {
6
+ store: RelayStore;
7
+ });
8
+ createTask(input: CreateTaskInput, context: TaskMutationContext): Promise<TaskDetail>;
9
+ updateTask(input: UpdateTaskInput, context: TaskMutationContext): Promise<TaskDetail>;
10
+ updateTaskStatus(input: UpdateTaskStatusInput, context: TaskMutationContext): Promise<TaskDetail>;
11
+ assignAgent(input: AssignAgentInput): Promise<TaskDetail>;
12
+ listTasks(input?: ListTasksInput): Promise<TaskSummary[]>;
13
+ getTask(taskId: string): Promise<TaskDetail>;
14
+ deleteTask(input: DeleteTaskInput, context: TaskMutationContext): Promise<DeleteTaskResult>;
15
+ onAgentSpawned(event: AgentLifecycleTaskEvent): Promise<void>;
16
+ onAgentCompleted(event: AgentLifecycleTaskEvent): Promise<void>;
17
+ onAgentFailed(event: AgentLifecycleTaskEvent & {
18
+ message: string;
19
+ }): Promise<void>;
20
+ private applyTaskStatusChange;
21
+ private autoReadyDependants;
22
+ private blockDependantsForInvalidDependency;
23
+ private getTaskRecord;
24
+ private requireTask;
25
+ private logStatusChange;
26
+ }
@@ -0,0 +1,308 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { NotFoundError } from "../core/errors.js";
3
+ import { allDependenciesResolved, assignTaskAgent, collectDeletionImpact, createTaskRecord, transitionTask, updateTaskFields, validateTaskDependencies, } from "../domain/task-management.js";
4
+ export class TaskService {
5
+ dependencies;
6
+ constructor(dependencies) {
7
+ this.dependencies = dependencies;
8
+ }
9
+ async createTask(input, context) {
10
+ const now = new Date().toISOString();
11
+ const tasks = await this.dependencies.store.listTasks();
12
+ if (input.parent_id) {
13
+ this.requireTask(tasks, input.parent_id, "Parent task");
14
+ }
15
+ const taskId = randomUUID();
16
+ validateTaskDependencies({
17
+ taskId,
18
+ parentId: input.parent_id,
19
+ dependsOn: input.depends_on ?? [],
20
+ tasks,
21
+ });
22
+ const task = createTaskRecord({
23
+ taskId,
24
+ title: input.title,
25
+ description: input.description,
26
+ parentId: input.parent_id,
27
+ dependsOn: input.depends_on ?? [],
28
+ acceptanceCriteria: input.acceptance_criteria,
29
+ initiatorId: context.actorId,
30
+ now,
31
+ });
32
+ await this.dependencies.store.writeTask(task);
33
+ return toTaskDetail(task);
34
+ }
35
+ async updateTask(input, context) {
36
+ void context;
37
+ const now = new Date().toISOString();
38
+ const tasks = await this.dependencies.store.listTasks();
39
+ const task = this.requireTask(tasks, input.task_id);
40
+ const nextDependsOn = input.depends_on ?? task.dependsOn;
41
+ validateTaskDependencies({
42
+ taskId: task.taskId,
43
+ parentId: task.parentId,
44
+ dependsOn: nextDependsOn,
45
+ tasks: tasks.filter((candidate) => candidate.taskId !== task.taskId),
46
+ });
47
+ const updatedTask = updateTaskFields({
48
+ task,
49
+ now,
50
+ title: input.title,
51
+ description: input.description,
52
+ dependsOn: input.depends_on,
53
+ acceptanceCriteria: input.acceptance_criteria,
54
+ });
55
+ await this.dependencies.store.writeTask(updatedTask);
56
+ return toTaskDetail(updatedTask);
57
+ }
58
+ async updateTaskStatus(input, context) {
59
+ const actor = agentActor(context.actorId);
60
+ const updatedTask = await this.applyTaskStatusChange({
61
+ taskId: input.task_id,
62
+ nextStatus: input.status,
63
+ actor,
64
+ comment: input.comment,
65
+ backend: undefined,
66
+ });
67
+ return toTaskDetail(updatedTask);
68
+ }
69
+ async assignAgent(input) {
70
+ const now = new Date().toISOString();
71
+ const task = await this.getTaskRecord(input.task_id);
72
+ const updatedTask = assignTaskAgent(task, input.agent_id, now);
73
+ await this.dependencies.store.writeTask(updatedTask);
74
+ return toTaskDetail(updatedTask);
75
+ }
76
+ async listTasks(input = {}) {
77
+ const tasks = await this.dependencies.store.listTasks();
78
+ return tasks
79
+ .filter((task) => input.parent_id === undefined ? true : task.parentId === input.parent_id)
80
+ .filter((task) => (input.status === undefined ? true : task.status === input.status))
81
+ .sort((left, right) => left.createdAt.localeCompare(right.createdAt))
82
+ .map(toTaskSummary);
83
+ }
84
+ async getTask(taskId) {
85
+ const task = await this.getTaskRecord(taskId);
86
+ return toTaskDetail(task);
87
+ }
88
+ async deleteTask(input, context) {
89
+ const now = new Date().toISOString();
90
+ const tasks = await this.dependencies.store.listTasks();
91
+ const task = this.requireTask(tasks, input.task_id);
92
+ const impact = collectDeletionImpact(task.taskId, tasks);
93
+ const affectedIds = [task.taskId, ...impact.descendantTaskIds];
94
+ const warnings = impact.affectedDependants.length > 0
95
+ ? [
96
+ `Archiving task ${task.taskId} affects dependant tasks: ${impact.affectedDependants.join(", ")}.`,
97
+ ]
98
+ : [];
99
+ const tasksById = new Map(tasks.map((candidate) => [candidate.taskId, candidate]));
100
+ for (const affectedId of affectedIds) {
101
+ const target = tasksById.get(affectedId);
102
+ const archived = transitionTask({
103
+ task: target,
104
+ nextStatus: "archived",
105
+ actor: agentActor(context.actorId),
106
+ allTasks: [...tasksById.values()],
107
+ parentTask: target.parentId ? tasksById.get(target.parentId) : undefined,
108
+ comment: `Archived by delete_task from root task ${task.taskId}.`,
109
+ now,
110
+ });
111
+ tasksById.set(affectedId, archived);
112
+ await this.dependencies.store.writeTask(archived);
113
+ await this.logStatusChange(archived, "archived", undefined);
114
+ await this.blockDependantsForInvalidDependency({
115
+ sourceTask: archived,
116
+ tasksById,
117
+ now,
118
+ });
119
+ }
120
+ return {
121
+ task_id: task.taskId,
122
+ archived_task_ids: affectedIds,
123
+ warnings,
124
+ };
125
+ }
126
+ async onAgentSpawned(event) {
127
+ const now = new Date().toISOString();
128
+ const task = await this.getTaskRecord(event.taskId);
129
+ let updatedTask = task;
130
+ if (!updatedTask.agentId) {
131
+ updatedTask = assignTaskAgent(updatedTask, event.sessionId, now);
132
+ }
133
+ updatedTask = transitionTask({
134
+ task: updatedTask,
135
+ nextStatus: "in_progress",
136
+ actor: systemActor("agent_spawned"),
137
+ allTasks: await this.dependencies.store.listTasks(),
138
+ parentTask: updatedTask.parentId
139
+ ? (await this.dependencies.store.readTask(updatedTask.parentId)) ?? undefined
140
+ : undefined,
141
+ now,
142
+ });
143
+ await this.dependencies.store.writeTask(updatedTask);
144
+ await this.logStatusChange(updatedTask, "in_progress", event.backend);
145
+ }
146
+ async onAgentCompleted(event) {
147
+ const updatedTask = await this.applyTaskStatusChange({
148
+ taskId: event.taskId,
149
+ nextStatus: "review",
150
+ actor: systemActor("agent_completed"),
151
+ backend: event.backend,
152
+ });
153
+ void updatedTask;
154
+ }
155
+ async onAgentFailed(event) {
156
+ const updatedTask = await this.applyTaskStatusChange({
157
+ taskId: event.taskId,
158
+ nextStatus: "blocked",
159
+ actor: systemActor("agent_failed"),
160
+ comment: event.message,
161
+ backend: event.backend,
162
+ });
163
+ void updatedTask;
164
+ }
165
+ async applyTaskStatusChange(options) {
166
+ const now = new Date().toISOString();
167
+ const tasks = await this.dependencies.store.listTasks();
168
+ const task = this.requireTask(tasks, options.taskId);
169
+ const parentTask = task.parentId ? this.requireTask(tasks, task.parentId, "Parent task") : undefined;
170
+ const updatedTask = transitionTask({
171
+ task,
172
+ nextStatus: options.nextStatus,
173
+ actor: options.actor,
174
+ allTasks: tasks,
175
+ parentTask,
176
+ comment: options.comment,
177
+ now,
178
+ });
179
+ await this.dependencies.store.writeTask(updatedTask);
180
+ await this.logStatusChange(updatedTask, options.nextStatus, options.backend);
181
+ const tasksById = new Map(tasks.map((candidate) => [candidate.taskId, candidate]));
182
+ tasksById.set(updatedTask.taskId, updatedTask);
183
+ if (updatedTask.status === "done") {
184
+ await this.autoReadyDependants(tasksById, updatedTask.taskId, now);
185
+ }
186
+ if (updatedTask.status === "archived" || updatedTask.status === "superseded") {
187
+ await this.blockDependantsForInvalidDependency({
188
+ sourceTask: updatedTask,
189
+ tasksById,
190
+ now,
191
+ });
192
+ }
193
+ return updatedTask;
194
+ }
195
+ async autoReadyDependants(tasksById, completedTaskId, now) {
196
+ for (const candidate of tasksById.values()) {
197
+ if (!candidate.dependsOn.includes(completedTaskId)) {
198
+ continue;
199
+ }
200
+ if (candidate.status !== "backlog") {
201
+ continue;
202
+ }
203
+ if (!allDependenciesResolved(candidate.dependsOn, tasksById)) {
204
+ continue;
205
+ }
206
+ const transitioned = transitionTask({
207
+ task: candidate,
208
+ nextStatus: "ready",
209
+ actor: systemActor("dependency_resolved"),
210
+ allTasks: [...tasksById.values()],
211
+ parentTask: candidate.parentId ? tasksById.get(candidate.parentId) : undefined,
212
+ now,
213
+ });
214
+ tasksById.set(candidate.taskId, transitioned);
215
+ await this.dependencies.store.writeTask(transitioned);
216
+ await this.logStatusChange(transitioned, "ready", undefined);
217
+ }
218
+ }
219
+ async blockDependantsForInvalidDependency(options) {
220
+ for (const candidate of options.tasksById.values()) {
221
+ if (!candidate.dependsOn.includes(options.sourceTask.taskId)) {
222
+ continue;
223
+ }
224
+ if (candidate.status === "archived" || candidate.status === "superseded") {
225
+ continue;
226
+ }
227
+ const blocked = transitionTask({
228
+ task: candidate,
229
+ nextStatus: "blocked",
230
+ actor: systemActor("dependency_resolved"),
231
+ allTasks: [...options.tasksById.values()],
232
+ parentTask: candidate.parentId
233
+ ? options.tasksById.get(candidate.parentId)
234
+ : undefined,
235
+ comment: `Dependency ${options.sourceTask.taskId} is ${options.sourceTask.status}.`,
236
+ now: options.now,
237
+ });
238
+ options.tasksById.set(candidate.taskId, blocked);
239
+ await this.dependencies.store.writeTask(blocked);
240
+ await this.logStatusChange(blocked, "blocked", undefined);
241
+ }
242
+ }
243
+ async getTaskRecord(taskId) {
244
+ const task = await this.dependencies.store.readTask(taskId);
245
+ if (!task) {
246
+ throw new NotFoundError(`Task ${taskId} was not found.`);
247
+ }
248
+ return task;
249
+ }
250
+ requireTask(tasks, taskId, label = "Task") {
251
+ const task = tasks.find((candidate) => candidate.taskId === taskId);
252
+ if (!task) {
253
+ throw new NotFoundError(`${label} ${taskId} was not found.`);
254
+ }
255
+ return task;
256
+ }
257
+ async logStatusChange(task, status, backend) {
258
+ await this.dependencies.store.appendLog({
259
+ timestamp: new Date().toISOString(),
260
+ session_id: task.agentId ?? task.initiatorId,
261
+ task_id: task.taskId,
262
+ backend,
263
+ event_type: "task_status_changed",
264
+ status: "success",
265
+ details: {
266
+ task_status: status,
267
+ },
268
+ });
269
+ }
270
+ }
271
+ function agentActor(agentId) {
272
+ return {
273
+ type: "agent",
274
+ agentId,
275
+ };
276
+ }
277
+ function systemActor(cause) {
278
+ return {
279
+ type: "system",
280
+ cause,
281
+ };
282
+ }
283
+ function toTaskSummary(task) {
284
+ return {
285
+ task_id: task.taskId,
286
+ title: task.title,
287
+ status: task.status,
288
+ parent_id: task.parentId,
289
+ agent_id: task.agentId,
290
+ depends_on: [...task.dependsOn],
291
+ acceptance_criteria: task.acceptanceCriteria,
292
+ };
293
+ }
294
+ function toTaskDetail(task) {
295
+ return {
296
+ ...toTaskSummary(task),
297
+ description: task.description,
298
+ initiator_id: task.initiatorId,
299
+ comments: task.comments.map((comment) => ({
300
+ author: comment.author,
301
+ content: comment.content,
302
+ created_at: comment.createdAt,
303
+ })),
304
+ created_at: task.createdAt,
305
+ updated_at: task.updatedAt,
306
+ };
307
+ }
308
+ //# sourceMappingURL=task-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-service.js","sourceRoot":"","sources":["../../src/application/task-service.ts"],"names":[],"mappings":"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"}
package/dist/bin/relay.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { SpawnAgentsService } from "../application/spawn-agents-service.js";
5
+ import { TaskService } from "../application/task-service.js";
5
6
  import { BackendRegistry } from "../infrastructure/backends/backend-registry.js";
6
7
  import { CliBackendExecutor } from "../infrastructure/backends/cli-backend-executor.js";
7
8
  import { ChildProcessExecutor } from "../infrastructure/process/process-executor.js";
@@ -23,15 +24,20 @@ async function main() {
23
24
  return;
24
25
  }
25
26
  const store = new RelayStore(path.join(cwd, ".relay"));
27
+ const taskService = new TaskService({
28
+ store,
29
+ });
26
30
  const service = new SpawnAgentsService({
27
31
  backendRegistry,
28
32
  backendExecutor: new CliBackendExecutor(backendRegistry, new ChildProcessExecutor()),
29
33
  store,
34
+ taskService,
30
35
  cwd,
31
36
  env: process.env,
32
37
  });
33
38
  const server = createRelayMcpServer({
34
39
  service,
40
+ taskService,
35
41
  allowSpawnAgents: process.env.RELAY_ALLOW_SPAWN_AGENTS !== "0",
36
42
  });
37
43
  await serveRelayMcpServer(server);
@@ -1 +1 @@
1
- {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/bin/relay.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC;QACrC,eAAe;QACf,eAAe,EAAE,IAAI,kBAAkB,CACrC,eAAe,EACf,IAAI,oBAAoB,EAAE,CAC3B;QACD,KAAK;QACL,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,OAAO;QACP,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;KAC/D,CAAC,CAAC;IAEH,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAC9E,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/bin/relay.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,eAAe,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,KAAK;KACN,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC;QACrC,eAAe;QACf,eAAe,EAAE,IAAI,kBAAkB,CACrC,eAAe,EACf,IAAI,oBAAoB,EAAE,CAC3B;QACD,KAAK;QACL,WAAW;QACX,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,OAAO;QACP,WAAW;QACX,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;KAC/D,CAAC,CAAC;IAEH,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAC9E,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -12,3 +12,6 @@ export declare class DepthLimitError extends RelayError {
12
12
  export declare class BackendUnavailableError extends RelayError {
13
13
  constructor(message: string, causeData?: unknown);
14
14
  }
15
+ export declare class NotFoundError extends RelayError {
16
+ constructor(message: string, causeData?: unknown);
17
+ }
@@ -26,4 +26,10 @@ export class BackendUnavailableError extends RelayError {
26
26
  this.name = "BackendUnavailableError";
27
27
  }
28
28
  }
29
+ export class NotFoundError extends RelayError {
30
+ constructor(message, causeData) {
31
+ super("NOT_FOUND", message, causeData);
32
+ this.name = "NotFoundError";
33
+ }
34
+ }
29
35
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,SAAS,CAAW;IAEpC,YAAY,IAAY,EAAE,OAAe,EAAE,SAAmB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,qBAAqB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,SAAS,CAAW;IAEpC,YAAY,IAAY,EAAE,OAAe,EAAE,SAAmB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,qBAAqB,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -3,6 +3,99 @@ export type BackendType = (typeof BACKEND_TYPES)[number];
3
3
  export declare const TASK_TYPES: readonly ["orchestration", "research", "document_review", "code_writing", "document_writing", "code_review"];
4
4
  export type TaskType = (typeof TASK_TYPES)[number];
5
5
  export type ExecutionStatus = "success" | "error";
6
+ export declare const TASK_STATUSES: readonly ["backlog", "ready", "in_progress", "review", "blocked", "done", "superseded", "archived"];
7
+ export type TaskStatus = (typeof TASK_STATUSES)[number];
8
+ export declare const SYSTEM_CAUSES: readonly ["dependency_resolved", "agent_spawned", "agent_completed", "agent_failed"];
9
+ export type SystemCause = (typeof SYSTEM_CAUSES)[number];
10
+ export type Actor = {
11
+ type: "agent";
12
+ agentId: string;
13
+ } | {
14
+ type: "system";
15
+ cause: SystemCause;
16
+ };
17
+ export interface TaskComment {
18
+ author: Actor;
19
+ content: string;
20
+ createdAt: string;
21
+ }
22
+ export interface TaskRecord {
23
+ taskId: string;
24
+ title: string;
25
+ description: string;
26
+ status: TaskStatus;
27
+ parentId?: string;
28
+ agentId?: string;
29
+ initiatorId: string;
30
+ dependsOn: string[];
31
+ acceptanceCriteria?: string;
32
+ comments: TaskComment[];
33
+ createdAt: string;
34
+ updatedAt: string;
35
+ }
36
+ export interface TaskSummary {
37
+ task_id: string;
38
+ title: string;
39
+ status: TaskStatus;
40
+ parent_id?: string;
41
+ agent_id?: string;
42
+ depends_on: string[];
43
+ acceptance_criteria?: string;
44
+ }
45
+ export interface TaskDetail extends TaskSummary {
46
+ description: string;
47
+ initiator_id: string;
48
+ comments: Array<{
49
+ author: Actor;
50
+ content: string;
51
+ created_at: string;
52
+ }>;
53
+ created_at: string;
54
+ updated_at: string;
55
+ }
56
+ export interface CreateTaskInput {
57
+ title: string;
58
+ description: string;
59
+ parent_id?: string;
60
+ depends_on?: string[];
61
+ acceptance_criteria?: string;
62
+ }
63
+ export interface UpdateTaskInput {
64
+ task_id: string;
65
+ title?: string;
66
+ description?: string;
67
+ depends_on?: string[];
68
+ acceptance_criteria?: string;
69
+ }
70
+ export interface UpdateTaskStatusInput {
71
+ task_id: string;
72
+ status: TaskStatus;
73
+ comment?: string;
74
+ }
75
+ export interface AssignAgentInput {
76
+ task_id: string;
77
+ agent_id: string;
78
+ }
79
+ export interface ListTasksInput {
80
+ parent_id?: string;
81
+ status?: TaskStatus;
82
+ }
83
+ export interface DeleteTaskInput {
84
+ task_id: string;
85
+ }
86
+ export interface DeleteTaskResult {
87
+ task_id: string;
88
+ archived_task_ids: string[];
89
+ warnings: string[];
90
+ }
91
+ export interface TaskMutationContext {
92
+ actorId: string;
93
+ }
94
+ export interface AgentLifecycleTaskEvent {
95
+ taskId: string;
96
+ sessionId: string;
97
+ backend?: BackendType;
98
+ }
6
99
  export interface SpawnAgentInput {
7
100
  backend?: BackendType;
8
101
  prompt: string;
@@ -48,8 +141,8 @@ export interface LogEntry {
48
141
  timestamp: string;
49
142
  session_id: string;
50
143
  task_id?: string;
51
- backend: BackendType;
52
- event_type: "agent_spawned" | "agent_completed" | "agent_failed" | "routing_fallback";
144
+ backend?: BackendType;
145
+ event_type: "agent_spawned" | "agent_completed" | "agent_failed" | "routing_fallback" | "task_status_changed";
53
146
  status: "running" | "success" | "error";
54
147
  details?: Record<string, unknown>;
55
148
  }
@@ -7,4 +7,20 @@ export const TASK_TYPES = [
7
7
  "document_writing",
8
8
  "code_review",
9
9
  ];
10
+ export const TASK_STATUSES = [
11
+ "backlog",
12
+ "ready",
13
+ "in_progress",
14
+ "review",
15
+ "blocked",
16
+ "done",
17
+ "superseded",
18
+ "archived",
19
+ ];
20
+ export const SYSTEM_CAUSES = [
21
+ "dependency_resolved",
22
+ "agent_spawned",
23
+ "agent_completed",
24
+ "agent_failed",
25
+ ];
10
26
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGpE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,eAAe;IACf,UAAU;IACV,iBAAiB;IACjB,cAAc;IACd,kBAAkB;IAClB,aAAa;CACL,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGpE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,eAAe;IACf,UAAU;IACV,iBAAiB;IACjB,cAAc;IACd,kBAAkB;IAClB,aAAa;CACL,CAAC;AAKX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,OAAO;IACP,aAAa;IACb,QAAQ;IACR,SAAS;IACT,MAAM;IACN,YAAY;IACZ,UAAU;CACF,CAAC;AAGX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,qBAAqB;IACrB,eAAe;IACf,iBAAiB;IACjB,cAAc;CACN,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { Actor, TaskRecord, TaskStatus } from "../core/types.js";
2
+ export interface DeletionImpact {
3
+ targetTaskId: string;
4
+ affectedDependants: string[];
5
+ descendantTaskIds: string[];
6
+ hasDependants: boolean;
7
+ }
8
+ export declare function createTaskRecord(options: {
9
+ taskId: string;
10
+ title: string;
11
+ description: string;
12
+ parentId?: string;
13
+ dependsOn?: string[];
14
+ acceptanceCriteria?: string;
15
+ initiatorId: string;
16
+ now: string;
17
+ }): TaskRecord;
18
+ export declare function transitionTask(options: {
19
+ task: TaskRecord;
20
+ nextStatus: TaskStatus;
21
+ actor: Actor;
22
+ allTasks: TaskRecord[];
23
+ parentTask?: TaskRecord;
24
+ comment?: string;
25
+ now: string;
26
+ }): TaskRecord;
27
+ export declare function assignTaskAgent(task: TaskRecord, agentId: string, now: string): TaskRecord;
28
+ export declare function updateTaskFields(options: {
29
+ task: TaskRecord;
30
+ now: string;
31
+ title?: string;
32
+ description?: string;
33
+ dependsOn?: string[];
34
+ acceptanceCriteria?: string;
35
+ }): TaskRecord;
36
+ export declare function validateTaskDependencies(options: {
37
+ taskId: string;
38
+ parentId?: string;
39
+ dependsOn: string[];
40
+ tasks: TaskRecord[];
41
+ }): void;
42
+ export declare function validateNoCycle(options: {
43
+ taskId: string;
44
+ dependsOn: string[];
45
+ tasks: TaskRecord[];
46
+ }): void;
47
+ export declare function canTransitionToReview(taskId: string, tasks: TaskRecord[]): boolean;
48
+ export declare function allDependenciesResolved(dependsOn: string[], tasksById: Map<string, TaskRecord>): boolean;
49
+ export declare function collectDeletionImpact(taskId: string, tasks: TaskRecord[]): DeletionImpact;
50
+ export declare function collectDescendantTaskIds(taskId: string, tasks: TaskRecord[]): string[];
@@ -0,0 +1,232 @@
1
+ import { ValidationError } from "../core/errors.js";
2
+ export function createTaskRecord(options) {
3
+ return {
4
+ taskId: options.taskId,
5
+ title: options.title,
6
+ description: options.description,
7
+ status: "backlog",
8
+ parentId: options.parentId,
9
+ dependsOn: [...(options.dependsOn ?? [])],
10
+ acceptanceCriteria: options.acceptanceCriteria,
11
+ initiatorId: options.initiatorId,
12
+ comments: [],
13
+ createdAt: options.now,
14
+ updatedAt: options.now,
15
+ };
16
+ }
17
+ export function transitionTask(options) {
18
+ const { task, nextStatus, actor, allTasks, parentTask, comment, now } = options;
19
+ validateStatusTransition({ task, nextStatus, actor, allTasks, parentTask, comment });
20
+ const comments = [...task.comments];
21
+ if (comment) {
22
+ comments.push(createComment(actor, comment, now));
23
+ }
24
+ return {
25
+ ...task,
26
+ status: nextStatus,
27
+ comments,
28
+ updatedAt: now,
29
+ };
30
+ }
31
+ export function assignTaskAgent(task, agentId, now) {
32
+ if (!agentId) {
33
+ throw new ValidationError("agent_id must be a non-empty string.");
34
+ }
35
+ return {
36
+ ...task,
37
+ agentId,
38
+ updatedAt: now,
39
+ };
40
+ }
41
+ export function updateTaskFields(options) {
42
+ return {
43
+ ...options.task,
44
+ title: options.title ?? options.task.title,
45
+ description: options.description ?? options.task.description,
46
+ dependsOn: options.dependsOn ? [...options.dependsOn] : options.task.dependsOn,
47
+ acceptanceCriteria: options.acceptanceCriteria ?? options.task.acceptanceCriteria,
48
+ updatedAt: options.now,
49
+ };
50
+ }
51
+ export function validateTaskDependencies(options) {
52
+ const tasksById = new Map(options.tasks.map((task) => [task.taskId, task]));
53
+ for (const dependencyId of options.dependsOn) {
54
+ const dependency = tasksById.get(dependencyId);
55
+ if (!dependency) {
56
+ throw new ValidationError(`Dependency task ${dependencyId} does not exist.`);
57
+ }
58
+ if (dependencyId === options.taskId) {
59
+ throw new ValidationError("A task cannot depend on itself.");
60
+ }
61
+ if (dependency.parentId !== options.parentId) {
62
+ throw new ValidationError(`Dependency task ${dependencyId} must share the same parent.`);
63
+ }
64
+ }
65
+ validateNoCycle({
66
+ taskId: options.taskId,
67
+ dependsOn: options.dependsOn,
68
+ tasks: options.tasks,
69
+ });
70
+ }
71
+ export function validateNoCycle(options) {
72
+ const adjacency = new Map();
73
+ for (const task of options.tasks) {
74
+ adjacency.set(task.taskId, [...task.dependsOn]);
75
+ }
76
+ adjacency.set(options.taskId, [...options.dependsOn]);
77
+ const visit = (taskId, stack, seen) => {
78
+ if (stack.has(taskId)) {
79
+ throw new ValidationError(`Circular dependency detected at task ${taskId}.`);
80
+ }
81
+ if (seen.has(taskId)) {
82
+ return;
83
+ }
84
+ seen.add(taskId);
85
+ stack.add(taskId);
86
+ for (const dependencyId of adjacency.get(taskId) ?? []) {
87
+ visit(dependencyId, stack, seen);
88
+ }
89
+ stack.delete(taskId);
90
+ };
91
+ visit(options.taskId, new Set(), new Set());
92
+ }
93
+ export function canTransitionToReview(taskId, tasks) {
94
+ const children = tasks.filter((candidate) => candidate.parentId === taskId);
95
+ return children.every((child) => child.status === "done");
96
+ }
97
+ export function allDependenciesResolved(dependsOn, tasksById) {
98
+ return dependsOn.every((dependencyId) => tasksById.get(dependencyId)?.status === "done");
99
+ }
100
+ export function collectDeletionImpact(taskId, tasks) {
101
+ const descendants = collectDescendantTaskIds(taskId, tasks);
102
+ const affectedIds = new Set([taskId, ...descendants]);
103
+ const affectedDependants = tasks
104
+ .filter((task) => task.dependsOn.some((dependencyId) => affectedIds.has(dependencyId)))
105
+ .filter((task) => !affectedIds.has(task.taskId))
106
+ .map((task) => task.taskId);
107
+ return {
108
+ targetTaskId: taskId,
109
+ affectedDependants,
110
+ descendantTaskIds: descendants,
111
+ hasDependants: affectedDependants.length > 0,
112
+ };
113
+ }
114
+ export function collectDescendantTaskIds(taskId, tasks) {
115
+ const childrenByParent = new Map();
116
+ for (const task of tasks) {
117
+ if (!task.parentId) {
118
+ continue;
119
+ }
120
+ const siblings = childrenByParent.get(task.parentId) ?? [];
121
+ siblings.push(task.taskId);
122
+ childrenByParent.set(task.parentId, siblings);
123
+ }
124
+ const result = [];
125
+ const stack = [...(childrenByParent.get(taskId) ?? [])];
126
+ while (stack.length > 0) {
127
+ const current = stack.pop();
128
+ result.push(current);
129
+ stack.push(...(childrenByParent.get(current) ?? []));
130
+ }
131
+ return result;
132
+ }
133
+ function validateStatusTransition(options) {
134
+ const { task, nextStatus, actor, allTasks, parentTask, comment } = options;
135
+ if (task.status === nextStatus) {
136
+ throw new ValidationError(`Task ${task.taskId} is already ${nextStatus}.`);
137
+ }
138
+ switch (nextStatus) {
139
+ case "ready":
140
+ if (task.status !== "backlog") {
141
+ throw new ValidationError("Only backlog tasks can transition to ready.");
142
+ }
143
+ if (!allDependenciesResolved(task.dependsOn, new Map(allTasks.map((item) => [item.taskId, item])))) {
144
+ throw new ValidationError("All dependency tasks must be done before transitioning to ready.");
145
+ }
146
+ return;
147
+ case "in_progress":
148
+ if (task.status === "ready" || task.status === "blocked") {
149
+ ensureAssignedAgentMatchesActor(task, actor);
150
+ return;
151
+ }
152
+ if (task.status === "review") {
153
+ if (!comment) {
154
+ throw new ValidationError("A comment is required when returning a task from review to in_progress.");
155
+ }
156
+ ensureReviewApprover(task, parentTask, actor);
157
+ return;
158
+ }
159
+ throw new ValidationError(`Cannot transition ${task.status} to in_progress.`);
160
+ case "review":
161
+ if (task.status !== "in_progress") {
162
+ throw new ValidationError("Only in_progress tasks can transition to review.");
163
+ }
164
+ ensureAssignedAgentMatchesActor(task, actor);
165
+ if (hasChildren(task.taskId, allTasks) && !canTransitionToReview(task.taskId, allTasks)) {
166
+ throw new ValidationError("All child tasks must be done before the parent task can transition to review.");
167
+ }
168
+ return;
169
+ case "blocked":
170
+ if (actor.type === "system") {
171
+ if (task.status === "archived" || task.status === "superseded") {
172
+ throw new ValidationError(`Cannot transition ${task.status} to blocked.`);
173
+ }
174
+ return;
175
+ }
176
+ if (task.status !== "in_progress") {
177
+ throw new ValidationError("Only in_progress tasks can transition to blocked manually.");
178
+ }
179
+ ensureAssignedAgentMatchesActor(task, actor);
180
+ return;
181
+ case "done":
182
+ if (task.status !== "review") {
183
+ throw new ValidationError("Only review tasks can transition to done.");
184
+ }
185
+ ensureReviewApprover(task, parentTask, actor);
186
+ return;
187
+ case "superseded":
188
+ case "archived":
189
+ if (task.status === "archived" || task.status === "superseded") {
190
+ throw new ValidationError(`Cannot transition ${task.status} to ${nextStatus}.`);
191
+ }
192
+ return;
193
+ case "backlog":
194
+ throw new ValidationError("Tasks cannot transition back to backlog.");
195
+ }
196
+ }
197
+ function hasChildren(taskId, tasks) {
198
+ return tasks.some((task) => task.parentId === taskId);
199
+ }
200
+ function ensureAssignedAgentMatchesActor(task, actor) {
201
+ if (actor.type !== "agent") {
202
+ return;
203
+ }
204
+ if (task.agentId && task.agentId !== actor.agentId) {
205
+ throw new ValidationError(`Only the assigned agent can transition task ${task.taskId}.`);
206
+ }
207
+ }
208
+ function ensureReviewApprover(task, parentTask, actor) {
209
+ if (actor.type !== "agent") {
210
+ throw new ValidationError("Only an agent can approve or reject a review.");
211
+ }
212
+ if (!task.parentId) {
213
+ if (actor.agentId !== task.initiatorId) {
214
+ throw new ValidationError("Only the task initiator can approve or reject a root task review.");
215
+ }
216
+ return;
217
+ }
218
+ if (!parentTask?.agentId) {
219
+ throw new ValidationError("The parent task must have an assigned agent before review approval.");
220
+ }
221
+ if (actor.agentId !== parentTask.agentId) {
222
+ throw new ValidationError("Only the parent task's assigned agent can approve or reject the child task review.");
223
+ }
224
+ }
225
+ function createComment(actor, content, now) {
226
+ return {
227
+ author: actor,
228
+ content,
229
+ createdAt: now,
230
+ };
231
+ }
232
+ //# sourceMappingURL=task-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-management.js","sourceRoot":"","sources":["../../src/domain/task-management.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from "./application/spawn-agents-service.js";
2
+ export * from "./application/task-service.js";
2
3
  export * from "./core/errors.js";
3
4
  export * from "./core/types.js";
5
+ export * from "./domain/task-management.js";
4
6
  export * from "./infrastructure/backends/backend-registry.js";
5
7
  export * from "./infrastructure/backends/cli-backend-executor.js";
6
8
  export * from "./infrastructure/process/process-executor.js";
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from "./application/spawn-agents-service.js";
2
+ export * from "./application/task-service.js";
2
3
  export * from "./core/errors.js";
3
4
  export * from "./core/types.js";
5
+ export * from "./domain/task-management.js";
4
6
  export * from "./infrastructure/backends/backend-registry.js";
5
7
  export * from "./infrastructure/backends/cli-backend-executor.js";
6
8
  export * from "./infrastructure/process/process-executor.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,mDAAmD,CAAC;AAClE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { LogEntry, RelaySessionMetadata } from "../../core/types.js";
1
+ import type { LogEntry, RelaySessionMetadata, TaskRecord } from "../../core/types.js";
2
2
  export declare class RelayStore {
3
3
  readonly rootDir: string;
4
4
  constructor(rootDir: string);
@@ -8,7 +8,11 @@ export declare class RelayStore {
8
8
  writeSessionMetadata(metadata: RelaySessionMetadata): Promise<void>;
9
9
  readSessionMetadata(relaySessionId: string): Promise<RelaySessionMetadata | null>;
10
10
  appendLog(entry: LogEntry): Promise<void>;
11
+ writeTask(task: TaskRecord): Promise<void>;
12
+ readTask(taskId: string): Promise<TaskRecord | null>;
13
+ listTasks(): Promise<TaskRecord[]>;
11
14
  private responsesDir;
12
15
  private sessionsDir;
13
16
  private logsDir;
17
+ private tasksDir;
14
18
  }
@@ -1,4 +1,4 @@
1
- import { mkdir, readFile, rename, rm, writeFile, appendFile } from "node:fs/promises";
1
+ import { appendFile, mkdir, readdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  export class RelayStore {
@@ -11,6 +11,7 @@ export class RelayStore {
11
11
  mkdir(this.responsesDir(), { recursive: true }),
12
12
  mkdir(this.sessionsDir(), { recursive: true }),
13
13
  mkdir(this.logsDir(), { recursive: true }),
14
+ mkdir(this.tasksDir(), { recursive: true }),
14
15
  ]);
15
16
  }
16
17
  async writeResponse(sessionId, content) {
@@ -49,6 +50,34 @@ export class RelayStore {
49
50
  const logPath = path.join(this.logsDir(), `${date}.jsonl`);
50
51
  await appendFile(logPath, `${JSON.stringify(entry)}\n`, "utf8");
51
52
  }
53
+ async writeTask(task) {
54
+ await this.ensureLayout();
55
+ const targetPath = path.join(this.tasksDir(), `${task.taskId}.json`);
56
+ await writeJsonAtomic(targetPath, task);
57
+ }
58
+ async readTask(taskId) {
59
+ const targetPath = path.join(this.tasksDir(), `${taskId}.json`);
60
+ try {
61
+ const raw = await readFile(targetPath, "utf8");
62
+ return JSON.parse(raw);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ async listTasks() {
69
+ await this.ensureLayout();
70
+ const entries = await readdir(this.tasksDir(), { withFileTypes: true });
71
+ const taskFiles = entries
72
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
73
+ .map((entry) => entry.name)
74
+ .sort();
75
+ const tasks = await Promise.all(taskFiles.map(async (fileName) => {
76
+ const raw = await readFile(path.join(this.tasksDir(), fileName), "utf8");
77
+ return JSON.parse(raw);
78
+ }));
79
+ return tasks.sort((left, right) => left.createdAt.localeCompare(right.createdAt));
80
+ }
52
81
  responsesDir() {
53
82
  return path.join(this.rootDir, "responses");
54
83
  }
@@ -58,6 +87,9 @@ export class RelayStore {
58
87
  logsDir() {
59
88
  return path.join(this.rootDir, "logs");
60
89
  }
90
+ tasksDir() {
91
+ return path.join(this.rootDir, "tasks");
92
+ }
61
93
  }
62
94
  async function writeJsonAtomic(targetPath, value) {
63
95
  const tempPath = path.join(os.tmpdir(), `relay-${path.basename(targetPath)}-${process.pid}-${Date.now()}.tmp`);
@@ -1 +1 @@
1
- {"version":3,"file":"relay-store.js","sourceRoot":"","sources":["../../../src/infrastructure/store/relay-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"relay-store.js","sourceRoot":"","sources":["../../../src/infrastructure/store/relay-store.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { SpawnAgentsService } from "../../application/spawn-agents-service.js";
3
+ import { TaskService } from "../../application/task-service.js";
3
4
  export declare function createRelayMcpServer(options: {
4
5
  service: SpawnAgentsService;
6
+ taskService: TaskService;
5
7
  allowSpawnAgents: boolean;
6
8
  }): McpServer;
7
9
  export declare function serveRelayMcpServer(server: McpServer): Promise<void>;
@@ -22,10 +22,53 @@ const spawnAgentsInputSchema = {
22
22
  agents: z.array(agentSchema).min(1),
23
23
  max_depth: z.number().int().positive().optional(),
24
24
  };
25
+ const taskStatusSchema = z.enum([
26
+ "backlog",
27
+ "ready",
28
+ "in_progress",
29
+ "review",
30
+ "blocked",
31
+ "done",
32
+ "superseded",
33
+ "archived",
34
+ ]);
35
+ const createTaskInputSchema = {
36
+ title: z.string().min(1),
37
+ description: z.string().min(1),
38
+ parent_id: z.string().min(1).optional(),
39
+ depends_on: z.array(z.string().min(1)).optional(),
40
+ acceptance_criteria: z.string().min(1).optional(),
41
+ };
42
+ const updateTaskStatusInputSchema = {
43
+ task_id: z.string().min(1),
44
+ status: taskStatusSchema,
45
+ comment: z.string().min(1).optional(),
46
+ };
47
+ const assignAgentInputSchema = {
48
+ task_id: z.string().min(1),
49
+ agent_id: z.string().min(1),
50
+ };
51
+ const listTasksInputSchema = {
52
+ parent_id: z.string().min(1).optional(),
53
+ status: taskStatusSchema.optional(),
54
+ };
55
+ const getTaskInputSchema = {
56
+ task_id: z.string().min(1),
57
+ };
58
+ const updateTaskInputSchema = {
59
+ task_id: z.string().min(1),
60
+ title: z.string().min(1).optional(),
61
+ description: z.string().min(1).optional(),
62
+ acceptance_criteria: z.string().min(1).optional(),
63
+ depends_on: z.array(z.string().min(1)).optional(),
64
+ };
65
+ const deleteTaskInputSchema = {
66
+ task_id: z.string().min(1),
67
+ };
25
68
  export function createRelayMcpServer(options) {
26
69
  const server = new McpServer({
27
70
  name: "agentic-relay",
28
- version: "0.1.0",
71
+ version: "3.1.0",
29
72
  });
30
73
  if (options.allowSpawnAgents) {
31
74
  server.tool("spawn_agents", "Launch one or more child agent CLI processes in parallel.", spawnAgentsInputSchema, async (args, extra) => {
@@ -45,10 +88,48 @@ export function createRelayMcpServer(options) {
45
88
  };
46
89
  });
47
90
  }
91
+ server.tool("create_task", "Create a task in the local task tree.", createTaskInputSchema, async (args, extra) => {
92
+ const task = await options.taskService.createTask(args, {
93
+ actorId: resolveActorId(extra.sessionId),
94
+ });
95
+ return asJsonResult(task);
96
+ });
97
+ server.tool("update_task_status", "Transition a task to another lifecycle status.", updateTaskStatusInputSchema, async (args, extra) => {
98
+ const task = await options.taskService.updateTaskStatus(args, {
99
+ actorId: resolveActorId(extra.sessionId),
100
+ });
101
+ return asJsonResult(task);
102
+ });
103
+ server.tool("assign_agent", "Assign or reassign the owning agent for a task.", assignAgentInputSchema, async (args) => asJsonResult(await options.taskService.assignAgent(args)));
104
+ server.tool("list_tasks", "List tasks, optionally filtered by parent or status.", listTasksInputSchema, async (args) => asJsonResult(await options.taskService.listTasks(args)));
105
+ server.tool("get_task", "Get the full detail of a single task.", getTaskInputSchema, async (args) => asJsonResult(await options.taskService.getTask(args.task_id)));
106
+ server.tool("update_task", "Update task fields such as title, description, acceptance criteria, or dependencies.", updateTaskInputSchema, async (args, extra) => {
107
+ const task = await options.taskService.updateTask(args, {
108
+ actorId: resolveActorId(extra.sessionId),
109
+ });
110
+ return asJsonResult(task);
111
+ });
112
+ server.tool("delete_task", "Archive a task and all of its descendants.", deleteTaskInputSchema, async (args, extra) => asJsonResult(await options.taskService.deleteTask(args, {
113
+ actorId: resolveActorId(extra.sessionId),
114
+ })));
48
115
  return server;
49
116
  }
50
117
  export async function serveRelayMcpServer(server) {
51
118
  const transport = new StdioServerTransport();
52
119
  await server.connect(transport);
53
120
  }
121
+ function resolveActorId(sessionId) {
122
+ return sessionId ?? process.env.RELAY_AGENT_ID ?? "local-operator";
123
+ }
124
+ function asJsonResult(value) {
125
+ return {
126
+ content: [
127
+ {
128
+ type: "text",
129
+ text: JSON.stringify(value, null, 2),
130
+ },
131
+ ],
132
+ structuredContent: value,
133
+ };
134
+ }
54
135
  //# sourceMappingURL=relay-mcp-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relay-mcp-server.js","sourceRoot":"","sources":["../../../src/interfaces/mcp/relay-mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,SAAS,EAAE,CAAC;SACT,IAAI,CAAC;QACJ,eAAe;QACf,UAAU;QACV,iBAAiB;QACjB,cAAc;QACd,kBAAkB;QAClB,aAAa;KACd,CAAC;SACD,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG;IAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAClD,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,OAGpC;IACC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CACT,cAAc,EACd,2DAA2D,EAC3D,sBAAsB,EACtB,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE;gBACtD,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC;iBACF;gBACD,iBAAiB,EAAE;oBACjB,OAAO;iBACR;aACF,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB;IACzD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"relay-mcp-server.js","sourceRoot":"","sources":["../../../src/interfaces/mcp/relay-mcp-server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rk0429/agentic-relay",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Unified MCP relay for Claude Code, Codex CLI, and Gemini CLI",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",