@rk0429/agentic-relay 3.4.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.
Files changed (41) hide show
  1. package/README.md +36 -1
  2. package/dist/application/projection-service.d.ts +11 -0
  3. package/dist/application/projection-service.js +115 -0
  4. package/dist/application/projection-service.js.map +1 -0
  5. package/dist/application/spawn-agents-service.js +6 -2
  6. package/dist/application/spawn-agents-service.js.map +1 -1
  7. package/dist/application/task-service.js +2 -11
  8. package/dist/application/task-service.js.map +1 -1
  9. package/dist/bin/relay.js +12 -2
  10. package/dist/bin/relay.js.map +1 -1
  11. package/dist/core/types.d.ts +30 -0
  12. package/dist/core/types.js.map +1 -1
  13. package/dist/domain/routing.d.ts +4 -1
  14. package/dist/domain/routing.js +25 -3
  15. package/dist/domain/routing.js.map +1 -1
  16. package/dist/domain/task-management.d.ts +1 -0
  17. package/dist/domain/task-management.js +9 -0
  18. package/dist/domain/task-management.js.map +1 -1
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +2 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/infrastructure/store/relay-store.d.ts +4 -1
  23. package/dist/infrastructure/store/relay-store.js +43 -0
  24. package/dist/infrastructure/store/relay-store.js.map +1 -1
  25. package/dist/interfaces/cli/visualization-renderer.d.ts +2 -0
  26. package/dist/interfaces/cli/visualization-renderer.js +102 -0
  27. package/dist/interfaces/cli/visualization-renderer.js.map +1 -0
  28. package/dist/interfaces/mcp/relay-mcp-server.js +1 -1
  29. package/dist/interfaces/vscode/extension.d.ts +3 -0
  30. package/dist/interfaces/vscode/extension.js +213 -0
  31. package/dist/interfaces/vscode/extension.js.map +1 -0
  32. package/dist/interfaces/vscode/relay-file-watcher.d.ts +23 -0
  33. package/dist/interfaces/vscode/relay-file-watcher.js +80 -0
  34. package/dist/interfaces/vscode/relay-file-watcher.js.map +1 -0
  35. package/dist/interfaces/vscode/tree-data-providers.d.ts +34 -0
  36. package/dist/interfaces/vscode/tree-data-providers.js +117 -0
  37. package/dist/interfaces/vscode/tree-data-providers.js.map +1 -0
  38. package/dist/interfaces/vscode/view-model.d.ts +27 -0
  39. package/dist/interfaces/vscode/view-model.js +107 -0
  40. package/dist/interfaces/vscode/view-model.js.map +1 -0
  41. package/package.json +55 -2
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-model.js","sourceRoot":"","sources":["../../../src/interfaces/vscode/view-model.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "@rk0429/agentic-relay",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
+ "displayName": "agentic-relay",
4
5
  "description": "Unified MCP relay for Claude Code, Codex CLI, and Gemini CLI",
5
6
  "type": "module",
7
+ "main": "./dist/interfaces/vscode/extension.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": "./dist/index.js",
11
+ "./package.json": "./package.json"
12
+ },
6
13
  "license": "Apache-2.0",
7
14
  "author": "RK0429",
15
+ "publisher": "rk0429",
8
16
  "repository": {
9
17
  "type": "git",
10
18
  "url": "git+https://github.com/RK0429/agentic-relay.git"
@@ -26,6 +34,48 @@
26
34
  "bin": {
27
35
  "relay": "./dist/bin/relay.js"
28
36
  },
37
+ "categories": [
38
+ "Other"
39
+ ],
40
+ "activationEvents": [
41
+ "onView:agenticRelay.taskTree",
42
+ "onView:agenticRelay.activeAgents",
43
+ "onCommand:agenticRelay.refreshViews"
44
+ ],
45
+ "contributes": {
46
+ "views": {
47
+ "explorer": [
48
+ {
49
+ "id": "agenticRelay.taskTree",
50
+ "name": "Agentic Relay Tasks"
51
+ },
52
+ {
53
+ "id": "agenticRelay.activeAgents",
54
+ "name": "Agentic Relay Agents"
55
+ }
56
+ ]
57
+ },
58
+ "commands": [
59
+ {
60
+ "command": "agenticRelay.refreshViews",
61
+ "title": "Refresh Agentic Relay Views"
62
+ }
63
+ ],
64
+ "menus": {
65
+ "view/title": [
66
+ {
67
+ "command": "agenticRelay.refreshViews",
68
+ "when": "view == agenticRelay.taskTree",
69
+ "group": "navigation"
70
+ },
71
+ {
72
+ "command": "agenticRelay.refreshViews",
73
+ "when": "view == agenticRelay.activeAgents",
74
+ "group": "navigation"
75
+ }
76
+ ]
77
+ }
78
+ },
29
79
  "files": [
30
80
  "dist",
31
81
  "README.md"
@@ -38,10 +88,12 @@
38
88
  "typecheck": "tsc -p tsconfig.json --noEmit",
39
89
  "test": "vitest run",
40
90
  "relay": "tsx src/bin/relay.ts",
91
+ "vscode:prepublish": "pnpm build",
41
92
  "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
42
93
  },
43
94
  "engines": {
44
- "node": ">=24.0.0"
95
+ "node": ">=24.0.0",
96
+ "vscode": "^1.110.0"
45
97
  },
46
98
  "dependencies": {
47
99
  "@modelcontextprotocol/sdk": "1.27.1",
@@ -49,6 +101,7 @@
49
101
  },
50
102
  "devDependencies": {
51
103
  "@types/node": "24.7.2",
104
+ "@types/vscode": "^1.110.0",
52
105
  "tsx": "4.21.0",
53
106
  "typescript": "5.9.3",
54
107
  "vitest": "4.0.18"