Show build date next to "Settings" heading
Inject a yyyy-mm-dd_hh:mm timestamp at build time via Vite's `define` (app/vite.config.ts: __BUILD_DATE__, computed fresh on every `vite build`/`vite dev` invocation) and render it next to the Settings panel's title, so it's easy to tell which build is deployed. - app/vite.config.ts: buildDateString() + define.__BUILD_DATE__ - app/src/vite-env.d.ts: ambient declaration for the injected constant - app/src/components/SettingsPanel.tsx: render it next to "Settings" - app/src/styles.css: .build-date styling Rebuilt and redeployed to the repo root.
This commit is contained in:
1 parent
ea1aeed1da
commit
b2bee03ca2
8 files changed
+29
-6
No files matched your search
@@ -24,7 +24,9 @@ export function SettingsPanel() {
|
|||||||
<div className="panel" onClick={() => setShowSettings(false)}>
|
<div className="panel" onClick={() => setShowSettings(false)}>
|
||||||
<div className="panel-inner" onClick={(e) => e.stopPropagation()}>
|
<div className="panel-inner" onClick={(e) => e.stopPropagation()}>
|
||||||
<div className="panel-head">
|
<div className="panel-head">
|
||||||
<h2>Settings</h2>
|
<h2>
|
||||||
|
Settings <span className="build-date">{__BUILD_DATE__}</span>
|
||||||
|
</h2>
|
||||||
<button className="icon-btn" onClick={() => setShowSettings(false)}>
|
<button className="icon-btn" onClick={() => setShowSettings(false)}>
|
||||||
<CloseIcon width={20} height={20} />
|
<CloseIcon width={20} height={20} />
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1087,6 +1087,13 @@ select:focus {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.panel-head .build-date {
|
||||||
|
font-size: 11.5px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--text-faint);
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
.panel-head .icon-btn {
|
.panel-head .icon-btn {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
/** Injected by `vite.config.ts` via `define` — set to the build/dev-server start time. */
|
||||||
|
declare const __BUILD_DATE__: string;
|
||||||
@@ -4,6 +4,13 @@ import { defineConfig, loadEnv, type Plugin } from "vite";
|
|||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
import { VitePWA } from "vite-plugin-pwa";
|
import { VitePWA } from "vite-plugin-pwa";
|
||||||
|
|
||||||
|
/** `yyyy-mm-dd_hh:mm` timestamp of this build/dev-server start, shown in the UI. */
|
||||||
|
function buildDateString(): string {
|
||||||
|
const d = new Date();
|
||||||
|
const pad = (n: number) => String(n).padStart(2, "0");
|
||||||
|
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}_${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
||||||
|
}
|
||||||
|
|
||||||
/** Emits the repo's LICENSE file into the build output. */
|
/** Emits the repo's LICENSE file into the build output. */
|
||||||
function licensePlugin(): Plugin {
|
function licensePlugin(): Plugin {
|
||||||
return {
|
return {
|
||||||
@@ -27,6 +34,9 @@ export default defineConfig(({ mode }) => {
|
|||||||
const target = env.HERMES_DEV_TARGET;
|
const target = env.HERMES_DEV_TARGET;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
define: {
|
||||||
|
__BUILD_DATE__: JSON.stringify(buildDateString()),
|
||||||
|
},
|
||||||
server: {
|
server: {
|
||||||
port: 5173,
|
port: 5173,
|
||||||
proxy: target
|
proxy: target
|
||||||
|
|||||||
@@ -57,4 +57,4 @@ Error generating stack: `+i.message+`
|
|||||||
`)){if(!z||z.startsWith(":"))continue;const m=z.indexOf(":"),f=m===-1?z:z.slice(0,m);let v=m===-1?"":z.slice(m+1);v.startsWith(" ")&&(v=v.slice(1)),f==="event"?d=v:f==="data"&&y.push(v)}if(!y.length)return;const g=y.join(`
|
`)){if(!z||z.startsWith(":"))continue;const m=z.indexOf(":"),f=m===-1?z:z.slice(0,m);let v=m===-1?"":z.slice(m+1);v.startsWith(" ")&&(v=v.slice(1)),f==="event"?d=v:f==="data"&&y.push(v)}if(!y.length)return;const g=y.join(`
|
||||||
`);if(g==="[DONE]"){n("done",{});return}let x=g;try{x=JSON.parse(g)}catch{}n(d,x)};try{for(;;){const{done:h,value:d}=await o.read();if(h)break;a+=s.decode(d,{stream:!0});let y;for(;(y=a.indexOf(`
|
`);if(g==="[DONE]"){n("done",{});return}let x=g;try{x=JSON.parse(g)}catch{}n(d,x)};try{for(;;){const{done:h,value:d}=await o.read();if(h)break;a+=s.decode(d,{stream:!0});let y;for(;(y=a.indexOf(`
|
||||||
|
|
||||||
`))!==-1;){const g=a.slice(0,y);a=a.slice(y+2),c(g)}}a.trim()&&c(a)}finally{(p=o.releaseLock)==null||p.call(o)}}}const io=2,Rt={connections:[],activeConnectionId:null,speakReplies:!1,ttsVoice:"",showToolCalls:!1,showReasoning:!1,showSystem:!0,transcribeUrl:"",transcribeKey:"",transcribeModel:"whisper-1",mediaBaseUrl:"",mediaPathPrefix:"",prefsVersion:io},Xc="hermes.config.v2";function dh(){try{const e=localStorage.getItem(Xc);if(!e)return{...Rt};const t=JSON.parse(e),n={...Rt,...t,connections:Array.isArray(t.connections)?t.connections:[]};return(t.prefsVersion??1)<io&&(n.showToolCalls=Rt.showToolCalls,n.showReasoning=Rt.showReasoning,n.showSystem=Rt.showSystem,n.prefsVersion=io),n}catch{return{...Rt}}}function Mr(e){localStorage.setItem(Xc,JSON.stringify(e))}function Qn(e){return e.connections.length?e.connections.find(t=>t.id===e.activeConnectionId)??e.connections[0]??null:null}function ph(e){const t=Qn(e);return!!t&&(t.sameOrigin===!0||t.baseUrl.trim().length>0)}function hh(){return`conn-${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}let Rn=null;function mh(e){return new Gc({baseUrl:e.baseUrl,apiKey:e.apiKey,profile:e.profile,sameOrigin:e.sameOrigin,customHeaders:e.customHeaders})}function Ve(e){return e instanceof Wn||e instanceof Error?e.message:String(e)}function rt(e,t,n){return e.map(r=>r.id===t?n(r):r)}const j=uh()((e,t)=>({config:{...Rt},client:null,ready:!1,connectionError:null,capabilities:null,models:[],sessions:[],sessionsLoading:!1,searchQuery:"",activeSessionId:null,session:null,messages:[],sessionLoading:!1,streaming:!1,runId:null,streamError:null,steerLeftover:null,sidebarOpen:!1,showSettings:!1,toast:null,async bootstrap(){const n=dh();e({config:n,ready:!0}),Qn(n)&&await t().connect()},async saveConnection(n){const r=t().config,i=r.connections.some(s=>s.id===n.id)?r.connections.map(s=>s.id===n.id?n:s):[...r.connections,n],o={...r,connections:i,activeConnectionId:n.id};Mr(o),e({config:o}),await t().connect()},async removeConnection(n){var s;const r=t().config,l=r.connections.filter(a=>a.id!==n),i=r.activeConnectionId===n?((s=l[0])==null?void 0:s.id)??null:r.activeConnectionId,o={...r,connections:l,activeConnectionId:i};Mr(o),e({config:o,sessions:[],session:null,messages:[],activeSessionId:null}),Qn(o)&&await t().connect()},async setActiveConnection(n){const r={...t().config,activeConnectionId:n};Mr(r),e({config:r,sessions:[],session:null,messages:[],activeSessionId:null}),await t().connect()},updatePrefs(n){const r={...t().config,...n};Mr(r),e({config:r})},async connect(){const n=Qn(t().config);if(!n||!n.sameOrigin&&!n.baseUrl.trim())return;const r=mh(n);e({client:r,connectionError:null,capabilities:null});try{const l=await r.capabilities();e({capabilities:l}),r.models().then(i=>e({models:i})).catch(()=>{}),await t().loadSessions()}catch(l){e({connectionError:Ve(l),capabilities:null})}},async loadSessions(){const{client:n,searchQuery:r}=t();if(n){e({sessionsLoading:!0});try{const l=await n.listSessions({limit:200}),i=r.trim().toLowerCase(),o=i?l.filter(s=>s.title.toLowerCase().includes(i)):l;e({sessions:o,sessionsLoading:!1})}catch(l){e({sessionsLoading:!1,toast:Ve(l)})}}},setSearch(n){e({searchQuery:n}),t().loadSessions()},async openSession(n){const{client:r}=t();if(r){e({activeSessionId:n,sessionLoading:!0,session:null,messages:[],sidebarOpen:!1,streamError:null});try{const[l,i]=await Promise.all([r.getSession(n).catch(()=>null),r.getMessages(n,{limit:500,order:"oldest"})]);e({session:l??{id:n,title:"Untitled"},messages:i,sessionLoading:!1})}catch(l){e({sessionLoading:!1,toast:Ve(l)})}}},async newSession(){const{client:n}=t();if(n)try{const r=await n.createSession();e({session:r,messages:[],activeSessionId:r.id,sidebarOpen:!1,streamError:null}),await t().loadSessions()}catch(r){e({toast:Ve(r)})}},async renameSession(n,r){var i;const{client:l}=t();if(l)try{await l.updateSession(n,{title:r}),e({sessions:t().sessions.map(o=>o.id===n?{...o,title:r}:o),session:((i=t().session)==null?void 0:i.id)===n?{...t().session,title:r}:t().session})}catch(o){e({toast:Ve(o)})}},async deleteSession(n){const{client:r}=t();if(r)try{await r.deleteSession(n);const l=t().activeSessionId===n;e({sessions:t().sessions.filter(i=>i.id!==n),...l?{activeSessionId:null,session:null,messages:[]}:{}})}catch(l){e({toast:Ve(l)})}},async forkSession(n){const{client:r}=t();if(r)try{const l=await r.forkSession(n);await t().loadSessions(),await t().openSession(l.id)}catch(l){e({toast:Ve(l)})}},async send(n,r){const{client:l,activeSessionId:i,messages:o}=t();if(!l||!i)return;const s=n.trim();if(!s&&!(r!=null&&r.length)||t().streaming)return;const a={id:`local-user-${Date.now()}`,role:"user",content:s,attachments:r,timestamp:Date.now()},c=`local-assistant-${Date.now()}`,p={id:c,role:"assistant",content:"",timestamp:Date.now(),streaming:!0,toolCalls:[]};e({messages:[...o,a,p],streaming:!0,streamError:null,runId:null});let h=s;if(r!=null&&r.length){const d=[];s&&d.push({type:"text",text:s});for(const y of r)d.pu
Line truncated
|
`))!==-1;){const g=a.slice(0,y);a=a.slice(y+2),c(g)}}a.trim()&&c(a)}finally{(p=o.releaseLock)==null||p.call(o)}}}const io=2,Rt={connections:[],activeConnectionId:null,speakReplies:!1,ttsVoice:"",showToolCalls:!1,showReasoning:!1,showSystem:!0,transcribeUrl:"",transcribeKey:"",transcribeModel:"whisper-1",mediaBaseUrl:"",mediaPathPrefix:"",prefsVersion:io},Xc="hermes.config.v2";function dh(){try{const e=localStorage.getItem(Xc);if(!e)return{...Rt};const t=JSON.parse(e),n={...Rt,...t,connections:Array.isArray(t.connections)?t.connections:[]};return(t.prefsVersion??1)<io&&(n.showToolCalls=Rt.showToolCalls,n.showReasoning=Rt.showReasoning,n.showSystem=Rt.showSystem,n.prefsVersion=io),n}catch{return{...Rt}}}function Mr(e){localStorage.setItem(Xc,JSON.stringify(e))}function Qn(e){return e.connections.length?e.connections.find(t=>t.id===e.activeConnectionId)??e.connections[0]??null:null}function ph(e){const t=Qn(e);return!!t&&(t.sameOrigin===!0||t.baseUrl.trim().length>0)}function hh(){return`conn-${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}let Rn=null;function mh(e){return new Gc({baseUrl:e.baseUrl,apiKey:e.apiKey,profile:e.profile,sameOrigin:e.sameOrigin,customHeaders:e.customHeaders})}function Ve(e){return e instanceof Wn||e instanceof Error?e.message:String(e)}function rt(e,t,n){return e.map(r=>r.id===t?n(r):r)}const j=uh()((e,t)=>({config:{...Rt},client:null,ready:!1,connectionError:null,capabilities:null,models:[],sessions:[],sessionsLoading:!1,searchQuery:"",activeSessionId:null,session:null,messages:[],sessionLoading:!1,streaming:!1,runId:null,streamError:null,steerLeftover:null,sidebarOpen:!1,showSettings:!1,toast:null,async bootstrap(){const n=dh();e({config:n,ready:!0}),Qn(n)&&await t().connect()},async saveConnection(n){const r=t().config,i=r.connections.some(s=>s.id===n.id)?r.connections.map(s=>s.id===n.id?n:s):[...r.connections,n],o={...r,connections:i,activeConnectionId:n.id};Mr(o),e({config:o}),await t().connect()},async removeConnection(n){var s;const r=t().config,l=r.connections.filter(a=>a.id!==n),i=r.activeConnectionId===n?((s=l[0])==null?void 0:s.id)??null:r.activeConnectionId,o={...r,connections:l,activeConnectionId:i};Mr(o),e({config:o,sessions:[],session:null,messages:[],activeSessionId:null}),Qn(o)&&await t().connect()},async setActiveConnection(n){const r={...t().config,activeConnectionId:n};Mr(r),e({config:r,sessions:[],session:null,messages:[],activeSessionId:null}),await t().connect()},updatePrefs(n){const r={...t().config,...n};Mr(r),e({config:r})},async connect(){const n=Qn(t().config);if(!n||!n.sameOrigin&&!n.baseUrl.trim())return;const r=mh(n);e({client:r,connectionError:null,capabilities:null});try{const l=await r.capabilities();e({capabilities:l}),r.models().then(i=>e({models:i})).catch(()=>{}),await t().loadSessions()}catch(l){e({connectionError:Ve(l),capabilities:null})}},async loadSessions(){const{client:n,searchQuery:r}=t();if(n){e({sessionsLoading:!0});try{const l=await n.listSessions({limit:200}),i=r.trim().toLowerCase(),o=i?l.filter(s=>s.title.toLowerCase().includes(i)):l;e({sessions:o,sessionsLoading:!1})}catch(l){e({sessionsLoading:!1,toast:Ve(l)})}}},setSearch(n){e({searchQuery:n}),t().loadSessions()},async openSession(n){const{client:r}=t();if(r){e({activeSessionId:n,sessionLoading:!0,session:null,messages:[],sidebarOpen:!1,streamError:null});try{const[l,i]=await Promise.all([r.getSession(n).catch(()=>null),r.getMessages(n,{limit:500,order:"oldest"})]);e({session:l??{id:n,title:"Untitled"},messages:i,sessionLoading:!1})}catch(l){e({sessionLoading:!1,toast:Ve(l)})}}},async newSession(){const{client:n}=t();if(n)try{const r=await n.createSession();e({session:r,messages:[],activeSessionId:r.id,sidebarOpen:!1,streamError:null}),await t().loadSessions()}catch(r){e({toast:Ve(r)})}},async renameSession(n,r){var i;const{client:l}=t();if(l)try{await l.updateSession(n,{title:r}),e({sessions:t().sessions.map(o=>o.id===n?{...o,title:r}:o),session:((i=t().session)==null?void 0:i.id)===n?{...t().session,title:r}:t().session})}catch(o){e({toast:Ve(o)})}},async deleteSession(n){const{client:r}=t();if(r)try{await r.deleteSession(n);const l=t().activeSessionId===n;e({sessions:t().sessions.filter(i=>i.id!==n),...l?{activeSessionId:null,session:null,messages:[]}:{}})}catch(l){e({toast:Ve(l)})}},async forkSession(n){const{client:r}=t();if(r)try{const l=await r.forkSession(n);await t().loadSessions(),await t().openSession(l.id)}catch(l){e({toast:Ve(l)})}},async send(n,r){const{client:l,activeSessionId:i,messages:o}=t();if(!l||!i)return;const s=n.trim();if(!s&&!(r!=null&&r.length)||t().streaming)return;const a={id:`local-user-${Date.now()}`,role:"user",content:s,attachments:r,timestamp:Date.now()},c=`local-assistant-${Date.now()}`,p={id:c,role:"assistant",content:"",timestamp:Date.now(),streaming:!0,toolCalls:[]};e({messages:[...o,a,p],streaming:!0,streamError:null,runId:null});let h=s;if(r!=null&&r.length){const d=[];s&&d.push({type:"text",text:s});for(const y of r)d.pu
Line truncated
|
||||||
@@ -1 +1 @@
|
|||||||
:root{--bg: #000810;--bg-elev: #010f20;--bg-elev2: #001a30;--bg-hover: #001a30;--border: #0a3060;--border-soft: #072348;--text: #c8f0ff;--text-dim: #6aa8bf;--text-faint: #2e6a80;--accent: #00f5ff;--accent-soft: rgba(0, 245, 255, .12);--accent-strong: #00c8d4;--accent-contrast: #001018;--danger: #ff3b3b;--danger-soft: rgba(255, 59, 59, .14);--ok: #00ff88;--warn: #ffaa00;--radius: 10px;--radius-sm: 8px;--sidebar-w: 304px;--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior-y:none}button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}input,textarea,select{font-family:inherit;font-size:15px;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;outline:none;width:100%}input:focus,textarea:focus,select:focus{border-color:var(--accent)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#0a3060;border-radius:8px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:#0f4a6e;background-clip:padding-box}.app{display:flex;height:100dvh;overflow:hidden}.sidebar{width:var(--sidebar-w);flex-shrink:0;background:var(--bg-elev);border-right:1px solid var(--border);display:flex;flex-direction:column;min-height:0}.main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--bg)}.scrim{display:none}@media (max-width: 820px){.sidebar{position:fixed;inset:0 auto 0 0;z-index:40;transform:translate(-100%);transition:transform .22s ease;box-shadow:0 0 40px #00000080;padding-top:env(safe-area-inset-top)}.sidebar.open{transform:translate(0)}.scrim.show{display:block;position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:30}}.sidebar-head{padding:14px 14px 10px;display:flex;flex-direction:column;gap:10px;border-bottom:1px solid var(--border-soft)}.brand{display:flex;align-items:center;gap:9px;font-weight:650;letter-spacing:.2px}.brand-mark{width:26px;height:26px;border-radius:7px;background:linear-gradient(180deg,#003545,#00202e);border:1px solid #005570;display:grid;place-items:center;color:var(--accent);font-weight:800;font-size:14px}.brand-link{display:inline-flex;align-items:center;text-decoration:none;border-radius:8px;padding:2px 4px;margin-left:-4px}.brand-link:hover{background:var(--bg-hover)}.brand-actions{margin-left:auto;display:flex;gap:4px}.icon-btn{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;color:var(--text-dim);transition:background .15s,color .15s}.icon-btn:hover{background:var(--bg-hover);color:var(--text)}.icon-btn.active{color:var(--accent);background:var(--accent-soft)}.profile-switch{position:relative}.profile-btn{width:100%;display:flex;align-items:center;gap:9px;padding:9px 11px;border-radius:var(--radius-sm);background:var(--bg-elev2);border:1px solid var(--border);text-align:left}.profile-btn:hover{border-color:#2f3b4d}.profile-btn .dot{width:8px;height:8px;border-radius:50%;background:var(--ok);flex-shrink:0}.profile-btn .name{font-weight:600;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-btn .sub{font-size:11px;color:var(--text-faint);margin-left:auto;flex-shrink:0}.menu{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--bg-elev2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px;z-index:20;box-shadow:0 12px 30px #00000073;max-height:320px;overflow:auto}.menu-item{width:100%;display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:7px;font-size:14px;text-align:left}.menu-item:hover{background:var(--bg-hover)}.menu-item .check{margin-left:auto;color:var(--accent)}.new-chat{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;border-radius:var(--radius-sm);background:var(--accent);color:var(--accent-contrast);font-weight:700;font-size:14px}.new-chat:hover{background:var(--accent-strong)}.search-wrap{position:relative}.search-wrap svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none}.search-wrap input{padding-left:34px;background:var(--bg)}.sidebar-tools{display:flex;align-items:center;gap:8px;padding:8px 14px;font-size:12px;color:var(--text-dim);border-bottom:1px solid var(--border-soft)}.toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none}.toggle input{width:auto;accent-color:var(--accent)}.session-list{flex:1;overflow-y:auto;padding:8px;min-height:0}.group-label{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--text-faint);padding:12px 8px 6px;font-weight:600}.session-item{dispLine truncated
|
:root{--bg: #000810;--bg-elev: #010f20;--bg-elev2: #001a30;--bg-hover: #001a30;--border: #0a3060;--border-soft: #072348;--text: #c8f0ff;--text-dim: #6aa8bf;--text-faint: #2e6a80;--accent: #00f5ff;--accent-soft: rgba(0, 245, 255, .12);--accent-strong: #00c8d4;--accent-contrast: #001018;--danger: #ff3b3b;--danger-soft: rgba(255, 59, 59, .14);--ok: #00ff88;--warn: #ffaa00;--radius: 10px;--radius-sm: 8px;--sidebar-w: 304px;--font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior-y:none}button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}input,textarea,select{font-family:inherit;font-size:15px;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px;outline:none;width:100%}input:focus,textarea:focus,select:focus{border-color:var(--accent)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#0a3060;border-radius:8px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-thumb:hover{background:#0f4a6e;background-clip:padding-box}.app{display:flex;height:100dvh;overflow:hidden}.sidebar{width:var(--sidebar-w);flex-shrink:0;background:var(--bg-elev);border-right:1px solid var(--border);display:flex;flex-direction:column;min-height:0}.main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--bg)}.scrim{display:none}@media (max-width: 820px){.sidebar{position:fixed;inset:0 auto 0 0;z-index:40;transform:translate(-100%);transition:transform .22s ease;box-shadow:0 0 40px #00000080;padding-top:env(safe-area-inset-top)}.sidebar.open{transform:translate(0)}.scrim.show{display:block;position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:30}}.sidebar-head{padding:14px 14px 10px;display:flex;flex-direction:column;gap:10px;border-bottom:1px solid var(--border-soft)}.brand{display:flex;align-items:center;gap:9px;font-weight:650;letter-spacing:.2px}.brand-mark{width:26px;height:26px;border-radius:7px;background:linear-gradient(180deg,#003545,#00202e);border:1px solid #005570;display:grid;place-items:center;color:var(--accent);font-weight:800;font-size:14px}.brand-link{display:inline-flex;align-items:center;text-decoration:none;border-radius:8px;padding:2px 4px;margin-left:-4px}.brand-link:hover{background:var(--bg-hover)}.brand-actions{margin-left:auto;display:flex;gap:4px}.icon-btn{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;color:var(--text-dim);transition:background .15s,color .15s}.icon-btn:hover{background:var(--bg-hover);color:var(--text)}.icon-btn.active{color:var(--accent);background:var(--accent-soft)}.profile-switch{position:relative}.profile-btn{width:100%;display:flex;align-items:center;gap:9px;padding:9px 11px;border-radius:var(--radius-sm);background:var(--bg-elev2);border:1px solid var(--border);text-align:left}.profile-btn:hover{border-color:#2f3b4d}.profile-btn .dot{width:8px;height:8px;border-radius:50%;background:var(--ok);flex-shrink:0}.profile-btn .name{font-weight:600;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-btn .sub{font-size:11px;color:var(--text-faint);margin-left:auto;flex-shrink:0}.menu{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--bg-elev2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px;z-index:20;box-shadow:0 12px 30px #00000073;max-height:320px;overflow:auto}.menu-item{width:100%;display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:7px;font-size:14px;text-align:left}.menu-item:hover{background:var(--bg-hover)}.menu-item .check{margin-left:auto;color:var(--accent)}.new-chat{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;border-radius:var(--radius-sm);background:var(--accent);color:var(--accent-contrast);font-weight:700;font-size:14px}.new-chat:hover{background:var(--accent-strong)}.search-wrap{position:relative}.search-wrap svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-faint);pointer-events:none}.search-wrap input{padding-left:34px;background:var(--bg)}.sidebar-tools{display:flex;align-items:center;gap:8px;padding:8px 14px;font-size:12px;color:var(--text-dim);border-bottom:1px solid var(--border-soft)}.toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none}.toggle input{width:auto;accent-color:var(--accent)}.session-list{flex:1;overflow-y:auto;padding:8px;min-height:0}.group-label{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--text-faint);padding:12px 8px 6px;font-weight:600}.session-item{dispLine truncated
|
||||||
+2
-2
@@ -13,8 +13,8 @@
|
|||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
<meta name="apple-mobile-web-app-title" content="Hermes" />
|
<meta name="apple-mobile-web-app-title" content="Hermes" />
|
||||||
<title>Hermes</title>
|
<title>Hermes</title>
|
||||||
<script type="module" crossorigin src="/assets/index-SBr79e_P.js"></script>
|
<script type="module" crossorigin src="/assets/index-BFnujVjw.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-CWSassUi.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-BQJys9C3.css">
|
||||||
<link rel="manifest" href="/manifest.webmanifest"></head>
|
<link rel="manifest" href="/manifest.webmanifest"></head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(s,o)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(i[r])return;let c={};const l=e=>n(e,r),t={module:{uri:r},exports:c,require:l};i[r]=Promise.all(s.map(e=>t[e]||l(e))).then(e=>(o(...e),c))}}define(["./workbox-abeb32eb"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"84ac5ebbe2382c8ec70814e7f406d21e"},{url:"assets/workbox-window.prod.es5-BqEJf4Xk.js",revision:null},{url:"assets/index-SBr79e_P.js",revision:null},{url:"assets/index-CWSassUi.css",revision:null},{url:"favicon.svg",revision:"a3baf2b041a9ed1fcc08d8a3634b535b"},{url:"icons/apple-touch-icon.png",revision:"ed81749f391ac07000b948263124e943"},{url:"icons/icon-192.png",revision:"8b2374bbaec1e3d1db8a07af64a6ef77"},{url:"icons/icon-512.png",revision:"c44a8f2da9095157b9b9aff7ec8e1aeb"},{url:"icons/maskable-512.png",revision:"beb4196443dc6daafcaab4497038613d"},{url:"manifest.webmanifest",revision:"d1afe01b7c52b0c511fd7e5f11079c23"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/api/"),new e.NetworkOnly,"GET")});
|
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(s,o)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(i[r])return;let c={};const l=e=>n(e,r),t={module:{uri:r},exports:c,require:l};i[r]=Promise.all(s.map(e=>t[e]||l(e))).then(e=>(o(...e),c))}}define(["./workbox-abeb32eb"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"8e29677639fefa5c95cb54316bb425d0"},{url:"assets/workbox-window.prod.es5-BqEJf4Xk.js",revision:null},{url:"assets/index-BQJys9C3.css",revision:null},{url:"assets/index-BFnujVjw.js",revision:null},{url:"favicon.svg",revision:"a3baf2b041a9ed1fcc08d8a3634b535b"},{url:"icons/apple-touch-icon.png",revision:"ed81749f391ac07000b948263124e943"},{url:"icons/icon-192.png",revision:"8b2374bbaec1e3d1db8a07af64a6ef77"},{url:"icons/icon-512.png",revision:"c44a8f2da9095157b9b9aff7ec8e1aeb"},{url:"icons/maskable-512.png",revision:"beb4196443dc6daafcaab4497038613d"},{url:"manifest.webmanifest",revision:"d1afe01b7c52b0c511fd7e5f11079c23"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/api/"),new e.NetworkOnly,"GET")});
|
||||||
Reference in new issue
Block a user