Three coordinated things:
1. Resolve the committed upstream/main merge conflicts. 94 files were
sitting with raw <<<<<<< HEAD ... >>>>>>> upstream/main blocks. Every
conflict had HanzoBot/Bot on HEAD and OpenClaw on upstream. Resolved
by keeping HEAD everywhere — 540 conflict blocks.
2. Rewrite remaining OpenClaw text refs.
OPENCLAW → HANZO_BOT
OpenClaw → HanzoBot (PascalCase type identifiers)
openclaw → bot (codebase convention — botToken,
botUsername etc.; avoids invalid
hyphenated JS identifiers)
openclaw[_]/openclaw[A-Z] → bot[_]/bot[A-Z] (compound)
ai.openclaw.x → ai.hanzo.bot.x (JVM package path)
3. Delete or rename openclaw-named file paths (116 of them). Dead
duplicates with a Bot-named canonical from the partial migration:
deleted. Otherwise renamed.
ai/openclaw/** → deleted (ai/hanzo/bot/** canonical)
Sources/OpenClaw*/ → deleted (Sources/Bot* canonical)
Tests/OpenClawIPCTests/ → deleted (Tests/BotIPCTests canonical)
OpenClawKit/ → deleted (BotKit canonical)
openclaw-tools.*.ts → deleted (bot-tools.*.ts canonical)
openclaw-root.ts etc. → deleted (bot-root.ts canonical)
types.openclaw.ts → deleted (types.bot.ts canonical)
extensions/*/openclaw.plugin.json → renamed hanzo-bot.plugin.json
docs/start/openclaw.md → renamed hanzo-bot.md (+ zh-CN)
docs/assets/openclaw-*.png, whatsapp-openclaw*.jpg → deleted
scripts/.../openclaw-* → deleted (bot/hanzo-bot parallels)
openclaw.mjs → deleted (hanzo-bot.mjs is package.bin)
Then patched 65 broken JS/TS import strings where hanzo-bot had ended
up inside an import path ('./types.hanzo-bot.js' → './types.bot.js'
etc., since the on-disk filename uses the brand-neutral bot- prefix).
Pre-existing lint debt cleaned up to get oxlint --type-aware to 0/0:
removed the dead i18n test that referenced a path no longer existing;
defined the missing DIDConfig and WalletConfig types in types.base.ts
(they were imported but never declared); dropped unused imports;
collapsed redundant type assertion and a tautological meta.bot lookup
that the openclaw→bot rename made redundant.
The a2ui.bundle.js generated artifact is kept at its pre-rebrand
contents — it gets regenerated by 'pnpm canvas:a2ui:bundle' from
sources I cannot rebuild in this commit; the source side is clean.
Verified: 0 occurrences of openclaw (case-insensitive) in tree source
content, 0 file or directory paths with openclaw in the name; oxlint
--type-aware src test reports 0/0.
3.7 KiB
summary, read_when, title
| summary | read_when | title |
|---|---|---|
| SSH tunnel setup for HanzoBot.app connecting to a remote gateway | Connecting the macOS app to a remote gateway over SSH | Remote Gateway Setup |
Running HanzoBot.app with a Remote Gateway
HanzoBot.app uses SSH tunneling to connect to a remote gateway. This guide shows you how to set it up.
Overview
flowchart TB
subgraph Client["Client Machine"]
direction TB
A["HanzoBot.app"]
B["ws://127.0.0.1:18789\n(local port)"]
T["SSH Tunnel"]
A --> B
B --> T
end
subgraph Remote["Remote Machine"]
direction TB
C["Gateway WebSocket"]
D["ws://127.0.0.1:18789"]
C --> D
end
T --> C
Quick Setup
Step 1: Add SSH Config
Edit ~/.ssh/config and add:
Host remote-gateway
HostName <REMOTE_IP> # e.g., 172.27.187.184
User <REMOTE_USER> # e.g., jefferson
LocalForward 18789 127.0.0.1:18789
IdentityFile ~/.ssh/id_rsa
Replace <REMOTE_IP> and <REMOTE_USER> with your values.
Step 2: Copy SSH Key
Copy your public key to the remote machine (enter password once):
ssh-copy-id -i ~/.ssh/id_rsa <REMOTE_USER>@<REMOTE_IP>
Step 3: Set Gateway Token
launchctl setenv BOT_GATEWAY_TOKEN "<your-token>"
Step 4: Start SSH Tunnel
ssh -N remote-gateway &
Step 5: Restart HanzoBot.app
# Quit HanzoBot.app (⌘Q), then reopen:
open /path/to/HanzoBot.app
The app will now connect to the remote gateway through the SSH tunnel.
Auto-Start Tunnel on Login
To have the SSH tunnel start automatically when you log in, create a Launch Agent.
Create the PLIST file
Save this as ~/Library/LaunchAgents/ai.hanzo.bot.ssh-tunnel.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>ai.hanzo.bot.ssh-tunnel</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/ssh</string>
<string>-N</string>
<string>remote-gateway</string>
</array>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Load the Launch Agent
launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.hanzo.bot.ssh-tunnel.plist
The tunnel will now:
- Start automatically when you log in
- Restart if it crashes
- Keep running in the background
Legacy note: remove any leftover com.hanzo-bot.ssh-tunnel LaunchAgent if present.
Troubleshooting
Check if tunnel is running:
ps aux | grep "ssh -N remote-gateway" | grep -v grep
lsof -i :18789
Restart the tunnel:
launchctl kickstart -k gui/$UID/ai.hanzo.bot.ssh-tunnel
Stop the tunnel:
launchctl bootout gui/$UID/ai.hanzo.bot.ssh-tunnel
How It Works
| Component | What It Does |
|---|---|
LocalForward 18789 127.0.0.1:18789 |
Forwards local port 18789 to remote port 18789 |
ssh -N |
SSH without executing remote commands (just port forwarding) |
KeepAlive |
Automatically restarts tunnel if it crashes |
RunAtLoad |
Starts tunnel when the agent loads |
HanzoBot.app connects to ws://127.0.0.1:18789 on your client machine. The SSH tunnel forwards that connection to port 18789 on the remote machine where the Gateway is running.