agent-relay 3.1.2 → 3.1.4
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/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
- package/dist/src/cli/commands/agent-management.js +14 -1
- package/dist/src/cli/commands/agent-management.js.map +1 -1
- package/package.json +8 -8
- package/packages/acp-bridge/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/memory/package.json +2 -2
- package/packages/openclaw/README.md +1 -1
- package/packages/openclaw/dist/__tests__/gateway-control.test.js +1 -1
- package/packages/openclaw/dist/__tests__/gateway-control.test.js.map +1 -1
- package/packages/openclaw/dist/__tests__/gateway-threads.test.js +1 -18
- package/packages/openclaw/dist/__tests__/gateway-threads.test.js.map +1 -1
- package/packages/openclaw/dist/__tests__/ws-client.test.js +1 -1
- package/packages/openclaw/dist/__tests__/ws-client.test.js.map +1 -1
- package/packages/openclaw/dist/cli.js +9 -0
- package/packages/openclaw/dist/cli.js.map +1 -1
- package/packages/openclaw/dist/gateway.d.ts.map +1 -1
- package/packages/openclaw/dist/gateway.js +3 -7
- package/packages/openclaw/dist/gateway.js.map +1 -1
- package/packages/openclaw/dist/setup.d.ts.map +1 -1
- package/packages/openclaw/dist/setup.js +85 -63
- package/packages/openclaw/dist/setup.js.map +1 -1
- package/packages/openclaw/package.json +2 -2
- package/packages/openclaw/skill/SKILL.md +73 -12
- package/packages/openclaw/src/__tests__/SPEC-ws-client-testing.md +2 -2
- package/packages/openclaw/src/__tests__/gateway-control.test.ts +1 -1
- package/packages/openclaw/src/__tests__/gateway-threads.test.ts +1 -22
- package/packages/openclaw/src/__tests__/ws-client.test.ts +1 -1
- package/packages/openclaw/src/cli.ts +10 -0
- package/packages/openclaw/src/gateway.ts +3 -7
- package/packages/openclaw/src/setup.ts +90 -67
- package/packages/policy/package.json +2 -2
- package/packages/sdk/package.json +2 -2
- package/packages/sdk-py/pyproject.toml +1 -1
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
|
@@ -16,7 +16,7 @@ vi.mock('../spawn/manager.js', () => ({
|
|
|
16
16
|
|
|
17
17
|
vi.mock('@relaycast/sdk', () => ({
|
|
18
18
|
RelayCast: vi.fn().mockImplementation(() => ({
|
|
19
|
-
agents: { registerOrGet: vi.fn().mockResolvedValue({ name: '
|
|
19
|
+
agents: { registerOrGet: vi.fn().mockResolvedValue({ name: 'test', token: 'tok' }) },
|
|
20
20
|
as: vi.fn().mockReturnValue({
|
|
21
21
|
connect: vi.fn(),
|
|
22
22
|
disconnect: vi.fn().mockResolvedValue(undefined),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { setup } from './setup.js';
|
|
2
3
|
import { loadGatewayConfig } from './config.js';
|
|
3
4
|
import { InboundGateway } from './gateway.js';
|
|
@@ -5,6 +6,9 @@ import { listOpenClaws, releaseOpenClaw, spawnOpenClaw } from './control.js';
|
|
|
5
6
|
import { startMcpServer } from './mcp/server.js';
|
|
6
7
|
import { runtimeSetup } from './runtime/setup.js';
|
|
7
8
|
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
10
|
+
const { version } = require('../package.json') as { version: string };
|
|
11
|
+
|
|
8
12
|
function printUsage(): void {
|
|
9
13
|
console.log(`
|
|
10
14
|
relay-openclaw — Relaycast bridge for OpenClaw
|
|
@@ -19,6 +23,7 @@ Usage:
|
|
|
19
23
|
relay-openclaw mcp-server Start MCP server (spawn/list/release tools)
|
|
20
24
|
relay-openclaw runtime-setup Run container runtime setup (auth, config, identity, patching)
|
|
21
25
|
relay-openclaw help Show this help
|
|
26
|
+
relay-openclaw --version Show version
|
|
22
27
|
|
|
23
28
|
Setup options:
|
|
24
29
|
--name <name> Claw name (default: hostname)
|
|
@@ -251,6 +256,11 @@ async function main(): Promise<void> {
|
|
|
251
256
|
case 'runtime-setup':
|
|
252
257
|
await runRuntimeSetup(flags);
|
|
253
258
|
break;
|
|
259
|
+
case 'version':
|
|
260
|
+
case '--version':
|
|
261
|
+
case '-v':
|
|
262
|
+
console.log(version);
|
|
263
|
+
break;
|
|
254
264
|
case 'help':
|
|
255
265
|
case '--help':
|
|
256
266
|
case '-h':
|
|
@@ -489,11 +489,8 @@ export class InboundGateway {
|
|
|
489
489
|
console.warn('[gateway] No OPENCLAW_GATEWAY_TOKEN — local delivery disabled');
|
|
490
490
|
}
|
|
491
491
|
|
|
492
|
-
// Register with a viewer- prefixed name so we don't collide with the
|
|
493
|
-
// container broker's agent registration (which uses the bare clawName).
|
|
494
|
-
const viewerName = `viewer-${this.config.clawName}`;
|
|
495
492
|
const registered = await this.relaycast.agents.registerOrGet({
|
|
496
|
-
name:
|
|
493
|
+
name: this.config.clawName,
|
|
497
494
|
type: 'agent',
|
|
498
495
|
persona: 'Relaycast inbound gateway for OpenClaw',
|
|
499
496
|
});
|
|
@@ -785,9 +782,8 @@ export class InboundGateway {
|
|
|
785
782
|
if (!this.running) return;
|
|
786
783
|
if (this.processingMessageIds.has(message.id) || this.isSeen(message.id)) return;
|
|
787
784
|
|
|
788
|
-
// Avoid echo loops — skip messages from this claw
|
|
789
|
-
|
|
790
|
-
if (message.from === this.config.clawName || message.from === viewerName) {
|
|
785
|
+
// Avoid echo loops — skip messages from this claw.
|
|
786
|
+
if (message.from === this.config.clawName) {
|
|
791
787
|
// Only update cursor for real channels with real (non-synthetic) message IDs.
|
|
792
788
|
this.markSeen(message.id);
|
|
793
789
|
return;
|
|
@@ -5,9 +5,29 @@ import { hostname } from 'node:os';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { spawn as spawnProcess, execFileSync } from 'node:child_process';
|
|
7
7
|
|
|
8
|
+
import { RelayCast } from '@relaycast/sdk';
|
|
9
|
+
|
|
8
10
|
import { detectOpenClaw, saveGatewayConfig } from './config.js';
|
|
9
11
|
import type { GatewayConfig } from './types.js';
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Resolve how to invoke mcporter. Prefers a global binary, falls back to npx.
|
|
15
|
+
*/
|
|
16
|
+
function resolveMcporter(): { cmd: string; prefix: string[] } {
|
|
17
|
+
try {
|
|
18
|
+
execFileSync('mcporter', ['--version'], { stdio: 'pipe' });
|
|
19
|
+
return { cmd: 'mcporter', prefix: [] };
|
|
20
|
+
} catch {
|
|
21
|
+
// Global binary not found — try npx (no timeout; cold-cache downloads can be slow)
|
|
22
|
+
try {
|
|
23
|
+
execFileSync('npx', ['-y', 'mcporter', '--version'], { stdio: 'pipe' });
|
|
24
|
+
return { cmd: 'npx', prefix: ['-y', 'mcporter'] };
|
|
25
|
+
} catch {
|
|
26
|
+
throw new Error('mcporter not found (tried global binary and npx)');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
11
31
|
export interface SetupOptions {
|
|
12
32
|
/** If provided, join this workspace. Otherwise create a new one. */
|
|
13
33
|
apiKey?: string;
|
|
@@ -174,7 +194,7 @@ export async function setup(options: SetupOptions): Promise<SetupResult> {
|
|
|
174
194
|
};
|
|
175
195
|
await saveGatewayConfig(gatewayConfig);
|
|
176
196
|
|
|
177
|
-
// Register MCP servers via mcporter
|
|
197
|
+
// Register MCP servers via mcporter (global binary or npx fallback)
|
|
178
198
|
let mcpConfigured = false;
|
|
179
199
|
{
|
|
180
200
|
const envArgs = [
|
|
@@ -184,77 +204,80 @@ export async function setup(options: SetupOptions): Promise<SetupResult> {
|
|
|
184
204
|
: []),
|
|
185
205
|
];
|
|
186
206
|
|
|
207
|
+
let mcp: { cmd: string; prefix: string[] } | null = null;
|
|
187
208
|
try {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// Register openclaw-spawner MCP server
|
|
199
|
-
execFileSync('mcporter', [
|
|
200
|
-
'config', 'add', 'openclaw-spawner',
|
|
201
|
-
'--command', 'npx',
|
|
202
|
-
'--arg', '@agent-relay/openclaw',
|
|
203
|
-
'--arg', 'mcp-server',
|
|
204
|
-
...envArgs,
|
|
205
|
-
'--scope', 'home',
|
|
206
|
-
'--description', 'OpenClaw spawner MCP server',
|
|
207
|
-
], { stdio: 'pipe' });
|
|
208
|
-
|
|
209
|
-
mcpConfigured = true;
|
|
210
|
-
|
|
211
|
-
// Register this claw as an agent via mcporter and persist the agent token
|
|
209
|
+
mcp = resolveMcporter();
|
|
210
|
+
} catch {
|
|
211
|
+
console.warn('mcporter not found (tried global binary and npx). MCP tools will not be available.');
|
|
212
|
+
console.warn('Install mcporter and re-run setup to enable MCP tools:');
|
|
213
|
+
console.warn(' npm install -g mcporter');
|
|
214
|
+
console.warn(` npx -y @agent-relay/openclaw@latest setup ${apiKey} --name ${clawName}`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (mcp) {
|
|
212
218
|
try {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
'
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
// Register relaycast messaging MCP server
|
|
220
|
+
execFileSync(mcp.cmd, [
|
|
221
|
+
...mcp.prefix,
|
|
222
|
+
'config', 'add', 'relaycast',
|
|
223
|
+
'--command', 'npx',
|
|
224
|
+
'--arg', '@relaycast/mcp',
|
|
225
|
+
...envArgs,
|
|
226
|
+
'--scope', 'home',
|
|
227
|
+
'--description', 'Relaycast messaging MCP server',
|
|
228
|
+
], { stdio: 'pipe' });
|
|
229
|
+
|
|
230
|
+
// Register openclaw-spawner MCP server
|
|
231
|
+
execFileSync(mcp.cmd, [
|
|
232
|
+
...mcp.prefix,
|
|
233
|
+
'config', 'add', 'openclaw-spawner',
|
|
234
|
+
'--command', 'npx',
|
|
235
|
+
'--arg', '@agent-relay/openclaw',
|
|
236
|
+
'--arg', 'mcp-server',
|
|
237
|
+
...envArgs,
|
|
238
|
+
'--scope', 'home',
|
|
239
|
+
'--description', 'OpenClaw spawner MCP server',
|
|
240
|
+
], { stdio: 'pipe' });
|
|
241
|
+
|
|
242
|
+
mcpConfigured = true;
|
|
243
|
+
|
|
244
|
+
// Register this claw via the Relaycast SDK. registerOrRotate handles
|
|
245
|
+
// the 409 "already exists" case by rotating the token automatically.
|
|
221
246
|
try {
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
247
|
+
const relaycast = new RelayCast({ apiKey, baseUrl });
|
|
248
|
+
const registered = await relaycast.agents.registerOrRotate({
|
|
249
|
+
name: clawName,
|
|
250
|
+
type: 'agent',
|
|
251
|
+
});
|
|
252
|
+
const agentToken = registered.token;
|
|
253
|
+
|
|
254
|
+
if (agentToken) {
|
|
255
|
+
// Reconfigure mcporter with the agent token so subsequent calls are authenticated
|
|
256
|
+
try {
|
|
257
|
+
execFileSync(mcp.cmd, [...mcp.prefix, 'config', 'remove', 'relaycast'], { stdio: 'pipe' });
|
|
258
|
+
} catch { /* may not exist */ }
|
|
259
|
+
|
|
260
|
+
execFileSync(mcp.cmd, [
|
|
261
|
+
...mcp.prefix,
|
|
262
|
+
'config', 'add', 'relaycast',
|
|
263
|
+
'--command', 'npx',
|
|
264
|
+
'--arg', '@relaycast/mcp',
|
|
265
|
+
...envArgs,
|
|
266
|
+
'--env', `RELAY_AGENT_TOKEN=${agentToken}`,
|
|
267
|
+
'--scope', 'home',
|
|
268
|
+
'--description', 'Relaycast messaging MCP server',
|
|
269
|
+
], { stdio: 'pipe' });
|
|
270
|
+
|
|
271
|
+
console.log(`Agent "${clawName}" registered with token.`);
|
|
272
|
+
} else {
|
|
273
|
+
console.warn('Agent registered but no token found in response.');
|
|
274
|
+
}
|
|
275
|
+
} catch (regErr) {
|
|
276
|
+
console.warn(`Agent registration failed (non-fatal): ${regErr instanceof Error ? regErr.message : String(regErr)}`);
|
|
249
277
|
}
|
|
250
|
-
} catch (
|
|
251
|
-
console.warn(`
|
|
278
|
+
} catch (err) {
|
|
279
|
+
console.warn(`mcporter configuration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
252
280
|
}
|
|
253
|
-
} catch (err) {
|
|
254
|
-
// mcporter not installed — non-fatal, print manual instructions
|
|
255
|
-
console.warn('mcporter not found. Install MCP servers manually:');
|
|
256
|
-
console.warn(` mcporter config add relaycast --command npx --arg @relaycast/mcp --env RELAY_API_KEY=${apiKey} --scope home`);
|
|
257
|
-
console.warn(` mcporter config add openclaw-spawner --command npx --arg @agent-relay/openclaw --arg mcp-server --env RELAY_API_KEY=${apiKey} --scope home`);
|
|
258
281
|
}
|
|
259
282
|
}
|
|
260
283
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/policy",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
|
|
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": "3.1.
|
|
25
|
+
"@agent-relay/config": "3.1.4"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/sdk",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"typescript": "^5.7.3"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@agent-relay/config": "3.1.
|
|
84
|
+
"@agent-relay/config": "3.1.4",
|
|
85
85
|
"@relaycast/sdk": "^0.4.0",
|
|
86
86
|
"yaml": "^2.7.0"
|
|
87
87
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/trajectory",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
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": "3.1.
|
|
25
|
+
"@agent-relay/config": "3.1.4"
|
|
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": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
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/utils": "3.1.
|
|
25
|
+
"@agent-relay/utils": "3.1.4"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/utils",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "Shared utilities for agent-relay: logging, name generation, command resolution, update checking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs/index.js",
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
"vitest": "^3.2.4"
|
|
113
113
|
},
|
|
114
114
|
"dependencies": {
|
|
115
|
-
"@agent-relay/config": "3.1.
|
|
115
|
+
"@agent-relay/config": "3.1.4",
|
|
116
116
|
"compare-versions": "^6.1.1"
|
|
117
117
|
},
|
|
118
118
|
"publishConfig": {
|