@rk0429/agentic-relay 3.0.0 → 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
 
@@ -20,3 +23,72 @@ pnpm relay mcp serve
20
23
  ```
21
24
 
22
25
  Responses are stored under `.relay/` in the current working directory.
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
+
38
+ ## Use From This Workspace
39
+
40
+ This workspace is configured to consume the published package via
41
+ `@rk0429/agentic-relay@latest`.
42
+
43
+ ### Claude Code
44
+
45
+ Project MCP registration lives in `.mcp.json`:
46
+
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "agentic-relay": {
51
+ "type": "stdio",
52
+ "command": "npx",
53
+ "args": ["-y", "@rk0429/agentic-relay@latest", "mcp", "serve"]
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ Claude project enablement lives in `.claude/settings.local.json` (symlinked to
60
+ `.agents/settings.local.json`) and must include `agentic-relay` in
61
+ `enabledMcpjsonServers`.
62
+
63
+ ### Codex CLI
64
+
65
+ Workspace config lives in `.codex/config.toml`:
66
+
67
+ ```toml
68
+ [mcp_servers.agentic-relay]
69
+ command = "npx"
70
+ args = ["-y", "@rk0429/agentic-relay@latest", "mcp", "serve"]
71
+ ```
72
+
73
+ ### Gemini CLI
74
+
75
+ Workspace config lives in `.gemini/settings.json`:
76
+
77
+ ```json
78
+ {
79
+ "mcpServers": {
80
+ "agentic-relay": {
81
+ "command": "npx",
82
+ "args": ["-y", "@rk0429/agentic-relay@latest", "mcp", "serve"]
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### Verify
89
+
90
+ ```bash
91
+ claude mcp list
92
+ codex mcp list
93
+ gemini mcp list
94
+ ```
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMtD,MAAM,OAAO,kBAAkB;IAEV;IADnB,YACmB,YAUhB;QAVgB,iBAAY,GAAZ,YAAY,CAU5B;IACA,CAAC;IAEG,KAAK,CAAC,WAAW,CACtB,KAAuB,EACvB,UAAoC,EAAE;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACjD,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACvD,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAEtC,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;QACpF,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACzB,IAAI,CAAC,gBAAgB,CAAC;YACpB,KAAK;YACL,YAAY;YACZ,QAAQ;YACR,iBAAiB;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAM9B;QACC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC7E,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU;gBACrC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC;gBACrE,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,cAAc,GAClB,KAAK,CAAC,UAAU,IAAI,cAAc;gBAChC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC9D,CAAC,CAAC,IAAI,CAAC;YAEX,MAAM,OAAO,GAAG,cAAc,CAAC;gBAC7B,eAAe,EAAE,KAAK,CAAC,OAAO,IAAI,cAAc,EAAE,OAAO;gBACzD,QAAQ,EAAE,KAAK,CAAC,SAAS;gBACzB,iBAAiB;aAClB,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC;gBAChC,kBAAkB,EAAE,KAAK,CAAC,UAAU;gBACpC,cAAc;gBACd,eAAe,EAAE,OAAO,CAAC,QAAQ;aAClC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,OAAO;gBACpB,CAAC,CAAC,8BAA8B,CAAC;oBAC7B,aAAa,EAAE,OAAO,CAAC,cAAc;oBACrC,eAAe,EAAE,OAAO,CAAC,iBAAiB;oBAC1C,YAAY,EAAE,OAAO,CAAC,aAAa;oBACnC,eAAe,EAAE,cAAc;oBAC/B,UAAU,EAAE,KAAK,CAAC,MAAM;iBACzB,CAAC;gBACJ,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAEjB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CACrC,cAAc,CAAC;gBACb,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,KAAK,CAAC,OAAO;gBACrB,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,SAAS,EAAE,eAAe;gBAC1B,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE;oBACP,iBAAiB,EAAE,KAAK,CAAC,OAAO;oBAChC,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,YAAY,EAAE,OAAO,EAAE,IAAI;oBAC3B,yBAAyB,EAAE,OAAO,EAAE,iBAAiB;iBACtD;aACF,CAAC,CACH,CAAC;YAEF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CACrC,cAAc,CAAC;oBACb,SAAS,EAAE,cAAc;oBACzB,MAAM,EAAE,KAAK,CAAC,OAAO;oBACrB,OAAO,EAAE,OAAO,CAAC,QAAQ;oBACzB,SAAS,EAAE,kBAAkB;oBAC7B,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE;wBACP,eAAe,EAAE,OAAO,CAAC,cAAc;qBACxC;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC;oBAClD,MAAM,EAAE,KAAK,CAAC,OAAO;oBACrB,SAAS,EAAE,cAAc;oBACzB,OAAO,EAAE,OAAO,CAAC,QAAQ;iBAC1B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC;gBACtE,cAAc;gBACd,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,MAAM;gBACN,YAAY,EAAE,KAAK,CAAC,aAAa;gBACjC,gBAAgB,EAAE,OAAO;oBACvB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,cAAc,EAAE,gBAAgB,IAAI,KAAK,CAAC,UAAU;gBACxD,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG;gBAC1B,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,EAAE,CAAC;oBAChC,gBAAgB,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;oBAC1C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC;oBACjC,cAAc,EAAE,cAAc;oBAC9B,wBAAwB,EACtB,KAAK,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;iBAClD;gBACD,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC;gBAC/B,cAAc;gBACd,KAAK;gBACL,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,OAAO;gBACP,eAAe;gBACf,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC;gBAC/B,cAAc;gBACd,KAAK;gBACL,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;gBAC1C,KAAK;aACN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAO5B;QACC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAC9D,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,eAAe,CAAC,MAAM,CAC/B,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAyB;YACrC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,gBAAgB,EAAE,OAAO,CAAC,eAAe,CAAC,gBAAgB;YAC1D,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG;YAC1B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B,CAAC;QACF,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CACrC,cAAc,CAAC;YACb,SAAS,EAAE,OAAO,CAAC,cAAc;YACjC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,SAAS;SAClB,CAAC,CACH,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC;gBACpD,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;gBAC7B,SAAS,EAAE,OAAO,CAAC,cAAc;gBACjC,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,cAAc;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;YACP,kBAAkB,EAAE,YAAY;YAChC,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAK5B;QACC,MAAM,OAAO,GACX,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAC9D,OAAO,CAAC,cAAc,EACtB,OAAO,CACR,CAAC;QACF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC;QAElD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CACrC,cAAc,CAAC;YACb,SAAS,EAAE,OAAO,CAAC,cAAc;YACjC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;YAC7B,OAAO;YACP,SAAS,EAAE,cAAc;YACzB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,KAAK,EAAE,OAAO;aACf;SACF,CAAC,CACH,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC;gBACvC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;gBAC7B,SAAS,EAAE,OAAO,CAAC,cAAc;gBACjC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;gBAC9B,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,cAAc;YAClC,OAAO;YACP,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;YAC3B,kBAAkB,EAAE,YAAY;YAChC,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,KAAK;aAChB;SACF,CAAC;IACJ,CAAC;CACF;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,OAOvB;IACC,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAI1B;IACC,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACxE,IAAI,CAAC,kBAAkB,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,cAAc,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,iBAAiB,EAAE,kBAAkB;QACrC,cAAc,EAAE,cAAc,CAAC,OAAO;QACtC,aAAa,EAAE,GAAG,cAAc,CAAC,GAAG,qBAAqB,kBAAkB,KAAK;KACjF,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,OAMvC;IACC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,WAAW,GACf,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI;QAC9D,CAAC,CAAC,uFAAuF;QACzF,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;QACL,gCAAgC;QAChC,qBAAqB,OAAO,CAAC,aAAa,EAAE;QAC5C,2BAA2B,OAAO,CAAC,eAAe,EAAE;QACpD,yBAAyB,OAAO,CAAC,YAAY,EAAE;QAC/C,WAAW;QACX,EAAE;QACF,0CAA0C;QAC1C,OAAO,IAAI,qCAAqC;QAChD,EAAE;QACF,oDAAoD;QACpD,OAAO,CAAC,UAAU;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -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"}