@rk0429/agentic-relay 3.5.0 → 3.7.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 +35 -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/relay-cli-service.d.ts +54 -0
- package/dist/application/relay-cli-service.js +174 -0
- package/dist/application/relay-cli-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 +74 -21
- 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 +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/process/process-executor.d.ts +12 -0
- package/dist/infrastructure/process/process-executor.js +20 -0
- package/dist/infrastructure/process/process-executor.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/launch-banner.d.ts +2 -0
- package/dist/interfaces/cli/launch-banner.js +16 -0
- package/dist/interfaces/cli/launch-banner.js.map +1 -0
- package/dist/interfaces/cli/relay-cli-args.d.ts +14 -0
- package/dist/interfaces/cli/relay-cli-args.js +58 -0
- package/dist/interfaces/cli/relay-cli-args.js.map +1 -0
- 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 +58 -2
|
@@ -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.7.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;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export function buildTaskTreeItemModels(nodes) {
|
|
2
|
+
return nodes.map((node) => ({
|
|
3
|
+
kind: "task",
|
|
4
|
+
id: node.task_id,
|
|
5
|
+
label: node.title,
|
|
6
|
+
description: describeTaskNode(node),
|
|
7
|
+
tooltip: taskTooltip(node),
|
|
8
|
+
icon: iconForTask(node.status),
|
|
9
|
+
children: buildTaskTreeItemModels(node.children),
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
export function buildActiveAgentItemModels(agents) {
|
|
13
|
+
return agents.map((agent) => ({
|
|
14
|
+
kind: "agent",
|
|
15
|
+
id: agent.agent_id,
|
|
16
|
+
label: activeAgentLabel(agent),
|
|
17
|
+
description: describeActiveAgent(agent),
|
|
18
|
+
tooltip: activeAgentTooltip(agent),
|
|
19
|
+
icon: "run",
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
export function emptySnapshot() {
|
|
23
|
+
return {
|
|
24
|
+
generated_at: new Date(0).toISOString(),
|
|
25
|
+
task_tree: [],
|
|
26
|
+
active_agents: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function describeTaskNode(node) {
|
|
30
|
+
const parts = [node.status];
|
|
31
|
+
if (node.agent_id) {
|
|
32
|
+
parts.push(`agent ${node.agent_id}`);
|
|
33
|
+
}
|
|
34
|
+
if (node.depends_on.length > 0) {
|
|
35
|
+
parts.push(`deps ${node.depends_on.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
if (node.status === "blocked" && node.blocked_reason) {
|
|
38
|
+
parts.push(truncate(node.blocked_reason, 80));
|
|
39
|
+
}
|
|
40
|
+
return parts.join(" · ");
|
|
41
|
+
}
|
|
42
|
+
export function taskTooltip(node) {
|
|
43
|
+
const lines = [
|
|
44
|
+
node.title,
|
|
45
|
+
`task_id: ${node.task_id}`,
|
|
46
|
+
`status: ${node.status}`,
|
|
47
|
+
`agent: ${node.agent_id ?? "-"}`,
|
|
48
|
+
`depends_on: ${node.depends_on.length > 0 ? node.depends_on.join(", ") : "-"}`,
|
|
49
|
+
];
|
|
50
|
+
if (node.warnings.length > 0) {
|
|
51
|
+
lines.push(`warnings: ${node.warnings.join(" | ")}`);
|
|
52
|
+
}
|
|
53
|
+
if (node.blocked_reason) {
|
|
54
|
+
lines.push(`blocked_reason: ${node.blocked_reason}`);
|
|
55
|
+
}
|
|
56
|
+
return lines.join("\n");
|
|
57
|
+
}
|
|
58
|
+
export function activeAgentLabel(agent) {
|
|
59
|
+
return agent.task_title ?? agent.task_id ?? agent.agent_id;
|
|
60
|
+
}
|
|
61
|
+
export function describeActiveAgent(agent) {
|
|
62
|
+
return `${agent.backend ?? "-"} · ${formatDuration(agent.running_for_seconds)}`;
|
|
63
|
+
}
|
|
64
|
+
export function activeAgentTooltip(agent) {
|
|
65
|
+
return [
|
|
66
|
+
agent.agent_id,
|
|
67
|
+
`task: ${agent.task_title ?? "-"} (${agent.task_id ?? "-"})`,
|
|
68
|
+
`backend: ${agent.backend ?? "-"}`,
|
|
69
|
+
`running: ${formatDuration(agent.running_for_seconds)}`,
|
|
70
|
+
`started_at: ${agent.started_at}`,
|
|
71
|
+
].join("\n");
|
|
72
|
+
}
|
|
73
|
+
export function formatDuration(totalSeconds) {
|
|
74
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
75
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
76
|
+
const seconds = totalSeconds % 60;
|
|
77
|
+
return [hours, minutes, seconds]
|
|
78
|
+
.map((value) => String(value).padStart(2, "0"))
|
|
79
|
+
.join(":");
|
|
80
|
+
}
|
|
81
|
+
function iconForTask(status) {
|
|
82
|
+
switch (status) {
|
|
83
|
+
case "backlog":
|
|
84
|
+
return "history";
|
|
85
|
+
case "ready":
|
|
86
|
+
return "circle-large-outline";
|
|
87
|
+
case "in_progress":
|
|
88
|
+
return "sync";
|
|
89
|
+
case "review":
|
|
90
|
+
return "eye";
|
|
91
|
+
case "blocked":
|
|
92
|
+
return "warning";
|
|
93
|
+
case "done":
|
|
94
|
+
return "pass";
|
|
95
|
+
case "superseded":
|
|
96
|
+
return "debug-step-over";
|
|
97
|
+
case "archived":
|
|
98
|
+
return "archive";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function truncate(value, maxLength) {
|
|
102
|
+
if (value.length <= maxLength) {
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
return `${value.slice(0, maxLength - 1)}…`;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=view-model.js.map
|