@agent-relay/mcp 2.0.13 → 2.0.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/README.md +24 -3
- package/dist/bin.js +13 -5
- package/dist/bin.js.map +1 -1
- package/dist/client.d.ts +54 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +132 -18
- package/dist/client.js.map +1 -1
- package/dist/cloud.d.ts +12 -0
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +125 -1
- package/dist/cloud.js.map +1 -1
- package/dist/file-transport.d.ts +97 -0
- package/dist/file-transport.d.ts.map +1 -0
- package/dist/file-transport.js +197 -0
- package/dist/file-transport.js.map +1 -0
- package/dist/hybrid-client.d.ts +28 -0
- package/dist/hybrid-client.d.ts.map +1 -0
- package/dist/hybrid-client.js +159 -0
- package/dist/hybrid-client.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +23 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +229 -31
- package/dist/install.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -1
- package/dist/server.js.map +1 -1
- package/dist/simple.d.ts +1 -1
- package/dist/simple.d.ts.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/relay-continuity.d.ts +35 -0
- package/dist/tools/relay-continuity.d.ts.map +1 -0
- package/dist/tools/relay-continuity.js +101 -0
- package/dist/tools/relay-continuity.js.map +1 -0
- package/dist/tools/relay-health.d.ts +1 -4
- package/dist/tools/relay-health.d.ts.map +1 -1
- package/dist/tools/relay-health.js +7 -15
- package/dist/tools/relay-health.js.map +1 -1
- package/dist/tools/relay-logs.d.ts.map +1 -1
- package/dist/tools/relay-logs.js +4 -2
- package/dist/tools/relay-logs.js.map +1 -1
- package/dist/tools/relay-metrics.d.ts +1 -4
- package/dist/tools/relay-metrics.d.ts.map +1 -1
- package/dist/tools/relay-metrics.js +4 -15
- package/dist/tools/relay-metrics.js.map +1 -1
- package/dist/tools/relay-send.d.ts +2 -2
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ agent-relay init
|
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
The wizard will:
|
|
18
|
-
1. Configure MCP for your AI editors (Claude Code, Cursor)
|
|
18
|
+
1. Configure MCP for your AI editors (Claude Code, Cursor, Codex, and more)
|
|
19
19
|
2. Offer to start the daemon
|
|
20
20
|
3. Show you how to use the relay tools
|
|
21
21
|
|
|
@@ -30,8 +30,24 @@ npx @agent-relay/mcp install
|
|
|
30
30
|
# Or configure specific editors
|
|
31
31
|
npx @agent-relay/mcp install --editor claude # Claude Code
|
|
32
32
|
npx @agent-relay/mcp install --editor cursor # Cursor
|
|
33
|
+
npx @agent-relay/mcp install --editor codex # Codex (OpenAI)
|
|
33
34
|
npx @agent-relay/mcp install --editor vscode # VS Code
|
|
34
35
|
npx @agent-relay/mcp install --editor windsurf # Windsurf
|
|
36
|
+
npx @agent-relay/mcp install --editor gemini # Gemini CLI
|
|
37
|
+
npx @agent-relay/mcp install --editor opencode # OpenCode
|
|
38
|
+
npx @agent-relay/mcp install --editor droid # Droid (Factory)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Global vs Project-Local Installation
|
|
42
|
+
|
|
43
|
+
By default, MCP is installed to your project directory (project-local). Use `--global` to install to your home directory:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Project-local (default) - writes to ./codex.toml, ./.cursor/mcp.json, etc.
|
|
47
|
+
npx @agent-relay/mcp install --editor codex
|
|
48
|
+
|
|
49
|
+
# Global - writes to ~/.codex/config.toml, ~/.cursor/mcp.json, etc.
|
|
50
|
+
npx @agent-relay/mcp install --editor codex --global
|
|
35
51
|
```
|
|
36
52
|
|
|
37
53
|
### Start the Daemon
|
|
@@ -111,8 +127,13 @@ agent-relay up
|
|
|
111
127
|
|
|
112
128
|
1. Restart your editor after installing MCP
|
|
113
129
|
2. Check the MCP configuration was created:
|
|
114
|
-
- Claude Code: `~/.claude/settings.json`
|
|
115
|
-
- Cursor: `~/.cursor/mcp.json`
|
|
130
|
+
- Claude Code: `~/.claude/settings.json` (global) or `.mcp.json` (project)
|
|
131
|
+
- Cursor: `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project)
|
|
132
|
+
- Codex: `~/.codex/config.toml` (global) or `codex.toml` (project)
|
|
133
|
+
- VS Code: `~/.vscode/mcp.json` (global) or `.vscode/mcp.json` (project)
|
|
134
|
+
- Gemini CLI: `~/.gemini/settings.json`
|
|
135
|
+
- OpenCode: `~/.config/opencode/opencode.json`
|
|
136
|
+
- Droid: `~/.factory/mcp.json`
|
|
116
137
|
|
|
117
138
|
### Check installation status
|
|
118
139
|
|
package/dist/bin.js
CHANGED
|
@@ -97,13 +97,21 @@ switch (command) {
|
|
|
97
97
|
// Dynamic import to avoid loading server code when not needed
|
|
98
98
|
(async () => {
|
|
99
99
|
try {
|
|
100
|
-
const {
|
|
101
|
-
|
|
100
|
+
const { runMCPServer, discoverSocket, discoverAgentName } = await import('./index.js');
|
|
101
|
+
const { createHybridClient, discoverProjectRoot } = await import('./hybrid-client.js');
|
|
102
|
+
// Discover socket and agent identity
|
|
102
103
|
const discovery = discoverSocket();
|
|
103
|
-
const agentName =
|
|
104
|
-
//
|
|
105
|
-
const
|
|
104
|
+
const agentName = discoverAgentName(discovery) || `mcp-${process.pid}`;
|
|
105
|
+
// Discover project root for file-based transport
|
|
106
|
+
const projectRoot = discoverProjectRoot();
|
|
107
|
+
if (!projectRoot) {
|
|
108
|
+
console.error('Could not find project root (.agent-relay directory)');
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
// Create hybrid client (file-based writes, socket queries)
|
|
112
|
+
const client = createHybridClient({
|
|
106
113
|
agentName,
|
|
114
|
+
projectRoot,
|
|
107
115
|
socketPath: discovery?.socketPath,
|
|
108
116
|
project: discovery?.project,
|
|
109
117
|
});
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RelayClient - Client for connecting to the Agent Relay daemon
|
|
3
3
|
*/
|
|
4
|
+
export interface HealthResponse {
|
|
5
|
+
healthScore: number;
|
|
6
|
+
summary: string;
|
|
7
|
+
issues: Array<{
|
|
8
|
+
severity: string;
|
|
9
|
+
message: string;
|
|
10
|
+
}>;
|
|
11
|
+
recommendations: string[];
|
|
12
|
+
crashes: Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
agentName: string;
|
|
15
|
+
crashedAt: string;
|
|
16
|
+
likelyCause: string;
|
|
17
|
+
summary?: string;
|
|
18
|
+
}>;
|
|
19
|
+
alerts: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
agentName: string;
|
|
22
|
+
alertType: string;
|
|
23
|
+
message: string;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
}>;
|
|
26
|
+
stats: {
|
|
27
|
+
totalCrashes24h: number;
|
|
28
|
+
totalAlerts24h: number;
|
|
29
|
+
agentCount: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface MetricsResponse {
|
|
33
|
+
agents: Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
pid?: number;
|
|
36
|
+
status: string;
|
|
37
|
+
rssBytes?: number;
|
|
38
|
+
cpuPercent?: number;
|
|
39
|
+
trend?: string;
|
|
40
|
+
alertLevel?: string;
|
|
41
|
+
highWatermark?: number;
|
|
42
|
+
uptimeMs?: number;
|
|
43
|
+
}>;
|
|
44
|
+
system: {
|
|
45
|
+
totalMemory: number;
|
|
46
|
+
freeMemory: number;
|
|
47
|
+
heapUsed: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
4
50
|
export interface RelayClient {
|
|
5
51
|
send(to: string, message: string, options?: {
|
|
6
52
|
thread?: string;
|
|
@@ -52,10 +98,17 @@ export interface RelayClient {
|
|
|
52
98
|
project?: string;
|
|
53
99
|
}): Promise<Array<{
|
|
54
100
|
name: string;
|
|
55
|
-
cli
|
|
101
|
+
cli?: string;
|
|
56
102
|
idle?: boolean;
|
|
57
103
|
parent?: string;
|
|
58
104
|
}>>;
|
|
105
|
+
getHealth(options?: {
|
|
106
|
+
include_crashes?: boolean;
|
|
107
|
+
include_alerts?: boolean;
|
|
108
|
+
}): Promise<HealthResponse>;
|
|
109
|
+
getMetrics(options?: {
|
|
110
|
+
agent?: string;
|
|
111
|
+
}): Promise<MetricsResponse>;
|
|
59
112
|
}
|
|
60
113
|
export interface RelayClientOptions {
|
|
61
114
|
agentName: string;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* RelayClient - Client for connecting to the Agent Relay daemon
|
|
3
3
|
*/
|
|
4
4
|
import { createConnection } from 'node:net';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
5
6
|
import { discoverSocket } from './cloud.js';
|
|
6
7
|
import { DaemonNotRunningError } from './errors.js';
|
|
7
8
|
// Protocol version
|
|
@@ -44,14 +45,65 @@ class FrameParser {
|
|
|
44
45
|
}
|
|
45
46
|
export function createRelayClient(options) {
|
|
46
47
|
const { agentName, project = 'default', timeout = 5000 } = options;
|
|
47
|
-
|
|
48
|
-
const socketPath =
|
|
48
|
+
// Prefer explicit socketPath option over discovery to avoid finding wrong daemon
|
|
49
|
+
const socketPath = options.socketPath || discoverSocket()?.socketPath || '/tmp/agent-relay.sock';
|
|
49
50
|
// Generate unique IDs
|
|
50
51
|
let idCounter = 0;
|
|
51
52
|
const generateId = () => `mcp-${Date.now().toString(36)}-${(++idCounter).toString(36)}`;
|
|
52
|
-
|
|
53
|
+
// Timeouts for different operations
|
|
54
|
+
const RELEASE_TIMEOUT = 10000; // 10 seconds for release operations
|
|
55
|
+
/**
|
|
56
|
+
* Fire-and-forget: Send a message without waiting for any response.
|
|
57
|
+
* Used for SEND and SPAWN where we don't expect daemon to reply.
|
|
58
|
+
* @param type Message type
|
|
59
|
+
* @param payload Message payload (for SEND: must be SendPayload with kind, body, etc.)
|
|
60
|
+
* @param envelopeProps Envelope-level routing (from, to) - NOT in payload!
|
|
61
|
+
*/
|
|
62
|
+
function fireAndForget(type, payload, envelopeProps) {
|
|
53
63
|
return new Promise((resolve, reject) => {
|
|
54
64
|
const id = generateId();
|
|
65
|
+
const envelope = {
|
|
66
|
+
v: PROTOCOL_VERSION,
|
|
67
|
+
type,
|
|
68
|
+
id,
|
|
69
|
+
ts: Date.now(),
|
|
70
|
+
payload,
|
|
71
|
+
};
|
|
72
|
+
// Add from/to at envelope level (required for SEND messages)
|
|
73
|
+
if (envelopeProps?.from)
|
|
74
|
+
envelope.from = envelopeProps.from;
|
|
75
|
+
if (envelopeProps?.to)
|
|
76
|
+
envelope.to = envelopeProps.to;
|
|
77
|
+
const socket = createConnection(socketPath);
|
|
78
|
+
socket.on('connect', () => {
|
|
79
|
+
socket.write(encodeFrame(envelope));
|
|
80
|
+
socket.end();
|
|
81
|
+
resolve();
|
|
82
|
+
});
|
|
83
|
+
socket.on('error', (err) => {
|
|
84
|
+
const errno = err.code;
|
|
85
|
+
if (errno === 'ECONNREFUSED' || errno === 'ENOENT') {
|
|
86
|
+
reject(new DaemonNotRunningError(`Cannot connect to daemon at ${socketPath}`));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
reject(err);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Request-response: Send a message and wait for daemon to respond.
|
|
96
|
+
* Used for queries (STATUS, INBOX, etc.) and blocking sends (waits for ACK).
|
|
97
|
+
* @param type Message type
|
|
98
|
+
* @param payload Message payload (for SEND: must be SendPayload with kind, body, etc.)
|
|
99
|
+
* @param customTimeout Optional timeout override
|
|
100
|
+
* @param payloadMeta Optional sync metadata for blocking sends
|
|
101
|
+
* @param envelopeProps Envelope-level routing (from, to) - NOT in payload!
|
|
102
|
+
*/
|
|
103
|
+
async function request(type, payload, customTimeout, payloadMeta, envelopeProps) {
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const id = generateId();
|
|
106
|
+
const correlationId = payloadMeta?.sync?.correlationId;
|
|
55
107
|
// Build a proper protocol envelope
|
|
56
108
|
const envelope = {
|
|
57
109
|
v: PROTOCOL_VERSION,
|
|
@@ -60,14 +112,23 @@ export function createRelayClient(options) {
|
|
|
60
112
|
ts: Date.now(),
|
|
61
113
|
payload,
|
|
62
114
|
};
|
|
115
|
+
// Add from/to at envelope level (required for SEND messages)
|
|
116
|
+
if (envelopeProps?.from)
|
|
117
|
+
envelope.from = envelopeProps.from;
|
|
118
|
+
if (envelopeProps?.to)
|
|
119
|
+
envelope.to = envelopeProps.to;
|
|
120
|
+
if (payloadMeta) {
|
|
121
|
+
envelope.payload_meta = payloadMeta;
|
|
122
|
+
}
|
|
63
123
|
let timedOut = false;
|
|
64
124
|
const parser = new FrameParser();
|
|
65
125
|
const socket = createConnection(socketPath);
|
|
126
|
+
const effectiveTimeout = customTimeout ?? timeout;
|
|
66
127
|
const timeoutId = setTimeout(() => {
|
|
67
128
|
timedOut = true;
|
|
68
129
|
socket.destroy();
|
|
69
|
-
reject(new Error(`Request timeout after ${
|
|
70
|
-
},
|
|
130
|
+
reject(new Error(`Request timeout after ${effectiveTimeout}ms`));
|
|
131
|
+
}, effectiveTimeout);
|
|
71
132
|
socket.on('connect', () => socket.write(encodeFrame(envelope)));
|
|
72
133
|
socket.on('data', (data) => {
|
|
73
134
|
// Ignore data if we've already timed out
|
|
@@ -75,17 +136,20 @@ export function createRelayClient(options) {
|
|
|
75
136
|
return;
|
|
76
137
|
const frames = parser.push(data);
|
|
77
138
|
for (const response of frames) {
|
|
78
|
-
|
|
79
|
-
if
|
|
139
|
+
const responsePayload = response.payload;
|
|
140
|
+
// Check if this is a response to our request (by id, replyTo, or correlationId for blocking sends)
|
|
141
|
+
const isMatchingResponse = response.id === id ||
|
|
142
|
+
responsePayload?.replyTo === id ||
|
|
143
|
+
(correlationId && responsePayload?.correlationId === correlationId);
|
|
144
|
+
if (isMatchingResponse) {
|
|
80
145
|
clearTimeout(timeoutId);
|
|
81
146
|
socket.end();
|
|
82
147
|
// Handle error responses
|
|
83
148
|
if (response.type === 'ERROR') {
|
|
84
|
-
|
|
85
|
-
reject(new Error(errorPayload?.message || errorPayload?.code || 'Unknown error'));
|
|
149
|
+
reject(new Error(responsePayload?.message || responsePayload?.code || 'Unknown error'));
|
|
86
150
|
}
|
|
87
|
-
else if (
|
|
88
|
-
reject(new Error(
|
|
151
|
+
else if (responsePayload?.error) {
|
|
152
|
+
reject(new Error(responsePayload.error));
|
|
89
153
|
}
|
|
90
154
|
else {
|
|
91
155
|
resolve(response.payload);
|
|
@@ -109,15 +173,40 @@ export function createRelayClient(options) {
|
|
|
109
173
|
}
|
|
110
174
|
return {
|
|
111
175
|
async send(to, message, opts = {}) {
|
|
112
|
-
|
|
176
|
+
// Fire-and-forget: daemon doesn't respond to non-blocking SEND
|
|
177
|
+
// from/to must be at envelope level, kind/body/thread in payload
|
|
178
|
+
await fireAndForget('SEND', { kind: 'message', body: message, thread: opts.thread }, { from: agentName, to });
|
|
113
179
|
},
|
|
114
180
|
async sendAndWait(to, message, opts = {}) {
|
|
115
|
-
|
|
116
|
-
|
|
181
|
+
// Use proper SEND with sync.blocking - daemon handles the wait and returns ACK
|
|
182
|
+
// from/to must be at envelope level, kind/body/thread in payload
|
|
183
|
+
const waitTimeout = opts.timeoutMs || 30000;
|
|
184
|
+
const correlationId = randomUUID();
|
|
185
|
+
const r = await request('SEND', {
|
|
186
|
+
kind: 'message',
|
|
187
|
+
body: message,
|
|
188
|
+
thread: opts.thread,
|
|
189
|
+
}, waitTimeout + 5000, {
|
|
190
|
+
sync: {
|
|
191
|
+
blocking: true,
|
|
192
|
+
correlationId,
|
|
193
|
+
timeoutMs: waitTimeout,
|
|
194
|
+
},
|
|
195
|
+
}, { from: agentName, to });
|
|
196
|
+
return { from: r.from ?? to, content: r.response ?? '', thread: opts.thread };
|
|
117
197
|
},
|
|
118
198
|
async spawn(opts) {
|
|
199
|
+
// Fire-and-forget: daemon handles spawning, agent will message when ready
|
|
119
200
|
try {
|
|
120
|
-
|
|
201
|
+
const payload = {
|
|
202
|
+
name: opts.name,
|
|
203
|
+
cli: opts.cli,
|
|
204
|
+
task: opts.task,
|
|
205
|
+
model: opts.model,
|
|
206
|
+
cwd: opts.cwd,
|
|
207
|
+
spawnerName: agentName, // Parent agent making the spawn request
|
|
208
|
+
};
|
|
209
|
+
await fireAndForget('SPAWN', payload);
|
|
121
210
|
return { success: true };
|
|
122
211
|
}
|
|
123
212
|
catch (e) {
|
|
@@ -126,7 +215,8 @@ export function createRelayClient(options) {
|
|
|
126
215
|
},
|
|
127
216
|
async release(name, reason) {
|
|
128
217
|
try {
|
|
129
|
-
|
|
218
|
+
const payload = { name, reason };
|
|
219
|
+
await request('RELEASE', payload, RELEASE_TIMEOUT);
|
|
130
220
|
return { success: true };
|
|
131
221
|
}
|
|
132
222
|
catch (e) {
|
|
@@ -143,11 +233,35 @@ export function createRelayClient(options) {
|
|
|
143
233
|
}
|
|
144
234
|
},
|
|
145
235
|
async getInbox(opts = {}) {
|
|
146
|
-
const
|
|
236
|
+
const payload = {
|
|
237
|
+
agent: agentName,
|
|
238
|
+
limit: opts.limit,
|
|
239
|
+
unreadOnly: opts.unread_only,
|
|
240
|
+
from: opts.from,
|
|
241
|
+
channel: opts.channel,
|
|
242
|
+
};
|
|
243
|
+
const response = await request('INBOX', payload);
|
|
244
|
+
const msgs = response.messages || [];
|
|
147
245
|
return msgs.map(m => ({ id: m.id, from: m.from, content: m.body, channel: m.channel, thread: m.thread }));
|
|
148
246
|
},
|
|
149
247
|
async listAgents(opts = {}) {
|
|
150
|
-
|
|
248
|
+
const payload = {
|
|
249
|
+
includeIdle: opts.include_idle,
|
|
250
|
+
project: opts.project,
|
|
251
|
+
};
|
|
252
|
+
const response = await request('LIST_AGENTS', payload);
|
|
253
|
+
return response.agents || [];
|
|
254
|
+
},
|
|
255
|
+
async getHealth(opts = {}) {
|
|
256
|
+
const payload = {
|
|
257
|
+
includeCrashes: opts.include_crashes,
|
|
258
|
+
includeAlerts: opts.include_alerts,
|
|
259
|
+
};
|
|
260
|
+
return request('HEALTH', payload);
|
|
261
|
+
},
|
|
262
|
+
async getMetrics(opts = {}) {
|
|
263
|
+
const payload = { agent: opts.agent };
|
|
264
|
+
return request('METRICS', payload);
|
|
151
265
|
},
|
|
152
266
|
};
|
|
153
267
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA+HpD,mBAAmB;AACnB,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B;;;GAGG;AACH,SAAS,WAAW,CAAC,QAAiC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,WAAW;IACP,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjC,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAmC,EAAE,CAAC;QAElD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC;YAEpC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW;gBAAE,MAAM;YAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAEhD,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACnE,iFAAiF;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,EAAE,EAAE,UAAU,IAAI,uBAAuB,CAAC;IAEjG,sBAAsB;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAExF,oCAAoC;IACpC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,oCAAoC;IAKnE;;;;;;OAMG;IACH,SAAS,aAAa,CAAC,IAAY,EAAE,OAAmB,EAAE,aAA+B;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,QAAQ,GAA4B;gBACxC,CAAC,EAAE,gBAAgB;gBACnB,IAAI;gBACJ,EAAE;gBACF,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,OAAO;aACR,CAAC;YACF,6DAA6D;YAC7D,IAAI,aAAa,EAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;YAC5D,IAAI,aAAa,EAAE,EAAE;gBAAE,QAAQ,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;YAEtD,MAAM,MAAM,GAAW,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAEpD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,KAAK,GAAI,GAA6B,CAAC,IAAI,CAAC;gBAClD,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACnD,MAAM,CAAC,IAAI,qBAAqB,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,UAAU,OAAO,CAAI,IAAY,EAAE,OAAmB,EAAE,aAAsB,EAAE,WAA2F,EAAE,aAA+B;QAC/M,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,aAAa,GAAG,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC;YACvD,mCAAmC;YACnC,MAAM,QAAQ,GAA4B;gBACxC,CAAC,EAAE,gBAAgB;gBACnB,IAAI;gBACJ,EAAE;gBACF,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,OAAO;aACR,CAAC;YACF,6DAA6D;YAC7D,IAAI,aAAa,EAAE,IAAI;gBAAE,QAAQ,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;YAC5D,IAAI,aAAa,EAAE,EAAE;gBAAE,QAAQ,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;YACtD,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,CAAC,YAAY,GAAG,WAAW,CAAC;YACtC,CAAC;YACD,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAEjC,MAAM,MAAM,GAAW,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAEpD,MAAM,gBAAgB,GAAG,aAAa,IAAI,OAAO,CAAC;YAClD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,gBAAgB,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAErB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEhE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,yCAAyC;gBACzC,IAAI,QAAQ;oBAAE,OAAO;gBAErB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;oBAC9B,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAwG,CAAC;oBAC1I,mGAAmG;oBACnG,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE;wBAC3C,eAAe,EAAE,OAAO,KAAK,EAAE;wBAC/B,CAAC,aAAa,IAAI,eAAe,EAAE,aAAa,KAAK,aAAa,CAAC,CAAC;oBAEtE,IAAI,kBAAkB,EAAE,CAAC;wBACvB,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxB,MAAM,CAAC,GAAG,EAAE,CAAC;wBACb,yBAAyB;wBACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,EAAE,OAAO,IAAI,eAAe,EAAE,IAAI,IAAI,eAAe,CAAC,CAAC,CAAC;wBAC1F,CAAC;6BAAM,IAAI,eAAe,EAAE,KAAK,EAAE,CAAC;4BAClC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC3C,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,QAAQ,CAAC,OAAY,CAAC,CAAC;wBACjC,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,6DAA6D;gBAC7D,MAAM,KAAK,GAAI,GAA6B,CAAC,IAAI,CAAC;gBAClD,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACnD,MAAM,CAAC,IAAI,qBAAqB,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE;YAC/B,+DAA+D;YAC/D,iEAAiE;YACjE,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE;YACtC,+EAA+E;YAC/E,iEAAiE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;YAC5C,MAAM,aAAa,GAAG,UAAU,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,MAAM,OAAO,CAA+D,MAAM,EAAE;gBAC5F,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,EAAE,WAAW,GAAG,IAAI,EAAE;gBACrB,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI;oBACd,aAAa;oBACb,SAAS,EAAE,WAAW;iBACvB;aACF,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,0EAA0E;YAC1E,IAAI,CAAC;gBACH,MAAM,OAAO,GAAiB;oBAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,WAAW,EAAE,SAAS,EAAG,wCAAwC;iBAClE,CAAC;gBACF,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACjD,MAAM,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;gBACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,KAAK,CAAC,SAAS;YACb,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,OAAO,CAAwC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC7E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAC,IAAI,CAAC,GAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACrJ,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;YAAC,CAAC;QAC1E,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE;YACtB,MAAM,OAAO,GAAiB;gBAC5B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAwH,OAAO,EAAE,OAAO,CAAC,CAAC;YACxK,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5G,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE;YACxB,MAAM,OAAO,GAAsB;gBACjC,WAAW,EAAE,IAAI,CAAC,YAAY;gBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAqF,aAAa,EAAE,OAAO,CAAC,CAAC;YAC3I,OAAO,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE;YACvB,MAAM,OAAO,GAAkB;gBAC7B,cAAc,EAAE,IAAI,CAAC,eAAe;gBACpC,aAAa,EAAE,IAAI,CAAC,cAAc;aACnC,CAAC;YACF,OAAO,OAAO,CAAiB,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE;YACxB,MAAM,OAAO,GAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YACtD,OAAO,OAAO,CAAkB,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,eAAe,iBAAiB,CAAC"}
|
package/dist/cloud.d.ts
CHANGED
|
@@ -105,4 +105,16 @@ export declare function getConnectionInfo(options?: CloudConnectionOptions): Clo
|
|
|
105
105
|
* Environment variable summary for debugging.
|
|
106
106
|
*/
|
|
107
107
|
export declare function getCloudEnvironmentSummary(): Record<string, string | undefined>;
|
|
108
|
+
/**
|
|
109
|
+
* Discover the agent name for the MCP server.
|
|
110
|
+
*
|
|
111
|
+
* Priority order:
|
|
112
|
+
* 1. RELAY_AGENT_NAME environment variable (explicit)
|
|
113
|
+
* 2. Identity file in .agent-relay directory (written by wrapper)
|
|
114
|
+
* 3. Scan outbox directories to find agent's outbox
|
|
115
|
+
*
|
|
116
|
+
* @param discovery - Optional discovery result with socket path info
|
|
117
|
+
* @returns Agent name or null if not found
|
|
118
|
+
*/
|
|
119
|
+
export declare function discoverAgentName(discovery?: DiscoveryResult | null): string | null;
|
|
108
120
|
//# sourceMappingURL=cloud.d.ts.map
|
package/dist/cloud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,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,CAiJ3F;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,
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,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,CAiJ3F;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,CAU/E;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAgHnF"}
|
package/dist/cloud.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Provides cloud workspace detection, remote daemon connection,
|
|
5
5
|
* and workspace-aware socket discovery for cloud deployments.
|
|
6
6
|
*/
|
|
7
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
10
|
import { findProjectRoot } from '@agent-relay/config';
|
|
@@ -306,6 +306,130 @@ export function getCloudEnvironmentSummary() {
|
|
|
306
306
|
WORKSPACE_OWNER_USER_ID: process.env.WORKSPACE_OWNER_USER_ID,
|
|
307
307
|
RELAY_SOCKET: process.env.RELAY_SOCKET,
|
|
308
308
|
RELAY_PROJECT: process.env.RELAY_PROJECT,
|
|
309
|
+
RELAY_AGENT_NAME: process.env.RELAY_AGENT_NAME,
|
|
309
310
|
};
|
|
310
311
|
}
|
|
312
|
+
// ============================================================================
|
|
313
|
+
// Agent Identity Discovery
|
|
314
|
+
// ============================================================================
|
|
315
|
+
/**
|
|
316
|
+
* Discover the agent name for the MCP server.
|
|
317
|
+
*
|
|
318
|
+
* Priority order:
|
|
319
|
+
* 1. RELAY_AGENT_NAME environment variable (explicit)
|
|
320
|
+
* 2. Identity file in .agent-relay directory (written by wrapper)
|
|
321
|
+
* 3. Scan outbox directories to find agent's outbox
|
|
322
|
+
*
|
|
323
|
+
* @param discovery - Optional discovery result with socket path info
|
|
324
|
+
* @returns Agent name or null if not found
|
|
325
|
+
*/
|
|
326
|
+
export function discoverAgentName(discovery) {
|
|
327
|
+
// 1. Explicit environment variable
|
|
328
|
+
const envName = process.env.RELAY_AGENT_NAME;
|
|
329
|
+
if (envName) {
|
|
330
|
+
return envName;
|
|
331
|
+
}
|
|
332
|
+
// 2. Identity file in .agent-relay directory
|
|
333
|
+
// The wrapper creates this file with the agent name
|
|
334
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
335
|
+
const searchDirs = [process.cwd()];
|
|
336
|
+
if (projectRoot && projectRoot !== process.cwd()) {
|
|
337
|
+
searchDirs.push(projectRoot);
|
|
338
|
+
}
|
|
339
|
+
for (const dir of searchDirs) {
|
|
340
|
+
const relayDir = join(dir, '.agent-relay');
|
|
341
|
+
if (!existsSync(relayDir))
|
|
342
|
+
continue;
|
|
343
|
+
// First check for per-process identity files
|
|
344
|
+
// The orchestrator writes mcp-identity-{orchestrator.pid}
|
|
345
|
+
// Try to find one by checking process.ppid and its ancestors
|
|
346
|
+
const pidIdentityPath = join(relayDir, `mcp-identity-${process.ppid}`);
|
|
347
|
+
if (existsSync(pidIdentityPath)) {
|
|
348
|
+
try {
|
|
349
|
+
const content = readFileSync(pidIdentityPath, 'utf-8').trim();
|
|
350
|
+
if (content) {
|
|
351
|
+
return content;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// Ignore read errors
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Scan all mcp-identity-* files and return the most recently modified one
|
|
359
|
+
// This handles the case where MCP server's ppid doesn't match the orchestrator
|
|
360
|
+
try {
|
|
361
|
+
const files = readdirSync(relayDir, { withFileTypes: true })
|
|
362
|
+
.filter((d) => d.isFile() && d.name.startsWith('mcp-identity-'))
|
|
363
|
+
.map((d) => ({
|
|
364
|
+
path: join(relayDir, d.name),
|
|
365
|
+
name: d.name,
|
|
366
|
+
}));
|
|
367
|
+
if (files.length > 0) {
|
|
368
|
+
// Sort by mtime (most recent first) to get the latest identity
|
|
369
|
+
const sorted = files
|
|
370
|
+
.map((f) => {
|
|
371
|
+
try {
|
|
372
|
+
const stat = statSync(f.path);
|
|
373
|
+
return { ...f, mtime: stat.mtimeMs };
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return { ...f, mtime: 0 };
|
|
377
|
+
}
|
|
378
|
+
})
|
|
379
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
380
|
+
// Return the most recently modified identity file
|
|
381
|
+
const latest = sorted[0];
|
|
382
|
+
if (latest) {
|
|
383
|
+
try {
|
|
384
|
+
const content = readFileSync(latest.path, 'utf-8').trim();
|
|
385
|
+
if (content) {
|
|
386
|
+
return content;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
// Ignore
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// Ignore scan errors
|
|
397
|
+
}
|
|
398
|
+
// Fallback to simple identity file (for single-agent scenarios)
|
|
399
|
+
const identityPath = join(relayDir, 'mcp-identity');
|
|
400
|
+
if (existsSync(identityPath)) {
|
|
401
|
+
try {
|
|
402
|
+
const content = readFileSync(identityPath, 'utf-8').trim();
|
|
403
|
+
if (content) {
|
|
404
|
+
return content;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
// Ignore read errors
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// 3. Check outbox directories for a match
|
|
413
|
+
// If only one agent's outbox exists, assume we're that agent
|
|
414
|
+
for (const dir of searchDirs) {
|
|
415
|
+
const outboxDir = join(dir, '.agent-relay', 'outbox');
|
|
416
|
+
if (existsSync(outboxDir)) {
|
|
417
|
+
try {
|
|
418
|
+
const agents = readdirSync(outboxDir, { withFileTypes: true })
|
|
419
|
+
.filter((d) => d.isDirectory())
|
|
420
|
+
.map((d) => d.name);
|
|
421
|
+
// If there's exactly one outbox, use that agent name
|
|
422
|
+
if (agents.length === 1) {
|
|
423
|
+
return agents[0];
|
|
424
|
+
}
|
|
425
|
+
// If there are multiple, we can't determine which one we are
|
|
426
|
+
// The wrapper should have created an identity file
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// Ignore read errors
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
311
435
|
//# sourceMappingURL=cloud.js.map
|