openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
68 lines (67 loc) • 2.23 kB
JavaScript
import { F as resolveTimerTimeoutMs } from "./number-coercion-CLj0HTDM.js";
import { r as runCommandWithTimeout } from "./exec-BIE-3oLG.js";
//#region src/system-agent/probes.ts
const LOCAL_COMMAND_PROBE_OUTPUT_MAX_CHARS = 16384;
/** Probe a command by running a small version command with bounded output and timeout. */
async function probeLocalCommand(command, args = ["--version"], opts = {}) {
const timeoutMs = resolveTimerTimeoutMs(opts.timeoutMs, 1500);
const outputLimit = opts.outputLimit ?? LOCAL_COMMAND_PROBE_OUTPUT_MAX_CHARS;
try {
const result = await runCommandWithTimeout([command, ...args], {
killProcessTree: true,
maxOutputBytes: outputLimit,
timeoutMs
});
if (result.termination === "timeout") return {
command,
found: true,
error: `timed out after ${timeoutMs}ms`,
timedOut: true
};
const text = `${result.stdout}\n${result.stderr}`.trim().split(/\r?\n/)[0]?.trim();
return {
command,
found: result.code === 0 || Boolean(text),
version: text || void 0,
error: result.code === 0 ? void 0 : `exited ${String(result.code)}`
};
} catch (error) {
const spawnError = error;
return {
command,
found: spawnError.code !== "ENOENT",
error: spawnError.code === "ENOENT" ? "not found" : spawnError.message
};
}
}
/** Probe a Gateway URL by translating it to its HTTP /healthz endpoint. */
async function probeGatewayUrl(url, opts = {}) {
const httpUrl = url.replace(/^ws:/, "http:").replace(/^wss:/, "https:");
const healthUrl = new URL("/healthz", httpUrl).toString();
const timeoutMs = resolveTimerTimeoutMs(opts.timeoutMs, 900);
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), timeoutMs);
let response;
try {
response = await fetch(healthUrl, {
method: "GET",
signal: controller.signal
});
return {
reachable: response.ok,
url,
error: response.ok ? void 0 : response.statusText
};
} catch (err) {
return {
reachable: false,
url,
error: err instanceof Error ? err.message : String(err)
};
} finally {
clearTimeout(timeout);
await response?.body?.cancel().catch(() => void 0);
}
}
//#endregion
export { probeLocalCommand as n, probeGatewayUrl as t };