agent-relay 2.1.4 → 2.1.6
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 +85 -236
- package/dist/index.cjs +281 -24
- package/package.json +19 -19
- package/packages/api-types/package.json +1 -1
- package/packages/benchmark/package.json +4 -4
- package/packages/bridge/dist/spawner.d.ts.map +1 -1
- package/packages/bridge/dist/spawner.js +39 -5
- package/packages/bridge/dist/spawner.js.map +1 -1
- package/packages/bridge/package.json +8 -8
- package/packages/bridge/src/spawner.ts +40 -5
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/dist/server.d.ts +5 -0
- package/packages/daemon/dist/server.d.ts.map +1 -1
- package/packages/daemon/dist/server.js +31 -0
- package/packages/daemon/dist/server.js.map +1 -1
- package/packages/daemon/package.json +12 -12
- package/packages/daemon/src/server.ts +37 -0
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/dist/cloud.d.ts +7 -114
- package/packages/mcp/dist/cloud.d.ts.map +1 -1
- package/packages/mcp/dist/cloud.js +21 -431
- package/packages/mcp/dist/cloud.js.map +1 -1
- package/packages/mcp/dist/errors.d.ts +4 -22
- package/packages/mcp/dist/errors.d.ts.map +1 -1
- package/packages/mcp/dist/errors.js +4 -43
- package/packages/mcp/dist/errors.js.map +1 -1
- package/packages/mcp/dist/hybrid-client.d.ts.map +1 -1
- package/packages/mcp/dist/hybrid-client.js +7 -1
- package/packages/mcp/dist/hybrid-client.js.map +1 -1
- package/packages/mcp/package.json +4 -3
- package/packages/mcp/src/cloud.ts +29 -511
- package/packages/mcp/src/errors.ts +12 -49
- package/packages/mcp/src/hybrid-client.ts +8 -1
- package/packages/mcp/tests/discover.test.ts +72 -11
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/dist/types.d.ts +17 -1
- package/packages/protocol/dist/types.d.ts.map +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/src/types.ts +23 -0
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/browser-client.d.ts +212 -0
- package/packages/sdk/dist/browser-client.d.ts.map +1 -0
- package/packages/sdk/dist/browser-client.js +750 -0
- package/packages/sdk/dist/browser-client.js.map +1 -0
- package/packages/sdk/dist/browser-framing.d.ts +46 -0
- package/packages/sdk/dist/browser-framing.d.ts.map +1 -0
- package/packages/sdk/dist/browser-framing.js +122 -0
- package/packages/sdk/dist/browser-framing.js.map +1 -0
- package/packages/sdk/dist/client.d.ts +129 -2
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +312 -2
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/discovery.d.ts +10 -0
- package/packages/sdk/dist/discovery.d.ts.map +1 -0
- package/packages/sdk/dist/discovery.js +22 -0
- package/packages/sdk/dist/discovery.js.map +1 -0
- package/packages/sdk/dist/errors.d.ts +9 -0
- package/packages/sdk/dist/errors.d.ts.map +1 -0
- package/packages/sdk/dist/errors.js +9 -0
- package/packages/sdk/dist/errors.js.map +1 -0
- package/packages/sdk/dist/index.d.ts +18 -2
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +27 -1
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/dist/transports/index.d.ts +92 -0
- package/packages/sdk/dist/transports/index.d.ts.map +1 -0
- package/packages/sdk/dist/transports/index.js +129 -0
- package/packages/sdk/dist/transports/index.js.map +1 -0
- package/packages/sdk/dist/transports/socket-transport.d.ts +30 -0
- package/packages/sdk/dist/transports/socket-transport.d.ts.map +1 -0
- package/packages/sdk/dist/transports/socket-transport.js +94 -0
- package/packages/sdk/dist/transports/socket-transport.js.map +1 -0
- package/packages/sdk/dist/transports/types.d.ts +69 -0
- package/packages/sdk/dist/transports/types.d.ts.map +1 -0
- package/packages/sdk/dist/transports/types.js +10 -0
- package/packages/sdk/dist/transports/types.js.map +1 -0
- package/packages/sdk/dist/transports/websocket-transport.d.ts +55 -0
- package/packages/sdk/dist/transports/websocket-transport.d.ts.map +1 -0
- package/packages/sdk/dist/transports/websocket-transport.js +180 -0
- package/packages/sdk/dist/transports/websocket-transport.js.map +1 -0
- package/packages/sdk/package.json +28 -4
- package/packages/sdk/src/browser-client.ts +985 -0
- package/packages/sdk/src/browser-framing.test.ts +115 -0
- package/packages/sdk/src/browser-framing.ts +150 -0
- package/packages/sdk/src/client.test.ts +425 -0
- package/packages/sdk/src/client.ts +397 -3
- package/packages/sdk/src/discovery.ts +38 -0
- package/packages/sdk/src/errors.ts +17 -0
- package/packages/sdk/src/index.ts +82 -1
- package/packages/sdk/src/transports/index.ts +197 -0
- package/packages/sdk/src/transports/socket-transport.ts +115 -0
- package/packages/sdk/src/transports/types.ts +77 -0
- package/packages/sdk/src/transports/websocket-transport.ts +245 -0
- package/packages/sdk/tsconfig.json +1 -1
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/storage/src/jsonl-adapter.test.ts +8 -3
- 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/dist/cjs/discovery.js +328 -0
- package/packages/utils/dist/cjs/errors.js +81 -0
- package/packages/utils/dist/discovery.d.ts +123 -0
- package/packages/utils/dist/discovery.d.ts.map +1 -0
- package/packages/utils/dist/discovery.js +439 -0
- package/packages/utils/dist/discovery.js.map +1 -0
- package/packages/utils/dist/errors.d.ts +29 -0
- package/packages/utils/dist/errors.d.ts.map +1 -0
- package/packages/utils/dist/errors.js +50 -0
- package/packages/utils/dist/errors.js.map +1 -0
- package/packages/utils/package.json +15 -2
- package/packages/utils/src/consolidation.test.ts +125 -0
- package/packages/utils/src/discovery.test.ts +196 -0
- package/packages/utils/src/discovery.ts +524 -0
- package/packages/utils/src/errors.test.ts +83 -0
- package/packages/utils/src/errors.ts +56 -0
- package/packages/wrapper/dist/opencode-wrapper.d.ts +6 -2
- package/packages/wrapper/dist/opencode-wrapper.d.ts.map +1 -1
- package/packages/wrapper/dist/opencode-wrapper.js +34 -10
- package/packages/wrapper/dist/opencode-wrapper.js.map +1 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +22 -2
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.js +174 -4
- package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -1
- package/packages/wrapper/package.json +6 -6
- package/packages/wrapper/src/opencode-wrapper.ts +37 -9
- package/packages/wrapper/src/relay-pty-orchestrator.ts +197 -4
- package/relay-snippets/agent-relay-snippet.md +17 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/trajectory",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "Trajectory integration utilities (trail/PDERO) for Relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"test:watch": "vitest"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agent-relay/config": "2.1.
|
|
25
|
+
"@agent-relay/config": "2.1.6"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/user-directory",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "User directory service for agent-relay (per-user credential storage)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"test:watch": "vitest"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agent-relay/resiliency": "2.1.
|
|
25
|
+
"@agent-relay/resiliency": "2.1.6"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var discovery_exports = {};
|
|
20
|
+
__export(discovery_exports, {
|
|
21
|
+
cloudApiRequest: () => cloudApiRequest,
|
|
22
|
+
detectCloudWorkspace: () => detectCloudWorkspace,
|
|
23
|
+
discoverAgentName: () => discoverAgentName,
|
|
24
|
+
discoverSocket: () => discoverSocket,
|
|
25
|
+
getCloudEnvironmentSummary: () => getCloudEnvironmentSummary,
|
|
26
|
+
getCloudOutboxPath: () => getCloudOutboxPath,
|
|
27
|
+
getCloudSocketPath: () => getCloudSocketPath,
|
|
28
|
+
getConnectionInfo: () => getConnectionInfo,
|
|
29
|
+
getWorkspaceStatus: () => getWorkspaceStatus,
|
|
30
|
+
isCloudWorkspace: () => isCloudWorkspace
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(discovery_exports);
|
|
33
|
+
var import_node_fs = require("node:fs");
|
|
34
|
+
var import_node_path = require("node:path");
|
|
35
|
+
var import_node_os = require("node:os");
|
|
36
|
+
var import_config = require("@agent-relay/config");
|
|
37
|
+
function detectCloudWorkspace() {
|
|
38
|
+
const workspaceId = process.env.WORKSPACE_ID;
|
|
39
|
+
const cloudApiUrl = process.env.CLOUD_API_URL;
|
|
40
|
+
if (!workspaceId || !cloudApiUrl) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
workspaceId,
|
|
45
|
+
cloudApiUrl,
|
|
46
|
+
workspaceToken: process.env.WORKSPACE_TOKEN,
|
|
47
|
+
ownerUserId: process.env.WORKSPACE_OWNER_USER_ID
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function isCloudWorkspace() {
|
|
51
|
+
return detectCloudWorkspace() !== null;
|
|
52
|
+
}
|
|
53
|
+
function getCloudSocketPath(workspaceId) {
|
|
54
|
+
return `/tmp/relay/${workspaceId}/sockets/daemon.sock`;
|
|
55
|
+
}
|
|
56
|
+
function getCloudOutboxPath(workspaceId, agentName) {
|
|
57
|
+
return `/tmp/relay/${workspaceId}/outbox/${agentName}`;
|
|
58
|
+
}
|
|
59
|
+
function getDataDir() {
|
|
60
|
+
const platform = process.platform;
|
|
61
|
+
if (platform === "darwin") {
|
|
62
|
+
return (0, import_node_path.join)((0, import_node_os.homedir)(), "Library", "Application Support", "agent-relay");
|
|
63
|
+
} else if (platform === "win32") {
|
|
64
|
+
return (0, import_node_path.join)(process.env.APPDATA || (0, import_node_os.homedir)(), "agent-relay");
|
|
65
|
+
} else {
|
|
66
|
+
return (0, import_node_path.join)(
|
|
67
|
+
process.env.XDG_DATA_HOME || (0, import_node_path.join)((0, import_node_os.homedir)(), ".local", "share"),
|
|
68
|
+
"agent-relay"
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function discoverSocket(options = {}) {
|
|
73
|
+
if (options.socketPath) {
|
|
74
|
+
const workspace2 = options.workspace ? {
|
|
75
|
+
workspaceId: options.workspace.workspaceId || "override",
|
|
76
|
+
cloudApiUrl: options.workspace.cloudApiUrl || ""
|
|
77
|
+
} : void 0;
|
|
78
|
+
return {
|
|
79
|
+
socketPath: options.socketPath,
|
|
80
|
+
project: workspace2?.workspaceId || "override",
|
|
81
|
+
source: "env",
|
|
82
|
+
isCloud: !!workspace2,
|
|
83
|
+
workspace: workspace2
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const socketEnv = process.env.RELAY_SOCKET;
|
|
87
|
+
if (socketEnv) {
|
|
88
|
+
const workspace2 = detectCloudWorkspace();
|
|
89
|
+
return {
|
|
90
|
+
socketPath: socketEnv,
|
|
91
|
+
project: process.env.RELAY_PROJECT || workspace2?.workspaceId || "unknown",
|
|
92
|
+
source: "env",
|
|
93
|
+
isCloud: !!workspace2,
|
|
94
|
+
workspace: workspace2 || void 0
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const workspace = detectCloudWorkspace();
|
|
98
|
+
if (workspace) {
|
|
99
|
+
const cloudSocket = getCloudSocketPath(workspace.workspaceId);
|
|
100
|
+
return {
|
|
101
|
+
socketPath: cloudSocket,
|
|
102
|
+
project: workspace.workspaceId,
|
|
103
|
+
source: "cloud",
|
|
104
|
+
isCloud: true,
|
|
105
|
+
workspace
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const projectEnv = process.env.RELAY_PROJECT;
|
|
109
|
+
if (projectEnv) {
|
|
110
|
+
const dataDir2 = getDataDir();
|
|
111
|
+
const projectSocket = (0, import_node_path.join)(dataDir2, "projects", projectEnv, "daemon.sock");
|
|
112
|
+
return {
|
|
113
|
+
socketPath: projectSocket,
|
|
114
|
+
project: projectEnv,
|
|
115
|
+
source: "env",
|
|
116
|
+
isCloud: false
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const projectRoot = (0, import_config.findProjectRoot)(process.cwd());
|
|
120
|
+
const searchDirs = [process.cwd()];
|
|
121
|
+
if (projectRoot && projectRoot !== process.cwd()) {
|
|
122
|
+
searchDirs.push(projectRoot);
|
|
123
|
+
}
|
|
124
|
+
for (const dir of searchDirs) {
|
|
125
|
+
const projectLocalSocket = (0, import_node_path.join)(dir, ".agent-relay", "relay.sock");
|
|
126
|
+
if ((0, import_node_fs.existsSync)(projectLocalSocket)) {
|
|
127
|
+
let projectId = "local";
|
|
128
|
+
const markerPath = (0, import_node_path.join)(dir, ".agent-relay", ".project");
|
|
129
|
+
if ((0, import_node_fs.existsSync)(markerPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const marker = JSON.parse((0, import_node_fs.readFileSync)(markerPath, "utf-8"));
|
|
132
|
+
projectId = marker.projectId || "local";
|
|
133
|
+
} catch {
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
socketPath: projectLocalSocket,
|
|
138
|
+
project: projectId,
|
|
139
|
+
source: "cwd",
|
|
140
|
+
isCloud: false
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const cwdConfig = (0, import_node_path.join)(process.cwd(), ".relay", "config.json");
|
|
145
|
+
if ((0, import_node_fs.existsSync)(cwdConfig)) {
|
|
146
|
+
try {
|
|
147
|
+
const config = JSON.parse((0, import_node_fs.readFileSync)(cwdConfig, "utf-8"));
|
|
148
|
+
if (config.socketPath) {
|
|
149
|
+
return {
|
|
150
|
+
socketPath: config.socketPath,
|
|
151
|
+
project: config.project || "local",
|
|
152
|
+
source: "cwd",
|
|
153
|
+
isCloud: false
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
} catch (err) {
|
|
157
|
+
if (process.env.DEBUG || process.env.RELAY_DEBUG) {
|
|
158
|
+
console.debug("[discovery] Failed to read cwd config:", cwdConfig, err);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const dataDir = getDataDir();
|
|
163
|
+
const projectsDir = (0, import_node_path.join)(dataDir, "projects");
|
|
164
|
+
if ((0, import_node_fs.existsSync)(projectsDir)) {
|
|
165
|
+
try {
|
|
166
|
+
const projects = (0, import_node_fs.readdirSync)(projectsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
167
|
+
for (const project of projects) {
|
|
168
|
+
const socketPath = (0, import_node_path.join)(projectsDir, project, "daemon.sock");
|
|
169
|
+
if ((0, import_node_fs.existsSync)(socketPath)) {
|
|
170
|
+
return {
|
|
171
|
+
socketPath,
|
|
172
|
+
project,
|
|
173
|
+
source: "scan",
|
|
174
|
+
isCloud: false
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
} catch (err) {
|
|
179
|
+
if (process.env.DEBUG || process.env.RELAY_DEBUG) {
|
|
180
|
+
console.debug("[discovery] Failed to scan projects directory:", projectsDir, err);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
async function cloudApiRequest(workspace, path, options = {}) {
|
|
187
|
+
const url = `${workspace.cloudApiUrl}${path}`;
|
|
188
|
+
const headers = {
|
|
189
|
+
"Content-Type": "application/json",
|
|
190
|
+
...options.headers
|
|
191
|
+
};
|
|
192
|
+
if (workspace.workspaceToken) {
|
|
193
|
+
headers["Authorization"] = `Bearer ${workspace.workspaceToken}`;
|
|
194
|
+
}
|
|
195
|
+
return fetch(url, {
|
|
196
|
+
...options,
|
|
197
|
+
headers
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async function getWorkspaceStatus(workspace) {
|
|
201
|
+
try {
|
|
202
|
+
const response = await cloudApiRequest(
|
|
203
|
+
workspace,
|
|
204
|
+
`/api/workspaces/${workspace.workspaceId}/status`
|
|
205
|
+
);
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return await response.json();
|
|
210
|
+
} catch {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function getConnectionInfo(options = {}) {
|
|
215
|
+
const discovery = discoverSocket(options);
|
|
216
|
+
if (!discovery) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const info = {
|
|
220
|
+
socketPath: discovery.socketPath,
|
|
221
|
+
project: discovery.project,
|
|
222
|
+
isCloud: discovery.isCloud,
|
|
223
|
+
workspace: discovery.workspace
|
|
224
|
+
};
|
|
225
|
+
if (discovery.workspace?.cloudApiUrl) {
|
|
226
|
+
info.daemonUrl = discovery.workspace.cloudApiUrl;
|
|
227
|
+
}
|
|
228
|
+
return info;
|
|
229
|
+
}
|
|
230
|
+
function getCloudEnvironmentSummary() {
|
|
231
|
+
return {
|
|
232
|
+
WORKSPACE_ID: process.env.WORKSPACE_ID,
|
|
233
|
+
CLOUD_API_URL: process.env.CLOUD_API_URL,
|
|
234
|
+
WORKSPACE_TOKEN: process.env.WORKSPACE_TOKEN ? "[set]" : void 0,
|
|
235
|
+
WORKSPACE_OWNER_USER_ID: process.env.WORKSPACE_OWNER_USER_ID,
|
|
236
|
+
RELAY_SOCKET: process.env.RELAY_SOCKET,
|
|
237
|
+
RELAY_PROJECT: process.env.RELAY_PROJECT,
|
|
238
|
+
RELAY_AGENT_NAME: process.env.RELAY_AGENT_NAME
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function discoverAgentName(_discovery) {
|
|
242
|
+
const envName = process.env.RELAY_AGENT_NAME;
|
|
243
|
+
if (envName) {
|
|
244
|
+
return envName;
|
|
245
|
+
}
|
|
246
|
+
const projectRoot = (0, import_config.findProjectRoot)(process.cwd());
|
|
247
|
+
const searchDirs = [process.cwd()];
|
|
248
|
+
if (projectRoot && projectRoot !== process.cwd()) {
|
|
249
|
+
searchDirs.push(projectRoot);
|
|
250
|
+
}
|
|
251
|
+
for (const dir of searchDirs) {
|
|
252
|
+
const relayDir = (0, import_node_path.join)(dir, ".agent-relay");
|
|
253
|
+
if (!(0, import_node_fs.existsSync)(relayDir)) continue;
|
|
254
|
+
const pidIdentityPath = (0, import_node_path.join)(relayDir, `mcp-identity-${process.ppid}`);
|
|
255
|
+
if ((0, import_node_fs.existsSync)(pidIdentityPath)) {
|
|
256
|
+
try {
|
|
257
|
+
const content = (0, import_node_fs.readFileSync)(pidIdentityPath, "utf-8").trim();
|
|
258
|
+
if (content) {
|
|
259
|
+
return content;
|
|
260
|
+
}
|
|
261
|
+
} catch {
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
const files = (0, import_node_fs.readdirSync)(relayDir, { withFileTypes: true }).filter((d) => d.isFile() && d.name.startsWith("mcp-identity-")).map((d) => ({
|
|
266
|
+
path: (0, import_node_path.join)(relayDir, d.name),
|
|
267
|
+
name: d.name
|
|
268
|
+
}));
|
|
269
|
+
if (files.length > 0) {
|
|
270
|
+
const sorted = files.map((f) => {
|
|
271
|
+
try {
|
|
272
|
+
const stat = (0, import_node_fs.statSync)(f.path);
|
|
273
|
+
return { ...f, mtime: stat.mtimeMs };
|
|
274
|
+
} catch {
|
|
275
|
+
return { ...f, mtime: 0 };
|
|
276
|
+
}
|
|
277
|
+
}).sort((a, b) => b.mtime - a.mtime);
|
|
278
|
+
const latest = sorted[0];
|
|
279
|
+
if (latest) {
|
|
280
|
+
try {
|
|
281
|
+
const content = (0, import_node_fs.readFileSync)(latest.path, "utf-8").trim();
|
|
282
|
+
if (content) {
|
|
283
|
+
return content;
|
|
284
|
+
}
|
|
285
|
+
} catch {
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
} catch {
|
|
290
|
+
}
|
|
291
|
+
const identityPath = (0, import_node_path.join)(relayDir, "mcp-identity");
|
|
292
|
+
if ((0, import_node_fs.existsSync)(identityPath)) {
|
|
293
|
+
try {
|
|
294
|
+
const content = (0, import_node_fs.readFileSync)(identityPath, "utf-8").trim();
|
|
295
|
+
if (content) {
|
|
296
|
+
return content;
|
|
297
|
+
}
|
|
298
|
+
} catch {
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
for (const dir of searchDirs) {
|
|
303
|
+
const outboxDir = (0, import_node_path.join)(dir, ".agent-relay", "outbox");
|
|
304
|
+
if ((0, import_node_fs.existsSync)(outboxDir)) {
|
|
305
|
+
try {
|
|
306
|
+
const agents = (0, import_node_fs.readdirSync)(outboxDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
307
|
+
if (agents.length === 1) {
|
|
308
|
+
return agents[0];
|
|
309
|
+
}
|
|
310
|
+
} catch {
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
317
|
+
0 && (module.exports = {
|
|
318
|
+
cloudApiRequest,
|
|
319
|
+
detectCloudWorkspace,
|
|
320
|
+
discoverAgentName,
|
|
321
|
+
discoverSocket,
|
|
322
|
+
getCloudEnvironmentSummary,
|
|
323
|
+
getCloudOutboxPath,
|
|
324
|
+
getCloudSocketPath,
|
|
325
|
+
getConnectionInfo,
|
|
326
|
+
getWorkspaceStatus,
|
|
327
|
+
isCloudWorkspace
|
|
328
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var errors_exports = {};
|
|
20
|
+
__export(errors_exports, {
|
|
21
|
+
AgentNotFoundError: () => AgentNotFoundError,
|
|
22
|
+
ChannelNotFoundError: () => ChannelNotFoundError,
|
|
23
|
+
ConnectionError: () => ConnectionError,
|
|
24
|
+
DaemonNotRunningError: () => DaemonNotRunningError,
|
|
25
|
+
RelayError: () => RelayError,
|
|
26
|
+
SpawnError: () => SpawnError,
|
|
27
|
+
TimeoutError: () => TimeoutError
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(errors_exports);
|
|
30
|
+
class RelayError extends Error {
|
|
31
|
+
constructor(message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "RelayError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class DaemonNotRunningError extends RelayError {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message || "Relay daemon is not running. Start with: agent-relay up");
|
|
39
|
+
this.name = "DaemonNotRunningError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
class AgentNotFoundError extends RelayError {
|
|
43
|
+
constructor(agentName) {
|
|
44
|
+
super(`Agent not found: ${agentName}`);
|
|
45
|
+
this.name = "AgentNotFoundError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class TimeoutError extends RelayError {
|
|
49
|
+
constructor(operation, timeoutMs) {
|
|
50
|
+
super(`Timeout after ${timeoutMs}ms: ${operation}`);
|
|
51
|
+
this.name = "TimeoutError";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
class ConnectionError extends RelayError {
|
|
55
|
+
constructor(message) {
|
|
56
|
+
super(`Connection error: ${message}`);
|
|
57
|
+
this.name = "ConnectionError";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
class ChannelNotFoundError extends RelayError {
|
|
61
|
+
constructor(channel) {
|
|
62
|
+
super(`Channel not found: ${channel}`);
|
|
63
|
+
this.name = "ChannelNotFoundError";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
class SpawnError extends RelayError {
|
|
67
|
+
constructor(workerName, reason) {
|
|
68
|
+
super(`Failed to spawn worker "${workerName}": ${reason}`);
|
|
69
|
+
this.name = "SpawnError";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
AgentNotFoundError,
|
|
75
|
+
ChannelNotFoundError,
|
|
76
|
+
ConnectionError,
|
|
77
|
+
DaemonNotRunningError,
|
|
78
|
+
RelayError,
|
|
79
|
+
SpawnError,
|
|
80
|
+
TimeoutError
|
|
81
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Socket Discovery & Cloud Workspace Detection
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for discovering relay daemon sockets,
|
|
5
|
+
* cloud workspace environments, and agent identity.
|
|
6
|
+
*
|
|
7
|
+
* Previously duplicated in @agent-relay/mcp (cloud.ts). Now consolidated
|
|
8
|
+
* here in the SDK so both SDK and MCP use the same discovery logic.
|
|
9
|
+
*/
|
|
10
|
+
export interface CloudWorkspace {
|
|
11
|
+
workspaceId: string;
|
|
12
|
+
cloudApiUrl: string;
|
|
13
|
+
workspaceToken?: string;
|
|
14
|
+
ownerUserId?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DiscoveryResult {
|
|
17
|
+
socketPath: string;
|
|
18
|
+
project: string;
|
|
19
|
+
source: 'env' | 'cloud' | 'cwd' | 'scan';
|
|
20
|
+
isCloud: boolean;
|
|
21
|
+
workspace?: CloudWorkspace;
|
|
22
|
+
}
|
|
23
|
+
export interface CloudConnectionOptions {
|
|
24
|
+
/** Override socket path (for testing) */
|
|
25
|
+
socketPath?: string;
|
|
26
|
+
/** Override workspace detection */
|
|
27
|
+
workspace?: Partial<CloudWorkspace>;
|
|
28
|
+
}
|
|
29
|
+
export interface CloudConnectionInfo {
|
|
30
|
+
socketPath: string;
|
|
31
|
+
project: string;
|
|
32
|
+
isCloud: boolean;
|
|
33
|
+
workspace?: CloudWorkspace;
|
|
34
|
+
daemonUrl?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detect if running in a cloud workspace environment.
|
|
38
|
+
*
|
|
39
|
+
* Cloud workspaces set these environment variables:
|
|
40
|
+
* - WORKSPACE_ID: The unique workspace identifier
|
|
41
|
+
* - CLOUD_API_URL: The cloud API endpoint
|
|
42
|
+
* - WORKSPACE_TOKEN: Bearer token for API auth (optional)
|
|
43
|
+
* - WORKSPACE_OWNER_USER_ID: The workspace owner's user ID (optional)
|
|
44
|
+
*/
|
|
45
|
+
export declare function detectCloudWorkspace(): CloudWorkspace | null;
|
|
46
|
+
/**
|
|
47
|
+
* Check if we're running in a cloud workspace.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isCloudWorkspace(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get the workspace-namespaced socket path.
|
|
52
|
+
*
|
|
53
|
+
* In cloud workspaces, sockets are stored at:
|
|
54
|
+
* /tmp/relay/{WORKSPACE_ID}/sockets/daemon.sock
|
|
55
|
+
*
|
|
56
|
+
* This provides multi-tenant isolation on shared infrastructure.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getCloudSocketPath(workspaceId: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Get the workspace-namespaced outbox path.
|
|
61
|
+
*
|
|
62
|
+
* In cloud workspaces, outbox directories are at:
|
|
63
|
+
* /tmp/relay/{WORKSPACE_ID}/outbox/{agentName}/
|
|
64
|
+
*/
|
|
65
|
+
export declare function getCloudOutboxPath(workspaceId: string, agentName: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Discover relay daemon socket with cloud-awareness.
|
|
68
|
+
*
|
|
69
|
+
* Priority order:
|
|
70
|
+
* 1. RELAY_SOCKET environment variable (explicit path)
|
|
71
|
+
* 2. Cloud workspace socket (if WORKSPACE_ID is set)
|
|
72
|
+
* 3. RELAY_PROJECT environment variable (project name -> data dir)
|
|
73
|
+
* 4. Current working directory .relay/config.json
|
|
74
|
+
* 5. Scan data directory for active sockets
|
|
75
|
+
*
|
|
76
|
+
* @param options - Optional configuration overrides
|
|
77
|
+
* @returns Discovery result with socket path, project info, and cloud status
|
|
78
|
+
*/
|
|
79
|
+
export declare function discoverSocket(options?: CloudConnectionOptions): DiscoveryResult | null;
|
|
80
|
+
/**
|
|
81
|
+
* Make an authenticated request to the cloud API.
|
|
82
|
+
*
|
|
83
|
+
* @param workspace - Cloud workspace configuration
|
|
84
|
+
* @param path - API path (e.g., '/api/status')
|
|
85
|
+
* @param options - Fetch options
|
|
86
|
+
* @returns Response from the API
|
|
87
|
+
*/
|
|
88
|
+
export declare function cloudApiRequest(workspace: CloudWorkspace, path: string, options?: RequestInit): Promise<Response>;
|
|
89
|
+
/**
|
|
90
|
+
* Get the workspace status from the cloud API.
|
|
91
|
+
*/
|
|
92
|
+
export declare function getWorkspaceStatus(workspace: CloudWorkspace): Promise<{
|
|
93
|
+
status: string;
|
|
94
|
+
agents?: string[];
|
|
95
|
+
} | null>;
|
|
96
|
+
/**
|
|
97
|
+
* Get connection info for the relay daemon.
|
|
98
|
+
*
|
|
99
|
+
* This function determines the best way to connect to the daemon:
|
|
100
|
+
* - In cloud environments: Uses workspace-namespaced socket
|
|
101
|
+
* - In local environments: Uses standard socket discovery
|
|
102
|
+
*
|
|
103
|
+
* @param options - Optional configuration overrides
|
|
104
|
+
* @returns Connection info or null if daemon not found
|
|
105
|
+
*/
|
|
106
|
+
export declare function getConnectionInfo(options?: CloudConnectionOptions): CloudConnectionInfo | null;
|
|
107
|
+
/**
|
|
108
|
+
* Environment variable summary for debugging.
|
|
109
|
+
*/
|
|
110
|
+
export declare function getCloudEnvironmentSummary(): Record<string, string | undefined>;
|
|
111
|
+
/**
|
|
112
|
+
* Discover the agent name for the MCP server.
|
|
113
|
+
*
|
|
114
|
+
* Priority order:
|
|
115
|
+
* 1. RELAY_AGENT_NAME environment variable (explicit)
|
|
116
|
+
* 2. Identity file in .agent-relay directory (written by wrapper)
|
|
117
|
+
* 3. Scan outbox directories to find agent's outbox
|
|
118
|
+
*
|
|
119
|
+
* @param _discovery - Optional discovery result (reserved for future use)
|
|
120
|
+
* @returns Agent name or null if not found
|
|
121
|
+
*/
|
|
122
|
+
export declare function discoverAgentName(_discovery?: DiscoveryResult | null): string | null;
|
|
123
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;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;AAED,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;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,CA+I3F;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;;;;;;;;;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,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAgHpF"}
|