agent-relay 3.1.7 → 3.1.8
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/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/dist/cli.js +8 -1
- package/packages/openclaw/dist/cli.js.map +1 -1
- package/packages/openclaw/dist/config.d.ts +6 -2
- package/packages/openclaw/dist/config.d.ts.map +1 -1
- package/packages/openclaw/dist/config.js +95 -7
- package/packages/openclaw/dist/config.js.map +1 -1
- package/packages/openclaw/dist/gateway.d.ts +1 -0
- package/packages/openclaw/dist/gateway.d.ts.map +1 -1
- package/packages/openclaw/dist/gateway.js +87 -9
- 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 +111 -15
- package/packages/openclaw/dist/setup.js.map +1 -1
- package/packages/openclaw/package.json +2 -2
- package/packages/openclaw/skill/SKILL.md +89 -0
- package/packages/openclaw/src/cli.ts +7 -1
- package/packages/openclaw/src/config.ts +94 -8
- package/packages/openclaw/src/gateway.ts +124 -10
- package/packages/openclaw/src/setup.ts +113 -13
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-relay",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Real-time agent-to-agent communication system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -174,13 +174,13 @@
|
|
|
174
174
|
},
|
|
175
175
|
"homepage": "https://github.com/AgentWorkforce/relay#readme",
|
|
176
176
|
"dependencies": {
|
|
177
|
-
"@agent-relay/config": "3.1.
|
|
178
|
-
"@agent-relay/hooks": "3.1.
|
|
179
|
-
"@agent-relay/sdk": "3.1.
|
|
180
|
-
"@agent-relay/telemetry": "3.1.
|
|
181
|
-
"@agent-relay/trajectory": "3.1.
|
|
182
|
-
"@agent-relay/user-directory": "3.1.
|
|
183
|
-
"@agent-relay/utils": "3.1.
|
|
177
|
+
"@agent-relay/config": "3.1.8",
|
|
178
|
+
"@agent-relay/hooks": "3.1.8",
|
|
179
|
+
"@agent-relay/sdk": "3.1.8",
|
|
180
|
+
"@agent-relay/telemetry": "3.1.8",
|
|
181
|
+
"@agent-relay/trajectory": "3.1.8",
|
|
182
|
+
"@agent-relay/user-directory": "3.1.8",
|
|
183
|
+
"@agent-relay/utils": "3.1.8",
|
|
184
184
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
185
185
|
"@relaycast/sdk": "^0.4.0",
|
|
186
186
|
"chokidar": "^5.0.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/acp-bridge",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "ACP (Agent Client Protocol) bridge for Agent Relay - expose relay agents to ACP-compatible editors like Zed",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@agent-relay/sdk": "3.1.
|
|
49
|
+
"@agent-relay/sdk": "3.1.8",
|
|
50
50
|
"@agentclientprotocol/sdk": "^0.12.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/hooks",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"test:watch": "vitest"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@agent-relay/config": "3.1.
|
|
41
|
-
"@agent-relay/trajectory": "3.1.
|
|
42
|
-
"@agent-relay/sdk": "3.1.
|
|
40
|
+
"@agent-relay/config": "3.1.8",
|
|
41
|
+
"@agent-relay/trajectory": "3.1.8",
|
|
42
|
+
"@agent-relay/sdk": "3.1.8"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/memory",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
|
|
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/hooks": "3.1.
|
|
25
|
+
"@agent-relay/hooks": "3.1.8"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -6,7 +6,14 @@ import { listOpenClaws, releaseOpenClaw, spawnOpenClaw } from './control.js';
|
|
|
6
6
|
import { startMcpServer } from './mcp/server.js';
|
|
7
7
|
import { runtimeSetup } from './runtime/setup.js';
|
|
8
8
|
const require = createRequire(import.meta.url);
|
|
9
|
-
const
|
|
9
|
+
const version = process.env.RELAY_OPENCLAW_VERSION ?? (() => {
|
|
10
|
+
try {
|
|
11
|
+
return require('../package.json').version;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return 'unknown';
|
|
15
|
+
}
|
|
16
|
+
})();
|
|
10
17
|
function printUsage() {
|
|
11
18
|
console.log(`
|
|
12
19
|
relay-openclaw — Relaycast bridge for OpenClaw
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { GatewayConfig } from './types.js';
|
|
|
2
2
|
export interface OpenClawDetection {
|
|
3
3
|
/** Whether OpenClaw is installed. */
|
|
4
4
|
installed: boolean;
|
|
5
|
-
/** Path to ~/.openclaw/ */
|
|
5
|
+
/** Path to ~/.openclaw/ (or ~/.clawdbot/ for Clawdbot variant) */
|
|
6
6
|
homeDir: string;
|
|
7
7
|
/** Path to ~/.openclaw/workspace/ */
|
|
8
8
|
workspaceDir: string;
|
|
@@ -10,8 +10,12 @@ export interface OpenClawDetection {
|
|
|
10
10
|
configFile: string | null;
|
|
11
11
|
/** Parsed openclaw.json (if exists). */
|
|
12
12
|
config: Record<string, unknown> | null;
|
|
13
|
+
/** Detected variant: 'clawdbot' or 'openclaw'. */
|
|
14
|
+
variant: 'clawdbot' | 'openclaw';
|
|
15
|
+
/** Config filename (e.g. 'clawdbot.json' or 'openclaw.json'). */
|
|
16
|
+
configFilename: string;
|
|
13
17
|
}
|
|
14
|
-
/** Default OpenClaw config directory.
|
|
18
|
+
/** Default OpenClaw config directory. Checks env vars and probes for Clawdbot variant. */
|
|
15
19
|
export declare function openclawHome(): string;
|
|
16
20
|
/**
|
|
17
21
|
* Detect whether OpenClaw is installed and return paths/config.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,kDAAkD;IAClD,OAAO,EAAE,UAAU,GAAG,UAAU,CAAC;IACjC,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;CACxB;AAkBD,0FAA0F;AAC1F,wBAAgB,YAAY,IAAI,MAAM,CAoBrC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAoEjE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgDvE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B5E"}
|
|
@@ -1,17 +1,105 @@
|
|
|
1
1
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, dirname, basename } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
|
-
import { existsSync } from 'node:fs';
|
|
5
|
-
/**
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
/**
|
|
6
|
+
* Determine whether a directory has a valid, parseable config file.
|
|
7
|
+
* Uses sync I/O — only called during startup, not on hot path.
|
|
8
|
+
*/
|
|
9
|
+
function hasValidConfig(dir, filename) {
|
|
10
|
+
const configPath = join(dir, filename);
|
|
11
|
+
if (!existsSync(configPath))
|
|
12
|
+
return false;
|
|
13
|
+
try {
|
|
14
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
15
|
+
JSON.parse(raw);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Default OpenClaw config directory. Checks env vars and probes for Clawdbot variant. */
|
|
6
23
|
export function openclawHome() {
|
|
7
|
-
|
|
24
|
+
if (process.env.OPENCLAW_CONFIG_PATH) {
|
|
25
|
+
// Direct config file path — return its parent directory
|
|
26
|
+
return dirname(process.env.OPENCLAW_CONFIG_PATH);
|
|
27
|
+
}
|
|
28
|
+
if (process.env.OPENCLAW_HOME) {
|
|
29
|
+
return process.env.OPENCLAW_HOME;
|
|
30
|
+
}
|
|
31
|
+
// Probe by valid config file presence (not just directory existence).
|
|
32
|
+
// When both dirs exist, prefer the one with a valid config file.
|
|
33
|
+
const clawdbotHome = join(homedir(), '.clawdbot');
|
|
34
|
+
const openclawHomePath = join(homedir(), '.openclaw');
|
|
35
|
+
const clawdbotValid = hasValidConfig(clawdbotHome, 'clawdbot.json');
|
|
36
|
+
const openclawValid = hasValidConfig(openclawHomePath, 'openclaw.json');
|
|
37
|
+
if (clawdbotValid && !openclawValid)
|
|
38
|
+
return clawdbotHome;
|
|
39
|
+
if (openclawValid && !clawdbotValid)
|
|
40
|
+
return openclawHomePath;
|
|
41
|
+
// Both valid or neither valid — prefer clawdbot if its dir exists (marketplace image)
|
|
42
|
+
if (existsSync(clawdbotHome))
|
|
43
|
+
return clawdbotHome;
|
|
44
|
+
return openclawHomePath;
|
|
8
45
|
}
|
|
9
46
|
/**
|
|
10
47
|
* Detect whether OpenClaw is installed and return paths/config.
|
|
11
48
|
*/
|
|
12
49
|
export async function detectOpenClaw() {
|
|
13
|
-
|
|
14
|
-
|
|
50
|
+
// Determine variant and config filename
|
|
51
|
+
let homeDir;
|
|
52
|
+
let variant;
|
|
53
|
+
let configFilename;
|
|
54
|
+
if (process.env.OPENCLAW_CONFIG_PATH) {
|
|
55
|
+
// Direct config file path provided
|
|
56
|
+
homeDir = dirname(process.env.OPENCLAW_CONFIG_PATH);
|
|
57
|
+
const base = basename(process.env.OPENCLAW_CONFIG_PATH);
|
|
58
|
+
configFilename = base;
|
|
59
|
+
variant = base === 'clawdbot.json' ? 'clawdbot' : 'openclaw';
|
|
60
|
+
}
|
|
61
|
+
else if (process.env.OPENCLAW_HOME) {
|
|
62
|
+
homeDir = process.env.OPENCLAW_HOME;
|
|
63
|
+
// Check if the home dir looks like a Clawdbot installation
|
|
64
|
+
const clawdbotConfig = join(homeDir, 'clawdbot.json');
|
|
65
|
+
if (existsSync(clawdbotConfig)) {
|
|
66
|
+
variant = 'clawdbot';
|
|
67
|
+
configFilename = 'clawdbot.json';
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
variant = 'openclaw';
|
|
71
|
+
configFilename = 'openclaw.json';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Probe by valid config file, not just directory existence.
|
|
76
|
+
const clawdbotHome = join(homedir(), '.clawdbot');
|
|
77
|
+
const openclawHomePath = join(homedir(), '.openclaw');
|
|
78
|
+
const clawdbotValid = hasValidConfig(clawdbotHome, 'clawdbot.json');
|
|
79
|
+
const openclawValid = hasValidConfig(openclawHomePath, 'openclaw.json');
|
|
80
|
+
if (clawdbotValid && !openclawValid) {
|
|
81
|
+
homeDir = clawdbotHome;
|
|
82
|
+
variant = 'clawdbot';
|
|
83
|
+
configFilename = 'clawdbot.json';
|
|
84
|
+
}
|
|
85
|
+
else if (openclawValid && !clawdbotValid) {
|
|
86
|
+
homeDir = openclawHomePath;
|
|
87
|
+
variant = 'openclaw';
|
|
88
|
+
configFilename = 'openclaw.json';
|
|
89
|
+
}
|
|
90
|
+
else if (existsSync(clawdbotHome)) {
|
|
91
|
+
// Both valid or neither — prefer clawdbot if present (marketplace image)
|
|
92
|
+
homeDir = clawdbotHome;
|
|
93
|
+
variant = 'clawdbot';
|
|
94
|
+
configFilename = 'clawdbot.json';
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
homeDir = openclawHomePath;
|
|
98
|
+
variant = 'openclaw';
|
|
99
|
+
configFilename = 'openclaw.json';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const configPath = join(homeDir, configFilename);
|
|
15
103
|
const workspaceDir = join(homeDir, 'workspace');
|
|
16
104
|
const installed = existsSync(homeDir);
|
|
17
105
|
let config = null;
|
|
@@ -26,7 +114,7 @@ export async function detectOpenClaw() {
|
|
|
26
114
|
// Config exists but isn't valid JSON — that's fine
|
|
27
115
|
}
|
|
28
116
|
}
|
|
29
|
-
return { installed, homeDir, workspaceDir, configFile, config };
|
|
117
|
+
return { installed, homeDir, workspaceDir, configFile, config, variant, configFilename };
|
|
30
118
|
}
|
|
31
119
|
/**
|
|
32
120
|
* Load the gateway config from ~/.openclaw/workspace/relaycast/.env.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHash, createPrivateKey, generateKeyPairSync, sign } from 'node:crypto';
|
|
1
|
+
import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign } from 'node:crypto';
|
|
2
2
|
import { chmod, readFile, rename, writeFile, mkdir } from 'node:fs/promises';
|
|
3
3
|
import { createServer } from 'node:http';
|
|
4
4
|
import { join } from 'node:path';
|
|
@@ -10,17 +10,60 @@ import { SpawnManager } from './spawn/manager.js';
|
|
|
10
10
|
function normalizeChannelName(channel) {
|
|
11
11
|
return channel.startsWith('#') ? channel.slice(1) : channel;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
const AUTH_PROFILES = {
|
|
14
|
+
default: {
|
|
15
|
+
name: 'default',
|
|
16
|
+
publicKeyFormat: 'raw-base64url',
|
|
17
|
+
signatureEncoding: 'base64url',
|
|
18
|
+
},
|
|
19
|
+
'clawdbot-v1': {
|
|
20
|
+
name: 'clawdbot-v1',
|
|
21
|
+
publicKeyFormat: 'spki-pem',
|
|
22
|
+
signatureEncoding: 'base64',
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the auth profile to use. Selection priority:
|
|
27
|
+
* 1. Explicit env var `OPENCLAW_WS_AUTH_COMPAT` (manual override, highest priority)
|
|
28
|
+
* 2. Variant detection: `~/.clawdbot/` detected → clawdbot-v1
|
|
29
|
+
* 3. Default profile (standard OpenClaw, unchanged)
|
|
30
|
+
*/
|
|
31
|
+
function resolveAuthProfile() {
|
|
32
|
+
// 1. Manual override (highest priority)
|
|
33
|
+
const envVal = process.env.OPENCLAW_WS_AUTH_COMPAT;
|
|
34
|
+
if (envVal === 'clawdbot' || envVal === 'clawdbot-v1') {
|
|
35
|
+
return AUTH_PROFILES['clawdbot-v1'];
|
|
36
|
+
}
|
|
37
|
+
if (envVal && AUTH_PROFILES[envVal]) {
|
|
38
|
+
return AUTH_PROFILES[envVal];
|
|
39
|
+
}
|
|
40
|
+
// 2. Variant detection via config path
|
|
41
|
+
const home = process.env.OPENCLAW_HOME || process.env.OPENCLAW_CONFIG_PATH || '';
|
|
42
|
+
if (home.includes('.clawdbot') || home.includes('clawdbot')) {
|
|
43
|
+
return AUTH_PROFILES['clawdbot-v1'];
|
|
44
|
+
}
|
|
45
|
+
// 3. Default
|
|
46
|
+
return AUTH_PROFILES['default'];
|
|
47
|
+
}
|
|
48
|
+
function getWsAuthCompat() {
|
|
49
|
+
const profile = resolveAuthProfile();
|
|
50
|
+
return profile.name === 'clawdbot-v1' ? 'clawdbot' : undefined;
|
|
51
|
+
}
|
|
52
|
+
function generateDeviceIdentity(compat) {
|
|
14
53
|
const { publicKey, privateKey } = generateKeyPairSync('ed25519');
|
|
15
54
|
// Extract raw 32-byte public key from SPKI DER (12-byte header for Ed25519)
|
|
16
55
|
const rawPublicBytes = publicKey.export({ type: 'spki', format: 'der' }).subarray(12);
|
|
17
56
|
const deviceId = createHash('sha256').update(rawPublicBytes).digest('hex');
|
|
18
57
|
const publicKeyB64 = Buffer.from(rawPublicBytes).toString('base64url');
|
|
19
|
-
|
|
58
|
+
const identity = {
|
|
20
59
|
publicKeyB64,
|
|
21
60
|
privateKeyObj: privateKey,
|
|
22
61
|
deviceId,
|
|
23
62
|
};
|
|
63
|
+
if (compat === 'clawdbot') {
|
|
64
|
+
identity.publicKeyPem = publicKey.export({ type: 'spki', format: 'pem' });
|
|
65
|
+
}
|
|
66
|
+
return identity;
|
|
24
67
|
}
|
|
25
68
|
/** Path to persisted device identity file. */
|
|
26
69
|
function deviceIdentityPath() {
|
|
@@ -33,6 +76,7 @@ function deviceIdentityPath() {
|
|
|
33
76
|
*/
|
|
34
77
|
async function loadOrCreateDeviceIdentity() {
|
|
35
78
|
const filePath = deviceIdentityPath();
|
|
79
|
+
const compat = getWsAuthCompat();
|
|
36
80
|
// Attempt to load existing identity (no existsSync — just try the read)
|
|
37
81
|
try {
|
|
38
82
|
const raw = await readFile(filePath, 'utf-8');
|
|
@@ -45,11 +89,29 @@ async function loadOrCreateDeviceIdentity() {
|
|
|
45
89
|
// Ensure permissions are tight even if file was created with looser perms
|
|
46
90
|
await chmod(filePath, 0o600).catch(() => { });
|
|
47
91
|
console.log(`[openclaw-ws] Loaded persisted device identity (deviceId=${persisted.deviceId.slice(0, 12)}...)`);
|
|
48
|
-
|
|
92
|
+
const identity = {
|
|
49
93
|
publicKeyB64: persisted.publicKeyB64,
|
|
50
94
|
privateKeyObj,
|
|
51
95
|
deviceId: persisted.deviceId,
|
|
52
96
|
};
|
|
97
|
+
// If compat mode is clawdbot but the persisted device has no PEM keys,
|
|
98
|
+
// derive them on-the-fly from the existing DER key material.
|
|
99
|
+
if (compat === 'clawdbot') {
|
|
100
|
+
if (persisted.publicKeyPem) {
|
|
101
|
+
identity.publicKeyPem = persisted.publicKeyPem;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Reconstruct SPKI public key from the stored base64url raw bytes
|
|
105
|
+
const rawPublicBytes = Buffer.from(persisted.publicKeyB64, 'base64url');
|
|
106
|
+
// Ed25519 SPKI DER = 12-byte header + 32-byte raw key
|
|
107
|
+
const spkiHeader = Buffer.from('302a300506032b6570032100', 'hex');
|
|
108
|
+
const spkiDer = Buffer.concat([spkiHeader, rawPublicBytes]);
|
|
109
|
+
const publicKeyObj = createPublicKey({ key: spkiDer, format: 'der', type: 'spki' });
|
|
110
|
+
identity.publicKeyPem = publicKeyObj.export({ type: 'spki', format: 'pem' });
|
|
111
|
+
console.log('[openclaw-ws] Derived PEM public key from existing DER key for clawdbot compat mode');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return identity;
|
|
53
115
|
}
|
|
54
116
|
catch (err) {
|
|
55
117
|
// ENOENT is expected on first run; other errors mean corruption
|
|
@@ -58,13 +120,17 @@ async function loadOrCreateDeviceIdentity() {
|
|
|
58
120
|
}
|
|
59
121
|
}
|
|
60
122
|
// Generate fresh and persist via atomic write-then-rename
|
|
61
|
-
const identity = generateDeviceIdentity();
|
|
123
|
+
const identity = generateDeviceIdentity(compat);
|
|
62
124
|
const pkcs8Der = identity.privateKeyObj.export({ type: 'pkcs8', format: 'der' });
|
|
63
125
|
const persisted = {
|
|
64
126
|
publicKeyB64: identity.publicKeyB64,
|
|
65
127
|
privateKeyPkcs8B64: Buffer.from(pkcs8Der).toString('base64'),
|
|
66
128
|
deviceId: identity.deviceId,
|
|
67
129
|
};
|
|
130
|
+
if (compat === 'clawdbot' && identity.publicKeyPem) {
|
|
131
|
+
persisted.publicKeyPem = identity.publicKeyPem;
|
|
132
|
+
persisted.privateKeyPem = identity.privateKeyObj.export({ type: 'pkcs8', format: 'pem' });
|
|
133
|
+
}
|
|
68
134
|
try {
|
|
69
135
|
const dir = join(openclawHome(), 'workspace', 'relaycast');
|
|
70
136
|
await mkdir(dir, { recursive: true });
|
|
@@ -79,6 +145,7 @@ async function loadOrCreateDeviceIdentity() {
|
|
|
79
145
|
return identity;
|
|
80
146
|
}
|
|
81
147
|
function signConnectPayload(device, params) {
|
|
148
|
+
const profile = resolveAuthProfile();
|
|
82
149
|
// v3 payload format: v3|deviceId|clientId|clientMode|role|scopes|signedAtMs|token|nonce|platform|deviceFamily
|
|
83
150
|
const payload = [
|
|
84
151
|
'v3',
|
|
@@ -94,9 +161,12 @@ function signConnectPayload(device, params) {
|
|
|
94
161
|
params.deviceFamily,
|
|
95
162
|
].join('|');
|
|
96
163
|
const payloadBytes = Buffer.from(payload, 'utf-8');
|
|
164
|
+
// Diagnostic logging: selected profile + pre-auth fingerprint (no secrets).
|
|
165
|
+
const payloadHash = createHash('sha256').update(payloadBytes).digest('hex').slice(0, 16);
|
|
166
|
+
console.log(`[ws-auth] profile=${profile.name} deviceId=${device.deviceId.slice(0, 16)}... keyFormat=${profile.publicKeyFormat} sigEncoding=${profile.signatureEncoding} payloadHash=${payloadHash}`);
|
|
97
167
|
// Ed25519 sign — no hash algorithm needed (null), it's built into Ed25519
|
|
98
168
|
const signature = sign(null, payloadBytes, device.privateKeyObj);
|
|
99
|
-
return Buffer.from(signature).toString(
|
|
169
|
+
return Buffer.from(signature).toString(profile.signatureEncoding);
|
|
100
170
|
}
|
|
101
171
|
/** @internal */
|
|
102
172
|
export class OpenClawGatewayClient {
|
|
@@ -125,7 +195,7 @@ export class OpenClawGatewayClient {
|
|
|
125
195
|
constructor(token, port, device) {
|
|
126
196
|
this.token = token;
|
|
127
197
|
this.port = port;
|
|
128
|
-
this.device = device ?? generateDeviceIdentity();
|
|
198
|
+
this.device = device ?? generateDeviceIdentity(getWsAuthCompat());
|
|
129
199
|
}
|
|
130
200
|
/**
|
|
131
201
|
* Create a client with a persisted device identity (loaded from disk or
|
|
@@ -259,6 +329,11 @@ export class OpenClawGatewayClient {
|
|
|
259
329
|
token: this.token,
|
|
260
330
|
nonce: payload.nonce,
|
|
261
331
|
});
|
|
332
|
+
// Select public key format based on resolved auth profile.
|
|
333
|
+
const profile = resolveAuthProfile();
|
|
334
|
+
const publicKeyField = profile.publicKeyFormat === 'spki-pem' && this.device.publicKeyPem
|
|
335
|
+
? this.device.publicKeyPem
|
|
336
|
+
: this.device.publicKeyB64;
|
|
262
337
|
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
263
338
|
console.warn('[openclaw-ws] WebSocket not open when trying to send connect');
|
|
264
339
|
return;
|
|
@@ -287,7 +362,7 @@ export class OpenClawGatewayClient {
|
|
|
287
362
|
userAgent: 'relaycast-gateway/1.0.0',
|
|
288
363
|
device: {
|
|
289
364
|
id: this.device.deviceId,
|
|
290
|
-
publicKey:
|
|
365
|
+
publicKey: publicKeyField,
|
|
291
366
|
signature,
|
|
292
367
|
signedAt,
|
|
293
368
|
nonce: payload.nonce,
|
|
@@ -318,7 +393,10 @@ export class OpenClawGatewayClient {
|
|
|
318
393
|
console.error(`[openclaw-ws] Approve this device: openclaw devices approve ${requestId}`);
|
|
319
394
|
}
|
|
320
395
|
console.error(`[openclaw-ws] Device ID: ${this.device.deviceId.slice(0, 16)}...`);
|
|
321
|
-
|
|
396
|
+
const configHint = getWsAuthCompat() === 'clawdbot'
|
|
397
|
+
? '~/.clawdbot/clawdbot.json'
|
|
398
|
+
: '~/.openclaw/openclaw.json';
|
|
399
|
+
console.error(`[openclaw-ws] Ensure OPENCLAW_GATEWAY_TOKEN matches ${configHint} gateway.auth.token`);
|
|
322
400
|
this.pairingRejected = true;
|
|
323
401
|
}
|
|
324
402
|
else {
|