@agent-relay/mcp 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.
Files changed (103) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +214 -0
  3. package/dist/bin.d.ts +12 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +127 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/client.d.ts +68 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +115 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/cloud.d.ts +108 -0
  12. package/dist/cloud.d.ts.map +1 -0
  13. package/dist/cloud.js +279 -0
  14. package/dist/cloud.js.map +1 -0
  15. package/dist/errors.d.ts +27 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +48 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +16 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/install-cli.d.ts +35 -0
  24. package/dist/install-cli.d.ts.map +1 -0
  25. package/dist/install-cli.js +157 -0
  26. package/dist/install-cli.js.map +1 -0
  27. package/dist/install.d.ts +101 -0
  28. package/dist/install.d.ts.map +1 -0
  29. package/dist/install.js +398 -0
  30. package/dist/install.js.map +1 -0
  31. package/dist/prompts/index.d.ts +2 -0
  32. package/dist/prompts/index.d.ts.map +1 -0
  33. package/dist/prompts/index.js +2 -0
  34. package/dist/prompts/index.js.map +1 -0
  35. package/dist/prompts/protocol.d.ts +11 -0
  36. package/dist/prompts/protocol.d.ts.map +1 -0
  37. package/dist/prompts/protocol.js +168 -0
  38. package/dist/prompts/protocol.js.map +1 -0
  39. package/dist/resources/agents.d.ts +11 -0
  40. package/dist/resources/agents.d.ts.map +1 -0
  41. package/dist/resources/agents.js +17 -0
  42. package/dist/resources/agents.js.map +1 -0
  43. package/dist/resources/inbox.d.ts +11 -0
  44. package/dist/resources/inbox.d.ts.map +1 -0
  45. package/dist/resources/inbox.js +17 -0
  46. package/dist/resources/inbox.js.map +1 -0
  47. package/dist/resources/index.d.ts +4 -0
  48. package/dist/resources/index.d.ts.map +1 -0
  49. package/dist/resources/index.js +4 -0
  50. package/dist/resources/index.js.map +1 -0
  51. package/dist/resources/project.d.ts +11 -0
  52. package/dist/resources/project.d.ts.map +1 -0
  53. package/dist/resources/project.js +21 -0
  54. package/dist/resources/project.js.map +1 -0
  55. package/dist/server.d.ts +19 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +215 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/simple.d.ts +173 -0
  60. package/dist/simple.d.ts.map +1 -0
  61. package/dist/simple.js +120 -0
  62. package/dist/simple.js.map +1 -0
  63. package/dist/tools/index.d.ts +10 -0
  64. package/dist/tools/index.d.ts.map +1 -0
  65. package/dist/tools/index.js +10 -0
  66. package/dist/tools/index.js.map +1 -0
  67. package/dist/tools/relay-health.d.ts +23 -0
  68. package/dist/tools/relay-health.d.ts.map +1 -0
  69. package/dist/tools/relay-health.js +138 -0
  70. package/dist/tools/relay-health.js.map +1 -0
  71. package/dist/tools/relay-inbox.d.ts +26 -0
  72. package/dist/tools/relay-inbox.d.ts.map +1 -0
  73. package/dist/tools/relay-inbox.js +58 -0
  74. package/dist/tools/relay-inbox.js.map +1 -0
  75. package/dist/tools/relay-logs.d.ts +20 -0
  76. package/dist/tools/relay-logs.d.ts.map +1 -0
  77. package/dist/tools/relay-logs.js +88 -0
  78. package/dist/tools/relay-logs.js.map +1 -0
  79. package/dist/tools/relay-metrics.d.ts +20 -0
  80. package/dist/tools/relay-metrics.d.ts.map +1 -0
  81. package/dist/tools/relay-metrics.js +135 -0
  82. package/dist/tools/relay-metrics.js.map +1 -0
  83. package/dist/tools/relay-release.d.ts +20 -0
  84. package/dist/tools/relay-release.d.ts.map +1 -0
  85. package/dist/tools/relay-release.js +44 -0
  86. package/dist/tools/relay-release.js.map +1 -0
  87. package/dist/tools/relay-send.d.ts +29 -0
  88. package/dist/tools/relay-send.d.ts.map +1 -0
  89. package/dist/tools/relay-send.js +71 -0
  90. package/dist/tools/relay-send.js.map +1 -0
  91. package/dist/tools/relay-spawn.d.ts +36 -0
  92. package/dist/tools/relay-spawn.d.ts.map +1 -0
  93. package/dist/tools/relay-spawn.js +73 -0
  94. package/dist/tools/relay-spawn.js.map +1 -0
  95. package/dist/tools/relay-status.d.ts +11 -0
  96. package/dist/tools/relay-status.d.ts.map +1 -0
  97. package/dist/tools/relay-status.js +43 -0
  98. package/dist/tools/relay-status.js.map +1 -0
  99. package/dist/tools/relay-who.d.ts +20 -0
  100. package/dist/tools/relay-who.d.ts.map +1 -0
  101. package/dist/tools/relay-who.js +47 -0
  102. package/dist/tools/relay-who.js.map +1 -0
  103. package/package.json +69 -0
