mirror of
https://github.com/sune-org/sune.git
synced 2026-10-29 13:04:51 +00:00
This build was committed by a bot.
This commit is contained in:
@@ -7,6 +7,7 @@ html,body{overscroll-behavior-y:contain;font-family:'Assistant',sans-serif}
|
|||||||
.msg-avatar{font-size:16px}
|
.msg-avatar{font-size:16px}
|
||||||
.menu-card{position:fixed;z-index:60;min-width:12rem;border-radius:0.75rem;border:1px solid #e5e7eb;background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.08)}
|
.menu-card{position:fixed;z-index:60;min-width:12rem;border-radius:0.75rem;border:1px solid #e5e7eb;background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.08)}
|
||||||
.menu-item{width:100%;text-align:left;padding:.5rem .75rem;font-size:0.875rem;display:flex;align-items:center;gap:.5rem}
|
.menu-item{width:100%;text-align:left;padding:.5rem .75rem;font-size:0.875rem;display:flex;align-items:center;gap:.5rem}
|
||||||
|
.key-mask{-webkit-text-security:disc}
|
||||||
#attachBtn{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
|
#attachBtn{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
|
||||||
#htmlEditor,#extensionHtmlEditor,#jsonSchemaEditor{outline:none;white-space:pre!important;font-size:11px;line-height:1.5;}
|
#htmlEditor,#extensionHtmlEditor,#jsonSchemaEditor{outline:none;white-space:pre!important;font-size:11px;line-height:1.5;}
|
||||||
:not(pre)>code{font-size:85%;padding:.2em .4em;margin:0;border-radius:6px;background-color:rgba(175,184,193,0.2)}
|
:not(pre)>code{font-size:85%;padding:.2em .4em;margin:0;border-radius:6px;background-color:rgba(175,184,193,0.2)}
|
||||||
+21
-23
@@ -1,4 +1,4 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mediabunny-aac-encoder-CvIaGQWe.js","assets/src-DlKePj_l.js"])))=>i.map(i=>d[i]);
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mediabunny-aac-encoder-laB6T72z.js","assets/src-DlKePj_l.js"])))=>i.map(i=>d[i]);
|
||||||
import mathjax3 from "https://esm.sh/markdown-it-mathjax3@5.2.0";
|
import mathjax3 from "https://esm.sh/markdown-it-mathjax3@5.2.0";
|
||||||
//#region \0vite/modulepreload-polyfill.js
|
//#region \0vite/modulepreload-polyfill.js
|
||||||
(function polyfill() {
|
(function polyfill() {
|
||||||
@@ -109,7 +109,7 @@ var el = window.el = Object.fromEntries([
|
|||||||
"set_api_key_or",
|
"set_api_key_or",
|
||||||
"set_api_key_oai",
|
"set_api_key_oai",
|
||||||
"set_api_key_g",
|
"set_api_key_g",
|
||||||
"set_api_key_claude",
|
"set_api_key_ant",
|
||||||
"set_api_key_cf",
|
"set_api_key_cf",
|
||||||
"set_api_key_custom1",
|
"set_api_key_custom1",
|
||||||
"set_title_model",
|
"set_title_model",
|
||||||
@@ -331,7 +331,7 @@ var buildBody = () => {
|
|||||||
role: "system",
|
role: "system",
|
||||||
content: mPrompt
|
content: mPrompt
|
||||||
});
|
});
|
||||||
const modelName = SUNE.model.replace(/^(or:|oai:|g:|cla:)/, "").replace(/^[^/]*\//, "").replace(/(?::online|:free)+$/, "");
|
const modelName = SUNE.model.replace(/^(or:|oai:|g:|ant:)/, "").replace(/^[^/]*\//, "").replace(/(?::online|:free)+$/, "");
|
||||||
const sPrompt = (SUNE.system_prompt || "").trim().replaceAll("{{model_name}}", () => modelName);
|
const sPrompt = (SUNE.system_prompt || "").trim().replaceAll("{{model_name}}", () => modelName);
|
||||||
if (sPrompt) msgs.push({
|
if (sPrompt) msgs.push({
|
||||||
role: "system",
|
role: "system",
|
||||||
@@ -354,7 +354,7 @@ var buildBody = () => {
|
|||||||
if (last.role === "assistant" && last.content.length === 0 && (!last.images || last.images.length === 0)) msgs.pop();
|
if (last.role === "assistant" && last.content.length === 0 && (!last.images || last.images.length === 0)) msgs.pop();
|
||||||
}
|
}
|
||||||
const b = payloadWithSampling({
|
const b = payloadWithSampling({
|
||||||
model: SUNE.model.replace(/^(or:|oai:|g:|cla:)/, ""),
|
model: SUNE.model.replace(/^(or:|oai:|g:|ant:)/, ""),
|
||||||
messages: msgs,
|
messages: msgs,
|
||||||
stream: true
|
stream: true
|
||||||
});
|
});
|
||||||
@@ -548,8 +548,8 @@ function track(msg, tid, key) {
|
|||||||
}
|
}
|
||||||
function startReply(msg) {
|
function startReply(msg) {
|
||||||
const { USER, SUNE, state } = window;
|
const { USER, SUNE, state } = window;
|
||||||
const model = SUNE.model, provider = model.startsWith("oai:") ? "openai" : model.startsWith("g:") ? "google" : model.startsWith("cla:") ? "claude" : model.startsWith("or:") ? "openrouter" : USER.provider;
|
const model = SUNE.model, provider = model.startsWith("oai:") ? "openai" : model.startsWith("g:") ? "google" : model.startsWith("ant:") ? "anthropic" : model.startsWith("or:") ? "openrouter" : USER.provider;
|
||||||
const apiKey = provider === "openai" ? USER.apiKeyOpenAI : provider === "google" ? USER.apiKeyGoogle : provider === "claude" ? USER.apiKeyClaude : USER.apiKeyOpenRouter;
|
const apiKey = provider === "openai" ? USER.apiKeyOpenAI : provider === "google" ? USER.apiKeyGoogle : provider === "anthropic" ? USER.apiKeyAnthropic : USER.apiKeyOpenRouter;
|
||||||
const s = track(msg, state.currentThreadId, threadKey(state.currentThreadId));
|
const s = track(msg, state.currentThreadId, threadKey(state.currentThreadId));
|
||||||
if (!apiKey) {
|
if (!apiKey) {
|
||||||
msg.content[0].text = window.localDemoReply();
|
msg.content[0].text = window.localDemoReply();
|
||||||
@@ -663,7 +663,7 @@ var USER = {
|
|||||||
localStorage.setItem("provider", [
|
localStorage.setItem("provider", [
|
||||||
"openai",
|
"openai",
|
||||||
"google",
|
"google",
|
||||||
"claude"
|
"anthropic"
|
||||||
].includes(v) ? v : "openrouter");
|
].includes(v) ? v : "openrouter");
|
||||||
},
|
},
|
||||||
get apiKeyOpenRouter() {
|
get apiKeyOpenRouter() {
|
||||||
@@ -684,11 +684,11 @@ var USER = {
|
|||||||
set apiKeyGoogle(v) {
|
set apiKeyGoogle(v) {
|
||||||
localStorage.setItem("google_api_key", v || "");
|
localStorage.setItem("google_api_key", v || "");
|
||||||
},
|
},
|
||||||
get apiKeyClaude() {
|
get apiKeyAnthropic() {
|
||||||
return localStorage.getItem("claude_api_key") || "";
|
return localStorage.getItem("anthropic_api_key") || "";
|
||||||
},
|
},
|
||||||
set apiKeyClaude(v) {
|
set apiKeyAnthropic(v) {
|
||||||
localStorage.setItem("claude_api_key", v || "");
|
localStorage.setItem("anthropic_api_key", v || "");
|
||||||
},
|
},
|
||||||
get apiKeyCloudflare() {
|
get apiKeyCloudflare() {
|
||||||
return localStorage.getItem("cloudflare_api_key") || "";
|
return localStorage.getItem("cloudflare_api_key") || "";
|
||||||
@@ -698,13 +698,13 @@ var USER = {
|
|||||||
},
|
},
|
||||||
get apiKey() {
|
get apiKey() {
|
||||||
const p = this.provider;
|
const p = this.provider;
|
||||||
return p === "openai" ? this.apiKeyOpenAI : p === "google" ? this.apiKeyGoogle : p === "claude" ? this.apiKeyClaude : this.apiKeyOpenRouter;
|
return p === "openai" ? this.apiKeyOpenAI : p === "google" ? this.apiKeyGoogle : p === "anthropic" ? this.apiKeyAnthropic : this.apiKeyOpenRouter;
|
||||||
},
|
},
|
||||||
set apiKey(v) {
|
set apiKey(v) {
|
||||||
const p = this.provider;
|
const p = this.provider;
|
||||||
if (p === "openai") this.apiKeyOpenAI = v;
|
if (p === "openai") this.apiKeyOpenAI = v;
|
||||||
else if (p === "google") this.apiKeyGoogle = v;
|
else if (p === "google") this.apiKeyGoogle = v;
|
||||||
else if (p === "claude") this.apiKeyClaude = v;
|
else if (p === "anthropic") this.apiKeyAnthropic = v;
|
||||||
else this.apiKeyOpenRouter = v;
|
else this.apiKeyOpenRouter = v;
|
||||||
},
|
},
|
||||||
get masterPrompt() {
|
get masterPrompt() {
|
||||||
@@ -896,7 +896,7 @@ var loadMb = async () => {
|
|||||||
sampleRate: 48e3,
|
sampleRate: 48e3,
|
||||||
bitrate: AUDIO_BPS
|
bitrate: AUDIO_BPS
|
||||||
})) (await __vitePreload(async () => {
|
})) (await __vitePreload(async () => {
|
||||||
const { registerAacEncoder } = await import("./mediabunny-aac-encoder-CvIaGQWe.js");
|
const { registerAacEncoder } = await import("./mediabunny-aac-encoder-laB6T72z.js");
|
||||||
return { registerAacEncoder };
|
return { registerAacEncoder };
|
||||||
}, __vite__mapDeps([0,1]))).registerAacEncoder();
|
}, __vite__mapDeps([0,1]))).registerAacEncoder();
|
||||||
return mb = m;
|
return mb = m;
|
||||||
@@ -1202,7 +1202,7 @@ var SYSTEM_KEYS = new Set([
|
|||||||
"openrouter_api_key",
|
"openrouter_api_key",
|
||||||
"openai_api_key",
|
"openai_api_key",
|
||||||
"google_api_key",
|
"google_api_key",
|
||||||
"claude_api_key",
|
"anthropic_api_key",
|
||||||
"cloudflare_api_key",
|
"cloudflare_api_key",
|
||||||
"master_prompt",
|
"master_prompt",
|
||||||
"title_model",
|
"title_model",
|
||||||
@@ -2750,7 +2750,7 @@ function openAccountSettings() {
|
|||||||
el.set_api_key_or.value = USER.apiKeyOpenRouter || "";
|
el.set_api_key_or.value = USER.apiKeyOpenRouter || "";
|
||||||
el.set_api_key_oai.value = USER.apiKeyOpenAI || "";
|
el.set_api_key_oai.value = USER.apiKeyOpenAI || "";
|
||||||
el.set_api_key_g.value = USER.apiKeyGoogle || "";
|
el.set_api_key_g.value = USER.apiKeyGoogle || "";
|
||||||
el.set_api_key_claude.value = USER.apiKeyClaude || "";
|
el.set_api_key_ant.value = USER.apiKeyAnthropic || "";
|
||||||
el.set_api_key_cf.value = USER.apiKeyCloudflare || "";
|
el.set_api_key_cf.value = USER.apiKeyCloudflare || "";
|
||||||
el.set_api_key_custom1.value = USER.customKey1 || "";
|
el.set_api_key_custom1.value = USER.customKey1 || "";
|
||||||
el.set_api_key_custom1.value = USER.customKey1 || "";
|
el.set_api_key_custom1.value = USER.customKey1 || "";
|
||||||
@@ -2793,7 +2793,7 @@ $(el.accountSettingsForm).on("submit", (e) => {
|
|||||||
USER.apiKeyOpenRouter = String(el.set_api_key_or.value || "").trim();
|
USER.apiKeyOpenRouter = String(el.set_api_key_or.value || "").trim();
|
||||||
USER.apiKeyOpenAI = String(el.set_api_key_oai.value || "").trim();
|
USER.apiKeyOpenAI = String(el.set_api_key_oai.value || "").trim();
|
||||||
USER.apiKeyGoogle = String(el.set_api_key_g.value || "").trim();
|
USER.apiKeyGoogle = String(el.set_api_key_g.value || "").trim();
|
||||||
USER.apiKeyClaude = String(el.set_api_key_claude.value || "").trim();
|
USER.apiKeyAnthropic = String(el.set_api_key_ant.value || "").trim();
|
||||||
USER.apiKeyCloudflare = String(el.set_api_key_cf.value || "").trim();
|
USER.apiKeyCloudflare = String(el.set_api_key_cf.value || "").trim();
|
||||||
USER.customKey1 = String(el.set_api_key_custom1.value || "").trim();
|
USER.customKey1 = String(el.set_api_key_custom1.value || "").trim();
|
||||||
USER.masterPrompt = String(el.set_master_prompt.value || "").trim();
|
USER.masterPrompt = String(el.set_master_prompt.value || "").trim();
|
||||||
@@ -2808,10 +2808,8 @@ $(el.accountPanelAPI).on("click", (e) => {
|
|||||||
if (!b) return;
|
if (!b) return;
|
||||||
const i = document.getElementById(b.dataset.revealFor);
|
const i = document.getElementById(b.dataset.revealFor);
|
||||||
if (!i) return;
|
if (!i) return;
|
||||||
const p = i.type === "password";
|
b.innerHTML = `<i data-lucide="${i.classList.toggle("key-mask") ? "eye" : "eye-off"}" class="h-4 w-4"></i>`;
|
||||||
i.type = p ? "text" : "password";
|
icons();
|
||||||
b.querySelector("i").setAttribute("data-lucide", p ? "eye-off" : "eye");
|
|
||||||
lucide.createIcons();
|
|
||||||
});
|
});
|
||||||
el.accountTabGeneral.onclick = () => showAccountTab("General");
|
el.accountTabGeneral.onclick = () => showAccountTab("General");
|
||||||
el.accountTabAPI.onclick = () => showAccountTab("API");
|
el.accountTabAPI.onclick = () => showAccountTab("API");
|
||||||
@@ -2822,7 +2820,7 @@ el.exportAccountSettings.onclick = () => dl(`sune-account-${ts()}.json`, {
|
|||||||
apiKeyOpenRouter: USER.apiKeyOpenRouter,
|
apiKeyOpenRouter: USER.apiKeyOpenRouter,
|
||||||
apiKeyOpenAI: USER.apiKeyOpenAI,
|
apiKeyOpenAI: USER.apiKeyOpenAI,
|
||||||
apiKeyGoogle: USER.apiKeyGoogle,
|
apiKeyGoogle: USER.apiKeyGoogle,
|
||||||
apiKeyClaude: USER.apiKeyClaude,
|
apiKeyAnthropic: USER.apiKeyAnthropic,
|
||||||
apiKeyCloudflare: USER.apiKeyCloudflare,
|
apiKeyCloudflare: USER.apiKeyCloudflare,
|
||||||
customKey1: USER.customKey1,
|
customKey1: USER.customKey1,
|
||||||
masterPrompt: USER.masterPrompt,
|
masterPrompt: USER.masterPrompt,
|
||||||
@@ -2846,7 +2844,7 @@ el.importAccountSettingsInput.onchange = async (e) => {
|
|||||||
apiKeyOpenRouter: "apiKeyOR",
|
apiKeyOpenRouter: "apiKeyOR",
|
||||||
apiKeyOpenAI: "apiKeyOAI",
|
apiKeyOpenAI: "apiKeyOAI",
|
||||||
apiKeyGoogle: "apiKeyG",
|
apiKeyGoogle: "apiKeyG",
|
||||||
apiKeyClaude: "apiKeyClaude",
|
apiKeyAnthropic: "apiKeyAnthropic",
|
||||||
apiKeyCloudflare: "apiKeyCloudflare",
|
apiKeyCloudflare: "apiKeyCloudflare",
|
||||||
customKey1: "customKey1",
|
customKey1: "customKey1",
|
||||||
masterPrompt: "masterPrompt",
|
masterPrompt: "masterPrompt",
|
||||||
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/__vite-browser-external-ey8rhZ1c.js","assets/src-DlKePj_l.js"])))=>i.map(i=>d[i]);
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/__vite-browser-external-ey8rhZ1c.js","assets/src-DlKePj_l.js"])))=>i.map(i=>d[i]);
|
||||||
import { t as __vitePreload } from "./index-C29M682o.js";
|
import { t as __vitePreload } from "./index-CYlIx5yy.js";
|
||||||
import { CustomAudioEncoder, EncodedPacket, Logging, n as __require$1, r as __toESM, registerEncoder } from "./src-DlKePj_l.js";
|
import { CustomAudioEncoder, EncodedPacket, Logging, n as __require$1, r as __toESM, registerEncoder } from "./src-DlKePj_l.js";
|
||||||
//#region node_modules/@mediabunny/aac-encoder/dist/bundles/mediabunny-aac-encoder.mjs
|
//#region node_modules/@mediabunny/aac-encoder/dist/bundles/mediabunny-aac-encoder.mjs
|
||||||
/*!
|
/*!
|
||||||
Vendored
+6
-6
@@ -13,8 +13,8 @@
|
|||||||
<script defer src="https://unpkg.com/alpinejs@3.17.5/dist/cdn.min.js"></script>
|
<script defer src="https://unpkg.com/alpinejs@3.17.5/dist/cdn.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<script type="module" crossorigin src="/assets/index-C29M682o.js"></script>
|
<script type="module" crossorigin src="/assets/index-CYlIx5yy.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-DDqI2rlK.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-BcZbcl2R.css">
|
||||||
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
||||||
<body class="bg-white text-gray-900 selection:bg-black/10" x-data @click.window="if($event.target.closest('button')) haptic(); if(!document.getElementById('threadPopover').contains($event.target)&&!$event.target.closest('[data-thread-menu]')) hideThreadPopover(); if(!document.getElementById('sunePopover').contains($event.target)&&!$event.target.closest('[data-sune-menu]')) hideSunePopover(); if(!document.getElementById('userMenu').contains($event.target)&&!document.getElementById('userMenuBtn').contains($event.target)) document.getElementById('userMenu').classList.add('hidden')">
|
<body class="bg-white text-gray-900 selection:bg-black/10" x-data @click.window="if($event.target.closest('button')) haptic(); if(!document.getElementById('threadPopover').contains($event.target)&&!$event.target.closest('[data-thread-menu]')) hideThreadPopover(); if(!document.getElementById('sunePopover').contains($event.target)&&!$event.target.closest('[data-sune-menu]')) hideSunePopover(); if(!document.getElementById('userMenu').contains($event.target)&&!document.getElementById('userMenuBtn').contains($event.target)) document.getElementById('userMenu').classList.add('hidden')">
|
||||||
<div class="flex flex-col h-dvh max-h-dvh overflow-hidden">
|
<div class="flex flex-col h-dvh max-h-dvh overflow-hidden">
|
||||||
@@ -180,13 +180,13 @@
|
|||||||
<div class="px-4 py-3 border-b text-sm font-semibold flex items-center justify-between"><span>Model name</span><button type="button" onclick="modelHelp.close()" class="p-1 rounded hover:bg-gray-100" aria-label="Close"><svg viewBox="0 0 24 24" class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg></button></div>
|
<div class="px-4 py-3 border-b text-sm font-semibold flex items-center justify-between"><span>Model name</span><button type="button" onclick="modelHelp.close()" class="p-1 rounded hover:bg-gray-100" aria-label="Close"><svg viewBox="0 0 24 24" class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/></svg></button></div>
|
||||||
<div class="p-4 space-y-3 text-sm text-gray-700 [&_code]:text-xs [&_code]:bg-gray-100 [&_code]:rounded [&_code]:px-1 [&_code]:py-0.5 [&_a]:underline [&_a]:text-gray-900">
|
<div class="p-4 space-y-3 text-sm text-gray-700 [&_code]:text-xs [&_code]:bg-gray-100 [&_code]:rounded [&_code]:px-1 [&_code]:py-0.5 [&_a]:underline [&_a]:text-gray-900">
|
||||||
<p>The <b>Provider</b> selected in <b>Account Settings → General</b> is used, unless the model name starts with one of these prefixes:</p>
|
<p>The <b>Provider</b> selected in <b>Account Settings → General</b> is used, unless the model name starts with one of these prefixes:</p>
|
||||||
<div class="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1"><code>or:</code><span>OpenRouter</span><code>oai:</code><span>OpenAI</span><code>g:</code><span>Google</span><code>cla:</code><span>Claude</span></div>
|
<div class="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1"><code>or:</code><span>OpenRouter</span><code>oai:</code><span>OpenAI</span><code>g:</code><span>Google</span><code>ant:</code><span>Anthropic</span></div>
|
||||||
<p>After the prefix, write the model slug exactly the way that provider's API expects it:</p>
|
<p>After the prefix, write the model slug exactly the way that provider's API expects it:</p>
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<div><div class="font-medium">OpenRouter <span class="font-normal text-gray-400">· vendor/model</span></div><code>or:anthropic/claude-opus-5.5</code><div class="text-xs text-gray-500 mt-0.5">Browse slugs at <a href="https://openrouter.ai/models" target="_blank" rel="noopener">openrouter.ai/models</a></div></div>
|
<div><div class="font-medium">OpenRouter <span class="font-normal text-gray-400">· vendor/model</span></div><code>or:anthropic/claude-opus-5.5</code><div class="text-xs text-gray-500 mt-0.5">Browse slugs at <a href="https://openrouter.ai/models" target="_blank" rel="noopener">openrouter.ai/models</a></div></div>
|
||||||
<div><div class="font-medium">OpenAI</div><code>oai:gpt-6-sol</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://platform.openai.com/docs/models" target="_blank" rel="noopener">OpenAI models</a></div></div>
|
<div><div class="font-medium">OpenAI</div><code>oai:gpt-6-sol</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://platform.openai.com/docs/models" target="_blank" rel="noopener">OpenAI models</a></div></div>
|
||||||
<div><div class="font-medium">Google</div><code>g:gemini-3.8-flash</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://ai.google.dev/gemini-api/docs/models" target="_blank" rel="noopener">Gemini models</a></div></div>
|
<div><div class="font-medium">Google</div><code>g:gemini-3.8-flash</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://ai.google.dev/gemini-api/docs/models" target="_blank" rel="noopener">Gemini models</a></div></div>
|
||||||
<div><div class="font-medium">Claude</div><code>cla:claude-opus-5-5</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://docs.anthropic.com/en/docs/about-claude/models" target="_blank" rel="noopener">Claude models</a></div></div>
|
<div><div class="font-medium">Anthropic</div><code>ant:claude-opus-5-5</code><div class="text-xs text-gray-500 mt-0.5"><a href="https://docs.anthropic.com/en/docs/about-claude/models" target="_blank" rel="noopener">Claude models</a></div></div>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-xs text-gray-500">Tip: add <code>:online</code> to the end to enable web search, e.g. <code>g:gemini-3.8-flash:online</code>.</p>
|
<p class="text-xs text-gray-500">Tip: add <code>:online</code> to the end to enable web search, e.g. <code>g:gemini-3.8-flash:online</code>.</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -199,11 +199,11 @@
|
|||||||
<form id="accountSettingsForm" class="flex flex-col min-h-0 text-sm">
|
<form id="accountSettingsForm" class="flex flex-col min-h-0 text-sm">
|
||||||
<div class="border-b flex text-xs font-medium"><button type="button" id="accountTabGeneral" class="flex-1 py-2 px-3 text-center border-b-2 border-black">General</button><button type="button" id="accountTabAPI" class="flex-1 py-2 px-3 text-center border-b-2 border-transparent hover:border-gray-300">API</button><button type="button" id="accountTabUser" class="flex-1 py-2 px-3 text-center border-b-2 border-transparent hover:border-gray-300">User</button></div>
|
<div class="border-b flex text-xs font-medium"><button type="button" id="accountTabGeneral" class="flex-1 py-2 px-3 text-center border-b-2 border-black">General</button><button type="button" id="accountTabAPI" class="flex-1 py-2 px-3 text-center border-b-2 border-transparent hover:border-gray-300">API</button><button type="button" id="accountTabUser" class="flex-1 py-2 px-3 text-center border-b-2 border-transparent hover:border-gray-300">User</button></div>
|
||||||
<div id="accountPanelGeneral" class="p-4 space-y-4 overflow-y-auto">
|
<div id="accountPanelGeneral" class="p-4 space-y-4 overflow-y-auto">
|
||||||
<div><label class="block text-gray-700 font-medium mb-1">Provider</label><select id="set_provider" class="w-full rounded-xl border border-gray-300 px-3 py-2"><option value="openrouter">OpenRouter</option><option value="openai">OpenAI</option><option value="google">Google</option><option value="claude">Claude</option></select><p class="mt-1 text-xs text-gray-500">Or you can prefix model names with or:, oai:, g:, or cla: to override.</p></div>
|
<div><label class="block text-gray-700 font-medium mb-1">Provider</label><select id="set_provider" class="w-full rounded-xl border border-gray-300 px-3 py-2"><option value="openrouter">OpenRouter</option><option value="openai">OpenAI</option><option value="google">Google</option><option value="anthropic">Anthropic</option></select><p class="mt-1 text-xs text-gray-500">Or you can prefix model names with or:, oai:, g:, or ant: to override.</p></div>
|
||||||
<div><label class="block text-gray-700 font-medium mb-1">Master Prompt</label><textarea id="set_master_prompt" rows="6" class="w-full rounded-xl border border-gray-300 px-3 py-2" placeholder="Applies to all sunes on this device"></textarea><p class="mt-1 text-xs text-gray-500">Stored locally.</p></div>
|
<div><label class="block text-gray-700 font-medium mb-1">Master Prompt</label><textarea id="set_master_prompt" rows="6" class="w-full rounded-xl border border-gray-300 px-3 py-2" placeholder="Applies to all sunes on this device"></textarea><p class="mt-1 text-xs text-gray-500">Stored locally.</p></div>
|
||||||
<div><label class="block text-gray-700 font-medium mb-1">Model preference for titles</label><input id="set_title_model" type="text" class="w-full rounded-xl border border-gray-300 px-3 py-2" placeholder="or:google/gemma-3-12b-it"/><p class="mt-1 text-xs text-gray-500">Used for auto-generating thread titles.</p></div>
|
<div><label class="block text-gray-700 font-medium mb-1">Model preference for titles</label><input id="set_title_model" type="text" class="w-full rounded-xl border border-gray-300 px-3 py-2" placeholder="or:google/gemma-3-12b-it"/><p class="mt-1 text-xs text-gray-500">Used for auto-generating thread titles.</p></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="accountPanelAPI" class="p-4 overflow-y-auto hidden"><div class="grid grid-cols-2 gap-x-4 gap-y-4"><div><label class="block text-gray-700 font-medium mb-1">OpenRouter Key</label><div class="relative"><input id="set_api_key_or" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-or-..."><button type="button" data-reveal-for="set_api_key_or" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyOpenRouter</code></p></div><div><label class="block text-gray-700 font-medium mb-1">OpenAI Key</label><div class="relative"><input id="set_api_key_oai" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-..."><button type="button" data-reveal-for="set_api_key_oai" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyOpenAI</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Google Key</label><div class="relative"><input id="set_api_key_g" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="AIza..."><button type="button" data-reveal-for="set_api_key_g" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Gemini/Studio. Use: <code>USER.apiKeyGoogle</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Claude Key</label><div class="relative"><input id="set_api_key_claude" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-ant-..."><button type="button" data-reveal-for="set_api_key_claude" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyClaude</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Cloudflare Token</label><div class="relative"><input id="set_api_key_cf" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="..."><button type="button" data-reveal-for="set_api_key_cf" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Not used. Use: <code>USER.apiKeyCloudflare</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Custom Key 1</label><div class="relative"><input id="set_api_key_custom1" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="..."><button type="button" data-reveal-for="set_api_key_custom1" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.customKey1</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Github Token</label><div class="relative"><input id="set_gh_token" type="password" class="w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="ghp_..."><button type="button" data-reveal-for="set_gh_token" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.githubToken</code></p></div></div></div>
|
<div id="accountPanelAPI" class="p-4 overflow-y-auto hidden"><div class="grid grid-cols-2 gap-x-4 gap-y-4"><div><label class="block text-gray-700 font-medium mb-1">OpenRouter Key</label><div class="relative"><input id="set_api_key_or" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-or-..."><button type="button" data-reveal-for="set_api_key_or" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyOpenRouter</code></p></div><div><label class="block text-gray-700 font-medium mb-1">OpenAI Key</label><div class="relative"><input id="set_api_key_oai" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-..."><button type="button" data-reveal-for="set_api_key_oai" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyOpenAI</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Google Key</label><div class="relative"><input id="set_api_key_g" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="AIza..."><button type="button" data-reveal-for="set_api_key_g" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Gemini/Studio. Use: <code>USER.apiKeyGoogle</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Anthropic Key</label><div class="relative"><input id="set_api_key_ant" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="sk-ant-..."><button type="button" data-reveal-for="set_api_key_ant" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.apiKeyAnthropic</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Cloudflare Token</label><div class="relative"><input id="set_api_key_cf" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="..."><button type="button" data-reveal-for="set_api_key_cf" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Not used. Use: <code>USER.apiKeyCloudflare</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Custom Key 1</label><div class="relative"><input id="set_api_key_custom1" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="..."><button type="button" data-reveal-for="set_api_key_custom1" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.customKey1</code></p></div><div><label class="block text-gray-700 font-medium mb-1">Github Token</label><div class="relative"><input id="set_gh_token" type="text" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="key-mask w-full rounded-xl border border-gray-300 px-3 py-2 pr-10" placeholder="ghp_..."><button type="button" data-reveal-for="set_gh_token" class="absolute inset-y-0 right-0 px-3 flex items-center text-gray-400 hover:text-gray-600"><i data-lucide="eye" class="h-4 w-4"></i></button></div><p class="mt-1 text-xs text-gray-500">Use: <code>USER.githubToken</code></p></div></div></div>
|
||||||
<div id="accountPanelUser" class="p-4 space-y-4 overflow-y-auto hidden">
|
<div id="accountPanelUser" class="p-4 space-y-4 overflow-y-auto hidden">
|
||||||
<div class="flex items-center gap-4">
|
<div class="flex items-center gap-4">
|
||||||
<div class="relative"><img id="userAvatarPreview" class="h-16 w-16 rounded-full object-cover bg-gray-200"><button type="button" id="setUserAvatarBtn" class="absolute bottom-0 right-0 h-6 w-6 rounded-full bg-white border border-gray-300 flex items-center justify-center hover:bg-gray-100" aria-label="Edit photo"><i data-lucide="edit-3" class="h-3 w-3"></i></button></div>
|
<div class="relative"><img id="userAvatarPreview" class="h-16 w-16 rounded-full object-cover bg-gray-200"><button type="button" id="setUserAvatarBtn" class="absolute bottom-0 right-0 h-6 w-6 rounded-full bg-white border border-gray-300 flex items-center justify-center hover:bg-gray-100" aria-label="Edit photo"><i data-lucide="edit-3" class="h-3 w-3"></i></button></div>
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
if(!self.define){let e,s={};const n=(n,r)=>(n=new URL(n+".js",r).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(r,i)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(s[t])return;let l={};const o=e=>n(e,t),d={module:{uri:t},exports:l,require:o};s[t]=Promise.all(r.map(e=>d[e]||o(e))).then(e=>(i(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"index.html",revision:"b09884569756e24c7b0f0eb22339f95a"},{url:"assets/src-DlKePj_l.js",revision:null},{url:"assets/mediabunny-aac-encoder-CvIaGQWe.js",revision:null},{url:"assets/index-DDqI2rlK.css",revision:null},{url:"assets/index-C29M682o.js",revision:null},{url:"assets/__vite-browser-external-ey8rhZ1c.js",revision:null},{url:"appstore_content/✺.png",revision:"06dd8ca13016278fc47e9a226acdb7f9"},{url:"manifest.webmanifest",revision:"70d853d7dcb45ddd8488db46950b4b33"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
|
if(!self.define){let e,s={};const n=(n,r)=>(n=new URL(n+".js",r).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(r,i)=>{const t=e||("document"in self?document.currentScript.src:"")||location.href;if(s[t])return;let l={};const o=e=>n(e,t),c={module:{uri:t},exports:l,require:o};s[t]=Promise.all(r.map(e=>c[e]||o(e))).then(e=>(i(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"index.html",revision:"cbb5a4bb5021c4de3f94495ecf6d2fc4"},{url:"assets/src-DlKePj_l.js",revision:null},{url:"assets/mediabunny-aac-encoder-laB6T72z.js",revision:null},{url:"assets/index-CYlIx5yy.js",revision:null},{url:"assets/index-BcZbcl2R.css",revision:null},{url:"assets/__vite-browser-external-ey8rhZ1c.js",revision:null},{url:"appstore_content/✺.png",revision:"06dd8ca13016278fc47e9a226acdb7f9"},{url:"manifest.webmanifest",revision:"70d853d7dcb45ddd8488db46950b4b33"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
|
||||||
|
|||||||
Reference in New Issue
Block a user