"`) stays visible in Settings so the user sees why it
// is gone, but it is never enabled, never offered in the picker and never the default. Unfreeze by
// deleting the field; the user's installed list is left alone, so the row comes back as it was.
@@ -317,9 +335,11 @@ function enabledEnginesList() { return allEngines().filter((e) => e.enabled); }
// and the "Pickβ¦" menu lists everything here.
function enabledLlms() { return enabledEnginesList().filter((e) => e.kind === "llm"); }
// A home URL for an LLM engine so we can open its web UI in the panel.
-// Each engine's `fav` field is the hostname; the home page is the root.
+// `home` overrides when the chat UI lives on a path (duck.ai, ya.ru/alisa);
+// otherwise each engine's `fav` field is the hostname and the home is its root.
function llmHomeUrl(engineId) {
const def = SEARCH_ENGINES[engineId];
+ if (def && def.home) return def.home;
if (def && def.fav) return "https://" + def.fav + "/";
// Custom engines fall back to the origin of their URL template.
const custom = (settings.customEngines || []).find((e) => e.id === engineId);
@@ -741,13 +761,17 @@ function loadSettings() {
settings.searchEngine = enabled.find((x) => !isFrozen(x)) || DEFAULT_ENABLED[0];
}
} catch (e) { console.warn("engine normalize:", e?.message); }
- // One-time LLM-engine offer (0.3.101): three new account-gated LLMs were
- // added to DEFAULT_ENABLED, but an existing profile's enabledEngines is
- // already set so the fresh default doesn't take effect. Add each one the
- // first time this upgrade runs; `enginesOffered` remembers it so a user
- // who disables one keeps it disabled across restarts.
+ // One-time LLM-engine offer: new engines ride on top of DEFAULT_ENABLED but an
+ // existing profile's enabledEngines is already set, so a fresh default alone
+ // never takes effect. Each id appears here once; `enginesOffered` remembers
+ // every offer so a user who disables one keeps it disabled across restarts,
+ // and so adding another engine next release won't re-offer the old ones.
+ // β’ 0.3.101 β chatgpt, grok, gemini
+ // β’ 0.3.119 β duckai (anonymous, no sign-up), alisa (Yandex),
+ // qwen (Alibaba, email sign-up β strongest non-mainland-phone
+ // access to a Chinese LLM)
try {
- const OFFER = ["chatgpt", "grok", "gemini"];
+ const OFFER = ["chatgpt", "grok", "gemini", "duckai", "alisa", "qwen"];
const offered = Array.isArray(settings.enginesOffered) ? settings.enginesOffered.slice() : [];
let changed = false;
for (const id of OFFER) {
@@ -758,6 +782,14 @@ function loadSettings() {
}
if (changed) settings.enginesOffered = offered;
} catch (e) { console.warn("engines offer:", e?.message); }
+ // Phind was marked frozen in 0.3.118 (its Vercel 404s), so if the user's
+ // saved default LLM was phind the sidebar strip falls through to list[0] β
+ // which, under the pre-0.3.119 ordering, happened to be Perplexity. The
+ // 0.3.119 reorder puts ChatGPT at list[0] instead, so clearing the stale
+ // pointer makes the fallback resolve to ChatGPT (currently the single most
+ // popular chat UI) rather than silently flipping their choice.
+ try { if (settings.defaultLlmId && isFrozen(settings.defaultLlmId)) settings.defaultLlmId = null; }
+ catch (e) { console.warn("defaultLlmId migrate:", e?.message); }
// Quick-links default set changed in 0.3.70: drop Messenger + Spotify and
// reorder to Telegram, WhatsApp, X, YouTube. Users who kept the previous
// untouched default (same 6 ids, same order) move to the new set; any
@@ -1372,9 +1404,16 @@ small{color:#b98b92}code{font:12px ui-monospace,monospace;word-break:break-all}<
To decide for yourself, type ${esc(host)} in the address bar: Theseus shows the full warning there, with the option to continue where one exists.