121 lines
4.0 KiB
JavaScript
121 lines
4.0 KiB
JavaScript
import { apiFetch } from "../api.mjs";
|
|
import { emit } from "../output.mjs";
|
|
import { t } from "../i18n.mjs";
|
|
|
|
function fmtTs(v) {
|
|
if (!v) return "-";
|
|
return new Date(typeof v === "number" ? v * 1000 : v).toLocaleString();
|
|
}
|
|
|
|
async function mcpCall(name, args) {
|
|
const res = await apiFetch("/api/mcp/tools/call", {
|
|
method: "POST",
|
|
body: { name, arguments: args },
|
|
});
|
|
if (!res.ok) {
|
|
process.stderr.write(`MCP error: ${res.status}\n`);
|
|
process.exit(1);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
const proxySchema = [
|
|
{ key: "host", header: "Host", width: 35 },
|
|
{ key: "type", header: "Type", width: 8 },
|
|
{ key: "region", header: "Region" },
|
|
{ key: "latencyMs", header: "Latency", formatter: (v) => (v ? `${v}ms` : "-") },
|
|
{
|
|
key: "successRate",
|
|
header: "Success%",
|
|
formatter: (v) => (v ? `${(v * 100).toFixed(0)}%` : "-"),
|
|
},
|
|
{ key: "lastUsed", header: "Last Used", formatter: fmtTs },
|
|
{ key: "state", header: "State" },
|
|
];
|
|
|
|
export function registerOneProxy(program) {
|
|
const op = program.command("oneproxy").description(t("oneproxy.description"));
|
|
|
|
op.command("status").action(async (opts, cmd) => {
|
|
const data = await mcpCall("omniroute_oneproxy_stats", {});
|
|
emit(data, cmd.optsWithGlobals());
|
|
});
|
|
|
|
op.command("stats")
|
|
.option("--provider <p>", t("oneproxy.stats.provider"))
|
|
.option("--period <p>", t("oneproxy.stats.period"), "24h")
|
|
.action(async (opts, cmd) => {
|
|
const data = await mcpCall("omniroute_oneproxy_stats", {
|
|
provider: opts.provider,
|
|
period: opts.period,
|
|
});
|
|
emit(data, cmd.optsWithGlobals());
|
|
});
|
|
|
|
op.command("fetch")
|
|
.description(t("oneproxy.fetch.description"))
|
|
.option("--count <n>", t("oneproxy.fetch.count"), parseInt, 1)
|
|
.option("--type <t>", t("oneproxy.fetch.type"), "http")
|
|
.action(async (opts, cmd) => {
|
|
const data = await mcpCall("omniroute_oneproxy_fetch", {
|
|
count: opts.count,
|
|
type: opts.type,
|
|
});
|
|
emit(data.proxies ?? data, cmd.optsWithGlobals(), proxySchema);
|
|
});
|
|
|
|
op.command("rotate")
|
|
.description(t("oneproxy.rotate.description"))
|
|
.option("--provider <p>", t("oneproxy.rotate.provider"))
|
|
.option("--connection-id <id>", t("oneproxy.rotate.connectionId"))
|
|
.action(async (opts, cmd) => {
|
|
const data = await mcpCall("omniroute_oneproxy_rotate", {
|
|
provider: opts.provider,
|
|
connectionId: opts.connectionId,
|
|
});
|
|
emit(data, cmd.optsWithGlobals());
|
|
});
|
|
|
|
const config = op.command("config").description(t("oneproxy.config.description"));
|
|
|
|
config.command("show").action(async (opts, cmd) => {
|
|
const res = await apiFetch("/api/settings/oneproxy");
|
|
if (!res.ok) {
|
|
process.stderr.write(`Error: ${res.status}\n`);
|
|
process.exit(1);
|
|
}
|
|
emit(await res.json(), cmd.optsWithGlobals());
|
|
});
|
|
|
|
config
|
|
.command("set")
|
|
.option("--enabled <b>", t("oneproxy.config.enabled"), (v) => v === "true")
|
|
.option("--pool-size <n>", t("oneproxy.config.poolSize"), parseInt)
|
|
.option("--provider-source <url>", t("oneproxy.config.providerSource"))
|
|
.option("--rotation-policy <p>", t("oneproxy.config.rotationPolicy"))
|
|
.action(async (opts, cmd) => {
|
|
const body = {};
|
|
for (const k of ["enabled", "poolSize", "providerSource", "rotationPolicy"]) {
|
|
if (opts[k] !== undefined) body[k] = opts[k];
|
|
}
|
|
const res = await apiFetch("/api/settings/oneproxy", { method: "PUT", body });
|
|
if (!res.ok) {
|
|
process.stderr.write(`Error: ${res.status}\n`);
|
|
process.exit(1);
|
|
}
|
|
emit(await res.json(), cmd.optsWithGlobals());
|
|
});
|
|
|
|
op.command("pool")
|
|
.description(t("oneproxy.pool.description"))
|
|
.action(async (opts, cmd) => {
|
|
const res = await apiFetch("/api/settings/oneproxy?include=pool");
|
|
if (!res.ok) {
|
|
process.stderr.write(`Error: ${res.status}\n`);
|
|
process.exit(1);
|
|
}
|
|
const data = await res.json();
|
|
emit(data.pool ?? data, cmd.optsWithGlobals(), proxySchema);
|
|
});
|
|
}
|