agent-relay 3.1.6 → 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.
Files changed (50) 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/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/index.cjs +130 -107
  6. package/package.json +8 -8
  7. package/packages/acp-bridge/package.json +2 -2
  8. package/packages/config/package.json +1 -1
  9. package/packages/hooks/package.json +4 -4
  10. package/packages/memory/package.json +2 -2
  11. package/packages/openclaw/dist/cli.js +8 -1
  12. package/packages/openclaw/dist/cli.js.map +1 -1
  13. package/packages/openclaw/dist/config.d.ts +6 -2
  14. package/packages/openclaw/dist/config.d.ts.map +1 -1
  15. package/packages/openclaw/dist/config.js +95 -7
  16. package/packages/openclaw/dist/config.js.map +1 -1
  17. package/packages/openclaw/dist/gateway.d.ts +3 -0
  18. package/packages/openclaw/dist/gateway.d.ts.map +1 -1
  19. package/packages/openclaw/dist/gateway.js +114 -16
  20. package/packages/openclaw/dist/gateway.js.map +1 -1
  21. package/packages/openclaw/dist/setup.d.ts.map +1 -1
  22. package/packages/openclaw/dist/setup.js +111 -15
  23. package/packages/openclaw/dist/setup.js.map +1 -1
  24. package/packages/openclaw/package.json +2 -2
  25. package/packages/openclaw/skill/SKILL.md +190 -31
  26. package/packages/openclaw/src/cli.ts +7 -1
  27. package/packages/openclaw/src/config.ts +94 -8
  28. package/packages/openclaw/src/gateway.ts +153 -19
  29. package/packages/openclaw/src/setup.ts +113 -13
  30. package/packages/policy/package.json +2 -2
  31. package/packages/sdk/dist/client.js +6 -8
  32. package/packages/sdk/dist/client.js.map +1 -1
  33. package/packages/sdk/dist/workflows/builder.d.ts +3 -1
  34. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
  35. package/packages/sdk/dist/workflows/builder.js +1 -0
  36. package/packages/sdk/dist/workflows/builder.js.map +1 -1
  37. package/packages/sdk/dist/workflows/runner.d.ts +15 -1
  38. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  39. package/packages/sdk/dist/workflows/runner.js +146 -117
  40. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  41. package/packages/sdk/package.json +2 -2
  42. package/packages/sdk/scripts/bundle-agent-relay.mjs +11 -1
  43. package/packages/sdk/src/client.ts +6 -8
  44. package/packages/sdk/src/workflows/builder.ts +4 -1
  45. package/packages/sdk/src/workflows/runner.ts +173 -119
  46. package/packages/sdk-py/pyproject.toml +1 -1
  47. package/packages/telemetry/package.json +1 -1
  48. package/packages/trajectory/package.json +2 -2
  49. package/packages/user-directory/package.json +2 -2
  50. package/packages/utils/package.json +2 -2
