agent-relay 2.1.13 → 2.1.14
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.cjs +37571 -50918
- package/dist/src/cli/index.js +1 -1
- package/dist/src/cli/index.js.map +1 -1
- package/package.json +18 -18
- package/packages/acp-bridge/package.json +2 -2
- package/packages/api-types/package.json +1 -1
- package/packages/benchmark/datasets/quick-test.yaml +20 -0
- package/packages/benchmark/dist/runners/base.d.ts.map +1 -1
- package/packages/benchmark/dist/runners/base.js +1 -0
- package/packages/benchmark/dist/runners/base.js.map +1 -1
- package/packages/benchmark/package.json +4 -4
- package/packages/benchmark/src/runners/base.ts +1 -0
- package/packages/bridge/dist/spawner.d.ts.map +1 -1
- package/packages/bridge/dist/spawner.js +2 -30
- package/packages/bridge/dist/spawner.js.map +1 -1
- package/packages/bridge/package.json +7 -8
- package/packages/bridge/src/spawner.ts +2 -29
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/dist/teams-config.d.ts +7 -1
- package/packages/config/dist/teams-config.d.ts.map +1 -1
- package/packages/config/dist/teams-config.js +88 -34
- package/packages/config/dist/teams-config.js.map +1 -1
- package/packages/config/package.json +2 -2
- package/packages/config/src/teams-config.ts +106 -39
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/dist/server.d.ts.map +1 -1
- package/packages/daemon/dist/server.js +18 -0
- package/packages/daemon/dist/server.js.map +1 -1
- package/packages/daemon/dist/spawn-manager.d.ts +8 -0
- package/packages/daemon/dist/spawn-manager.d.ts.map +1 -1
- package/packages/daemon/dist/spawn-manager.js +14 -3
- package/packages/daemon/dist/spawn-manager.js.map +1 -1
- package/packages/daemon/package.json +12 -12
- package/packages/daemon/src/server.ts +17 -0
- package/packages/daemon/src/spawn-manager.ts +21 -3
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/CHANGELOG.md +28 -0
- package/packages/mcp/README.md +31 -0
- package/packages/mcp/dist/bin.js +18 -5
- package/packages/mcp/dist/bin.js.map +1 -1
- package/packages/mcp/dist/{client.d.ts → client-adapter.d.ts} +22 -36
- package/packages/mcp/dist/client-adapter.d.ts.map +1 -0
- package/packages/mcp/dist/client-adapter.js +230 -0
- package/packages/mcp/dist/client-adapter.js.map +1 -0
- package/packages/mcp/dist/hybrid-client.d.ts +1 -31
- package/packages/mcp/dist/hybrid-client.d.ts.map +1 -1
- package/packages/mcp/dist/hybrid-client.js +3 -153
- package/packages/mcp/dist/hybrid-client.js.map +1 -1
- package/packages/mcp/dist/index.d.ts +2 -3
- package/packages/mcp/dist/index.d.ts.map +1 -1
- package/packages/mcp/dist/index.js +4 -3
- package/packages/mcp/dist/index.js.map +1 -1
- package/packages/mcp/dist/resources/agents.d.ts +1 -1
- package/packages/mcp/dist/resources/agents.d.ts.map +1 -1
- package/packages/mcp/dist/resources/inbox.d.ts +1 -1
- package/packages/mcp/dist/resources/inbox.d.ts.map +1 -1
- package/packages/mcp/dist/resources/project.d.ts +1 -1
- package/packages/mcp/dist/resources/project.d.ts.map +1 -1
- package/packages/mcp/dist/server.d.ts +5 -1
- package/packages/mcp/dist/server.d.ts.map +1 -1
- package/packages/mcp/dist/server.js.map +1 -1
- package/packages/mcp/dist/simple.d.ts +1 -1
- package/packages/mcp/dist/simple.d.ts.map +1 -1
- package/packages/mcp/dist/simple.js +1 -1
- package/packages/mcp/dist/simple.js.map +1 -1
- package/packages/mcp/dist/tools/relay-broadcast.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-channel.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-channel.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-connected.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-connected.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-consensus.d.ts +7 -7
- package/packages/mcp/dist/tools/relay-consensus.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-continuity.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-continuity.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-health.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-health.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-inbox.d.ts +2 -2
- package/packages/mcp/dist/tools/relay-inbox.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-logs.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-logs.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-messages.d.ts +7 -7
- package/packages/mcp/dist/tools/relay-messages.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-metrics.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-metrics.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-metrics.js +4 -4
- package/packages/mcp/dist/tools/relay-metrics.js.map +1 -1
- package/packages/mcp/dist/tools/relay-release.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-release.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-remove-agent.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-send.d.ts +3 -3
- package/packages/mcp/dist/tools/relay-send.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-shadow.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-shadow.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-spawn.d.ts +3 -3
- package/packages/mcp/dist/tools/relay-spawn.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-status.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-status.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-subscribe.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +1 -1
- package/packages/mcp/dist/tools/relay-who.d.ts +1 -1
- package/packages/mcp/dist/tools/relay-who.d.ts.map +1 -1
- package/packages/mcp/package.json +13 -4
- package/packages/mcp/src/bin.ts +21 -6
- package/packages/mcp/src/client-adapter.ts +349 -0
- package/packages/mcp/src/hybrid-client.ts +3 -202
- package/packages/mcp/src/index.ts +12 -5
- package/packages/mcp/src/resources/agents.ts +1 -1
- package/packages/mcp/src/resources/inbox.ts +1 -1
- package/packages/mcp/src/resources/project.ts +1 -1
- package/packages/mcp/src/server.ts +5 -1
- package/packages/mcp/src/simple.ts +1 -1
- package/packages/mcp/src/tools/relay-broadcast.ts +1 -1
- package/packages/mcp/src/tools/relay-channel.ts +1 -1
- package/packages/mcp/src/tools/relay-connected.ts +1 -1
- package/packages/mcp/src/tools/relay-consensus.ts +1 -1
- package/packages/mcp/src/tools/relay-continuity.ts +1 -1
- package/packages/mcp/src/tools/relay-health.ts +1 -1
- package/packages/mcp/src/tools/relay-inbox.ts +1 -1
- package/packages/mcp/src/tools/relay-logs.ts +1 -1
- package/packages/mcp/src/tools/relay-messages.ts +1 -1
- package/packages/mcp/src/tools/relay-metrics.ts +7 -5
- package/packages/mcp/src/tools/relay-release.ts +1 -1
- package/packages/mcp/src/tools/relay-remove-agent.ts +1 -1
- package/packages/mcp/src/tools/relay-send.ts +1 -1
- package/packages/mcp/src/tools/relay-shadow.ts +1 -1
- package/packages/mcp/src/tools/relay-spawn.ts +1 -1
- package/packages/mcp/src/tools/relay-status.ts +1 -1
- package/packages/mcp/src/tools/relay-subscribe.ts +1 -1
- package/packages/mcp/src/tools/relay-who.ts +1 -1
- package/packages/mcp/tests/client.test.ts +332 -432
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/README.md +185 -0
- package/packages/sdk/dist/client.d.ts +1 -1
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +2 -1
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/standalone.d.ts +2 -0
- package/packages/sdk/dist/standalone.d.ts.map +1 -1
- package/packages/sdk/dist/standalone.js +6 -1
- package/packages/sdk/dist/standalone.js.map +1 -1
- package/packages/sdk/package.json +3 -4
- package/packages/sdk/src/client.ts +2 -2
- package/packages/sdk/src/standalone.ts +8 -1
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +3 -3
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.js +13 -0
- package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -1
- package/packages/wrapper/package.json +6 -6
- package/packages/wrapper/src/relay-pty-orchestrator.ts +14 -0
- package/packages/mcp/dist/client.d.ts.map +0 -1
- package/packages/mcp/dist/client.js +0 -320
- package/packages/mcp/dist/client.js.map +0 -1
- package/packages/mcp/src/client.ts +0 -485
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import type { RelayClient } from '../client.js';
|
|
3
|
+
import type { RelayClient } from '../client-adapter.js';
|
|
4
4
|
/**
|
|
5
5
|
* Supported CLI tools for spawning workers.
|
|
6
6
|
* This list should be kept in sync with CliType in packages/wrapper/src/shared.ts
|
|
@@ -18,14 +18,14 @@ export declare const relaySpawnSchema: z.ZodObject<{
|
|
|
18
18
|
name: string;
|
|
19
19
|
cli: "claude" | "gemini" | "opencode" | "droid" | "codex";
|
|
20
20
|
task: string;
|
|
21
|
-
cwd?: string | undefined;
|
|
22
21
|
model?: string | undefined;
|
|
22
|
+
cwd?: string | undefined;
|
|
23
23
|
}, {
|
|
24
24
|
name: string;
|
|
25
25
|
cli: "claude" | "gemini" | "opencode" | "droid" | "codex";
|
|
26
26
|
task: string;
|
|
27
|
-
cwd?: string | undefined;
|
|
28
27
|
model?: string | undefined;
|
|
28
|
+
cwd?: string | undefined;
|
|
29
29
|
}>;
|
|
30
30
|
export type RelaySpawnInput = z.infer<typeof relaySpawnSchema>;
|
|
31
31
|
export declare const relaySpawnTool: Tool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-spawn.d.ts","sourceRoot":"","sources":["../../src/tools/relay-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"relay-spawn.d.ts","sourceRoot":"","sources":["../../src/tools/relay-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,cAAc,6DAA8D,CAAC;AAC1F,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import type { RelayClient } from '../client.js';
|
|
3
|
+
import type { RelayClient } from '../client-adapter.js';
|
|
4
4
|
export declare const relayStatusSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
5
5
|
export type RelayStatusInput = z.infer<typeof relayStatusSchema>;
|
|
6
6
|
export declare const relayStatusTool: Tool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-status.d.ts","sourceRoot":"","sources":["../../src/tools/relay-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"relay-status.d.ts","sourceRoot":"","sources":["../../src/tools/relay-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe,EAAE,IAQ7B,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
-
import type { RelayClient } from '../client.js';
|
|
6
|
+
import type { RelayClient } from '../client-adapter.js';
|
|
7
7
|
export declare const relaySubscribeSchema: z.ZodObject<{
|
|
8
8
|
topic: z.ZodString;
|
|
9
9
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-subscribe.d.ts","sourceRoot":"","sources":["../../src/tools/relay-subscribe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"relay-subscribe.d.ts","sourceRoot":"","sources":["../../src/tools/relay-subscribe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,eAAO,MAAM,oBAAoB;;;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,kBAAkB,EAAE,IAUhC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3G;AAGD,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,EAAE,IAUlC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/G"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import type { RelayClient } from '../client.js';
|
|
3
|
+
import type { RelayClient } from '../client-adapter.js';
|
|
4
4
|
export declare const relayWhoSchema: z.ZodObject<{
|
|
5
5
|
include_idle: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
6
6
|
project: z.ZodOptional<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-who.d.ts","sourceRoot":"","sources":["../../src/tools/relay-who.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"relay-who.d.ts","sourceRoot":"","sources":["../../src/tools/relay-who.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,YAAY,EAAE,IAyB1B,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/mcp",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.14",
|
|
4
4
|
"description": "MCP server for Agent Relay - native messaging tools for AI agents in Claude, Cursor, and VS Code",
|
|
5
5
|
"author": "Agent Workforce Inc.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -47,18 +47,27 @@
|
|
|
47
47
|
"prepublishOnly": "npm run clean && npm run build && npm test"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@agent-relay/config": "2.1.
|
|
51
|
-
"@agent-relay/protocol": "2.1.
|
|
52
|
-
"@agent-relay/utils": "2.1.
|
|
50
|
+
"@agent-relay/config": "2.1.14",
|
|
51
|
+
"@agent-relay/protocol": "2.1.14",
|
|
52
|
+
"@agent-relay/utils": "2.1.14",
|
|
53
53
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
54
54
|
"smol-toml": "^1.6.0",
|
|
55
55
|
"zod": "^3.23.8"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
+
"@agent-relay/sdk": "2.1.13",
|
|
58
59
|
"@types/node": "^22.19.3",
|
|
59
60
|
"typescript": "^5.9.3",
|
|
60
61
|
"vitest": "^2.1.9"
|
|
61
62
|
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@agent-relay/sdk": ">=2.0.0"
|
|
65
|
+
},
|
|
66
|
+
"peerDependenciesMeta": {
|
|
67
|
+
"@agent-relay/sdk": {
|
|
68
|
+
"optional": true
|
|
69
|
+
}
|
|
70
|
+
},
|
|
62
71
|
"keywords": [
|
|
63
72
|
"mcp",
|
|
64
73
|
"agent-relay",
|
package/packages/mcp/src/bin.ts
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
import { parseArgs } from 'node:util';
|
|
13
13
|
import { runInstall, validateEditor, getValidEditors } from './install-cli.js';
|
|
14
|
+
import { RelayClient } from '@agent-relay/sdk';
|
|
15
|
+
import { createRelayClientAdapter } from './client-adapter.js';
|
|
14
16
|
|
|
15
17
|
const { values, positionals } = parseArgs({
|
|
16
18
|
allowPositionals: true,
|
|
@@ -114,7 +116,7 @@ switch (command) {
|
|
|
114
116
|
(async () => {
|
|
115
117
|
try {
|
|
116
118
|
const { runMCPServer, discoverSocket, discoverAgentName } = await import('./index.js');
|
|
117
|
-
const {
|
|
119
|
+
const { discoverProjectRoot } = await import('./hybrid-client.js');
|
|
118
120
|
const { join } = await import('node:path');
|
|
119
121
|
const { existsSync } = await import('node:fs');
|
|
120
122
|
|
|
@@ -138,7 +140,7 @@ switch (command) {
|
|
|
138
140
|
const discovery = discoverSocket();
|
|
139
141
|
const agentName = discoverAgentName(discovery) || `mcp-${process.pid}`;
|
|
140
142
|
|
|
141
|
-
// Discover project root
|
|
143
|
+
// Discover project root
|
|
142
144
|
if (!projectRoot) {
|
|
143
145
|
projectRoot = discoverProjectRoot() ?? undefined;
|
|
144
146
|
}
|
|
@@ -157,15 +159,28 @@ switch (command) {
|
|
|
157
159
|
process.exit(1);
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
|
|
161
|
-
const client = createHybridClient({
|
|
162
|
+
const client = new RelayClient({
|
|
162
163
|
agentName,
|
|
163
|
-
projectRoot,
|
|
164
164
|
socketPath: socketPath || discovery?.socketPath,
|
|
165
|
+
quiet: values.quiet,
|
|
166
|
+
reconnect: true,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
await client.connect();
|
|
170
|
+
|
|
171
|
+
const mcpClient = createRelayClientAdapter(client, {
|
|
172
|
+
agentName,
|
|
165
173
|
project: discovery?.project,
|
|
174
|
+
projectRoot,
|
|
175
|
+
socketPath: socketPath || discovery?.socketPath,
|
|
166
176
|
});
|
|
167
177
|
|
|
168
|
-
await runMCPServer(
|
|
178
|
+
await runMCPServer(mcpClient, {
|
|
179
|
+
projectRoot,
|
|
180
|
+
project: discovery?.project,
|
|
181
|
+
socketPath: socketPath || discovery?.socketPath,
|
|
182
|
+
agentName,
|
|
183
|
+
});
|
|
169
184
|
} catch (err) {
|
|
170
185
|
const message = err instanceof Error ? err.message : String(err);
|
|
171
186
|
console.error('Failed to start MCP server:', message);
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { RelayClient as SdkRelayClient, type AckPayload, type AgentInfo, type HealthResponsePayload, type InboxMessage, type MetricsResponsePayload, type MessagesResponsePayload, type SpawnResult, type ReleaseResultPayload } from '@agent-relay/sdk';
|
|
2
|
+
import { PROTOCOL_VERSION, type Envelope } from '@agent-relay/protocol';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
|
|
5
|
+
export type QueryMessage = MessagesResponsePayload['messages'][number];
|
|
6
|
+
export type HealthResponse = HealthResponsePayload;
|
|
7
|
+
export type MetricsResponse = MetricsResponsePayload;
|
|
8
|
+
export type MessagesResponse = MessagesResponsePayload;
|
|
9
|
+
|
|
10
|
+
export interface RelayClient {
|
|
11
|
+
send(to: string, message: string, options?: { thread?: string; kind?: string; data?: Record<string, unknown> }): Promise<void>;
|
|
12
|
+
sendAndWait(
|
|
13
|
+
to: string,
|
|
14
|
+
message: string,
|
|
15
|
+
options?: { thread?: string; timeoutMs?: number; kind?: string; data?: Record<string, unknown> }
|
|
16
|
+
): Promise<AckPayload>;
|
|
17
|
+
broadcast(message: string, options?: { kind?: string; data?: Record<string, unknown> }): Promise<void>;
|
|
18
|
+
|
|
19
|
+
spawn(options: { name: string; cli: string; task?: string; model?: string; cwd?: string }): Promise<SpawnResult>;
|
|
20
|
+
release(name: string, reason?: string): Promise<ReleaseResultPayload>;
|
|
21
|
+
|
|
22
|
+
subscribe(topic: string): Promise<{ success: boolean; error?: string }>;
|
|
23
|
+
unsubscribe(topic: string): Promise<{ success: boolean; error?: string }>;
|
|
24
|
+
|
|
25
|
+
joinChannel(channel: string, displayName?: string): Promise<{ success: boolean; error?: string }>;
|
|
26
|
+
leaveChannel(channel: string, reason?: string): Promise<{ success: boolean; error?: string }>;
|
|
27
|
+
sendChannelMessage(channel: string, message: string, options?: { thread?: string }): Promise<void>;
|
|
28
|
+
adminJoinChannel(channel: string, member: string): Promise<{ success: boolean; error?: string }>;
|
|
29
|
+
adminRemoveMember(channel: string, member: string): Promise<{ success: boolean; error?: string }>;
|
|
30
|
+
|
|
31
|
+
bindAsShadow(primaryAgent: string, options?: { speakOn?: string[] }): Promise<{ success: boolean; error?: string }>;
|
|
32
|
+
unbindAsShadow(primaryAgent: string): Promise<{ success: boolean; error?: string }>;
|
|
33
|
+
|
|
34
|
+
createProposal(options: {
|
|
35
|
+
id: string;
|
|
36
|
+
description: string;
|
|
37
|
+
options: string[];
|
|
38
|
+
votingMethod?: string;
|
|
39
|
+
deadline?: number;
|
|
40
|
+
}): Promise<{ success: boolean; error?: string }>;
|
|
41
|
+
|
|
42
|
+
vote(options: { proposalId: string; vote: string; reason?: string }): Promise<{ success: boolean; error?: string }>;
|
|
43
|
+
|
|
44
|
+
getStatus(): Promise<{
|
|
45
|
+
connected: boolean;
|
|
46
|
+
agentName: string;
|
|
47
|
+
project: string;
|
|
48
|
+
socketPath: string;
|
|
49
|
+
daemonVersion?: string;
|
|
50
|
+
uptime?: string;
|
|
51
|
+
}>;
|
|
52
|
+
|
|
53
|
+
getInbox(options?: { limit?: number; unread_only?: boolean; from?: string; channel?: string }): Promise<
|
|
54
|
+
Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
from: string;
|
|
57
|
+
content: string;
|
|
58
|
+
channel?: string;
|
|
59
|
+
thread?: string;
|
|
60
|
+
}>
|
|
61
|
+
>;
|
|
62
|
+
|
|
63
|
+
listAgents(options?: { include_idle?: boolean; project?: string }): Promise<AgentInfo[]>;
|
|
64
|
+
listConnectedAgents(options?: { project?: string }): Promise<AgentInfo[]>;
|
|
65
|
+
removeAgent(name: string, options?: { removeMessages?: boolean }): Promise<{ success: boolean; removed: boolean; message?: string }>;
|
|
66
|
+
getHealth(options?: { include_crashes?: boolean; include_alerts?: boolean }): Promise<HealthResponsePayload>;
|
|
67
|
+
getMetrics(options?: { agent?: string }): Promise<MetricsResponsePayload>;
|
|
68
|
+
|
|
69
|
+
queryMessages(options?: {
|
|
70
|
+
limit?: number;
|
|
71
|
+
sinceTs?: number;
|
|
72
|
+
since_ts?: number;
|
|
73
|
+
from?: string;
|
|
74
|
+
to?: string;
|
|
75
|
+
thread?: string;
|
|
76
|
+
order?: 'asc' | 'desc';
|
|
77
|
+
}): Promise<QueryMessage[]>;
|
|
78
|
+
|
|
79
|
+
sendLog(data: string): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface RelayClientAdapterOptions {
|
|
83
|
+
agentName: string;
|
|
84
|
+
project?: string;
|
|
85
|
+
projectRoot?: string;
|
|
86
|
+
socketPath?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function ensureReady(client: SdkRelayClient): Promise<void> {
|
|
90
|
+
if ((client as any).state !== 'READY') {
|
|
91
|
+
await client.connect();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function boolResult(ok: boolean, action: string): { success: boolean; error?: string } {
|
|
96
|
+
return ok ? { success: true } : { success: false, error: `Failed to ${action}` };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function createRelayClientAdapter(client: SdkRelayClient, ctx: RelayClientAdapterOptions): RelayClient {
|
|
100
|
+
const project = ctx.projectRoot ?? ctx.project ?? 'default';
|
|
101
|
+
const socketPath = ctx.socketPath ?? '';
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
async send(to, message, opts = {}) {
|
|
105
|
+
await ensureReady(client);
|
|
106
|
+
const ok = client.sendMessage(to, message, (opts.kind as any) ?? 'message', opts.data, opts.thread);
|
|
107
|
+
if (!ok) throw new Error('Failed to send message');
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
async sendAndWait(to, message, opts = {}) {
|
|
111
|
+
await ensureReady(client);
|
|
112
|
+
return client.sendAndWait(to, message, {
|
|
113
|
+
thread: opts.thread,
|
|
114
|
+
timeoutMs: opts.timeoutMs,
|
|
115
|
+
kind: opts.kind as any,
|
|
116
|
+
data: opts.data,
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
async broadcast(message, opts = {}) {
|
|
121
|
+
await ensureReady(client);
|
|
122
|
+
const ok = client.broadcast(message, (opts.kind as any) ?? 'message', opts.data);
|
|
123
|
+
if (!ok) throw new Error('Failed to broadcast message');
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
async subscribe(topic) {
|
|
127
|
+
await ensureReady(client);
|
|
128
|
+
const ok = client.subscribe(topic);
|
|
129
|
+
return boolResult(ok, 'subscribe');
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
async unsubscribe(topic) {
|
|
133
|
+
await ensureReady(client);
|
|
134
|
+
const ok = client.unsubscribe(topic);
|
|
135
|
+
return boolResult(ok, 'unsubscribe');
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
async joinChannel(channel, displayName) {
|
|
139
|
+
await ensureReady(client);
|
|
140
|
+
const ok = client.joinChannel(channel, displayName);
|
|
141
|
+
return boolResult(ok, 'join channel');
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
async leaveChannel(channel, reason) {
|
|
145
|
+
await ensureReady(client);
|
|
146
|
+
const ok = client.leaveChannel(channel, reason);
|
|
147
|
+
return boolResult(ok, 'leave channel');
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
async sendChannelMessage(channel, message, options = {}) {
|
|
151
|
+
await ensureReady(client);
|
|
152
|
+
const ok = client.sendChannelMessage(channel, message, { thread: options.thread });
|
|
153
|
+
if (!ok) throw new Error('Failed to send channel message');
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
async adminJoinChannel(channel, member) {
|
|
157
|
+
await ensureReady(client);
|
|
158
|
+
const ok = client.adminJoinChannel(channel, member);
|
|
159
|
+
return boolResult(ok, 'add member to channel');
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
async adminRemoveMember(channel, member) {
|
|
163
|
+
await ensureReady(client);
|
|
164
|
+
const ok = client.adminRemoveMember(channel, member);
|
|
165
|
+
return boolResult(ok, 'remove member from channel');
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
async bindAsShadow(primaryAgent, opts = {}) {
|
|
169
|
+
await ensureReady(client);
|
|
170
|
+
const ok = client.bindAsShadow(primaryAgent, { speakOn: opts.speakOn as any });
|
|
171
|
+
return boolResult(ok, 'bind as shadow');
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
async unbindAsShadow(primaryAgent) {
|
|
175
|
+
await ensureReady(client);
|
|
176
|
+
const ok = client.unbindAsShadow(primaryAgent);
|
|
177
|
+
return boolResult(ok, 'unbind shadow');
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
async createProposal(opts) {
|
|
181
|
+
await ensureReady(client);
|
|
182
|
+
const envelope: Envelope = {
|
|
183
|
+
v: PROTOCOL_VERSION,
|
|
184
|
+
type: 'PROPOSAL_CREATE',
|
|
185
|
+
id: randomUUID(),
|
|
186
|
+
ts: Date.now(),
|
|
187
|
+
payload: {
|
|
188
|
+
id: opts.id,
|
|
189
|
+
description: opts.description,
|
|
190
|
+
options: opts.options,
|
|
191
|
+
votingMethod: opts.votingMethod ?? 'majority',
|
|
192
|
+
deadline: opts.deadline,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const ok = (client as any).send?.(envelope) ?? false;
|
|
197
|
+
return boolResult(ok, 'create proposal');
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
async vote(opts) {
|
|
201
|
+
await ensureReady(client);
|
|
202
|
+
const envelope: Envelope = {
|
|
203
|
+
v: PROTOCOL_VERSION,
|
|
204
|
+
type: 'VOTE',
|
|
205
|
+
id: randomUUID(),
|
|
206
|
+
ts: Date.now(),
|
|
207
|
+
payload: {
|
|
208
|
+
proposalId: opts.proposalId,
|
|
209
|
+
vote: opts.vote,
|
|
210
|
+
reason: opts.reason,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const ok = (client as any).send?.(envelope) ?? false;
|
|
215
|
+
return boolResult(ok, 'vote');
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
async spawn(options) {
|
|
219
|
+
await ensureReady(client);
|
|
220
|
+
return client.spawn(options);
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
async release(name, reason) {
|
|
224
|
+
await ensureReady(client);
|
|
225
|
+
// Type assertion needed until SDK is published with reason parameter
|
|
226
|
+
// SDK 2.1.13 has: release(name, timeoutMs?)
|
|
227
|
+
// SDK 2.1.14+ has: release(name, reason?, timeoutMs?)
|
|
228
|
+
return (client as any).release(name, reason);
|
|
229
|
+
},
|
|
230
|
+
|
|
231
|
+
async getStatus() {
|
|
232
|
+
try {
|
|
233
|
+
await ensureReady(client);
|
|
234
|
+
const status = await client.getStatus();
|
|
235
|
+
return {
|
|
236
|
+
connected: true,
|
|
237
|
+
agentName: ctx.agentName,
|
|
238
|
+
project,
|
|
239
|
+
socketPath,
|
|
240
|
+
daemonVersion: status.version,
|
|
241
|
+
uptime: status.uptime ? `${Math.floor(status.uptime / 1000)}s` : undefined,
|
|
242
|
+
};
|
|
243
|
+
} catch {
|
|
244
|
+
return {
|
|
245
|
+
connected: false,
|
|
246
|
+
agentName: ctx.agentName,
|
|
247
|
+
project,
|
|
248
|
+
socketPath,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
async getInbox(options = {}) {
|
|
254
|
+
await ensureReady(client);
|
|
255
|
+
const messages: InboxMessage[] = await client.getInbox({
|
|
256
|
+
limit: options.limit,
|
|
257
|
+
unreadOnly: options.unread_only,
|
|
258
|
+
from: options.from,
|
|
259
|
+
channel: options.channel,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
return messages.map((m) => ({
|
|
263
|
+
id: m.id,
|
|
264
|
+
from: m.from,
|
|
265
|
+
content: m.body,
|
|
266
|
+
channel: m.channel,
|
|
267
|
+
thread: m.thread,
|
|
268
|
+
}));
|
|
269
|
+
},
|
|
270
|
+
|
|
271
|
+
async listAgents(options = {}) {
|
|
272
|
+
await ensureReady(client);
|
|
273
|
+
return client.listAgents({
|
|
274
|
+
includeIdle: options.include_idle,
|
|
275
|
+
project: options.project,
|
|
276
|
+
});
|
|
277
|
+
},
|
|
278
|
+
|
|
279
|
+
async listConnectedAgents(options = {}) {
|
|
280
|
+
await ensureReady(client);
|
|
281
|
+
return client.listConnectedAgents({
|
|
282
|
+
project: options.project,
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
async removeAgent(name, options = {}) {
|
|
287
|
+
await ensureReady(client);
|
|
288
|
+
return client.removeAgent(name, { removeMessages: options.removeMessages });
|
|
289
|
+
},
|
|
290
|
+
|
|
291
|
+
async getHealth(options = {}) {
|
|
292
|
+
await ensureReady(client);
|
|
293
|
+
return client.getHealth({
|
|
294
|
+
includeCrashes: options.include_crashes,
|
|
295
|
+
includeAlerts: options.include_alerts,
|
|
296
|
+
});
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
async getMetrics(options = {}) {
|
|
300
|
+
await ensureReady(client);
|
|
301
|
+
return client.getMetrics({ agent: options.agent });
|
|
302
|
+
},
|
|
303
|
+
|
|
304
|
+
async queryMessages(options = {}) {
|
|
305
|
+
await ensureReady(client);
|
|
306
|
+
const response = await client.queryMessages({
|
|
307
|
+
limit: options.limit,
|
|
308
|
+
sinceTs: options.sinceTs ?? options.since_ts,
|
|
309
|
+
from: options.from,
|
|
310
|
+
to: options.to,
|
|
311
|
+
thread: options.thread,
|
|
312
|
+
order: options.order,
|
|
313
|
+
});
|
|
314
|
+
return response || [];
|
|
315
|
+
},
|
|
316
|
+
|
|
317
|
+
async sendLog(data: string) {
|
|
318
|
+
await ensureReady(client);
|
|
319
|
+
const ok = client.sendLog(data);
|
|
320
|
+
if (!ok) throw new Error('Failed to send log');
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export interface RelayClientOptions {
|
|
326
|
+
agentName: string;
|
|
327
|
+
socketPath?: string;
|
|
328
|
+
project?: string;
|
|
329
|
+
quiet?: boolean;
|
|
330
|
+
timeout?: number;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Factory that creates an SDK RelayClient and wraps it with the MCP adapter.
|
|
335
|
+
*/
|
|
336
|
+
export function createRelayClient(options: RelayClientOptions): RelayClient {
|
|
337
|
+
const sdkClient = new SdkRelayClient({
|
|
338
|
+
agentName: options.agentName,
|
|
339
|
+
socketPath: options.socketPath,
|
|
340
|
+
quiet: options.quiet,
|
|
341
|
+
reconnect: true,
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
return createRelayClientAdapter(sdkClient, {
|
|
345
|
+
agentName: options.agentName,
|
|
346
|
+
project: options.project,
|
|
347
|
+
socketPath: options.socketPath,
|
|
348
|
+
});
|
|
349
|
+
}
|