package/dist/client.js ADDED
@@ -0,0 +1,115 @@
1
+ /**
2
+ * RelayClient - Client for connecting to the Agent Relay daemon
3
+ */
4
+ import { createConnection } from 'node:net';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { discoverSocket } from './cloud.js';
7
+ import { DaemonNotRunningError } from './errors.js';
8
+ export function createRelayClient(options) {
9
+ const { agentName, project = 'default', timeout = 5000 } = options;
10
+ const discovery = discoverSocket({ socketPath: options.socketPath });
11
+ const socketPath = discovery?.socketPath || options.socketPath || '/tmp/agent-relay.sock';
12
+ // Use randomUUID for collision-resistant request IDs
13
+ const generateId = () => `${agentName}-${randomUUID()}`;
14
+ async function request(type, payload) {
15
+ return new Promise((resolve, reject) => {
16
+ const id = generateId();
17
+ const req = { type, id, payload };
18
+ let timedOut = false;
19
+ let buffer = '';
20
+ const socket = createConnection(socketPath);
21
+ const timeoutId = setTimeout(() => {
22
+ timedOut = true;
23
+ socket.destroy();
24
+ reject(new Error(`Request timeout after ${timeout}ms`));
25
+ }, timeout);
26
+ socket.on('connect', () => socket.write(JSON.stringify(req) + '\n'));
27
+ socket.on('data', (data) => {
28
+ // Ignore data if we've already timed out
29
+ if (timedOut)
30
+ return;
31
+ buffer += data.toString();
32
+ const lines = buffer.split('\n');
33
+ buffer = lines.pop() || '';
34
+ for (const line of lines) {
35
+ if (!line.trim())
36
+ continue;
37
+ try {
38
+ const response = JSON.parse(line);
39
+ if (response.id === id) {
40
+ clearTimeout(timeoutId);
41
+ socket.end();
42
+ if (response.error)
43
+ reject(new Error(response.error));
44
+ else
45
+ resolve(response.payload);
46
+ return;
47
+ }
48
+ }
49
+ catch (parseError) {
50
+ // Log parse errors in debug mode for easier troubleshooting
51
+ if (process.env.DEBUG || process.env.RELAY_DEBUG) {
52
+ console.error('[RelayClient] Failed to parse daemon response:', line, parseError);
53
+ }
54
+ }
55
+ }
56
+ });
57
+ socket.on('error', (err) => {
58
+ clearTimeout(timeoutId);
59
+ // Provide user-friendly error for common connection failures
60
+ const errno = err.code;
61
+ if (errno === 'ECONNREFUSED' || errno === 'ENOENT') {
62
+ reject(new DaemonNotRunningError(`Cannot connect to daemon at ${socketPath}`));
63
+ }
64
+ else {
65
+ reject(err);
66
+ }
67
+ });
68
+ });
69
+ }
70
+ return {
71
+ async send(to, message, opts = {}) {
72
+ await request('SEND', { from: agentName, to, body: message, thread: opts.thread });
73
+ },
74
+ async sendAndWait(to, message, opts = {}) {
75
+ const r = await request('SEND_AND_WAIT', { from: agentName, to, body: message, thread: opts.thread, timeoutMs: opts.timeoutMs || 30000 });
76
+ return { from: r.from, content: r.body, thread: r.thread };
77
+ },
78
+ async spawn(opts) {
79
+ try {
80
+ await request('SPAWN', { ...opts, parent: agentName });
81
+ return { success: true };
82
+ }
83
+ catch (e) {
84
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
85
+ }
86
+ },
87
+ async release(name, reason) {
88
+ try {
89
+ await request('RELEASE', { name, reason });
90
+ return { success: true };
91
+ }
92
+ catch (e) {
93
+ return { success: false, error: e instanceof Error ? e.message : String(e) };
94
+ }
95
+ },
96
+ async getStatus() {
97
+ try {
98
+ const s = await request('STATUS', {});
99
+ return { connected: true, agentName, project, socketPath, daemonVersion: s.version, uptime: s.uptime ? Math.floor(s.uptime / 1000) + 's' : undefined };
100
+ }
101
+ catch {
102
+ return { connected: false, agentName, project, socketPath };
103
+ }
104
+ },
105
+ async getInbox(opts = {}) {
106
+ const msgs = await request('INBOX', { agent: agentName, limit: opts.limit, unreadOnly: opts.unread_only, from: opts.from, channel: opts.channel });
107
+ return msgs.map(m => ({ id: m.id, from: m.from, content: m.body, channel: m.channel, thread: m.thread }));
108
+ },
109
+ async listAgents(opts = {}) {
110
+ return request('LIST_AGENTS', { includeIdle: opts.include_idle, project: opts.project });
111
+ },
112
+ };
113
+ }
114
+ export default createRelayClient;
115
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Cloud Integration for Agent Relay MCP Server
3
+ *
4
+ * Provides cloud workspace detection, remote daemon connection,
5
+ * and workspace-aware socket discovery for cloud deployments.
6
+ */
7
+ export interface CloudWorkspace {
8
+ workspaceId: string;
9
+ cloudApiUrl: string;
10
+ workspaceToken?: string;
11
+ ownerUserId?: string;
12
+ }
13
+ export interface DiscoveryResult {
14
+ socketPath: string;
15
+ project: string;
16
+ source: 'env' | 'cloud' | 'cwd' | 'scan';
17
+ isCloud: boolean;
18
+ workspace?: CloudWorkspace;
19
+ }
20
+ export interface CloudConnectionOptions {
21
+ /** Override socket path (for testing) */
22
+ socketPath?: string;
23
+ /** Override workspace detection */
24
+ workspace?: Partial<CloudWorkspace>;
25
+ }
26
+ /**
27
+ * Detect if running in a cloud workspace environment.
28
+ *
29
+ * Cloud workspaces set these environment variables:
30
+ * - WORKSPACE_ID: The unique workspace identifier
31
+ * - CLOUD_API_URL: The cloud API endpoint
32
+ * - WORKSPACE_TOKEN: Bearer token for API auth (optional)
33
+ * - WORKSPACE_OWNER_USER_ID: The workspace owner's user ID (optional)
34
+ */
35
+ export declare function detectCloudWorkspace(): CloudWorkspace | null;
36
+ /**
37
+ * Check if we're running in a cloud workspace.
38
+ */
39
+ export declare function isCloudWorkspace(): boolean;
40
+ /**
41
+ * Get the workspace-namespaced socket path.
42
+ *
43
+ * In cloud workspaces, sockets are stored at:
44
+ * /tmp/relay/{WORKSPACE_ID}/sockets/daemon.sock
45
+ *
46
+ * This provides multi-tenant isolation on shared infrastructure.
47
+ */
48
+ export declare function getCloudSocketPath(workspaceId: string): string;
49
+ /**
50
+ * Get the workspace-namespaced outbox path.
51
+ *
52
+ * In cloud workspaces, outbox directories are at:
53
+ * /tmp/relay/{WORKSPACE_ID}/outbox/{agentName}/
54
+ */
55
+ export declare function getCloudOutboxPath(workspaceId: string, agentName: string): string;
56
+ /**
57
+ * Discover relay daemon socket with cloud-awareness.
58
+ *
59
+ * Priority order:
60
+ * 1. RELAY_SOCKET environment variable (explicit path)
61
+ * 2. Cloud workspace socket (if WORKSPACE_ID is set)
62
+ * 3. RELAY_PROJECT environment variable (project name → data dir)
63
+ * 4. Current working directory .relay/config.json
64
+ * 5. Scan data directory for active sockets
65
+ *
66
+ * @param options - Optional configuration overrides
67
+ * @returns Discovery result with socket path, project info, and cloud status
68
+ */
69
+ export declare function discoverSocket(options?: CloudConnectionOptions): DiscoveryResult | null;
70
+ /**
71
+ * Make an authenticated request to the cloud API.
72
+ *
73
+ * @param workspace - Cloud workspace configuration
74
+ * @param path - API path (e.g., '/api/status')
75
+ * @param options - Fetch options
76
+ * @returns Response from the API
77
+ */
78
+ export declare function cloudApiRequest(workspace: CloudWorkspace, path: string, options?: RequestInit): Promise<Response>;
79
+ /**
80
+ * Get the workspace status from the cloud API.
81
+ */
82
+ export declare function getWorkspaceStatus(workspace: CloudWorkspace): Promise<{
83
+ status: string;
84
+ agents?: string[];
85
+ } | null>;
86
+ export interface CloudConnectionInfo {
87
+ socketPath: string;
88
+ project: string;
89
+ isCloud: boolean;
90
+ workspace?: CloudWorkspace;
91
+ daemonUrl?: string;
92
+ }
93
+ /**
94
+ * Get connection info for the relay daemon.
95
+ *
96
+ * This function determines the best way to connect to the daemon:
97
+ * - In cloud environments: Uses workspace-namespaced socket
98
+ * - In local environments: Uses standard socket discovery
99
+ *
100
+ * @param options - Optional configuration overrides
101
+ * @returns Connection info or null if daemon not found
102
+ */
103
+ export declare function getConnectionInfo(options?: CloudConnectionOptions): CloudConnectionInfo | null;
104
+ /**
105
+ * Environment variable summary for debugging.
106
+ */
107
+ export declare function getCloudEnvironmentSummary(): Record<string, string | undefined>;
108
+ //# sourceMappingURL=cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACrC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,GAAG,IAAI,CAc5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,GAAG,IAAI,CAiH3F;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAevD;AAMD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,sBAA2B,GACnC,mBAAmB,GAAG,IAAI,CAoB5B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAS/E"}
package/dist/cloud.js ADDED
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Cloud Integration for Agent Relay MCP Server
3
+ *
4
+ * Provides cloud workspace detection, remote daemon connection,
5
+ * and workspace-aware socket discovery for cloud deployments.
6
+ */
7
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { homedir } from 'node:os';
10
+ // ============================================================================
11
+ // Cloud Workspace Detection
12
+ // ============================================================================
13
+ /**
14
+ * Detect if running in a cloud workspace environment.
15
+ *
16
+ * Cloud workspaces set these environment variables:
17
+ * - WORKSPACE_ID: The unique workspace identifier
18
+ * - CLOUD_API_URL: The cloud API endpoint
19
+ * - WORKSPACE_TOKEN: Bearer token for API auth (optional)
20
+ * - WORKSPACE_OWNER_USER_ID: The workspace owner's user ID (optional)
21
+ */
22
+ export function detectCloudWorkspace() {
23
+ const workspaceId = process.env.WORKSPACE_ID;
24
+ const cloudApiUrl = process.env.CLOUD_API_URL;
25
+ if (!workspaceId || !cloudApiUrl) {
26
+ return null;
27
+ }
28
+ return {
29
+ workspaceId,
30
+ cloudApiUrl,
31
+ workspaceToken: process.env.WORKSPACE_TOKEN,
32
+ ownerUserId: process.env.WORKSPACE_OWNER_USER_ID,
33
+ };
34
+ }
35
+ /**
36
+ * Check if we're running in a cloud workspace.
37
+ */
38
+ export function isCloudWorkspace() {
39
+ return detectCloudWorkspace() !== null;
40
+ }
41
+ // ============================================================================
42
+ // Workspace-Aware Socket Discovery
43
+ // ============================================================================
44
+ /**
45
+ * Get the workspace-namespaced socket path.
46
+ *
47
+ * In cloud workspaces, sockets are stored at:
48
+ * /tmp/relay/{WORKSPACE_ID}/sockets/daemon.sock
49
+ *
50
+ * This provides multi-tenant isolation on shared infrastructure.
51
+ */
52
+ export function getCloudSocketPath(workspaceId) {
53
+ return `/tmp/relay/${workspaceId}/sockets/daemon.sock`;
54
+ }
55
+ /**
56
+ * Get the workspace-namespaced outbox path.
57
+ *
58
+ * In cloud workspaces, outbox directories are at:
59
+ * /tmp/relay/{WORKSPACE_ID}/outbox/{agentName}/
60
+ */
61
+ export function getCloudOutboxPath(workspaceId, agentName) {
62
+ return `/tmp/relay/${workspaceId}/outbox/${agentName}`;
63
+ }
64
+ /**
65
+ * Get platform-specific data directory.
66
+ */
67
+ function getDataDir() {
68
+ const platform = process.platform;
69
+ if (platform === 'darwin') {
70
+ return join(homedir(), 'Library', 'Application Support', 'agent-relay');
71
+ }
72
+ else if (platform === 'win32') {
73
+ return join(process.env.APPDATA || homedir(), 'agent-relay');
74
+ }
75
+ else {
76
+ return join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'agent-relay');
77
+ }
78
+ }
79
+ /**
80
+ * Discover relay daemon socket with cloud-awareness.
81
+ *
82
+ * Priority order:
83
+ * 1. RELAY_SOCKET environment variable (explicit path)
84
+ * 2. Cloud workspace socket (if WORKSPACE_ID is set)
85
+ * 3. RELAY_PROJECT environment variable (project name → data dir)
86
+ * 4. Current working directory .relay/config.json
87
+ * 5. Scan data directory for active sockets
88
+ *
89
+ * @param options - Optional configuration overrides
90
+ * @returns Discovery result with socket path, project info, and cloud status
91
+ */
92
+ export function discoverSocket(options = {}) {
93
+ // 0. Use override if provided
94
+ if (options.socketPath && existsSync(options.socketPath)) {
95
+ const workspace = options.workspace
96
+ ? {
97
+ workspaceId: options.workspace.workspaceId || 'override',
98
+ cloudApiUrl: options.workspace.cloudApiUrl || '',
99
+ }
100
+ : undefined;
101
+ return {
102
+ socketPath: options.socketPath,
103
+ project: workspace?.workspaceId || 'override',
104
+ source: 'env',
105
+ isCloud: !!workspace,
106
+ workspace,
107
+ };
108
+ }
109
+ // 1. Explicit socket path from environment
110
+ const socketEnv = process.env.RELAY_SOCKET;
111
+ if (socketEnv && existsSync(socketEnv)) {
112
+ const workspace = detectCloudWorkspace();
113
+ return {
114
+ socketPath: socketEnv,
115
+ project: process.env.RELAY_PROJECT || workspace?.workspaceId || 'unknown',
116
+ source: 'env',
117
+ isCloud: !!workspace,
118
+ workspace: workspace || undefined,
119
+ };
120
+ }
121
+ // 2. Cloud workspace socket (highest priority for cloud environments)
122
+ const workspace = detectCloudWorkspace();
123
+ if (workspace) {
124
+ const cloudSocket = getCloudSocketPath(workspace.workspaceId);
125
+ if (existsSync(cloudSocket)) {
126
+ return {
127
+ socketPath: cloudSocket,
128
+ project: workspace.workspaceId,
129
+ source: 'cloud',
130
+ isCloud: true,
131
+ workspace,
132
+ };
133
+ }
134
+ }
135
+ // 3. Project name → data dir lookup
136
+ const projectEnv = process.env.RELAY_PROJECT;
137
+ if (projectEnv) {
138
+ const dataDir = getDataDir();
139
+ const projectSocket = join(dataDir, 'projects', projectEnv, 'daemon.sock');
140
+ if (existsSync(projectSocket)) {
141
+ return {
142
+ socketPath: projectSocket,
143
+ project: projectEnv,
144
+ source: 'env',
145
+ isCloud: false,
146
+ };
147
+ }
148
+ }
149
+ // 4. Current working directory config
150
+ const cwdConfig = join(process.cwd(), '.relay', 'config.json');
151
+ if (existsSync(cwdConfig)) {
152
+ try {
153
+ const config = JSON.parse(readFileSync(cwdConfig, 'utf-8'));
154
+ if (config.socketPath && existsSync(config.socketPath)) {
155
+ return {
156
+ socketPath: config.socketPath,
157
+ project: config.project || 'local',
158
+ source: 'cwd',
159
+ isCloud: false,
160
+ };
161
+ }
162
+ }
163
+ catch (err) {
164
+ // Invalid config (malformed JSON, permission error, etc.), continue to next method
165
+ if (process.env.DEBUG || process.env.RELAY_DEBUG) {
166
+ console.debug('[cloud] Failed to read cwd config:', cwdConfig, err);
167
+ }
168
+ }
169
+ }
170
+ // 5. Scan data directory for active sockets
171
+ const dataDir = getDataDir();
172
+ const projectsDir = join(dataDir, 'projects');
173
+ if (existsSync(projectsDir)) {
174
+ try {
175
+ const projects = readdirSync(projectsDir, { withFileTypes: true })
176
+ .filter((d) => d.isDirectory())
177
+ .map((d) => d.name);
178
+ for (const project of projects) {
179
+ const socketPath = join(projectsDir, project, 'daemon.sock');
180
+ if (existsSync(socketPath)) {
181
+ return {
182
+ socketPath,
183
+ project,
184
+ source: 'scan',
185
+ isCloud: false,
186
+ };
187
+ }
188
+ }
189
+ }
190
+ catch (err) {
191
+ // Directory read failed (permission error, etc.), return null
192
+ if (process.env.DEBUG || process.env.RELAY_DEBUG) {
193
+ console.debug('[cloud] Failed to scan projects directory:', projectsDir, err);
194
+ }
195
+ }
196
+ }
197
+ return null;
198
+ }
199
+ // ============================================================================
200
+ // Cloud API Helpers
201
+ // ============================================================================
202
+ /**
203
+ * Make an authenticated request to the cloud API.
204
+ *
205
+ * @param workspace - Cloud workspace configuration
206
+ * @param path - API path (e.g., '/api/status')
207
+ * @param options - Fetch options
208
+ * @returns Response from the API
209
+ */
210
+ export async function cloudApiRequest(workspace, path, options = {}) {
211
+ const url = `${workspace.cloudApiUrl}${path}`;
212
+ const headers = {
213
+ 'Content-Type': 'application/json',
214
+ ...options.headers,
215
+ };
216
+ if (workspace.workspaceToken) {
217
+ headers['Authorization'] = `Bearer ${workspace.workspaceToken}`;
218
+ }
219
+ return fetch(url, {
220
+ ...options,
221
+ headers,
222
+ });
223
+ }
224
+ /**
225
+ * Get the workspace status from the cloud API.
226
+ */
227
+ export async function getWorkspaceStatus(workspace) {
228
+ try {
229
+ const response = await cloudApiRequest(workspace, `/api/workspaces/${workspace.workspaceId}/status`);
230
+ if (!response.ok) {
231
+ return null;
232
+ }
233
+ return (await response.json());
234
+ }
235
+ catch {
236
+ return null;
237
+ }
238
+ }
239
+ /**
240
+ * Get connection info for the relay daemon.
241
+ *
242
+ * This function determines the best way to connect to the daemon:
243
+ * - In cloud environments: Uses workspace-namespaced socket
244
+ * - In local environments: Uses standard socket discovery
245
+ *
246
+ * @param options - Optional configuration overrides
247
+ * @returns Connection info or null if daemon not found
248
+ */
249
+ export function getConnectionInfo(options = {}) {
250
+ const discovery = discoverSocket(options);
251
+ if (!discovery) {
252
+ return null;
253
+ }
254
+ const info = {
255
+ socketPath: discovery.socketPath,
256
+ project: discovery.project,
257
+ isCloud: discovery.isCloud,
258
+ workspace: discovery.workspace,
259
+ };
260
+ // In cloud environments, we may also have a daemon URL for HTTP API access
261
+ if (discovery.workspace?.cloudApiUrl) {
262
+ info.daemonUrl = discovery.workspace.cloudApiUrl;
263
+ }
264
+ return info;
265
+ }
266
+ /**
267
+ * Environment variable summary for debugging.
268
+ */
269
+ export function getCloudEnvironmentSummary() {
270
+ return {
271
+ WORKSPACE_ID: process.env.WORKSPACE_ID,
272
+ CLOUD_API_URL: process.env.CLOUD_API_URL,
273
+ WORKSPACE_TOKEN: process.env.WORKSPACE_TOKEN ? '[set]' : undefined,
274
+ WORKSPACE_OWNER_USER_ID: process.env.WORKSPACE_OWNER_USER_ID,
275
+ RELAY_SOCKET: process.env.RELAY_SOCKET,
276
+ RELAY_PROJECT: process.env.RELAY_PROJECT,
277
+ };
278
+ }
279
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Error Types for Agent Relay MCP Server
3
+ *
4
+ * Provides typed error classes for better error handling and messaging.
5
+ */
6
+ export declare class RelayError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ export declare class DaemonNotRunningError extends RelayError {
10
+ constructor(message?: string);
11
+ }
12
+ export declare class AgentNotFoundError extends RelayError {
13
+ constructor(agentName: string);
14
+ }
15
+ export declare class TimeoutError extends RelayError {
16
+ constructor(operation: string, timeoutMs: number);
17
+ }
18
+ export declare class ConnectionError extends RelayError {
19
+ constructor(message: string);
20
+ }
21
+ export declare class ChannelNotFoundError extends RelayError {
22
+ constructor(channel: string);
23
+ }
24
+ export declare class SpawnError extends RelayError {
25
+ constructor(workerName: string, reason: string);
26
+ }
27
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,UAAU;gBACvC,OAAO,CAAC,EAAE,MAAM;CAI7B;AAED,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,YAAa,SAAQ,UAAU;gBAC9B,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAIjD;AAED,qBAAa,eAAgB,SAAQ,UAAU;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,UAAW,SAAQ,UAAU;gBAC5B,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI/C"}
package/dist/errors.js ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Error Types for Agent Relay MCP Server
3
+ *
4
+ * Provides typed error classes for better error handling and messaging.
5
+ */
6
+ export class RelayError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = 'RelayError';
10
+ }
11
+ }
12
+ export class DaemonNotRunningError extends RelayError {
13
+ constructor(message) {
14
+ super(message || 'Relay daemon is not running. Start with: agent-relay up');
15
+ this.name = 'DaemonNotRunningError';
16
+ }
17
+ }
18
+ export class AgentNotFoundError extends RelayError {
19
+ constructor(agentName) {
20
+ super(`Agent not found: ${agentName}`);
21
+ this.name = 'AgentNotFoundError';
22
+ }
23
+ }
24
+ export class TimeoutError extends RelayError {
25
+ constructor(operation, timeoutMs) {
26
+ super(`Timeout after ${timeoutMs}ms: ${operation}`);
27
+ this.name = 'TimeoutError';
28
+ }
29
+ }
30
+ export class ConnectionError extends RelayError {
31
+ constructor(message) {
32
+ super(`Connection error: ${message}`);
33
+ this.name = 'ConnectionError';
34
+ }
35
+ }
36
+ export class ChannelNotFoundError extends RelayError {
37
+ constructor(channel) {
38
+ super(`Channel not found: ${channel}`);
39
+ this.name = 'ChannelNotFoundError';
40
+ }
41
+ }
42
+ export class SpawnError extends RelayError {
43
+ constructor(workerName, reason) {
44
+ super(`Failed to spawn worker "${workerName}": ${reason}`);
45
+ this.name = 'SpawnError';
46
+ }
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IACnD,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,yDAAyD,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,SAAiB;QAC3B,KAAK,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,SAAiB,EAAE,SAAiB;QAC9C,KAAK,CAAC,iBAAiB,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxC,YAAY,UAAkB,EAAE,MAAc;QAC5C,KAAK,CAAC,2BAA2B,UAAU,MAAM,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export type { RelayClient } from './client.js';
2
+ export { createRelayClient } from './client.js';
3
+ export { createTools, send, inbox, who, type RelayTools, type ToolsConfig, type Message, type Agent, type Status, type SpawnResult, } from './simple.js';
4
+ export { createMCPServer, runMCPServer, type MCPServerConfig } from './server.js';
5
+ export { relaySendTool, relaySendSchema, handleRelaySend, type RelaySendInput, relayInboxTool, relayInboxSchema, handleRelayInbox, type RelayInboxInput, relayWhoTool, relayWhoSchema, handleRelayWho, type RelayWhoInput, relaySpawnTool, relaySpawnSchema, handleRelaySpawn, type RelaySpawnInput, relayReleaseTool, relayReleaseSchema, handleRelayRelease, type RelayReleaseInput, relayStatusTool, relayStatusSchema, handleRelayStatus, type RelayStatusInput, } from './tools/index.js';
6
+ export { protocolPrompt, getProtocolPrompt, PROTOCOL_DOCUMENTATION } from './prompts/index.js';
7
+ export { agentsResource, getAgentsResource, inboxResource, getInboxResource, projectResource, getProjectResource, } from './resources/index.js';
8
+ export { RelayError, DaemonNotRunningError, AgentNotFoundError, TimeoutError, ConnectionError, ChannelNotFoundError, SpawnError, } from './errors.js';
9
+ export { discoverSocket, detectCloudWorkspace, isCloudWorkspace, getCloudSocketPath, getConnectionInfo, type DiscoveryResult, type CloudWorkspace, type CloudConnectionInfo, } from './cloud.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,GAAG,EACH,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAGlF,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,eAAe,EACpB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,aAAa,EAClB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,eAAe,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,UAAU,GACX,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export { createRelayClient } from './client.js';
2
+ // Simple programmatic API (no MCP protocol overhead)
3
+ export { createTools, send, inbox, who, } from './simple.js';
4
+ // Server
5
+ export { createMCPServer, runMCPServer } from './server.js';
6
+ // Tools (for direct usage or custom server implementations)
7
+ export { relaySendTool, relaySendSchema, handleRelaySend, relayInboxTool, relayInboxSchema, handleRelayInbox, relayWhoTool, relayWhoSchema, handleRelayWho, relaySpawnTool, relaySpawnSchema, handleRelaySpawn, relayReleaseTool, relayReleaseSchema, handleRelayRelease, relayStatusTool, relayStatusSchema, handleRelayStatus, } from './tools/index.js';
8
+ // Prompts
9
+ export { protocolPrompt, getProtocolPrompt, PROTOCOL_DOCUMENTATION } from './prompts/index.js';
10
+ // Resources
11
+ export { agentsResource, getAgentsResource, inboxResource, getInboxResource, projectResource, getProjectResource, } from './resources/index.js';
12
+ // Errors
13
+ export { RelayError, DaemonNotRunningError, AgentNotFoundError, TimeoutError, ConnectionError, ChannelNotFoundError, SpawnError, } from './errors.js';
14
+ // Cloud/Discovery
15
+ export { discoverSocket, detectCloudWorkspace, isCloudWorkspace, getCloudSocketPath, getConnectionInfo, } from './cloud.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,qDAAqD;AACrD,OAAO,EACL,WAAW,EACX,IAAI,EACJ,KAAK,EACL,GAAG,GAOJ,MAAM,aAAa,CAAC;AAErB,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AAElF,4DAA4D;AAC5D,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EAEf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAEhB,YAAY,EACZ,cAAc,EACd,cAAc,EAEd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAEhB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAElB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAE1B,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,YAAY;AACZ,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,SAAS;AACT,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAIlB,MAAM,YAAY,CAAC"}