Binary file
Binary file
Binary file
Binary file
package/dist/index.cjs CHANGED
@@ -9455,7 +9455,8 @@ function isExplicitPath(binaryPath) {
9455
9455
  function detectPlatformSuffix() {
9456
9456
  const platformMap = {
9457
9457
  darwin: { arm64: "darwin-arm64", x64: "darwin-x64" },
9458
- linux: { arm64: "linux-arm64", x64: "linux-x64" }
9458
+ linux: { arm64: "linux-arm64", x64: "linux-x64" },
9459
+ win32: { x64: "win32-x64" }
9459
9460
  };
9460
9461
  return platformMap[process.platform]?.[process.arch] ?? null;
9461
9462
  }
@@ -9527,15 +9528,12 @@ function resolveDefaultBinaryPath() {
9527
9528
  const binDir = import_node_path.default.resolve(moduleDir, "..", "bin");
9528
9529
  const suffix = detectPlatformSuffix();
9529
9530
  if (suffix) {
9530
- const platformBinary = import_node_path.default.join(binDir, `agent-relay-broker-${suffix}`);
9531
+ const ext = process.platform === "win32" ? ".exe" : "";
9532
+ const platformBinary = import_node_path.default.join(binDir, `agent-relay-broker-${suffix}${ext}`);
9531
9533
  if (import_node_fs.default.existsSync(platformBinary)) {
9532
9534
  return platformBinary;
9533
9535
  }
9534
9536
  }
9535
- const bundled = import_node_path.default.join(binDir, brokerExe);
9536
- if (import_node_fs.default.existsSync(bundled)) {
9537
- return bundled;
9538
- }
9539
9537
  const homeDir = process.env.HOME || process.env.USERPROFILE || "";
9540
9538
  const standaloneBroker = import_node_path.default.join(homeDir, ".agent-relay", "bin", brokerExe);
9541
9539
  if (import_node_fs.default.existsSync(standaloneBroker)) {
@@ -47575,6 +47573,7 @@ var WorkflowRunner = class _WorkflowRunner {
47575
47573
  relayOptions;
47576
47574
  cwd;
47577
47575
  summaryDir;
47576
+ executor;
47578
47577
  /** @internal exposed for CLI signal-handler shutdown only */
47579
47578
  relay;
47580
47579
  relaycast;
@@ -47618,6 +47617,7 @@ var WorkflowRunner = class _WorkflowRunner {
47618
47617
  this.cwd = options.cwd ?? process.cwd();
47619
47618
  this.summaryDir = options.summaryDir ?? import_node_path8.default.join(this.cwd, ".relay", "summaries");
47620
47619
  this.workersPath = import_node_path8.default.join(this.cwd, ".agent-relay", "team", "workers.json");
47620
+ this.executor = options.executor;
47621
47621
  }
47622
47622
  // ── Progress logging ────────────────────────────────────────────────────
47623
47623
  /** Log a progress message with elapsed time since run start. */
@@ -48351,109 +48351,111 @@ ${err.suggestion}`);
48351
48351
  config3.swarm.channel = channel;
48352
48352
  await this.db.updateRun(runId, { config: config3 });
48353
48353
  }
48354
- this.log("Resolving Relaycast API key...");
48355
- await this.ensureRelaycastApiKey(channel);
48356
- this.log("API key resolved");
48357
- if (this.relayApiKeyAutoCreated && this.relayApiKey) {
48358
- this.log(`Workspace created \u2014 follow this run in Relaycast:`);
48359
- this.log(` Observer: https://observer.relaycast.dev/?key=${this.relayApiKey}`);
48360
- this.log(` Channel: ${channel}`);
48361
- }
48362
- this.log("Starting broker...");
48363
- const brokerBaseName = import_node_path8.default.basename(this.cwd) || "workflow";
48364
- const brokerName = `${brokerBaseName}-${runId.slice(0, 8)}`;
48365
- this.relay = new AgentRelay({
48366
- ...this.relayOptions,
48367
- brokerName,
48368
- channels: [channel],
48369
- env: this.getRelayEnv(),
48370
- // Workflows spawn agents across multiple waves; each spawn requires a PTY +
48371
- // Relaycast registration. 60s is too tight when the broker is saturated with
48372
- // long-running PTY processes from earlier steps. 120s gives room to breathe.
48373
- requestTimeoutMs: this.relayOptions.requestTimeoutMs ?? 12e4
48374
- });
48375
- this.relay.onWorkerOutput = ({ name, chunk }) => {
48376
- const listener = this.ptyListeners.get(name);
48377
- if (listener)
48378
- listener(chunk);
48379
- const stripped = _WorkflowRunner.stripAnsi(chunk);
48380
- const shortName = name.replace(/-[a-f0-9]{6,}$/, "");
48381
- let activity;
48382
- if (/Read\(/.test(stripped)) {
48383
- const m = stripped.match(/Read\(\s*~?([^\s)"']{8,})/);
48384
- if (m) {
48385
- const base = import_node_path8.default.basename(m[1]);
48386
- activity = base.length >= 3 ? `Reading ${base}` : "Reading file...";
48387
- } else {
48388
- activity = "Reading file...";
48354
+ if (!this.executor) {
48355
+ this.log("Resolving Relaycast API key...");
48356
+ await this.ensureRelaycastApiKey(channel);
48357
+ this.log("API key resolved");
48358
+ if (this.relayApiKeyAutoCreated && this.relayApiKey) {
48359
+ this.log(`Workspace created \u2014 follow this run in Relaycast:`);
48360
+ this.log(` Observer: https://observer.relaycast.dev/?key=${this.relayApiKey}`);
48361
+ this.log(` Channel: ${channel}`);
48362
+ }
48363
+ this.log("Starting broker...");
48364
+ const brokerBaseName = import_node_path8.default.basename(this.cwd) || "workflow";
48365
+ const brokerName = `${brokerBaseName}-${runId.slice(0, 8)}`;
48366
+ this.relay = new AgentRelay({
48367
+ ...this.relayOptions,
48368
+ brokerName,
48369
+ channels: [channel],
48370
+ env: this.getRelayEnv(),
48371
+ // Workflows spawn agents across multiple waves; each spawn requires a PTY +
48372
+ // Relaycast registration. 60s is too tight when the broker is saturated with
48373
+ // long-running PTY processes from earlier steps. 120s gives room to breathe.
48374
+ requestTimeoutMs: this.relayOptions.requestTimeoutMs ?? 12e4
48375
+ });
48376
+ this.relay.onWorkerOutput = ({ name, chunk }) => {
48377
+ const listener = this.ptyListeners.get(name);
48378
+ if (listener)
48379
+ listener(chunk);
48380
+ const stripped = _WorkflowRunner.stripAnsi(chunk);
48381
+ const shortName = name.replace(/-[a-f0-9]{6,}$/, "");
48382
+ let activity;
48383
+ if (/Read\(/.test(stripped)) {
48384
+ const m = stripped.match(/Read\(\s*~?([^\s)"']{8,})/);
48385
+ if (m) {
48386
+ const base = import_node_path8.default.basename(m[1]);
48387
+ activity = base.length >= 3 ? `Reading ${base}` : "Reading file...";
48388
+ } else {
48389
+ activity = "Reading file...";
48390
+ }
48391
+ } else if (/Edit\(/.test(stripped)) {
48392
+ const m = stripped.match(/Edit\(\s*~?([^\s)"']{8,})/);
48393
+ if (m) {
48394
+ const base = import_node_path8.default.basename(m[1]);
48395
+ activity = base.length >= 3 ? `Editing ${base}` : "Editing file...";
48396
+ } else {
48397
+ activity = "Editing file...";
48398
+ }
48399
+ } else if (/Bash\(/.test(stripped)) {
48400
+ const m = stripped.match(/Bash\(\s*(.{1,40})/);
48401
+ activity = m ? `Running: ${m[1].trim()}...` : "Running command...";
48402
+ } else if (/Explore\(/.test(stripped)) {
48403
+ const m = stripped.match(/Explore\(\s*(.{1,50})/);
48404
+ activity = m ? `Exploring: ${m[1].replace(/\).*/, "").trim()}` : "Exploring codebase...";
48405
+ } else if (/Task\(/.test(stripped)) {
48406
+ activity = "Running sub-agent...";
48407
+ } else if (/Sublimating|Thinking|Coalescing|Cultivating/.test(stripped)) {
48408
+ const m = stripped.match(/(\d+)s/);
48409
+ activity = m ? `Thinking... (${m[1]}s)` : "Thinking...";
48389
48410
  }
48390
- } else if (/Edit\(/.test(stripped)) {
48391
- const m = stripped.match(/Edit\(\s*~?([^\s)"']{8,})/);
48392
- if (m) {
48393
- const base = import_node_path8.default.basename(m[1]);
48394
- activity = base.length >= 3 ? `Editing ${base}` : "Editing file...";
48395
- } else {
48396
- activity = "Editing file...";
48411
+ if (activity && this.lastActivity.get(name) !== activity) {
48412
+ this.lastActivity.set(name, activity);
48413
+ this.log(`[${shortName}] ${activity}`);
48397
48414
  }
48398
- } else if (/Bash\(/.test(stripped)) {
48399
- const m = stripped.match(/Bash\(\s*(.{1,40})/);
48400
- activity = m ? `Running: ${m[1].trim()}...` : "Running command...";
48401
- } else if (/Explore\(/.test(stripped)) {
48402
- const m = stripped.match(/Explore\(\s*(.{1,50})/);
48403
- activity = m ? `Exploring: ${m[1].replace(/\).*/, "").trim()}` : "Exploring codebase...";
48404
- } else if (/Task\(/.test(stripped)) {
48405
- activity = "Running sub-agent...";
48406
- } else if (/Sublimating|Thinking|Coalescing|Cultivating/.test(stripped)) {
48407
- const m = stripped.match(/(\d+)s/);
48408
- activity = m ? `Thinking... (${m[1]}s)` : "Thinking...";
48409
- }
48410
- if (activity && this.lastActivity.get(name) !== activity) {
48411
- this.lastActivity.set(name, activity);
48412
- this.log(`[${shortName}] ${activity}`);
48413
- }
48414
- };
48415
- this.relay.onMessageReceived = (msg) => {
48416
- const body = msg.text.length > 120 ? msg.text.slice(0, 117) + "..." : msg.text;
48417
- const fromShort = msg.from.replace(/-[a-f0-9]{6,}$/, "");
48418
- const toShort = msg.to.replace(/-[a-f0-9]{6,}$/, "");
48419
- this.log(`[msg] ${fromShort} \u2192 ${toShort}: ${body}`);
48420
- };
48421
- this.relay.onAgentSpawned = (agent) => {
48422
- if (!this.activeAgentHandles.has(agent.name)) {
48423
- this.log(`[spawned] ${agent.name} (${agent.runtime})`);
48424
- }
48425
- };
48426
- this.relay.onAgentExited = (agent) => {
48427
- this.lastActivity.delete(agent.name);
48428
- this.lastIdleLog.delete(agent.name);
48429
- if (!this.activeAgentHandles.has(agent.name)) {
48430
- this.log(`[exited] ${agent.name} (code: ${agent.exitCode ?? "?"})`);
48415
+ };
48416
+ this.relay.onMessageReceived = (msg) => {
48417
+ const body = msg.text.length > 120 ? msg.text.slice(0, 117) + "..." : msg.text;
48418
+ const fromShort = msg.from.replace(/-[a-f0-9]{6,}$/, "");
48419
+ const toShort = msg.to.replace(/-[a-f0-9]{6,}$/, "");
48420
+ this.log(`[msg] ${fromShort} \u2192 ${toShort}: ${body}`);
48421
+ };
48422
+ this.relay.onAgentSpawned = (agent) => {
48423
+ if (!this.activeAgentHandles.has(agent.name)) {
48424
+ this.log(`[spawned] ${agent.name} (${agent.runtime})`);
48425
+ }
48426
+ };
48427
+ this.relay.onAgentExited = (agent) => {
48428
+ this.lastActivity.delete(agent.name);
48429
+ this.lastIdleLog.delete(agent.name);
48430
+ if (!this.activeAgentHandles.has(agent.name)) {
48431
+ this.log(`[exited] ${agent.name} (code: ${agent.exitCode ?? "?"})`);
48432
+ }
48433
+ };
48434
+ this.relay.onAgentIdle = ({ name, idleSecs }) => {
48435
+ const bucket = Math.floor(idleSecs / 30) * 30;
48436
+ if (bucket >= 30 && this.lastIdleLog.get(name) !== bucket) {
48437
+ this.lastIdleLog.set(name, bucket);
48438
+ const shortName = name.replace(/-[a-f0-9]{6,}$/, "");
48439
+ this.log(`[idle] ${shortName} silent for ${bucket}s`);
48440
+ }
48441
+ };
48442
+ this.relaycast = void 0;
48443
+ this.relaycastAgent = void 0;
48444
+ this.unsubBrokerStderr = this.relay.onBrokerStderr((line) => {
48445
+ console.log(`[broker] ${line}`);
48446
+ });
48447
+ this.log(`Creating channel: ${channel}...`);
48448
+ if (isResume) {
48449
+ await this.createAndJoinRelaycastChannel(channel);
48450
+ } else {
48451
+ await this.createAndJoinRelaycastChannel(channel, workflow2.description);
48431
48452
  }
48432
- };
48433
- this.relay.onAgentIdle = ({ name, idleSecs }) => {
48434
- const bucket = Math.floor(idleSecs / 30) * 30;
48435
- if (bucket >= 30 && this.lastIdleLog.get(name) !== bucket) {
48436
- this.lastIdleLog.set(name, bucket);
48437
- const shortName = name.replace(/-[a-f0-9]{6,}$/, "");
48438
- this.log(`[idle] ${shortName} silent for ${bucket}s`);
48453
+ this.log("Channel ready");
48454
+ if (isResume) {
48455
+ this.postToChannel(`Workflow **${workflow2.name}** resumed \u2014 ${pendingCount} pending steps`);
48456
+ } else {
48457
+ this.postToChannel(`Workflow **${workflow2.name}** started \u2014 ${workflow2.steps.length} steps, pattern: ${config3.swarm.pattern}`);
48439
48458
  }
48440
- };
48441
- this.relaycast = void 0;
48442
- this.relaycastAgent = void 0;
48443
- this.unsubBrokerStderr = this.relay.onBrokerStderr((line) => {
48444
- console.log(`[broker] ${line}`);
48445
- });
48446
- this.log(`Creating channel: ${channel}...`);
48447
- if (isResume) {
48448
- await this.createAndJoinRelaycastChannel(channel);
48449
- } else {
48450
- await this.createAndJoinRelaycastChannel(channel, workflow2.description);
48451
- }
48452
- this.log("Channel ready");
48453
- if (isResume) {
48454
- this.postToChannel(`Workflow **${workflow2.name}** resumed \u2014 ${pendingCount} pending steps`);
48455
- } else {
48456
- this.postToChannel(`Workflow **${workflow2.name}** started \u2014 ${workflow2.steps.length} steps, pattern: ${config3.swarm.pattern}`);
48457
48459
  }
48458
48460
  const agentMap = /* @__PURE__ */ new Map();
48459
48461
  for (const agent of config3.agents) {
@@ -48768,6 +48770,26 @@ ${trimmedOutput.slice(0, 200)}`);
48768
48770
  return value !== void 0 ? String(value) : _match;
48769
48771
  });
48770
48772
  try {
48773
+ if (this.executor?.executeDeterministicStep) {
48774
+ const result = await this.executor.executeDeterministicStep(step, resolvedCommand, this.cwd);
48775
+ const failOnError = step.failOnError !== false;
48776
+ if (failOnError && result.exitCode !== 0) {
48777
+ throw new Error(`Command failed with exit code ${result.exitCode}: ${result.output.slice(0, 500)}`);
48778
+ }
48779
+ const output2 = step.captureOutput !== false ? result.output : `Command completed (exit code ${result.exitCode})`;
48780
+ state.row.status = "completed";
48781
+ state.row.output = output2;
48782
+ state.row.completedAt = (/* @__PURE__ */ new Date()).toISOString();
48783
+ await this.db.updateStep(state.row.id, {
48784
+ status: "completed",
48785
+ output: output2,
48786
+ completedAt: state.row.completedAt,
48787
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
48788
+ });
48789
+ await this.persistStepOutput(runId, step.name, output2);
48790
+ this.emit({ type: "step:completed", runId, stepName: step.name, output: output2 });
48791
+ return;
48792
+ }
48771
48793
  const output = await new Promise((resolve3, reject) => {
48772
48794
  const child = (0, import_node_child_process3.spawn)("sh", ["-c", resolvedCommand], {
48773
48795
  stdio: "pipe",
@@ -49041,7 +49063,7 @@ ${trimmedOutput.slice(0, 200)}`);
49041
49063
  }
49042
49064
  this.log(`[${step.name}] Spawning agent "${agentDef.name}" (cli: ${agentDef.cli})`);
49043
49065
  const resolvedStep = { ...step, task: resolvedTask };
49044
- const output = await this.spawnAndWait(agentDef, resolvedStep, timeoutMs);
49066
+ const output = this.executor ? await this.executor.executeAgentStep(resolvedStep, agentDef, resolvedTask, timeoutMs) : await this.spawnAndWait(agentDef, resolvedStep, timeoutMs);
49045
49067
  this.log(`[${step.name}] Agent "${agentDef.name}" exited`);
49046
49068
  if (step.verification) {
49047
49069
  this.runVerification(step.verification, output, step.name, resolvedTask);
@@ -50334,7 +50356,8 @@ var WorkflowBuilder = class {
50334
50356
  const config3 = this.toConfig();
50335
50357
  const runner = new WorkflowRunner({
50336
50358
  cwd: options.cwd,
50337
- relay: options.relay
50359
+ relay: options.relay,
50360
+ executor: options.executor
50338
50361
  });
50339
50362
  const isDryRun = options.dryRun ?? !!process.env.DRY_RUN;
50340
50363
  if (isDryRun) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "3.1.6",
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.6",
178
- "@agent-relay/hooks": "3.1.6",
179
- "@agent-relay/sdk": "3.1.6",
180
- "@agent-relay/telemetry": "3.1.6",
181
- "@agent-relay/trajectory": "3.1.6",
182
- "@agent-relay/user-directory": "3.1.6",
183
- "@agent-relay/utils": "3.1.6",
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.6",
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.6",
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/config",
3
- "version": "3.1.6",
3
+ "version": "3.1.8",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "3.1.6",
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.6",
41
- "@agent-relay/trajectory": "3.1.6",
42
- "@agent-relay/sdk": "3.1.6"
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.6",
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.6"
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 { version } = require('../package.json');
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,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCb,CAAC,IAAI,EAAE,CAAC,CAAC;AACV,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAK/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACnB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,UAAoB,EACpB,KAA6B;IAE7B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,4DAA4D,CAC7D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/C,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAEzD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CACT,qBAAqB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,GAAG,EAAE,CAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAA6B;IACnD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;QAChC,EAAE,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,WAAW;QACX,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,QAAQ;QACR,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC;QACpC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC;KACzC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,KAA6B;IAClD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAA6B;IACrD,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,WAAW;QACX,SAAS;QACT,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAA6B;IAC1D,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;QACrB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;QACnB,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QACR,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,YAAY;YACf,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QACR,KAAK,eAAe;YAClB,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,UAAU,EAAE,CAAC;YACb,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
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. Prefers OPENCLAW_HOME env var. */
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,2BAA2B;IAC3B,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;CACxC;AAED,wEAAwE;AACxE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAoBjE;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
+ {"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
- /** Default OpenClaw config directory. Prefers OPENCLAW_HOME env var. */
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
- return process.env.OPENCLAW_HOME || join(homedir(), '.openclaw');
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
- const homeDir = openclawHome();
14
- const configPath = join(homeDir, 'openclaw.json');
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.