19.3 节点 Host 实现
19.3.1 Node Host 运行器(src/node-host/runner.ts)
src/node-host/runner.ts)启动流程
// src/node-host/runner.ts(简化)
export async function runNodeHost(opts: NodeHostRunOptions): Promise<void> {
// 1. 加载或创建配置
const config = await ensureNodeHostConfig();
const nodeId = opts.nodeId?.trim() || config.nodeId;
const displayName = opts.displayName?.trim()
|| config.displayName
|| await getMachineDisplayName();
// 2. 保存 Gateway 连接信息
const gateway: NodeHostGatewayConfig = {
host: opts.gatewayHost,
port: opts.gatewayPort,
tls: opts.gatewayTls ?? loadConfig().gateway?.tls?.enabled ?? false,
tlsFingerprint: opts.gatewayTlsFingerprint,
};
config.gateway = gateway;
await saveNodeHostConfig(config);
// 3. 解析浏览器代理配置
const browserProxy = resolveBrowserProxyConfig();
const browserProxyEnabled = browserProxy.enabled && resolvedBrowser.enabled;
// 4. 解析认证信息
const token = process.env.OPENCLAW_GATEWAY_TOKEN?.trim()
|| cfg.gateway?.auth?.token;
const password = process.env.OPENCLAW_GATEWAY_PASSWORD?.trim()
|| cfg.gateway?.auth?.password;
// 5. 确保 PATH 环境变量可用
const pathEnv = ensureNodePathEnv();
// 6. 创建 Gateway 客户端并连接
const client = new GatewayClient({
url: `${gateway.tls ? "wss" : "ws"}://${host}:${port}`,
token, password,
instanceId: nodeId,
clientName: GATEWAY_CLIENT_NAMES.NODE_HOST,
clientDisplayName: displayName,
mode: GATEWAY_CLIENT_MODES.NODE,
role: "node",
caps: ["system", ...(browserProxyEnabled ? ["browser"] : [])],
commands: [
"system.run", "system.which",
"system.execApprovals.get", "system.execApprovals.set",
...(browserProxyEnabled ? ["browser.proxy"] : []),
],
pathEnv,
deviceIdentity: loadOrCreateDeviceIdentity(),
onEvent: (evt) => {
if (evt.event !== "node.invoke.request") return;
const payload = coerceNodeInvokePayload(evt.payload);
if (!payload) return;
void handleInvoke(payload, client, skillBins);
},
// ...
});
client.start();
await new Promise(() => {}); // 永不 resolve——保持进程运行
}步骤
设计意图
声明能力与命令
事件监听
19.3.2 命令处理分发
system.which —— 二进制文件发现
browser.proxy —— 浏览器操作代理
19.3.3 system.run —— 安全的命令执行
安全层次
macOS 执行主机优先
白名单评估流程
命令执行
措施
实现
目的
环境变量安全
执行事件上报
19.3.4 节点配置(src/node-host/config.ts)
src/node-host/config.ts)配置结构
安全写入
自动初始化
19.3.5 CLI 与守护进程
两套 CLI
CLI 命令组
用途
入口文件
守护进程安装
操作系统
服务管理器
服务文件
本节小结
Last updated