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.
Files changed (42) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
  5. package/dist/src/cli/commands/agent-management.js +14 -1
  6. package/dist/src/cli/commands/agent-management.js.map +1 -1
  7. package/package.json +8 -8
  8. package/packages/acp-bridge/package.json +2 -2
  9. package/packages/config/package.json +1 -1
  10. package/packages/hooks/package.json +4 -4
  11. package/packages/memory/package.json +2 -2
  12. package/packages/openclaw/README.md +1 -1
  13. package/packages/openclaw/dist/__tests__/gateway-control.test.js +1 -1
  14. package/packages/openclaw/dist/__tests__/gateway-control.test.js.map +1 -1
  15. package/packages/openclaw/dist/__tests__/gateway-threads.test.js +1 -18
  16. package/packages/openclaw/dist/__tests__/gateway-threads.test.js.map +1 -1
  17. package/packages/openclaw/dist/__tests__/ws-client.test.js +1 -1
  18. package/packages/openclaw/dist/__tests__/ws-client.test.js.map +1 -1
  19. package/packages/openclaw/dist/cli.js +9 -0
  20. package/packages/openclaw/dist/cli.js.map +1 -1
  21. package/packages/openclaw/dist/gateway.d.ts.map +1 -1
  22. package/packages/openclaw/dist/gateway.js +3 -7
  23. package/packages/openclaw/dist/gateway.js.map +1 -1
  24. package/packages/openclaw/dist/setup.d.ts.map +1 -1
  25. package/packages/openclaw/dist/setup.js +85 -63
  26. package/packages/openclaw/dist/setup.js.map +1 -1
  27. package/packages/openclaw/package.json +2 -2
  28. package/packages/openclaw/skill/SKILL.md +73 -12
  29. package/packages/openclaw/src/__tests__/SPEC-ws-client-testing.md +2 -2
  30. package/packages/openclaw/src/__tests__/gateway-control.test.ts +1 -1
  31. package/packages/openclaw/src/__tests__/gateway-threads.test.ts +1 -22
  32. package/packages/openclaw/src/__tests__/ws-client.test.ts +1 -1
  33. package/packages/openclaw/src/cli.ts +10 -0
  34. package/packages/openclaw/src/gateway.ts +3 -7
  35. package/packages/openclaw/src/setup.ts +90 -67
  36. package/packages/policy/package.json +2 -2
  37. package/packages/sdk/package.json +2 -2
  38. package/packages/sdk-py/pyproject.toml +1 -1
  39. package/packages/telemetry/package.json +1 -1
  40. package/packages/trajectory/package.json +2 -2
  41. package/packages/user-directory/package.json +2 -2
  42. 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: 'viewer-test', token: 'tok' }) },
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: viewerName,
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 or its viewer identity.
789
- const viewerName = `viewer-${this.config.clawName}`;
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
- // Register relaycast messaging MCP server
189
- execFileSync('mcporter', [
190
- 'config', 'add', 'relaycast',
191
- '--command', 'npx',
192
- '--arg', '@relaycast/mcp',
193
- ...envArgs,
194
- '--scope', 'home',
195
- '--description', 'Relaycast messaging MCP server',
196
- ], { stdio: 'pipe' });
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
- const registerOutput = execFileSync('mcporter', [
214
- 'call', 'relaycast.register',
215
- 'name=' + clawName,
216
- 'type=agent',
217
- ], { stdio: 'pipe', encoding: 'utf-8' });
218
-
219
- // Parse the agent token from the register output
220
- let agentToken: string | undefined;
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 parsed = JSON.parse(registerOutput);
223
- agentToken = parsed.token ?? parsed.agentToken ?? parsed.agent_token;
224
- } catch {
225
- // Try to find token in raw output
226
- const tokenMatch = registerOutput.match(/"token"\s*:\s*"([^"]+)"/);
227
- if (tokenMatch) agentToken = tokenMatch[1];
228
- }
229
-
230
- if (agentToken) {
231
- // Reconfigure mcporter with the agent token so subsequent calls are authenticated
232
- try {
233
- execFileSync('mcporter', ['config', 'remove', 'relaycast'], { stdio: 'pipe' });
234
- } catch { /* may not exist */ }
235
-
236
- execFileSync('mcporter', [
237
- 'config', 'add', 'relaycast',
238
- '--command', 'npx',
239
- '--arg', '@relaycast/mcp',
240
- ...envArgs,
241
- '--env', `RELAY_AGENT_TOKEN=${agentToken}`,
242
- '--scope', 'home',
243
- '--description', 'Relaycast messaging MCP server',
244
- ], { stdio: 'pipe' });
245
-
246
- console.log(`Agent "${clawName}" registered with token.`);
247
- } else {
248
- console.warn('Agent registered but no token found in response.');
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 (regErr) {
251
- console.warn(`Agent registration via mcporter failed (non-fatal): ${regErr instanceof Error ? regErr.message : String(regErr)}`);
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.2",
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.2"
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.2",
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.2",
84
+ "@agent-relay/config": "3.1.4",
85
85
  "@relaycast/sdk": "^0.4.0",
86
86
  "yaml": "^2.7.0"
87
87
  }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent-relay-sdk"
7
- version = "3.1.2"
7
+ version = "3.1.4"
8
8
  description = "Python SDK for Agent Relay workflows"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "3.1.2",
3
+ "version": "3.1.4",
4
4
  "description": "Anonymous telemetry for Agent Relay usage analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/trajectory",
3
- "version": "3.1.2",
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.2"
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.2",
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.2"
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.2",
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.2",
115
+ "@agent-relay/config": "3.1.4",
116
116
  "compare-versions": "^6.1.1"
117
117
  },
118
118
  "publishConfig": {