@rk0429/agentic-relay 3.5.0 → 3.6.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 +22 -1
- package/dist/application/projection-service.d.ts +11 -0
- package/dist/application/projection-service.js +115 -0
- package/dist/application/projection-service.js.map +1 -0
- package/dist/application/task-service.js +2 -11
- package/dist/application/task-service.js.map +1 -1
- package/dist/bin/relay.js +12 -2
- package/dist/bin/relay.js.map +1 -1
- package/dist/core/types.d.ts +26 -0
- package/dist/domain/task-management.d.ts +1 -0
- package/dist/domain/task-management.js +9 -0
- package/dist/domain/task-management.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/store/relay-store.d.ts +1 -0
- package/dist/infrastructure/store/relay-store.js +21 -0
- package/dist/infrastructure/store/relay-store.js.map +1 -1
- package/dist/interfaces/cli/visualization-renderer.d.ts +2 -0
- package/dist/interfaces/cli/visualization-renderer.js +102 -0
- package/dist/interfaces/cli/visualization-renderer.js.map +1 -0
- package/dist/interfaces/mcp/relay-mcp-server.js +1 -1
- package/dist/interfaces/vscode/extension.d.ts +3 -0
- package/dist/interfaces/vscode/extension.js +213 -0
- package/dist/interfaces/vscode/extension.js.map +1 -0
- package/dist/interfaces/vscode/relay-file-watcher.d.ts +23 -0
- package/dist/interfaces/vscode/relay-file-watcher.js +80 -0
- package/dist/interfaces/vscode/relay-file-watcher.js.map +1 -0
- package/dist/interfaces/vscode/tree-data-providers.d.ts +34 -0
- package/dist/interfaces/vscode/tree-data-providers.js +117 -0
- package/dist/interfaces/vscode/tree-data-providers.js.map +1 -0
- package/dist/interfaces/vscode/view-model.d.ts +27 -0
- package/dist/interfaces/vscode/view-model.js +107 -0
- package/dist/interfaces/vscode/view-model.js.map +1 -0
- package/package.json +55 -2
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const ANSI_RESET = "\u001B[0m";
|
|
2
|
+
const ANSI_BOLD = "\u001B[1m";
|
|
3
|
+
const ANSI_DIM = "\u001B[2m";
|
|
4
|
+
const ANSI_RED = "\u001B[31m";
|
|
5
|
+
const ANSI_GREEN = "\u001B[32m";
|
|
6
|
+
const ANSI_YELLOW = "\u001B[33m";
|
|
7
|
+
const ANSI_BLUE = "\u001B[34m";
|
|
8
|
+
const ANSI_MAGENTA = "\u001B[35m";
|
|
9
|
+
const ANSI_CYAN = "\u001B[36m";
|
|
10
|
+
const ANSI_GRAY = "\u001B[90m";
|
|
11
|
+
export function renderVisualization(snapshot) {
|
|
12
|
+
const lines = [
|
|
13
|
+
"Task Tree",
|
|
14
|
+
...renderTaskTree(snapshot.task_tree),
|
|
15
|
+
"",
|
|
16
|
+
"Active Agents",
|
|
17
|
+
...renderActiveAgents(snapshot.active_agents),
|
|
18
|
+
];
|
|
19
|
+
return `${lines.join("\n")}\n`;
|
|
20
|
+
}
|
|
21
|
+
function renderTaskTree(nodes) {
|
|
22
|
+
if (nodes.length === 0) {
|
|
23
|
+
return [`${ANSI_DIM}(no tasks)${ANSI_RESET}`];
|
|
24
|
+
}
|
|
25
|
+
const lines = [];
|
|
26
|
+
nodes.forEach((node, index) => {
|
|
27
|
+
appendTaskNode(lines, node, "", index === nodes.length - 1, true);
|
|
28
|
+
});
|
|
29
|
+
return lines;
|
|
30
|
+
}
|
|
31
|
+
function appendTaskNode(lines, node, prefix, isLast, isRoot = false) {
|
|
32
|
+
const branch = isRoot ? "" : `${prefix}${isLast ? "└─ " : "├─ "}`;
|
|
33
|
+
const blockedMarker = node.status === "blocked" ? `${ANSI_RED}${ANSI_BOLD}! ${ANSI_RESET}` : "";
|
|
34
|
+
const taskLine = [
|
|
35
|
+
`${branch}${blockedMarker}${colorizeStatus(node.status)} `,
|
|
36
|
+
`${node.title} `,
|
|
37
|
+
`${ANSI_DIM}(${node.task_id})${ANSI_RESET}`,
|
|
38
|
+
` agent=${node.agent_id ?? "-"}`,
|
|
39
|
+
` deps=${node.depends_on.length > 0 ? node.depends_on.join(",") : "-"}`,
|
|
40
|
+
].join("");
|
|
41
|
+
lines.push(taskLine);
|
|
42
|
+
const childPrefix = isRoot ? "" : `${prefix}${isLast ? " " : "│ "}`;
|
|
43
|
+
if (node.status === "blocked" && node.blocked_reason) {
|
|
44
|
+
const blockedLabel = node.blocked_kind === "dependency"
|
|
45
|
+
? "blocked by dependency"
|
|
46
|
+
: node.blocked_kind === "error"
|
|
47
|
+
? "blocked by error"
|
|
48
|
+
: "blocked";
|
|
49
|
+
lines.push(`${childPrefix}${ANSI_RED}!! ${blockedLabel}: ${node.blocked_reason}${ANSI_RESET}`);
|
|
50
|
+
}
|
|
51
|
+
node.children.forEach((child, index) => {
|
|
52
|
+
appendTaskNode(lines, child, childPrefix, index === node.children.length - 1, false);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function renderActiveAgents(activeAgents) {
|
|
56
|
+
if (activeAgents.length === 0) {
|
|
57
|
+
return [`${ANSI_DIM}(no active agents)${ANSI_RESET}`];
|
|
58
|
+
}
|
|
59
|
+
return activeAgents.map((agent) => {
|
|
60
|
+
const taskLabel = agent.task_title
|
|
61
|
+
? `${agent.task_title} (${agent.task_id})`
|
|
62
|
+
: (agent.task_id ?? "-");
|
|
63
|
+
return [
|
|
64
|
+
`${ANSI_BLUE}${agent.agent_id}${ANSI_RESET}`,
|
|
65
|
+
` task=${taskLabel}`,
|
|
66
|
+
` backend=${agent.backend ?? "-"}`,
|
|
67
|
+
` running=${formatDuration(agent.running_for_seconds)}`,
|
|
68
|
+
].join("");
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function colorizeStatus(status) {
|
|
72
|
+
const color = statusColor(status);
|
|
73
|
+
return `${color}[${status}]${ANSI_RESET}`;
|
|
74
|
+
}
|
|
75
|
+
function statusColor(status) {
|
|
76
|
+
switch (status) {
|
|
77
|
+
case "backlog":
|
|
78
|
+
return ANSI_GRAY;
|
|
79
|
+
case "ready":
|
|
80
|
+
return ANSI_CYAN;
|
|
81
|
+
case "in_progress":
|
|
82
|
+
return ANSI_BLUE;
|
|
83
|
+
case "review":
|
|
84
|
+
return ANSI_MAGENTA;
|
|
85
|
+
case "blocked":
|
|
86
|
+
return ANSI_RED;
|
|
87
|
+
case "done":
|
|
88
|
+
return ANSI_GREEN;
|
|
89
|
+
case "superseded":
|
|
90
|
+
case "archived":
|
|
91
|
+
return ANSI_DIM;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function formatDuration(totalSeconds) {
|
|
95
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
96
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
97
|
+
const seconds = totalSeconds % 60;
|
|
98
|
+
return [hours, minutes, seconds]
|
|
99
|
+
.map((value) => String(value).padStart(2, "0"))
|
|
100
|
+
.join(":");
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=visualization-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualization-renderer.js","sourceRoot":"","sources":["../../../src/interfaces/cli/visualization-renderer.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,GAAG,WAAW,CAAC;AAC/B,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC;AAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC;AAC9B,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,WAAW,GAAG,YAAY,CAAC;AACjC,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,QAA+B;IACjE,MAAM,KAAK,GAAG;QACZ,WAAW;QACX,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC;QACrC,EAAE;QACF,eAAe;QACf,GAAG,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC9C,CAAC;IAEF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,cAAc,CAAC,KAAqB;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,QAAQ,aAAa,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,KAAe,EACf,IAAkB,EAClB,MAAc,EACd,MAAe,EACf,MAAM,GAAG,KAAK;IAEd,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAClE,MAAM,aAAa,GACjB,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG;QACf,GAAG,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;QAC1D,GAAG,IAAI,CAAC,KAAK,GAAG;QAChB,GAAG,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE;QAC3C,UAAU,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE;QAChC,SAAS,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;KACxE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACrD,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY,KAAK,YAAY;YAChC,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,IAAI,CAAC,YAAY,KAAK,OAAO;gBAC7B,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,SAAS,CAAC;QAClB,KAAK,CAAC,IAAI,CACR,GAAG,WAAW,GAAG,QAAQ,MAAM,YAAY,KAAK,IAAI,CAAC,cAAc,GAAG,UAAU,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACrC,cAAc,CACZ,KAAK,EACL,KAAK,EACL,WAAW,EACX,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAClC,KAAK,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAkC;IAC5D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,QAAQ,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU;YAChC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,OAAO,GAAG;YAC1C,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QAC3B,OAAO;YACL,GAAG,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,UAAU,EAAE;YAC5C,SAAS,SAAS,EAAE;YACpB,YAAY,KAAK,CAAC,OAAO,IAAI,GAAG,EAAE;YAClC,YAAY,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE;SACxD,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;SAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC9C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -73,7 +73,7 @@ const deleteTaskInputSchema = {
|
|
|
73
73
|
export function createRelayMcpServer(options) {
|
|
74
74
|
const server = new McpServer({
|
|
75
75
|
name: "agentic-relay",
|
|
76
|
-
version: "3.
|
|
76
|
+
version: "3.6.0",
|
|
77
77
|
});
|
|
78
78
|
if (options.allowSpawnAgents) {
|
|
79
79
|
server.tool("spawn_agents", "Launch one or more child agent CLI processes in parallel.", spawnAgentsInputSchema, async (args, extra) => {
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { existsSync, watch } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import * as vscode from "vscode";
|
|
4
|
+
import { ProjectionService } from "../../application/projection-service.js";
|
|
5
|
+
import { RelayStore } from "../../infrastructure/store/relay-store.js";
|
|
6
|
+
import { activeAgentLabel, activeAgentTooltip, describeActiveAgent, describeTaskNode, taskTooltip, } from "./view-model.js";
|
|
7
|
+
const REFRESH_DEBOUNCE_MS = 150;
|
|
8
|
+
export function activate(context) {
|
|
9
|
+
const coordinator = new VisualizationCoordinator();
|
|
10
|
+
const taskProvider = new TaskTreeProvider(coordinator);
|
|
11
|
+
const agentProvider = new ActiveAgentsProvider(coordinator);
|
|
12
|
+
context.subscriptions.push(coordinator, taskProvider, agentProvider, vscode.window.registerTreeDataProvider("agenticRelay.taskTree", taskProvider), vscode.window.registerTreeDataProvider("agenticRelay.activeAgents", agentProvider), vscode.commands.registerCommand("agenticRelay.refreshViews", () => {
|
|
13
|
+
coordinator.refresh();
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
export function deactivate() { }
|
|
17
|
+
class VisualizationCoordinator {
|
|
18
|
+
emitter = new vscode.EventEmitter();
|
|
19
|
+
disposables = [];
|
|
20
|
+
watchers = [];
|
|
21
|
+
refreshTimer;
|
|
22
|
+
onDidChange = this.emitter.event;
|
|
23
|
+
constructor() {
|
|
24
|
+
this.rebuildWatchers();
|
|
25
|
+
this.disposables.push(vscode.workspace.onDidChangeWorkspaceFolders(() => {
|
|
26
|
+
this.rebuildWatchers();
|
|
27
|
+
this.scheduleRefresh();
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
async getSnapshot() {
|
|
31
|
+
const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
|
|
32
|
+
if (!workspaceFolder) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const store = new RelayStore(path.join(workspaceFolder.uri.fsPath, ".relay"));
|
|
36
|
+
const projectionService = new ProjectionService({
|
|
37
|
+
store,
|
|
38
|
+
});
|
|
39
|
+
return projectionService.getVisualizationSnapshot();
|
|
40
|
+
}
|
|
41
|
+
refresh() {
|
|
42
|
+
this.emitter.fire();
|
|
43
|
+
}
|
|
44
|
+
dispose() {
|
|
45
|
+
if (this.refreshTimer) {
|
|
46
|
+
clearTimeout(this.refreshTimer);
|
|
47
|
+
}
|
|
48
|
+
for (const watcher of this.watchers) {
|
|
49
|
+
watcher.close();
|
|
50
|
+
}
|
|
51
|
+
this.watchers.length = 0;
|
|
52
|
+
for (const disposable of this.disposables) {
|
|
53
|
+
disposable.dispose();
|
|
54
|
+
}
|
|
55
|
+
this.emitter.dispose();
|
|
56
|
+
}
|
|
57
|
+
scheduleRefresh() {
|
|
58
|
+
if (this.refreshTimer) {
|
|
59
|
+
clearTimeout(this.refreshTimer);
|
|
60
|
+
}
|
|
61
|
+
this.refreshTimer = setTimeout(() => {
|
|
62
|
+
this.refresh();
|
|
63
|
+
}, REFRESH_DEBOUNCE_MS);
|
|
64
|
+
}
|
|
65
|
+
rebuildWatchers() {
|
|
66
|
+
for (const watcher of this.watchers) {
|
|
67
|
+
watcher.close();
|
|
68
|
+
}
|
|
69
|
+
this.watchers.length = 0;
|
|
70
|
+
for (const workspaceFolder of vscode.workspace.workspaceFolders ?? []) {
|
|
71
|
+
for (const watchPath of relayWatchPaths(workspaceFolder.uri.fsPath)) {
|
|
72
|
+
if (!existsSync(watchPath)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const watcher = watch(watchPath, () => {
|
|
77
|
+
this.rebuildWatchers();
|
|
78
|
+
this.scheduleRefresh();
|
|
79
|
+
});
|
|
80
|
+
this.watchers.push(watcher);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Ignore unsupported watch targets and keep the view available.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
class TaskTreeProvider {
|
|
90
|
+
coordinator;
|
|
91
|
+
emitter = new vscode.EventEmitter();
|
|
92
|
+
onDidChangeTreeData = this.emitter.event;
|
|
93
|
+
subscription;
|
|
94
|
+
constructor(coordinator) {
|
|
95
|
+
this.coordinator = coordinator;
|
|
96
|
+
this.subscription = this.coordinator.onDidChange(() => {
|
|
97
|
+
this.emitter.fire(undefined);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
dispose() {
|
|
101
|
+
this.subscription.dispose();
|
|
102
|
+
this.emitter.dispose();
|
|
103
|
+
}
|
|
104
|
+
getTreeItem(element) {
|
|
105
|
+
return element;
|
|
106
|
+
}
|
|
107
|
+
async getChildren(element) {
|
|
108
|
+
if (element) {
|
|
109
|
+
return element.children;
|
|
110
|
+
}
|
|
111
|
+
const snapshot = await this.coordinator.getSnapshot();
|
|
112
|
+
if (!snapshot) {
|
|
113
|
+
return [messageItem("Open a workspace folder to inspect .relay data.")];
|
|
114
|
+
}
|
|
115
|
+
if (snapshot.task_tree.length === 0) {
|
|
116
|
+
return [messageItem("No tasks found under .relay/tasks.")];
|
|
117
|
+
}
|
|
118
|
+
return snapshot.task_tree.map((node) => toTaskItem(node));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
class ActiveAgentsProvider {
|
|
122
|
+
coordinator;
|
|
123
|
+
emitter = new vscode.EventEmitter();
|
|
124
|
+
onDidChangeTreeData = this.emitter.event;
|
|
125
|
+
subscription;
|
|
126
|
+
constructor(coordinator) {
|
|
127
|
+
this.coordinator = coordinator;
|
|
128
|
+
this.subscription = this.coordinator.onDidChange(() => {
|
|
129
|
+
this.emitter.fire(undefined);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
dispose() {
|
|
133
|
+
this.subscription.dispose();
|
|
134
|
+
this.emitter.dispose();
|
|
135
|
+
}
|
|
136
|
+
getTreeItem(element) {
|
|
137
|
+
return element;
|
|
138
|
+
}
|
|
139
|
+
async getChildren(element) {
|
|
140
|
+
if (element) {
|
|
141
|
+
return element.children;
|
|
142
|
+
}
|
|
143
|
+
const snapshot = await this.coordinator.getSnapshot();
|
|
144
|
+
if (!snapshot) {
|
|
145
|
+
return [messageItem("Open a workspace folder to inspect .relay data.")];
|
|
146
|
+
}
|
|
147
|
+
if (snapshot.active_agents.length === 0) {
|
|
148
|
+
return [messageItem("No active agents.")];
|
|
149
|
+
}
|
|
150
|
+
return snapshot.active_agents.map((agent) => toAgentItem(agent));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
class RelayTreeItem extends vscode.TreeItem {
|
|
154
|
+
children;
|
|
155
|
+
constructor(label, children = []) {
|
|
156
|
+
super(label, children.length > 0
|
|
157
|
+
? vscode.TreeItemCollapsibleState.Expanded
|
|
158
|
+
: vscode.TreeItemCollapsibleState.None);
|
|
159
|
+
this.children = children;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function toTaskItem(node) {
|
|
163
|
+
const item = new RelayTreeItem(node.title, node.children.map((child) => toTaskItem(child)));
|
|
164
|
+
item.id = node.task_id;
|
|
165
|
+
item.description = describeTaskNode(node);
|
|
166
|
+
item.tooltip = new vscode.MarkdownString(taskTooltip(node));
|
|
167
|
+
item.contextValue = node.status === "blocked" ? "agenticRelay.blockedTask" : "agenticRelay.task";
|
|
168
|
+
item.iconPath = taskStatusIcon(node.status);
|
|
169
|
+
return item;
|
|
170
|
+
}
|
|
171
|
+
function toAgentItem(agent) {
|
|
172
|
+
const item = new RelayTreeItem(activeAgentLabel(agent));
|
|
173
|
+
item.id = agent.agent_id;
|
|
174
|
+
item.description = describeActiveAgent(agent);
|
|
175
|
+
item.tooltip = new vscode.MarkdownString(activeAgentTooltip(agent));
|
|
176
|
+
item.contextValue = "agenticRelay.activeAgent";
|
|
177
|
+
item.iconPath = new vscode.ThemeIcon("run");
|
|
178
|
+
return item;
|
|
179
|
+
}
|
|
180
|
+
function messageItem(label) {
|
|
181
|
+
const item = new RelayTreeItem(label);
|
|
182
|
+
item.iconPath = new vscode.ThemeIcon("info");
|
|
183
|
+
return item;
|
|
184
|
+
}
|
|
185
|
+
function relayWatchPaths(workspacePath) {
|
|
186
|
+
return [
|
|
187
|
+
workspacePath,
|
|
188
|
+
path.join(workspacePath, ".relay"),
|
|
189
|
+
path.join(workspacePath, ".relay", "tasks"),
|
|
190
|
+
path.join(workspacePath, ".relay", "logs"),
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
function taskStatusIcon(status) {
|
|
194
|
+
switch (status) {
|
|
195
|
+
case "backlog":
|
|
196
|
+
return new vscode.ThemeIcon("circle-large-outline");
|
|
197
|
+
case "ready":
|
|
198
|
+
return new vscode.ThemeIcon("clock");
|
|
199
|
+
case "in_progress":
|
|
200
|
+
return new vscode.ThemeIcon("sync");
|
|
201
|
+
case "review":
|
|
202
|
+
return new vscode.ThemeIcon("eye");
|
|
203
|
+
case "blocked":
|
|
204
|
+
return new vscode.ThemeIcon("warning", new vscode.ThemeColor("list.errorForeground"));
|
|
205
|
+
case "done":
|
|
206
|
+
return new vscode.ThemeIcon("check", new vscode.ThemeColor("charts.green"));
|
|
207
|
+
case "superseded":
|
|
208
|
+
return new vscode.ThemeIcon("debug-step-over");
|
|
209
|
+
case "archived":
|
|
210
|
+
return new vscode.ThemeIcon("archive");
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/interfaces/vscode/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface DisposableWatcher {
|
|
2
|
+
close(): void;
|
|
3
|
+
}
|
|
4
|
+
type WatchFactory = (targetPath: string, listener: () => void) => DisposableWatcher;
|
|
5
|
+
export declare class RelayFileWatcher {
|
|
6
|
+
private readonly options;
|
|
7
|
+
private readonly watchFactory;
|
|
8
|
+
private readonly debounceMs;
|
|
9
|
+
private readonly watchers;
|
|
10
|
+
private refreshTimer?;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
workspaceRoot: string;
|
|
13
|
+
onChange: () => void;
|
|
14
|
+
watchFactory?: WatchFactory;
|
|
15
|
+
debounceMs?: number;
|
|
16
|
+
});
|
|
17
|
+
start(): void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
private syncWatchers;
|
|
20
|
+
private scheduleRefresh;
|
|
21
|
+
}
|
|
22
|
+
export declare function collectWatchTargets(workspaceRoot: string): string[];
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { existsSync, watch } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export class RelayFileWatcher {
|
|
4
|
+
options;
|
|
5
|
+
watchFactory;
|
|
6
|
+
debounceMs;
|
|
7
|
+
watchers = new Map();
|
|
8
|
+
refreshTimer;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
this.watchFactory = options.watchFactory ?? defaultWatchFactory;
|
|
12
|
+
this.debounceMs = options.debounceMs ?? 100;
|
|
13
|
+
}
|
|
14
|
+
start() {
|
|
15
|
+
this.syncWatchers();
|
|
16
|
+
}
|
|
17
|
+
dispose() {
|
|
18
|
+
if (this.refreshTimer) {
|
|
19
|
+
clearTimeout(this.refreshTimer);
|
|
20
|
+
this.refreshTimer = undefined;
|
|
21
|
+
}
|
|
22
|
+
for (const watcher of this.watchers.values()) {
|
|
23
|
+
watcher.close();
|
|
24
|
+
}
|
|
25
|
+
this.watchers.clear();
|
|
26
|
+
}
|
|
27
|
+
syncWatchers() {
|
|
28
|
+
const nextTargets = new Set(collectWatchTargets(this.options.workspaceRoot));
|
|
29
|
+
for (const [targetPath, watcher] of this.watchers.entries()) {
|
|
30
|
+
if (nextTargets.has(targetPath)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
watcher.close();
|
|
34
|
+
this.watchers.delete(targetPath);
|
|
35
|
+
}
|
|
36
|
+
for (const targetPath of nextTargets) {
|
|
37
|
+
if (this.watchers.has(targetPath)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const watcher = this.watchFactory(targetPath, () => {
|
|
41
|
+
this.syncWatchers();
|
|
42
|
+
this.scheduleRefresh();
|
|
43
|
+
});
|
|
44
|
+
this.watchers.set(targetPath, watcher);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
scheduleRefresh() {
|
|
48
|
+
if (this.refreshTimer) {
|
|
49
|
+
clearTimeout(this.refreshTimer);
|
|
50
|
+
}
|
|
51
|
+
this.refreshTimer = setTimeout(() => {
|
|
52
|
+
this.refreshTimer = undefined;
|
|
53
|
+
this.options.onChange();
|
|
54
|
+
}, this.debounceMs);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function collectWatchTargets(workspaceRoot) {
|
|
58
|
+
const relayRoot = path.join(workspaceRoot, ".relay");
|
|
59
|
+
return [
|
|
60
|
+
workspaceRoot,
|
|
61
|
+
relayRoot,
|
|
62
|
+
path.join(relayRoot, "tasks"),
|
|
63
|
+
path.join(relayRoot, "logs"),
|
|
64
|
+
].filter((targetPath, index, allTargets) => {
|
|
65
|
+
if (index === 0) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return existsSync(targetPath) && allTargets.indexOf(targetPath) === index;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function defaultWatchFactory(targetPath, listener) {
|
|
72
|
+
const watcher = watch(targetPath, { persistent: false }, () => {
|
|
73
|
+
listener();
|
|
74
|
+
});
|
|
75
|
+
watcher.on("error", () => {
|
|
76
|
+
listener();
|
|
77
|
+
});
|
|
78
|
+
return watcher;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=relay-file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-file-watcher.js","sourceRoot":"","sources":["../../../src/interfaces/vscode/relay-file-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as vscode from "vscode";
|
|
2
|
+
import type { VisualizationSnapshot } from "../../core/types.js";
|
|
3
|
+
import { type ActiveAgentItemModel, type TaskTreeItemModel } from "./view-model.js";
|
|
4
|
+
type SnapshotLoader = () => Promise<VisualizationSnapshot>;
|
|
5
|
+
type TreeNode = TaskTreeItemModel | ActiveAgentItemModel | {
|
|
6
|
+
kind: "message";
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class TaskTreeDataProvider implements vscode.TreeDataProvider<TreeNode> {
|
|
12
|
+
private readonly loadSnapshot;
|
|
13
|
+
private readonly didChangeTreeDataEmitter;
|
|
14
|
+
private items;
|
|
15
|
+
readonly onDidChangeTreeData: vscode.Event<void | TreeNode | undefined>;
|
|
16
|
+
constructor(loadSnapshot: SnapshotLoader);
|
|
17
|
+
refresh(): Promise<void>;
|
|
18
|
+
getTreeItem(element: TreeNode): vscode.TreeItem;
|
|
19
|
+
getChildren(element?: TreeNode): vscode.ProviderResult<TreeNode[]>;
|
|
20
|
+
dispose(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class ActiveAgentDataProvider implements vscode.TreeDataProvider<TreeNode> {
|
|
23
|
+
private readonly loadSnapshot;
|
|
24
|
+
private readonly didChangeTreeDataEmitter;
|
|
25
|
+
private items;
|
|
26
|
+
readonly onDidChangeTreeData: vscode.Event<void | TreeNode | undefined>;
|
|
27
|
+
constructor(loadSnapshot: SnapshotLoader);
|
|
28
|
+
refresh(): Promise<void>;
|
|
29
|
+
getTreeItem(element: TreeNode): vscode.TreeItem;
|
|
30
|
+
getChildren(): vscode.ProviderResult<TreeNode[]>;
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
export declare function createSnapshotLoader(workspaceRoot?: string, projectionFactory?: (workspaceRoot: string) => SnapshotLoader): SnapshotLoader;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as vscode from "vscode";
|
|
2
|
+
import { buildActiveAgentItemModels, buildTaskTreeItemModels, emptySnapshot, } from "./view-model.js";
|
|
3
|
+
export class TaskTreeDataProvider {
|
|
4
|
+
loadSnapshot;
|
|
5
|
+
didChangeTreeDataEmitter = new vscode.EventEmitter();
|
|
6
|
+
items = [messageNode("task-empty", "No tasks found.")];
|
|
7
|
+
onDidChangeTreeData = this.didChangeTreeDataEmitter.event;
|
|
8
|
+
constructor(loadSnapshot) {
|
|
9
|
+
this.loadSnapshot = loadSnapshot;
|
|
10
|
+
}
|
|
11
|
+
async refresh() {
|
|
12
|
+
this.items = await loadTaskItems(this.loadSnapshot);
|
|
13
|
+
this.didChangeTreeDataEmitter.fire(undefined);
|
|
14
|
+
}
|
|
15
|
+
getTreeItem(element) {
|
|
16
|
+
if (element.kind === "message") {
|
|
17
|
+
const item = new vscode.TreeItem(element.label, vscode.TreeItemCollapsibleState.None);
|
|
18
|
+
item.description = element.description;
|
|
19
|
+
item.contextValue = "agenticRelay.message";
|
|
20
|
+
return item;
|
|
21
|
+
}
|
|
22
|
+
const item = new vscode.TreeItem(element.label, element.kind === "task" && element.children.length > 0
|
|
23
|
+
? vscode.TreeItemCollapsibleState.Collapsed
|
|
24
|
+
: vscode.TreeItemCollapsibleState.None);
|
|
25
|
+
item.id = element.id;
|
|
26
|
+
item.description = element.description;
|
|
27
|
+
item.tooltip = element.tooltip;
|
|
28
|
+
item.iconPath = new vscode.ThemeIcon(element.icon);
|
|
29
|
+
item.contextValue =
|
|
30
|
+
element.kind === "task" ? "agenticRelay.task" : "agenticRelay.agent";
|
|
31
|
+
return item;
|
|
32
|
+
}
|
|
33
|
+
getChildren(element) {
|
|
34
|
+
if (!element) {
|
|
35
|
+
return this.items;
|
|
36
|
+
}
|
|
37
|
+
if (element.kind !== "task") {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
return element.children;
|
|
41
|
+
}
|
|
42
|
+
dispose() {
|
|
43
|
+
this.didChangeTreeDataEmitter.dispose();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class ActiveAgentDataProvider {
|
|
47
|
+
loadSnapshot;
|
|
48
|
+
didChangeTreeDataEmitter = new vscode.EventEmitter();
|
|
49
|
+
items = [messageNode("agents-empty", "No active agents.")];
|
|
50
|
+
onDidChangeTreeData = this.didChangeTreeDataEmitter.event;
|
|
51
|
+
constructor(loadSnapshot) {
|
|
52
|
+
this.loadSnapshot = loadSnapshot;
|
|
53
|
+
}
|
|
54
|
+
async refresh() {
|
|
55
|
+
this.items = await loadAgentItems(this.loadSnapshot);
|
|
56
|
+
this.didChangeTreeDataEmitter.fire(undefined);
|
|
57
|
+
}
|
|
58
|
+
getTreeItem(element) {
|
|
59
|
+
if (element.kind === "message") {
|
|
60
|
+
const item = new vscode.TreeItem(element.label, vscode.TreeItemCollapsibleState.None);
|
|
61
|
+
item.description = element.description;
|
|
62
|
+
item.contextValue = "agenticRelay.message";
|
|
63
|
+
return item;
|
|
64
|
+
}
|
|
65
|
+
const item = new vscode.TreeItem(element.label, vscode.TreeItemCollapsibleState.None);
|
|
66
|
+
item.id = element.id;
|
|
67
|
+
item.description = element.description;
|
|
68
|
+
item.tooltip = element.tooltip;
|
|
69
|
+
item.iconPath = new vscode.ThemeIcon(element.icon);
|
|
70
|
+
item.contextValue = "agenticRelay.agent";
|
|
71
|
+
return item;
|
|
72
|
+
}
|
|
73
|
+
getChildren() {
|
|
74
|
+
return this.items;
|
|
75
|
+
}
|
|
76
|
+
dispose() {
|
|
77
|
+
this.didChangeTreeDataEmitter.dispose();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function loadTaskItems(loadSnapshot) {
|
|
81
|
+
try {
|
|
82
|
+
const snapshot = await loadSnapshot();
|
|
83
|
+
const items = buildTaskTreeItemModels(snapshot.task_tree);
|
|
84
|
+
return items.length > 0 ? items : [messageNode("task-empty", "No tasks found.")];
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return [messageNode("task-error", "Failed to load tasks.", toErrorMessage(error))];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function loadAgentItems(loadSnapshot) {
|
|
91
|
+
try {
|
|
92
|
+
const snapshot = await loadSnapshot();
|
|
93
|
+
const items = buildActiveAgentItemModels(snapshot.active_agents);
|
|
94
|
+
return items.length > 0 ? items : [messageNode("agents-empty", "No active agents.")];
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return [messageNode("agents-error", "Failed to load active agents.", toErrorMessage(error))];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function createSnapshotLoader(workspaceRoot, projectionFactory) {
|
|
101
|
+
if (!workspaceRoot || !projectionFactory) {
|
|
102
|
+
return async () => emptySnapshot();
|
|
103
|
+
}
|
|
104
|
+
return projectionFactory(workspaceRoot);
|
|
105
|
+
}
|
|
106
|
+
function messageNode(id, label, description) {
|
|
107
|
+
return {
|
|
108
|
+
kind: "message",
|
|
109
|
+
id,
|
|
110
|
+
label,
|
|
111
|
+
description,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function toErrorMessage(error) {
|
|
115
|
+
return error instanceof Error ? error.message : "Unknown error";
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=tree-data-providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-data-providers.js","sourceRoot":"","sources":["../../../src/interfaces/vscode/tree-data-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ActiveAgentSummary, TaskTreeNode, VisualizationSnapshot } from "../../core/types.js";
|
|
2
|
+
export interface TaskTreeItemModel {
|
|
3
|
+
kind: "task";
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description: string;
|
|
7
|
+
tooltip: string;
|
|
8
|
+
icon: string;
|
|
9
|
+
children: TaskTreeItemModel[];
|
|
10
|
+
}
|
|
11
|
+
export interface ActiveAgentItemModel {
|
|
12
|
+
kind: "agent";
|
|
13
|
+
id: string;
|
|
14
|
+
label: string;
|
|
15
|
+
description: string;
|
|
16
|
+
tooltip: string;
|
|
17
|
+
icon: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildTaskTreeItemModels(nodes: TaskTreeNode[]): TaskTreeItemModel[];
|
|
20
|
+
export declare function buildActiveAgentItemModels(agents: ActiveAgentSummary[]): ActiveAgentItemModel[];
|
|
21
|
+
export declare function emptySnapshot(): VisualizationSnapshot;
|
|
22
|
+
export declare function describeTaskNode(node: TaskTreeNode): string;
|
|
23
|
+
export declare function taskTooltip(node: TaskTreeNode): string;
|
|
24
|
+
export declare function activeAgentLabel(agent: ActiveAgentSummary): string;
|
|
25
|
+
export declare function describeActiveAgent(agent: ActiveAgentSummary): string;
|
|
26
|
+
export declare function activeAgentTooltip(agent: ActiveAgentSummary): string;
|
|
27
|
+
export declare function formatDuration(totalSeconds: number): string;
|