@wings006/agent-link 0.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.
@@ -0,0 +1,199 @@
1
+ import WebSocket from "ws";
2
+ export class RelayClient {
3
+ ws = null;
4
+ relayUrl;
5
+ agentName;
6
+ skills;
7
+ remoteAgents = new Map();
8
+ pendingRequests = new Map();
9
+ onAgentFound;
10
+ onAgentLost;
11
+ onMessageReceived;
12
+ reconnectTimer = null;
13
+ destroyed = false;
14
+ requestIdCounter = 0;
15
+ constructor(relayUrl, agentName, skills) {
16
+ this.relayUrl = relayUrl;
17
+ this.agentName = agentName;
18
+ this.skills = skills;
19
+ }
20
+ setOnAgentFound(handler) {
21
+ this.onAgentFound = handler;
22
+ }
23
+ setOnAgentLost(handler) {
24
+ this.onAgentLost = handler;
25
+ }
26
+ setOnMessageReceived(handler) {
27
+ this.onMessageReceived = handler;
28
+ }
29
+ connect() {
30
+ if (this.destroyed)
31
+ return;
32
+ this.ws = new WebSocket(this.relayUrl);
33
+ this.ws.on("open", () => {
34
+ console.error(`[relay-client] 已连接到中继服务器 ${this.relayUrl}`);
35
+ // 注册自己
36
+ this.send({
37
+ type: "register",
38
+ name: this.agentName,
39
+ skills: this.skills,
40
+ version: "1.0",
41
+ });
42
+ });
43
+ this.ws.on("message", (data) => {
44
+ let msg;
45
+ try {
46
+ msg = JSON.parse(data.toString());
47
+ }
48
+ catch {
49
+ return;
50
+ }
51
+ this.handleMessage(msg);
52
+ });
53
+ this.ws.on("close", () => {
54
+ console.error("[relay-client] 连接断开,5 秒后重连...");
55
+ this.scheduleReconnect();
56
+ });
57
+ this.ws.on("error", (err) => {
58
+ console.error(`[relay-client] 连接错误: ${err.message}`);
59
+ });
60
+ }
61
+ scheduleReconnect() {
62
+ if (this.destroyed)
63
+ return;
64
+ if (this.reconnectTimer)
65
+ return;
66
+ this.reconnectTimer = setTimeout(() => {
67
+ this.reconnectTimer = null;
68
+ this.connect();
69
+ }, 5000);
70
+ }
71
+ send(msg) {
72
+ if (this.ws?.readyState === WebSocket.OPEN) {
73
+ this.ws.send(JSON.stringify(msg));
74
+ }
75
+ }
76
+ handleMessage(msg) {
77
+ switch (msg.type) {
78
+ case "agents": {
79
+ const newNames = new Set();
80
+ for (const a of msg.agents || []) {
81
+ if (a.name === this.agentName)
82
+ continue;
83
+ newNames.add(a.name);
84
+ if (!this.remoteAgents.has(a.name)) {
85
+ const agent = {
86
+ name: a.name,
87
+ host: "relay",
88
+ port: 0,
89
+ skills: a.skills,
90
+ version: a.version,
91
+ status: "online",
92
+ };
93
+ this.remoteAgents.set(a.name, agent);
94
+ this.onAgentFound?.(agent);
95
+ }
96
+ }
97
+ // 检查离线的
98
+ for (const name of this.remoteAgents.keys()) {
99
+ if (!newNames.has(name)) {
100
+ this.remoteAgents.delete(name);
101
+ this.onAgentLost?.(name);
102
+ }
103
+ }
104
+ break;
105
+ }
106
+ case "relay": {
107
+ // 收到转发的 A2A 请求
108
+ if (msg.payload && msg.from) {
109
+ this.handleRelayedRequest(msg.from, msg.payload, msg.requestId);
110
+ }
111
+ break;
112
+ }
113
+ case "relay_response": {
114
+ // 收到转发的响应
115
+ const pending = msg.requestId ? this.pendingRequests.get(msg.requestId) : null;
116
+ if (pending) {
117
+ this.pendingRequests.delete(msg.requestId);
118
+ if (msg.error) {
119
+ pending.reject(new Error(msg.error));
120
+ }
121
+ else {
122
+ pending.resolve(msg.payload);
123
+ }
124
+ }
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ async handleRelayedRequest(from, payload, requestId) {
130
+ if (!this.onMessageReceived)
131
+ return;
132
+ try {
133
+ const response = await this.onMessageReceived(from, payload);
134
+ // 发回响应
135
+ if (requestId) {
136
+ this.send({
137
+ type: "relay_response",
138
+ to: from,
139
+ payload: response,
140
+ requestId,
141
+ });
142
+ }
143
+ }
144
+ catch (err) {
145
+ if (requestId) {
146
+ this.send({
147
+ type: "relay_response",
148
+ to: from,
149
+ requestId,
150
+ error: err instanceof Error ? err.message : String(err),
151
+ });
152
+ }
153
+ }
154
+ }
155
+ // 通过中继发送 A2A 请求
156
+ async sendRequest(to, payload, timeoutMs = 30000) {
157
+ const requestId = `req-${++this.requestIdCounter}-${Date.now()}`;
158
+ return new Promise((resolve, reject) => {
159
+ const timer = setTimeout(() => {
160
+ this.pendingRequests.delete(requestId);
161
+ reject(new Error(`中继请求超时: ${to}`));
162
+ }, timeoutMs);
163
+ this.pendingRequests.set(requestId, {
164
+ resolve: (v) => {
165
+ clearTimeout(timer);
166
+ resolve(v);
167
+ },
168
+ reject: (e) => {
169
+ clearTimeout(timer);
170
+ reject(e);
171
+ },
172
+ });
173
+ this.send({
174
+ type: "relay",
175
+ from: this.agentName,
176
+ to,
177
+ payload,
178
+ requestId,
179
+ });
180
+ });
181
+ }
182
+ getAgents() {
183
+ return [...this.remoteAgents.values()];
184
+ }
185
+ getAgent(name) {
186
+ return this.remoteAgents.get(name);
187
+ }
188
+ isRelayAgent(name) {
189
+ return this.remoteAgents.has(name);
190
+ }
191
+ destroy() {
192
+ this.destroyed = true;
193
+ if (this.reconnectTimer) {
194
+ clearTimeout(this.reconnectTimer);
195
+ }
196
+ this.ws?.close();
197
+ }
198
+ }
199
+ //# sourceMappingURL=relay-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../src/relay-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Agent Link 中继服务器
4
+ * 部署在公网,让不同网络的 Agent 通过 WebSocket 互相发现和通信
5
+ *
6
+ * 用法: node relay-server.js [--port 3458]
7
+ */
8
+ export {};
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Agent Link 中继服务器
4
+ * 部署在公网,让不同网络的 Agent 通过 WebSocket 互相发现和通信
5
+ *
6
+ * 用法: node relay-server.js [--port 3458]
7
+ */
8
+ import { WebSocketServer, WebSocket } from "ws";
9
+ const DEFAULT_PORT = 3458;
10
+ const agents = new Map();
11
+ function broadcastAgentList() {
12
+ const list = [...agents.values()].map((a) => ({
13
+ name: a.name,
14
+ skills: a.skills,
15
+ version: a.version,
16
+ }));
17
+ const msg = JSON.stringify({ type: "agents", agents: list });
18
+ for (const agent of agents.values()) {
19
+ if (agent.ws.readyState === WebSocket.OPEN) {
20
+ agent.ws.send(msg);
21
+ }
22
+ }
23
+ }
24
+ function startRelay(port) {
25
+ const wss = new WebSocketServer({ port });
26
+ wss.on("connection", (ws) => {
27
+ let agentName = null;
28
+ ws.on("message", (data) => {
29
+ let msg;
30
+ try {
31
+ msg = JSON.parse(data.toString());
32
+ }
33
+ catch {
34
+ return;
35
+ }
36
+ switch (msg.type) {
37
+ case "register": {
38
+ if (!msg.name)
39
+ return;
40
+ agentName = msg.name;
41
+ agents.set(agentName, {
42
+ name: agentName,
43
+ skills: msg.skills || [],
44
+ version: msg.version || "1.0",
45
+ ws,
46
+ });
47
+ console.log(`[relay] Agent 注册: ${agentName} (在线: ${agents.size})`);
48
+ broadcastAgentList();
49
+ break;
50
+ }
51
+ case "relay": {
52
+ // 转发 A2A 消息给目标 Agent
53
+ if (!msg.to || !msg.payload)
54
+ return;
55
+ const target = agents.get(msg.to);
56
+ if (target && target.ws.readyState === WebSocket.OPEN) {
57
+ target.ws.send(JSON.stringify({
58
+ type: "relay",
59
+ from: msg.from || agentName,
60
+ payload: msg.payload,
61
+ requestId: msg.requestId,
62
+ }));
63
+ }
64
+ else {
65
+ // 目标不在线,返回错误
66
+ ws.send(JSON.stringify({
67
+ type: "relay_response",
68
+ requestId: msg.requestId,
69
+ error: `Agent "${msg.to}" 不在线`,
70
+ }));
71
+ }
72
+ break;
73
+ }
74
+ case "relay_response": {
75
+ // 转发响应回给发送方
76
+ if (!msg.to || !msg.requestId)
77
+ return;
78
+ const sender = agents.get(msg.to);
79
+ if (sender && sender.ws.readyState === WebSocket.OPEN) {
80
+ sender.ws.send(JSON.stringify(msg));
81
+ }
82
+ break;
83
+ }
84
+ }
85
+ });
86
+ ws.on("close", () => {
87
+ if (agentName) {
88
+ agents.delete(agentName);
89
+ console.log(`[relay] Agent 离线: ${agentName} (在线: ${agents.size})`);
90
+ broadcastAgentList();
91
+ }
92
+ });
93
+ ws.on("error", (err) => {
94
+ console.error(`[relay] WebSocket 错误:`, err.message);
95
+ });
96
+ });
97
+ console.log(`[relay] 中继服务器启动在端口 ${port}`);
98
+ }
99
+ // CLI
100
+ const args = process.argv.slice(2);
101
+ let port = DEFAULT_PORT;
102
+ for (let i = 0; i < args.length; i++) {
103
+ if (args[i] === "--port" || args[i] === "-p") {
104
+ port = parseInt(args[++i], 10);
105
+ }
106
+ }
107
+ startRelay(port);
108
+ //# sourceMappingURL=relay-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-server.js","sourceRoot":"","sources":["../src/relay-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { Task } from "./types.js";
3
+ export declare class TaskStore extends EventEmitter {
4
+ private db;
5
+ private stmtInsert;
6
+ private stmtGet;
7
+ private stmtUpdate;
8
+ private stmtInbox;
9
+ private stmtInboxUnread;
10
+ private stmtOutbox;
11
+ private stmtPending;
12
+ private stmtTrackOutbound;
13
+ private stmtGetOutbound;
14
+ private stmtMarkRead;
15
+ private stmtMarkAllRead;
16
+ private stmtClearRead;
17
+ private stmtClearAll;
18
+ private stmtClearOldest;
19
+ private stmtInboxCount;
20
+ constructor(dbPath?: string);
21
+ private rowToTask;
22
+ createTask(from: string, to: string, message: string, callbackUrl?: string): Task;
23
+ getTask(id: string): Task | undefined;
24
+ updateTask(id: string, updates: Partial<Pick<Task, "status" | "result">>): Task | undefined;
25
+ getInbox(agentName: string, unreadOnly?: boolean): Task[];
26
+ getOutbox(agentName: string): Task[];
27
+ getPending(agentName: string): Task[];
28
+ markRead(taskId: string): boolean;
29
+ markAllRead(agentName: string): number;
30
+ clearInbox(agentName: string, readOnly?: boolean): number;
31
+ clearOldest(agentName: string, count: number): number;
32
+ getInboxCount(agentName: string): number;
33
+ trackOutbound(taskId: string, targetName: string): void;
34
+ getOutboundTarget(taskId: string): string | undefined;
35
+ close(): void;
36
+ }
@@ -0,0 +1,167 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import Database from "better-sqlite3";
3
+ import { mkdirSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import path from "node:path";
6
+ import { EventEmitter } from "node:events";
7
+ function localISOString() {
8
+ return new Date().toLocaleString("sv-SE", { timeZone: "Asia/Shanghai", hour12: false }) + " CST";
9
+ }
10
+ export class TaskStore extends EventEmitter {
11
+ db;
12
+ stmtInsert;
13
+ stmtGet;
14
+ stmtUpdate;
15
+ stmtInbox;
16
+ stmtInboxUnread;
17
+ stmtOutbox;
18
+ stmtPending;
19
+ stmtTrackOutbound;
20
+ stmtGetOutbound;
21
+ stmtMarkRead;
22
+ stmtMarkAllRead;
23
+ stmtClearRead;
24
+ stmtClearAll;
25
+ stmtClearOldest;
26
+ stmtInboxCount;
27
+ constructor(dbPath) {
28
+ super();
29
+ const resolvedPath = dbPath || path.join(homedir(), ".agent-link", "tasks.db");
30
+ if (resolvedPath !== ":memory:") {
31
+ mkdirSync(path.dirname(resolvedPath), { recursive: true });
32
+ }
33
+ this.db = new Database(resolvedPath);
34
+ this.db.pragma("journal_mode = WAL");
35
+ this.db.exec(`
36
+ CREATE TABLE IF NOT EXISTS tasks (
37
+ id TEXT PRIMARY KEY,
38
+ from_agent TEXT NOT NULL,
39
+ to_agent TEXT NOT NULL,
40
+ message TEXT NOT NULL,
41
+ status TEXT NOT NULL,
42
+ result TEXT,
43
+ callback_url TEXT,
44
+ created_at TEXT NOT NULL,
45
+ updated_at TEXT NOT NULL
46
+ );
47
+ CREATE INDEX IF NOT EXISTS idx_tasks_from ON tasks(from_agent);
48
+ CREATE INDEX IF NOT EXISTS idx_tasks_to ON tasks(to_agent);
49
+
50
+ CREATE TABLE IF NOT EXISTS outbound_tasks (
51
+ task_id TEXT PRIMARY KEY,
52
+ target_name TEXT NOT NULL
53
+ );
54
+ `);
55
+ // 迁移:给已有表添加 read 列
56
+ const columns = this.db.pragma("table_info(tasks)");
57
+ if (!columns.some((c) => c.name === "read")) {
58
+ this.db.exec(`ALTER TABLE tasks ADD COLUMN read INTEGER NOT NULL DEFAULT 0`);
59
+ }
60
+ this.stmtInsert = this.db.prepare(`INSERT INTO tasks (id, from_agent, to_agent, message, status, result, callback_url, read, created_at, updated_at)
61
+ VALUES (?, ?, ?, ?, ?, ?, ?, 0, ?, ?)`);
62
+ this.stmtGet = this.db.prepare(`SELECT * FROM tasks WHERE id = ?`);
63
+ this.stmtUpdate = this.db.prepare(`UPDATE tasks SET status = ?, result = COALESCE(?, result), updated_at = ? WHERE id = ?`);
64
+ this.stmtInbox = this.db.prepare(`SELECT * FROM tasks WHERE to_agent = ? ORDER BY created_at DESC`);
65
+ this.stmtInboxUnread = this.db.prepare(`SELECT * FROM tasks WHERE to_agent = ? AND read = 0 ORDER BY created_at DESC`);
66
+ this.stmtOutbox = this.db.prepare(`SELECT * FROM tasks WHERE from_agent = ? ORDER BY created_at DESC`);
67
+ this.stmtPending = this.db.prepare(`SELECT * FROM tasks WHERE to_agent = ? AND status = 'submitted' ORDER BY created_at DESC`);
68
+ this.stmtTrackOutbound = this.db.prepare(`INSERT OR REPLACE INTO outbound_tasks (task_id, target_name) VALUES (?, ?)`);
69
+ this.stmtGetOutbound = this.db.prepare(`SELECT target_name FROM outbound_tasks WHERE task_id = ?`);
70
+ this.stmtMarkRead = this.db.prepare(`UPDATE tasks SET read = 1 WHERE id = ?`);
71
+ this.stmtMarkAllRead = this.db.prepare(`UPDATE tasks SET read = 1 WHERE to_agent = ? AND read = 0`);
72
+ this.stmtClearRead = this.db.prepare(`DELETE FROM tasks WHERE to_agent = ? AND read = 1`);
73
+ this.stmtClearAll = this.db.prepare(`DELETE FROM tasks WHERE to_agent = ?`);
74
+ this.stmtClearOldest = this.db.prepare(`DELETE FROM tasks WHERE id IN (SELECT id FROM tasks WHERE to_agent = ? ORDER BY created_at ASC LIMIT ?)`);
75
+ this.stmtInboxCount = this.db.prepare(`SELECT COUNT(*) as count FROM tasks WHERE to_agent = ?`);
76
+ }
77
+ rowToTask(row) {
78
+ return {
79
+ id: row.id,
80
+ from: row.from_agent,
81
+ to: row.to_agent,
82
+ message: row.message,
83
+ status: row.status,
84
+ result: row.result || undefined,
85
+ callbackUrl: row.callback_url || undefined,
86
+ read: row.read === 1,
87
+ createdAt: row.created_at,
88
+ updatedAt: row.updated_at,
89
+ };
90
+ }
91
+ createTask(from, to, message, callbackUrl) {
92
+ const now = localISOString();
93
+ const id = uuidv4();
94
+ this.stmtInsert.run(id, from, to, message, "submitted", null, callbackUrl || null, now, now);
95
+ const task = {
96
+ id,
97
+ from,
98
+ to,
99
+ message,
100
+ status: "submitted",
101
+ callbackUrl,
102
+ read: false,
103
+ createdAt: now,
104
+ updatedAt: now,
105
+ };
106
+ this.emit("task:created", task);
107
+ return task;
108
+ }
109
+ getTask(id) {
110
+ const row = this.stmtGet.get(id);
111
+ return row ? this.rowToTask(row) : undefined;
112
+ }
113
+ updateTask(id, updates) {
114
+ const now = localISOString();
115
+ const result = this.stmtUpdate.run(updates.status || null, updates.result || null, now, id);
116
+ if (result.changes === 0)
117
+ return undefined;
118
+ const task = this.getTask(id);
119
+ if (task) {
120
+ this.emit("task:updated", task);
121
+ }
122
+ return task;
123
+ }
124
+ getInbox(agentName, unreadOnly = false) {
125
+ const rows = (unreadOnly ? this.stmtInboxUnread : this.stmtInbox).all(agentName);
126
+ return rows.map((r) => this.rowToTask(r));
127
+ }
128
+ getOutbox(agentName) {
129
+ const rows = this.stmtOutbox.all(agentName);
130
+ return rows.map((r) => this.rowToTask(r));
131
+ }
132
+ getPending(agentName) {
133
+ const rows = this.stmtPending.all(agentName);
134
+ return rows.map((r) => this.rowToTask(r));
135
+ }
136
+ markRead(taskId) {
137
+ const result = this.stmtMarkRead.run(taskId);
138
+ return result.changes > 0;
139
+ }
140
+ markAllRead(agentName) {
141
+ const result = this.stmtMarkAllRead.run(agentName);
142
+ return result.changes;
143
+ }
144
+ clearInbox(agentName, readOnly = true) {
145
+ const result = (readOnly ? this.stmtClearRead : this.stmtClearAll).run(agentName);
146
+ return result.changes;
147
+ }
148
+ clearOldest(agentName, count) {
149
+ const result = this.stmtClearOldest.run(agentName, count);
150
+ return result.changes;
151
+ }
152
+ getInboxCount(agentName) {
153
+ const row = this.stmtInboxCount.get(agentName);
154
+ return row.count;
155
+ }
156
+ trackOutbound(taskId, targetName) {
157
+ this.stmtTrackOutbound.run(taskId, targetName);
158
+ }
159
+ getOutboundTarget(taskId) {
160
+ const row = this.stmtGetOutbound.get(taskId);
161
+ return row?.target_name;
162
+ }
163
+ close() {
164
+ this.db.close();
165
+ }
166
+ }
167
+ //# sourceMappingURL=task-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-store.js","sourceRoot":"","sources":["../src/task-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export interface AgentInfo {
2
+ name: string;
3
+ host: string;
4
+ port: number;
5
+ skills: string[];
6
+ version: string;
7
+ status: "online" | "offline";
8
+ }
9
+ export type TaskStatus = "submitted" | "working" | "input_required" | "completed" | "rejected" | "canceled";
10
+ export interface Task {
11
+ id: string;
12
+ from: string;
13
+ to: string;
14
+ message: string;
15
+ status: TaskStatus;
16
+ result?: string;
17
+ callbackUrl?: string;
18
+ read?: boolean;
19
+ createdAt: string;
20
+ updatedAt: string;
21
+ }
22
+ export interface TaskEvent {
23
+ type: "task:created" | "task:updated";
24
+ task: Task;
25
+ }
26
+ export interface AgentCard {
27
+ name: string;
28
+ description: string;
29
+ url: string;
30
+ version: string;
31
+ capabilities: {
32
+ streaming: boolean;
33
+ pushNotifications: boolean;
34
+ };
35
+ skills: Array<{
36
+ id: string;
37
+ name: string;
38
+ description: string;
39
+ }>;
40
+ }
41
+ export interface JsonRpcRequest {
42
+ jsonrpc: "2.0";
43
+ id: string | number;
44
+ method: string;
45
+ params?: Record<string, unknown>;
46
+ }
47
+ export interface JsonRpcResponse {
48
+ jsonrpc: "2.0";
49
+ id: string | number;
50
+ result?: unknown;
51
+ error?: {
52
+ code: number;
53
+ message: string;
54
+ data?: unknown;
55
+ };
56
+ }
57
+ export interface AgentLinkConfig {
58
+ name: string;
59
+ port: number;
60
+ apiPort: number;
61
+ relayUrl?: string;
62
+ skills: Array<{
63
+ id: string;
64
+ name: string;
65
+ description: string;
66
+ }>;
67
+ }
68
+ export interface DaemonHealth {
69
+ name: string;
70
+ port: number;
71
+ apiPort: number;
72
+ uptime: number;
73
+ agentCount: number;
74
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}