mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-05-06 02:07:00 +00:00
## New Features - Combo Builder v2 wizard UI (multi-stage: Basics → Steps → Strategy → Review) - Combo Step Architecture Schema v2 (ComboModelStep, ComboRefStep, pinned accounts) - Composite Tiers system for tiered model routing with fallback chains - Model Capabilities Registry (unified resolver merging specs + registry + synced data) - Observability module (buildHealthPayload, buildTelemetryPayload, buildSessionsSummary) - Session & Quota Monitor panels on Health dashboard - Combo Health per-target analytics via resolveNestedComboTargets() - Combo Builder Options API (GET /api/combos/builder/options) ## Performance - Middleware lazy loading (apiAuth, db/settings, modelSyncScheduler) - E2E auth bypass mode (NEXT_PUBLIC_OMNIROUTE_E2E_MODE) ## Bug Fixes - P2C credential selection with quota headroom awareness - Fixed-account combo steps bypass model cooldowns/circuit breakers - Combo metrics per-target tracking (byTarget with executionKey) - Call logs schema expansion (7 new columns + composite index) - Quota monitor lifecycle enrichment (status, snapshots, summary) - Codex quota fetcher hardening ## Maintenance - DB migration 021 (combo_call_log_targets) - Combo CRUD normalization on read - Playwright config + build script improvements - OpenAPI spec version sync to 3.6.4 ## Tests - 16 new test suites + 12 existing test updates - 86 files changed, +8318 -1378 lines
74 lines
1.8 KiB
JavaScript
74 lines
1.8 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import path from "node:path";
|
|
import { pathToFileURL } from "node:url";
|
|
|
|
const originalEnv = {
|
|
NEXT_PUBLIC_OMNIROUTE_E2E_MODE: process.env.NEXT_PUBLIC_OMNIROUTE_E2E_MODE,
|
|
};
|
|
|
|
function restoreEnv() {
|
|
for (const [key, value] of Object.entries(originalEnv)) {
|
|
if (value === undefined) {
|
|
delete process.env[key];
|
|
} else {
|
|
process.env[key] = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
async function importFresh(modulePath) {
|
|
const url = pathToFileURL(path.resolve(modulePath)).href;
|
|
return import(`${url}?test=${Date.now()}-${Math.random().toString(16).slice(2)}`);
|
|
}
|
|
|
|
function makeRequest(pathname) {
|
|
return {
|
|
nextUrl: {
|
|
pathname,
|
|
protocol: "http:",
|
|
},
|
|
method: "GET",
|
|
cookies: {
|
|
get() {
|
|
return undefined;
|
|
},
|
|
},
|
|
headers: new Headers(),
|
|
url: `http://localhost:20128${pathname}`,
|
|
};
|
|
}
|
|
|
|
test.beforeEach(() => {
|
|
restoreEnv();
|
|
});
|
|
|
|
test.afterEach(() => {
|
|
restoreEnv();
|
|
});
|
|
|
|
test.after(() => {
|
|
restoreEnv();
|
|
});
|
|
|
|
test("proxy bypasses dashboard auth in Playwright e2e mode", async () => {
|
|
process.env.NEXT_PUBLIC_OMNIROUTE_E2E_MODE = "1";
|
|
|
|
const { proxy } = await importFresh("src/proxy.ts");
|
|
const response = await proxy(makeRequest("/dashboard/combos"));
|
|
|
|
assert.equal(response.status, 200);
|
|
assert.equal(response.headers.get("location"), null);
|
|
assert.ok(response.headers.get("x-request-id"));
|
|
});
|
|
|
|
test("proxy bypasses management API auth in Playwright e2e mode", async () => {
|
|
process.env.NEXT_PUBLIC_OMNIROUTE_E2E_MODE = "1";
|
|
|
|
const { proxy } = await importFresh("src/proxy.ts");
|
|
const response = await proxy(makeRequest("/api/combos"));
|
|
|
|
assert.equal(response.status, 200);
|
|
assert.equal(response.headers.get("location"), null);
|
|
assert.ok(response.headers.get("x-request-id"));
|
|
});
|