mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-14 19:02:17 +03:00
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host. Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean. Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
import { apiFetch } from "../api.mjs";
|
|
import { t } from "../i18n.mjs";
|
|
import { emit } from "../output.mjs";
|
|
|
|
const statusSchema = [
|
|
{ key: "feed", header: "Feed" },
|
|
{ key: "available", header: "Available" },
|
|
{ key: "version", header: "Version" },
|
|
{ key: "tier", header: "Tier" },
|
|
{ key: "fetchedAt", header: "Fetched" },
|
|
];
|
|
|
|
const syncSchema = [
|
|
{ key: "feed", header: "Feed" },
|
|
{ key: "status", header: "Status" },
|
|
{ key: "version", header: "Version" },
|
|
{ key: "reason", header: "Reason" },
|
|
];
|
|
|
|
function exitCodeFor(response) {
|
|
return Number.isInteger(response.exitCode) ? response.exitCode : response.status === 401 ? 4 : 1;
|
|
}
|
|
|
|
export async function runRadarStatusCommand(opts = {}) {
|
|
const response = await apiFetch("/api/radar/status", { acceptNotOk: true });
|
|
if (!response.ok) return exitCodeFor(response);
|
|
const data = await response.json();
|
|
if (opts.output === "json") {
|
|
emit(data, opts);
|
|
return 0;
|
|
}
|
|
const rows = Object.entries(data.feeds ?? {}).map(([feed, value]) => ({
|
|
feed,
|
|
...(value && typeof value === "object" ? value : { available: false }),
|
|
}));
|
|
emit(rows, opts, statusSchema);
|
|
return 0;
|
|
}
|
|
|
|
export async function runRadarSyncCommand(opts = {}) {
|
|
const response = await apiFetch("/api/radar/sync-all", {
|
|
method: "POST",
|
|
body: {},
|
|
acceptNotOk: true,
|
|
});
|
|
if (!response.ok) return exitCodeFor(response);
|
|
const data = await response.json();
|
|
if (opts.output === "json") {
|
|
emit(data, opts);
|
|
return 0;
|
|
}
|
|
const rows = Object.entries(data).map(([feed, value]) => ({
|
|
feed,
|
|
...(value && typeof value === "object" ? value : { status: "error" }),
|
|
}));
|
|
emit(rows, opts, syncSchema);
|
|
return 0;
|
|
}
|
|
|
|
export function registerRadar(program) {
|
|
const radar = program.command("radar").description(t("radar.description"));
|
|
radar
|
|
.command("status")
|
|
.description(t("radar.status"))
|
|
.action(async (_opts, command) => {
|
|
const code = await runRadarStatusCommand(command.optsWithGlobals());
|
|
if (code !== 0) process.exitCode = code;
|
|
});
|
|
radar
|
|
.command("sync")
|
|
.description(t("radar.sync"))
|
|
.action(async (_opts, command) => {
|
|
const code = await runRadarSyncCommand(command.optsWithGlobals());
|
|
if (code !== 0) process.exitCode = code;
|
|
});
|
|
}
|