pi-web-ui 0.21.0 → 0.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/pi-web-ui.mjs
CHANGED
|
@@ -172,12 +172,24 @@ function parseFlags(argv) {
|
|
|
172
172
|
|
|
173
173
|
/** Open a URL in the OS default browser; failures are ignored (best-effort). */
|
|
174
174
|
function openBrowser(url) {
|
|
175
|
+
let res;
|
|
175
176
|
if (isMac) {
|
|
176
|
-
spawnSync("open", [url], { stdio: "ignore" });
|
|
177
|
+
res = spawnSync("open", [url], { stdio: "ignore" });
|
|
177
178
|
} else if (isWin) {
|
|
178
|
-
spawnSync("cmd", ["/c", "start", "", url], { stdio: "ignore" });
|
|
179
|
+
res = spawnSync("cmd", ["/c", "start", "", url], { stdio: "ignore" });
|
|
179
180
|
} else {
|
|
180
|
-
spawnSync("xdg-open", [url], { stdio: "ignore" });
|
|
181
|
+
res = spawnSync("xdg-open", [url], { stdio: "ignore" });
|
|
182
|
+
}
|
|
183
|
+
// spawnSync 不抛异常:命令缺失(headless 服务器)时在返回对象里带 error 字段。
|
|
184
|
+
if (res?.error) {
|
|
185
|
+
if (res.error.code === "ENOENT") {
|
|
186
|
+
console.warn(
|
|
187
|
+
`[browser] 未找到打开器 (${res.error.path || "command not found"}),` +
|
|
188
|
+
"headless 服务器可用 --no-browser 关闭自动打开"
|
|
189
|
+
);
|
|
190
|
+
} else {
|
|
191
|
+
console.warn("[browser] 打开浏览器失败:", res.error.message);
|
|
192
|
+
}
|
|
181
193
|
}
|
|
182
194
|
}
|
|
183
195
|
|
package/extensions/webui.ts
CHANGED
|
@@ -76,17 +76,25 @@ function parseArgs(args: string): { port?: number; cwd?: string; noBrowser: bool
|
|
|
76
76
|
/** 打开浏览器 */
|
|
77
77
|
async function openBrowser(url: string): Promise<void> {
|
|
78
78
|
const { platform } = process;
|
|
79
|
-
const cmd =
|
|
79
|
+
const [cmd, ...rest] =
|
|
80
80
|
platform === "darwin"
|
|
81
81
|
? ["open", url]
|
|
82
82
|
: platform === "win32"
|
|
83
83
|
? ["cmd", "/c", "start", "", url]
|
|
84
84
|
: ["xdg-open", url];
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
// 无界面环境缺少 xdg-open 等打开器时,ENOENT 以异步 'error' 事件触发,
|
|
86
|
+
// try/catch 拦不住会崩掉整个进程 —— 必须挂 error 监听。
|
|
87
|
+
spawn(cmd, rest, { stdio: "ignore", detached: true })
|
|
88
|
+
.on("error", (err) => {
|
|
89
|
+
if ((err as NodeJS.ErrnoException)?.code === "ENOENT") {
|
|
90
|
+
console.warn(
|
|
91
|
+
`[webui] 未找到浏览器打开器 (${(err as NodeJS.ErrnoException).path || "command not found"}),请用 --no-browser 关闭自动打开`
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
console.warn("[webui] 打开浏览器失败:", err.message);
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
.unref();
|
|
90
98
|
}
|
|
91
99
|
|
|
92
100
|
export default function (pi: ExtensionAPI): void {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-web-ui",
|
|
3
|
-
"version": "0.21.
|
|
3
|
+
"version": "0.21.2",
|
|
4
4
|
"description": "Web chat interface for the pi coding agent, powered by the pi SDK (@earendil-works/pi-coding-agent) — one-command run, Docker/systemd/launchd deployable",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -122,5 +122,5 @@ WARNING: This link could potentially be dangerous`)){let n=window.open();if(n){t
|
|
|
122
122
|
* http://bellard.org/jslinux/
|
|
123
123
|
* Copyright (c) 2011 Fabrice Bellard
|
|
124
124
|
*/var RL=2,ML=1,AL=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){var p;if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let t=this._terminal.options.scrollback===0?0:((p=this._terminal.options.overviewRuler)==null?void 0:p.width)||14,n=window.getComputedStyle(this._terminal.element.parentElement),r=parseInt(n.getPropertyValue("height")),o=Math.max(0,parseInt(n.getPropertyValue("width"))),a=window.getComputedStyle(this._terminal.element),l={top:parseInt(a.getPropertyValue("padding-top")),bottom:parseInt(a.getPropertyValue("padding-bottom")),right:parseInt(a.getPropertyValue("padding-right")),left:parseInt(a.getPropertyValue("padding-left"))},u=l.top+l.bottom,d=l.right+l.left,h=r-u,g=o-d-t;return{cols:Math.max(RL,Math.floor(g/e.css.cell.width)),rows:Math.max(ML,Math.floor(h/e.css.cell.height))}}};const LL={background:"#0b0d12",foreground:"#e6e8ef",cursor:"#8b5cf6",cursorAccent:"#0b0d12",selectionBackground:"rgba(139, 92, 246, 0.35)",black:"#1a1d26",red:"#f87171",green:"#34d399",yellow:"#fbbf24",blue:"#60a5fa",magenta:"#c084fc",cyan:"#22d3ee",white:"#e6e8ef",brightBlack:"#6b7284",brightRed:"#f87171",brightGreen:"#34d399",brightYellow:"#fbbf24",brightBlue:"#60a5fa",brightMagenta:"#c084fc",brightCyan:"#22d3ee",brightWhite:"#ffffff"};function OL({terminalId:e,command:t,cwd:n,active:r,send:o,register:a}){const l=K.useRef(null),u=K.useRef(null);return K.useEffect(()=>{const d=l.current;if(!d)return;const h=new TL({theme:LL,fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),g=new AL;h.loadAddon(g),h.open(d),u.current={term:h,fit:g},r&&h.focus(),h.attachCustomKeyEventHandler(E=>{var R;if(E.type!=="keydown")return!0;const k=(R=E.key)==null?void 0:R.toLowerCase();if((E.ctrlKey||E.metaKey)&&k==="v")return!1;if(E.ctrlKey&&!E.shiftKey&&!E.altKey&&k==="c"&&h.hasSelection()){const T=h.textarea;return T&&(T.value=h.getSelection(),T.select()),!1}return!0});const p=a(e,{write:E=>h.write(E),dispose:()=>h.dispose()}),v=()=>{try{g.fit(),o({type:"terminal_resize",terminalId:e,cols:h.cols,rows:h.rows})}catch{}},y=requestAnimationFrame(()=>{try{g.fit()}catch{}o(t?{type:"run_command",terminalId:e,command:t,cols:h.cols,rows:h.rows}:{type:"terminal_create",terminalId:e,cwd:n,cols:h.cols,rows:h.rows})}),S=h.onData(E=>{o({type:"terminal_input",terminalId:e,data:E})});let w=null;return typeof ResizeObserver<"u"&&(w=new ResizeObserver(()=>{d.offsetWidth>0&&d.offsetHeight>0&&v()}),w.observe(d)),()=>{cancelAnimationFrame(y),S.dispose(),w==null||w.disconnect(),p(),o({type:"terminal_kill",terminalId:e}),h.dispose(),u.current=null}},[e,t,o,a]),K.useEffect(()=>{if(!r)return;const d=requestAnimationFrame(()=>{const h=u.current;if(h){try{h.fit.fit(),o({type:"terminal_resize",terminalId:e,cols:h.term.cols,rows:h.term.rows})}catch{}h.term.focus()}});return()=>cancelAnimationFrame(d)},[r]),m.jsx("div",{ref:l,className:`term-xterm ${r?"":"hidden"}`})}const pv={name:"",command:"",cwd:"${pwd}"};function DL({chat:e,send:t,terminal:n}){const r=bt(),[o,a]=K.useState(null),[l,u]=K.useState(!1),[d,h]=K.useState(!1),[g,p]=K.useState(null),[v,y]=K.useState(pv),[S,w]=K.useState(null),E=K.useRef(null);K.useEffect(()=>{e.terminals.length===0?a(null):e.terminals.some(H=>H.id===o)||a(e.terminals[e.terminals.length-1].id)},[e.terminals,o]),K.useEffect(()=>()=>{E.current&&clearTimeout(E.current)},[]);const k=H=>{if(!e.ready)return;const U=Dv();n.create({...H,id:U,running:!0,exitCode:null}),a(U),u(!1)},R=()=>{var H;return k({title:r("terminalTitle",{n:e.terminals.length+1}),cwd:((H=e.state)==null?void 0:H.cwd)??""})},T=H=>{var q;const U=H.name||H.command,O=e.terminals.find(F=>F.title===U);if(O){n.restart(O.id),a(O.id),t({type:"run_command",terminalId:O.id,command:H,cols:80,rows:24});return}k({title:U,cwd:((q=e.state)==null?void 0:q.cwd)??"",command:H})},A=H=>{if(n.close(H),o===H){const U=e.terminals.filter(O=>O.id!==H);a(U.length>0?U[U.length-1].id:null)}},V=()=>{h(!0),p(null),y(pv)},D=H=>{const U=e.commands[H];U&&(h(!1),p(H),y({name:U.name,command:U.command,cwd:U.cwd??""}))},ne=()=>{h(!1),p(null)},Z=()=>{const H=v.name.trim(),U=v.command.trim();if(!H||!U)return;const O=v.cwd.trim(),q={name:H,command:U,cwd:O||void 0},F=d?[...e.commands,q]:g!==null?e.commands.map((Q,ie)=>ie===g?q:Q):e.commands;t({type:"save_commands",commands:F}),ne()},ee=H=>{if(S===H){const U=e.commands.filter((O,q)=>q!==H);t({type:"save_commands",commands:U}),w(null),E.current&&clearTimeout(E.current)}else w(H),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>w(null),2500)},W=d||g!==null;return m.jsxs("div",{className:"terminal-view",children:[m.jsxs("aside",{className:`term-side term-commands ${l?"open":""}`,children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("span",{className:"panel-title",children:r("commands")}),m.jsxs("div",{className:"panel-header-actions",children:[m.jsx("button",{type:"button",className:"panel-refresh",title:r("rerun"),onClick:()=>t({type:"list_commands"}),children:m.jsx(kv,{})}),m.jsx("button",{type:"button",className:"panel-new",title:r("newCommand"),onClick:V,children:m.jsx(Tr,{})})]})]}),m.jsx("div",{className:"panel-body",children:W?m.jsxs("div",{className:"cmd-form",children:[m.jsx("label",{htmlFor:"cmd-name",children:r("name")}),m.jsx("input",{id:"cmd-name",className:"cmd-input",value:v.name,placeholder:r("exampleName"),autoFocus:!0,onChange:H=>y({...v,name:H.target.value})}),m.jsx("label",{htmlFor:"cmd-command",children:r("command")}),m.jsx("input",{id:"cmd-command",className:"cmd-input",value:v.command,placeholder:r("exampleCommand"),onChange:H=>y({...v,command:H.target.value}),onKeyDown:H=>{H.key==="Enter"&&!H.nativeEvent.isComposing&&Z()}}),m.jsxs("label",{htmlFor:"cmd-cwd",children:[r("directory")," ",m.jsx("span",{className:"cmd-hint",children:r("cwdHint")})]}),m.jsx("input",{id:"cmd-cwd",className:"cmd-input",value:v.cwd,placeholder:"${pwd}",onChange:H=>y({...v,cwd:H.target.value}),onKeyDown:H=>{H.key==="Enter"&&!H.nativeEvent.isComposing&&Z()}}),m.jsxs("div",{className:"cmd-form-actions",children:[m.jsx("button",{type:"button",className:"btn",onClick:ne,children:r("cancel")}),m.jsx("button",{type:"button",className:"btn primary",disabled:!v.name.trim()||!v.command.trim(),onClick:Z,children:r("save")})]})]}):m.jsxs(m.Fragment,{children:[e.commands.length===0&&m.jsx("div",{className:"panel-empty",children:r("noCommands")}),e.commands.map((H,U)=>m.jsxs("div",{className:"cmd-item",children:[m.jsx("button",{type:"button",className:"cmd-run",title:r("clickToRun"),onClick:()=>T(H),children:m.jsx(Qw,{})}),m.jsxs("button",{type:"button",className:"cmd-main",title:r("clickToRun"),onClick:()=>T(H),children:[m.jsx("span",{className:"cmd-name",children:H.name}),m.jsx("span",{className:"cmd-command",children:H.command}),H.cwd&&m.jsx("span",{className:"cmd-cwd",children:H.cwd})]}),m.jsx("button",{type:"button",className:"cmd-act",title:r("edit"),onClick:()=>D(U),children:m.jsx(Nv,{})}),m.jsx("button",{type:"button",className:`cmd-act del ${S===U?"confirm":""}`,title:r("delete"),onClick:()=>ee(U),children:S===U?r("confirmQ"):m.jsx(nc,{})})]},U))]})}),m.jsxs("div",{className:"term-tabs-block",children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("span",{className:"panel-title",children:r("terminal")}),m.jsx("button",{type:"button",className:"panel-new",title:r("newTerminal"),onClick:R,children:m.jsx(Tr,{})})]}),m.jsxs("div",{className:"panel-body",children:[e.terminals.length===0&&m.jsx("div",{className:"panel-empty",children:r("noTerminal")}),e.terminals.map(H=>m.jsxs("div",{className:`term-tab ${H.id===o?"active":""}`,children:[m.jsxs("button",{type:"button",className:"term-tab-main",title:`${H.cwd}${H.command?`
|
|
125
|
-
> ${H.command.command}`:""}`,onClick:()=>{a(H.id),u(!1)},children:[m.jsx("span",{className:`term-tab-dot ${H.running?"run":"exit"}`}),m.jsxs("span",{className:"term-tab-title",children:[H.title,!H.running&&m.jsx("span",{className:"term-tab-exit",children:r("exited",{code:H.exitCode===null?"":` ${H.exitCode}`})})]})]}),m.jsx("button",{type:"button",className:"term-tab-close",title:r("closeTerminal"),onClick:()=>A(H.id),children:m.jsx(ls,{})})]},H.id))]})]})]}),m.jsxs("div",{className:"term-main",children:[l&&m.jsx("div",{className:"drawer-backdrop",onClick:()=>u(!1)}),m.jsx("button",{type:"button",className:"term-side-toggle",title:r("commands"),onClick:()=>u(H=>!H),children:m.jsx(Ev,{})}),e.terminals.length===0?m.jsxs("div",{className:"term-empty",children:[m.jsx(Vd,{className:"term-empty-icon"}),m.jsx("div",{className:"term-empty-title",children:r("builtinTerminal")}),m.jsx("div",{className:"term-empty-sub",children:r("termEmptySub")})]}):e.terminals.map(H=>m.jsx(OL,{terminalId:H.id,command:H.command,cwd:H.cwd,active:H.id===o,send:t,register:n.register},H.id))]})]})}function IL({send:e,piConfigured:t,providers:n,installResult:r,onClose:o}){const a=bt(),[l,u]=K.useState(!1),[d,h]=K.useState(""),[g,p]=K.useState(""),[v,y]=K.useState(!1);K.useEffect(()=>{e({type:"list_providers"})},[e]),K.useEffect(()=>{t&&o()},[t,o]),K.useEffect(()=>{r&&u(!1)},[r]),K.useEffect(()=>{var T;!d&&n.length>0&&h(((T=n.find(A=>!A.configured))==null?void 0:T.id)??n[0].id)},[n,d]);const S=()=>{l||(u(!0),e({type:"install_pi_agent"}))},w=()=>{!g.trim()||v||(y(!0),e({type:"set_provider_api_key",provider:d.trim(),apiKey:g.trim()}),setTimeout(()=>y(!1),3e3))},E=()=>{e({type:"get_state"}),e({type:"list_providers"})},k=n.find(T=>T.id===d),R=r!==null&&!r.ok;return m.jsx("div",{className:"modal-backdrop",children:m.jsxs("div",{className:"modal setup-modal",children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":a("close"),onClick:o,children:m.jsx(ls,{})}),m.jsxs("div",{className:"modal-head",children:[m.jsx(_c,{className:"modal-head-icon"}),m.jsx("h2",{children:a("setupTitle")})]}),m.jsx("p",{className:"modal-desc",children:a("setupDesc")}),R?m.jsxs("div",{className:"setup-failed",children:[m.jsx("div",{className:"setup-done",children:a("installFailed")}),m.jsx("pre",{className:"setup-detail",children:r.detail}),m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:l,onClick:S,children:a("retryInstall")}),m.jsx("button",{type:"button",className:"btn",onClick:o,children:a("skip")})]})]}):r!=null&&r.ok?m.jsxs("div",{className:"setup-key-form",children:[m.jsx("div",{className:"setup-done",children:a("installDone")}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:a("provider")}),m.jsxs("select",{value:d,onChange:T=>h(T.target.value),children:[n.length===0&&m.jsx("option",{value:"",children:a("loading")}),n.map(T=>m.jsxs("option",{value:T.id,children:[T.name,"(",T.id,")",T.configured?` · ${a("configured")}`:""]},T.id))]}),(k==null?void 0:k.configured)&&m.jsx("div",{className:"field-hint",children:a("providerKeyReady")})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:a("apiKey")}),m.jsx("input",{type:"password",value:g,onChange:T=>p(T.target.value),placeholder:"sk-…"})]}),m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:!g.trim()||v||!d,onClick:w,children:a(v?"saving":"saveAndStart")}),m.jsxs("button",{type:"button",className:"btn",onClick:E,children:[m.jsx(kv,{})," ",a("recheck")]})]})]}):m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:l,onClick:S,children:a(l?"installing":"autoInstall")}),m.jsx("button",{type:"button",className:"btn",onClick:o,children:a("skip")})]})]})})}const PL=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"],Mf=()=>({id:"",name:"",reasoning:!1,input:"text",contextWindow:"",maxTokens:""}),BL=()=>({providerId:"",name:"",api:"openai-completions",baseUrl:"",apiKey:"",authHeader:!0,models:[Mf()]});function FL(e){return{providerId:e.providerId,name:e.name??"",api:e.api??"openai-completions",baseUrl:e.baseUrl??"",apiKey:e.apiKey??"",authHeader:e.authHeader??!1,models:(e.models.length?e.models:[Mf()]).map(t=>{var n;return{id:t.id,name:t.name??"",reasoning:t.reasoning??!1,input:(n=t.input)!=null&&n.includes("image")?"text-image":"text",contextWindow:t.contextWindow?String(t.contextWindow):"",maxTokens:t.maxTokens?String(t.maxTokens):""}})}}function zL({send:e,providers:t,providerStatus:n,onClose:r}){const o=bt(),[a,l]=K.useState(null),[u,d]=K.useState({}),[h,g]=K.useState(null);K.useEffect(()=>{e({type:"list_models_config"}),e({type:"list_providers"})},[e]);const p=w=>{const E=(u[w.id]??"").trim();!E||h||(g(w.id),e({type:"set_provider_api_key",provider:w.id,apiKey:E}),setTimeout(()=>{g(null),d(k=>({...k,[w.id]:""})),e({type:"list_providers"})},1500))},v=()=>{if(!a)return;const w=a.providerId.trim(),E=a.models.filter(R=>R.id.trim()).map(R=>({id:R.id.trim(),name:R.name.trim()||void 0,reasoning:R.reasoning||void 0,input:R.input==="text-image"?["text","image"]:void 0,contextWindow:R.contextWindow?Number(R.contextWindow):void 0,maxTokens:R.maxTokens?Number(R.maxTokens):void 0})),k={providerId:w,name:a.name.trim()||void 0,api:a.api.trim()||void 0,baseUrl:a.baseUrl.trim()||void 0,apiKey:a.apiKey.trim()||void 0,authHeader:a.authHeader||void 0,models:E};e({type:"save_model_config",providerId:w,config:k}),r()},y=w=>{window.confirm(o("deleteProviderConfirm",{id:w.providerId,n:w.models.length}))&&e({type:"delete_model_config",providerId:w.providerId})},S=(w,E)=>{a&&l({...a,models:a.models.map((k,R)=>R===w?{...k,...E}:k)})};return m.jsx("div",{className:"modal-backdrop",children:m.jsxs("div",{className:"modal model-modal",children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":o("close"),onClick:r,children:m.jsx(ls,{})}),m.jsx("div",{className:"modal-head",children:m.jsx("h2",{children:o(a?"editProvider":"manageModelsTitle")})}),a?m.jsxs("div",{className:"provider-form",children:[m.jsxs("div",{className:"form-grid",children:[m.jsxs("label",{className:"field",children:[m.jsxs("span",{className:"field-label",children:[o("providerId")," ",m.jsx("em",{children:o("providerIdHint")})]}),m.jsx("input",{type:"text",value:a.providerId,disabled:t.some(w=>w.providerId===a.providerId),onChange:w=>l({...a,providerId:w.target.value}),placeholder:"my-proxy"})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("displayName")}),m.jsx("input",{type:"text",value:a.name,onChange:w=>l({...a,name:w.target.value}),placeholder:o("displayNamePh")})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("apiType")}),m.jsx("select",{value:a.api,onChange:w=>l({...a,api:w.target.value}),children:PL.map(w=>m.jsx("option",{value:w,children:w},w))})]}),m.jsxs("label",{className:"field",children:[m.jsxs("span",{className:"field-label",children:["baseUrl ",m.jsx("em",{children:o("baseUrlHint")})]}),m.jsx("input",{type:"text",value:a.baseUrl,onChange:w=>l({...a,baseUrl:w.target.value}),placeholder:"http://localhost:11434/v1"})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("apiKey")}),m.jsx("input",{type:"password",value:a.apiKey,onChange:w=>l({...a,apiKey:w.target.value}),placeholder:o("apiKeyHint")})]}),m.jsxs("label",{className:"field check",children:[m.jsx("input",{type:"checkbox",checked:a.authHeader,onChange:w=>l({...a,authHeader:w.target.checked})}),m.jsx("span",{children:o("authHeader")})]})]}),m.jsx("div",{className:"form-section-title",children:o("modelsTitle")}),a.models.map((w,E)=>m.jsxs("div",{className:"model-row",children:[m.jsx("input",{type:"text",value:w.id,onChange:k=>S(E,{id:k.target.value}),placeholder:o("modelIdReq")}),m.jsx("input",{type:"text",value:w.name,onChange:k=>S(E,{name:k.target.value}),placeholder:o("displayName")}),m.jsxs("select",{value:w.input,onChange:k=>S(E,{input:k.target.value}),children:[m.jsx("option",{value:"text",children:o("text")}),m.jsx("option",{value:"text-image",children:o("textImage")})]}),m.jsxs("label",{className:"check",children:[m.jsx("input",{type:"checkbox",checked:w.reasoning,onChange:k=>S(E,{reasoning:k.target.checked})}),m.jsx("span",{children:o("reasoning")})]}),m.jsx("input",{type:"number",value:w.contextWindow,onChange:k=>S(E,{contextWindow:k.target.value}),placeholder:o("contextWindow"),title:"contextWindow"}),m.jsx("input",{type:"number",value:w.maxTokens,onChange:k=>S(E,{maxTokens:k.target.value}),placeholder:o("maxOutput"),title:"maxTokens"}),m.jsx("button",{type:"button",className:"iconbtn danger",title:o("removeModel"),onClick:()=>l({...a,models:a.models.filter((k,R)=>R!==E)}),children:m.jsx(nc,{})})]},E)),m.jsxs("button",{type:"button",className:"btn",onClick:()=>l({...a,models:[...a.models,Mf()]}),children:[m.jsx(Tr,{})," ",o("addModel")]}),m.jsxs("div",{className:"modal-actions",children:[m.jsx("button",{type:"button",className:"btn",onClick:()=>l(null),children:o("cancel")}),m.jsx("button",{type:"button",className:"btn primary",disabled:!a.providerId.trim()||!a.models.some(w=>w.id.trim()),onClick:v,children:o("save")})]})]}):m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"form-section-title",children:[o("builtinProviders")," ",m.jsx("em",{className:"section-hint",children:o("hintKeyOnly")})]}),m.jsxs("div",{className:"provider-list",children:[n.length===0&&m.jsx("div",{className:"dd-loading",children:o("loading")}),n.map(w=>m.jsxs("div",{className:"provider-row",children:[m.jsxs("div",{className:"provider-info",children:[m.jsx("span",{className:"provider-name",children:w.name}),m.jsxs("span",{className:"provider-sub",children:[w.id,w.configured&&m.jsx("span",{className:"auth-badge",children:o("configuredBadge")}),w.source&&!w.configured&&m.jsx("span",{className:"auth-badge dim",children:w.source})]})]}),m.jsx("div",{className:"provider-actions",children:w.configured?m.jsx("span",{className:"auth-badge",children:o("keyReady")}):m.jsxs(m.Fragment,{children:[m.jsx("input",{type:"password",className:"key-input",placeholder:o("pasteKey"),value:u[w.id]??"",onChange:E=>d(k=>({...k,[w.id]:E.target.value}))}),m.jsxs("button",{type:"button",className:"btn primary sm",disabled:!(u[w.id]??"").trim()||h===w.id,onClick:()=>p(w),children:[m.jsx(n0,{})," ",h===w.id?o("savingKey"):o("saveKey")]})]})})]},w.id))]}),m.jsx("div",{className:"form-section-title",children:o("customProviders")}),m.jsx("p",{className:"modal-desc",children:o("customDesc")}),t.length===0&&m.jsx("div",{className:"dd-loading",children:o("noCustomProviders")}),m.jsx("div",{className:"provider-list",children:t.map(w=>m.jsxs("div",{className:"provider-row",children:[m.jsxs("div",{className:"provider-info",children:[m.jsx("span",{className:"provider-name",children:w.providerId}),m.jsxs("span",{className:"provider-sub",children:[w.api??"—",w.baseUrl?` · ${w.baseUrl}`:"",w.models.length>0&&` · ${o("modelsCount",{n:w.models.length})}`]})]}),m.jsxs("div",{className:"provider-actions",children:[m.jsx("button",{type:"button",className:"iconbtn",title:o("edit"),onClick:()=>l(FL(w)),children:m.jsx(Nv,{})}),m.jsx("button",{type:"button",className:"iconbtn danger",title:o("delete"),onClick:()=>y(w),children:m.jsx(nc,{})})]})]},w.providerId))}),m.jsx("div",{className:"modal-actions",children:m.jsxs("button",{type:"button",className:"btn primary",onClick:()=>l(BL()),children:[m.jsx(Tr,{})," ",o("addProvider")]})})]})]})})}function mv({title:e,subtitle:t,enabled:n,onToggle:r}){const o=bt();return m.jsxs("div",{className:"set-row",children:[m.jsxs("div",{className:"set-row-info",children:[m.jsx("div",{className:"set-row-name",children:e}),t&&m.jsx("div",{className:"set-row-desc",children:t})]}),m.jsx("button",{type:"button",className:`set-switch ${n?"on":""}`,role:"switch","aria-checked":n,title:o(n?"settingsEnabled":"settingsDisabled"),onClick:r,children:m.jsx("span",{className:"set-switch-knob"})})]})}function jL({chat:e,send:t,onClose:n}){const r=bt(),o=e.settings,[a,l]=K.useState(""),[u,d]=K.useState("append"),h=K.useRef(!1),[g,p]=K.useState("");if(K.useEffect(()=>{o&&(d(o.promptMode),h.current||l(o.customSystemPrompt))},[o]),!o)return null;const v=new Set(o.disabledSkills),y=new Set(o.disabledExtensions),S=R=>t({type:"set_settings",...R}),w=R=>{const T=new Set(v);T.has(R.name)?T.delete(R.name):T.add(R.name),S({disabledSkills:[...T]})},E=R=>{const T=new Set(y);T.has(R.id)?T.delete(R.id):T.add(R.id),S({disabledExtensions:[...T]})},k=()=>S({promptMode:u,customSystemPrompt:a});return m.jsx("div",{className:"modal-backdrop",onClick:n,children:m.jsxs("div",{className:"modal settings-modal",onClick:R=>R.stopPropagation(),children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":r("close"),onClick:n,children:m.jsx(ls,{})}),m.jsxs("div",{className:"modal-head",children:[m.jsx(ic,{className:"modal-head-icon"}),m.jsx("h2",{children:r("settingsTitle")})]}),m.jsx("p",{className:"modal-desc",children:r("settingsDesc")}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(wv,{className:"set-section-icon"}),r("settingsSystemPrompt")]}),m.jsxs("div",{className:"set-mode-row",children:[m.jsx("label",{className:"set-field-label",children:r("settingsPromptMode")}),m.jsxs("select",{className:"set-select",value:u,onChange:R=>{const T=R.target.value;d(T),S({promptMode:T})},children:[m.jsx("option",{value:"append",children:r("promptModeAppend")}),m.jsx("option",{value:"replace",children:r("promptModeReplace")})]})]}),m.jsx("textarea",{className:"set-prompt-input",rows:4,placeholder:r("promptPlaceholder"),value:a,onFocus:()=>h.current=!0,onBlur:()=>{h.current=!1,k()},onChange:R=>l(R.target.value)}),m.jsx("p",{className:"set-hint",children:r(u==="append"?"promptAppendHint":"promptReplaceHint")})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(_c,{className:"set-section-icon"}),r("settingsSkills"),m.jsx("span",{className:"set-count",children:o.skills.length})]}),o.skills.length===0?m.jsx("p",{className:"set-empty",children:r("noSkills")}):m.jsx("div",{className:"set-list",children:o.skills.map(R=>m.jsx(mv,{title:R.name,subtitle:R.description,enabled:R.enabled,onToggle:()=>w(R)},R.name))})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(Jw,{className:"set-section-icon"}),r("settingsExtensions"),m.jsx("span",{className:"set-count",children:o.extensions.length})]}),o.extensions.length===0?m.jsx("p",{className:"set-empty",children:r("noExtensions")}):m.jsx("div",{className:"set-list",children:o.extensions.map(R=>m.jsx(mv,{title:R.name,subtitle:R.path,enabled:R.enabled,onToggle:()=>E(R)},R.id))})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(ic,{className:"set-section-icon"}),r("settingsPresets"),m.jsx("span",{className:"set-count",children:o.presets.length})]}),m.jsxs("div",{className:"set-preset-save",children:[m.jsx("input",{className:"set-input",placeholder:r("presetNamePlaceholder"),value:g,onChange:R=>p(R.target.value),onKeyDown:R=>{R.key==="Enter"&&g.trim()&&(t({type:"save_preset",name:g.trim()}),p(""))}}),m.jsxs("button",{type:"button",className:"dd-refresh accent",disabled:!g.trim(),onClick:()=>{t({type:"save_preset",name:g.trim()}),p("")},children:[m.jsx(Tr,{})," ",r("saveAsPreset")]})]}),o.presets.length===0?m.jsx("p",{className:"set-empty",children:r("noPresets")}):m.jsx("div",{className:"set-list",children:o.presets.map(R=>m.jsxs("div",{className:"set-row",children:[m.jsxs("div",{className:"set-row-info",children:[m.jsx("div",{className:"set-row-name",children:R.name}),m.jsxs("div",{className:"set-row-desc",children:[R.promptMode==="replace"?r("promptModeReplace"):r("promptModeAppend"),R.disabledSkills.length>0&&` · ${r("settingsSkills")} ${R.disabledSkills.length}`,R.disabledExtensions.length>0&&` · ${r("settingsExtensions")} ${R.disabledExtensions.length}`]})]}),m.jsxs("div",{className:"set-row-actions",children:[m.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>t({type:"apply_preset",name:R.name}),children:r("applyPreset")}),m.jsx("button",{type:"button",className:"set-icon-btn danger",title:r("deletePreset"),onClick:()=>t({type:"delete_preset",name:R.name}),children:m.jsx(nc,{})})]})]},R.name))})]}),m.jsx("div",{className:"modal-actions",children:m.jsx("button",{type:"button",className:"dd-refresh",onClick:n,children:r("close")})})]})})}const qh=5e3;function UL({file:e,content:t,send:n,onAddLines:r,onAttach:o,onClose:a}){const l=bt(),[u,d]=K.useState(null),[h,g]=K.useState(!1),[p,v]=K.useState(null),[y,S]=K.useState(!1),[w,E]=K.useState(!1),k=K.useRef(0),R=K.useRef(!1),T=K.useRef(null);K.useEffect(()=>{g(!0),d(null),v(null),n({type:"read_file",path:e.path})},[e.path,n]),K.useEffect(()=>{t&&t.path===e.path&&(d(t),g(!1))},[t,e.path]),K.useEffect(()=>{const F=Q=>{if(Q.key==="Escape"){a();return}const ie=Q.target,M=ie&&(ie.tagName==="INPUT"||ie.tagName==="TEXTAREA"||ie.isContentEditable);(Q.ctrlKey||Q.metaKey)&&Q.key.toLowerCase()==="a"&&!M&&(Q.preventDefault(),Z())};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[a,u]),K.useEffect(()=>{const F=()=>{R.current=!1,S(!1)};return window.addEventListener("mouseup",F),()=>window.removeEventListener("mouseup",F)},[]);const A=K.useMemo(()=>{if(!u)return[];const F=u.text.split(`
|
|
125
|
+
> ${H.command.command}`:""}`,onClick:()=>{a(H.id),u(!1)},children:[m.jsx("span",{className:`term-tab-dot ${H.running?"run":"exit"}`}),m.jsxs("span",{className:"term-tab-title",children:[H.title,!H.running&&m.jsx("span",{className:"term-tab-exit",children:r("exited",{code:H.exitCode===null?"":` ${H.exitCode}`})})]})]}),m.jsx("button",{type:"button",className:"term-tab-close",title:r("closeTerminal"),onClick:()=>A(H.id),children:m.jsx(ls,{})})]},H.id))]})]})]}),m.jsxs("div",{className:"term-main",children:[l&&m.jsx("div",{className:"drawer-backdrop",onClick:()=>u(!1)}),m.jsx("button",{type:"button",className:"term-side-toggle",title:r("commands"),onClick:()=>u(H=>!H),children:m.jsx(Ev,{})}),e.terminals.length===0?m.jsxs("div",{className:"term-empty",children:[m.jsx(Vd,{className:"term-empty-icon"}),m.jsx("div",{className:"term-empty-title",children:r("builtinTerminal")}),m.jsx("div",{className:"term-empty-sub",children:r("termEmptySub")})]}):e.terminals.map(H=>m.jsx(OL,{terminalId:H.id,command:H.command,cwd:H.cwd,active:H.id===o,send:t,register:n.register},H.id))]})]})}function IL({send:e,piConfigured:t,providers:n,installResult:r,onClose:o}){const a=bt(),[l,u]=K.useState(!1),[d,h]=K.useState(""),[g,p]=K.useState(""),[v,y]=K.useState(!1);K.useEffect(()=>{e({type:"list_providers"})},[e]),K.useEffect(()=>{t&&o()},[t,o]),K.useEffect(()=>{r&&u(!1)},[r]),K.useEffect(()=>{var T;!d&&n.length>0&&h(((T=n.find(A=>!A.configured))==null?void 0:T.id)??n[0].id)},[n,d]);const S=()=>{l||(u(!0),e({type:"install_pi_agent"}))},w=()=>{!g.trim()||v||(y(!0),e({type:"set_provider_api_key",provider:d.trim(),apiKey:g.trim()}),setTimeout(()=>y(!1),3e3))},E=()=>{e({type:"get_state"}),e({type:"list_providers"})},k=n.find(T=>T.id===d),R=r!==null&&!r.ok;return m.jsx("div",{className:"modal-backdrop",children:m.jsxs("div",{className:"modal setup-modal",children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":a("close"),onClick:o,children:m.jsx(ls,{})}),m.jsxs("div",{className:"modal-head",children:[m.jsx(_c,{className:"modal-head-icon"}),m.jsx("h2",{children:a("setupTitle")})]}),m.jsx("p",{className:"modal-desc",children:a("setupDesc")}),R?m.jsxs("div",{className:"setup-failed",children:[m.jsx("div",{className:"setup-done",children:a("installFailed")}),m.jsx("pre",{className:"setup-detail",children:r.detail}),m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:l,onClick:S,children:a("retryInstall")}),m.jsx("button",{type:"button",className:"btn",onClick:o,children:a("skip")})]})]}):r!=null&&r.ok?m.jsxs("div",{className:"setup-key-form",children:[m.jsx("div",{className:"setup-done",children:a("installDone")}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:a("provider")}),m.jsxs("select",{value:d,onChange:T=>h(T.target.value),children:[n.length===0&&m.jsx("option",{value:"",children:a("loading")}),n.map(T=>m.jsxs("option",{value:T.id,children:[T.name,"(",T.id,")",T.configured?` · ${a("configured")}`:""]},T.id))]}),(k==null?void 0:k.configured)&&m.jsx("div",{className:"field-hint",children:a("providerKeyReady")})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:a("apiKey")}),m.jsx("input",{type:"password",value:g,onChange:T=>p(T.target.value),placeholder:"sk-…"})]}),m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:!g.trim()||v||!d,onClick:w,children:a(v?"saving":"saveAndStart")}),m.jsxs("button",{type:"button",className:"btn",onClick:E,children:[m.jsx(kv,{})," ",a("recheck")]})]})]}):m.jsxs("div",{className:"setup-actions",children:[m.jsx("button",{type:"button",className:"btn primary",disabled:l,onClick:S,children:a(l?"installing":"autoInstall")}),m.jsx("button",{type:"button",className:"btn",onClick:o,children:a("skip")})]})]})})}const PL=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"],Mf=()=>({id:"",name:"",reasoning:!1,input:"text",contextWindow:"",maxTokens:""}),BL=()=>({providerId:"",name:"",api:"openai-completions",baseUrl:"",apiKey:"",authHeader:!0,models:[Mf()]});function FL(e){return{providerId:e.providerId,name:e.name??"",api:e.api??"openai-completions",baseUrl:e.baseUrl??"",apiKey:e.apiKey??"",authHeader:e.authHeader??!1,models:(e.models.length?e.models:[Mf()]).map(t=>{var n;return{id:t.id,name:t.name??"",reasoning:t.reasoning??!1,input:(n=t.input)!=null&&n.includes("image")?"text-image":"text",contextWindow:t.contextWindow?String(t.contextWindow):"",maxTokens:t.maxTokens?String(t.maxTokens):""}})}}function zL({send:e,providers:t,providerStatus:n,onClose:r}){const o=bt(),[a,l]=K.useState(null),[u,d]=K.useState({}),[h,g]=K.useState(null);K.useEffect(()=>{e({type:"list_models_config"}),e({type:"list_providers"})},[e]);const p=w=>{const E=(u[w.id]??"").trim();!E||h||(g(w.id),e({type:"set_provider_api_key",provider:w.id,apiKey:E}),setTimeout(()=>{g(null),d(k=>({...k,[w.id]:""})),e({type:"list_providers"})},1500))},v=()=>{if(!a)return;const w=a.providerId.trim(),E=a.models.filter(R=>R.id.trim()).map(R=>({id:R.id.trim(),name:R.name.trim()||void 0,reasoning:R.reasoning||void 0,input:R.input==="text-image"?["text","image"]:void 0,contextWindow:R.contextWindow?Number(R.contextWindow):void 0,maxTokens:R.maxTokens?Number(R.maxTokens):void 0})),k={providerId:w,name:a.name.trim()||void 0,api:a.api.trim()||void 0,baseUrl:a.baseUrl.trim()||void 0,apiKey:a.apiKey.trim()||void 0,authHeader:a.authHeader||void 0,models:E};e({type:"save_model_config",providerId:w,config:k}),r()},y=w=>{window.confirm(o("deleteProviderConfirm",{id:w.providerId,n:w.models.length}))&&e({type:"delete_model_config",providerId:w.providerId})},S=(w,E)=>{a&&l({...a,models:a.models.map((k,R)=>R===w?{...k,...E}:k)})};return m.jsx("div",{className:"modal-backdrop",children:m.jsxs("div",{className:"modal model-modal",children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":o("close"),onClick:r,children:m.jsx(ls,{})}),m.jsx("div",{className:"modal-head",children:m.jsx("h2",{children:o(a?"editProvider":"manageModelsTitle")})}),a?m.jsxs("div",{className:"provider-form",children:[m.jsxs("div",{className:"form-grid",children:[m.jsxs("label",{className:"field",children:[m.jsxs("span",{className:"field-label",children:[o("providerId")," ",m.jsx("em",{children:o("providerIdHint")})]}),m.jsx("input",{type:"text",value:a.providerId,disabled:t.some(w=>w.providerId===a.providerId),onChange:w=>l({...a,providerId:w.target.value}),placeholder:"my-proxy"})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("displayName")}),m.jsx("input",{type:"text",value:a.name,onChange:w=>l({...a,name:w.target.value}),placeholder:o("displayNamePh")})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("apiType")}),m.jsx("select",{value:a.api,onChange:w=>l({...a,api:w.target.value}),children:PL.map(w=>m.jsx("option",{value:w,children:w},w))})]}),m.jsxs("label",{className:"field",children:[m.jsxs("span",{className:"field-label",children:["baseUrl ",m.jsx("em",{children:o("baseUrlHint")})]}),m.jsx("input",{type:"text",value:a.baseUrl,onChange:w=>l({...a,baseUrl:w.target.value}),placeholder:"http://localhost:11434/v1"})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{className:"field-label",children:o("apiKey")}),m.jsx("input",{type:"password",value:a.apiKey,onChange:w=>l({...a,apiKey:w.target.value}),placeholder:o("apiKeyHint")})]}),m.jsxs("label",{className:"field check",children:[m.jsx("input",{type:"checkbox",checked:a.authHeader,onChange:w=>l({...a,authHeader:w.target.checked})}),m.jsx("span",{children:o("authHeader")})]})]}),m.jsx("div",{className:"form-section-title",children:o("modelsTitle")}),a.models.map((w,E)=>m.jsxs("div",{className:"model-row",children:[m.jsx("input",{type:"text",value:w.id,onChange:k=>S(E,{id:k.target.value}),placeholder:o("modelIdReq")}),m.jsx("input",{type:"text",value:w.name,onChange:k=>S(E,{name:k.target.value}),placeholder:o("displayName")}),m.jsxs("select",{value:w.input,onChange:k=>S(E,{input:k.target.value}),children:[m.jsx("option",{value:"text",children:o("text")}),m.jsx("option",{value:"text-image",children:o("textImage")})]}),m.jsxs("label",{className:"check",children:[m.jsx("input",{type:"checkbox",checked:w.reasoning,onChange:k=>S(E,{reasoning:k.target.checked})}),m.jsx("span",{children:o("reasoning")})]}),m.jsx("input",{type:"number",value:w.contextWindow,onChange:k=>S(E,{contextWindow:k.target.value}),placeholder:o("contextWindow"),title:"contextWindow"}),m.jsx("input",{type:"number",value:w.maxTokens,onChange:k=>S(E,{maxTokens:k.target.value}),placeholder:o("maxOutput"),title:"maxTokens"}),m.jsx("button",{type:"button",className:"iconbtn danger",title:o("removeModel"),onClick:()=>l({...a,models:a.models.filter((k,R)=>R!==E)}),children:m.jsx(nc,{})})]},E)),m.jsxs("button",{type:"button",className:"btn",onClick:()=>l({...a,models:[...a.models,Mf()]}),children:[m.jsx(Tr,{})," ",o("addModel")]}),m.jsxs("div",{className:"modal-actions",children:[m.jsx("button",{type:"button",className:"btn",onClick:()=>l(null),children:o("cancel")}),m.jsx("button",{type:"button",className:"btn primary",disabled:!a.providerId.trim()||!a.models.some(w=>w.id.trim()),onClick:v,children:o("save")})]})]}):m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"form-section-title",children:[o("builtinProviders")," ",m.jsx("em",{className:"section-hint",children:o("hintKeyOnly")})]}),m.jsxs("div",{className:"provider-list",children:[n.length===0&&m.jsx("div",{className:"dd-loading",children:o("loading")}),n.map(w=>m.jsxs("div",{className:"provider-row",children:[m.jsxs("div",{className:"provider-info",children:[m.jsx("span",{className:"provider-name",children:w.name}),m.jsxs("span",{className:"provider-sub",children:[w.id,w.configured&&m.jsx("span",{className:"auth-badge",children:o("configuredBadge")}),w.source&&!w.configured&&m.jsx("span",{className:"auth-badge dim",children:w.source})]})]}),m.jsx("div",{className:"provider-actions",children:w.configured?m.jsx("span",{className:"auth-badge",children:o("keyReady")}):m.jsxs(m.Fragment,{children:[m.jsx("input",{type:"password",className:"key-input",placeholder:o("pasteKey"),value:u[w.id]??"",onChange:E=>d(k=>({...k,[w.id]:E.target.value}))}),m.jsxs("button",{type:"button",className:"btn primary sm",disabled:!(u[w.id]??"").trim()||h===w.id,onClick:()=>p(w),children:[m.jsx(n0,{})," ",h===w.id?o("savingKey"):o("saveKey")]})]})})]},w.id))]}),m.jsx("div",{className:"form-section-title",children:o("customProviders")}),m.jsx("p",{className:"modal-desc",children:o("customDesc")}),t.length===0&&m.jsx("div",{className:"dd-loading",children:o("noCustomProviders")}),m.jsx("div",{className:"provider-list",children:t.map(w=>m.jsxs("div",{className:"provider-row",children:[m.jsxs("div",{className:"provider-info",children:[m.jsx("span",{className:"provider-name",children:w.providerId}),m.jsxs("span",{className:"provider-sub",children:[w.api??"—",w.baseUrl?` · ${w.baseUrl}`:"",w.models.length>0&&` · ${o("modelsCount",{n:w.models.length})}`]})]}),m.jsxs("div",{className:"provider-actions",children:[m.jsx("button",{type:"button",className:"iconbtn",title:o("edit"),onClick:()=>l(FL(w)),children:m.jsx(Nv,{})}),m.jsx("button",{type:"button",className:"iconbtn danger",title:o("delete"),onClick:()=>y(w),children:m.jsx(nc,{})})]})]},w.providerId))}),m.jsx("div",{className:"modal-actions",children:m.jsxs("button",{type:"button",className:"btn primary",onClick:()=>l(BL()),children:[m.jsx(Tr,{})," ",o("addProvider")]})})]})]})})}function mv({title:e,subtitle:t,enabled:n,onToggle:r}){const o=bt();return m.jsxs("div",{className:"set-row",children:[m.jsxs("div",{className:"set-row-info",children:[m.jsx("div",{className:"set-row-name",children:e}),t&&m.jsx("div",{className:"set-row-desc",children:t})]}),m.jsx("button",{type:"button",className:`set-switch ${n?"on":""}`,role:"switch","aria-checked":n,title:o(n?"settingsEnabled":"settingsDisabled"),onClick:r,children:m.jsx("span",{className:"set-switch-knob"})})]})}function jL({chat:e,send:t,onClose:n}){const r=bt(),o=e.settings,[a,l]=K.useState(""),[u,d]=K.useState("append"),h=K.useRef(!1),[g,p]=K.useState("");if(K.useEffect(()=>{o&&(d(o.promptMode),h.current||l(o.customSystemPrompt))},[o]),!o)return null;const v=new Set(o.disabledSkills),y=new Set(o.disabledExtensions),S=R=>t({type:"set_settings",...R}),w=R=>{const T=new Set(v);T.has(R.name)?T.delete(R.name):T.add(R.name),S({disabledSkills:[...T]})},E=R=>{const T=new Set(y);T.has(R.id)?T.delete(R.id):T.add(R.id),S({disabledExtensions:[...T]})},k=()=>S({promptMode:u,customSystemPrompt:a});return m.jsx("div",{className:"modal-backdrop",onClick:n,children:m.jsxs("div",{className:"modal settings-modal",onClick:R=>R.stopPropagation(),children:[m.jsx("button",{type:"button",className:"modal-close","aria-label":r("close"),onClick:n,children:m.jsx(ls,{})}),m.jsxs("div",{className:"modal-head",children:[m.jsx(ic,{className:"modal-head-icon"}),m.jsx("h2",{children:r("settingsTitle")})]}),m.jsx("p",{className:"modal-desc",children:r("settingsDesc")}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(wv,{className:"set-section-icon"}),r("settingsSystemPrompt")]}),m.jsxs("div",{className:"set-mode-row",children:[m.jsx("label",{className:"set-field-label",children:r("settingsPromptMode")}),m.jsxs("select",{className:"set-select",value:u,onChange:R=>{const T=R.target.value;d(T),S({promptMode:T})},children:[m.jsx("option",{value:"append",children:r("promptModeAppend")}),m.jsx("option",{value:"replace",children:r("promptModeReplace")})]})]}),m.jsx("textarea",{className:"set-prompt-input",rows:6,placeholder:r("promptPlaceholder"),value:a,onFocus:()=>h.current=!0,onBlur:()=>{h.current=!1,k()},onChange:R=>l(R.target.value)}),m.jsx("p",{className:"set-hint",children:r(u==="append"?"promptAppendHint":"promptReplaceHint")})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(_c,{className:"set-section-icon"}),r("settingsSkills"),m.jsx("span",{className:"set-count",children:o.skills.length})]}),o.skills.length===0?m.jsx("p",{className:"set-empty",children:r("noSkills")}):m.jsx("div",{className:"set-list",children:o.skills.map(R=>m.jsx(mv,{title:R.name,subtitle:R.description,enabled:R.enabled,onToggle:()=>w(R)},R.name))})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(Jw,{className:"set-section-icon"}),r("settingsExtensions"),m.jsx("span",{className:"set-count",children:o.extensions.length})]}),o.extensions.length===0?m.jsx("p",{className:"set-empty",children:r("noExtensions")}):m.jsx("div",{className:"set-list",children:o.extensions.map(R=>m.jsx(mv,{title:R.name,subtitle:R.path,enabled:R.enabled,onToggle:()=>E(R)},R.id))})]}),m.jsxs("div",{className:"set-section",children:[m.jsxs("div",{className:"set-section-title",children:[m.jsx(ic,{className:"set-section-icon"}),r("settingsPresets"),m.jsx("span",{className:"set-count",children:o.presets.length})]}),m.jsxs("div",{className:"set-preset-save",children:[m.jsx("input",{className:"set-input",placeholder:r("presetNamePlaceholder"),value:g,onChange:R=>p(R.target.value),onKeyDown:R=>{R.key==="Enter"&&g.trim()&&(t({type:"save_preset",name:g.trim()}),p(""))}}),m.jsxs("button",{type:"button",className:"set-save-btn",disabled:!g.trim(),onClick:()=>{t({type:"save_preset",name:g.trim()}),p("")},children:[m.jsx(Tr,{})," ",r("saveAsPreset")]})]}),o.presets.length===0?m.jsx("p",{className:"set-empty",children:r("noPresets")}):m.jsx("div",{className:"set-list",children:o.presets.map(R=>m.jsxs("div",{className:"set-row",children:[m.jsxs("div",{className:"set-row-info",children:[m.jsx("div",{className:"set-row-name",children:R.name}),m.jsxs("div",{className:"set-row-desc",children:[R.promptMode==="replace"?r("promptModeReplace"):r("promptModeAppend"),R.disabledSkills.length>0&&` · ${r("settingsSkills")} ${R.disabledSkills.length}`,R.disabledExtensions.length>0&&` · ${r("settingsExtensions")} ${R.disabledExtensions.length}`]})]}),m.jsxs("div",{className:"set-row-actions",children:[m.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>t({type:"apply_preset",name:R.name}),children:r("applyPreset")}),m.jsx("button",{type:"button",className:"set-icon-btn danger",title:r("deletePreset"),onClick:()=>t({type:"delete_preset",name:R.name}),children:m.jsx(nc,{})})]})]},R.name))})]}),m.jsx("div",{className:"modal-actions",children:m.jsx("button",{type:"button",className:"dd-refresh",onClick:n,children:r("close")})})]})})}const qh=5e3;function UL({file:e,content:t,send:n,onAddLines:r,onAttach:o,onClose:a}){const l=bt(),[u,d]=K.useState(null),[h,g]=K.useState(!1),[p,v]=K.useState(null),[y,S]=K.useState(!1),[w,E]=K.useState(!1),k=K.useRef(0),R=K.useRef(!1),T=K.useRef(null);K.useEffect(()=>{g(!0),d(null),v(null),n({type:"read_file",path:e.path})},[e.path,n]),K.useEffect(()=>{t&&t.path===e.path&&(d(t),g(!1))},[t,e.path]),K.useEffect(()=>{const F=Q=>{if(Q.key==="Escape"){a();return}const ie=Q.target,M=ie&&(ie.tagName==="INPUT"||ie.tagName==="TEXTAREA"||ie.isContentEditable);(Q.ctrlKey||Q.metaKey)&&Q.key.toLowerCase()==="a"&&!M&&(Q.preventDefault(),Z())};return document.addEventListener("keydown",F),()=>document.removeEventListener("keydown",F)},[a,u]),K.useEffect(()=>{const F=()=>{R.current=!1,S(!1)};return window.addEventListener("mouseup",F),()=>window.removeEventListener("mouseup",F)},[]);const A=K.useMemo(()=>{if(!u)return[];const F=u.text.split(`
|
|
126
126
|
`);return F.length>0&&F[F.length-1]===""&&F.pop(),F.slice(0,qh)},[u]),V=(u==null?void 0:u.lines)??0,D=V>qh,ne=(F,Q)=>{if(Q){const ie=k.current>0?k.current:F;v({start:Math.min(ie,F),end:Math.max(ie,F)})}else k.current=F,v({start:F,end:F})},Z=()=>{A.length!==0&&(k.current=1,v({start:1,end:A.length}))},ee=()=>{p&&(r(e.path,e.name,p.start,p.end),E(!0),T.current&&clearTimeout(T.current),T.current=setTimeout(()=>E(!1),1400))},W=p?p.end-p.start+1:0,H=(u==null?void 0:u.binary)??!1,U=(u==null?void 0:u.truncated)??!1,O=(u==null?void 0:u.kind)??"text",q=F=>`/api/file?clientId=${encodeURIComponent(Zd())}&path=${encodeURIComponent(F)}`;return m.jsx("div",{className:"fp-overlay",onMouseDown:F=>{F.target===F.currentTarget&&a()},children:m.jsxs("div",{className:"fp",children:[m.jsxs("div",{className:"fp-head",children:[m.jsx("span",{className:"fp-name",title:e.path,children:e.name}),m.jsx("span",{className:"fp-path",children:e.path}),m.jsxs("span",{className:"fp-meta",children:[u&&O==="text"&&!H&&l("fileLines",{n:V}),u&&` · ${HL(u.size)}`]}),m.jsxs("span",{className:"fp-head-actions",children:[O!=="video"&&O!=="none"&&m.jsx("button",{type:"button",className:"fp-attach inline","data-tip":l("attachInlineTip"),onClick:()=>o(e.path,e.name,"inline"),children:m.jsx(Tr,{})}),m.jsx("button",{type:"button",className:"fp-attach ref","data-tip":l("referenceTip"),onClick:()=>o(e.path,e.name,"reference"),children:m.jsx(Gh,{})}),m.jsx("button",{type:"button",className:"fp-close",title:l("close"),onClick:a,children:m.jsx(ls,{})})]})]}),U&&O==="text"&&!H&&m.jsx("div",{className:"fp-notice",children:l("previewTruncated")}),h&&!u&&m.jsx("div",{className:"fp-empty",children:l("loading")}),!h&&O==="none"&&!H&&m.jsx("div",{className:"fp-empty",children:l("previewNotSupported")}),!h&&O==="image"&&m.jsx("div",{className:"fp-media-wrap",children:m.jsx("img",{className:"fp-media",src:q(e.path),alt:e.name})}),!h&&O==="video"&&m.jsx("div",{className:"fp-media-wrap",children:m.jsx("video",{className:"fp-media",src:q(e.path),controls:!0,preload:"metadata"})}),!h&&H&&O!=="image"&&O!=="video"&&u&&m.jsxs("div",{className:"fp-hex-wrap",children:[m.jsxs("div",{className:"fp-notice",children:[l("binaryFile"),u.truncated&&l("binaryHexTruncated")]}),m.jsx("pre",{className:"fp-hex",children:u.text})]}),!h&&O==="text"&&!H&&u&&A.length===0&&m.jsx("div",{className:"fp-empty",children:l("emptyFile")}),!h&&O==="text"&&!H&&A.length>0&&m.jsxs("div",{className:`fp-code ${y?"dragging":""}`,onMouseDown:F=>{F.button===0&&F.preventDefault()},children:[A.map((F,Q)=>{const ie=Q+1,M=p!==null&&ie>=p.start&&ie<=p.end;return m.jsxs("div",{className:`fp-line ${M?"sel":""}`,onMouseDown:Y=>{Y.button===0&&(ne(ie,Y.shiftKey),R.current=!0,S(!0))},onMouseEnter:()=>{R.current&&ne(ie,!0)},children:[m.jsx("span",{className:"fp-num",children:ie}),m.jsx("span",{className:"fp-code-text",children:F})]},ie)}),D&&m.jsx("div",{className:"fp-lines-note",children:l("previewLinesTruncated",{n:qh})})]}),m.jsx("div",{className:"fp-foot",children:O==="text"&&m.jsxs(m.Fragment,{children:[m.jsx("span",{className:"fp-hint",children:p?l("selectedRange",{n:W,start:p.start,end:p.end}):l("selectLinesHint")}),m.jsxs("div",{className:"fp-actions",children:[m.jsx("button",{type:"button",className:"btn",disabled:A.length===0,onClick:Z,children:l("selectAll")}),m.jsx("button",{type:"button",className:"btn",disabled:!p,onClick:()=>v(null),children:l("clearSelection")}),m.jsxs("button",{type:"button",className:"btn primary",disabled:!p||H,onClick:ee,children:[w?m.jsx(Mv,{}):null,l(w?"addedToChat":"addToChat")]})]})]})})]})})}function HL(e){return e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>=1024?`${Math.round(e/1024)} KB`:`${e} B`}const nS="pi-web-sounds",Xo={enabled:!0,question:!0,done:!0,start:!1,error:!0,volume:100};function iS(){try{const e=localStorage.getItem(nS);if(!e)return{...Xo};const t=JSON.parse(e),n={...Xo,...t};for(const r of["enabled","question","done","start","error"])typeof n[r]!="boolean"&&(n[r]=Xo[r]);return typeof n.volume!="number"||!Number.isFinite(n.volume)?n.volume=Xo.volume:n.volume=Math.round(Math.max(0,Math.min(100,n.volume))/5)*5,n}catch{return{...Xo}}}function $L(e){try{localStorage.setItem(nS,JSON.stringify(e))}catch{}}let Zo=null;function WL(){try{if(!Zo){const e=window.AudioContext??window.webkitAudioContext;if(!e)return null;Zo=new e}return Zo.state==="suspended"&&Zo.resume(),Zo}catch{return null}}const KL=[{type:"sine",freq:587.33,start:0,dur:.13,peak:.5},{type:"sine",freq:880,start:.11,dur:.24,peak:.5}],qL=[{type:"sine",freq:880,start:0,dur:.15,peak:.35},{type:"sine",freq:587.33,start:.15,dur:.32,peak:.35}],VL=[{type:"triangle",freq:660,start:0,dur:.08,peak:.22}],GL=[{type:"square",freq:220,start:0,dur:.16,peak:.18},{type:"square",freq:174.61,start:.18,dur:.26,peak:.18}],YL={question:KL,done:qL,start:VL,error:GL};function XL(e,t,n){const r=e.createOscillator(),o=e.createGain();r.type=t.type,r.frequency.value=t.freq;const a=e.currentTime+t.start,l=Math.max(1e-4,t.peak*n);o.gain.setValueAtTime(1e-4,a),o.gain.exponentialRampToValueAtTime(l,a+.012),o.gain.exponentialRampToValueAtTime(1e-4,a+t.dur),r.connect(o),o.connect(e.destination),r.start(a),r.stop(a+t.dur+.05)}function Qo(e,t=iS()){if(!t.enabled||!t[e])return;const n=WL();if(!n)return;const r=Math.max(0,Math.min(1,t.volume/100));for(const o of YL[e])XL(n,o,r)}function ZL(){var I;const e=bt(),{chat:t,send:n,dismissNotice:r,pushNotice:o,terminal:a}=x0(),[l,u]=K.useState([]),[d,h]=K.useState(null),[g,p]=K.useState("chat"),[v,y]=K.useState(null),[S,w]=K.useState(!1),[E,k]=K.useState(!1),[R,T]=K.useState(!1),[A,V]=K.useState(iS),D=K.useRef(null),ne=K.useRef(null),Z=K.useRef(0);K.useEffect(()=>{$L(A)},[A]),K.useEffect(()=>{var ae;const P=((ae=t.state)==null?void 0:ae.isStreaming)??!1,N=D.current;D.current=P,N!==null&&(!N&&P?Qo("start",A):N&&!P&&Qo("done",A))},[(I=t.state)==null?void 0:I.isStreaming,A]),K.useEffect(()=>{var N;const P=((N=t.dialog)==null?void 0:N.id)??null;P!==null&&P!==ne.current&&Qo("question",A),ne.current=P},[t.dialog,A]),K.useEffect(()=>{const P=[...t.notices].reverse().find(N=>N.level==="error");P&&P.id!==Z.current&&(Z.current=P.id,Qo("error",A))},[t.notices,A]);const ee=(P,N,ae,ye=!1,z)=>{const pe=`${P}|${ae}|${z?`${z.start}-${z.end}`:""}`;u(ve=>ve.some(be=>`${be.path}|${be.mode}|${be.lines?`${be.lines.start}-${be.lines.end}`:""}`===pe)?ve:[...ve,{path:P,name:N,mode:ae,isDir:ye,...z?{lines:z}:{}}])},W=P=>u(N=>N.filter(ae=>ae.key?ae.key!==P:ae.path!==P)),H=K.useCallback(P=>(y(null),n(P)),[n]),U=K.useRef(0),O=K.useRef(0),q=P=>{var ye;const N=Date.now();(ye=t.state)!=null&&ye.model&&!t.state.model.vision&&N-O.current>1e4&&(O.current=N,o("warning",e("imageNotSupported")));const ae=`paste-${++U.current}`;u(z=>[...z,{path:"",key:ae,name:P.name,mode:"inline",imageData:P.data,mimeType:P.mimeType}])},F=async P=>{for(const N of P){const ae=await pR(N);if(!ae){o("error",e("imageLoadFailed",{name:N.name}));continue}q(ae)}},Q=20*1024*1024,ie=K.useRef(0),M=async P=>{if(P.size>Q){o("warning",e("fileTooLarge",{name:P.name,size:Q/1024/1024}));return}let N;try{N=(await new Promise((z,pe)=>{const ve=new FileReader;ve.onload=()=>z(ve.result),ve.onerror=()=>pe(ve.error??new Error("read failed")),ve.readAsDataURL(P)})).replace(/^data:[^;]*;base64,/,"")}catch{o("error",e("fileLoadFailed",{name:P.name}));return}const ae=`upload-${++ie.current}`;u(ye=>[...ye,{path:"",key:ae,name:P.name,mode:"inline",fileData:N,size:P.size,mimeType:P.type||void 0}])},Y=async P=>{for(const N of P)Vl(N.type)?await F([N]):await M(N)},C=K.useCallback((P,N)=>{n({type:"edit_message",messageId:P,text:N})},[n]);return m.jsxs("div",{className:"app",onDragOver:P=>P.preventDefault(),onDrop:P=>P.preventDefault(),children:[m.jsx(p0,{chat:t,send:n,view:g,onViewChange:P=>{p(P),y(null)},onOpenPanel:y,onManageModels:()=>k(!0),onOpenSettings:()=>T(!0),sound:A,onSoundChange:V,onSoundPreview:P=>Qo(P,A)}),m.jsx("div",{className:"notices",children:t.notices.map(P=>m.jsx("button",{type:"button",className:`notice notice-${P.level}`,onClick:()=>r(P.id),children:P.text},P.id))}),m.jsxs("div",{className:"layout",children:[v&&m.jsx("div",{className:"drawer-backdrop",onClick:()=>y(null)}),m.jsxs("div",{className:`view-pane ${g==="chat"?"":"hidden"}`,children:[m.jsx("div",{className:`panel-drawer drawer-left ${v==="left"?"open":""}`,children:m.jsx(m0,{chat:t,send:H})}),m.jsxs("main",{className:"main",children:[t.state?m.jsx(hR,{state:t.state,liveOutputs:t.liveOutputs,toolStatuses:t.toolStatuses,onEdit:C,onKillBash:()=>n({type:"abort_bash"})},t.state.conversationId??"boot"):m.jsx("div",{className:"boot-wait",children:t.ready?e("loadingSession"):e("connectingServer")}),m.jsx(gR,{chat:t,send:n}),m.jsx(mR,{chat:t,send:n,attachments:l,onRemoveAttachment:W,onAddImageFiles:F,onAddLocalFiles:Y,onNotice:o,onManageModels:()=>k(!0),onSent:()=>u([])})]}),m.jsx("div",{className:`panel-drawer drawer-right ${v==="right"?"open":""}`,children:m.jsx(L0,{chat:t,send:H,onAttach:(P,N,ae,ye)=>{y(null),ee(P,N,ae,ye)},onPreview:(P,N)=>{y(null),h({path:P,name:N})},onNotice:(P,N)=>o(P,N)})})]}),m.jsx("div",{className:`view-pane ${g==="terminal"?"":"hidden"}`,children:m.jsx(DL,{chat:t,send:n,terminal:a})})]}),m.jsx(_R,{chat:t,send:n}),t.dialog&&m.jsx(yR,{dialog:t.dialog,send:n}),d&&m.jsx(UL,{file:d,content:t.fileContent,send:n,onAddLines:(P,N,ae,ye)=>ee(P,N,"lines",!1,{start:ae,end:ye}),onAttach:(P,N,ae)=>ee(P,N,ae),onClose:()=>h(null)}),t.ready&&t.state&&t.state.piConfigured===!1&&!S&&!E&&m.jsx(IL,{send:n,piConfigured:t.state.piConfigured,providers:t.providers,installResult:t.installResult,onClose:()=>w(!0)}),E&&m.jsx(zL,{send:n,providers:t.modelsConfig,providerStatus:t.providers,onClose:()=>k(!1)}),R&&m.jsx(jL,{chat:t,send:n,onClose:()=>T(!1)})]})}Hw.createRoot(document.getElementById("root")).render(m.jsx(K.StrictMode,{children:m.jsx(h0,{children:m.jsx(ZL,{})})}));
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* The original design remains. The terminal itself
|
|
30
30
|
* has been extended to include xterm CSI codes, among
|
|
31
31
|
* other features.
|
|
32
|
-
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}:root{--bg: #0d0e12;--bg-elev: #14161c;--bg-elev2: #1a1d26;--border: #262a35;--border-soft: #1e2230;--text: #e6e8ef;--text-dim: #9aa1b4;--text-faint: #6b7284;--accent: #8b5cf6;--accent-soft: rgba(139, 92, 246, .14);--green: #34d399;--green-soft: rgba(52, 211, 153, .12);--red: #f87171;--red-soft: rgba(248, 113, 113, .12);--amber: #fbbf24;--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;line-height:1.6}.app{display:flex;flex-direction:column;height:100%}.layout{flex:1;display:flex;min-height:0}.main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}.panel{display:flex;flex-direction:column;width:240px;flex-shrink:0;min-height:0;background:var(--bg-elev);border-right:1px solid var(--border);position:relative}.panel-right{border-right:none;border-left:1px solid var(--border)}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;border-bottom:1px solid var(--border-soft);flex-shrink:0}.panel-title{font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.panel-new,.panel-refresh{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev2);color:var(--text-dim);cursor:pointer;padding:3px 8px;font-size:12px}.panel-new:hover,.panel-refresh:hover{color:var(--text);border-color:var(--accent)}.panel-fab{position:absolute;right:14px;bottom:14px;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);font-size:14px;cursor:pointer;box-shadow:0 6px 20px #00000073;z-index:2}.panel-fab:hover{color:var(--accent);border-color:var(--accent);box-shadow:0 8px 24px #00000080}.panel-fab:active{transform:scale(.94)}.panel-right .panel-body,.sessions-scroll{padding-bottom:56px}.panel-convs{flex-shrink:0;max-height:32%;overflow-y:auto;padding:6px 6px 0}.panel-sessions{flex:1;min-height:0;display:flex;flex-direction:column;padding:0 6px}.panel-sessions .panel-section-title{flex-shrink:0;padding-top:8px}.sessions-scroll{flex:1;overflow-y:auto;min-height:0}.panel-body{flex:1;overflow-y:auto;padding:6px}.panel-widgets{flex-shrink:0;max-height:40%;overflow-y:auto;padding:8px;border-top:1px solid var(--border-soft);background:#00000026}.widget{border:1px solid var(--border-soft);border-radius:8px;background:var(--bg-elev2);margin-bottom:6px;overflow:hidden}.widget:last-child{margin-bottom:0}.widget-title{padding:4px 10px;font-size:10.5px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--text-faint);border-bottom:1px solid var(--border-soft)}.widget-lines{margin:0;padding:6px 10px;font-family:var(--mono);font-size:11px;line-height:1.5;color:var(--text-dim);white-space:pre;overflow-x:auto}.pc-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:5px 8px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);font-size:12px;text-align:left;cursor:pointer}.pc-item:hover,.pc-item.sel{background:var(--accent-soft);color:var(--text)}.pc-icon{flex-shrink:0;margin-top:1px;color:var(--text-faint)}.pc-item.sel .pc-icon{color:var(--accent)}.pc-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.pc-name{font-family:var(--mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pc-path{font-size:10.5px;line-height:1.4;color:var(--text-faint);font-family:var(--mono);word-break:break-all;overflow-wrap:anywhere}.panel-empty{padding:16px 8px;text-align:center;font-size:12px;color:var(--text-faint)}.files-truncated{color:var(--amber);border-top:1px dashed var(--border);margin-top:8px;padding-top:12px}.session-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;border-radius:8px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer;margin-bottom:2px}.session-item:hover{background:var(--bg-elev2);color:var(--text)}.session-item.active{background:var(--accent-soft);color:var(--text);border:1px solid rgba(139,92,246,.3);padding:7px 9px}.session-icon{flex-shrink:0;color:var(--text-faint)}.session-item.active .session-icon{color:var(--accent)}.session-info{flex:1;min-width:0;display:flex;flex-direction:column}.session-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-sub{font-size:11px;color:var(--text-faint)}.session-src{margin-left:6px;font-size:9.5px;padding:0 5px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint);text-transform:uppercase;letter-spacing:.4px;vertical-align:1px}.session-time{font-size:10.5px;color:var(--text-faint);flex-shrink:0}.panel-projects{flex-shrink:0;max-height:45%;display:flex;flex-direction:column;padding:6px 6px 8px;border-bottom:2px solid var(--border)}.panel-projects .panel-section-title{flex-shrink:0}.projects-scroll{flex:1;overflow-y:auto;min-height:0}.panel-section-title{padding:4px 10px 6px;font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.panel-section-divider{height:1px;background:var(--border);margin:6px 10px}.conv-streaming{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:var(--green);box-shadow:0 0 4px var(--green);animation:conv-pulse 1.2s ease-in-out infinite}@keyframes conv-pulse{0%,to{opacity:1}50%{opacity:.25}}.project-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;border-radius:8px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer;margin-bottom:2px}.project-item:hover{background:var(--bg-elev2);color:var(--text)}.project-item.active{background:var(--accent-soft);color:var(--text);border:1px solid rgba(139,92,246,.3);padding:6px 9px}.project-icon{flex-shrink:0;color:var(--text-faint)}.project-item.active .project-icon{color:var(--accent)}.project-info{flex:1;min-width:0;display:flex;flex-direction:column}.project-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-path{font-size:11px;color:var(--text-faint);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-time{font-size:10.5px;color:var(--text-faint);flex-shrink:0}.panel-crumbs{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--border-soft);flex-shrink:0;font-size:12px}.crumb{border:none;background:transparent;color:var(--text-faint);cursor:pointer;padding:2px 4px;border-radius:4px;font-size:12px;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crumb:hover{color:var(--text);background:var(--bg-elev2)}.crumb.active{color:var(--accent)}.crumb-seg{display:inline-flex;align-items:center;color:var(--text-faint)}.file-item{display:flex;align-items:center;gap:7px;width:100%;padding:5px 8px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer}.file-item.dir{cursor:default}.file-dir-main{flex:1;min-width:0;display:flex;align-items:center;gap:7px;border:none;background:transparent;color:inherit;font-size:inherit;text-align:left;cursor:pointer;padding:0}.file-item:hover{background:var(--bg-elev2);color:var(--text)}.file-icon{flex-shrink:0;color:var(--text-faint)}.file-item.dir .file-icon{color:#fbbf24}.file-name{flex:1;min-width:0;display:flex;align-items:center;gap:7px;border:none;background:transparent;color:inherit;font-size:inherit;font-family:inherit;text-align:left;padding:0;overflow:hidden;cursor:pointer}.file-name:hover{color:var(--accent)}.file-name.no-preview{cursor:default}.file-name.no-preview:hover{color:inherit}.file-name-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-attach{position:relative;display:none;align-items:center;justify-content:center;width:22px;height:22px;border:none;border-radius:5px;cursor:pointer;flex-shrink:0}.file-item:hover .file-attach{display:inline-flex}.file-attach:after{content:attr(data-tip);position:absolute;bottom:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.file-attach:before{content:"";position:absolute;bottom:calc(100% + 3px);right:6px;border:5px solid transparent;border-top-color:#232733;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40}.file-attach:hover:after,.file-attach:hover:before{opacity:1}.chip[data-tip]{position:relative}.chip[data-tip]:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.chip[data-tip]:hover:after{opacity:1}.file-attach.inline{background:var(--accent-soft);color:var(--accent)}.file-attach.inline:hover{background:var(--accent);color:#fff}.file-attach.download{background:#34d39924;color:var(--green);text-decoration:none}.file-attach.download:hover{background:var(--green);color:#fff}.file-attach.ref{background:#fbbf241f;color:var(--amber)}.file-attach.ref:hover{background:var(--amber);color:#1a1a1a}.attach-row{max-width:860px;margin:0 auto 6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}.attach-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border:1px solid rgba(139,92,246,.4);border-radius:999px;background:var(--accent-soft);color:var(--text);font-size:12px;max-width:320px}.attach-chip.reference{border-color:#fbbf2466;background:#fbbf241a}.attach-chip.lines{border-color:#34d39966;background:#34d3991a}.attach-chip.image{border-color:#ec489973;background:#ec48991f}.attach-chip.file{border-color:#60a5fa73;background:#60a5fa1f}.inputbar.drop-active{outline:2px dashed var(--accent);outline-offset:-2px}.drop-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg-elev) 88%,transparent);z-index:5;pointer-events:none}.drop-overlay span{padding:10px 18px;border:1px dashed var(--accent);border-radius:10px;background:var(--bg-elev2);color:var(--text);font-size:14px}.attach-range{font-family:var(--mono);font-size:10.5px;padding:0 6px;border-radius:999px;background:#34d3992e;color:var(--green)}.attach-remove{border:none;background:transparent;color:var(--text-dim);cursor:pointer;font-size:14px;line-height:1;padding:0 2px}.attach-remove:hover{color:var(--red)}.attach-hint{font-size:11.5px;color:var(--text-faint)}.attachcard{margin:6px 0;border:1px dashed rgba(139,92,246,.45);border-radius:8px;background:var(--accent-soft);overflow:hidden}.attachcard-head{display:flex;align-items:center;gap:8px;width:100%;padding:7px 12px;border:none;background:transparent;color:var(--text);font-size:12.5px;cursor:pointer;text-align:left}.attachcard-head:hover{background:#8b5cf614}.attachcard-icon{flex-shrink:0}.attachcard-name{font-weight:600;font-family:var(--mono);font-size:12px}.attachcard-path{color:var(--text-faint);font-size:11px;font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.attachcard-meta{margin-left:auto;color:var(--text-faint);font-size:11px;flex-shrink:0}.attachcard-mode{margin-left:auto;font-size:11px;flex-shrink:0;padding:1px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint)}.attachcard-mode.inline{color:var(--green);border-color:#34d39959}.attachcard-mode.ref{color:var(--amber);border-color:#fbbf2466}.attachcard-mode.lines{color:var(--accent);border-color:#8b5cf666}.attachcard-refnote{padding:8px 12px;border-top:1px dashed rgba(251,191,36,.3);font-size:11.5px;color:var(--text-faint)}.attachcard-content{margin:0;padding:10px 12px;border-top:1px dashed rgba(139,92,246,.3);font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--text-dim);white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto;background:#0003}.attachcard-image img{max-width:100%;max-height:320px;border-radius:0 0 8px 8px;display:block}.skillcard{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev2);overflow:hidden}.skillcard-head{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:transparent;color:var(--text);font-size:12.5px;cursor:pointer;text-align:left;transition:background .12s ease}.skillcard-head:hover{background:#8b5cf614}.skillcard-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:22px;height:22px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:12px}.skillcard-name{font-family:var(--mono);font-weight:600;color:var(--text);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skillcard-path{flex:1;min-width:0;color:var(--text-faint);font-size:11px;font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skillcard-action{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;color:var(--text-faint);font-size:11.5px}.skillcard-action:hover{color:var(--text)}.skillcard-body{padding:10px 14px 12px;border-top:1px solid var(--border-soft);max-height:420px;overflow-y:auto;background:#00000026}.skillcard-body .markdown>:first-child{margin-top:0}.view-pane{flex:1;display:flex;min-width:0;min-height:0}.view-pane.hidden{display:none}.panel-drawer{display:contents}.panel-toggle{display:none}.drawer-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:55;background:#00000080;animation:drawer-fade .2s ease}@keyframes drawer-fade{0%{opacity:0}to{opacity:1}}.view-switch{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:999px;overflow:hidden;background:var(--bg-elev2);flex-shrink:0}.view-switch button{display:inline-flex;align-items:center;gap:5px;border:none;background:transparent;color:var(--text-dim);font-size:12.5px;padding:4px 12px;cursor:pointer;transition:background .15s,color .15s}.view-switch button:hover{color:var(--text)}.view-switch button.active{background:var(--accent-soft);color:var(--accent)}.view-switch button+button{border-left:1px solid var(--border)}.terminal-view{flex:1;display:flex;min-height:0;min-width:0}.term-side{display:flex;flex-direction:column;width:250px;flex-shrink:0;min-height:0;background:var(--bg-elev)}.term-commands{border-right:1px solid var(--border)}.term-tabs-block{display:flex;flex-direction:column;min-height:0;flex:1 1 0;border-top:1px solid var(--border)}.term-tabs-block .panel-body{flex:1;min-height:0}.term-side-toggle{display:none}.term-main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:#0b0d12}.term-xterm{flex:1;min-height:0;padding:10px 8px 8px}.term-xterm.hidden{display:none}.term-xterm .xterm{height:100%}.term-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-faint)}.term-empty-icon{font-size:34px;opacity:.5}.term-empty-title{font-size:15px;color:var(--text-dim)}.term-empty-sub{font-size:12px}.panel-header-actions{display:flex;align-items:center;gap:6px}.cmd-item{display:flex;align-items:center;gap:4px;padding:6px;border-radius:8px;margin-bottom:2px}.cmd-item:hover{background:var(--bg-elev2)}.cmd-run{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border:none;border-radius:6px;background:var(--accent-soft);color:var(--accent);cursor:pointer}.cmd-run:hover{background:var(--accent);color:#fff}.cmd-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;text-align:left;background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:1px 4px}.cmd-name{font-size:12.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-command{font-family:var(--mono);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-cwd{font-size:10px;color:var(--text-faint);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-act{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:22px;height:22px;border:none;border-radius:5px;background:transparent;color:var(--text-faint);cursor:pointer;opacity:0;transition:opacity .1s;font-size:11px}.cmd-item:hover .cmd-act{opacity:1}.cmd-act:hover{color:var(--text);background:var(--bg-elev)}.cmd-act.del:hover{color:var(--red)}.cmd-act.del.confirm{opacity:1;color:var(--red);background:var(--red-soft);border:1px solid rgba(248,113,113,.4);width:auto;padding:0 7px}.cmd-form{display:flex;flex-direction:column;gap:4px;padding:6px 4px}.cmd-form label{font-size:11px;color:var(--text-faint);margin-top:4px}.cmd-input{width:100%;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev2);color:var(--text);font-family:var(--mono);font-size:12px;padding:5px 8px;outline:none}.cmd-input:focus{border-color:var(--accent)}.cmd-hint{color:var(--text-faint);font-size:10.5px}.cmd-form-actions{display:flex;gap:6px;justify-content:flex-end;margin-top:8px}.term-tab{display:flex;align-items:center;gap:2px;padding:4px 6px;border-radius:8px;margin-bottom:2px}.term-tab:hover{background:var(--bg-elev2)}.term-tab.active{background:var(--accent-soft);border:1px solid rgba(139,92,246,.3);padding:3px 5px}.term-tab-main{flex:1;min-width:0;display:flex;align-items:center;gap:6px;background:transparent;border:none;color:var(--text-dim);cursor:pointer;text-align:left;padding:2px}.term-tab-main:hover,.term-tab.active .term-tab-main{color:var(--text)}.term-tab-dot{flex-shrink:0;width:7px;height:7px;border-radius:50%}.term-tab-dot.run{background:var(--green);box-shadow:0 0 5px var(--green)}.term-tab-dot.exit{background:var(--text-faint)}.term-tab-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px}.term-tab-exit{color:var(--text-faint);font-size:11px}.term-tab-close{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;border:none;border-radius:5px;background:transparent;color:var(--text-faint);cursor:pointer;opacity:0;transition:opacity .1s}.term-tab:hover .term-tab-close,.term-tab.active .term-tab-close{opacity:1}.term-tab-close:hover{color:var(--red);background:var(--red-soft)}.statusbar{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:5px 16px;border-top:1px solid var(--border);background:var(--bg-elev);font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden}.status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.status-dot.ok{background:var(--green);box-shadow:0 0 5px var(--green)}.status-dot.busy{background:var(--amber)}.status-item{display:inline-flex;align-items:center;gap:6px;color:var(--text-dim)}.status-sep{color:var(--border)}.ctx-bar{display:inline-block;width:46px;height:5px;border-radius:3px;background:var(--bg-elev2);border:1px solid var(--border-soft);overflow:hidden;vertical-align:middle}.ctx-bar-fill{display:block;height:100%;border-radius:2px;transition:width .3s ease}.ctx-bar.ok .ctx-bar-fill{background:var(--green)}.ctx-bar.mid .ctx-bar-fill{background:var(--amber)}.ctx-bar.warn .ctx-bar-fill{background:var(--red)}.status-item.working{color:var(--accent)}.working-spin{width:9px;height:9px;border-radius:50%;border:2px solid rgba(139,92,246,.25);border-top-color:var(--accent);animation:spin .8s linear infinite;flex-shrink:0}.status-cwd{margin-left:auto;max-width:42%;overflow:hidden;text-overflow:ellipsis;color:var(--text-faint);border:none;background:transparent;font:inherit;font-size:11px;cursor:pointer;padding:2px 4px;border-radius:4px}.status-cwd:hover{color:var(--text-dim);background:var(--bg-elev2)}.status-cwd-wrap{position:relative;margin-left:auto;max-width:46%;min-width:0;display:flex;align-items:center}.status-cwd-input{width:100%;border:1px solid var(--accent);border-radius:6px;background:var(--bg-elev2);color:var(--text);font-family:var(--mono);font-size:11px;padding:3px 7px;outline:none}.status-completions{position:fixed;right:16px;bottom:40px;width:min(440px,calc(100vw - 32px));max-height:260px;overflow-y:auto;overflow-x:hidden;margin:0;padding:4px;list-style:none;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;box-shadow:0 -6px 24px #00000073;z-index:200}.status-queue{color:var(--amber)}@keyframes spin{to{transform:rotate(360deg)}}.topbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;border-bottom:1px solid var(--border);background:var(--bg-elev);flex-shrink:0}.brand{display:flex;align-items:center;gap:8px;min-width:0}.brand-logo{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:7px;background:linear-gradient(135deg,#8b5cf6,#6366f1);color:#fff;font-weight:700;font-size:16px}.brand-name{font-weight:600;letter-spacing:.2px}.conn-dot{width:8px;height:8px;border-radius:50%;margin-left:6px}.conn-dot.ok{background:var(--green);box-shadow:0 0 6px var(--green)}.conn-dot.busy{background:var(--amber)}.conn-dot.err{background:var(--red)}.conn-label{color:var(--text-faint);font-size:12px}.topbar-actions{display:flex;align-items:center;gap:8px;min-width:0}.topbar .btn.interrupt{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:1px solid var(--red);border-radius:6px;background:var(--red);color:#fff;font-size:12.5px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s}.topbar .btn.interrupt:hover:not(:disabled){background:#d64545}.topbar .btn.interrupt[data-tip]{position:relative}.topbar .btn.interrupt[data-tip]:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:var(--bg-elev2);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:8px 12px;font-size:11px;line-height:1.5;white-space:pre-line;min-width:240px;max-width:420px;text-align:left;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:10000;box-shadow:0 12px 40px #00000080}.topbar .btn.interrupt[data-tip]:hover:after{opacity:1}.topbar-desktop{display:flex;align-items:center;gap:8px;min-width:0}.topbar-more{display:none}.chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:999px;background:var(--bg-elev2);color:var(--text);font-size:12.5px;cursor:pointer;transition:border-color .15s,background .15s;white-space:nowrap}.chip:hover{border-color:var(--accent);background:var(--accent-soft)}.chip-model{max-width:220px;overflow:hidden;text-overflow:ellipsis}.chip-vision{color:var(--accent);font-size:11px;line-height:1}.chip-sub{color:var(--text-faint);font-size:11px}.chip.newchat{color:var(--accent);border-color:#8b5cf666}.chip.newchat:hover{background:var(--accent-soft)}.chip.github{width:28px;height:28px;padding:0;justify-content:center;border-radius:50%;text-decoration:none;color:var(--text-dim)}.chip.github:hover{color:var(--text);border-color:var(--accent)}.chip.github svg{width:15px;height:15px}.dropdown{position:relative;display:inline-flex}.dd-caret{color:var(--text-faint);transition:transform .15s}.dd-caret.up{transform:rotate(180deg)}.dd-menu{position:absolute;top:calc(100% + 6px);right:0;min-width:240px;max-width:340px;max-height:420px;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 40px #00000080;padding:6px;z-index:60}.dropdown.left .dd-menu{right:auto;left:0}@media(min-width:769px){.dropdown.dd-up .dd-menu{top:auto;bottom:calc(100% + 6px);max-height:min(360px,calc(100vh - 240px))}}.dropdown.fit .dd-menu{max-height:none;overflow:visible}.dd-header{padding:6px 10px 4px;font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.dd-loading{padding:10px;font-size:12px;color:var(--text-faint);text-align:center}.dd-item{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:7px 10px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);font-size:13px;text-align:left;cursor:pointer}.dd-item:hover{background:var(--bg-elev);color:var(--text)}.dd-item:disabled{opacity:.45;cursor:not-allowed}.dd-item:disabled:hover{background:transparent;color:var(--text-dim)}.dd-item.active{background:var(--accent-soft);color:var(--text)}.dd-item.active:after{content:"✓";color:var(--accent);font-size:12px}.dd-model-cell{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.dd-model-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;min-width:0}.dd-model-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dd-model-provider{flex-shrink:0;font-size:11px;color:var(--text-faint);font-family:var(--mono)}.dd-model-badges{display:flex;flex-wrap:wrap;gap:5px}.dd-model-badge{font-size:10.5px;line-height:1.5;color:var(--text-faint);background:var(--bg-elev);border:1px solid var(--border);border-radius:4px;padding:0 6px;white-space:nowrap}.dd-refresh{width:100%;margin-top:4px;padding:6px;border:none;border-top:1px solid var(--border-soft);background:transparent;color:var(--text-faint);font-size:12px;cursor:pointer}.dd-refresh:hover{color:var(--accent)}.dd-refresh.dd-more-link{display:flex;align-items:center;gap:6px;text-decoration:none}.update-dot{width:7px;height:7px;border-radius:50%;background:var(--amber);flex-shrink:0;box-shadow:0 0 0 2px #f59e0b40}.dd-update{display:flex;flex-direction:column;gap:6px;padding:8px 10px 10px}.dd-row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:12.5px;color:var(--text-dim)}.dd-row b{color:var(--text);font-family:var(--mono);font-weight:600}.dd-note{font-size:12px;line-height:1.5;padding:6px 10px;border-radius:6px;background:var(--bg-elev1);border:1px solid var(--border-soft);color:var(--text-dim)}.dd-note.ok{color:var(--green);border-color:#34d3994d}.dd-note.warn{color:var(--amber);border-color:#f59e0b59}.dd-note.err{color:var(--red);border-color:#f8717159}.dd-actions{display:flex;gap:6px;padding:0 2px 2px}.dd-actions .dd-refresh{margin-top:0;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev1)}.dd-refresh.accent{color:var(--accent);border-color:#8b5cf666}.dd-refresh.accent.armed{color:var(--amber);border-color:#f59e0b80}.notices{position:fixed;top:52px;left:50%;transform:translate(-50%);z-index:50;display:flex;flex-direction:column;gap:6px;align-items:center;pointer-events:none}.notice{pointer-events:auto;max-width:min(720px,90vw);padding:7px 14px;border-radius:8px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text);font-size:12.5px;box-shadow:0 6px 24px #00000073;cursor:pointer;text-align:center}.notice-error{border-color:#f8717180;color:#fca5a5}.notice-warning{border-color:#fbbf2480;color:#fcd34d}.messages-wrap{flex:1;position:relative;min-height:0;display:flex;flex-direction:column}.messages{flex:1;overflow-y:auto;padding:20px 0 12px}.msg{max-width:860px;margin:0 auto;padding:6px 20px 14px;scroll-margin-top:84px}.msg-meta{display:flex;align-items:baseline;gap:10px;margin-bottom:4px}.msg-role{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--text-faint)}.msg-model{font-size:11px;color:var(--accent);font-family:var(--mono)}.msg-customtype{font-size:11px;color:var(--amber)}.msg-time{font-size:11px;color:var(--text-faint);margin-left:auto}.msg-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}.msg-action{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--text-faint);font-size:11.5px;cursor:pointer;padding:3px 8px;border-radius:6px;opacity:0;transition:opacity .15s ease,color .15s ease,background .15s ease}.msg:hover .msg-action,.msg-action:focus-visible{opacity:1}.msg-action:hover{color:var(--accent);background:var(--bg-elev2)}.msg-editor{display:flex;flex-direction:column;gap:8px}.msg-editor-input{width:100%;min-height:48px;resize:vertical;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-elev1);color:var(--text);font-family:inherit;font-size:13.5px;line-height:1.6;outline:none}.msg-editor-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px #8b5cf626}.msg-editor-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px}.msg-editor-hint{margin-right:auto;font-size:11px;color:var(--text-faint)}.chip.primary{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.chip.primary:disabled{opacity:.45;cursor:not-allowed}.msg-collapsed{display:flex;align-items:center;gap:10px;width:100%;max-width:860px;margin:0 auto 2px;padding:7px 12px;border:1px solid var(--border-soft);border-radius:8px;background:var(--bg-elev1);color:var(--text-dim);font-size:12px;text-align:left;cursor:pointer;transition:border-color .15s ease,background .15s ease,color .15s ease}.msg-collapsed:hover{border-color:var(--border);background:var(--bg-elev2);color:var(--text)}.msg-collapsed-role{flex-shrink:0;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.7px;color:var(--text-faint);min-width:52px}.msg-collapsed-role.role-user{color:var(--accent)}.msg-collapsed-role.role-assistant{color:var(--green)}.msg-collapsed-role.role-bashExecution,.msg-collapsed-role.role-toolResult{color:var(--amber)}.msg-collapsed-body{flex:1;min-width:0;display:flex;align-items:center;gap:8px;overflow:hidden}.msg-collapsed-preview{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-dim)}.msg-collapsed-chips{display:inline-flex;gap:4px;flex-shrink:0}.msg-collapsed-chip{font-size:10px;color:var(--text-faint);padding:1px 6px;border-radius:999px;border:1px solid var(--border);white-space:nowrap}.msg-collapsed-time{flex-shrink:0;font-size:10.5px;color:var(--text-faint)}.msg-collapsed-action{flex-shrink:0;display:inline-flex;align-items:center;gap:3px;font-size:11px;color:var(--text-faint)}.msg-collapsed:hover .msg-collapsed-action{color:var(--accent)}.msg-collapse-btn{display:inline-flex;align-items:center;gap:3px;margin-left:auto;border:none;background:transparent;color:var(--text-faint);font-size:11px;cursor:pointer;padding:1px 6px;border-radius:5px}.msg-collapse-btn:hover{color:var(--accent);background:var(--bg-elev2)}.msg-text{color:var(--text)}.msg-text p{margin:6px 0}.msg-text p:first-child{margin-top:0}.msg-text p:last-child{margin-bottom:0}.msg-text ul,.msg-text ol{padding-left:22px;margin:6px 0}.msg-text li{margin:2px 0}.msg-text blockquote{margin:8px 0;padding:2px 14px;border-left:3px solid var(--accent);color:var(--text-dim)}.msg-text table{border-collapse:collapse;margin:8px 0}.msg-text th,.msg-text td{border:1px solid var(--border);padding:4px 10px}.msg-text a{color:#a78bfa}.msg-text code{font-family:var(--mono);font-size:12.5px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:4px;padding:1px 5px}.codeblock{position:relative;margin:10px 0}.codeblock pre{background:#0b0d12!important;border:1px solid var(--border);border-radius:8px;padding:12px 14px;overflow-x:auto;margin:0}.codeblock code{background:transparent;border:none;padding:0;font-family:var(--mono);font-size:12.5px;line-height:1.55}.copy-btn{position:absolute;top:8px;right:8px;z-index:2;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:6px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);cursor:pointer;opacity:0;transition:opacity .15s}.codeblock:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--text);border-color:var(--accent)}.trunc-note{margin-top:6px;font-size:11.5px;color:var(--text-faint);font-style:italic}.msg-image img{max-width:100%;max-height:420px;border-radius:8px;border:1px solid var(--border)}.thinking{margin:8px 0;border:1px solid var(--border-soft);border-radius:8px;background:#ffffff04}.thinking-toggle{display:flex;align-items:center;gap:7px;width:100%;padding:7px 12px;border:none;background:transparent;color:var(--text-dim);font-size:12.5px;cursor:pointer;text-align:left}.thinking-toggle:hover{color:var(--text)}.thinking-icon{color:var(--accent)}.thinking-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.thinking-body{padding:4px 14px 12px;color:var(--text-dim);font-style:italic;font-size:13px;white-space:pre-wrap;border-top:1px solid var(--border-soft)}.thinking-live .thinking-toggle{color:var(--text)}.thinking-live-label{display:inline-flex;align-items:center}.thinking-live-label .dots:after{content:"";display:inline-block;width:1.2em;text-align:left;animation:thinking-dots 1.2s steps(4,end) infinite}@keyframes thinking-dots{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}}.thinking-wait{display:inline-flex;align-items:center;gap:5px;color:var(--text-dim);font-size:13px;padding:2px 0}.thinking-wait .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);animation:stream-blink 1s steps(2,start) infinite}.stream-cursor{display:inline-block;width:8px;height:1.05em;margin-left:3px;vertical-align:text-bottom;border-radius:1px;background:var(--accent);animation:stream-blink 1s steps(2,start) infinite}@keyframes stream-blink{0%,49%{opacity:1}50%,to{opacity:0}}.toolcall{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev);overflow:hidden}.toolcall-head{display:flex;align-items:center;gap:8px;padding:7px 12px;font-size:12.5px}.toolcall-icon{font-size:13px}.toolcall-name{font-family:var(--mono);font-weight:600;color:var(--text)}.toolcall-status{font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint)}.toolcall.run .toolcall-status{color:var(--amber);border-color:#fbbf2466}.toolcall.ok .toolcall-status{color:var(--green);border-color:#34d39959}.toolcall.err .toolcall-status{color:var(--red);border-color:#f8717166}.toolcall-exit{font-style:normal;opacity:.85;margin-left:6px}.toolcall-exit:before{content:"·";margin-right:6px;opacity:.6}.toolcall.err{border-color:#f8717159}.toolcall-spacer{flex:1}.toolcall-kill{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--red);background:var(--red-soft);color:var(--red);font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;cursor:pointer;transition:background .15s,color .15s}.toolcall-kill:hover{background:var(--red);color:#fff}.toolcall-copy,.toolcall-toggle{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--text-faint);cursor:pointer;padding:3px;border-radius:5px}.toolcall-copy:hover,.toolcall-toggle:hover{color:var(--text);background:var(--bg-elev2)}.toolcall-body{border-top:1px solid var(--border-soft);padding:8px 12px 10px}.toolcall-args pre{margin:0;font-family:var(--mono);font-size:12px;color:var(--text-dim);white-space:pre;overflow:auto;max-height:200px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px}.termline{display:flex;align-items:center;gap:8px;background:#0b0d12;border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px;font-family:var(--mono);font-size:12.5px}.termline-icon{color:var(--green);flex-shrink:0}.termline code{word-break:break-all}.termline-timeout{margin-left:auto;color:var(--text-faint);font-size:11px;flex-shrink:0}.toolcall-output{margin-top:8px}.toolcall-output-label{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--text-faint);margin-bottom:4px}.toolcall-output pre{margin:0;max-height:320px;overflow:auto;background:#0b0d12;border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px;font-family:var(--mono);font-size:12px;line-height:1.5;color:#c9d1d9;white-space:pre;word-break:normal}.toolcall.err .toolcall-output pre{color:#f0a5a5}.toolcall-waiting{margin-top:8px;font-size:12px;color:var(--text-faint)}.cursor{display:inline-block;width:7px;height:13px;background:var(--accent);vertical-align:-2px;margin-left:4px;animation:blink 1s steps(2,start) infinite}@keyframes blink{50%{opacity:0}}.bashblock{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:#0b0d12;overflow:hidden}.bashblock-command{display:flex;align-items:center;gap:8px;padding:7px 12px;font-family:var(--mono);font-size:12.5px;border-bottom:1px solid var(--border-soft)}.bashblock-prompt{color:var(--green);font-weight:700}.bashblock-exit{margin-left:auto;font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--border)}.bashblock-exit.ok{color:var(--green)}.bashblock-exit.err{color:var(--red)}.bashblock-output{margin:0;padding:10px 12px;font-family:var(--mono);font-size:12px;line-height:1.5;color:#c9d1d9;white-space:pre;overflow:auto;max-height:320px}.msg-user .msg-body{background:var(--accent-soft);border:1px solid rgba(139,92,246,.25);border-radius:12px;padding:10px 14px}.msg-error{color:var(--red);background:var(--red-soft);border:1px solid rgba(248,113,113,.35);border-radius:8px;padding:8px 12px;margin-bottom:8px;font-size:13px}.empty-state{display:flex;flex-direction:column;align-items:center;text-align:center;padding:70px 20px 30px;color:var(--text-dim)}.empty-logo-wrap{position:relative;margin-bottom:20px}.empty-logo{width:68px;height:68px;display:flex;align-items:center;justify-content:center;font-size:40px;font-weight:700;color:#fff;background:linear-gradient(135deg,#8b5cf6,#6366f1 60%,#4f46e5);border-radius:20px;box-shadow:0 16px 44px #8b5cf661,inset 0 1px #ffffff38}.empty-logo-wrap:before{content:"";position:absolute;top:-18px;right:-18px;bottom:-18px;left:-18px;border-radius:32px;background:radial-gradient(ellipse at center,rgba(139,92,246,.28),transparent 70%);z-index:-1}.empty-title{margin:0 0 6px;color:var(--text);font-size:22px;font-weight:650;letter-spacing:.3px}.empty-sub{margin:0 0 16px;font-size:13px;color:var(--text-faint)}.empty-cwd{display:inline-flex;align-items:center;gap:7px;max-width:min(560px,80vw);padding:4px 12px;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-elev);font-size:11.5px}.empty-cwd-label{color:var(--text-faint);flex-shrink:0}.empty-cwd-path{color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty-examples{margin-top:34px;display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;width:min(560px,90vw)}.empty-example{display:flex;align-items:center;gap:10px;padding:11px 14px;border:1px solid var(--border);border-radius:12px;background:var(--bg-elev);color:var(--text-dim);font-size:13px;text-align:left;cursor:pointer;transition:border-color .15s,background .15s,transform .12s,box-shadow .15s}.empty-example:hover{border-color:#8b5cf680;background:var(--accent-soft);color:var(--text);transform:translateY(-1px);box-shadow:0 8px 22px #8b5cf629}.empty-example-icon{font-size:17px;flex-shrink:0}.empty-example-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.streaming-wait,.boot-wait{text-align:center;color:var(--text-faint);padding:60px 20px;font-size:13px}.scroll-bottom{position:absolute;bottom:16px;left:50%;transform:translate(-50%);display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);font-size:12px;cursor:pointer;box-shadow:0 6px 20px #0006}.scroll-bottom:hover{color:var(--text);border-color:var(--accent)}.qn-rail{position:absolute;top:10px;bottom:10px;right:14px;width:24px;z-index:15;border-radius:12px;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--rail-gap, 27px)}.qn-rail:before{content:"";position:absolute;top:0;bottom:0;right:100%;width:260px;pointer-events:none}.qn-rail:hover:before{pointer-events:auto}.qn-bar{position:relative;flex-shrink:0;width:16px;height:3px;border:none;border-radius:2px;background:#ffffff2e;cursor:pointer;padding:0;transition:background .12s}.qn-bar:hover{background:#ffffff61}.qn-bar.active{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb,var(--accent) 65%,transparent)}.qn-bar-text{position:absolute;right:calc(100% + 10px);top:50%;transform:translateY(-50%);width:210px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.3;color:var(--text-dim);background:var(--bg-elev2);border:1px solid var(--border);border-radius:6px;padding:3px 9px;pointer-events:auto;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility 0s}.qn-rail:hover .qn-bar-text{visibility:visible;opacity:1}.qn-rail:not(:hover) .qn-bar-text{transition:opacity .15s ease,visibility 0s}.qn-bar:hover .qn-bar-text{color:var(--text);border-color:var(--accent)}.qn-bar.active .qn-bar-text{color:var(--text);border-color:color-mix(in srgb,var(--accent) 55%,transparent)}.qn-rail.many .qn-bar-text{display:none}.qn-list{position:absolute;right:calc(100% + 10px);top:0;bottom:0;width:230px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;padding:6px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 30px #00000073;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility 0s}.qn-rail.many:hover .qn-list{pointer-events:auto;visibility:visible;opacity:1}.qn-rail.many:not(:hover) .qn-list{transition:opacity .15s ease,visibility 0s}.qn-list-item{display:flex;align-items:center;gap:8px;flex-shrink:0;min-height:26px;padding:3px 8px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);font-size:11.5px;line-height:1.3;text-align:left;cursor:pointer;transition:background .12s,color .12s}.qn-list-item:hover{background:var(--bg-elev);color:var(--text)}.qn-list-item.active{background:color-mix(in srgb,var(--accent) 30%,transparent);color:#fff}.qn-list-idx{flex-shrink:0;min-width:17px;height:17px;line-height:17px;text-align:center;border-radius:5px;background:#00000059;color:var(--text-faint);font-size:10px;font-weight:700;font-family:var(--mono)}.qn-list-item.active .qn-list-idx{background:var(--accent);color:#fff}.qn-list-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qn-tag{display:inline-flex;align-items:center;gap:6px;flex-shrink:0;align-self:center;margin-left:auto;padding:3px 8px 3px 7px;border:1px solid var(--border);border-radius:999px;background:var(--bg);color:var(--text-faint);font-family:var(--mono);font-size:10px;line-height:1;cursor:pointer;transition:border-color .12s,background .12s,color .12s}.qn-tag-bar{width:16px;height:3px;border-radius:2px;background:#ffffff38;transition:background .12s}.qn-tag:hover{background:var(--bg-elev2);border-color:var(--accent);color:var(--text)}.qn-tag:hover .qn-tag-bar{background:var(--accent)}.qn-tag.active{border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent)}.qn-tag.active .qn-tag-bar{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb,var(--accent) 65%,transparent)}@keyframes qn-flash{0%{background-color:color-mix(in srgb,var(--accent) 32%,transparent)}to{background-color:transparent}}.msg-flash{border-radius:8px;animation:qn-flash 1.6s ease-out}@media(max-width:640px){.qn-rail{display:none}}.goalbar{max-width:860px;margin:0 auto 8px;border:1px solid var(--border);border-radius:12px;background:var(--bg-elev1);padding:8px 10px;display:flex;flex-direction:column;gap:6px}.goalbar-row{display:flex;align-items:center;gap:8px}.goalbar-icon{color:var(--amber);display:inline-flex;align-items:center;font-size:15px;flex-shrink:0}.goalbar-spin{display:inline-block;animation:goalbar-spin 1s linear infinite}@keyframes goalbar-spin{to{transform:rotate(360deg)}}.goalbar-input{flex:1;min-width:0;background:transparent;border:none;outline:none;color:var(--text);font-size:13px;padding:4px 2px}.goalbar-input::placeholder{color:var(--text-dim)}.goalbar-btn{background:var(--accent);color:#fff;border:none;border-radius:8px;padding:5px 12px;font-size:12px;cursor:pointer;flex-shrink:0}.goalbar-btn:disabled{opacity:.45;cursor:default}.goalbar-btn.wizard{background:var(--amber)}.goalbar-active.wizard{border-color:var(--amber)}.msg-goal-wizard.msg-custom{border-left:3px solid var(--amber)}.goalbar-icon-btn{background:transparent;border:none;color:var(--text-dim);cursor:pointer;display:inline-flex;align-items:center;padding:4px;border-radius:6px;font-size:15px;flex-shrink:0}.goalbar-icon-btn:hover{color:var(--text);background:var(--bg-elev2)}.goalbar-opts{display:flex;align-items:center;gap:14px;font-size:12px;color:var(--text-dim)}.goalbar-opt{cursor:pointer;padding:2px 6px;border-radius:6px}.goalbar-opt:hover{background:var(--bg-elev2)}.goalbar-opt b{color:var(--text);font-weight:600}.goalbar-round{display:inline-flex;align-items:center;gap:6px;color:var(--text-dim);font-size:12px}.goalbar-round input{width:54px;padding:3px 6px;font-size:12px;color:var(--text);background:var(--bg-elev2);border:1px solid var(--border);border-radius:6px;outline:none;text-align:center}.goalbar-round input:focus{border-color:var(--accent)}.goalbar-round input::placeholder{color:var(--text-faint)}.goalbar-lock-hint{color:var(--text-dim)}.goalbar-active{border-color:var(--amber);background:color-mix(in srgb,var(--amber) 8%,var(--bg-elev1))}.goalbar-active.reviewing{border-color:var(--green)}.goalbar-active-row{display:flex;align-items:center;gap:10px;font-size:13px}.goalbar-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--text);flex:1;min-width:0}.goalbar-chip{flex-shrink:0;font-size:11px;padding:2px 8px;border-radius:10px;background:var(--bg-elev2);color:var(--text-dim);white-space:nowrap}.goalbar-chip.reviewing,.goalbar-chip.pass{background:var(--green);color:#fff}.goalbar-chip.fail{background:var(--red);color:#fff}.goalbar-detail{color:var(--text-dim);font-size:12px;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:30%}.goalbar-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:4px;display:inline-flex;border-radius:6px;flex-shrink:0}.goalbar-x:disabled{opacity:.4;cursor:default}.goalbar-x:hover:not(:disabled){color:var(--red);background:var(--bg-elev2)}.goalbar-collapsed{border:none;background:transparent;padding:0;align-items:flex-start}.goalbar-hint{background:transparent;border:none;color:var(--text-dim);font-size:12px;padding:4px 10px;cursor:pointer;border-radius:999px;display:inline-flex;align-items:center;gap:7px;border:1px dashed var(--border);background:var(--bg-elev1);transition:border-color .15s,color .15s}.goalbar-hint svg{color:var(--amber)}.goalbar-hint:hover{color:var(--text);border-color:var(--amber);border-style:solid}.goalbar-hint span{white-space:nowrap}.msg-goal-review{border-left:3px solid var(--amber)}.msg-goal-review.msg-custom{background:transparent}.inputbar{flex-shrink:0;padding:12px 20px 14px;position:relative}.queue-hint{max-width:860px;margin:0 auto 8px;display:flex;gap:14px;font-size:12px;color:var(--amber)}.inputbox{max-width:860px;margin:0 auto;display:flex;flex-direction:column;gap:8px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:16px;padding:10px;transition:border-color .2s ease,box-shadow .2s ease;box-shadow:inset 0 1px #ffffff0a,0 4px 18px #00000047}.inputbox-row{display:flex;align-items:flex-end;gap:10px;min-width:0}.input-tools{display:none}.inputbox:focus-within{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));box-shadow:inset 0 1px #ffffff0a,0 0 0 3px var(--accent-soft),0 6px 22px #00000052}.inputbox textarea{flex:1;resize:none;border:none;outline:none;background:transparent;color:var(--text);font-family:var(--sans);font-size:14.5px;line-height:1.6;max-height:220px;padding:6px 2px;caret-color:var(--accent);overflow:hidden}.inputbox textarea::placeholder{color:var(--text-faint)}.inputbox textarea:disabled{opacity:.6}.inputbox-actions{display:flex;align-items:center;gap:8px;flex-shrink:0;padding-bottom:2px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--border);border-radius:8px;padding:7px 12px;font-size:13px;cursor:pointer;transition:all .15s}.btn:disabled{opacity:.4;cursor:default}.inputbox .btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;padding:0;border:1px solid var(--border);border-radius:50%;background:transparent;color:var(--text-dim);cursor:pointer;transition:background .18s,color .18s,border-color .18s,transform .18s,box-shadow .18s,filter .18s;flex-shrink:0}.inputbox .btn svg{width:17px;height:17px}.inputbox .btn:disabled{opacity:.4;cursor:default}.inputbox .btn.attach-img{border:none;color:var(--text-faint)}.inputbox .btn.attach-img:hover:not(:disabled){background:var(--accent-soft);color:var(--accent)}.inputbox .btn.send{background:#3b82f6;border-color:#3b82f6;color:#fff;box-shadow:0 2px 10px #3b82f659}.inputbox .btn.send:hover:not(:disabled){background:#2563eb;border-color:#2563eb;transform:translateY(-1px);box-shadow:0 4px 16px #3b82f673}.inputbox .btn.stop{background:#3b82f6;border-color:#3b82f6;color:#fff;box-shadow:0 2px 10px #3b82f659}.inputbox .btn.stop:hover:not(:disabled){background:#2563eb;border-color:#2563eb;transform:translateY(-1px);box-shadow:0 4px 16px #3b82f673}.inputbox .btn.supplement{width:auto;border-radius:999px;padding:0 16px;gap:5px;font-size:13px;border-color:#8b5cf673;color:var(--accent)}.inputbox .btn.supplement:hover:not(:disabled){background:var(--accent);border-color:var(--accent);color:#fff}.slash-menu{position:absolute;bottom:calc(100% - 4px);left:50%;transform:translate(-50%);width:min(860px,calc(100% - 40px));max-height:min(320px,50vh);overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:14px;box-shadow:0 -6px 24px #00000059,0 2px 12px #00000040;z-index:60;padding:6px}.slash-menu-hint{display:flex;align-items:center;justify-content:space-between;padding:4px 10px 8px;font-size:11.5px;color:var(--text-faint);border-bottom:1px dashed var(--border);margin-bottom:6px}.slash-menu-close{cursor:pointer;opacity:.7}.slash-menu-close:hover{opacity:1}.slash-item{display:flex;align-items:baseline;gap:10px;width:100%;padding:7px 10px;border:none;border-radius:9px;background:transparent;color:var(--text);font-family:var(--sans);font-size:13.5px;text-align:left;cursor:pointer}.slash-item.active{background:var(--accent-soft)}.slash-name{font-family:var(--mono);font-size:12.5px;color:var(--accent);white-space:nowrap}.slash-desc{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim);font-size:12.5px}.slash-hint{color:var(--text-faint);font-family:var(--mono);font-size:11.5px;margin-left:6px}.slash-source{flex-shrink:0;font-size:10.5px;padding:1px 7px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint);white-space:nowrap}.slash-source.builtin{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,transparent)}.slash-source.extension{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,transparent)}.slash-source.prompt{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 45%,transparent)}.slash-source.skill{color:#5eb3ff;border-color:color-mix(in srgb,#5eb3ff 45%,transparent)}.slash-help{max-width:860px;width:100%;max-height:min(560px,80vh);display:flex;flex-direction:column;background:var(--bg-elev2);border:1px solid var(--border);border-radius:16px;box-shadow:0 18px 60px #00000080;overflow:hidden}.slash-help-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border);font-size:15px;font-weight:600}.slash-help-body{overflow-y:auto;padding:8px 12px 14px}.slash-help-row{display:flex;align-items:baseline;gap:10px;padding:7px 8px;border-radius:8px}.slash-help-row:hover{background:var(--bg-elev1)}.slash-help-cmd{font-family:var(--mono);font-size:12.5px;color:var(--accent);white-space:nowrap}.slash-help-desc{flex:1;color:var(--text-dim);font-size:13px}.slash-help-empty{padding:24px;text-align:center;color:var(--text-faint)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#2a2f3d;border-radius:6px;border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:#3a4152}::-webkit-scrollbar-track{background:transparent}@media(max-width:640px){.chip-model{max-width:120px}.brand-name,.conn-label{display:none}}.dialog-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:200;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:24px}.dialog{display:flex;flex-direction:column;gap:14px;width:100%;max-width:500px;max-height:82vh;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;padding:18px 20px}.dialog-title{font-size:14px;font-weight:700;color:var(--text);white-space:pre-wrap;word-break:break-word}.dialog-options{display:flex;flex-direction:column;gap:8px}.dialog-option{display:block;width:100%;text-align:left;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev);color:var(--text);padding:9px 12px;font-size:13px;line-height:1.5;cursor:pointer;white-space:pre-wrap;word-break:break-word;transition:border-color .12s,background .12s}.dialog-option:hover,.dialog-option.sel{border-color:var(--accent);background:var(--accent-soft)}.dialog-hint{color:var(--text-faint);font-size:13px}.dialog-body{font-size:13px;color:var(--text-dim);white-space:pre-wrap;word-break:break-word}.dialog-input{width:100%;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;padding:9px 12px;outline:none}.dialog-input:focus{border-color:var(--accent)}.dialog-actions{display:flex;justify-content:flex-end;gap:8px}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover:not(:disabled){filter:brightness(1.12)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:300;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:24px}.modal{position:relative;display:flex;flex-direction:column;gap:14px;width:100%;max-width:460px;max-height:84vh;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;padding:20px 22px}.model-modal{max-width:640px}.settings-modal{max-width:560px}.set-section{display:flex;flex-direction:column;gap:8px;padding:12px;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:10px}.set-section-title{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--text)}.set-section-icon{color:var(--accent);font-size:14px}.set-count{margin-left:auto;font-size:11px;font-weight:500;color:var(--text-dim);background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:999px;padding:1px 8px}.set-mode-row{display:flex;align-items:center;gap:10px}.set-field-label{font-size:12px;color:var(--text-dim)}.set-select{flex:1;max-width:160px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:6px 8px;font-size:13px;outline:none}.set-select:focus{border-color:var(--accent)}.set-prompt-input{width:100%;box-sizing:border-box;resize:vertical;min-height:72px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font-size:13px;font-family:inherit;line-height:1.5;outline:none}.set-prompt-input:focus{border-color:var(--accent)}.set-hint{margin:0;font-size:12px;color:var(--text-dim);line-height:1.5}.set-list{display:flex;flex-direction:column;gap:6px;max-height:180px;overflow-y:auto}.set-row{display:flex;align-items:center;gap:10px;padding:7px 9px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:8px}.set-row-info{flex:1;min-width:0}.set-row-name{font-size:13px;color:var(--text);word-break:break-all}.set-row-desc{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.set-switch{flex:none;position:relative;width:36px;height:20px;border:none;border-radius:999px;background:var(--border);cursor:pointer;transition:background .15s;padding:0}.set-switch.on{background:var(--accent)}.set-switch-knob{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .15s}.set-switch.on .set-switch-knob{left:18px}.set-preset-save{display:flex;gap:8px}.set-input{flex:1;min-width:0;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:7px 10px;font-size:13px;outline:none}.set-input:focus{border-color:var(--accent)}.set-row-actions{display:flex;align-items:center;gap:6px;flex:none}.set-icon-btn{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border-soft);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.set-icon-btn:hover{color:var(--text);background:var(--bg-elev)}.set-icon-btn.danger:hover{color:var(--red)}.set-empty{margin:0;font-size:12px;color:var(--text-dim)}.modal-close{position:absolute;top:12px;right:12px;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.modal-close:hover{color:var(--text);background:var(--bg-elev)}.modal-head{display:flex;align-items:center;gap:10px}.modal-head-icon{color:var(--accent);font-size:18px}.modal-head h2{font-size:16px;margin:0}.modal-desc{margin:0;color:var(--text-dim);font-size:13px;line-height:1.6}.modal-desc code{background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:4px;padding:1px 5px;font-size:12px}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.setup-actions{display:flex;gap:10px;margin-top:6px}.setup-key-form{display:flex;flex-direction:column;gap:12px}.setup-done{color:var(--text);font-size:13px;line-height:1.6}.setup-failed{display:flex;flex-direction:column;gap:10px}.setup-detail{margin:0;max-height:140px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:8px;padding:10px 12px;font-size:12px;color:#fca5a5}.field{display:flex;flex-direction:column;gap:5px}.field-label{font-size:12px;color:var(--text-dim)}.field-label em{font-style:normal;opacity:.7}.field input,.field select{background:var(--bg-elev);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font-size:13px;outline:none}.field input:focus,.field select:focus{border-color:var(--accent)}.field.check{flex-direction:row;align-items:center;gap:8px;font-size:13px;color:var(--text)}.field-hint{font-size:12px;color:var(--text-dim)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.form-section-title{font-size:12px;font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-top:4px}.section-hint{font-weight:400;text-transform:none;letter-spacing:0;opacity:.75}.auth-badge{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:99px;font-size:11px;color:#6ee7a0;background:#34d3991f;border:1px solid rgba(52,211,153,.25);vertical-align:1px}.auth-badge.dim{color:var(--text-dim);background:var(--bg-elev);border-color:var(--border)}.key-input{background:var(--bg-elev);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 9px;font-size:12.5px;outline:none;width:190px}.key-input:focus{border-color:var(--accent)}.btn.sm{padding:6px 10px;font-size:12px}.provider-list{display:flex;flex-direction:column;gap:8px}.provider-row{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:8px;padding:10px 12px}.provider-info{display:flex;flex-direction:column;gap:2px;min-width:0}.provider-name{font-size:13.5px;font-weight:600;color:var(--text)}.provider-sub{font-size:12px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.provider-actions{display:flex;gap:6px;flex-shrink:0}.iconbtn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.iconbtn:hover{color:var(--text);background:var(--bg-elev)}.iconbtn.danger{color:#fca5a5}.iconbtn.danger:hover{background:var(--red-soft)}.model-row{display:grid;grid-template-columns:1.4fr 1fr 110px auto 88px 88px 28px;gap:8px;align-items:center;margin-bottom:8px}.model-row input,.model-row select{background:var(--bg-elev);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 8px;font-size:12.5px;outline:none;min-width:0}.model-row input:focus,.model-row select:focus{border-color:var(--accent)}.model-row .check{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--text-dim);white-space:nowrap}@media(max-width:640px){.form-grid,.model-row{grid-template-columns:1fr}}.sound-menu{display:flex;flex-direction:column;gap:2px;width:300px}.sound-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer;transition:background .12s}.sound-row:hover{background:var(--bg-elev)}.sound-row.disabled{opacity:.45;pointer-events:none}.sound-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}.sound-label{display:flex;align-items:center;gap:8px;min-width:0}.sound-master .sound-name{font-weight:700}.sound-icon{color:var(--accent);flex-shrink:0}.sound-name{font-size:13px;color:var(--text)}.sound-desc{font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sound-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.sound-preview{border:1px solid var(--border);border-radius:6px;background:var(--bg-elev);color:var(--text-dim);font-size:11px;padding:2px 8px;cursor:pointer;transition:border-color .12s,color .12s}.sound-preview:hover:not(:disabled){border-color:var(--accent);color:var(--text)}.sound-preview:disabled{opacity:.4;cursor:default}.sound-volume{display:flex;align-items:center;gap:10px;padding:8px 10px}.sound-volume.disabled{opacity:.45;pointer-events:none}.sound-volume input[type=range]{flex:1;accent-color:var(--accent);cursor:pointer}.sound-vol-num{font-size:11px;color:var(--text-faint);min-width:34px;text-align:right}.fp-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:250;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:28px}.fp{display:flex;flex-direction:column;width:100%;max-width:860px;height:min(78vh,720px);background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;overflow:hidden}.fp-head{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--border-soft);flex-shrink:0;min-width:0}.fp-name{font-family:var(--mono);font-size:13px;font-weight:700;color:var(--text);white-space:nowrap}.fp-path{font-family:var(--mono);font-size:11px;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.fp-meta{font-size:11px;color:var(--text-faint);flex-shrink:0;white-space:nowrap}.fp-head-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.fp-attach{position:relative;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev);color:var(--text-dim);cursor:pointer}.fp-attach.inline:hover{background:var(--accent);border-color:var(--accent);color:#fff}.fp-attach.ref:hover{background:var(--amber);border-color:var(--amber);color:#1a1a1a}.fp-attach:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.fp-attach:hover:after{opacity:1}.fp-close{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer;margin-left:2px}.fp-close:hover{color:var(--red);border-color:var(--red)}.fp-notice{padding:7px 14px;font-size:11.5px;color:var(--amber);background:#fbbf2414;border-bottom:1px solid var(--border-soft);flex-shrink:0}.fp-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text-faint);font-size:13px;padding:40px}.fp-hex-wrap{flex:1;display:flex;flex-direction:column;min-height:0}.fp-hex{flex:1;overflow:auto;margin:0;padding:12px 14px;background:#00000038;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;color:var(--text-dim);white-space:pre;-webkit-user-select:text;user-select:text}.fp-code{flex:1;overflow:auto;background:#00000038;font-family:var(--mono);font-size:12px;line-height:1.6;padding:6px 0;user-select:none;-webkit-user-select:none}.fp-media-wrap{flex:1;min-height:0;overflow:auto;background:#00000038;display:flex;align-items:center;justify-content:center;padding:12px}.fp-media{max-width:100%;max-height:100%;border-radius:4px}.fp-line{display:flex;gap:0;padding-right:16px;cursor:pointer}.fp-line:hover{background:#8b5cf614}.fp-line.sel{background:#8b5cf638}.fp-code.dragging .fp-line.sel{background:#8b5cf64d}.fp-num{flex-shrink:0;width:52px;padding-right:12px;text-align:right;color:var(--text-faint);background:transparent;border-right:1px solid var(--border-soft);margin-right:14px;user-select:none;-webkit-user-select:none}.fp-code-text{flex:1;min-width:0;white-space:pre;color:var(--text-dim)}.fp-line.sel .fp-code-text{color:var(--text)}.fp-lines-note{padding:8px 16px 6px;font-size:11px;color:var(--text-faint)}.fp-foot{display:flex;align-items:center;gap:12px;padding:10px 14px;border-top:1px solid var(--border-soft);flex-shrink:0;background:var(--bg-elev)}.fp-hint{flex:1;min-width:0;font-size:12px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fp-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.fp-actions .btn{display:inline-flex;align-items:center;gap:5px}@media(max-width:768px){.topbar-desktop{display:none}.topbar-more{display:inline-flex}.topbar{padding:8px 10px;gap:8px;flex-wrap:nowrap}.brand-name,.conn-label,.brand-logo,.brand .conn-dot{display:none}.chip>span:not(.update-dot){display:none}.input-tools{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:nowrap}.input-tools-left,.input-tools-right{display:flex;align-items:center;gap:6px;min-width:0}.input-tools-right{flex-shrink:0}.inputbox-row .attach-img,.inputbox-row .inputbox-actions{display:none}.input-tools .chip>span:not(.update-dot){display:inline}.input-tools .chip-model{max-width:80px}.input-tools .chip{padding:5px 8px;flex-shrink:1;min-width:0}.input-tools .chip .chip-sub,.input-tools .chip .chip-model{overflow:hidden;text-overflow:ellipsis;min-width:0}.topbar-actions{gap:6px;flex-wrap:wrap;row-gap:6px}.dropdown .dd-menu{position:fixed;left:12px;right:12px;top:auto;bottom:calc(env(safe-area-inset-bottom,0px) + 12px);max-width:none;max-height:55vh;z-index:90}.dropdown.left .dd-menu{left:12px;right:12px}.sound-menu{width:100%}.chip{padding:6px 9px}.view-switch button{padding:5px 10px}.panel-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--border);border-radius:9px;background:var(--bg-elev2);color:var(--text-dim);font-size:15px;cursor:pointer;flex-shrink:0}.panel-toggle:active{background:var(--accent-soft);color:var(--accent)}.file-item .file-attach{display:inline-flex}.file-attach:after,.file-attach:before{display:none}.panel-drawer{display:block;position:fixed;top:0;bottom:0;z-index:60;width:min(300px,86vw);background:var(--bg-elev);transition:transform .25s ease}.panel-drawer.drawer-left{left:0;border-right:1px solid var(--border);box-shadow:8px 0 30px #00000059;transform:translate(-105%)}.panel-drawer.drawer-right{right:0;border-left:1px solid var(--border);box-shadow:-8px 0 30px #00000059;transform:translate(105%)}.panel-drawer.open{transform:translate(0)}.panel-drawer .panel{width:100%;height:100%;border:none}.term-main{position:relative}.term-commands{position:fixed;left:0;top:0;bottom:0;z-index:60;width:min(300px,86vw);transform:translate(-105%);transition:transform .25s ease;box-shadow:8px 0 30px #00000059;border-right:1px solid var(--border)}.term-commands.open{transform:translate(0)}.term-side-toggle{display:inline-flex;align-items:center;justify-content:center;position:absolute;top:10px;left:10px;z-index:20;width:36px;height:36px;border:1px solid var(--border);border-radius:9px;background:var(--bg-elev2);color:var(--text-dim);font-size:15px;cursor:pointer}.term-side-toggle:active{background:var(--accent-soft);color:var(--accent)}.term-xterm{padding:54px 8px 8px}.msg{padding:6px 14px 12px}.inputbar{padding:10px 10px 12px}.inputbox{padding:8px 8px 8px 10px;gap:6px}.inputbox textarea{font-size:16px}.inputbox .btn{width:40px;height:40px}.attach-chip{max-width:78vw}.modal-backdrop,.dialog-overlay,.fp-overlay{padding:10px;align-items:flex-end}.modal,.dialog,.fp{width:100%;max-width:100%;max-height:94vh;border-radius:14px}.fp{height:92vh}.statusbar{flex-wrap:nowrap;padding:6px 10px;font-size:10.5px}.status-dot,.status-sep,.status-item:not(.status-ctx):not(.status-cwd){display:none}.status-ctx{flex-shrink:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.status-cwd-wrap{flex:1;min-width:0;margin-left:auto}.status-cwd-input{font-size:12px}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
32
|
+
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}:root{--bg: #0d0e12;--bg-elev: #14161c;--bg-elev2: #1a1d26;--border: #262a35;--border-soft: #1e2230;--text: #e6e8ef;--text-dim: #9aa1b4;--text-faint: #6b7284;--accent: #8b5cf6;--accent-soft: rgba(139, 92, 246, .14);--green: #34d399;--green-soft: rgba(52, 211, 153, .12);--red: #f87171;--red-soft: rgba(248, 113, 113, .12);--amber: #fbbf24;--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;line-height:1.6}.app{display:flex;flex-direction:column;height:100%}.layout{flex:1;display:flex;min-height:0}.main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}.panel{display:flex;flex-direction:column;width:240px;flex-shrink:0;min-height:0;background:var(--bg-elev);border-right:1px solid var(--border);position:relative}.panel-right{border-right:none;border-left:1px solid var(--border)}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 8px;border-bottom:1px solid var(--border-soft);flex-shrink:0}.panel-title{font-size:12px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.panel-new,.panel-refresh{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev2);color:var(--text-dim);cursor:pointer;padding:3px 8px;font-size:12px}.panel-new:hover,.panel-refresh:hover{color:var(--text);border-color:var(--accent)}.panel-fab{position:absolute;right:14px;bottom:14px;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);font-size:14px;cursor:pointer;box-shadow:0 6px 20px #00000073;z-index:2}.panel-fab:hover{color:var(--accent);border-color:var(--accent);box-shadow:0 8px 24px #00000080}.panel-fab:active{transform:scale(.94)}.panel-right .panel-body,.sessions-scroll{padding-bottom:56px}.panel-convs{flex-shrink:0;max-height:32%;overflow-y:auto;padding:6px 6px 0}.panel-sessions{flex:1;min-height:0;display:flex;flex-direction:column;padding:0 6px}.panel-sessions .panel-section-title{flex-shrink:0;padding-top:8px}.sessions-scroll{flex:1;overflow-y:auto;min-height:0}.panel-body{flex:1;overflow-y:auto;padding:6px}.panel-widgets{flex-shrink:0;max-height:40%;overflow-y:auto;padding:8px;border-top:1px solid var(--border-soft);background:#00000026}.widget{border:1px solid var(--border-soft);border-radius:8px;background:var(--bg-elev2);margin-bottom:6px;overflow:hidden}.widget:last-child{margin-bottom:0}.widget-title{padding:4px 10px;font-size:10.5px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--text-faint);border-bottom:1px solid var(--border-soft)}.widget-lines{margin:0;padding:6px 10px;font-family:var(--mono);font-size:11px;line-height:1.5;color:var(--text-dim);white-space:pre;overflow-x:auto}.pc-item{display:flex;align-items:flex-start;gap:8px;width:100%;padding:5px 8px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);font-size:12px;text-align:left;cursor:pointer}.pc-item:hover,.pc-item.sel{background:var(--accent-soft);color:var(--text)}.pc-icon{flex-shrink:0;margin-top:1px;color:var(--text-faint)}.pc-item.sel .pc-icon{color:var(--accent)}.pc-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.pc-name{font-family:var(--mono);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pc-path{font-size:10.5px;line-height:1.4;color:var(--text-faint);font-family:var(--mono);word-break:break-all;overflow-wrap:anywhere}.panel-empty{padding:16px 8px;text-align:center;font-size:12px;color:var(--text-faint)}.files-truncated{color:var(--amber);border-top:1px dashed var(--border);margin-top:8px;padding-top:12px}.session-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;border-radius:8px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer;margin-bottom:2px}.session-item:hover{background:var(--bg-elev2);color:var(--text)}.session-item.active{background:var(--accent-soft);color:var(--text);border:1px solid rgba(139,92,246,.3);padding:7px 9px}.session-icon{flex-shrink:0;color:var(--text-faint)}.session-item.active .session-icon{color:var(--accent)}.session-info{flex:1;min-width:0;display:flex;flex-direction:column}.session-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-sub{font-size:11px;color:var(--text-faint)}.session-src{margin-left:6px;font-size:9.5px;padding:0 5px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint);text-transform:uppercase;letter-spacing:.4px;vertical-align:1px}.session-time{font-size:10.5px;color:var(--text-faint);flex-shrink:0}.panel-projects{flex-shrink:0;max-height:45%;display:flex;flex-direction:column;padding:6px 6px 8px;border-bottom:2px solid var(--border)}.panel-projects .panel-section-title{flex-shrink:0}.projects-scroll{flex:1;overflow-y:auto;min-height:0}.panel-section-title{padding:4px 10px 6px;font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.panel-section-divider{height:1px;background:var(--border);margin:6px 10px}.conv-streaming{width:7px;height:7px;border-radius:50%;flex-shrink:0;background:var(--green);box-shadow:0 0 4px var(--green);animation:conv-pulse 1.2s ease-in-out infinite}@keyframes conv-pulse{0%,to{opacity:1}50%{opacity:.25}}.project-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;border-radius:8px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer;margin-bottom:2px}.project-item:hover{background:var(--bg-elev2);color:var(--text)}.project-item.active{background:var(--accent-soft);color:var(--text);border:1px solid rgba(139,92,246,.3);padding:6px 9px}.project-icon{flex-shrink:0;color:var(--text-faint)}.project-item.active .project-icon{color:var(--accent)}.project-info{flex:1;min-width:0;display:flex;flex-direction:column}.project-name{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-path{font-size:11px;color:var(--text-faint);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-time{font-size:10.5px;color:var(--text-faint);flex-shrink:0}.panel-crumbs{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--border-soft);flex-shrink:0;font-size:12px}.crumb{border:none;background:transparent;color:var(--text-faint);cursor:pointer;padding:2px 4px;border-radius:4px;font-size:12px;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.crumb:hover{color:var(--text);background:var(--bg-elev2)}.crumb.active{color:var(--accent)}.crumb-seg{display:inline-flex;align-items:center;color:var(--text-faint)}.file-item{display:flex;align-items:center;gap:7px;width:100%;padding:5px 8px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);font-size:12.5px;text-align:left;cursor:pointer}.file-item.dir{cursor:default}.file-dir-main{flex:1;min-width:0;display:flex;align-items:center;gap:7px;border:none;background:transparent;color:inherit;font-size:inherit;text-align:left;cursor:pointer;padding:0}.file-item:hover{background:var(--bg-elev2);color:var(--text)}.file-icon{flex-shrink:0;color:var(--text-faint)}.file-item.dir .file-icon{color:#fbbf24}.file-name{flex:1;min-width:0;display:flex;align-items:center;gap:7px;border:none;background:transparent;color:inherit;font-size:inherit;font-family:inherit;text-align:left;padding:0;overflow:hidden;cursor:pointer}.file-name:hover{color:var(--accent)}.file-name.no-preview{cursor:default}.file-name.no-preview:hover{color:inherit}.file-name-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-attach{position:relative;display:none;align-items:center;justify-content:center;width:22px;height:22px;border:none;border-radius:5px;cursor:pointer;flex-shrink:0}.file-item:hover .file-attach{display:inline-flex}.file-attach:after{content:attr(data-tip);position:absolute;bottom:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.file-attach:before{content:"";position:absolute;bottom:calc(100% + 3px);right:6px;border:5px solid transparent;border-top-color:#232733;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40}.file-attach:hover:after,.file-attach:hover:before{opacity:1}.chip[data-tip]{position:relative}.chip[data-tip]:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.chip[data-tip]:hover:after{opacity:1}.file-attach.inline{background:var(--accent-soft);color:var(--accent)}.file-attach.inline:hover{background:var(--accent);color:#fff}.file-attach.download{background:#34d39924;color:var(--green);text-decoration:none}.file-attach.download:hover{background:var(--green);color:#fff}.file-attach.ref{background:#fbbf241f;color:var(--amber)}.file-attach.ref:hover{background:var(--amber);color:#1a1a1a}.attach-row{max-width:860px;margin:0 auto 6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}.attach-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border:1px solid rgba(139,92,246,.4);border-radius:999px;background:var(--accent-soft);color:var(--text);font-size:12px;max-width:320px}.attach-chip.reference{border-color:#fbbf2466;background:#fbbf241a}.attach-chip.lines{border-color:#34d39966;background:#34d3991a}.attach-chip.image{border-color:#ec489973;background:#ec48991f}.attach-chip.file{border-color:#60a5fa73;background:#60a5fa1f}.inputbar.drop-active{outline:2px dashed var(--accent);outline-offset:-2px}.drop-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg-elev) 88%,transparent);z-index:5;pointer-events:none}.drop-overlay span{padding:10px 18px;border:1px dashed var(--accent);border-radius:10px;background:var(--bg-elev2);color:var(--text);font-size:14px}.attach-range{font-family:var(--mono);font-size:10.5px;padding:0 6px;border-radius:999px;background:#34d3992e;color:var(--green)}.attach-remove{border:none;background:transparent;color:var(--text-dim);cursor:pointer;font-size:14px;line-height:1;padding:0 2px}.attach-remove:hover{color:var(--red)}.attach-hint{font-size:11.5px;color:var(--text-faint)}.attachcard{margin:6px 0;border:1px dashed rgba(139,92,246,.45);border-radius:8px;background:var(--accent-soft);overflow:hidden}.attachcard-head{display:flex;align-items:center;gap:8px;width:100%;padding:7px 12px;border:none;background:transparent;color:var(--text);font-size:12.5px;cursor:pointer;text-align:left}.attachcard-head:hover{background:#8b5cf614}.attachcard-icon{flex-shrink:0}.attachcard-name{font-weight:600;font-family:var(--mono);font-size:12px}.attachcard-path{color:var(--text-faint);font-size:11px;font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.attachcard-meta{margin-left:auto;color:var(--text-faint);font-size:11px;flex-shrink:0}.attachcard-mode{margin-left:auto;font-size:11px;flex-shrink:0;padding:1px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint)}.attachcard-mode.inline{color:var(--green);border-color:#34d39959}.attachcard-mode.ref{color:var(--amber);border-color:#fbbf2466}.attachcard-mode.lines{color:var(--accent);border-color:#8b5cf666}.attachcard-refnote{padding:8px 12px;border-top:1px dashed rgba(251,191,36,.3);font-size:11.5px;color:var(--text-faint)}.attachcard-content{margin:0;padding:10px 12px;border-top:1px dashed rgba(139,92,246,.3);font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--text-dim);white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto;background:#0003}.attachcard-image img{max-width:100%;max-height:320px;border-radius:0 0 8px 8px;display:block}.skillcard{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev2);overflow:hidden}.skillcard-head{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:transparent;color:var(--text);font-size:12.5px;cursor:pointer;text-align:left;transition:background .12s ease}.skillcard-head:hover{background:#8b5cf614}.skillcard-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:22px;height:22px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:12px}.skillcard-name{font-family:var(--mono);font-weight:600;color:var(--text);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skillcard-path{flex:1;min-width:0;color:var(--text-faint);font-size:11px;font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.skillcard-action{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;color:var(--text-faint);font-size:11.5px}.skillcard-action:hover{color:var(--text)}.skillcard-body{padding:10px 14px 12px;border-top:1px solid var(--border-soft);max-height:420px;overflow-y:auto;background:#00000026}.skillcard-body .markdown>:first-child{margin-top:0}.view-pane{flex:1;display:flex;min-width:0;min-height:0}.view-pane.hidden{display:none}.panel-drawer{display:contents}.panel-toggle{display:none}.drawer-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:55;background:#00000080;animation:drawer-fade .2s ease}@keyframes drawer-fade{0%{opacity:0}to{opacity:1}}.view-switch{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:999px;overflow:hidden;background:var(--bg-elev2);flex-shrink:0}.view-switch button{display:inline-flex;align-items:center;gap:5px;border:none;background:transparent;color:var(--text-dim);font-size:12.5px;padding:4px 12px;cursor:pointer;transition:background .15s,color .15s}.view-switch button:hover{color:var(--text)}.view-switch button.active{background:var(--accent-soft);color:var(--accent)}.view-switch button+button{border-left:1px solid var(--border)}.terminal-view{flex:1;display:flex;min-height:0;min-width:0}.term-side{display:flex;flex-direction:column;width:250px;flex-shrink:0;min-height:0;background:var(--bg-elev)}.term-commands{border-right:1px solid var(--border)}.term-tabs-block{display:flex;flex-direction:column;min-height:0;flex:1 1 0;border-top:1px solid var(--border)}.term-tabs-block .panel-body{flex:1;min-height:0}.term-side-toggle{display:none}.term-main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:#0b0d12}.term-xterm{flex:1;min-height:0;padding:10px 8px 8px}.term-xterm.hidden{display:none}.term-xterm .xterm{height:100%}.term-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-faint)}.term-empty-icon{font-size:34px;opacity:.5}.term-empty-title{font-size:15px;color:var(--text-dim)}.term-empty-sub{font-size:12px}.panel-header-actions{display:flex;align-items:center;gap:6px}.cmd-item{display:flex;align-items:center;gap:4px;padding:6px;border-radius:8px;margin-bottom:2px}.cmd-item:hover{background:var(--bg-elev2)}.cmd-run{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border:none;border-radius:6px;background:var(--accent-soft);color:var(--accent);cursor:pointer}.cmd-run:hover{background:var(--accent);color:#fff}.cmd-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;text-align:left;background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:1px 4px}.cmd-name{font-size:12.5px;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-command{font-family:var(--mono);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-cwd{font-size:10px;color:var(--text-faint);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cmd-act{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:22px;height:22px;border:none;border-radius:5px;background:transparent;color:var(--text-faint);cursor:pointer;opacity:0;transition:opacity .1s;font-size:11px}.cmd-item:hover .cmd-act{opacity:1}.cmd-act:hover{color:var(--text);background:var(--bg-elev)}.cmd-act.del:hover{color:var(--red)}.cmd-act.del.confirm{opacity:1;color:var(--red);background:var(--red-soft);border:1px solid rgba(248,113,113,.4);width:auto;padding:0 7px}.cmd-form{display:flex;flex-direction:column;gap:4px;padding:6px 4px}.cmd-form label{font-size:11px;color:var(--text-faint);margin-top:4px}.cmd-input{width:100%;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev2);color:var(--text);font-family:var(--mono);font-size:12px;padding:5px 8px;outline:none}.cmd-input:focus{border-color:var(--accent)}.cmd-hint{color:var(--text-faint);font-size:10.5px}.cmd-form-actions{display:flex;gap:6px;justify-content:flex-end;margin-top:8px}.term-tab{display:flex;align-items:center;gap:2px;padding:4px 6px;border-radius:8px;margin-bottom:2px}.term-tab:hover{background:var(--bg-elev2)}.term-tab.active{background:var(--accent-soft);border:1px solid rgba(139,92,246,.3);padding:3px 5px}.term-tab-main{flex:1;min-width:0;display:flex;align-items:center;gap:6px;background:transparent;border:none;color:var(--text-dim);cursor:pointer;text-align:left;padding:2px}.term-tab-main:hover,.term-tab.active .term-tab-main{color:var(--text)}.term-tab-dot{flex-shrink:0;width:7px;height:7px;border-radius:50%}.term-tab-dot.run{background:var(--green);box-shadow:0 0 5px var(--green)}.term-tab-dot.exit{background:var(--text-faint)}.term-tab-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px}.term-tab-exit{color:var(--text-faint);font-size:11px}.term-tab-close{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;border:none;border-radius:5px;background:transparent;color:var(--text-faint);cursor:pointer;opacity:0;transition:opacity .1s}.term-tab:hover .term-tab-close,.term-tab.active .term-tab-close{opacity:1}.term-tab-close:hover{color:var(--red);background:var(--red-soft)}.statusbar{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:5px 16px;border-top:1px solid var(--border);background:var(--bg-elev);font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden}.status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.status-dot.ok{background:var(--green);box-shadow:0 0 5px var(--green)}.status-dot.busy{background:var(--amber)}.status-item{display:inline-flex;align-items:center;gap:6px;color:var(--text-dim)}.status-sep{color:var(--border)}.ctx-bar{display:inline-block;width:46px;height:5px;border-radius:3px;background:var(--bg-elev2);border:1px solid var(--border-soft);overflow:hidden;vertical-align:middle}.ctx-bar-fill{display:block;height:100%;border-radius:2px;transition:width .3s ease}.ctx-bar.ok .ctx-bar-fill{background:var(--green)}.ctx-bar.mid .ctx-bar-fill{background:var(--amber)}.ctx-bar.warn .ctx-bar-fill{background:var(--red)}.status-item.working{color:var(--accent)}.working-spin{width:9px;height:9px;border-radius:50%;border:2px solid rgba(139,92,246,.25);border-top-color:var(--accent);animation:spin .8s linear infinite;flex-shrink:0}.status-cwd{margin-left:auto;max-width:42%;overflow:hidden;text-overflow:ellipsis;color:var(--text-faint);border:none;background:transparent;font:inherit;font-size:11px;cursor:pointer;padding:2px 4px;border-radius:4px}.status-cwd:hover{color:var(--text-dim);background:var(--bg-elev2)}.status-cwd-wrap{position:relative;margin-left:auto;max-width:46%;min-width:0;display:flex;align-items:center}.status-cwd-input{width:100%;border:1px solid var(--accent);border-radius:6px;background:var(--bg-elev2);color:var(--text);font-family:var(--mono);font-size:11px;padding:3px 7px;outline:none}.status-completions{position:fixed;right:16px;bottom:40px;width:min(440px,calc(100vw - 32px));max-height:260px;overflow-y:auto;overflow-x:hidden;margin:0;padding:4px;list-style:none;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;box-shadow:0 -6px 24px #00000073;z-index:200}.status-queue{color:var(--amber)}@keyframes spin{to{transform:rotate(360deg)}}.topbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;border-bottom:1px solid var(--border);background:var(--bg-elev);flex-shrink:0}.brand{display:flex;align-items:center;gap:8px;min-width:0}.brand-logo{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:7px;background:linear-gradient(135deg,#8b5cf6,#6366f1);color:#fff;font-weight:700;font-size:16px}.brand-name{font-weight:600;letter-spacing:.2px}.conn-dot{width:8px;height:8px;border-radius:50%;margin-left:6px}.conn-dot.ok{background:var(--green);box-shadow:0 0 6px var(--green)}.conn-dot.busy{background:var(--amber)}.conn-dot.err{background:var(--red)}.conn-label{color:var(--text-faint);font-size:12px}.topbar-actions{display:flex;align-items:center;gap:8px;min-width:0}.topbar .btn.interrupt{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:1px solid var(--red);border-radius:6px;background:var(--red);color:#fff;font-size:12.5px;font-weight:600;cursor:pointer;white-space:nowrap;transition:background .15s}.topbar .btn.interrupt:hover:not(:disabled){background:#d64545}.topbar .btn.interrupt[data-tip]{position:relative}.topbar .btn.interrupt[data-tip]:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:var(--bg-elev2);color:var(--text);border:1px solid var(--border);border-radius:10px;padding:8px 12px;font-size:11px;line-height:1.5;white-space:pre-line;min-width:240px;max-width:420px;text-align:left;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:10000;box-shadow:0 12px 40px #00000080}.topbar .btn.interrupt[data-tip]:hover:after{opacity:1}.topbar-desktop{display:flex;align-items:center;gap:8px;min-width:0}.topbar-more{display:none}.chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:999px;background:var(--bg-elev2);color:var(--text);font-size:12.5px;cursor:pointer;transition:border-color .15s,background .15s;white-space:nowrap}.chip:hover{border-color:var(--accent);background:var(--accent-soft)}.chip-model{max-width:220px;overflow:hidden;text-overflow:ellipsis}.chip-vision{color:var(--accent);font-size:11px;line-height:1}.chip-sub{color:var(--text-faint);font-size:11px}.chip.newchat{color:var(--accent);border-color:#8b5cf666}.chip.newchat:hover{background:var(--accent-soft)}.chip.github{width:28px;height:28px;padding:0;justify-content:center;border-radius:50%;text-decoration:none;color:var(--text-dim)}.chip.github:hover{color:var(--text);border-color:var(--accent)}.chip.github svg{width:15px;height:15px}.dropdown{position:relative;display:inline-flex}.dd-caret{color:var(--text-faint);transition:transform .15s}.dd-caret.up{transform:rotate(180deg)}.dd-menu{position:absolute;top:calc(100% + 6px);right:0;min-width:240px;max-width:340px;max-height:420px;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 40px #00000080;padding:6px;z-index:60}.dropdown.left .dd-menu{right:auto;left:0}@media(min-width:769px){.dropdown.dd-up .dd-menu{top:auto;bottom:calc(100% + 6px);max-height:min(360px,calc(100vh - 240px))}}.dropdown.fit .dd-menu{max-height:none;overflow:visible}.dd-header{padding:6px 10px 4px;font-size:11px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--text-faint)}.dd-loading{padding:10px;font-size:12px;color:var(--text-faint);text-align:center}.dd-item{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:7px 10px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);font-size:13px;text-align:left;cursor:pointer}.dd-item:hover{background:var(--bg-elev);color:var(--text)}.dd-item:disabled{opacity:.45;cursor:not-allowed}.dd-item:disabled:hover{background:transparent;color:var(--text-dim)}.dd-item.active{background:var(--accent-soft);color:var(--text)}.dd-item.active:after{content:"✓";color:var(--accent);font-size:12px}.dd-model-cell{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}.dd-model-meta{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;min-width:0}.dd-model-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dd-model-provider{flex-shrink:0;font-size:11px;color:var(--text-faint);font-family:var(--mono)}.dd-model-badges{display:flex;flex-wrap:wrap;gap:5px}.dd-model-badge{font-size:10.5px;line-height:1.5;color:var(--text-faint);background:var(--bg-elev);border:1px solid var(--border);border-radius:4px;padding:0 6px;white-space:nowrap}.dd-refresh{width:100%;margin-top:4px;padding:6px;border:none;border-top:1px solid var(--border-soft);background:transparent;color:var(--text-faint);font-size:12px;cursor:pointer}.dd-refresh:hover{color:var(--accent)}.dd-refresh.dd-more-link{display:flex;align-items:center;gap:6px;text-decoration:none}.update-dot{width:7px;height:7px;border-radius:50%;background:var(--amber);flex-shrink:0;box-shadow:0 0 0 2px #f59e0b40}.dd-update{display:flex;flex-direction:column;gap:6px;padding:8px 10px 10px}.dd-row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:12.5px;color:var(--text-dim)}.dd-row b{color:var(--text);font-family:var(--mono);font-weight:600}.dd-note{font-size:12px;line-height:1.5;padding:6px 10px;border-radius:6px;background:var(--bg-elev1);border:1px solid var(--border-soft);color:var(--text-dim)}.dd-note.ok{color:var(--green);border-color:#34d3994d}.dd-note.warn{color:var(--amber);border-color:#f59e0b59}.dd-note.err{color:var(--red);border-color:#f8717159}.dd-actions{display:flex;gap:6px;padding:0 2px 2px}.dd-actions .dd-refresh{margin-top:0;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev1)}.dd-refresh.accent{color:var(--accent);border-color:#8b5cf666}.dd-refresh.accent.armed{color:var(--amber);border-color:#f59e0b80}.notices{position:fixed;top:52px;left:50%;transform:translate(-50%);z-index:50;display:flex;flex-direction:column;gap:6px;align-items:center;pointer-events:none}.notice{pointer-events:auto;max-width:min(720px,90vw);padding:7px 14px;border-radius:8px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text);font-size:12.5px;box-shadow:0 6px 24px #00000073;cursor:pointer;text-align:center}.notice-error{border-color:#f8717180;color:#fca5a5}.notice-warning{border-color:#fbbf2480;color:#fcd34d}.messages-wrap{flex:1;position:relative;min-height:0;display:flex;flex-direction:column}.messages{flex:1;overflow-y:auto;padding:20px 0 12px}.msg{max-width:860px;margin:0 auto;padding:6px 20px 14px;scroll-margin-top:84px}.msg-meta{display:flex;align-items:baseline;gap:10px;margin-bottom:4px}.msg-role{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:var(--text-faint)}.msg-model{font-size:11px;color:var(--accent);font-family:var(--mono)}.msg-customtype{font-size:11px;color:var(--amber)}.msg-time{font-size:11px;color:var(--text-faint);margin-left:auto}.msg-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}.msg-action{display:inline-flex;align-items:center;gap:4px;border:none;background:transparent;color:var(--text-faint);font-size:11.5px;cursor:pointer;padding:3px 8px;border-radius:6px;opacity:0;transition:opacity .15s ease,color .15s ease,background .15s ease}.msg:hover .msg-action,.msg-action:focus-visible{opacity:1}.msg-action:hover{color:var(--accent);background:var(--bg-elev2)}.msg-editor{display:flex;flex-direction:column;gap:8px}.msg-editor-input{width:100%;min-height:48px;resize:vertical;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:var(--bg-elev1);color:var(--text);font-family:inherit;font-size:13.5px;line-height:1.6;outline:none}.msg-editor-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px #8b5cf626}.msg-editor-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px}.msg-editor-hint{margin-right:auto;font-size:11px;color:var(--text-faint)}.chip.primary{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.chip.primary:disabled{opacity:.45;cursor:not-allowed}.msg-collapsed{display:flex;align-items:center;gap:10px;width:100%;max-width:860px;margin:0 auto 2px;padding:7px 12px;border:1px solid var(--border-soft);border-radius:8px;background:var(--bg-elev1);color:var(--text-dim);font-size:12px;text-align:left;cursor:pointer;transition:border-color .15s ease,background .15s ease,color .15s ease}.msg-collapsed:hover{border-color:var(--border);background:var(--bg-elev2);color:var(--text)}.msg-collapsed-role{flex-shrink:0;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.7px;color:var(--text-faint);min-width:52px}.msg-collapsed-role.role-user{color:var(--accent)}.msg-collapsed-role.role-assistant{color:var(--green)}.msg-collapsed-role.role-bashExecution,.msg-collapsed-role.role-toolResult{color:var(--amber)}.msg-collapsed-body{flex:1;min-width:0;display:flex;align-items:center;gap:8px;overflow:hidden}.msg-collapsed-preview{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-dim)}.msg-collapsed-chips{display:inline-flex;gap:4px;flex-shrink:0}.msg-collapsed-chip{font-size:10px;color:var(--text-faint);padding:1px 6px;border-radius:999px;border:1px solid var(--border);white-space:nowrap}.msg-collapsed-time{flex-shrink:0;font-size:10.5px;color:var(--text-faint)}.msg-collapsed-action{flex-shrink:0;display:inline-flex;align-items:center;gap:3px;font-size:11px;color:var(--text-faint)}.msg-collapsed:hover .msg-collapsed-action{color:var(--accent)}.msg-collapse-btn{display:inline-flex;align-items:center;gap:3px;margin-left:auto;border:none;background:transparent;color:var(--text-faint);font-size:11px;cursor:pointer;padding:1px 6px;border-radius:5px}.msg-collapse-btn:hover{color:var(--accent);background:var(--bg-elev2)}.msg-text{color:var(--text)}.msg-text p{margin:6px 0}.msg-text p:first-child{margin-top:0}.msg-text p:last-child{margin-bottom:0}.msg-text ul,.msg-text ol{padding-left:22px;margin:6px 0}.msg-text li{margin:2px 0}.msg-text blockquote{margin:8px 0;padding:2px 14px;border-left:3px solid var(--accent);color:var(--text-dim)}.msg-text table{border-collapse:collapse;margin:8px 0}.msg-text th,.msg-text td{border:1px solid var(--border);padding:4px 10px}.msg-text a{color:#a78bfa}.msg-text code{font-family:var(--mono);font-size:12.5px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:4px;padding:1px 5px}.codeblock{position:relative;margin:10px 0}.codeblock pre{background:#0b0d12!important;border:1px solid var(--border);border-radius:8px;padding:12px 14px;overflow-x:auto;margin:0}.codeblock code{background:transparent;border:none;padding:0;font-family:var(--mono);font-size:12.5px;line-height:1.55}.copy-btn{position:absolute;top:8px;right:8px;z-index:2;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:6px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);cursor:pointer;opacity:0;transition:opacity .15s}.codeblock:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--text);border-color:var(--accent)}.trunc-note{margin-top:6px;font-size:11.5px;color:var(--text-faint);font-style:italic}.msg-image img{max-width:100%;max-height:420px;border-radius:8px;border:1px solid var(--border)}.thinking{margin:8px 0;border:1px solid var(--border-soft);border-radius:8px;background:#ffffff04}.thinking-toggle{display:flex;align-items:center;gap:7px;width:100%;padding:7px 12px;border:none;background:transparent;color:var(--text-dim);font-size:12.5px;cursor:pointer;text-align:left}.thinking-toggle:hover{color:var(--text)}.thinking-icon{color:var(--accent)}.thinking-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.thinking-body{padding:4px 14px 12px;color:var(--text-dim);font-style:italic;font-size:13px;white-space:pre-wrap;border-top:1px solid var(--border-soft)}.thinking-live .thinking-toggle{color:var(--text)}.thinking-live-label{display:inline-flex;align-items:center}.thinking-live-label .dots:after{content:"";display:inline-block;width:1.2em;text-align:left;animation:thinking-dots 1.2s steps(4,end) infinite}@keyframes thinking-dots{0%{content:""}25%{content:"."}50%{content:".."}75%{content:"..."}}.thinking-wait{display:inline-flex;align-items:center;gap:5px;color:var(--text-dim);font-size:13px;padding:2px 0}.thinking-wait .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);animation:stream-blink 1s steps(2,start) infinite}.stream-cursor{display:inline-block;width:8px;height:1.05em;margin-left:3px;vertical-align:text-bottom;border-radius:1px;background:var(--accent);animation:stream-blink 1s steps(2,start) infinite}@keyframes stream-blink{0%,49%{opacity:1}50%,to{opacity:0}}.toolcall{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev);overflow:hidden}.toolcall-head{display:flex;align-items:center;gap:8px;padding:7px 12px;font-size:12.5px}.toolcall-icon{font-size:13px}.toolcall-name{font-family:var(--mono);font-weight:600;color:var(--text)}.toolcall-status{font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint)}.toolcall.run .toolcall-status{color:var(--amber);border-color:#fbbf2466}.toolcall.ok .toolcall-status{color:var(--green);border-color:#34d39959}.toolcall.err .toolcall-status{color:var(--red);border-color:#f8717166}.toolcall-exit{font-style:normal;opacity:.85;margin-left:6px}.toolcall-exit:before{content:"·";margin-right:6px;opacity:.6}.toolcall.err{border-color:#f8717159}.toolcall-spacer{flex:1}.toolcall-kill{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--red);background:var(--red-soft);color:var(--red);font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;cursor:pointer;transition:background .15s,color .15s}.toolcall-kill:hover{background:var(--red);color:#fff}.toolcall-copy,.toolcall-toggle{display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--text-faint);cursor:pointer;padding:3px;border-radius:5px}.toolcall-copy:hover,.toolcall-toggle:hover{color:var(--text);background:var(--bg-elev2)}.toolcall-body{border-top:1px solid var(--border-soft);padding:8px 12px 10px}.toolcall-args pre{margin:0;font-family:var(--mono);font-size:12px;color:var(--text-dim);white-space:pre;overflow:auto;max-height:200px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px}.termline{display:flex;align-items:center;gap:8px;background:#0b0d12;border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px;font-family:var(--mono);font-size:12.5px}.termline-icon{color:var(--green);flex-shrink:0}.termline code{word-break:break-all}.termline-timeout{margin-left:auto;color:var(--text-faint);font-size:11px;flex-shrink:0}.toolcall-output{margin-top:8px}.toolcall-output-label{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--text-faint);margin-bottom:4px}.toolcall-output pre{margin:0;max-height:320px;overflow:auto;background:#0b0d12;border:1px solid var(--border-soft);border-radius:6px;padding:8px 10px;font-family:var(--mono);font-size:12px;line-height:1.5;color:#c9d1d9;white-space:pre;word-break:normal}.toolcall.err .toolcall-output pre{color:#f0a5a5}.toolcall-waiting{margin-top:8px;font-size:12px;color:var(--text-faint)}.cursor{display:inline-block;width:7px;height:13px;background:var(--accent);vertical-align:-2px;margin-left:4px;animation:blink 1s steps(2,start) infinite}@keyframes blink{50%{opacity:0}}.bashblock{margin:8px 0;border:1px solid var(--border);border-radius:8px;background:#0b0d12;overflow:hidden}.bashblock-command{display:flex;align-items:center;gap:8px;padding:7px 12px;font-family:var(--mono);font-size:12.5px;border-bottom:1px solid var(--border-soft)}.bashblock-prompt{color:var(--green);font-weight:700}.bashblock-exit{margin-left:auto;font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--border)}.bashblock-exit.ok{color:var(--green)}.bashblock-exit.err{color:var(--red)}.bashblock-output{margin:0;padding:10px 12px;font-family:var(--mono);font-size:12px;line-height:1.5;color:#c9d1d9;white-space:pre;overflow:auto;max-height:320px}.msg-user .msg-body{background:var(--accent-soft);border:1px solid rgba(139,92,246,.25);border-radius:12px;padding:10px 14px}.msg-error{color:var(--red);background:var(--red-soft);border:1px solid rgba(248,113,113,.35);border-radius:8px;padding:8px 12px;margin-bottom:8px;font-size:13px}.empty-state{display:flex;flex-direction:column;align-items:center;text-align:center;padding:70px 20px 30px;color:var(--text-dim)}.empty-logo-wrap{position:relative;margin-bottom:20px}.empty-logo{width:68px;height:68px;display:flex;align-items:center;justify-content:center;font-size:40px;font-weight:700;color:#fff;background:linear-gradient(135deg,#8b5cf6,#6366f1 60%,#4f46e5);border-radius:20px;box-shadow:0 16px 44px #8b5cf661,inset 0 1px #ffffff38}.empty-logo-wrap:before{content:"";position:absolute;top:-18px;right:-18px;bottom:-18px;left:-18px;border-radius:32px;background:radial-gradient(ellipse at center,rgba(139,92,246,.28),transparent 70%);z-index:-1}.empty-title{margin:0 0 6px;color:var(--text);font-size:22px;font-weight:650;letter-spacing:.3px}.empty-sub{margin:0 0 16px;font-size:13px;color:var(--text-faint)}.empty-cwd{display:inline-flex;align-items:center;gap:7px;max-width:min(560px,80vw);padding:4px 12px;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-elev);font-size:11.5px}.empty-cwd-label{color:var(--text-faint);flex-shrink:0}.empty-cwd-path{color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty-examples{margin-top:34px;display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;width:min(560px,90vw)}.empty-example{display:flex;align-items:center;gap:10px;padding:11px 14px;border:1px solid var(--border);border-radius:12px;background:var(--bg-elev);color:var(--text-dim);font-size:13px;text-align:left;cursor:pointer;transition:border-color .15s,background .15s,transform .12s,box-shadow .15s}.empty-example:hover{border-color:#8b5cf680;background:var(--accent-soft);color:var(--text);transform:translateY(-1px);box-shadow:0 8px 22px #8b5cf629}.empty-example-icon{font-size:17px;flex-shrink:0}.empty-example-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.streaming-wait,.boot-wait{text-align:center;color:var(--text-faint);padding:60px 20px;font-size:13px}.scroll-bottom{position:absolute;bottom:16px;left:50%;transform:translate(-50%);display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-elev2);color:var(--text-dim);font-size:12px;cursor:pointer;box-shadow:0 6px 20px #0006}.scroll-bottom:hover{color:var(--text);border-color:var(--accent)}.qn-rail{position:absolute;top:10px;bottom:10px;right:14px;width:24px;z-index:15;border-radius:12px;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--rail-gap, 27px)}.qn-rail:before{content:"";position:absolute;top:0;bottom:0;right:100%;width:260px;pointer-events:none}.qn-rail:hover:before{pointer-events:auto}.qn-bar{position:relative;flex-shrink:0;width:16px;height:3px;border:none;border-radius:2px;background:#ffffff2e;cursor:pointer;padding:0;transition:background .12s}.qn-bar:hover{background:#ffffff61}.qn-bar.active{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb,var(--accent) 65%,transparent)}.qn-bar-text{position:absolute;right:calc(100% + 10px);top:50%;transform:translateY(-50%);width:210px;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.3;color:var(--text-dim);background:var(--bg-elev2);border:1px solid var(--border);border-radius:6px;padding:3px 9px;pointer-events:auto;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility 0s}.qn-rail:hover .qn-bar-text{visibility:visible;opacity:1}.qn-rail:not(:hover) .qn-bar-text{transition:opacity .15s ease,visibility 0s}.qn-bar:hover .qn-bar-text{color:var(--text);border-color:var(--accent)}.qn-bar.active .qn-bar-text{color:var(--text);border-color:color-mix(in srgb,var(--accent) 55%,transparent)}.qn-rail.many .qn-bar-text{display:none}.qn-list{position:absolute;right:calc(100% + 10px);top:0;bottom:0;width:230px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;padding:6px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 30px #00000073;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility 0s}.qn-rail.many:hover .qn-list{pointer-events:auto;visibility:visible;opacity:1}.qn-rail.many:not(:hover) .qn-list{transition:opacity .15s ease,visibility 0s}.qn-list-item{display:flex;align-items:center;gap:8px;flex-shrink:0;min-height:26px;padding:3px 8px;border:none;border-radius:7px;background:transparent;color:var(--text-dim);font-size:11.5px;line-height:1.3;text-align:left;cursor:pointer;transition:background .12s,color .12s}.qn-list-item:hover{background:var(--bg-elev);color:var(--text)}.qn-list-item.active{background:color-mix(in srgb,var(--accent) 30%,transparent);color:#fff}.qn-list-idx{flex-shrink:0;min-width:17px;height:17px;line-height:17px;text-align:center;border-radius:5px;background:#00000059;color:var(--text-faint);font-size:10px;font-weight:700;font-family:var(--mono)}.qn-list-item.active .qn-list-idx{background:var(--accent);color:#fff}.qn-list-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qn-tag{display:inline-flex;align-items:center;gap:6px;flex-shrink:0;align-self:center;margin-left:auto;padding:3px 8px 3px 7px;border:1px solid var(--border);border-radius:999px;background:var(--bg);color:var(--text-faint);font-family:var(--mono);font-size:10px;line-height:1;cursor:pointer;transition:border-color .12s,background .12s,color .12s}.qn-tag-bar{width:16px;height:3px;border-radius:2px;background:#ffffff38;transition:background .12s}.qn-tag:hover{background:var(--bg-elev2);border-color:var(--accent);color:var(--text)}.qn-tag:hover .qn-tag-bar{background:var(--accent)}.qn-tag.active{border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent)}.qn-tag.active .qn-tag-bar{background:var(--accent);box-shadow:0 0 8px color-mix(in srgb,var(--accent) 65%,transparent)}@keyframes qn-flash{0%{background-color:color-mix(in srgb,var(--accent) 32%,transparent)}to{background-color:transparent}}.msg-flash{border-radius:8px;animation:qn-flash 1.6s ease-out}@media(max-width:640px){.qn-rail{display:none}}.goalbar{max-width:860px;margin:0 auto 8px;border:1px solid var(--border);border-radius:12px;background:var(--bg-elev1);padding:8px 10px;display:flex;flex-direction:column;gap:6px}.goalbar-row{display:flex;align-items:center;gap:8px}.goalbar-icon{color:var(--amber);display:inline-flex;align-items:center;font-size:15px;flex-shrink:0}.goalbar-spin{display:inline-block;animation:goalbar-spin 1s linear infinite}@keyframes goalbar-spin{to{transform:rotate(360deg)}}.goalbar-input{flex:1;min-width:0;background:transparent;border:none;outline:none;color:var(--text);font-size:13px;padding:4px 2px}.goalbar-input::placeholder{color:var(--text-dim)}.goalbar-btn{background:var(--accent);color:#fff;border:none;border-radius:8px;padding:5px 12px;font-size:12px;cursor:pointer;flex-shrink:0}.goalbar-btn:disabled{opacity:.45;cursor:default}.goalbar-btn.wizard{background:var(--amber)}.goalbar-active.wizard{border-color:var(--amber)}.msg-goal-wizard.msg-custom{border-left:3px solid var(--amber)}.goalbar-icon-btn{background:transparent;border:none;color:var(--text-dim);cursor:pointer;display:inline-flex;align-items:center;padding:4px;border-radius:6px;font-size:15px;flex-shrink:0}.goalbar-icon-btn:hover{color:var(--text);background:var(--bg-elev2)}.goalbar-opts{display:flex;align-items:center;gap:14px;font-size:12px;color:var(--text-dim)}.goalbar-opt{cursor:pointer;padding:2px 6px;border-radius:6px}.goalbar-opt:hover{background:var(--bg-elev2)}.goalbar-opt b{color:var(--text);font-weight:600}.goalbar-round{display:inline-flex;align-items:center;gap:6px;color:var(--text-dim);font-size:12px}.goalbar-round input{width:54px;padding:3px 6px;font-size:12px;color:var(--text);background:var(--bg-elev2);border:1px solid var(--border);border-radius:6px;outline:none;text-align:center}.goalbar-round input:focus{border-color:var(--accent)}.goalbar-round input::placeholder{color:var(--text-faint)}.goalbar-lock-hint{color:var(--text-dim)}.goalbar-active{border-color:var(--amber);background:color-mix(in srgb,var(--amber) 8%,var(--bg-elev1))}.goalbar-active.reviewing{border-color:var(--green)}.goalbar-active-row{display:flex;align-items:center;gap:10px;font-size:13px}.goalbar-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--text);flex:1;min-width:0}.goalbar-chip{flex-shrink:0;font-size:11px;padding:2px 8px;border-radius:10px;background:var(--bg-elev2);color:var(--text-dim);white-space:nowrap}.goalbar-chip.reviewing,.goalbar-chip.pass{background:var(--green);color:#fff}.goalbar-chip.fail{background:var(--red);color:#fff}.goalbar-detail{color:var(--text-dim);font-size:12px;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:30%}.goalbar-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:4px;display:inline-flex;border-radius:6px;flex-shrink:0}.goalbar-x:disabled{opacity:.4;cursor:default}.goalbar-x:hover:not(:disabled){color:var(--red);background:var(--bg-elev2)}.goalbar-collapsed{border:none;background:transparent;padding:0;align-items:flex-start}.goalbar-hint{background:transparent;border:none;color:var(--text-dim);font-size:12px;padding:4px 10px;cursor:pointer;border-radius:999px;display:inline-flex;align-items:center;gap:7px;border:1px dashed var(--border);background:var(--bg-elev1);transition:border-color .15s,color .15s}.goalbar-hint svg{color:var(--amber)}.goalbar-hint:hover{color:var(--text);border-color:var(--amber);border-style:solid}.goalbar-hint span{white-space:nowrap}.msg-goal-review{border-left:3px solid var(--amber)}.msg-goal-review.msg-custom{background:transparent}.inputbar{flex-shrink:0;padding:12px 20px 14px;position:relative}.queue-hint{max-width:860px;margin:0 auto 8px;display:flex;gap:14px;font-size:12px;color:var(--amber)}.inputbox{max-width:860px;margin:0 auto;display:flex;flex-direction:column;gap:8px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:16px;padding:10px;transition:border-color .2s ease,box-shadow .2s ease;box-shadow:inset 0 1px #ffffff0a,0 4px 18px #00000047}.inputbox-row{display:flex;align-items:flex-end;gap:10px;min-width:0}.input-tools{display:none}.inputbox:focus-within{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));box-shadow:inset 0 1px #ffffff0a,0 0 0 3px var(--accent-soft),0 6px 22px #00000052}.inputbox textarea{flex:1;resize:none;border:none;outline:none;background:transparent;color:var(--text);font-family:var(--sans);font-size:14.5px;line-height:1.6;max-height:220px;padding:6px 2px;caret-color:var(--accent);overflow:hidden}.inputbox textarea::placeholder{color:var(--text-faint)}.inputbox textarea:disabled{opacity:.6}.inputbox-actions{display:flex;align-items:center;gap:8px;flex-shrink:0;padding-bottom:2px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--border);border-radius:8px;padding:7px 12px;font-size:13px;cursor:pointer;transition:all .15s}.btn:disabled{opacity:.4;cursor:default}.inputbox .btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;padding:0;border:1px solid var(--border);border-radius:50%;background:transparent;color:var(--text-dim);cursor:pointer;transition:background .18s,color .18s,border-color .18s,transform .18s,box-shadow .18s,filter .18s;flex-shrink:0}.inputbox .btn svg{width:17px;height:17px}.inputbox .btn:disabled{opacity:.4;cursor:default}.inputbox .btn.attach-img{border:none;color:var(--text-faint)}.inputbox .btn.attach-img:hover:not(:disabled){background:var(--accent-soft);color:var(--accent)}.inputbox .btn.send{background:#3b82f6;border-color:#3b82f6;color:#fff;box-shadow:0 2px 10px #3b82f659}.inputbox .btn.send:hover:not(:disabled){background:#2563eb;border-color:#2563eb;transform:translateY(-1px);box-shadow:0 4px 16px #3b82f673}.inputbox .btn.stop{background:#3b82f6;border-color:#3b82f6;color:#fff;box-shadow:0 2px 10px #3b82f659}.inputbox .btn.stop:hover:not(:disabled){background:#2563eb;border-color:#2563eb;transform:translateY(-1px);box-shadow:0 4px 16px #3b82f673}.inputbox .btn.supplement{width:auto;border-radius:999px;padding:0 16px;gap:5px;font-size:13px;border-color:#8b5cf673;color:var(--accent)}.inputbox .btn.supplement:hover:not(:disabled){background:var(--accent);border-color:var(--accent);color:#fff}.slash-menu{position:absolute;bottom:calc(100% - 4px);left:50%;transform:translate(-50%);width:min(860px,calc(100% - 40px));max-height:min(320px,50vh);overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:14px;box-shadow:0 -6px 24px #00000059,0 2px 12px #00000040;z-index:60;padding:6px}.slash-menu-hint{display:flex;align-items:center;justify-content:space-between;padding:4px 10px 8px;font-size:11.5px;color:var(--text-faint);border-bottom:1px dashed var(--border);margin-bottom:6px}.slash-menu-close{cursor:pointer;opacity:.7}.slash-menu-close:hover{opacity:1}.slash-item{display:flex;align-items:baseline;gap:10px;width:100%;padding:7px 10px;border:none;border-radius:9px;background:transparent;color:var(--text);font-family:var(--sans);font-size:13.5px;text-align:left;cursor:pointer}.slash-item.active{background:var(--accent-soft)}.slash-name{font-family:var(--mono);font-size:12.5px;color:var(--accent);white-space:nowrap}.slash-desc{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-dim);font-size:12.5px}.slash-hint{color:var(--text-faint);font-family:var(--mono);font-size:11.5px;margin-left:6px}.slash-source{flex-shrink:0;font-size:10.5px;padding:1px 7px;border-radius:999px;border:1px solid var(--border);color:var(--text-faint);white-space:nowrap}.slash-source.builtin{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,transparent)}.slash-source.extension{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,transparent)}.slash-source.prompt{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 45%,transparent)}.slash-source.skill{color:#5eb3ff;border-color:color-mix(in srgb,#5eb3ff 45%,transparent)}.slash-help{max-width:860px;width:100%;max-height:min(560px,80vh);display:flex;flex-direction:column;background:var(--bg-elev2);border:1px solid var(--border);border-radius:16px;box-shadow:0 18px 60px #00000080;overflow:hidden}.slash-help-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border);font-size:15px;font-weight:600}.slash-help-body{overflow-y:auto;padding:8px 12px 14px}.slash-help-row{display:flex;align-items:baseline;gap:10px;padding:7px 8px;border-radius:8px}.slash-help-row:hover{background:var(--bg-elev1)}.slash-help-cmd{font-family:var(--mono);font-size:12.5px;color:var(--accent);white-space:nowrap}.slash-help-desc{flex:1;color:var(--text-dim);font-size:13px}.slash-help-empty{padding:24px;text-align:center;color:var(--text-faint)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#2a2f3d;border-radius:6px;border:2px solid var(--bg)}::-webkit-scrollbar-thumb:hover{background:#3a4152}::-webkit-scrollbar-track{background:transparent}@media(max-width:640px){.chip-model{max-width:120px}.brand-name,.conn-label{display:none}}.dialog-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:200;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:24px}.dialog{display:flex;flex-direction:column;gap:14px;width:100%;max-width:500px;max-height:82vh;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;padding:18px 20px}.dialog-title{font-size:14px;font-weight:700;color:var(--text);white-space:pre-wrap;word-break:break-word}.dialog-options{display:flex;flex-direction:column;gap:8px}.dialog-option{display:block;width:100%;text-align:left;border:1px solid var(--border);border-radius:8px;background:var(--bg-elev);color:var(--text);padding:9px 12px;font-size:13px;line-height:1.5;cursor:pointer;white-space:pre-wrap;word-break:break-word;transition:border-color .12s,background .12s}.dialog-option:hover,.dialog-option.sel{border-color:var(--accent);background:var(--accent-soft)}.dialog-hint{color:var(--text-faint);font-size:13px}.dialog-body{font-size:13px;color:var(--text-dim);white-space:pre-wrap;word-break:break-word}.dialog-input{width:100%;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;padding:9px 12px;outline:none}.dialog-input:focus{border-color:var(--accent)}.dialog-actions{display:flex;justify-content:flex-end;gap:8px}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover:not(:disabled){filter:brightness(1.12)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:300;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:24px}.modal{position:relative;display:flex;flex-direction:column;gap:14px;width:100%;max-width:460px;max-height:84vh;overflow-y:auto;background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;padding:20px 22px}.model-modal{max-width:640px}.settings-modal{max-width:760px}.set-section{display:flex;flex-direction:column;gap:8px;padding:12px;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:10px}.set-section-title{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--text)}.set-section-icon{color:var(--accent);font-size:14px}.set-count{margin-left:auto;font-size:11px;font-weight:500;color:var(--text-dim);background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:999px;padding:1px 8px}.set-mode-row{display:flex;align-items:center;gap:10px}.set-field-label{font-size:12px;color:var(--text-dim)}.set-select{flex:1;max-width:160px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:6px 8px;font-size:13px;outline:none}.set-select:focus{border-color:var(--accent)}.set-prompt-input{width:100%;box-sizing:border-box;resize:vertical;min-height:140px;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:10px 12px;font-size:13px;font-family:inherit;line-height:1.6;outline:none}.set-prompt-input:focus{border-color:var(--accent)}.set-hint{margin:0;font-size:12px;color:var(--text-dim);line-height:1.5}.set-list{display:flex;flex-direction:column;gap:6px;max-height:260px;overflow-y:auto}.set-row{display:flex;align-items:center;gap:10px;padding:7px 9px;background:var(--bg-elev2);border:1px solid var(--border-soft);border-radius:8px}.set-row-info{flex:1;min-width:0}.set-row-name{font-size:13px;color:var(--text);word-break:break-all}.set-row-desc{font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.set-switch{flex:none;position:relative;width:36px;height:20px;border:none;border-radius:999px;background:var(--border);cursor:pointer;transition:background .15s;padding:0}.set-switch.on{background:var(--accent)}.set-switch-knob{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .15s}.set-switch.on .set-switch-knob{left:18px}.set-preset-save{display:flex;align-items:center;width:100%;gap:8px}.set-input{flex:1;min-width:0;background:var(--bg-elev2);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:9px 12px;font-size:13px;outline:none}.set-save-btn{display:inline-flex;align-items:center;gap:6px;flex:none;padding:9px 14px;border:1px solid rgba(139,92,246,.4);border-radius:8px;background:transparent;color:var(--accent);font-size:13px;cursor:pointer;white-space:nowrap}.set-save-btn:hover:not(:disabled){background:var(--bg-elev2)}.set-save-btn:disabled{opacity:.45;cursor:not-allowed}.set-input:focus{border-color:var(--accent)}.set-row-actions{display:flex;align-items:center;gap:6px;flex:none}.set-icon-btn{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border-soft);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.set-icon-btn:hover{color:var(--text);background:var(--bg-elev)}.set-icon-btn.danger:hover{color:var(--red)}.set-empty{margin:0;font-size:12px;color:var(--text-dim)}.modal-close{position:absolute;top:12px;right:12px;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.modal-close:hover{color:var(--text);background:var(--bg-elev)}.modal-head{display:flex;align-items:center;gap:10px}.modal-head-icon{color:var(--accent);font-size:18px}.modal-head h2{font-size:16px;margin:0}.modal-desc{margin:0;color:var(--text-dim);font-size:13px;line-height:1.6}.modal-desc code{background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:4px;padding:1px 5px;font-size:12px}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.setup-actions{display:flex;gap:10px;margin-top:6px}.setup-key-form{display:flex;flex-direction:column;gap:12px}.setup-done{color:var(--text);font-size:13px;line-height:1.6}.setup-failed{display:flex;flex-direction:column;gap:10px}.setup-detail{margin:0;max-height:140px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:8px;padding:10px 12px;font-size:12px;color:#fca5a5}.field{display:flex;flex-direction:column;gap:5px}.field-label{font-size:12px;color:var(--text-dim)}.field-label em{font-style:normal;opacity:.7}.field input,.field select{background:var(--bg-elev);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:8px 10px;font-size:13px;outline:none}.field input:focus,.field select:focus{border-color:var(--accent)}.field.check{flex-direction:row;align-items:center;gap:8px;font-size:13px;color:var(--text)}.field-hint{font-size:12px;color:var(--text-dim)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.form-section-title{font-size:12px;font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-top:4px}.section-hint{font-weight:400;text-transform:none;letter-spacing:0;opacity:.75}.auth-badge{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:99px;font-size:11px;color:#6ee7a0;background:#34d3991f;border:1px solid rgba(52,211,153,.25);vertical-align:1px}.auth-badge.dim{color:var(--text-dim);background:var(--bg-elev);border-color:var(--border)}.key-input{background:var(--bg-elev);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 9px;font-size:12.5px;outline:none;width:190px}.key-input:focus{border-color:var(--accent)}.btn.sm{padding:6px 10px;font-size:12px}.provider-list{display:flex;flex-direction:column;gap:8px}.provider-row{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--bg-elev);border:1px solid var(--border-soft);border-radius:8px;padding:10px 12px}.provider-info{display:flex;flex-direction:column;gap:2px;min-width:0}.provider-name{font-size:13.5px;font-weight:600;color:var(--text)}.provider-sub{font-size:12px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.provider-actions{display:flex;gap:6px;flex-shrink:0}.iconbtn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer}.iconbtn:hover{color:var(--text);background:var(--bg-elev)}.iconbtn.danger{color:#fca5a5}.iconbtn.danger:hover{background:var(--red-soft)}.model-row{display:grid;grid-template-columns:1.4fr 1fr 110px auto 88px 88px 28px;gap:8px;align-items:center;margin-bottom:8px}.model-row input,.model-row select{background:var(--bg-elev);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 8px;font-size:12.5px;outline:none;min-width:0}.model-row input:focus,.model-row select:focus{border-color:var(--accent)}.model-row .check{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--text-dim);white-space:nowrap}@media(max-width:640px){.form-grid,.model-row{grid-template-columns:1fr}}.sound-menu{display:flex;flex-direction:column;gap:2px;width:300px}.sound-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;border-radius:8px;cursor:pointer;transition:background .12s}.sound-row:hover{background:var(--bg-elev)}.sound-row.disabled{opacity:.45;pointer-events:none}.sound-row input[type=checkbox]{width:15px;height:15px;accent-color:var(--accent);cursor:pointer;flex-shrink:0}.sound-label{display:flex;align-items:center;gap:8px;min-width:0}.sound-master .sound-name{font-weight:700}.sound-icon{color:var(--accent);flex-shrink:0}.sound-name{font-size:13px;color:var(--text)}.sound-desc{font-size:11px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sound-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.sound-preview{border:1px solid var(--border);border-radius:6px;background:var(--bg-elev);color:var(--text-dim);font-size:11px;padding:2px 8px;cursor:pointer;transition:border-color .12s,color .12s}.sound-preview:hover:not(:disabled){border-color:var(--accent);color:var(--text)}.sound-preview:disabled{opacity:.4;cursor:default}.sound-volume{display:flex;align-items:center;gap:10px;padding:8px 10px}.sound-volume.disabled{opacity:.45;pointer-events:none}.sound-volume input[type=range]{flex:1;accent-color:var(--accent);cursor:pointer}.sound-vol-num{font-size:11px;color:var(--text-faint);min-width:34px;text-align:right}.fp-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:250;display:flex;align-items:center;justify-content:center;background:#0405089e;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);padding:28px}.fp{display:flex;flex-direction:column;width:100%;max-width:860px;height:min(78vh,720px);background:var(--bg-elev2);border:1px solid var(--border);border-radius:12px;box-shadow:0 24px 64px #0000008c;overflow:hidden}.fp-head{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--border-soft);flex-shrink:0;min-width:0}.fp-name{font-family:var(--mono);font-size:13px;font-weight:700;color:var(--text);white-space:nowrap}.fp-path{font-family:var(--mono);font-size:11px;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.fp-meta{font-size:11px;color:var(--text-faint);flex-shrink:0;white-space:nowrap}.fp-head-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.fp-attach{position:relative;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border);border-radius:6px;background:var(--bg-elev);color:var(--text-dim);cursor:pointer}.fp-attach.inline:hover{background:var(--accent);border-color:var(--accent);color:#fff}.fp-attach.ref:hover{background:var(--amber);border-color:var(--amber);color:#1a1a1a}.fp-attach:after{content:attr(data-tip);position:absolute;top:calc(100% + 8px);right:0;background:#232733;color:var(--text);border:1px solid var(--border);border-radius:6px;padding:4px 9px;font-size:11px;line-height:1.4;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .09s ease;z-index:40;box-shadow:0 4px 14px #00000073}.fp-attach:hover:after{opacity:1}.fp-close{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:1px solid var(--border);border-radius:6px;background:transparent;color:var(--text-dim);cursor:pointer;margin-left:2px}.fp-close:hover{color:var(--red);border-color:var(--red)}.fp-notice{padding:7px 14px;font-size:11.5px;color:var(--amber);background:#fbbf2414;border-bottom:1px solid var(--border-soft);flex-shrink:0}.fp-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text-faint);font-size:13px;padding:40px}.fp-hex-wrap{flex:1;display:flex;flex-direction:column;min-height:0}.fp-hex{flex:1;overflow:auto;margin:0;padding:12px 14px;background:#00000038;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;color:var(--text-dim);white-space:pre;-webkit-user-select:text;user-select:text}.fp-code{flex:1;overflow:auto;background:#00000038;font-family:var(--mono);font-size:12px;line-height:1.6;padding:6px 0;user-select:none;-webkit-user-select:none}.fp-media-wrap{flex:1;min-height:0;overflow:auto;background:#00000038;display:flex;align-items:center;justify-content:center;padding:12px}.fp-media{max-width:100%;max-height:100%;border-radius:4px}.fp-line{display:flex;gap:0;padding-right:16px;cursor:pointer}.fp-line:hover{background:#8b5cf614}.fp-line.sel{background:#8b5cf638}.fp-code.dragging .fp-line.sel{background:#8b5cf64d}.fp-num{flex-shrink:0;width:52px;padding-right:12px;text-align:right;color:var(--text-faint);background:transparent;border-right:1px solid var(--border-soft);margin-right:14px;user-select:none;-webkit-user-select:none}.fp-code-text{flex:1;min-width:0;white-space:pre;color:var(--text-dim)}.fp-line.sel .fp-code-text{color:var(--text)}.fp-lines-note{padding:8px 16px 6px;font-size:11px;color:var(--text-faint)}.fp-foot{display:flex;align-items:center;gap:12px;padding:10px 14px;border-top:1px solid var(--border-soft);flex-shrink:0;background:var(--bg-elev)}.fp-hint{flex:1;min-width:0;font-size:12px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fp-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.fp-actions .btn{display:inline-flex;align-items:center;gap:5px}@media(max-width:768px){.topbar-desktop{display:none}.topbar-more{display:inline-flex}.topbar{padding:8px 10px;gap:8px;flex-wrap:nowrap}.brand-name,.conn-label,.brand-logo,.brand .conn-dot{display:none}.chip>span:not(.update-dot){display:none}.input-tools{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:nowrap}.input-tools-left,.input-tools-right{display:flex;align-items:center;gap:6px;min-width:0}.input-tools-right{flex-shrink:0}.inputbox-row .attach-img,.inputbox-row .inputbox-actions{display:none}.input-tools .chip>span:not(.update-dot){display:inline}.input-tools .chip-model{max-width:80px}.input-tools .chip{padding:5px 8px;flex-shrink:1;min-width:0}.input-tools .chip .chip-sub,.input-tools .chip .chip-model{overflow:hidden;text-overflow:ellipsis;min-width:0}.topbar-actions{gap:6px;flex-wrap:wrap;row-gap:6px}.dropdown .dd-menu{position:fixed;left:12px;right:12px;top:auto;bottom:calc(env(safe-area-inset-bottom,0px) + 12px);max-width:none;max-height:55vh;z-index:90}.dropdown.left .dd-menu{left:12px;right:12px}.sound-menu{width:100%}.chip{padding:6px 9px}.view-switch button{padding:5px 10px}.panel-toggle{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--border);border-radius:9px;background:var(--bg-elev2);color:var(--text-dim);font-size:15px;cursor:pointer;flex-shrink:0}.panel-toggle:active{background:var(--accent-soft);color:var(--accent)}.file-item .file-attach{display:inline-flex}.file-attach:after,.file-attach:before{display:none}.panel-drawer{display:block;position:fixed;top:0;bottom:0;z-index:60;width:min(300px,86vw);background:var(--bg-elev);transition:transform .25s ease}.panel-drawer.drawer-left{left:0;border-right:1px solid var(--border);box-shadow:8px 0 30px #00000059;transform:translate(-105%)}.panel-drawer.drawer-right{right:0;border-left:1px solid var(--border);box-shadow:-8px 0 30px #00000059;transform:translate(105%)}.panel-drawer.open{transform:translate(0)}.panel-drawer .panel{width:100%;height:100%;border:none}.term-main{position:relative}.term-commands{position:fixed;left:0;top:0;bottom:0;z-index:60;width:min(300px,86vw);transform:translate(-105%);transition:transform .25s ease;box-shadow:8px 0 30px #00000059;border-right:1px solid var(--border)}.term-commands.open{transform:translate(0)}.term-side-toggle{display:inline-flex;align-items:center;justify-content:center;position:absolute;top:10px;left:10px;z-index:20;width:36px;height:36px;border:1px solid var(--border);border-radius:9px;background:var(--bg-elev2);color:var(--text-dim);font-size:15px;cursor:pointer}.term-side-toggle:active{background:var(--accent-soft);color:var(--accent)}.term-xterm{padding:54px 8px 8px}.msg{padding:6px 14px 12px}.inputbar{padding:10px 10px 12px}.inputbox{padding:8px 8px 8px 10px;gap:6px}.inputbox textarea{font-size:16px}.inputbox .btn{width:40px;height:40px}.attach-chip{max-width:78vw}.modal-backdrop,.dialog-overlay,.fp-overlay{padding:10px;align-items:flex-end}.modal,.dialog,.fp{width:100%;max-width:100%;max-height:94vh;border-radius:14px}.fp{height:92vh}.statusbar{flex-wrap:nowrap;padding:6px 10px;font-size:10.5px}.status-dot,.status-sep,.status-item:not(.status-ctx):not(.status-cwd){display:none}.status-ctx{flex-shrink:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.status-cwd-wrap{flex:1;min-width:0;margin-left:auto}.status-cwd-input{font-size:12px}}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
33
33
|
Theme: GitHub Dark
|
|
34
34
|
Description: Dark theme as seen on github.com
|
|
35
35
|
Author: github.com
|
package/web/dist/index.html
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="color-scheme" content="dark" />
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
8
8
|
<title>pi-web-ui — pi 编码智能体</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-Cx5p0OLy.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DkYHV6iM.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|