mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
* refactor(cli): remove legacy Qwen Code integration * refactor(qwen): remove deprecated Qwen OAuth provider * feat(cli): rebuild Qwen Code integration for upstream V4 * fix(qwen): clear stale CLI auth on reset * test(qwen): align retired provider coverage * fix(db): renumber qwen-cleanup migration 129 -> 130 release/v3.8.49 tip took slot 129 via #7843 (usage_history_codex_strong_identity, itself renumbered from 128 during the #7838/#7840 base-red cleanup) after this branch forked; renumber remove_unregistered_qwen_data to 130. Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com> --------- Co-authored-by: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com>
334 lines
9.1 KiB
TypeScript
334 lines
9.1 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
hasOmniRouteQwenCodeConfig,
|
|
mergeQwenCodeEnv,
|
|
mergeQwenCodeSettings,
|
|
removeQwenCodeEnv,
|
|
removeQwenCodeSettings,
|
|
} from "../../src/shared/services/qwenCodeConfig.ts";
|
|
|
|
test("writes the upstream V4 bare-array modelProviders contract without a secret", () => {
|
|
const settings = mergeQwenCodeSettings(
|
|
{},
|
|
{ baseUrl: "http://localhost:20128", model: "qwen/qwen3.8-max-preview" }
|
|
);
|
|
|
|
assert.deepEqual(settings.modelProviders, {
|
|
openai: [
|
|
{
|
|
id: "qwen/qwen3.8-max-preview",
|
|
name: "qwen/qwen3.8-max-preview (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://localhost:20128/v1",
|
|
},
|
|
],
|
|
});
|
|
assert.deepEqual(settings.security, { auth: { selectedType: "openai" } });
|
|
assert.deepEqual(settings.model, {
|
|
name: "qwen/qwen3.8-max-preview",
|
|
baseUrl: "http://localhost:20128/v1",
|
|
});
|
|
assert.equal(JSON.stringify(settings).includes("sk-secret"), false);
|
|
});
|
|
|
|
test("preserves user settings and unrelated provider entries", () => {
|
|
const existing = {
|
|
$version: 4,
|
|
mcpServers: { filesystem: { command: "npx" } },
|
|
security: { folderTrust: { enabled: true } },
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "gpt-4o",
|
|
name: "Personal OpenAI",
|
|
envKey: "OPENAI_API_KEY",
|
|
baseUrl: "https://api.openai.com/v1",
|
|
},
|
|
],
|
|
idealab: [
|
|
{
|
|
id: "ideal-model",
|
|
envKey: "IDEALAB_API_KEY",
|
|
baseUrl: "https://idealab.example/v1",
|
|
},
|
|
],
|
|
},
|
|
providerProtocol: { idealab: "openai" },
|
|
};
|
|
|
|
const settings = mergeQwenCodeSettings(existing, {
|
|
baseUrl: "https://omni.example/v1/",
|
|
model: "cx/gpt-5.6-sol",
|
|
modelName: "GPT-5.6 Sol",
|
|
});
|
|
|
|
assert.equal(settings.$version, 4);
|
|
assert.deepEqual(settings.mcpServers, existing.mcpServers);
|
|
assert.deepEqual(settings.providerProtocol, existing.providerProtocol);
|
|
assert.deepEqual(
|
|
(settings.modelProviders as Record<string, unknown>).idealab,
|
|
existing.modelProviders.idealab
|
|
);
|
|
assert.equal(
|
|
((settings.modelProviders as Record<string, unknown>).openai as unknown[]).length,
|
|
2
|
|
);
|
|
});
|
|
|
|
test("replaces only the managed entry and unwraps the reverted V5 provider shape", () => {
|
|
const settings = mergeQwenCodeSettings(
|
|
{
|
|
$version: 4,
|
|
modelProviders: {
|
|
openai: {
|
|
protocol: "openai",
|
|
models: [
|
|
{
|
|
id: "old-model",
|
|
name: "old-model (OmniRoute)",
|
|
envKey: "OPENAI_API_KEY",
|
|
baseUrl: "http://old-host/v1",
|
|
},
|
|
{
|
|
id: "personal-model",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
{ baseUrl: "http://new-host", model: "new-model" }
|
|
);
|
|
|
|
assert.deepEqual((settings.modelProviders as Record<string, unknown>).openai, [
|
|
{
|
|
id: "personal-model",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
{
|
|
id: "new-model",
|
|
name: "new-model (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://new-host/v1",
|
|
},
|
|
]);
|
|
});
|
|
|
|
test("migrates the removed integration's root-array shape without dropping other entries", () => {
|
|
const settings = mergeQwenCodeSettings(
|
|
{
|
|
modelProviders: [
|
|
{
|
|
id: "omniroute",
|
|
name: "OmniRoute",
|
|
authType: "openai",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://old/v1",
|
|
},
|
|
{
|
|
id: "personal-model",
|
|
name: "Personal model",
|
|
authType: "openai",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
],
|
|
selectedProvider: "omniroute",
|
|
},
|
|
{ baseUrl: "http://new", model: "new-model" }
|
|
);
|
|
|
|
assert.deepEqual((settings.modelProviders as Record<string, unknown>).openai, [
|
|
{
|
|
id: "personal-model",
|
|
name: "Personal model",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
{
|
|
id: "new-model",
|
|
name: "new-model (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://new/v1",
|
|
},
|
|
]);
|
|
assert.equal(settings.selectedProvider, undefined);
|
|
});
|
|
|
|
test("migrates matching legacy security.auth credentials out of settings.json", () => {
|
|
const settings = mergeQwenCodeSettings(
|
|
{
|
|
security: {
|
|
auth: {
|
|
selectedType: "openai",
|
|
apiKey: "sk-legacy-secret",
|
|
baseUrl: "http://omni-host/v1",
|
|
other: true,
|
|
},
|
|
},
|
|
model: { name: "old-model", temperature: 0.2 },
|
|
},
|
|
{ baseUrl: "http://omni-host", model: "new-model" }
|
|
);
|
|
|
|
assert.deepEqual(settings.security, {
|
|
auth: { selectedType: "openai", other: true },
|
|
});
|
|
assert.deepEqual(settings.model, {
|
|
name: "new-model",
|
|
baseUrl: "http://omni-host/v1",
|
|
temperature: 0.2,
|
|
});
|
|
assert.equal(JSON.stringify(settings).includes("sk-legacy-secret"), false);
|
|
});
|
|
|
|
test("detection is precise and does not claim arbitrary custom endpoints", () => {
|
|
assert.equal(
|
|
hasOmniRouteQwenCodeConfig({
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "custom-model",
|
|
name: "My custom provider",
|
|
envKey: "CUSTOM_API_KEY",
|
|
baseUrl: "https://custom.example/v1",
|
|
},
|
|
],
|
|
},
|
|
}),
|
|
false
|
|
);
|
|
|
|
assert.equal(
|
|
hasOmniRouteQwenCodeConfig({
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "custom-model",
|
|
name: "custom-model (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "https://omni.example/v1",
|
|
},
|
|
],
|
|
},
|
|
}),
|
|
true
|
|
);
|
|
});
|
|
|
|
test("env merge owns only OMNIROUTE_API_KEY and preserves all user keys", () => {
|
|
const original = [
|
|
"# user credentials",
|
|
"OPENAI_API_KEY=sk-openai",
|
|
"ANTHROPIC_API_KEY=sk-anthropic",
|
|
"GEMINI_API_KEY=sk-gemini",
|
|
"export OMNIROUTE_API_KEY=old-value",
|
|
"OMNIROUTE_API_KEY_BACKUP=keep-me",
|
|
"",
|
|
].join("\n");
|
|
|
|
const merged = mergeQwenCodeEnv(original, 'sk-new "quoted" value');
|
|
assert.match(merged, /^OPENAI_API_KEY=sk-openai$/m);
|
|
assert.match(merged, /^ANTHROPIC_API_KEY=sk-anthropic$/m);
|
|
assert.match(merged, /^GEMINI_API_KEY=sk-gemini$/m);
|
|
assert.match(merged, /^OMNIROUTE_API_KEY_BACKUP=keep-me$/m);
|
|
assert.match(merged, /^OMNIROUTE_API_KEY="sk-new \\"quoted\\" value"$/m);
|
|
assert.equal((merged.match(/^OMNIROUTE_API_KEY=/gm) || []).length, 1);
|
|
|
|
const removed = removeQwenCodeEnv(merged);
|
|
assert.doesNotMatch(removed, /^OMNIROUTE_API_KEY=/m);
|
|
assert.match(removed, /^OMNIROUTE_API_KEY_BACKUP=keep-me$/m);
|
|
assert.match(removed, /^OPENAI_API_KEY=sk-openai$/m);
|
|
});
|
|
|
|
test("reset removes only managed models and their active selection", () => {
|
|
const existing = mergeQwenCodeSettings(
|
|
{
|
|
ui: { theme: "dark" },
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "personal-model",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{ baseUrl: "http://omni-host", model: "managed-model" }
|
|
);
|
|
|
|
const reset = removeQwenCodeSettings(existing);
|
|
assert.deepEqual(reset.ui, { theme: "dark" });
|
|
assert.deepEqual((reset.modelProviders as Record<string, unknown>).openai, [
|
|
{
|
|
id: "personal-model",
|
|
envKey: "PERSONAL_API_KEY",
|
|
baseUrl: "https://personal.example/v1",
|
|
},
|
|
]);
|
|
assert.equal(reset.model, undefined);
|
|
assert.deepEqual(reset.security, { auth: { selectedType: "openai" } });
|
|
});
|
|
|
|
test("reset also removes matching deprecated security.auth credentials", () => {
|
|
const reset = removeQwenCodeSettings({
|
|
security: {
|
|
auth: {
|
|
selectedType: "openai",
|
|
apiKey: "sk-old-secret",
|
|
baseUrl: "http://omni-host/v1",
|
|
},
|
|
},
|
|
model: { name: "managed", baseUrl: "http://omni-host/v1" },
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "managed",
|
|
name: "managed (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://omni-host/v1",
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
assert.equal(reset.security, undefined);
|
|
assert.equal(reset.model, undefined);
|
|
assert.equal(JSON.stringify(reset).includes("sk-old-secret"), false);
|
|
});
|
|
|
|
test("reset removes matching deprecated auth when the selected model is unrelated", () => {
|
|
const reset = removeQwenCodeSettings({
|
|
security: {
|
|
auth: {
|
|
selectedType: "openai",
|
|
apiKey: "sk-old-secret",
|
|
baseUrl: "http://omni-host/v1",
|
|
},
|
|
},
|
|
model: { name: "some-other-model", baseUrl: "https://other.example/v1" },
|
|
modelProviders: {
|
|
openai: [
|
|
{
|
|
id: "managed",
|
|
name: "managed (OmniRoute)",
|
|
envKey: "OMNIROUTE_API_KEY",
|
|
baseUrl: "http://omni-host/v1",
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
assert.equal(reset.security, undefined);
|
|
assert.deepEqual(reset.model, {
|
|
name: "some-other-model",
|
|
baseUrl: "https://other.example/v1",
|
|
});
|
|
assert.equal(JSON.stringify(reset).includes("sk-old-secret"), false);
|
|
});
|