@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.
package/dist/index.js ADDED
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env node
2
+ import { fork } from "node:child_process";
3
+ import { fileURLToPath } from "node:url";
4
+ import path from "node:path";
5
+ import { parseArgs } from "./config.js";
6
+ import { AgentLinkMcpServer } from "./mcp-server.js";
7
+ const config = parseArgs(process.argv.slice(2));
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const daemonScript = path.join(__dirname, "daemon.js");
10
+ async function checkDaemon(port) {
11
+ try {
12
+ const res = await fetch(`http://127.0.0.1:${port}/api/health`);
13
+ return res.ok;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async function startDaemon() {
20
+ // 将 CLI 参数传递给 daemon
21
+ const args = process.argv.slice(2);
22
+ return new Promise((resolve, reject) => {
23
+ const child = fork(daemonScript, args, {
24
+ detached: true,
25
+ stdio: ["ignore", "pipe", "inherit", "ipc"],
26
+ });
27
+ let resolved = false;
28
+ // daemon 启动后会在 stdout 输出 ready 信号
29
+ child.stdout?.on("data", (data) => {
30
+ if (resolved)
31
+ return;
32
+ try {
33
+ const msg = JSON.parse(data.toString().trim());
34
+ if (msg.ready) {
35
+ resolved = true;
36
+ child.unref();
37
+ resolve(msg.apiPort);
38
+ }
39
+ }
40
+ catch {
41
+ // 忽略非 JSON 输出
42
+ }
43
+ });
44
+ child.on("error", (err) => {
45
+ if (!resolved) {
46
+ resolved = true;
47
+ reject(err);
48
+ }
49
+ });
50
+ child.on("exit", (code) => {
51
+ if (!resolved) {
52
+ resolved = true;
53
+ reject(new Error(`Daemon 退出,退出码: ${code}`));
54
+ }
55
+ });
56
+ // 超时 10 秒
57
+ setTimeout(() => {
58
+ if (!resolved) {
59
+ resolved = true;
60
+ child.kill();
61
+ reject(new Error("Daemon 启动超时"));
62
+ }
63
+ }, 10000);
64
+ });
65
+ }
66
+ async function main() {
67
+ let apiPort = config.apiPort;
68
+ // 检查 daemon 是否已在运行
69
+ const isRunning = await checkDaemon(apiPort);
70
+ if (isRunning) {
71
+ console.error(`[agent-link] Daemon 已在运行 (127.0.0.1:${apiPort})`);
72
+ }
73
+ else {
74
+ console.error("[agent-link] Daemon 未运行,正在启动...");
75
+ try {
76
+ apiPort = await startDaemon();
77
+ console.error(`[agent-link] Daemon 已启动 (127.0.0.1:${apiPort})`);
78
+ }
79
+ catch (err) {
80
+ console.error(`[agent-link] Daemon 启动失败: ${err instanceof Error ? err.message : String(err)}`);
81
+ process.exit(1);
82
+ }
83
+ }
84
+ // 启动 MCP Server(stdio)
85
+ const mcpServer = new AgentLinkMcpServer(config.name, apiPort);
86
+ await mcpServer.start();
87
+ }
88
+ main().catch((err) => {
89
+ console.error("[agent-link] 启动失败:", err);
90
+ process.exit(1);
91
+ });
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class AgentLinkMcpServer {
2
+ private mcp;
3
+ private daemonUrl;
4
+ private agentName;
5
+ private pendingTasks;
6
+ constructor(agentName: string, daemonApiPort: number);
7
+ private daemonFetch;
8
+ private registerTools;
9
+ private connectToEventStream;
10
+ private handleSSEEvent;
11
+ private formatTaskResult;
12
+ start(): Promise<void>;
13
+ }
@@ -0,0 +1,354 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ import http from "node:http";
5
+ import { sendNotification } from "./notify.js";
6
+ export class AgentLinkMcpServer {
7
+ mcp;
8
+ daemonUrl;
9
+ agentName;
10
+ pendingTasks = new Map();
11
+ constructor(agentName, daemonApiPort) {
12
+ this.agentName = agentName;
13
+ this.daemonUrl = `http://127.0.0.1:${daemonApiPort}`;
14
+ this.mcp = new McpServer({
15
+ name: "agent-link",
16
+ version: "0.1.0",
17
+ });
18
+ this.registerTools();
19
+ }
20
+ async daemonFetch(path, options) {
21
+ const res = await fetch(`${this.daemonUrl}${path}`, options);
22
+ if (!res.ok) {
23
+ const body = (await res.json().catch(() => ({})));
24
+ throw new Error(body.error || `Daemon API error: ${res.status}`);
25
+ }
26
+ return res;
27
+ }
28
+ registerTools() {
29
+ // 列出在线 Agent
30
+ this.mcp.tool("agent_list", "列出局域网内所有在线的 Agent", {}, async () => {
31
+ try {
32
+ const res = await this.daemonFetch("/api/agents");
33
+ const agents = (await res.json());
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: agents.length === 0
39
+ ? "当前没有发现其他在线 Agent"
40
+ : JSON.stringify(agents, null, 2),
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ catch (err) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `无法连接 daemon: ${err instanceof Error ? err.message : String(err)}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ });
57
+ // 向目标 Agent 发送消息
58
+ this.mcp.tool("agent_send", "向目标 Agent 发送消息或任务。发送后立即返回,收到回复会通过系统通知提醒。", {
59
+ to: z.string().describe("目标 Agent 名称"),
60
+ message: z.string().describe("要发送的消息或任务描述"),
61
+ }, async ({ to, message }) => {
62
+ try {
63
+ const res = await this.daemonFetch("/api/tasks/send", {
64
+ method: "POST",
65
+ headers: { "Content-Type": "application/json" },
66
+ body: JSON.stringify({ to, message }),
67
+ });
68
+ const result = (await res.json());
69
+ this.pendingTasks.set(result.taskId, { to });
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: `消息已发送给 ${to}(任务ID: ${result.taskId})。收到回复会通过系统通知提醒你。使用 agent_task_status 查看结果。`,
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ catch (err) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: "text",
84
+ text: `发送失败: ${err instanceof Error ? err.message : String(err)}`,
85
+ },
86
+ ],
87
+ isError: true,
88
+ };
89
+ }
90
+ });
91
+ // 查看收件箱
92
+ this.mcp.tool("agent_inbox", "查看收到的消息和任务请求", {
93
+ unread_only: z
94
+ .boolean()
95
+ .default(false)
96
+ .describe("是否只显示未处理的消息"),
97
+ }, async ({ unread_only }) => {
98
+ try {
99
+ const res = await this.daemonFetch(`/api/tasks/inbox?unread_only=${unread_only}`);
100
+ const tasks = (await res.json());
101
+ let text = tasks.length === 0
102
+ ? "收件箱为空"
103
+ : JSON.stringify(tasks.map((t) => ({
104
+ id: t.id,
105
+ from: t.from,
106
+ message: t.message,
107
+ status: t.status,
108
+ read: t.read ? "已读" : "未读",
109
+ time: t.createdAt,
110
+ })), null, 2);
111
+ if (tasks.length > 10000) {
112
+ text += `\n\n⚠️ 收件箱消息较多(${tasks.length} 条),建议使用 agent_clear_inbox 清理消息。`;
113
+ }
114
+ return {
115
+ content: [
116
+ {
117
+ type: "text",
118
+ text,
119
+ },
120
+ ],
121
+ };
122
+ }
123
+ catch (err) {
124
+ return {
125
+ content: [
126
+ {
127
+ type: "text",
128
+ text: `无法连接 daemon: ${err instanceof Error ? err.message : String(err)}`,
129
+ },
130
+ ],
131
+ isError: true,
132
+ };
133
+ }
134
+ });
135
+ // 清空收件箱
136
+ this.mcp.tool("agent_clear_inbox", "清理收件箱消息。可清除已读消息、全部消息,或最早的 N 条消息。", {
137
+ all: z.boolean().default(false).describe("true=清除全部消息, false=只清除已读消息(默认)"),
138
+ oldest: z.number().optional().describe("清除最早的 N 条消息(指定后忽略 all 参数)"),
139
+ }, async ({ all, oldest }) => {
140
+ try {
141
+ const res = await this.daemonFetch("/api/tasks/clear", {
142
+ method: "POST",
143
+ headers: { "Content-Type": "application/json" },
144
+ body: JSON.stringify(oldest != null ? { oldest } : { read_only: !all }),
145
+ });
146
+ const data = (await res.json());
147
+ const desc = oldest != null ? `最早的 ${data.cleared} 条` : (all ? `${data.cleared} 条` : `${data.cleared} 条已读`);
148
+ return {
149
+ content: [
150
+ {
151
+ type: "text",
152
+ text: `已清除${desc}消息`,
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ catch (err) {
158
+ return {
159
+ content: [
160
+ {
161
+ type: "text",
162
+ text: `清除失败: ${err instanceof Error ? err.message : String(err)}`,
163
+ },
164
+ ],
165
+ isError: true,
166
+ };
167
+ }
168
+ });
169
+ // 标记消息已读
170
+ this.mcp.tool("agent_mark_read", "标记消息为已读。可以标记单条或全部未读消息。", {
171
+ task_id: z.string().optional().describe("任务 ID(不填则标记全部为已读)"),
172
+ }, async ({ task_id }) => {
173
+ try {
174
+ const res = await this.daemonFetch("/api/tasks/read", {
175
+ method: "POST",
176
+ headers: { "Content-Type": "application/json" },
177
+ body: JSON.stringify(task_id ? { task_id } : { all: true }),
178
+ });
179
+ const data = (await res.json());
180
+ const text = task_id
181
+ ? (data.ok ? `任务 ${task_id} 已标记为已读` : `任务 ${task_id} 不存在`)
182
+ : `已将 ${data.marked || 0} 条消息标记为已读`;
183
+ return {
184
+ content: [{ type: "text", text }],
185
+ };
186
+ }
187
+ catch (err) {
188
+ return {
189
+ content: [
190
+ {
191
+ type: "text",
192
+ text: `操作失败: ${err instanceof Error ? err.message : String(err)}`,
193
+ },
194
+ ],
195
+ isError: true,
196
+ };
197
+ }
198
+ });
199
+ // 回复任务
200
+ this.mcp.tool("agent_reply", "回复一个收到的任务请求(完成、拒绝、或请求更多信息)", {
201
+ task_id: z.string().describe("任务 ID"),
202
+ message: z.string().describe("回复内容"),
203
+ status: z
204
+ .enum(["completed", "rejected", "input_required"])
205
+ .default("completed")
206
+ .describe("任务状态: completed=完成, rejected=拒绝, input_required=需要更多信息"),
207
+ }, async ({ task_id, message, status }) => {
208
+ try {
209
+ const res = await this.daemonFetch(`/api/tasks/${task_id}/reply`, {
210
+ method: "POST",
211
+ headers: { "Content-Type": "application/json" },
212
+ body: JSON.stringify({ message, status }),
213
+ });
214
+ const task = (await res.json());
215
+ return {
216
+ content: [
217
+ {
218
+ type: "text",
219
+ text: `已回复任务 ${task_id}(来自 ${task.from}),状态: ${status}`,
220
+ },
221
+ ],
222
+ };
223
+ }
224
+ catch (err) {
225
+ return {
226
+ content: [
227
+ {
228
+ type: "text",
229
+ text: `回复失败: ${err instanceof Error ? err.message : String(err)}`,
230
+ },
231
+ ],
232
+ isError: true,
233
+ };
234
+ }
235
+ });
236
+ // 查询发出任务的状态
237
+ this.mcp.tool("agent_task_status", "查询已发出任务的状态和回复结果", {
238
+ task_id: z.string().describe("任务 ID"),
239
+ target: z.string().optional().describe("目标 Agent 名称(可选,不填则从缓存中查找)"),
240
+ }, async ({ task_id, target }) => {
241
+ // 先检查本地缓存
242
+ const pending = this.pendingTasks.get(task_id);
243
+ if (pending?.task) {
244
+ return {
245
+ content: [
246
+ {
247
+ type: "text",
248
+ text: this.formatTaskResult(pending.task),
249
+ },
250
+ ],
251
+ };
252
+ }
253
+ const targetName = target || pending?.to || "";
254
+ // 查询 daemon
255
+ try {
256
+ const res = await this.daemonFetch(`/api/tasks/${task_id}/poll?target=${encodeURIComponent(targetName)}`);
257
+ const task = (await res.json());
258
+ return {
259
+ content: [
260
+ {
261
+ type: "text",
262
+ text: this.formatTaskResult(task),
263
+ },
264
+ ],
265
+ };
266
+ }
267
+ catch (err) {
268
+ return {
269
+ content: [
270
+ {
271
+ type: "text",
272
+ text: `查询失败: ${err instanceof Error ? err.message : String(err)}`,
273
+ },
274
+ ],
275
+ isError: true,
276
+ };
277
+ }
278
+ });
279
+ }
280
+ connectToEventStream() {
281
+ const url = new URL("/api/events", this.daemonUrl);
282
+ const reconnect = (delayMs) => {
283
+ setTimeout(() => this.connectToEventStream(), delayMs);
284
+ };
285
+ const req = http.get(url, (res) => {
286
+ if (res.statusCode !== 200) {
287
+ res.resume();
288
+ reconnect(5000);
289
+ return;
290
+ }
291
+ let buffer = "";
292
+ res.setEncoding("utf-8");
293
+ res.on("data", (chunk) => {
294
+ buffer += chunk;
295
+ const lines = buffer.split("\n");
296
+ buffer = lines.pop() || "";
297
+ for (const line of lines) {
298
+ if (line.startsWith("data: ")) {
299
+ try {
300
+ const event = JSON.parse(line.slice(6));
301
+ this.handleSSEEvent(event);
302
+ }
303
+ catch {
304
+ // 忽略解析错误
305
+ }
306
+ }
307
+ }
308
+ });
309
+ res.on("end", () => {
310
+ reconnect(1000);
311
+ });
312
+ res.on("error", () => {
313
+ reconnect(5000);
314
+ });
315
+ });
316
+ req.on("error", () => {
317
+ reconnect(5000);
318
+ });
319
+ }
320
+ handleSSEEvent(event) {
321
+ const task = event.task;
322
+ if (event.type === "task:created" && task.to === this.agentName) {
323
+ // 收到新消息通知
324
+ sendNotification(`Agent Link: 来自 ${task.from}`, task.message);
325
+ return;
326
+ }
327
+ if (event.type === "task:updated") {
328
+ // 发出的任务有回复
329
+ const pending = this.pendingTasks.get(task.id);
330
+ if (pending && (task.status === "completed" || task.status === "rejected" || task.status === "canceled")) {
331
+ pending.task = task;
332
+ const title = task.status === "completed"
333
+ ? `${pending.to} 回复了`
334
+ : `${pending.to} ${task.status === "rejected" ? "拒绝了任务" : "取消了任务"}`;
335
+ sendNotification(title, task.result || "(无内容)");
336
+ }
337
+ }
338
+ }
339
+ formatTaskResult(task) {
340
+ if (task.status === "completed") {
341
+ return `任务完成 (${task.from} → ${task.to})\n结果: ${task.result || "(无内容)"}`;
342
+ }
343
+ if (task.status === "rejected") {
344
+ return `任务被拒绝 (${task.to})\n原因: ${task.result || "(未说明)"}`;
345
+ }
346
+ return `任务状态: ${task.status}\n${task.result || ""}`;
347
+ }
348
+ async start() {
349
+ const transport = new StdioServerTransport();
350
+ await this.mcp.connect(transport);
351
+ this.connectToEventStream();
352
+ }
353
+ }
354
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,OAAO,kBAAkB;IACrB,GAAG,CAAY;IACf,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,YAAY,GAA6C,IAAI,GAAG,EAAE,CAAC;IAE3E,YAAY,SAAiB,EAAE,aAAqB;QAClD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,oBAAoB,aAAa,EAAE,CAAC;QAErD,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC;YACvB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,IAAY,EACZ,OAAqB;QAErB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAE/C,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,aAAa;QACnB,aAAa;QACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;YAC9D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;gBACjD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EACF,MAAM,CAAC,MAAM,KAAK,CAAC;gCACjB,CAAC,CAAC,kBAAkB;gCACpB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBACzE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,YAAY,EACZ,0CAA0C,EAC1C;YACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;SAC5C,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;oBACpD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;iBACtC,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuC,CAAC;gBAExE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC7C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,UAAU,EAAE,UAAU,MAAM,CAAC,MAAM,6CAA6C;yBACvF;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBAClE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,QAAQ;QACR,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,aAAa,EACb,cAAc,EACd;YACE,WAAW,EAAE,CAAC;iBACX,OAAO,EAAE;iBACT,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,aAAa,CAAC;SAC3B,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAChC,gCAAgC,WAAW,EAAE,CAC9C,CAAC;gBACF,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAW,CAAC;gBAC3C,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC;oBAC3B,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,IAAI,CAAC,SAAS,CACZ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAChB,EAAE,EAAE,CAAC,CAAC,EAAE;wBACR,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;wBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;wBAC1B,IAAI,EAAE,CAAC,CAAC,SAAS;qBAClB,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF,CAAC;gBACN,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,kBAAkB,KAAK,CAAC,MAAM,kCAAkC,CAAC;gBAC3E,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI;yBACL;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBACzE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,QAAQ;QACR,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,mBAAmB,EACnB,kCAAkC,EAClC;YACE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC1E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACpE,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;oBACrD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;iBACxE,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;gBACvD,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC;gBAC5G,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,MAAM,IAAI,IAAI;yBACrB;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBAClE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,SAAS;QACT,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,iBAAiB,EACjB,wBAAwB,EACxB;YACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SAC7D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;oBACpD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;iBAC5D,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsC,CAAC;gBACrE,MAAM,IAAI,GAAG,OAAO;oBAClB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC;oBAC1D,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;gBACtC,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;iBAC3C,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBAClE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,OAAO;QACP,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,aAAa,EACb,4BAA4B,EAC5B;YACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpC,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;iBACjD,OAAO,CAAC,WAAW,CAAC;iBACpB,QAAQ,CACP,wDAAwD,CACzD;SACJ,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,OAAO,QAAQ,EAAE;oBAChE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC1C,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAS,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,OAAO,OAAO,IAAI,CAAC,IAAI,SAAS,MAAM,EAAE;yBACxD;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBAClE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,YAAY;QACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,mBAAmB,EACnB,iBAAiB,EACjB;YACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACpE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5B,UAAU;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;yBAC1C;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;YAC/C,YAAY;YACZ,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,OAAO,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC1G,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAS,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;yBAClC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;yBAClE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE;YACpC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAChC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC;gBAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAc,CAAC;4BACrD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;wBAC7B,CAAC;wBAAC,MAAM,CAAC;4BACP,SAAS;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,SAAS,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,KAAgB;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAChE,UAAU;YACV,gBAAgB,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,WAAW;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;gBACzG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW;oBACvC,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM;oBACrB,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBACtE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,IAAU;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,SAAS,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,UAAU,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export declare function sendNotification(title: string, message: string): void;
package/dist/notify.js ADDED
@@ -0,0 +1,9 @@
1
+ import notifier from "node-notifier";
2
+ export function sendNotification(title, message) {
3
+ notifier.notify({
4
+ title,
5
+ message,
6
+ sound: true,
7
+ });
8
+ }
9
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe;IAC7D,QAAQ,CAAC,MAAM,CAAC;QACd,KAAK;QACL,OAAO;QACP,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { AgentInfo, JsonRpcRequest, JsonRpcResponse } from "./types.js";
2
+ export declare class RelayClient {
3
+ private ws;
4
+ private relayUrl;
5
+ private agentName;
6
+ private skills;
7
+ private remoteAgents;
8
+ private pendingRequests;
9
+ private onAgentFound?;
10
+ private onAgentLost?;
11
+ private onMessageReceived?;
12
+ private reconnectTimer;
13
+ private destroyed;
14
+ private requestIdCounter;
15
+ constructor(relayUrl: string, agentName: string, skills: string[]);
16
+ setOnAgentFound(handler: (agent: AgentInfo) => void): void;
17
+ setOnAgentLost(handler: (name: string) => void): void;
18
+ setOnMessageReceived(handler: (from: string, payload: JsonRpcRequest) => Promise<JsonRpcResponse>): void;
19
+ connect(): void;
20
+ private scheduleReconnect;
21
+ private send;
22
+ private handleMessage;
23
+ private handleRelayedRequest;
24
+ sendRequest(to: string, payload: JsonRpcRequest, timeoutMs?: number): Promise<JsonRpcResponse>;
25
+ getAgents(): AgentInfo[];
26
+ getAgent(name: string): AgentInfo | undefined;
27
+ isRelayAgent(name: string): boolean;
28
+ destroy(): void;
29
+ }