@gguf/claw
Version:
Multi-channel AI gateway with extensible messaging integrations
115 lines (113 loc) • 4.11 kB
JavaScript
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
import { r as detectBinary } from "./onboard-helpers-DbjfBSMX.js";
import { n as resolveWideAreaDiscoveryDomain } from "./widearea-dns-C8theOFh.js";
import { t as discoverGatewayBeacons } from "./bonjour-discovery-D_DQdYOE.js";
//#region src/commands/onboard-remote.ts
var onboard_remote_exports = /* @__PURE__ */ __exportAll({ promptRemoteGatewayConfig: () => promptRemoteGatewayConfig });
const DEFAULT_GATEWAY_URL = "ws://127.0.0.1:18789";
function pickHost(beacon) {
return beacon.host || beacon.tailnetDns || beacon.lanHost;
}
function buildLabel(beacon) {
const host = pickHost(beacon);
const port = beacon.port ?? beacon.gatewayPort ?? 18789;
return `${beacon.displayName ?? beacon.instanceName} (${host ? `${host}:${port}` : "host unknown"})`;
}
function ensureWsUrl(value) {
const trimmed = value.trim();
if (!trimmed) return DEFAULT_GATEWAY_URL;
return trimmed;
}
async function promptRemoteGatewayConfig(cfg, prompter) {
let selectedBeacon = null;
let suggestedUrl = cfg.gateway?.remote?.url ?? DEFAULT_GATEWAY_URL;
const hasBonjourTool = await detectBinary("dns-sd") || await detectBinary("avahi-browse");
const wantsDiscover = hasBonjourTool ? await prompter.confirm({
message: "Discover gateway on LAN (Bonjour)?",
initialValue: true
}) : false;
if (!hasBonjourTool) await prompter.note(["Bonjour discovery requires dns-sd (macOS) or avahi-browse (Linux).", "Docs: https://docs.openclaw.ai/gateway/discovery"].join("\n"), "Discovery");
if (wantsDiscover) {
const wideAreaDomain = resolveWideAreaDiscoveryDomain({ configDomain: cfg.discovery?.wideArea?.domain });
const spin = prompter.progress("Searching for gateways…");
const beacons = await discoverGatewayBeacons({
timeoutMs: 2e3,
wideAreaDomain
});
spin.stop(beacons.length > 0 ? `Found ${beacons.length} gateway(s)` : "No gateways found");
if (beacons.length > 0) {
const selection = await prompter.select({
message: "Select gateway",
options: [...beacons.map((beacon, index) => ({
value: String(index),
label: buildLabel(beacon)
})), {
value: "manual",
label: "Enter URL manually"
}]
});
if (selection !== "manual") {
const idx = Number.parseInt(String(selection), 10);
selectedBeacon = Number.isFinite(idx) ? beacons[idx] ?? null : null;
}
}
}
if (selectedBeacon) {
const host = pickHost(selectedBeacon);
const port = selectedBeacon.port ?? selectedBeacon.gatewayPort ?? 18789;
if (host) if (await prompter.select({
message: "Connection method",
options: [{
value: "direct",
label: `Direct gateway WS (${host}:${port})`
}, {
value: "ssh",
label: "SSH tunnel (loopback)"
}]
}) === "direct") suggestedUrl = `ws://${host}:${port}`;
else {
suggestedUrl = DEFAULT_GATEWAY_URL;
await prompter.note([
"Start a tunnel before using the CLI:",
`ssh -N -L 18789:127.0.0.1:18789 <user>@${host}${selectedBeacon.sshPort ? ` -p ${selectedBeacon.sshPort}` : ""}`,
"Docs: https://docs.openclaw.ai/gateway/remote"
].join("\n"), "SSH tunnel");
}
}
const urlInput = await prompter.text({
message: "Gateway WebSocket URL",
initialValue: suggestedUrl,
validate: (value) => String(value).trim().startsWith("ws://") || String(value).trim().startsWith("wss://") ? void 0 : "URL must start with ws:// or wss://"
});
const url = ensureWsUrl(String(urlInput));
const authChoice = await prompter.select({
message: "Gateway auth",
options: [{
value: "token",
label: "Token (recommended)"
}, {
value: "off",
label: "No auth"
}]
});
let token = cfg.gateway?.remote?.token ?? "";
if (authChoice === "token") token = String(await prompter.text({
message: "Gateway token",
initialValue: token,
validate: (value) => value?.trim() ? void 0 : "Required"
})).trim();
else token = "";
return {
...cfg,
gateway: {
...cfg.gateway,
mode: "remote",
remote: {
url,
token: token || void 0
}
}
};
}
//#endregion
export { promptRemoteGatewayConfig as n, onboard_remote_exports as t };