agentus 0.10.0 → 0.10.1
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/README.md +3 -2
- package/README.zh-CN.md +2 -1
- package/docs/installation.md +1 -1
- package/docs/installation.zh-CN.md +1 -1
- package/package.json +2 -1
- package/packages/web/dist/assets/{index-B2YR8mN4.js → index-C9RyEkdh.js} +1 -1
- package/packages/web/dist/assets/index-Dej-v4qD.css +32 -0
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/assets/index-CDd0dpAg.css +0 -32
package/README.md
CHANGED
|
@@ -53,10 +53,11 @@ depth**, a permission mode that survives a restart, the **context-budget** field
|
|
|
53
53
|
channel** (memory recall/save hints in the message stream), per-process skill roots, **project
|
|
54
54
|
skills made visible and switchable** (a repo's `.agents/skills` shows up as a `project_skills`
|
|
55
55
|
option instead of being skipped in silence), **background-job completion wake-ups** (a finished
|
|
56
|
-
background process comes back as a turn of its own),
|
|
56
|
+
background process comes back as a turn of its own), an **ACP session that writes its own log files** (`agent.log`/`errors.log`, so a
|
|
57
|
+
cockpit-side failure is diagnosable afterwards), and a **DeepSeek web backend** (search +
|
|
57
58
|
extract on the model key) — come from the fork's integration build instead. That is a five-line install:
|
|
58
59
|
[§ Which Hermes to run](docs/installation.md#which-hermes-to-run) — currently the tag
|
|
59
|
-
`agentus/v0.22.0/merge-
|
|
60
|
+
`agentus/v0.22.0/merge-20261022-2226`, on Hermes `v0.22.0`.
|
|
60
61
|
|
|
61
62
|
The first slot you start will use the Hermes home **your own agent already uses**
|
|
62
63
|
(`~/.hermes`) unless the backend row names another one — see "HERMES_HOME" below.
|
package/README.zh-CN.md
CHANGED
|
@@ -47,10 +47,11 @@ web bundle、配套 APK —— 然后直接退出,不启动任何东西)。
|
|
|
47
47
|
**上下文预算**输入框、把记忆召回 / 存记忆提示送进消息流的 **status 通道**、按进程指定的技能根、
|
|
48
48
|
**项目 skill 可见可设**(仓库的 `.agents/skills` 会以 `project_skills` 选项出现,而不是被无声跳过)、
|
|
49
49
|
**后台任务完成唤醒**(后台进程跑完会自己开一个回合回来),
|
|
50
|
+
**ACP 会话自己写日志**(`agent.log`/`errors.log`,驾驶舱里出的问题事后可查),
|
|
50
51
|
以及 **DeepSeek 的 web 后端**(搜索 + 正文抓取,共用模型 key)—— 来自 fork 的集成构建(tag)。
|
|
51
52
|
装法就五行:
|
|
52
53
|
[§ 该跑哪份 Hermes](docs/installation.zh-CN.md#该跑哪份-hermes) —— 当前是 tag
|
|
53
|
-
`agentus/v0.22.0/merge-
|
|
54
|
+
`agentus/v0.22.0/merge-20261022-2226`,基座 Hermes `v0.22.0`。
|
|
54
55
|
|
|
55
56
|
你启动的第一个 slot 会使用**你自己的 agent 已经在用的**那个 Hermes home(`~/.hermes`),除非后端那一行
|
|
56
57
|
指定了另一个 —— 见下面的「HERMES_HOME」。
|
package/docs/installation.md
CHANGED
|
@@ -60,7 +60,7 @@ ref and gets rebuilt, while a tag never moves — so pin the tag. The `agentus/`
|
|
|
60
60
|
ours apart from upstream's own tags (`v0.22.0`, `v0.22.0+canary.*`), and the timestamp in the
|
|
61
61
|
last segment sorts, so "newest" is a `sort -V`.
|
|
62
62
|
|
|
63
|
-
**Current integration build: `agentus/v0.22.0/merge-
|
|
63
|
+
**Current integration build: `agentus/v0.22.0/merge-20261022-2226`** — the newest tag on the fork,
|
|
64
64
|
built on Hermes `v0.22.0`. This line is for orientation only, not the source of truth: the
|
|
65
65
|
`TAG=$(…)` step below resolves the newest one on every run, so read it there if this sentence
|
|
66
66
|
ever looks stale.
|
|
@@ -52,7 +52,7 @@ agentus/<hermes 内部版本>/merge-<YYYYMMDD-HHMM>
|
|
|
52
52
|
tag。`agentus/` 这个前缀也把它和上游自己的 tag(`v0.22.0`、`v0.22.0+canary.*`)分开;最后一段是时间戳,
|
|
53
53
|
可排序,所以「最新」就是一次 `sort -V`。
|
|
54
54
|
|
|
55
|
-
**当前集成构建:`agentus/v0.22.0/merge-
|
|
55
|
+
**当前集成构建:`agentus/v0.22.0/merge-20261022-2226`** —— fork 上最新的那个 tag,基座 Hermes
|
|
56
56
|
`v0.22.0`。这行只为一眼看个大概,不是权威:下面的 `TAG=$(…)` 每次都会自己解析出最新,觉得这行过期就
|
|
57
57
|
以它为准。
|
|
58
58
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentus",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Multi-session web cockpit for ACP-speaking coding agents (Qoder CLI / Hermes). UI has no intelligence — the agent lives in spawned CLI subprocesses.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"live-stream": "tsx scripts/qa/live-stream.mts",
|
|
79
79
|
"open-target": "tsx scripts/qa/open-target.mts",
|
|
80
80
|
"rail-recent": "tsx scripts/qa/rail-recent.mts",
|
|
81
|
+
"rail-breakpoints": "node scripts/qa/rail-breakpoints.mjs",
|
|
81
82
|
"permission-echo": "node scripts/qa/permission-echo.mjs",
|
|
82
83
|
"turn-pulse": "tsx scripts/qa/turn-pulse.mts",
|
|
83
84
|
"resume-tail": "tsx scripts/qa/resume-tail.mts",
|
|
@@ -126,6 +126,6 @@ click to point this session at another directory`,"aria-label":"change workspace
|
|
|
126
126
|
click to point this session at another directory`,"aria-label":"workspace",onClick:i,children:o.jsx($r,{})}),o.jsx("button",{className:`icon-btn ${s?"on":""}`,title:"workspace panel — files and terminal","aria-label":"workspace panel","aria-expanded":s,onClick:n,children:o.jsx(uE,{})})]})]})}const Va={current:()=>{}},cy=4,t5=_.memo(function({busy:t,lastAt:s}){const[,n]=_.useState(0);if(_.useEffect(()=>{if(!t)return;const a=window.setInterval(()=>n(l=>l+1),1e3);return()=>window.clearInterval(a)},[t]),!t)return null;const{quiet:i,said:r}=cD(s,Date.now());return o.jsx("span",{className:`turn-pulse ${i?"quiet":""}`,role:"status","aria-label":r,title:r})}),s5=_.memo(function({busy:t,since:s}){const[n,i]=_.useState(null),[r,a]=_.useState(()=>Date.now());if(_.useEffect(()=>{if(!t){i(null);return}i(s??Date.now()),a(Date.now());const c=window.setInterval(()=>a(Date.now()),1e3);return()=>window.clearInterval(c)},[t,s]),!t)return null;const l=n??s;return o.jsxs("div",{className:"stream-hint",role:"status","data-anchor":l??void 0,children:[o.jsx("span",{className:"stream-spin","aria-hidden":"true"}),o.jsx("span",{children:"处理中"}),l!=null?o.jsxs("span",{className:"elapsed",children:["(",Ru(r-l),")"]}):null]})});function n5({v:e}){const t=e.background??[],[s,n]=_.useState(!1);if(!t.length)return null;const i=t.filter(c=>c.status==="running"),r=t.filter(c=>c.status!=="running"),a=i.reduce((c,u)=>c+(u.kind==="delegation"?u.taskCount??1:0),0),l=i.length?`后台任务 ${i.length} 个运行中${a?`(含 ${a} 个子任务)`:""} · 完成后会唤醒会话`:`${r.length} 个后台任务已结束`;return o.jsxs("div",{className:`bg-row ${s?"open":""}`,"data-count":t.length,children:[o.jsxs("button",{type:"button",className:"bg-head","aria-expanded":s,onClick:()=>n(!s),children:[o.jsx("span",{className:"bg-dot","aria-hidden":"true","data-state":i.length?"running":"exited","data-wake":i.length?"1":void 0}),o.jsx("span",{className:"bg-text",children:l}),i.length&&!e.busy?o.jsx("span",{className:"bg-hint",children:"会话已空闲,后台仍在跑"}):null,o.jsx("span",{className:"bg-caret","aria-hidden":"true",children:s?"▾":"▸"})]}),s&&o.jsx("ul",{className:"bg-list",children:t.map(c=>o.jsxs("li",{className:"bg-item","data-state":c.status,"data-kind":c.kind??"process",children:[c.kind==="delegation"?o.jsx("span",{className:"bg-tag",children:"子任务"}):null,o.jsx("pre",{className:"bg-cmd-full",children:c.command||c.id}),o.jsxs("div",{className:"bg-item-foot",children:[o.jsx("span",{className:"bg-meta",children:c.kind==="delegation"?o.jsxs(o.Fragment,{children:[(c.taskCount??1)>1?`${c.taskCount} 个子代理 · `:"",c.status==="running"?`运行 ${Ru((c.uptimeSeconds??0)*1e3)}${c.phase==="stalling"?" · 停滞中":c.phase==="finalizing"?" · 收尾中":""}`:"已结束"]}):o.jsxs(o.Fragment,{children:[c.pid?`pid ${c.pid} · `:"",c.status==="running"?`运行 ${Ru((c.uptimeSeconds??0)*1e3)}`:`exit ${c.exitCode??"?"}`]})}),c.command?o.jsx(Lu,{text:c.command,what:c.kind==="delegation"?"这个目标":"这条命令"}):null]})]},c.id))})]})}function Cc({n:e}){const t=new Date(e.at),s=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`,n=e.items??[],[i,r]=_.useState(!1),a=_.useRef(null),[l,c]=_.useState(!1);return _.useLayoutEffect(()=>{if(!i){c(!1);return}const u=a.current;if(!u)return;const h=()=>c(u.scrollHeight-u.clientHeight>4);h();const d=new ResizeObserver(h);return d.observe(u),()=>d.disconnect()},[i,n.length]),o.jsxs("div",{className:"status-note","data-kind":e.kind||"lifecycle",role:"note",title:t.toLocaleString(),children:[o.jsx("span",{className:"status-note-time",children:s}),o.jsx("span",{className:"status-note-text",children:e.text}),n.length?o.jsxs(o.Fragment,{children:[o.jsx("button",{type:"button",className:"status-note-toggle","aria-expanded":i,"aria-label":`${i?"收起":"展开"}这 ${n.length} 条记忆`,onClick:()=>r(u=>!u),children:i?"收起":`${n.length} 条`}),i?o.jsx("div",{className:"status-note-drawer-wrap",children:o.jsxs("div",{className:"status-note-drawer","data-scroll":l?"1":"0",children:[o.jsxs("div",{className:"status-note-drawer-head",children:[o.jsxs("span",{children:["共 ",n.length," 条"]}),l?o.jsx("span",{className:"status-note-drawer-hint",children:"滚轮查看"}):null]}),o.jsxs("ol",{className:"status-note-items",ref:a,children:[n.map((u,h)=>o.jsxs("li",{className:"status-note-item",children:[o.jsx("span",{className:"status-note-item-n",children:h+1}),o.jsxs("span",{className:"status-note-item-body",children:[o.jsx("span",{className:"status-note-item-text",children:u.text}),u.tags?.length?o.jsx("span",{className:"status-note-item-tags",children:u.tags.join(" · ")}):null]})]},h)),e.truncated?o.jsx("li",{className:"status-note-item more",children:"…还有更多,已截断"}):null]})]})}):null]}):null]})}function _1({msgs:e,sid:t,backend:s,busy:n,base:i,notes:r=[]}){const a=g5(e),l=[];let c=0;for(;c<r.length&&r[c].afterKey===null;)l.push(o.jsx(Cc,{n:r[c]},r[c].key)),c++;for(const u of a){u.kind==="work"?(l.push(o.jsx(_5,{items:u.items},u.key)),l.push(o.jsx(dy,{msgs:u.items},`fc-${u.key}`))):u.m.kind==="note"?l.push(o.jsx(Cc,{n:{key:u.m.key,kind:u.m.category,text:u.m.text,at:u.m.at??Date.now(),hits:u.m.hits,items:u.m.items,truncated:u.m.truncated}},u.m.key)):(l.push(o.jsx(h5,{m:u.m,sid:t,backend:s,busy:n,last:u.tail,live:u.live,base:i},u.m.key)),u.m.kind==="tool"&&l.push(o.jsx(dy,{msgs:[u.m]},`fc-${u.m.key}`)));const h=new Set(u.kind==="msg"?[u.m.key]:u.items.map(d=>d.key));for(let d=r[c];d&&d.afterKey!==null&&h.has(d.afterKey);d=r[c])l.push(o.jsx(Cc,{n:d},d.key)),c++}for(;c<r.length;)l.push(o.jsx(Cc,{n:r[c]},r[c].key)),c++;return o.jsx(o.Fragment,{children:l})}function i5({v:e}){const t=_.useRef(null),s=_.useRef(!0),n=_.useRef(0),i=_.useRef(-1e9),r=_.useRef(0),a=_.useRef(0),l=_.useRef(0),[c,u]=_.useState(!0),[h,d]=_.useState(!1),p=64,f=()=>performance.now(),m=D=>D.scrollHeight-D.scrollTop-D.clientHeight<=p,y=1200,x=D=>{r.current=f()+150,a.current=D.scrollTop,l.current=D.scrollHeight},g=()=>{const D=t.current;D&&(D.scrollTop=D.scrollHeight,x(D))},v=()=>{s.current=!1,n.current=0,u(!1)};Va.current=()=>{s.current=!0,n.current=f()+1200,u(!0),d(!1),g()},_.useEffect(()=>{const D=t.current;if(!D)return;const O=()=>{i.current=f()},F=()=>{const E=D.scrollTop,z=E-a.current;a.current=E;const H=D.scrollHeight,ne=H<l.current-1;if(l.current=H,z<-2&&!ne&&f()-i.current<y){v();return}if(f()<r.current)return;const ae=m(D);ae!==s.current&&(s.current=ae,u(ae)),ae&&d(!1)},C=E=>{O(),E.deltaY<0&&v()};let N=0;const P=E=>{O(),N=E.touches[0]?.clientY??0},B=E=>{O(),(E.touches[0]?.clientY??0)>N+4&&v()},T=E=>{O(),(E.key==="PageUp"||E.key==="ArrowUp"||E.key==="Home")&&v()},$=()=>O();return D.addEventListener("scroll",F,{passive:!0}),D.addEventListener("wheel",C,{passive:!0}),D.addEventListener("touchstart",P,{passive:!0}),D.addEventListener("touchmove",B,{passive:!0}),D.addEventListener("keydown",T),D.addEventListener("pointerdown",$,{passive:!0}),x(D),()=>{D.removeEventListener("scroll",F),D.removeEventListener("wheel",C),D.removeEventListener("touchstart",P),D.removeEventListener("touchmove",B),D.removeEventListener("keydown",T),D.removeEventListener("pointerdown",$)}},[]),_.useEffect(()=>{if(s.current||f()<n.current){g();return}e.msgs.length&&d(!0)},[e.rev,e.busy,e.perms.length]),_.useEffect(()=>{const D=t.current,O=D?.firstElementChild??null;if(!D||!O||typeof ResizeObserver>"u")return;const F=new ResizeObserver(()=>{!s.current&&f()>=n.current||requestAnimationFrame(()=>{(s.current||f()<n.current)&&g()})});return F.observe(O),()=>F.disconnect()},[e.info.id]);const b=async D=>{const O=t.current,F=O?.scrollHeight??0,C=O?.scrollTop??0;D||(s.current=!1,u(!1)),A(!0),await X.loadEarlier(e.info.id),requestAnimationFrame(()=>{const N=t.current;N&&(N.scrollTop=N.scrollHeight-F+C,x(N))})},w=()=>{b(!1)},k=async D=>{const O=[...D.queue];try{const F=await X.createSession(String(D.info.backend),D.info.cwd,"");X.setActive(F);for(const C of O)X.enqueuePrompt(F,C.text,C.attachments);X.purgeCold(D.info.id)}catch{}},j=_.useRef(0),[I,A]=_.useState(!1);return _.useEffect(()=>{j.current=0,A(!1)},[e.info.id]),_.useEffect(()=>{const D=t.current;!D||!e.hasOlder||e.loadingOlder||j.current>=cy||D.scrollHeight>D.clientHeight+80||(j.current+=1,b(!0))},[e.rev,e.hasOlder,e.loadingOlder,e.info.id]),_.useEffect(()=>{const D=t.current;if(!D)return;const O=()=>{!e.hasOlder||e.loadingOlder||j.current>=cy||D.scrollTop>D.clientHeight*1.5||(j.current+=1,b(!0))};return D.addEventListener("scroll",O,{passive:!0}),()=>D.removeEventListener("scroll",O)},[e.info.id,e.hasOlder,e.loadingOlder]),o.jsxs("div",{className:"stream-wrap",children:[o.jsx("div",{className:"stream",ref:t,tabIndex:0,children:o.jsxs("div",{className:"stream-inner",children:[e.info.status==="starting"?o.jsxs("div",{className:"start-hold",role:"status",children:[o.jsx("span",{className:"stream-spin","aria-hidden":"true"}),o.jsx("span",{children:"正在启动 agent 进程…好了会自动把消息发出去"})]}):null,e.info.status==="error"&&e.info.lastError?o.jsxs("div",{className:"start-fail",role:"alert",children:[o.jsxs("div",{className:"start-fail-why",children:["会话启动失败:",e.info.lastError]}),o.jsxs("div",{className:"start-fail-act",children:[o.jsx("button",{className:"ghost-btn",onClick:()=>void k(e),children:"再试一次"}),o.jsx("button",{className:"ghost-btn",onClick:()=>X.purgeCold(e.info.id),children:"删除这个会话"})]})]}):null,e.hasOlder?o.jsx("div",{className:"load-earlier",children:e.loadingOlder?o.jsx("span",{className:"load-earlier-busy",children:"正在加载更早的消息…"}):o.jsx("button",{className:"ghost-btn",onClick:()=>w(),children:"↑ load earlier messages"})}):I&&e.msgs.length?o.jsx("div",{className:"load-earlier",children:o.jsx("span",{className:"load-earlier-end",children:"已到开头"})}):null,o.jsx(_1,{msgs:e.msgs,notes:e.notes,sid:e.info.id,backend:e.info.backend,busy:Rr(e),base:e.info.workspace||e.info.cwd}),o.jsx(s5,{busy:Rr(e),since:e.busySince}),e.perms.filter(D=>!e.msgs.some(O=>O.kind==="approval"&&O.requestId===D.requestId)).map(D=>o.jsx(b1,{sid:e.info.id,req:D},D.requestId))]})}),!c&&o.jsxs("button",{className:`jump-latest ${h?"has-new":""}`,onClick:()=>Va.current(),title:h?"new output — jump to the newest":"jump to the newest","aria-label":"jump to newest output",children:[o.jsx(Pw,{size:14}),h?o.jsx("span",{className:"jump-dot","aria-hidden":"true"}):null]})]})}const v1=_.memo(m5,(e,t)=>e.live===t.live&&e.m.key===t.m.key&&e.m.text===t.m.text&&e.m.at===t.m.at),r5=(e,t)=>{const s=e.m,n=t.m;return s.key===n.key&&s.title===n.title&&s.status===n.status&&s.detail===n.detail&&s.input===n.input&&s.at===n.at},y1=_.memo(p5,r5),o5=(e,t)=>{const s=e.m,n=t.m;return e.busy===t.busy&&s.key===n.key&&s.at===n.at&&s.terminal===n.terminal&&s.explanation===n.explanation&&JSON.stringify(s.items)===JSON.stringify(n.items)},a5=_.memo(f5,o5);function l5({text:e}){const t=jP(e),[s,n]=_.useState(!1);return t?o.jsxs("div",{className:`bg-notice ${s?"open":""}`,"data-ok":t.ok?"ok":"fail",children:[o.jsxs("button",{type:"button",className:"bg-notice-head","aria-expanded":s,onClick:()=>n(!s),children:[o.jsx("span",{className:"bg-notice-dot","aria-hidden":"true"}),o.jsx("span",{className:"bg-notice-title",children:t.kind==="watch"?"后台任务命中":"后台任务完成"}),o.jsx("code",{className:"bg-notice-cmd",title:t.command,children:ry(t.command)}),t.kind==="watch"?o.jsxs("code",{className:"bg-notice-code",title:t.pattern,children:["「",ry(t.pattern,28),"」"]}):t.exitCode===null?o.jsx("span",{className:"bg-notice-code",children:"已结束"}):o.jsxs("span",{className:"bg-notice-code",children:["exit ",t.exitCode]}),o.jsx("span",{className:"bg-notice-caret","aria-hidden":"true",children:s?"▾":"▸"})]}),s?o.jsxs("div",{className:"bg-notice-body",children:[o.jsx("div",{className:"bg-notice-label",children:"命令"}),o.jsx("pre",{className:"bg-notice-pre",children:t.command||"(未报告)"}),o.jsxs("div",{className:"bg-notice-label",children:[t.kind==="watch"?"命中行":"输出",t.output?"":"(空)"]}),t.output?o.jsx("pre",{className:"bg-notice-pre",children:t.output}):null]}):null]}):o.jsx(o.Fragment,{children:e})}function c5({d:e,base:t}){const[s,n]=_.useState(!1),i=e.tasks.filter(r=>!r.ok).length;return o.jsxs("div",{className:`bg-notice deleg-notice ${s?"open":""}`,"data-ok":i?"fail":"ok",children:[o.jsxs("button",{type:"button",className:"bg-notice-head","aria-expanded":s,onClick:()=>n(!s),children:[o.jsx("span",{className:"bg-notice-dot","aria-hidden":"true"}),o.jsx("span",{className:"bg-notice-title",children:"子代理回来了"}),o.jsx("code",{className:"bg-notice-cmd",title:e.tasks.map(r=>r.goal).join(`
|
|
127
127
|
`),children:MP(e)}),o.jsx("span",{className:"bg-notice-caret","aria-hidden":"true",children:s?"▾":"▸"})]}),s?o.jsxs("div",{className:"bg-notice-body",children:[e.dispatched?o.jsxs("div",{className:"bg-notice-label",children:["派发于 ",e.dispatched,e.role?` · ${e.role}`:"",e.total?` · 合计 ${e.total}`:""," · ",e.id]}):null,e.tasks.map(r=>o.jsxs("div",{className:"deleg-task","data-ok":r.ok?"ok":"fail",children:[o.jsxs("div",{className:"deleg-task-head",children:[o.jsx("span",{className:"deleg-mark","aria-hidden":"true",children:r.ok?"✓":"✗"}),o.jsx("span",{className:"deleg-goal",children:r.goal||`任务 ${r.index}`}),o.jsxs("span",{className:"deleg-meta",children:[r.status,r.meta?` · ${r.meta}`:""]})]}),r.body?o.jsx("div",{className:"deleg-body",children:o.jsx(aS,{text:r.body,base:t})}):null]},r.index))]}):null]})}function u5({text:e,base:t}){const s=DP(e);return s?o.jsx(c5,{d:s,base:t}):o.jsx(l5,{text:e})}function h5({m:e,sid:t,backend:s,last:n,busy:i,live:r,base:a}){switch(e.kind){case"user":return o.jsxs("div",{className:`msg user${e.from?" from-agent":""}`,children:[o.jsx("div",{className:"role",title:e.from?`会话 ${e.from.id}`:void 0,children:e.from?`来自「${e.from.title}」`:"YOU"}),o.jsxs("div",{className:"bubble",children:[e.files.length>0?o.jsx("div",{className:"bubble-files",children:e.files.map((l,c)=>o.jsxs("span",{className:"bubble-file",title:l.name,children:[l.kind==="image"?o.jsx(yE,{size:12}):o.jsx(Jn,{size:12}),l.name]},`${l.name}-${c}`))}):null,o.jsx(u5,{text:e.text,base:a}),o.jsxs("div",{className:"bubble-actions",children:[e.at?o.jsx("span",{className:"msg-at",title:Fr(e.at),children:Gf(e.at)}):null,o.jsx(Lu,{text:e.text,what:"这条消息"})]})]})]});case"agent":return o.jsxs("div",{className:"msg agent",children:[o.jsxs("div",{className:"role with-mark",children:[o.jsx(VP,{backend:s}),ah(s).label||"AGENT"]}),o.jsxs("div",{className:"bubble",children:[o.jsx(aS,{text:e.text,base:a}),o.jsxs("div",{className:"bubble-actions",children:[e.at?o.jsx("span",{className:"msg-at",title:Fr(e.at),children:Gf(e.at)}):null,o.jsx(Lu,{text:e.text,what:"这条回复"}),o.jsx(S5,{id:e.key,text:e.text,sid:t}),n&&!i?o.jsx(KP,{sid:t,busy:i}):null]}),o.jsx(k5,{mkey:e.key})]})]});case"thought":return e.text.trim()?o.jsx(v1,{m:e,live:!!r}):null;case"approval":return o.jsx(v5,{m:e,sid:t});case"project-skills":return o.jsx(y5,{m:e,sid:t});case"tool":return o.jsx(y1,{m:e});case"plan":return o.jsx(a5,{m:e,busy:i});case"meta":return o.jsx("div",{className:"msg meta",children:o.jsx("div",{className:"bubble",children:e.text})});default:return null}}function d5({v:e}){const[t,s]=_.useState(!1),n=_.useRef(null),i=e.plan;if(_.useLayoutEffect(()=>{t&&p1(n.current)},[t,i]),!i||!i.items.length)return null;const r=i.items.length,a=i.items.filter(h=>h.status==="completed").length,l=a===r,c=i.terminal==="interrupted"?"已打断":i.terminal==="failed"?"运行出错":i.terminal==="ended"?"回合结束":l?"已完成":e.busy?"进行中":"待命中",u=i.terminal?"terminal":l?"done":e.busy?"running":"";return o.jsxs("div",{className:`plan-bar ${l&&!i.terminal?"completed":""}`,children:[o.jsxs("button",{type:"button",className:"plan-head",onClick:()=>s(h=>!h),"aria-expanded":t,title:"任务计划 · 点击展开/折叠",children:[o.jsx("span",{className:"plan-title",children:"任务计划"}),o.jsx("span",{className:"plan-dots","aria-hidden":"true",children:i.items.map((h,d)=>o.jsx("span",{className:`dot ${h.status}`},d))}),o.jsxs("span",{className:"plan-count",children:[a,"/",r]}),o.jsx("span",{className:`plan-state ${u}`,children:c}),o.jsx(en,{size:11,className:`tool-chev ${t?"open":""}`})]}),t?o.jsxs("ol",{className:"plan-body",ref:n,children:[i.title?o.jsx("li",{className:"plan-name","aria-label":"计划名",children:i.title}):null,i.items.map((h,d)=>o.jsxs("li",{className:`plan-step ${h.status}`,children:[o.jsx("span",{className:"step-icon","aria-hidden":"true",children:h.status==="completed"?"✓":h.status==="in_progress"?"◉":h.status==="cancelled"?"✕":"○"}),o.jsx("span",{className:"step-title",children:h.content})]},d))]}):null,t&&i.explanation?o.jsx("p",{className:"plan-explanation",children:i.explanation}):null]})}function f5({m:e,busy:t}){const[s,n]=_.useState(!1),i=_.useRef(null);_.useLayoutEffect(()=>{s&&p1(i.current)},[s,e]);const r=e.items.length;if(!r)return null;const a=e.items.filter(h=>h.status==="completed").length,l=a===r,c=e.terminal==="interrupted"?"已打断":e.terminal==="failed"?"运行出错":e.terminal==="ended"?"回合结束":l?"已完成":t?"进行中":"",u=e.terminal?"terminal":l?"done":t?"running":"";return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`plan-card ${l&&!e.terminal?"completed":""}`,children:[o.jsxs("button",{type:"button",className:"plan-head",onClick:()=>n(h=>!h),"aria-expanded":s,title:"任务计划 · click to collapse/expand",children:[o.jsx("span",{className:"plan-title",children:"任务计划"}),o.jsx("span",{className:"plan-dots","aria-hidden":"true",children:e.items.map((h,d)=>o.jsx("span",{className:`dot ${h.status}`},d))}),o.jsxs("span",{className:"plan-count",children:[a,"/",r]}),c?o.jsx("span",{className:`plan-state ${u}`,children:c}):null,o.jsx(en,{size:11,className:`tool-chev ${s?"open":""}`})]}),s?o.jsxs("ol",{className:"plan-body",ref:i,children:[e.title?o.jsx("li",{className:"plan-name","aria-label":"计划名",children:e.title}):null,e.items.map((h,d)=>o.jsxs("li",{className:`plan-step ${h.status}`,children:[o.jsx("span",{className:"step-icon","aria-hidden":"true",children:h.status==="completed"?"✓":h.status==="in_progress"?"◉":h.status==="cancelled"?"✕":"○"}),o.jsx("span",{className:"step-title",children:h.content})]},d))]}):null,s&&e.explanation?o.jsx("p",{className:"plan-explanation",children:e.explanation}):null]})})}function p5({m:e}){const[t,s]=_.useState(!1),n=!!(e.input||e.detail),i=Op(e.status);return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`tool-card ${e.status}`,children:[o.jsxs("button",{type:"button",className:"tool-head",onClick:()=>n&&s(r=>!r),title:n?`${e.title}
|
|
128
128
|
click for the full call and its result`:e.title,"aria-expanded":n?t:void 0,children:[o.jsx("span",{className:`tool-dot ${i}`,"aria-hidden":"true"}),o.jsx("span",{className:"tool-title",children:e.title}),e.at?o.jsx("span",{className:"msg-at",title:Fr(e.at),children:mi(e.at)}):null,n?o.jsx(en,{size:11,className:`tool-chev ${t?"open":""}`}):null]}),t&&o.jsxs("div",{className:"tool-body",children:[o.jsx("div",{className:"lbl",children:"tool"}),o.jsx("pre",{className:"tool-meta",children:e.title}),o.jsx("div",{className:"lbl",children:"kind · status"}),o.jsxs("pre",{className:"tool-meta",children:[e.kind2?`${e.kind2} · `:"",e.status]}),e.input?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"lbl",children:"input"}),o.jsx("pre",{children:e.input})]}):null,e.detail?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"lbl",children:"output"}),o.jsx("pre",{children:e.detail})]}):null]})]})})}function Op(e){const t=String(e||"").toLowerCase();return t==="completed"||t==="success"?"ok":t==="failed"||t==="error"||t==="cancelled"?"err":t==="in_progress"||t==="running"||t==="pending"?"running":"idle"}function m5({m:e,live:t}){const[s,n]=_.useState(null),i=s??t,r=_.useRef(null),[a,l]=_.useState(!0),c=24;_.useEffect(()=>{const h=r.current;if(!h||!t)return;let d=h.scrollTop;const p=()=>h.scrollHeight-h.scrollTop-h.clientHeight<=c,f=()=>{const b=h.scrollTop,w=b-d;if(d=b,w<-2){l(!1);return}l(p())},m=b=>{b.deltaY<0&&l(!1)};let y=0;const x=b=>{y=b.touches[0]?.clientY??0},g=b=>{(b.touches[0]?.clientY??0)>y+4&&l(!1)},v=b=>{(b.key==="PageUp"||b.key==="ArrowUp"||b.key==="Home")&&l(!1)};return h.addEventListener("scroll",f,{passive:!0}),h.addEventListener("wheel",m,{passive:!0}),h.addEventListener("touchstart",x,{passive:!0}),h.addEventListener("touchmove",g,{passive:!0}),h.addEventListener("keydown",v),()=>{h.removeEventListener("scroll",f),h.removeEventListener("wheel",m),h.removeEventListener("touchstart",x),h.removeEventListener("touchmove",g),h.removeEventListener("keydown",v)}},[t,i]),_.useEffect(()=>{if(!t||!a)return;const h=r.current;h&&(h.scrollTop=h.scrollHeight)},[e.text,t,a]);const u=()=>{l(!0);const h=r.current;h&&(h.scrollTop=h.scrollHeight)};return o.jsxs("div",{className:`msg thought${t?" live":""}`,children:[o.jsxs("button",{type:"button",className:"role thought-head","aria-expanded":i,"aria-label":`${i?"fold":"open"} the agent's thinking`,onClick:()=>n(!i),children:[o.jsx(en,{size:11,className:`thought-chev${i?" open":""}`}),"💭 ",t?"思考中…":"思考",o.jsxs("span",{className:"thought-meta",children:[e.at?`${Gf(e.at)} · `:"",e.text.length," 字"]})]}),i&&o.jsxs("div",{className:`bubble${t?" live":""}`,ref:r,children:[e.text,t?null:o.jsx("div",{className:"bubble-actions",children:o.jsx(Lu,{text:e.text,what:"这段思考"})})]}),t&&i&&!a&&o.jsxs("button",{type:"button",className:"thought-stick",onClick:u,title:"follow the newest thinking again","aria-label":"follow the newest thinking again",children:[o.jsx(Pw,{size:11})," 回到最新"]})]})}const Ad=e=>e.kind==="thought"||e.kind==="tool";function g5(e){const t=[];let s=0;for(;s<e.length;){const c=e[s];if(!Ad(c)){t.push({kind:"msg",m:c}),s++;continue}let u=s;for(;u<e.length&&Ad(e[u]);)u++;t.push({kind:"work",items:e.slice(s,u).filter(Ad),current:!1}),s=u}const n=t.map(c=>c.kind).lastIndexOf("work");let i=-1;if(t.forEach((c,u)=>{c.kind==="msg"&&c.m.kind==="user"&&(i=u)}),n>i){const c=t[n];c.kind==="work"&&(c.current=!0)}const r=[],a=c=>({kind:"msg",m:c,live:!1,tail:!1});for(const c of t){if(c.kind==="msg"){r.push(a(c.m));continue}const u=c.current?c.items.slice(-5):[],h=c.items.slice(0,c.items.length-u.length);h.length>=(c.current?1:2)?r.push({kind:"work",key:`work-${r.length}`,items:h,tail:!1}):h.forEach(d=>r.push(a(d))),u.forEach(d=>r.push(a(d)))}const l=[...r].reverse().find(c=>c.kind==="msg");l&&l.kind==="msg"&&(l.tail=!0);for(const c of r)c.kind==="msg"&&(c.m.kind==="agent"||c.m.kind==="thought")&&(c.live=!!c.m.open);return r}function _5({items:e}){const[t,s]=_.useState(!1),n=e.filter(m=>m.kind==="tool"),i=e.filter(m=>m.kind==="thought"),r=n.filter(m=>Op(m.status)==="err").length,a=n.some(m=>Op(m.status)==="running"),l=i.reduce((m,y)=>m+y.text.length,0),c=[...new Set(n.map(m=>m.title.replace(/\s+/g," ").trim()))],u=c.slice(0,2).map(m=>m.length>34?`${m.slice(0,33)}…`:m).join(" · "),h=n.length&&i.length?`${n.length} 次工具调用 · ${i.length} 段思考`:n.length?`${n.length} 次工具调用`:`${i.length} 段思考`,d=e.map(m=>m.at).filter(m=>typeof m=="number"),p=d.length?Math.min(...d):null,f=d.length?Math.max(...d):null;return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:"work-run",children:[o.jsxs("button",{type:"button",className:"work-run-head","aria-expanded":t,title:[`折叠了 ${n.length} 次工具调用、${i.length} 段思考(${l} 字)`,"点开看它们",...n.map(m=>`· ${m.title}`)].join(`
|
|
129
|
-
`),onClick:()=>s(m=>!m),children:[o.jsx(en,{size:11,className:`work-chev${t?" open":""}`}),o.jsx("span",{className:"work-run-icon","aria-hidden":"true",children:n.length?"⚙":"💭"}),o.jsx("span",{className:"work-run-count",children:h}),c.length?o.jsx("span",{className:"work-run-names",children:c.length>2?`${u} +${c.length-2}`:u}):o.jsxs("span",{className:"work-run-chars",children:[l," 字"]}),o.jsx("span",{className:`work-run-state ${r?"err":a?"run":"ok"}`,"aria-hidden":"true",children:r?`✗ ${r}`:a?"•••":"✓"}),p?o.jsxs("span",{className:"msg-at",title:`${Fr(p)}${f&&f!==p?` → ${Fr(f)}`:""}`,children:[mi(p),f&&f-p>=6e4?`–${mi(f)}`:""]}):null]}),t&&o.jsx("div",{className:"work-run-items",children:e.map(m=>m.kind==="thought"?o.jsx(v1,{m,live:!1},m.key):o.jsx(y1,{m},m.key))})]})})}function b1({sid:e,req:t}){return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:"perm-card",children:[o.jsxs("div",{className:"q",children:["🔑 agent 要执行:",o.jsx("b",{children:t.toolCallTitle}),"(",t.kind,")"]}),o.jsx(fg,{req:t}),o.jsx("div",{className:"opts",children:o.jsx(w1,{sid:e,req:t})})]})})}function v5({m:e,sid:t}){const s=_.useSyncExternalStore(X.subscribe,X.getSnapshot),n=s.active?.info.id===t&&!!s.active?.perms.some(r=>r.requestId===e.requestId),i={requestId:e.requestId,sessionId:t,toolCallTitle:e.title,kind:e.kind2,options:e.options,createdAt:e.at??Date.now(),path:e.path,diff:e.diff};return e.decision?o.jsx(uy,{m:e}):n||!s.active?o.jsx(b1,{sid:t,req:i}):o.jsx(uy,{m:e,lapsed:!0})}function uy({m:e,lapsed:t}){const s=e.decision&&e.decision.outcome==="selected"?e.decision.optionId:null,n=e.options.find(a=>a.optionId===s),i=t?"已作废(服务端不再等这个请求了)":e.decision?.outcome==="selected"?`已答:${n?.name??"已选"}`:"已取消",r=t||e.decision?.outcome!=="selected"?"no":"yes";return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`perm-card done ${r}`,children:[o.jsxs("div",{className:"q",children:["🔑 agent 曾要执行:",o.jsx("b",{children:e.title}),"(",e.kind2,")"]}),o.jsx(fg,{req:{requestId:e.requestId,sessionId:"",toolCallTitle:e.title,kind:e.kind2,options:e.options,createdAt:e.at??0,path:e.path,diff:e.diff}}),o.jsx("div",{className:"perm-decision",children:i})]})})}function y5({m:e,sid:t}){const s=e.state==="trusted"||e.state==="ignore",n=i=>{X.send({t:"set-config",sessionId:t,configId:"project_skills",value:i})};return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`perm-card skills ${s?"done":""} ${e.state==="trusted"?"yes":e.state==="ignore"?"no":""}`,children:[o.jsxs("div",{className:"q",children:["📦 ",e.text]}),e.root?o.jsxs("div",{className:"perm-file",title:e.root,children:[o.jsx(Jn,{size:12}),o.jsx("code",{children:e.root})]}):null,s?o.jsx("div",{className:"perm-decision",children:e.state==="trusted"?"已信任:这个仓库的 skill 会随会话加载":"已忽略:不再问,也不加载"}):o.jsxs("div",{className:"opts",children:[o.jsxs("button",{className:"opt primary",onClick:()=>n("trusted"),children:["信任这个仓库(",e.count," 个 skill)"]}),o.jsx("button",{className:"opt",onClick:()=>n("ignore"),children:"这个仓库不用问"})]})]})})}function fg({req:e}){if(e.diff)return o.jsx(b5,{diff:e.diff});const t=e.path??null;return t?o.jsxs("div",{className:"perm-file",title:t,children:[o.jsx(Jn,{size:12}),o.jsx("code",{children:t})]}):null}function w1({sid:e,req:t,onAnswered:s}){const n=(a,l,c)=>{const u=X.permAnswer(t.requestId);if(u&&!u.lapsed)return;const h=X.send({t:"respond-permission",sessionId:e,requestId:t.requestId,decision:a,...c?{optionKind:c.kind,signature:`${t.kind}:${t.toolCallTitle}`}:{}});X.markPermAnswered(t.requestId,l,h),s?.(l)},i=X.permAnswer(t.requestId),[,r]=_.useState(0);return _.useEffect(()=>{if(!i||i.lapsed)return;const a=window.setInterval(()=>r(l=>l+1),1e3);return()=>window.clearInterval(a)},[i?.lapsed,t.requestId]),i&&!i.lapsed?o.jsxs("div",{className:"perm-answered",role:"status","aria-live":"polite",children:[o.jsx("span",{className:"perm-answered-tick","aria-hidden":"true",children:"✓"}),o.jsxs("span",{children:["已提交「",i.label,"」—— 正在等 agent 那边回应"]})]}):o.jsxs(o.Fragment,{children:[i?.lapsed&&o.jsxs("div",{className:"perm-unconfirmed",role:"status","aria-live":"polite",children:["还没收到 agent 那边的确认(等了 ",Math.max(1,Math.round((Date.now()-i.at)/1e3))," 秒) —— 可能是这一次答复没送出去,可以再点一次。"]}),t.options.map(a=>o.jsx("button",{className:a.kind.startsWith("allow")?"allow":"reject",onClick:()=>n({outcome:"selected",optionId:a.optionId},a.name,a),children:a.name},a.optionId)),o.jsx("button",{title:"不选任何一项:agent 会收到 cancelled,这一轮就停在这里",onClick:()=>n({outcome:"cancelled"},"取消这次请求"),children:"取消这次请求"})]})}function x1({lines:e}){return o.jsx("div",{className:"perm-diff",role:"region","aria-label":"变更内容",children:e.map((t,s)=>t.kind==="gap"?o.jsx("div",{className:"perm-diff-gap",children:t.text},s):o.jsxs("div",{className:`perm-diff-line ${t.kind}`,children:[o.jsx("span",{className:"no",children:t.oldNo??""}),o.jsx("span",{className:"no",children:t.newNo??""}),o.jsx("span",{className:"sig",children:t.kind==="add"?"+":t.kind==="del"?"−":" "}),o.jsx("span",{className:"txt",children:t.text||" "})]},s))})}function b5({diff:e}){const[t,s]=_.useState(!1),n=e.oldText??"",i=e.newText??"",r=i.length>0&&n.length===0,a=Om(n,i),l=a.filter(u=>u.kind==="add").length,c=a.filter(u=>u.kind==="del").length;return o.jsxs("div",{className:"perm-changes",children:[o.jsxs("button",{type:"button",className:"perm-change-row","aria-expanded":t,"aria-label":`${t?"收起":"查看"} ${e.path??"这份文件"} 的变更`,onClick:()=>s(u=>!u),children:[o.jsx(Jn,{size:13}),o.jsx("code",{title:e.path??"",children:e.path??"(未命名文件)"}),o.jsx("span",{className:"perm-counts",children:r?o.jsxs("span",{className:"add",children:["新文件 · ",l," 行"]}):o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"add",children:["+",l]}),o.jsxs("span",{className:"del",children:["−",c]})]})}),o.jsx("span",{className:"perm-caret","aria-hidden":"true",children:t?"▾":"▸"})]}),t?o.jsx(x1,{lines:a}):null,e.truncated?o.jsx("div",{className:"perm-cut",children:"agent 发来的是整份文件,这里只保留了改动附近的部分"}):null]})}function hy({f:e}){const[t,s]=_.useState(!1),n=e.oldText.length===0&&e.newText.length>0,i=n||e.oldText.length>0||e.newText.length>0,r=_.useMemo(()=>i?Om(e.oldText,e.newText):[],[i,e.oldText,e.newText]),a=e.path===e.name?"":e.path.slice(0,e.path.length-e.name.length).replace(/[\\/]+$/,"");return o.jsxs("div",{className:"fc-row",children:[o.jsxs("div",{className:"fc-line",children:[o.jsx("span",{className:"fc-dot","aria-hidden":"true"}),o.jsxs("button",{type:"button",className:"fc-name",title:`在右侧面板打开 ${e.path}`,onClick:()=>sx({path:e.path}),children:[e.name,a?o.jsx("span",{className:"fc-dir",children:a}):null,e.edits>1?o.jsxs("span",{className:"fc-edits",children:["改了 ",e.edits," 次"]}):null]}),o.jsx("button",{type:"button",className:"fc-counts","aria-expanded":t,"aria-label":`${t?"收起":"查看"} ${e.path} 的变更`,disabled:!i,onClick:()=>s(l=>!l),children:n?o.jsxs("span",{className:"add",children:["新文件 · ",e.insertions," 行"]}):o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"add",children:["+",e.insertions]}),o.jsxs("span",{className:"del",children:["−",e.deletions]})]})})]}),t&&i?o.jsx(x1,{lines:r}):null]})}function dy({msgs:e}){const t=_.useMemo(()=>{const a=[];for(const l of e)l.kind==="tool"&&l.changes?.length&&a.push(...l.changes);return PE(a)},[e]),[s,n]=_.useState(!0);if(!t.length)return null;if(t.length===1)return o.jsx("div",{className:"file-changes one",children:o.jsx(hy,{f:t[0]})});const i=t.reduce((a,l)=>a+l.insertions,0),r=t.reduce((a,l)=>a+l.deletions,0);return o.jsxs("div",{className:"file-changes",children:[o.jsxs("button",{type:"button",className:"fc-head","aria-expanded":s,"aria-label":`${s?"收起":"展开"} ${t.length} 个文件变更`,onClick:()=>n(a=>!a),children:[o.jsx(Jn,{size:13}),o.jsxs("span",{className:"fc-title",children:[t.length," 个文件变更"]}),o.jsxs("span",{className:"fc-counts static",children:[o.jsxs("span",{className:"add",children:["+",i]}),o.jsxs("span",{className:"del",children:["−",r]})]}),o.jsx("span",{className:"perm-caret","aria-hidden":"true",children:s?"▾":"▸"})]}),s?t.map(a=>o.jsx(hy,{f:a},a.path)):null]})}function w5({req:e,sessionTitle:t,waiting:s,onSkip:n}){Wo(!0,n);const[i,r]=_.useState(()=>Date.now());_.useEffect(()=>{const u=window.setInterval(()=>r(Date.now()),1e3);return()=>window.clearInterval(u)},[e.requestId]);const a=Math.max(0,Math.round((i-e.createdAt)/1e3)),l=X.permAnswer(e.requestId),c=Math.max(0,s-1);return o.jsx("div",{className:"modal-bg perm-bg",onClick:n,children:o.jsxs("div",{className:"modal perm-dialog",role:"dialog","aria-modal":"true","aria-label":"agent 请求授权","data-request-id":e.requestId,"data-session-id":e.sessionId,"data-waiting":s,onClick:u=>u.stopPropagation(),children:[o.jsx("h3",{children:"Agent 请求授权"}),o.jsxs("div",{className:"perm-ask",children:["「",t,"」里的 agent 停在这里等你答复 —— 它要执行 ",o.jsx("b",{children:e.toolCallTitle}),"(",e.kind,")。"]}),o.jsx(fg,{req:e}),o.jsx("div",{className:"opts perm-opts",children:o.jsx(w1,{sid:e.sessionId,req:e})}),c>0&&o.jsxs("div",{className:"perm-queue",role:"note",children:["这个会话还有 ",o.jsx("b",{children:c})," 个请求等着答复 —— 答完这个,下一个会接着显示在这里。"]}),o.jsxs("div",{className:"perm-note",children:["已等待 ",a," 秒。一直不答复的话,agent 那边会自己放弃这次请求(等同拒绝),这一轮就停在这里。"]}),!l&&o.jsx("div",{className:"row",children:o.jsx("button",{className:"cancel",onClick:n,children:"稍后处理"})})]})})}function Dd(e){if(e<=0)return"";if(e%60===0){const t=e/60;return t<60?`${t} 分钟`:`${Math.round(t/60)} 小时`}return`${e} 秒`}function x5(){const[e,t]=_.useState(null);_.useEffect(()=>{let n=!0;return fetch("/api/settings",{credentials:"same-origin"}).then(i=>i.ok?i.json():null).then(i=>{n&&t(Number(i?.observer?.intervalSec??0))}).catch(()=>{n&&t(0)}),()=>{n=!1}},[]);const s=_.useCallback(n=>{t(n),fetch("/api/settings",{method:"POST",credentials:"same-origin",headers:{"content-type":"application/json"},body:JSON.stringify({observer:{intervalSec:n}})}).catch(()=>{})},[]);return[e??0,s]}function S5({id:e,text:t,sid:s}){const[n]=lr(),i=Bm(),[r,a]=_.useState(!1),[l,c]=_.useState(!1),[u,h]=_.useState(null),d=_.useRef(null);Br(r,[d],()=>a(!1));const p=_.useRef({timer:null,fired:!1}),f=()=>{p.current.timer&&(window.clearTimeout(p.current.timer),p.current.timer=null)};_.useEffect(()=>f,[]);const m=()=>{p.current.fired=!1,f(),p.current.timer=window.setTimeout(()=>{p.current.fired=!0,a(!0)},500)};if(!t.trim())return null;const y=i.speaking&&i.speakingId===e;if(typeof window<"u"&&!("speechSynthesis"in window)&&!n.serverTts)return o.jsx("span",{className:"bubble-note",title:"this browser has no speech synthesis",children:"no voices"});const x=async g=>{if(l)return;const v=PP(m1(e,g));if(v){a(!1),Mt.speak(v.text,`${e}#summary:${g??"cfg"}`,n);return}c(!0),h(null);try{const b=await FP(s,e,g);a(!1),Mt.speak(b.text,`${e}#summary:${g??"cfg"}`,n)}catch(b){const w=b;h({msg:w?.message??String(b),hint:w?.hint}),a(!1)}finally{c(!1)}};return o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"speak-wrap bubble-speak",ref:d,children:[o.jsx("button",{className:`bubble-btn speak ${y?"on":""} ${l?"working":""}`,title:l?"正在生成语音播报总结…":y?"stop reading(长按:语音播报总结)":"read this reply aloud(长按:语音播报总结)","aria-label":y?"stop reading":"read aloud","aria-haspopup":"menu","aria-expanded":r,onClick:()=>{if(p.current.fired){p.current.fired=!1;return}y?Mt.stop():Mt.speak(t,e,n)},onPointerDown:m,onPointerUp:f,onPointerLeave:f,onPointerCancel:f,onContextMenu:g=>{g.preventDefault(),f(),a(!0)},onKeyDown:g=>{(g.key==="F10"&&g.shiftKey||g.key==="ContextMenu")&&(g.preventDefault(),a(!0))},children:l?o.jsx(Po,{size:13,className:"spin"}):y?o.jsx(Lw,{size:13}):o.jsx(th,{size:13})}),r?o.jsxs("div",{className:"speak-menu bubble-menu",role:"menu",children:[o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item","data-speak-summary":"verbatim",onClick:()=>{a(!1),Mt.speak(t,e,n)},children:[o.jsx("span",{className:"speak-check",children:"›"}),o.jsx("span",{className:"speak-name",children:"读整条"})]}),[100,150,200].map(g=>o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item",disabled:l,"data-speak-summary":String(g),onClick:()=>void x(g),children:[o.jsx("span",{className:"speak-check",children:l?"•":"›"}),o.jsx("span",{className:"speak-name",children:l?"总结中…":`语音播报总结 · 约 ${g} 字`})]},g)),o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item",disabled:l,"data-speak-summary":"cfg",onClick:()=>void x(),children:[o.jsx("span",{className:"speak-check",children:"›"}),o.jsx("span",{className:"speak-name",children:l?"总结中…":"语音播报总结 · 按设置"})]}),o.jsx("p",{className:"speak-hint",children:"把这条压成一段能听完的话;字数写进提示词交给模型(提示词在 设置 → 语音总结)"})]}):null]}),u?o.jsxs("span",{className:"bubble-note err",role:"status",children:[u.msg,u.hint?` · ${u.hint}`:""]}):null]})}function k5({mkey:e}){const t=_.useSyncExternalStore(IP,ay,ay),[s,n]=_.useState(!1),i=OP(e);if(!i)return null;const r=i.route==="session"?`${i.provider??""}${i.provider?" · ":""}${i.model??""}`:i.model?`语音端点 · ${i.model}`:"",a=i.maxChars?` · 按 ${i.maxChars} 字压`:"",l=i.via==="verbatim"?"原文本身就够短,直接念":`${i.chars} 字${a} · ${(i.ms/1e3).toFixed(1)}s${r?` · ${r}`:""}`;return o.jsxs("div",{className:`bubble-note speech-note${s?" open":""}`,"data-summary-chars":i.chars,children:[o.jsx("button",{type:"button",className:"speech-note-tag","aria-expanded":s,onClick:()=>n(c=>!c),children:"播报稿"}),o.jsx("span",{className:"speech-note-text",onClick:()=>n(c=>!c),title:"点击展开/收起",children:i.text}),o.jsx("span",{className:"speech-note-meta",title:i.routeNote??void 0,children:l}),o.jsx("button",{type:"button",className:"speech-note-x",title:"丢掉这份稿子(下次长按会重新生成)","aria-label":"drop this summary",onClick:()=>BP(e),children:o.jsx(wn,{size:11})}),o.jsx("span",{hidden:!0,children:t})]})}const pg=["image/png","image/jpeg","image/webp","image/gif"],C5=4*1024*1024,E5=256*1024;function mg(){const e=_.useRef(!1);return{handlers:{onCompositionStart:()=>{e.current=!0},onCompositionEnd:()=>{e.current=!1}},isComposing:t=>e.current||t.nativeEvent.isComposing===!0}}function S1(e){return pg.includes(e.type)?e.size>C5?Promise.resolve({error:`${e.name}: image larger than 4MB`}):new Promise(s=>{const n=new FileReader;n.onload=()=>{const i=String(n.result??"");s({id:`${e.name}-${e.size}-${Math.random().toString(36).slice(2,7)}`,name:e.name,kind:"image",mimeType:e.type,preview:i,payload:i.slice(i.indexOf(",")+1),bytes:e.size})},n.onerror=()=>s({error:`${e.name}: could not be read`}),n.readAsDataURL(e)}):e.size>E5?Promise.resolve({error:`${e.name}: larger than 256kB — attach it as a path instead`}):new Promise(s=>{const n=new FileReader;n.onload=()=>s({id:`${e.name}-${e.size}-${Math.random().toString(36).slice(2,7)}`,name:e.name,kind:"text",mimeType:e.type||"text/plain",payload:String(n.result??""),bytes:e.size}),n.onerror=()=>s({error:`${e.name}: could not be read`}),n.readAsText(e)})}function k1(e){if(!e)return[];const t=Array.from(e.files??[]);for(const s of Array.from(e.items??[])){if(s.kind!=="file")continue;const n=s.getAsFile();n&&!t.some(i=>i.name===n.name&&i.size===n.size&&i.type===n.type)&&t.push(n)}return t}function C1(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(0)} kB`:`${(e/1048576).toFixed(1)} MB`}const ir=["#7f8c98","#5fb3a1","#7fb069","#d9a441","#e8843c","#f0603f","#ff4d4d"];function E1(e,t){const s=Math.max(1,t.length),n=t.findIndex(a=>String(a.value)===String(e)),i=n<0?0:n+1;return{color:n<0?"var(--text-dim)":ir[Math.min(n,ir.length-1)],level:i,total:s}}function N1({level:e,total:t,color:s}){const n=Math.min(7,t),i=Math.max(0,Math.min(n,Math.round(e/t*n)));return o.jsx("span",{className:"tb-pips","aria-hidden":"true",children:Array.from({length:n}).map((r,a)=>o.jsx("i",{style:{background:a<i?s:"var(--line)"}},a))})}function Cl(e,t){const s=t==="effort"?["thought_level","reasoning"]:["model","model_config"],n=t==="effort"?/reason|effort|think|depth/i:/model/i;return e.find(i=>i.type==="select"&&i.category&&s.includes(String(i.category)))??e.find(i=>i.type==="select"&&n.test(i.id))}function R1({label:e,title:t,icon:s,value:n,children:i,open:r,onToggle:a,testId:l}){const c=_.useRef(null);return Br(r,[c],a),o.jsxs("div",{className:"tb-wrap",ref:c,children:[o.jsxs("button",{type:"button",className:`tb-btn ${r?"on":""}`,title:t,"aria-label":t,"aria-expanded":r,"data-testid":l,onClick:a,children:[s,o.jsx("span",{className:"tb-label",children:n||e}),o.jsx(Io,{size:11,className:"tb-chev"})]}),r?i:null]})}function Bu({items:e,current:t,onPick:s,empty:n}){const i=Nw();return e.length?o.jsx("div",{className:"tb-list",role:"listbox",ref:i,children:e.map(r=>o.jsxs("button",{role:"option","aria-selected":r.value===t,className:`tb-opt ${r.value===t?"sel":""}`,title:r.hint?`${r.name} — ${r.hint}`:r.name,onClick:()=>s(r.value),children:[o.jsxs("span",{className:"tb-opt-name",children:[r.color?o.jsx("i",{className:"tb-dot",style:{background:r.color}}):null,r.name]}),r.hint?o.jsx("span",{className:"tb-opt-hint",children:r.hint}):null]},r.value))}):o.jsx("div",{className:"tb-list",ref:i,children:o.jsx("div",{className:"tb-empty",children:n})})}function j1(e){return e.category==="_context_window"?!0:/budget|context/i.test(`${e.id} ${e.name??""}`)}function N5({v:e}){const t=e.info.usage,s=e.info.configOptions.find(j1),[n,i]=_.useState(!1),r=_.useRef(null),[a,l]=_.useState(!1),[c,u]=_.useState(""),[h,d]=_.useState(!0),[p,f]=_.useState(""),[m,y]=_.useState(""),x=mg(),g=e.trace;if(Br(n,[r],()=>{i(!1),l(!1)}),!t||!t.used&&!t.size)return null;const v=e.info.contextLimit&&e.info.contextLimit>0?e.info.contextLimit:null,b=e.info.modelContextLimit&&e.info.modelContextLimit>0?e.info.modelContextLimit:null,w=v?"session":b?"model":"agent",k=v??b??t.size,j=k>0?Math.min(100,Math.round(t.used/k*100)):0,I=j>=85?"hot":j>=65?"warn":"ok",A=k>0?Math.max(0,k-t.used):0,D=e.info.commands??[],O=T=>D.some($=>$.name===T),F=w==="session"?"你为本会话声明":w==="model"?"你为这个模型记下的":"agent 上报(usage_update)",C=async(T,$={})=>{f($.forgetModel?"forget":"save"),y("");try{await X.setContextLimit(e.info.id,T,$),l(!1)}catch(E){y(String(E?.message??E))}finally{f("")}},N=T=>{if(e.info.cold){i(!1),X.resume(e.info.id);return}X.send({t:"prompt",sessionId:e.info.id,text:`/${T}`}),i(!1)},P=(T,$)=>{const E=$.trim();E&&(X.send({t:"set-config",sessionId:e.info.id,configId:T,value:E}),u(""))},B=String(s?.currentValue??"");return o.jsxs("div",{className:`usage-row ${I}`,ref:r,children:[o.jsxs("button",{className:"usage-text",onClick:()=>i(T=>!T),title:"上下文窗口 — 点这里改",children:[o.jsx(E_,{size:12,className:"usage-icon"}),k>0?`${xa(t.used)} / ${xa(k)}`:`${xa(t.used)} / —`,k>0?` · ${j}%`:"",w==="session"?" · 声明":w==="model"?" · 模型记录":""]}),k>0?o.jsx("div",{className:"usage-bar",title:`${t.used} / ${k} tokens (${j}%)`,children:o.jsx("i",{style:{width:`${j}%`}})}):null,I==="hot"&&O("compress")&&!e.busy?o.jsxs("button",{className:"usage-act",onClick:()=>N("compress"),title:"发送 /compress:让 agent 压缩上下文(这是它自己公告的命令)",children:[o.jsx(Im,{size:11})," 压缩上下文"]}):null,n?o.jsxs("div",{className:"usage-detail",children:[o.jsxs("div",{className:"usage-set",children:[o.jsxs("div",{className:"usage-set-head",children:[o.jsx(E_,{size:12})," 上下文窗口",o.jsx("span",{className:"usage-set-scope",children:s?String(s.meta?.scope??"")==="model"?"按模型":"":"仅声明"})]}),s?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"usage-set-chips",children:(s.options??[]).map(T=>o.jsx("button",{className:`usage-chip ${B===String(T.value)?"sel":""}`,onClick:()=>P(s.id,String(T.value)),children:String(T.value)==="auto"?"自动":T.name},String(T.value)))}),o.jsxs("div",{className:"usage-edit",children:[o.jsx("input",{value:c,inputMode:"numeric","aria-label":"context window in tokens",placeholder:s.meta?.freeform===!0?"任意 token 数,如 300000":"填一个数",onChange:T=>u(T.target.value),onKeyDown:T=>{x.isComposing(T)||(T.key==="Enter"&&P(s.id,c),T.key==="Escape"&&(T.stopPropagation(),i(!1)))}}),o.jsx("button",{className:"usage-edit-btn",disabled:!c.trim(),onClick:()=>P(s.id,c),children:"set"})]}),o.jsx("div",{className:"settings-note",children:"常用:256k / 512k / 768k / 1m;填 auto 回到模型自己的窗口。"}),o.jsxs("div",{className:"usage-note",children:["改的是",o.jsx("b",{children:"这个模型"}),":同模型的所有会话(含新开的、别的槽位)都用同一个上限。它只会让 Hermes 更早压缩,不会把窗口撑过模型本身。"]})]}):o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"usage-note",children:["这个后端没公告上下文旋钮,所以下面这个数只是仪表盘的",o.jsx("b",{children:"声明"}),",只影响百分比;真减上下文用压缩命令或换模型。"]}),a?o.jsxs("div",{className:"usage-edit",children:[o.jsx("input",{autoFocus:!0,value:c,inputMode:"numeric","aria-label":"context window in tokens",placeholder:String(t.size||e.info.contextLimit||2e5),onChange:T=>u(T.target.value),...x.handlers,onKeyDown:T=>{if(!x.isComposing(T)){if(T.key==="Enter"){const $=Number(c.replace(/[^0-9]/g,""));$>0&&C($,{remember:h})}T.key==="Escape"&&(T.stopPropagation(),l(!1))}}}),o.jsx("button",{className:"usage-edit-btn",disabled:p!==""||!Number(c.replace(/[^0-9]/g,"")),onClick:()=>void C(Number(c.replace(/[^0-9]/g,"")),{remember:h}),children:p==="save"?"…":"set"}),o.jsxs("label",{className:"usage-check",title:"像 studio 那样按模型记住:下次用这个模型自动带回来",children:[o.jsx("input",{type:"checkbox",checked:h,onChange:T=>d(T.target.checked)}),"记到本模型"]}),b?o.jsx("button",{className:"usage-edit-btn",disabled:p!=="",onClick:()=>void C(null,{forgetModel:!0}),children:p==="forget"?"…":"忘掉本模型记录"}):null]}):o.jsx("button",{className:"usage-edit-btn",onClick:()=>{u(String(k||2e5)),l(!0)},children:"声明窗口长度"})]})]}),o.jsxs("div",{children:["已用 ",t.used," / ",k||"—"," tokens(",j,"%)"]}),o.jsxs("div",{children:["剩余:",k>0?A:"unknown"," tokens"]}),o.jsxs("div",{children:["窗口来源:",o.jsx("b",{children:F})]}),t.size>0&&w!=="agent"?o.jsxs("div",{children:["agent 上报:",xa(t.size)," tokens (usage_update)"]}):null,b&&w==="session"?o.jsxs("div",{children:["本模型记录:",xa(b)," tokens"]}):null,t.cost!=null?o.jsxs("div",{children:["本轮花费:$",t.cost.toFixed(6)]}):null,g?.model?o.jsxs("div",{children:["model:",g.model]}):null,g&&(g.effort||g.mode)?o.jsxs("div",{children:["本轮:",[g.effort&&`思考强度 ${g.effort}`,g.mode&&`模式 ${g.mode}`].filter(Boolean).join(",")]}):null,O("compress")||O("context")?o.jsxs("div",{className:"usage-actions",children:[O("compress")?o.jsx("button",{className:"usage-act",onClick:()=>N("compress"),title:"让 agent 压缩上下文(/compress,它自己公告的命令)",children:"压缩上下文"}):null,O("context")?o.jsx("button",{className:"usage-act",onClick:()=>N("context"),title:"看消息按角色分布(/context)",children:"消息分布"}):null]}):null,m?o.jsx("div",{className:"usage-edit-err",children:m}):null]}):null]})}function R5({o:e,sessionId:t}){const s=e.meta??{},n=s.freeform===!0,[i,r]=_.useState(""),a=String(e.currentValue??""),l=typeof s.unit=="string"?s.unit:"tokens",c=h=>X.send({t:"set-config",sessionId:t,configId:e.id,value:h}),u=mg();return o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(Al,{size:13})," ",e.name||e.id]}),e.options?.map(h=>o.jsx("button",{className:`settings-opt ${a===String(h.value)?"sel":""}`,onClick:()=>c(String(h.value)),children:h.name},String(h.value))),n?o.jsxs("div",{className:"settings-freeform",children:[o.jsx("input",{className:"settings-input",type:"number",inputMode:"numeric",min:typeof s.min=="number"?s.min:void 0,step:typeof s.step=="number"?s.step:1024,placeholder:`任意 ${l}`,"aria-label":`${e.name||e.id} value`,value:i,onChange:h=>r(h.target.value),...u.handlers,onKeyDown:h=>{u.isComposing(h)||h.key==="Enter"&&i.trim()&&c(i.trim())}}),o.jsx("button",{className:"settings-opt",disabled:!i.trim(),onClick:()=>c(i.trim()),children:"set"})]}):null]})}function j5({v:e,prefs:t,setPrefs:s,onClose:n,panelRef:i}){const r=e.info,a=r.modes?.availableModes??[],l=Cl(r.configOptions,"effort"),c=Cl(r.configOptions,"model"),h=_.useSyncExternalStore(Mt.subscribeVoices,()=>Mt.voices().length)?Mt.voices():[],d=Vn();return o.jsxs("div",{className:"settings-pop",role:"dialog","aria-label":"chat settings",ref:i,children:[o.jsxs("div",{className:"settings-head",children:[o.jsx("span",{children:"chat settings"}),o.jsx("span",{className:"head-spacer"}),o.jsx("button",{className:"icon-btn",title:"close","aria-label":"close",onClick:n,children:o.jsx(wn,{size:13})})]}),a.length>0&&o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(Mw,{size:13})," permission mode"]}),a.map(p=>o.jsx("button",{className:`settings-opt ${r.modes?.currentModeId===p.id?"sel":""}`,onClick:()=>X.send({t:"set-mode",sessionId:r.id,modeId:p.id}),children:p.name},p.id))]}),l?.options?.length?o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(wE,{size:13})," thinking depth"]}),l.options.map((p,f)=>o.jsxs("button",{className:`settings-opt ${String(l.currentValue??"")===String(p.value)?"sel":""}`,onClick:()=>X.send({t:"set-config",sessionId:r.id,configId:l.id,value:String(p.value)}),children:[o.jsx("i",{className:"settings-dot",style:{"--effort":ir[Math.min(f,ir.length-1)]}}),p.name]},String(p.value))),o.jsx("div",{className:"settings-note",children:"只列这个路由真支持的档;改的是本会话。"})]}):null,r.configOptions.filter(p=>p.type==="select"&&p.options&&p!==l&&p!==c&&!j1(p)).map(p=>o.jsx(R5,{o:p,sessionId:r.id},p.id)),o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(th,{size:13})," read replies aloud"]}),o.jsxs("label",{className:"settings-toggle",children:[o.jsx("input",{type:"checkbox",checked:t.autoRead,onChange:p=>s({autoRead:p.target.checked})}),o.jsx("span",{children:"speak every finished reply"})]}),h.length>0&&o.jsxs("select",{className:"settings-select",value:t.voiceURI,onChange:p=>s({voiceURI:p.target.value}),"aria-label":"voice",children:[o.jsxs("option",{value:"",children:["auto voice (",t.lang,")"]}),h.map(p=>o.jsxs("option",{value:p.voiceURI,children:[p.name," — ",p.lang]},p.voiceURI))]}),h.length===0?o.jsx("div",{className:"settings-note",children:"this browser exposes no voices"}):null,o.jsxs("label",{className:"settings-range",children:[o.jsxs("span",{children:["speed ",t.rate.toFixed(2),"×"]}),o.jsx("input",{type:"range",min:.5,max:2,step:.05,value:t.rate,onChange:p=>s({rate:Number(p.target.value)})})]}),d.tts.server?o.jsxs("label",{className:"settings-toggle",children:[o.jsx("input",{type:"checkbox",checked:t.serverTts,onChange:p=>s({serverTts:p.target.checked})}),o.jsxs("span",{children:["use the server voice (",d.tts.model??"configured",")"]})]}):null]}),o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(sr,{size:13})," dictation"]}),o.jsxs("select",{className:"settings-select",value:t.stt,onChange:p=>s({stt:p.target.value}),"aria-label":"dictation engine",children:[o.jsx("option",{value:"auto",children:"auto — 服务端流式 > 浏览器 > 批量"}),o.jsxs("option",{value:"stream",children:["stream",d.stt.streaming?` (${d.stt.model??"百炼"})`:" (not configured)"]}),o.jsxs("option",{value:"browser",children:["browser",Rf()?"":" (unavailable)"]}),o.jsxs("option",{value:"server",children:["server",d.stt.server?` (${d.stt.batchModel??"configured"})`:" (not configured)"]})]}),o.jsx("input",{className:"settings-input",value:t.lang,onChange:p=>s({lang:p.target.value}),placeholder:"language, e.g. zh-CN","aria-label":"speech language"}),o.jsxs("div",{className:"settings-note",children:["browser dictation ",Rf()?"available":"unavailable"," · ",d.provider," STT"," ",d.stt.streaming?"streaming":d.stt.server?"batch":"not configured"]})]})]})}const Ec=new Map;function T5({v:e,call:t,onCloseCall:s}){const[n,i]=_.useState(()=>Ec.get(e.info.id)??""),r=window.innerWidth<720?"message… (/ for commands)":"message… (Enter send, Shift+Enter newline, / for commands)",a=/Mac|iPhone|iPad/.test(navigator.platform??"")?"⌘":"Ctrl+",l=window.innerWidth<720?"message… (Enter queues)":`message… (${a}Enter interrupts · Enter queues)`,[c,u]=_.useState(0),[h,d]=_.useState(!1),p=_.useRef(null),f=_.useRef(null),m=_.useRef(null),y=_.useRef(!1),x=_.useRef(null),g=_.useRef(""),v=_.useRef(!1),b=_.useMemo(()=>e.msgs.filter(R=>R.kind==="user").map(R=>R.text).filter(R=>R.trim()),[e.msgs]),w=_.useRef(e.info.id);_.useEffect(()=>{Ec.set(w.current,n)},[n]),_.useEffect(()=>{w.current!==e.info.id&&(Ec.set(w.current,n),w.current=e.info.id,i(Ec.get(e.info.id)??""),x.current=null,g.current="",d(!1),u(0))},[e.info.id,n]);const[k,j]=_.useState([]),[I,A]=_.useState(null),[D,O]=_.useState(""),[F,C]=_.useState(!1),[N,P]=_.useState(!1),[B,T]=_.useState(null);_.useEffect(()=>{const R=Ie.current;R&&(R.style.height="42px",R.style.height=`${Math.min(R.scrollHeight,window.innerHeight*.4)}px`)},[n]);const[$,E]=_.useState(!1),[z,H]=_.useState(null),[ne,ae]=_.useState({});_.useEffect(()=>{ae({}),H(null)},[e.info.id]);const[G,q]=lr(),te=Fm(),ue=Bm(),Ie=_.useRef(null),lt=_.useRef(null),Je=async R=>{const Z=Array.from(R);if(!Z.length)return;const _e=await Promise.all(Z.map(et=>S1(et))),Pe=[],qe=[];for(const et of _e)"error"in et?qe.push(et.error):Pe.push(et);Pe.length&&j(et=>[...et,...Pe]),O(qe.join(" · "))},$e=()=>k.map(R=>R.kind==="image"?{kind:"image",mimeType:R.mimeType,data:R.payload,name:R.name}:{kind:"text",name:R.name,text:R.payload}),Ze=R=>{if(R.key!=="ArrowUp"&&R.key!=="ArrowDown"||R.shiftKey||R.altKey||R.metaKey||R.ctrlKey||!b.length)return!1;const Z=R.currentTarget,_e=Z.selectionStart??0;if(R.key==="ArrowUp"&&Z.value.slice(0,_e).includes(`
|
|
129
|
+
`),onClick:()=>s(m=>!m),children:[o.jsx(en,{size:11,className:`work-chev${t?" open":""}`}),o.jsx("span",{className:"work-run-icon","aria-hidden":"true",children:n.length?"⚙":"💭"}),o.jsx("span",{className:"work-run-count",children:h}),c.length?o.jsx("span",{className:"work-run-names",children:c.length>2?`${u} +${c.length-2}`:u}):o.jsxs("span",{className:"work-run-chars",children:[l," 字"]}),o.jsx("span",{className:`work-run-state ${r?"err":a?"run":"ok"}`,"aria-hidden":"true",children:r?`✗ ${r}`:a?"•••":"✓"}),p?o.jsxs("span",{className:"msg-at",title:`${Fr(p)}${f&&f!==p?` → ${Fr(f)}`:""}`,children:[mi(p),f&&f-p>=6e4?`–${mi(f)}`:""]}):null]}),t&&o.jsx("div",{className:"work-run-items",children:e.map(m=>m.kind==="thought"?o.jsx(v1,{m,live:!1},m.key):o.jsx(y1,{m},m.key))})]})})}function b1({sid:e,req:t}){return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:"perm-card",children:[o.jsxs("div",{className:"q",children:["🔑 agent 要执行:",o.jsx("b",{children:t.toolCallTitle}),"(",t.kind,")"]}),o.jsx(fg,{req:t}),o.jsx("div",{className:"opts",children:o.jsx(w1,{sid:e,req:t})})]})})}function v5({m:e,sid:t}){const s=_.useSyncExternalStore(X.subscribe,X.getSnapshot),n=s.active?.info.id===t&&!!s.active?.perms.some(r=>r.requestId===e.requestId),i={requestId:e.requestId,sessionId:t,toolCallTitle:e.title,kind:e.kind2,options:e.options,createdAt:e.at??Date.now(),path:e.path,diff:e.diff};return e.decision?o.jsx(uy,{m:e}):n||!s.active?o.jsx(b1,{sid:t,req:i}):o.jsx(uy,{m:e,lapsed:!0})}function uy({m:e,lapsed:t}){const s=e.decision&&e.decision.outcome==="selected"?e.decision.optionId:null,n=e.options.find(a=>a.optionId===s),i=t?"已作废(服务端不再等这个请求了)":e.decision?.outcome==="selected"?`已答:${n?.name??"已选"}`:"已取消",r=t||e.decision?.outcome!=="selected"?"no":"yes";return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`perm-card done ${r}`,children:[o.jsxs("div",{className:"q",children:["🔑 agent 曾要执行:",o.jsx("b",{children:e.title}),"(",e.kind2,")"]}),o.jsx(fg,{req:{requestId:e.requestId,sessionId:"",toolCallTitle:e.title,kind:e.kind2,options:e.options,createdAt:e.at??0,path:e.path,diff:e.diff}}),o.jsx("div",{className:"perm-decision",children:i})]})})}function y5({m:e,sid:t}){const s=e.state==="trusted"||e.state==="ignore",n=i=>{X.send({t:"set-config",sessionId:t,configId:"project_skills",value:i})};return o.jsx("div",{className:"msg",children:o.jsxs("div",{className:`perm-card skills ${s?"done":""} ${e.state==="trusted"?"yes":e.state==="ignore"?"no":""}`,children:[o.jsxs("div",{className:"q",children:["📦 ",e.text]}),e.root?o.jsxs("div",{className:"perm-file",title:e.root,children:[o.jsx(Jn,{size:12}),o.jsx("code",{children:e.root})]}):null,s?o.jsx("div",{className:"perm-decision",children:e.state==="trusted"?"已信任:这个仓库的 skill 会随会话加载":"已忽略:不再问,也不加载"}):o.jsxs("div",{className:"opts",children:[o.jsxs("button",{className:"opt primary",onClick:()=>n("trusted"),children:["信任这个仓库(",e.count," 个 skill)"]}),o.jsx("button",{className:"opt",onClick:()=>n("ignore"),children:"这个仓库不用问"})]})]})})}function fg({req:e}){if(e.diff)return o.jsx(b5,{diff:e.diff});const t=e.path??null;return t?o.jsxs("div",{className:"perm-file",title:t,children:[o.jsx(Jn,{size:12}),o.jsx("code",{children:t})]}):null}function w1({sid:e,req:t,onAnswered:s}){const n=(a,l,c)=>{const u=X.permAnswer(t.requestId);if(u&&!u.lapsed)return;const h=X.send({t:"respond-permission",sessionId:e,requestId:t.requestId,decision:a,...c?{optionKind:c.kind,signature:`${t.kind}:${t.toolCallTitle}`}:{}});X.markPermAnswered(t.requestId,l,h),s?.(l)},i=X.permAnswer(t.requestId),[,r]=_.useState(0);return _.useEffect(()=>{if(!i||i.lapsed)return;const a=window.setInterval(()=>r(l=>l+1),1e3);return()=>window.clearInterval(a)},[i?.lapsed,t.requestId]),i&&!i.lapsed?o.jsxs("div",{className:"perm-answered",role:"status","aria-live":"polite",children:[o.jsx("span",{className:"perm-answered-tick","aria-hidden":"true",children:"✓"}),o.jsxs("span",{children:["已提交「",i.label,"」—— 正在等 agent 那边回应"]})]}):o.jsxs(o.Fragment,{children:[i?.lapsed&&o.jsxs("div",{className:"perm-unconfirmed",role:"status","aria-live":"polite",children:["还没收到 agent 那边的确认(等了 ",Math.max(1,Math.round((Date.now()-i.at)/1e3))," 秒) —— 可能是这一次答复没送出去,可以再点一次。"]}),t.options.map(a=>o.jsx("button",{className:a.kind.startsWith("allow")?"allow":"reject",onClick:()=>n({outcome:"selected",optionId:a.optionId},a.name,a),children:a.name},a.optionId)),o.jsx("button",{title:"不选任何一项:agent 会收到 cancelled,这一轮就停在这里",onClick:()=>n({outcome:"cancelled"},"取消这次请求"),children:"取消这次请求"})]})}function x1({lines:e}){return o.jsx("div",{className:"perm-diff",role:"region","aria-label":"变更内容",children:e.map((t,s)=>t.kind==="gap"?o.jsx("div",{className:"perm-diff-gap",children:t.text},s):o.jsxs("div",{className:`perm-diff-line ${t.kind}`,children:[o.jsx("span",{className:"no",children:t.oldNo??""}),o.jsx("span",{className:"no",children:t.newNo??""}),o.jsx("span",{className:"sig",children:t.kind==="add"?"+":t.kind==="del"?"−":" "}),o.jsx("span",{className:"txt",children:t.text||" "})]},s))})}function b5({diff:e}){const[t,s]=_.useState(!1),n=e.oldText??"",i=e.newText??"",r=i.length>0&&n.length===0,a=Om(n,i),l=a.filter(u=>u.kind==="add").length,c=a.filter(u=>u.kind==="del").length;return o.jsxs("div",{className:"perm-changes",children:[o.jsxs("button",{type:"button",className:"perm-change-row","aria-expanded":t,"aria-label":`${t?"收起":"查看"} ${e.path??"这份文件"} 的变更`,onClick:()=>s(u=>!u),children:[o.jsx(Jn,{size:13}),o.jsx("code",{title:e.path??"",children:e.path??"(未命名文件)"}),o.jsx("span",{className:"perm-counts",children:r?o.jsxs("span",{className:"add",children:["新文件 · ",l," 行"]}):o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"add",children:["+",l]}),o.jsxs("span",{className:"del",children:["−",c]})]})}),o.jsx("span",{className:"perm-caret","aria-hidden":"true",children:t?"▾":"▸"})]}),t?o.jsx(x1,{lines:a}):null,e.truncated?o.jsx("div",{className:"perm-cut",children:"agent 发来的是整份文件,这里只保留了改动附近的部分"}):null]})}function hy({f:e}){const[t,s]=_.useState(!1),n=e.oldText.length===0&&e.newText.length>0,i=n||e.oldText.length>0||e.newText.length>0,r=_.useMemo(()=>i?Om(e.oldText,e.newText):[],[i,e.oldText,e.newText]),a=e.path===e.name?"":e.path.slice(0,e.path.length-e.name.length).replace(/[\\/]+$/,"");return o.jsxs("div",{className:"fc-row",children:[o.jsxs("div",{className:"fc-line",children:[o.jsx("span",{className:"fc-dot","aria-hidden":"true"}),o.jsxs("button",{type:"button",className:"fc-name",title:`在右侧面板打开 ${e.path}`,onClick:()=>sx({path:e.path}),children:[e.name,a?o.jsx("span",{className:"fc-dir",children:a}):null,e.edits>1?o.jsxs("span",{className:"fc-edits",children:["改了 ",e.edits," 次"]}):null]}),o.jsx("button",{type:"button",className:"fc-counts","aria-expanded":t,"aria-label":`${t?"收起":"查看"} ${e.path} 的变更`,disabled:!i,onClick:()=>s(l=>!l),children:n?o.jsxs("span",{className:"add",children:["新文件 · ",e.insertions," 行"]}):o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"add",children:["+",e.insertions]}),o.jsxs("span",{className:"del",children:["−",e.deletions]})]})})]}),t&&i?o.jsx(x1,{lines:r}):null]})}function dy({msgs:e}){const t=_.useMemo(()=>{const a=[];for(const l of e)l.kind==="tool"&&l.changes?.length&&a.push(...l.changes);return PE(a)},[e]),[s,n]=_.useState(!0);if(!t.length)return null;if(t.length===1)return o.jsx("div",{className:"file-changes one",children:o.jsx(hy,{f:t[0]})});const i=t.reduce((a,l)=>a+l.insertions,0),r=t.reduce((a,l)=>a+l.deletions,0);return o.jsxs("div",{className:"file-changes",children:[o.jsxs("button",{type:"button",className:"fc-head","aria-expanded":s,"aria-label":`${s?"收起":"展开"} ${t.length} 个文件变更`,onClick:()=>n(a=>!a),children:[o.jsx(Jn,{size:13}),o.jsxs("span",{className:"fc-title",children:[t.length," 个文件变更"]}),o.jsxs("span",{className:"fc-counts static",children:[o.jsxs("span",{className:"add",children:["+",i]}),o.jsxs("span",{className:"del",children:["−",r]})]}),o.jsx("span",{className:"perm-caret","aria-hidden":"true",children:s?"▾":"▸"})]}),s?t.map(a=>o.jsx(hy,{f:a},a.path)):null]})}function w5({req:e,sessionTitle:t,waiting:s,onSkip:n}){Wo(!0,n);const[i,r]=_.useState(()=>Date.now());_.useEffect(()=>{const u=window.setInterval(()=>r(Date.now()),1e3);return()=>window.clearInterval(u)},[e.requestId]);const a=Math.max(0,Math.round((i-e.createdAt)/1e3)),l=X.permAnswer(e.requestId),c=Math.max(0,s-1);return o.jsx("div",{className:"modal-bg perm-bg",onClick:n,children:o.jsxs("div",{className:"modal perm-dialog",role:"dialog","aria-modal":"true","aria-label":"agent 请求授权","data-request-id":e.requestId,"data-session-id":e.sessionId,"data-waiting":s,onClick:u=>u.stopPropagation(),children:[o.jsx("h3",{children:"Agent 请求授权"}),o.jsxs("div",{className:"perm-ask",children:["「",t,"」里的 agent 停在这里等你答复 —— 它要执行 ",o.jsx("b",{children:e.toolCallTitle}),"(",e.kind,")。"]}),o.jsx(fg,{req:e}),o.jsx("div",{className:"opts perm-opts",children:o.jsx(w1,{sid:e.sessionId,req:e})}),c>0&&o.jsxs("div",{className:"perm-queue",role:"note",children:["这个会话还有 ",o.jsx("b",{children:c})," 个请求等着答复 —— 答完这个,下一个会接着显示在这里。"]}),o.jsxs("div",{className:"perm-note",children:["已等待 ",a," 秒。一直不答复的话,agent 那边会自己放弃这次请求(等同拒绝),这一轮就停在这里。"]}),!l&&o.jsx("div",{className:"row",children:o.jsx("button",{className:"cancel",onClick:n,children:"稍后处理"})})]})})}function Dd(e){if(e<=0)return"";if(e%60===0){const t=e/60;return t<60?`${t} 分钟`:`${Math.round(t/60)} 小时`}return`${e} 秒`}function x5(){const[e,t]=_.useState(null);_.useEffect(()=>{let n=!0;return fetch("/api/settings",{credentials:"same-origin"}).then(i=>i.ok?i.json():null).then(i=>{n&&t(Number(i?.observer?.intervalSec??0))}).catch(()=>{n&&t(0)}),()=>{n=!1}},[]);const s=_.useCallback(n=>{t(n),fetch("/api/settings",{method:"POST",credentials:"same-origin",headers:{"content-type":"application/json"},body:JSON.stringify({observer:{intervalSec:n}})}).catch(()=>{})},[]);return[e??0,s]}function S5({id:e,text:t,sid:s}){const[n]=lr(),i=Bm(),[r,a]=_.useState(!1),[l,c]=_.useState(!1),[u,h]=_.useState(null),d=_.useRef(null);Br(r,[d],()=>a(!1));const p=_.useRef({timer:null,fired:!1}),f=()=>{p.current.timer&&(window.clearTimeout(p.current.timer),p.current.timer=null)};_.useEffect(()=>f,[]);const m=()=>{p.current.fired=!1,f(),p.current.timer=window.setTimeout(()=>{p.current.fired=!0,a(!0)},500)};if(!t.trim())return null;const y=i.speaking&&i.speakingId===e;if(typeof window<"u"&&!("speechSynthesis"in window)&&!n.serverTts)return o.jsx("span",{className:"bubble-note",title:"this browser has no speech synthesis",children:"no voices"});const x=async g=>{if(l)return;const v=PP(m1(e,g));if(v){a(!1),Mt.speak(v.text,`${e}#summary:${g??"cfg"}`,n);return}c(!0),h(null);try{const b=await FP(s,e,g);a(!1),Mt.speak(b.text,`${e}#summary:${g??"cfg"}`,n)}catch(b){const w=b;h({msg:w?.message??String(b),hint:w?.hint}),a(!1)}finally{c(!1)}};return o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"speak-wrap bubble-speak",ref:d,children:[o.jsx("button",{className:`bubble-btn speak ${y?"on":""} ${l?"working":""}`,title:l?"正在生成语音播报总结…":y?"stop reading(长按:语音播报总结)":"read this reply aloud(长按:语音播报总结)","aria-label":y?"stop reading":"read aloud","aria-haspopup":"menu","aria-expanded":r,onClick:()=>{if(p.current.fired){p.current.fired=!1;return}y?Mt.stop():Mt.speak(t,e,n)},onPointerDown:m,onPointerUp:f,onPointerLeave:f,onPointerCancel:f,onContextMenu:g=>{g.preventDefault(),f(),a(!0)},onKeyDown:g=>{(g.key==="F10"&&g.shiftKey||g.key==="ContextMenu")&&(g.preventDefault(),a(!0))},children:l?o.jsx(Po,{size:13,className:"spin"}):y?o.jsx(Lw,{size:13}):o.jsx(th,{size:13})}),r?o.jsxs("div",{className:"speak-menu bubble-menu",role:"menu",children:[o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item","data-speak-summary":"verbatim",onClick:()=>{a(!1),Mt.speak(t,e,n)},children:[o.jsx("span",{className:"speak-check",children:"›"}),o.jsx("span",{className:"speak-name",children:"读整条"})]}),[100,150,200].map(g=>o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item",disabled:l,"data-speak-summary":String(g),onClick:()=>void x(g),children:[o.jsx("span",{className:"speak-check",children:l?"•":"›"}),o.jsx("span",{className:"speak-name",children:l?"总结中…":`语音播报总结 · 约 ${g} 字`})]},g)),o.jsxs("button",{type:"button",role:"menuitem",className:"speak-menu-item",disabled:l,"data-speak-summary":"cfg",onClick:()=>void x(),children:[o.jsx("span",{className:"speak-check",children:"›"}),o.jsx("span",{className:"speak-name",children:l?"总结中…":"语音播报总结 · 按设置"})]}),o.jsx("p",{className:"speak-hint",children:"把这条压成一段能听完的话;字数写进提示词交给模型(提示词在 设置 → 语音总结)"})]}):null]}),u?o.jsxs("span",{className:"bubble-note err",role:"status",children:[u.msg,u.hint?` · ${u.hint}`:""]}):null]})}function k5({mkey:e}){const t=_.useSyncExternalStore(IP,ay,ay),[s,n]=_.useState(!1),i=OP(e);if(!i)return null;const r=i.route==="session"?`${i.provider??""}${i.provider?" · ":""}${i.model??""}`:i.model?`语音端点 · ${i.model}`:"",a=i.maxChars?` · 按 ${i.maxChars} 字压`:"",l=i.via==="verbatim"?"原文本身就够短,直接念":`${i.chars} 字${a} · ${(i.ms/1e3).toFixed(1)}s${r?` · ${r}`:""}`;return o.jsxs("div",{className:`bubble-note speech-note${s?" open":""}`,"data-summary-chars":i.chars,children:[o.jsx("button",{type:"button",className:"speech-note-tag","aria-expanded":s,onClick:()=>n(c=>!c),children:"播报稿"}),o.jsx("span",{className:"speech-note-text",onClick:()=>n(c=>!c),title:"点击展开/收起",children:i.text}),o.jsx("span",{className:"speech-note-meta",title:i.routeNote??void 0,children:l}),o.jsx("button",{type:"button",className:"speech-note-x",title:"丢掉这份稿子(下次长按会重新生成)","aria-label":"drop this summary",onClick:()=>BP(e),children:o.jsx(wn,{size:11})}),o.jsx("span",{hidden:!0,children:t})]})}const pg=["image/png","image/jpeg","image/webp","image/gif"],C5=4*1024*1024,E5=256*1024;function mg(){const e=_.useRef(!1);return{handlers:{onCompositionStart:()=>{e.current=!0},onCompositionEnd:()=>{e.current=!1}},isComposing:t=>e.current||t.nativeEvent.isComposing===!0}}function S1(e){return pg.includes(e.type)?e.size>C5?Promise.resolve({error:`${e.name}: image larger than 4MB`}):new Promise(s=>{const n=new FileReader;n.onload=()=>{const i=String(n.result??"");s({id:`${e.name}-${e.size}-${Math.random().toString(36).slice(2,7)}`,name:e.name,kind:"image",mimeType:e.type,preview:i,payload:i.slice(i.indexOf(",")+1),bytes:e.size})},n.onerror=()=>s({error:`${e.name}: could not be read`}),n.readAsDataURL(e)}):e.size>E5?Promise.resolve({error:`${e.name}: larger than 256kB — attach it as a path instead`}):new Promise(s=>{const n=new FileReader;n.onload=()=>s({id:`${e.name}-${e.size}-${Math.random().toString(36).slice(2,7)}`,name:e.name,kind:"text",mimeType:e.type||"text/plain",payload:String(n.result??""),bytes:e.size}),n.onerror=()=>s({error:`${e.name}: could not be read`}),n.readAsText(e)})}function k1(e){if(!e)return[];const t=Array.from(e.files??[]);for(const s of Array.from(e.items??[])){if(s.kind!=="file")continue;const n=s.getAsFile();n&&!t.some(i=>i.name===n.name&&i.size===n.size&&i.type===n.type)&&t.push(n)}return t}function C1(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(0)} kB`:`${(e/1048576).toFixed(1)} MB`}const ir=["#7f8c98","#5fb3a1","#7fb069","#d9a441","#e8843c","#f0603f","#ff4d4d"];function E1(e,t){const s=Math.max(1,t.length),n=t.findIndex(a=>String(a.value)===String(e)),i=n<0?0:n+1;return{color:n<0?"var(--text-dim)":ir[Math.min(n,ir.length-1)],level:i,total:s}}function N1({level:e,total:t,color:s}){const n=Math.min(7,t),i=Math.max(0,Math.min(n,Math.round(e/t*n)));return o.jsx("span",{className:"tb-pips","aria-hidden":"true",children:Array.from({length:n}).map((r,a)=>o.jsx("i",{style:{background:a<i?s:"var(--line)"}},a))})}function Cl(e,t){const s=t==="effort"?["thought_level","reasoning"]:["model","model_config"],n=t==="effort"?/reason|effort|think|depth/i:/model/i;return e.find(i=>i.type==="select"&&i.category&&s.includes(String(i.category)))??e.find(i=>i.type==="select"&&n.test(i.id))}function R1({label:e,title:t,icon:s,value:n,children:i,open:r,onToggle:a,testId:l}){const c=_.useRef(null);return Br(r,[c],a),o.jsxs("div",{className:"tb-wrap",ref:c,children:[o.jsxs("button",{type:"button",className:`tb-btn ${r?"on":""}`,title:t,"aria-label":t,"aria-expanded":r,"data-testid":l,onClick:a,children:[s,o.jsx("span",{className:"tb-label",children:n||e}),o.jsx(Io,{size:11,className:"tb-chev"})]}),r?i:null]})}function Bu({items:e,current:t,onPick:s,empty:n}){const i=Nw();return e.length?o.jsx("div",{className:"tb-list",role:"listbox",ref:i,children:e.map(r=>o.jsxs("button",{role:"option","aria-selected":r.value===t,className:`tb-opt ${r.value===t?"sel":""}`,title:r.hint?`${r.name} — ${r.hint}`:r.name,onClick:()=>s(r.value),children:[o.jsxs("span",{className:"tb-opt-name",children:[r.color?o.jsx("i",{className:"tb-dot",style:{background:r.color}}):null,r.name]}),r.hint?o.jsx("span",{className:"tb-opt-hint",children:r.hint}):null]},r.value))}):o.jsx("div",{className:"tb-list",ref:i,children:o.jsx("div",{className:"tb-empty",children:n})})}function j1(e){return e.category==="_context_window"?!0:/budget|context/i.test(`${e.id} ${e.name??""}`)}function N5({v:e}){const t=e.info.usage,s=e.info.configOptions.find(j1),[n,i]=_.useState(!1),r=_.useRef(null),[a,l]=_.useState(!1),[c,u]=_.useState(""),[h,d]=_.useState(!0),[p,f]=_.useState(""),[m,y]=_.useState(""),x=mg(),g=e.trace;if(Br(n,[r],()=>{i(!1),l(!1)}),!t||!t.used&&!t.size)return null;const v=e.info.contextLimit&&e.info.contextLimit>0?e.info.contextLimit:null,b=e.info.modelContextLimit&&e.info.modelContextLimit>0?e.info.modelContextLimit:null,w=v?"session":b?"model":"agent",k=v??b??t.size,j=k>0?Math.min(100,Math.round(t.used/k*100)):0,I=j>=85?"hot":j>=65?"warn":"ok",A=k>0?Math.max(0,k-t.used):0,D=e.info.commands??[],O=T=>D.some($=>$.name===T),F=w==="session"?"你为本会话声明":w==="model"?"你为这个模型记下的":"agent 上报(usage_update)",C=async(T,$={})=>{f($.forgetModel?"forget":"save"),y("");try{await X.setContextLimit(e.info.id,T,$),l(!1)}catch(E){y(String(E?.message??E))}finally{f("")}},N=T=>{if(e.info.cold){i(!1),X.resume(e.info.id);return}X.send({t:"prompt",sessionId:e.info.id,text:`/${T}`}),i(!1)},P=(T,$)=>{const E=$.trim();E&&(X.send({t:"set-config",sessionId:e.info.id,configId:T,value:E}),u(""))},B=String(s?.currentValue??"");return o.jsxs("div",{className:`usage-row ${I}`,ref:r,children:[o.jsxs("button",{className:"usage-text",onClick:()=>i(T=>!T),title:"上下文窗口 — 点这里改",children:[o.jsx(E_,{size:12,className:"usage-icon"}),k>0?`${xa(t.used)} / ${xa(k)}`:`${xa(t.used)} / —`,k>0?` · ${j}%`:"",w==="session"?" · 声明":w==="model"?" · 模型记录":""]}),k>0?o.jsx("div",{className:"usage-bar",title:`${t.used} / ${k} tokens (${j}%)`,children:o.jsx("i",{style:{width:`${j}%`}})}):null,I==="hot"&&O("compress")&&!e.busy?o.jsxs("button",{className:"usage-act",onClick:()=>N("compress"),title:"发送 /compress:让 agent 压缩上下文(这是它自己公告的命令)",children:[o.jsx(Im,{size:11})," 压缩上下文"]}):null,n?o.jsxs("div",{className:"usage-detail",children:[o.jsxs("div",{className:"usage-set",children:[o.jsxs("div",{className:"usage-set-head",children:[o.jsx(E_,{size:12})," 上下文窗口",o.jsx("span",{className:"usage-set-scope",children:s?String(s.meta?.scope??"")==="model"?"按模型":"":"仅声明"})]}),s?o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"usage-set-chips",children:(s.options??[]).map(T=>o.jsx("button",{className:`usage-chip ${B===String(T.value)?"sel":""}`,onClick:()=>P(s.id,String(T.value)),children:String(T.value)==="auto"?"自动":T.name},String(T.value)))}),o.jsxs("div",{className:"usage-edit",children:[o.jsx("input",{value:c,inputMode:"numeric","aria-label":"context window in tokens",placeholder:s.meta?.freeform===!0?"任意 token 数,如 300000":"填一个数",onChange:T=>u(T.target.value),onKeyDown:T=>{x.isComposing(T)||(T.key==="Enter"&&P(s.id,c),T.key==="Escape"&&(T.stopPropagation(),i(!1)))}}),o.jsx("button",{className:"usage-edit-btn",disabled:!c.trim(),onClick:()=>P(s.id,c),children:"set"})]}),o.jsx("div",{className:"settings-note",children:"常用:256k / 512k / 768k / 1m;填 auto 回到模型自己的窗口。"}),o.jsxs("div",{className:"usage-note",children:["改的是",o.jsx("b",{children:"这个模型"}),":同模型的所有会话(含新开的、别的槽位)都用同一个上限。它只会让 Hermes 更早压缩,不会把窗口撑过模型本身。"]})]}):o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"usage-note",children:["这个后端没公告上下文旋钮,所以下面这个数只是仪表盘的",o.jsx("b",{children:"声明"}),",只影响百分比;真减上下文用压缩命令或换模型。"]}),a?o.jsxs("div",{className:"usage-edit",children:[o.jsx("input",{autoFocus:!0,value:c,inputMode:"numeric","aria-label":"context window in tokens",placeholder:String(t.size||e.info.contextLimit||2e5),onChange:T=>u(T.target.value),...x.handlers,onKeyDown:T=>{if(!x.isComposing(T)){if(T.key==="Enter"){const $=Number(c.replace(/[^0-9]/g,""));$>0&&C($,{remember:h})}T.key==="Escape"&&(T.stopPropagation(),l(!1))}}}),o.jsx("button",{className:"usage-edit-btn",disabled:p!==""||!Number(c.replace(/[^0-9]/g,"")),onClick:()=>void C(Number(c.replace(/[^0-9]/g,"")),{remember:h}),children:p==="save"?"…":"set"}),o.jsxs("label",{className:"usage-check",title:"像 studio 那样按模型记住:下次用这个模型自动带回来",children:[o.jsx("input",{type:"checkbox",checked:h,onChange:T=>d(T.target.checked)}),"记到本模型"]}),b?o.jsx("button",{className:"usage-edit-btn",disabled:p!=="",onClick:()=>void C(null,{forgetModel:!0}),children:p==="forget"?"…":"忘掉本模型记录"}):null]}):o.jsx("button",{className:"usage-edit-btn",onClick:()=>{u(String(k||2e5)),l(!0)},children:"声明窗口长度"})]})]}),o.jsxs("div",{children:["已用 ",t.used," / ",k||"—"," tokens(",j,"%)"]}),o.jsxs("div",{children:["剩余:",k>0?A:"unknown"," tokens"]}),o.jsxs("div",{children:["窗口来源:",o.jsx("b",{children:F})]}),t.size>0&&w!=="agent"?o.jsxs("div",{children:["agent 上报:",xa(t.size)," tokens (usage_update)"]}):null,b&&w==="session"?o.jsxs("div",{children:["本模型记录:",xa(b)," tokens"]}):null,t.cost!=null?o.jsxs("div",{children:["本轮花费:$",t.cost.toFixed(6)]}):null,g?.model?o.jsxs("div",{children:["model:",g.model]}):null,g&&(g.effort||g.mode)?o.jsxs("div",{children:["本轮:",[g.effort&&`思考强度 ${g.effort}`,g.mode&&`模式 ${g.mode}`].filter(Boolean).join(",")]}):null,O("compress")||O("context")?o.jsxs("div",{className:"usage-actions",children:[O("compress")?o.jsx("button",{className:"usage-act",onClick:()=>N("compress"),title:"让 agent 压缩上下文(/compress,它自己公告的命令)",children:"压缩上下文"}):null,O("context")?o.jsx("button",{className:"usage-act",onClick:()=>N("context"),title:"看消息按角色分布(/context)",children:"消息分布"}):null]}):null,m?o.jsx("div",{className:"usage-edit-err",children:m}):null]}):null]})}function R5({o:e,sessionId:t}){const s=e.meta??{},n=s.freeform===!0,[i,r]=_.useState(""),a=String(e.currentValue??""),l=typeof s.unit=="string"?s.unit:"tokens",c=h=>X.send({t:"set-config",sessionId:t,configId:e.id,value:h}),u=mg();return o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(Al,{size:13})," ",e.name||e.id]}),e.options?.map(h=>o.jsx("button",{className:`settings-opt ${a===String(h.value)?"sel":""}`,onClick:()=>c(String(h.value)),children:h.name},String(h.value))),n?o.jsxs("div",{className:"settings-freeform",children:[o.jsx("input",{className:"settings-input",type:"number",inputMode:"numeric",min:typeof s.min=="number"?s.min:void 0,step:typeof s.step=="number"?s.step:1024,placeholder:`任意 ${l}`,"aria-label":`${e.name||e.id} value`,value:i,onChange:h=>r(h.target.value),...u.handlers,onKeyDown:h=>{u.isComposing(h)||h.key==="Enter"&&i.trim()&&c(i.trim())}}),o.jsx("button",{className:"settings-opt",disabled:!i.trim(),onClick:()=>c(i.trim()),children:"set"})]}):null]})}function j5({v:e,prefs:t,setPrefs:s,onClose:n,panelRef:i}){const r=e.info,a=r.modes?.availableModes??[],l=Cl(r.configOptions,"effort"),c=Cl(r.configOptions,"model"),h=_.useSyncExternalStore(Mt.subscribeVoices,()=>Mt.voices().length)?Mt.voices():[],d=Vn();return o.jsxs("div",{className:"settings-pop",role:"dialog","aria-label":"chat settings",ref:i,children:[o.jsxs("div",{className:"settings-head",children:[o.jsx("span",{children:"chat settings"}),o.jsx("span",{className:"head-spacer"}),o.jsx("button",{className:"icon-btn",title:"close","aria-label":"close",onClick:n,children:o.jsx(wn,{size:13})})]}),a.length>0&&o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(Mw,{size:13})," permission mode"]}),a.map(p=>o.jsx("button",{className:`settings-opt ${r.modes?.currentModeId===p.id?"sel":""}`,onClick:()=>X.send({t:"set-mode",sessionId:r.id,modeId:p.id}),children:p.name},p.id))]}),l?.options?.length?o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(wE,{size:13})," thinking depth"]}),l.options.map((p,f)=>o.jsxs("button",{className:`settings-opt ${String(l.currentValue??"")===String(p.value)?"sel":""}`,onClick:()=>X.send({t:"set-config",sessionId:r.id,configId:l.id,value:String(p.value)}),children:[o.jsx("i",{className:"settings-dot",style:{"--effort":ir[Math.min(f,ir.length-1)]}}),p.name]},String(p.value))),o.jsx("div",{className:"settings-note",children:"只列这个路由真支持的档;改的是本会话。"})]}):null,r.configOptions.filter(p=>p.type==="select"&&p.options&&p!==l&&p!==c&&!j1(p)).map(p=>o.jsx(R5,{o:p,sessionId:r.id},p.id)),o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(th,{size:13})," read replies aloud"]}),o.jsxs("label",{className:"settings-toggle",children:[o.jsx("input",{type:"checkbox",checked:t.autoRead,onChange:p=>s({autoRead:p.target.checked})}),o.jsx("span",{children:"speak every finished reply"})]}),h.length>0&&o.jsxs("select",{className:"settings-select",value:t.voiceURI,onChange:p=>s({voiceURI:p.target.value}),"aria-label":"voice",children:[o.jsxs("option",{value:"",children:["auto voice (",t.lang,")"]}),h.map(p=>o.jsxs("option",{value:p.voiceURI,children:[p.name," — ",p.lang]},p.voiceURI))]}),h.length===0?o.jsx("div",{className:"settings-note",children:"this browser exposes no voices"}):null,o.jsxs("label",{className:"settings-range",children:[o.jsxs("span",{children:["speed ",t.rate.toFixed(2),"×"]}),o.jsx("input",{type:"range",min:.5,max:2,step:.05,value:t.rate,onChange:p=>s({rate:Number(p.target.value)})})]}),d.tts.server?o.jsxs("label",{className:"settings-toggle",children:[o.jsx("input",{type:"checkbox",checked:t.serverTts,onChange:p=>s({serverTts:p.target.checked})}),o.jsxs("span",{children:["use the server voice (",d.tts.model??"configured",")"]})]}):null]}),o.jsxs("div",{className:"settings-group",children:[o.jsxs("div",{className:"settings-label",children:[o.jsx(sr,{size:13})," dictation"]}),o.jsxs("select",{className:"settings-select",value:t.stt,onChange:p=>s({stt:p.target.value}),"aria-label":"dictation engine",children:[o.jsx("option",{value:"auto",children:"auto — 服务端流式 > 浏览器 > 批量"}),o.jsxs("option",{value:"stream",children:["stream",d.stt.streaming?` (${d.stt.model??"百炼"})`:" (not configured)"]}),o.jsxs("option",{value:"browser",children:["browser",Rf()?"":" (unavailable)"]}),o.jsxs("option",{value:"server",children:["server",d.stt.server?` (${d.stt.batchModel??"configured"})`:" (not configured)"]})]}),o.jsx("input",{className:"settings-input",value:t.lang,onChange:p=>s({lang:p.target.value}),placeholder:"language, e.g. zh-CN","aria-label":"speech language"}),o.jsxs("div",{className:"settings-note",children:["browser dictation ",Rf()?"available":"unavailable"," · ",d.provider," STT"," ",d.stt.streaming?"streaming":d.stt.server?"batch":"not configured"]})]})]})}const Ec=new Map;function T5({v:e,call:t,onCloseCall:s}){const[n,i]=_.useState(()=>Ec.get(e.info.id)??""),r=window.innerWidth<720?"message… (/ for commands)":"message… (Enter send, Shift+Enter newline, / for commands)",a=/Mac|iPhone|iPad/.test(navigator.platform??"")?"⌘":"Ctrl+",l=window.innerWidth<=720?"message… (Enter queues)":`message… (${a}Enter interrupts · Enter queues)`,[c,u]=_.useState(0),[h,d]=_.useState(!1),p=_.useRef(null),f=_.useRef(null),m=_.useRef(null),y=_.useRef(!1),x=_.useRef(null),g=_.useRef(""),v=_.useRef(!1),b=_.useMemo(()=>e.msgs.filter(R=>R.kind==="user").map(R=>R.text).filter(R=>R.trim()),[e.msgs]),w=_.useRef(e.info.id);_.useEffect(()=>{Ec.set(w.current,n)},[n]),_.useEffect(()=>{w.current!==e.info.id&&(Ec.set(w.current,n),w.current=e.info.id,i(Ec.get(e.info.id)??""),x.current=null,g.current="",d(!1),u(0))},[e.info.id,n]);const[k,j]=_.useState([]),[I,A]=_.useState(null),[D,O]=_.useState(""),[F,C]=_.useState(!1),[N,P]=_.useState(!1),[B,T]=_.useState(null);_.useEffect(()=>{const R=Ie.current;R&&(R.style.height="42px",R.style.height=`${Math.min(R.scrollHeight,window.innerHeight*.4)}px`)},[n]);const[$,E]=_.useState(!1),[z,H]=_.useState(null),[ne,ae]=_.useState({});_.useEffect(()=>{ae({}),H(null)},[e.info.id]);const[G,q]=lr(),te=Fm(),ue=Bm(),Ie=_.useRef(null),lt=_.useRef(null),Je=async R=>{const Z=Array.from(R);if(!Z.length)return;const _e=await Promise.all(Z.map(et=>S1(et))),Pe=[],qe=[];for(const et of _e)"error"in et?qe.push(et.error):Pe.push(et);Pe.length&&j(et=>[...et,...Pe]),O(qe.join(" · "))},$e=()=>k.map(R=>R.kind==="image"?{kind:"image",mimeType:R.mimeType,data:R.payload,name:R.name}:{kind:"text",name:R.name,text:R.payload}),Ze=R=>{if(R.key!=="ArrowUp"&&R.key!=="ArrowDown"||R.shiftKey||R.altKey||R.metaKey||R.ctrlKey||!b.length)return!1;const Z=R.currentTarget,_e=Z.selectionStart??0;if(R.key==="ArrowUp"&&Z.value.slice(0,_e).includes(`
|
|
130
130
|
`)||R.key==="ArrowDown"&&Z.value.slice(_e).includes(`
|
|
131
131
|
`))return!1;if(R.preventDefault(),R.key==="ArrowUp")x.current===null?(g.current=Z.value,x.current=b.length-1):x.current=Math.max(0,x.current-1);else{if(x.current===null)return!0;if(x.current>=b.length-1)return x.current=null,v.current=!0,i(g.current),requestAnimationFrame(()=>Ie.current?.setSelectionRange(g.current.length,g.current.length)),!0;x.current+=1}const Pe=b[x.current];return v.current=!0,i(Pe),requestAnimationFrame(()=>Ie.current?.setSelectionRange(Pe.length,Pe.length)),!0},Xe=()=>{const R=n.trim();if(!R&&!k.length)return;const Z=$e();if(e.info.cold){X.sendToCold(e.info.id,R,Z),i(""),j([]),O(""),u(0),Va.current();return}if(Rr(e)||e.info.status!=="ready"){if(!R&&!Z.length)return;X.enqueuePrompt(e.info.id,R,Z)}else X.sendPrompt(e.info.id,R,Z);i(""),j([]),O(""),u(0),x.current=null,g.current="",Va.current()},xe=()=>{const R=n.trim();if(!R&&!k.length)return;const Z=$e();e.info.cold?X.sendToCold(e.info.id,R,Z):X.sendNow(e.info.id,R,Z),i(""),j([]),O(""),u(0),Va.current()};_.useEffect(()=>{if(t||!we.owns("chat")||te.status!=="idle"||!te.text)return;const R=we.consume();R&&(i(Z=>Z.trim()?`${Z.trim()} ${R}`:R),Ie.current?.focus())},[te.status,te.text,t]);const Se=/^\/\S*$/.test(n)?n.slice(1).toLowerCase():null,Fe=Se===null?[]:e.info.commands.filter(R=>R.name.toLowerCase().includes(Se)).slice(0,8),je=Se!==null&&e.info.status==="ready"&&!h;Br(je,[p],()=>d(!0)),Br(N||B!==null,[f,m],()=>{T(null),P(!1)}),_.useEffect(()=>{T(null),P(!1),d(!1)},[e.info.id]);const ht=R=>{i(`/${R} `),u(0),Ie.current?.focus()},fe=te.status==="listening"||te.status==="recording"||te.status==="requesting",Qe=Cl(e.info.configOptions,"effort"),ke=Cl(e.info.configOptions,"model"),be=e.info.models?.availableModels??[],W=e.info.models?.currentModelId??"",he=be.find(R=>R.modelId===W)?.name??ke?.options?.find(R=>String(R.value)===String(ke.currentValue??""))?.name??W,Ae=Pm(he,W),Oe=Qe?.options?.find(R=>String(R.value)===String(Qe.currentValue??""))?.name??"",Y=Qe?E1(String(Qe.currentValue??""),Qe.options??[]):null;return o.jsxs("div",{className:`composer ${F?"drop-active":""}`,onDragOver:R=>{R.preventDefault(),C(!0)},onDragLeave:()=>C(!1),onDrop:R=>{R.preventDefault(),C(!1),R.dataTransfer?.files?.length&&Je(R.dataTransfer.files)},onPaste:R=>{const Z=k1(R.clipboardData);Z.length&&(R.preventDefault(),Je(Z))},children:[o.jsx(n5,{v:e}),o.jsx(d5,{v:e}),o.jsx(N5,{v:e}),o.jsxs("div",{className:"composer-inner",ref:p,children:[je&&o.jsx("div",{className:"slash-palette",role:"listbox","aria-label":"slash commands",children:Fe.length?Fe.map((R,Z)=>o.jsxs("div",{role:"option","aria-selected":Z===c,className:`slash-item ${Z===c?"sel":""}`,onMouseEnter:()=>u(Z),onClick:()=>ht(R.name),children:[o.jsxs("span",{className:"cmd",children:["/",R.name]}),R.description?o.jsx("span",{className:"desc",children:R.description}):null,o.jsx("span",{className:"src",title:"advertised by the agent over ACP",children:"agent"})]},R.name)):o.jsx("div",{className:"slash-item empty",children:e.info.commands.length?`no command matches “/${Se}”`:"this agent advertises no slash commands"})}),N&&o.jsx(j5,{v:e,prefs:G,setPrefs:q,onClose:()=>P(!1),panelRef:f}),k.length>0&&o.jsxs("div",{className:"draft-row",children:[k.map(R=>o.jsxs("span",{className:`draft ${R.kind}`,title:`${R.name} · ${C1(R.bytes)}`,children:[R.preview?o.jsx("img",{src:R.preview,alt:R.name}):o.jsx(Jn,{size:13}),o.jsx("span",{className:"draft-name",children:R.name}),o.jsx("button",{className:"draft-x","aria-label":`remove ${R.name}`,onClick:()=>j(Z=>Z.filter(_e=>_e.id!==R.id)),children:o.jsx(wn,{size:11})})]},R.id)),o.jsx("button",{className:"draft-clear",onClick:()=>j([]),children:"clear"})]}),D&&o.jsx("div",{className:"composer-note err",children:D}),e.queue.length>0&&o.jsxs("div",{className:"queue-list","aria-label":"queued messages",children:[o.jsxs("div",{className:"queue-head",children:[o.jsxs("span",{className:"queue-title",children:["Queued · ",e.queue.length]}),o.jsx("span",{className:"queue-hint",children:e.queue.some(R=>R.unsure)?"未确认送达 — 点 ↑ 重发,或 ✕ 丢掉":e.queue.some(R=>R.inflight)?"sending…":e.resuming?"waking the agent — sends once it is up":e.info.cold?"sends when you wake this session":e.info.status!=="ready"?"process starting — sends once ready":"goes out when this turn ends"})]}),e.queue.map((R,Z)=>o.jsxs("div",{className:`queue-row${R.inflight?" inflight":""}${R.unsure?" unsure":""}`,"data-queue-id":R.id,children:[o.jsx("span",{className:"queue-idx","aria-hidden":"true",children:Z+1}),I?.id===R.id?o.jsx("textarea",{className:"queue-edit",rows:1,autoFocus:!0,value:I.text,"aria-label":"edit the queued message",onChange:_e=>A({id:R.id,text:_e.target.value}),onKeyDown:_e=>{if(_e.key==="Escape"){_e.preventDefault(),A(null);return}_e.key==="Enter"&&!_e.shiftKey&&(_e.preventDefault(),X.editQueued(e.info.id,R.id,I.text),A(null))},onBlur:()=>{X.editQueued(e.info.id,R.id,I.text),A(null)}}):o.jsx("span",{className:"queue-text",title:R.text,children:R.text}),R.unsure?o.jsx("span",{className:"queue-flag",title:"服务器没回执 —— 点 ↑ 重发",children:"未送达"}):null,o.jsxs("span",{className:"queue-actions",children:[o.jsx("button",{className:"queue-btn",title:"send now — stops the running turn and takes the floor","aria-label":"send this one now",onClick:()=>X.sendQueuedNow(e.info.id,R.id),children:o.jsx(Iw,{size:13})}),o.jsx("button",{className:"queue-btn",title:"edit this message","aria-label":"edit this queued message",onClick:()=>A(I?.id===R.id?null:{id:R.id,text:R.text}),children:o.jsx(jw,{size:13})}),o.jsx("button",{className:"queue-btn danger",title:"drop it — it will not be sent","aria-label":"drop this queued message",onClick:()=>X.dropQueued(e.info.id,R.id),children:o.jsx(wn,{size:13})})]})]},R.id))]}),ue.note?o.jsx("div",{className:"composer-note",children:ue.note}):null,ue.error?o.jsx("div",{className:"composer-note err",children:ue.error}):null,fe||te.status==="transcribing"||te.error?o.jsxs("div",{className:`dict-chip ${te.error?"err":""}`,children:[o.jsx(sr,{size:13}),te.error?te.error:te.status==="requesting"?"waiting for the microphone…":te.status==="transcribing"?"transcribing…":o.jsxs(o.Fragment,{children:[te.text," ",o.jsx("span",{className:"interim",children:te.interim}),te.engine==="stream"?" · 流式":"",te.engine==="server"?` · ${te.seconds}s`:""]}),fe?o.jsx("button",{className:"dict-stop",onClick:()=>we.stop(),children:"stop"}):null]}):null,o.jsxs("div",{className:"composer-box",children:[o.jsx("textarea",{ref:Ie,rows:1,value:n,onFocus:()=>d(!1),placeholder:e.resuming?"waking the agent…":e.info.cold?"no ACP process — Enter wakes it":Rr(e)?l:e.info.status==="ready"?r:e.info.status,onChange:R=>{i(R.target.value),d(!1),u(0),v.current?v.current=!1:x.current=null},onCompositionStart:()=>{y.current=!0},onCompositionEnd:()=>{y.current=!1},onKeyDown:R=>{if(!(y.current||R.nativeEvent.isComposing)){if(R.key==="Enter"&&(R.metaKey||R.ctrlKey)&&!R.shiftKey){R.preventDefault(),xe();return}if(je&&Fe.length){if(R.key==="ArrowDown"){R.preventDefault(),u(Z=>(Z+1)%Fe.length);return}if(R.key==="ArrowUp"){R.preventDefault(),u(Z=>(Z-1+Fe.length)%Fe.length);return}if(R.key==="Tab"||R.key==="Enter"&&!R.shiftKey){R.preventDefault(),ht(Fe[c].name);return}if(R.key==="Escape"){R.preventDefault(),i("");return}}if(!Ze(R)){if(R.key==="Escape"&&x.current!==null){R.preventDefault(),x.current=null,i(g.current);return}R.key==="Enter"&&!R.shiftKey&&(R.preventDefault(),Xe())}}}}),o.jsxs("div",{className:"composer-bar",ref:m,children:[o.jsx("input",{ref:lt,type:"file",multiple:!0,hidden:!0,accept:`${pg.join(",")},.txt,.md,.json,.log,.csv,.ts,.tsx,.js,.jsx,.py,.rb,.go,.rs,.java,.c,.cpp,.h,.sh,.yaml,.yml,.toml,.ini,.html,.css`,onChange:R=>{const Z=R.target.files;Z&&Z.length?Je(Z):O("选择器没有返回文件 —— 再试一次,或从相册 / 文件管理里选"),R.target.value=""}}),o.jsx("button",{className:"icon-btn",title:"attach an image or a text file","aria-label":"attach",onClick:()=>lt.current?.click(),children:o.jsx(_u,{size:16})}),Qe&&Y?o.jsxs("div",{className:"tb-wrap",style:{"--effort":Y.color},children:[o.jsxs("button",{type:"button",className:`tb-btn tb-effort ${B==="effort"?"on":""}`,style:{color:Y.level?Y.color:void 0},title:`thinking depth — ${Oe||"agent default"}`,"aria-label":`thinking depth: ${Oe||"agent default"}`,"aria-expanded":B==="effort","data-testid":"tb-effort",onClick:()=>{P(!1),T(R=>R==="effort"?null:"effort")},children:[o.jsx(N1,{level:Y.level,total:Y.total,color:Y.color}),o.jsx(Io,{size:11,className:"tb-chev"})]}),B==="effort"?o.jsx(Bu,{items:(Qe.options??[]).map((R,Z)=>({value:String(R.value),name:R.name,hint:null,color:ir[Math.min(Z,ir.length-1)]})),current:String(Qe.currentValue??""),empty:"the agent advertises no levels",onPick:R=>{X.send({t:"set-config",sessionId:e.info.id,configId:Qe.id,value:R}),T(null)}}):null]}):null,o.jsx("button",{className:`icon-btn ${N?"on":""}`,title:"chat settings — permission mode, voice","aria-label":"chat settings","aria-expanded":N,onClick:()=>{T(null),P(R=>!R)},children:o.jsx(Al,{size:16})}),be.length>0||ke?o.jsx(R1,{label:"model",title:`model — currently ${Ae||"unknown"}`,icon:o.jsx(Im,{size:15}),value:$?`${Ae} …`:Ae,testId:"tb-model",open:B==="model",onToggle:()=>{P(!1),T(R=>R==="model"?null:"model")},children:be.length>0?o.jsx(zw,{models:be,current:W,bad:ne,err:z,onPick:R=>{if(R===W){T(null);return}E(!0),H(null),X.setModel(e.info.id,R).then(()=>{T(null),H(null),O("")}).catch(Z=>{const _e=String(Z?.message??Z);H({id:R,text:_e}),ae(Pe=>({...Pe,[R]:_e})),O(`model switch failed: ${_e}`)}).finally(()=>E(!1))}}):o.jsx(Bu,{items:(ke?.options??[]).map(R=>({value:String(R.value),name:R.name})),current:String(ke?.currentValue??""),empty:"the agent lists no models",onPick:R=>{ke&&X.send({t:"set-config",sessionId:e.info.id,configId:ke.id,value:R}),T(null)}})}):null,o.jsx("span",{className:"head-spacer"}),ue.speaking?o.jsx("button",{className:"icon-btn on",title:"stop reading aloud","aria-label":"stop reading",onClick:()=>Mt.stop(),children:o.jsx(vE,{size:14})}):null,o.jsx("button",{className:`icon-btn ${fe?"on rec":""}`,title:te.error?te.error:fe?"stop dictation":"dictate a prompt","aria-label":"dictate",onClick:()=>{we.cancel(),we.start(G,e.info.id)},children:o.jsx(sr,{size:16})}),t?o.jsx(KD,{sessionId:e.info.id,onClose:s,onKeyboard:()=>{s(),window.setTimeout(()=>Ie.current?.focus(),30)},renderTranscript:R=>o.jsx(_1,{...R,notes:e.notes})}):null,Rr(e)?o.jsx("button",{className:"send-btn stop",title:"stop this turn","aria-label":"stop this turn",onClick:()=>X.send({t:"cancel",sessionId:e.info.id}),children:o.jsx(Am,{size:14})}):o.jsx("button",{className:"send-btn",onClick:Xe,disabled:!n.trim()&&!k.length||e.resuming||!e.info.cold&&e.info.status!=="ready",title:e.resuming?"正在唤醒 agent 进程…":e.info.cold?"唤醒会话 (Enter)":"send (Enter)","aria-label":"send",children:o.jsx(Dm,{size:16})})]})]})]})]})}function A5({backend:e}){const t=ah(e),[s,n]=_.useState(!1);return o.jsx("span",{className:"be-card-mark","data-backend":e,"data-letter":t.letter,children:t.icon&&!s?o.jsx("img",{src:t.icon,alt:"",draggable:!1,onError:()=>n(!0)}):t.letter})}function D5({cwd:e,onClose:t}){Wo(!0,t);const[s,n]=_.useState(""),[i,r]=_.useState(e??""),a=e??"",[l,c]=_.useState(""),[u,h]=_.useState([]),[d,p]=_.useState(""),[f,m]=_.useState(!1),[y,x]=_.useState(""),[g,v]=_.useState(!0),[b,w]=_.useState([]),[k,j]=_.useState(!1),[I,A]=_.useState(!1),[D,O]=_.useState(null),[F,C]=_.useState(null),[N,P]=_.useState(null),[B,T]=_.useState(null),[$]=lr(),E=Fm(),z=E.status==="listening"||E.status==="recording"||E.status==="requesting",H=_.useRef(!1),ne=_.useRef(null),ae=_.useRef(null);_.useEffect(()=>{const W=ne.current;W&&(W.style.height="42px",W.style.height=`${Math.min(W.scrollHeight,window.innerHeight*.4)}px`)},[l]);const G=()=>{v(!0),x(""),Promise.all([X.loadBackends(),fetch("/api/version",{cache:"no-store"}).then(W=>W.json()).catch(()=>({dev:!1})),fetch("/api/fs/dirs",{cache:"no-store"}).then(W=>W.json()).catch(()=>({}))]).then(([W,he,Ae])=>{w(W),j(!!he?.dev),n(Oe=>Oe||qv(W,!!he?.dev)[0]?.id||""),r(Oe=>Oe||Ae?.home||"")}).catch(W=>x(`后端列表拉取失败:${String(W.message??W)}`)).finally(()=>v(!1))};_.useEffect(G,[]),_.useLayoutEffect(()=>(we.setOwner("start"),()=>we.setOwner("chat")),[]),_.useEffect(()=>{if(!we.owns("start")||E.status!=="idle"||!E.text)return;const W=we.consume();W&&(c(he=>he.trim()?`${he.trim()} ${W}`:W),ne.current?.focus())},[E.status,E.text]);const q=qv(b,k),te=b.find(W=>W.id===s)??null,ue=te?.handshake??null,Ie=ue?.configOptions??[],lt=Cl(Ie,"effort"),Je=lt?.options??[],$e=F??String(lt?.currentValue??""),Ze=lt?E1($e,Je):null,Xe=Je.find(W=>String(W.value)===$e)?.name??"",xe=ue?.modes?.available??[],Se=N??ue?.modes?.currentModeId??"",Fe=Se?ue?.modes?.names?.[Se]??Se:"默认权限",je=ue?.models?.available??[],ht=D??ue?.models?.currentModelId??"",fe=ht?Pm(ht):"默认模型",Qe=()=>{const W=[];return D&&W.push({kind:"model",value:D}),F&<&&W.push({kind:"config",id:String(lt.id),value:F}),N&&W.push({kind:"mode",value:N}),W},ke=async W=>{const he=Array.from(W);if(!he.length)return;const Ae=await Promise.all(he.map(R=>S1(R))),Oe=[],Y=[];for(const R of Ae)"error"in R?Y.push(R.error):Oe.push(R);Oe.length&&h(R=>[...R,...Oe]),p(Y.join(" · "))},be=async()=>{const W=l.trim();if(!(!W&&!u.length||!s||!i.trim())){m(!0),x("");try{z&&we.stop();const he=u.map(Oe=>Oe.kind==="image"?{kind:"image",mimeType:Oe.mimeType,data:Oe.payload,name:Oe.name}:{kind:"text",name:Oe.name,text:Oe.payload}),Ae=await X.createSession(s,i.trim(),"");X.queueSetup(Ae,Qe()),X.setActive(Ae),X.enqueuePrompt(Ae,W,he),t()}catch(he){x(String(he.message??he))}finally{m(!1)}}};return o.jsx("div",{className:"modal-bg",onClick:t,children:o.jsxs("div",{className:"modal start-page",onClick:W=>W.stopPropagation(),children:[o.jsxs("div",{className:"start-head",children:[o.jsx("h3",{children:"新建会话"}),o.jsx(JD,{value:a||i,onChange:r,locked:!!a})]}),o.jsx("div",{className:"composer start-composer",onPaste:W=>{const he=k1(W.clipboardData);he.length&&(W.preventDefault(),ke(he))},children:o.jsxs("div",{className:"composer-inner",children:[u.length>0&&o.jsxs("div",{className:"draft-row",children:[u.map(W=>o.jsxs("span",{className:`draft ${W.kind}`,title:`${W.name} · ${C1(W.bytes)}`,children:[W.preview?o.jsx("img",{src:W.preview,alt:W.name}):o.jsx(Jn,{size:13}),o.jsx("span",{className:"draft-name",children:W.name}),o.jsx("button",{className:"draft-x","aria-label":`remove ${W.name}`,onClick:()=>h(he=>he.filter(Ae=>Ae.id!==W.id)),children:o.jsx(wn,{size:11})})]},W.id)),o.jsx("button",{className:"draft-clear",onClick:()=>h([]),children:"clear"})]}),d&&o.jsx("div",{className:"composer-note err",children:d}),o.jsxs("div",{className:"composer-box",children:[o.jsx("textarea",{ref:ne,rows:1,autoFocus:!0,value:l,"aria-label":"first message",placeholder:"say something to start… (Enter sends)",onChange:W=>c(W.target.value),onCompositionStart:()=>{H.current=!0},onCompositionEnd:()=>{H.current=!1},onKeyDown:W=>{H.current||W.nativeEvent.isComposing||W.key==="Enter"&&!W.shiftKey&&(W.preventDefault(),be())}}),o.jsxs("div",{className:"composer-bar",children:[o.jsx("input",{ref:ae,type:"file",multiple:!0,hidden:!0,accept:`${pg.join(",")},.txt,.md,.json,.log,.csv,.ts,.tsx,.js,.jsx,.py,.rb,.go,.rs,.java,.c,.cpp,.h,.sh,.yaml,.yml,.toml,.ini,.html,.css`,onChange:W=>{const he=W.target.files;he&&he.length?ke(he):p("选择器没有返回文件 —— 再试一次,或从相册 / 文件管理里选"),W.target.value=""}}),o.jsx("button",{className:"icon-btn",title:"attach an image or a text file","aria-label":"attach",onClick:()=>ae.current?.click(),children:o.jsx(_u,{size:16})}),lt&&Je.length?o.jsxs("div",{className:"tb-wrap",style:{"--effort":Ze?.color},children:[o.jsxs("button",{type:"button",className:`tb-btn tb-effort ${B==="effort"?"on":""}`,style:{color:$e?Ze?.color:void 0},title:`thinking depth — ${Xe||"agent default"}`,"aria-label":`thinking depth: ${Xe||"agent default"}`,"aria-expanded":B==="effort","data-testid":"start-effort",onClick:()=>T(W=>W==="effort"?null:"effort"),children:[o.jsx(N1,{level:Ze?.level??0,total:Ze?.total??1,color:Ze?.color??"var(--text-dim)"}),o.jsx(Io,{size:11,className:"tb-chev"})]}),B==="effort"?o.jsx(Bu,{items:Je.map((W,he)=>({value:String(W.value),name:String(W.name??W.value),hint:null,color:ir[Math.min(he,ir.length-1)]})),current:$e,empty:"the agent advertises no levels",onPick:W=>{C(W),T(null)}}):null]}):null,xe.length?o.jsxs("div",{className:"tb-wrap",children:[o.jsxs("button",{type:"button",className:`tb-btn ${B==="mode"?"on":""}`,title:`权限模式 — ${Fe}`,"aria-label":`permission mode: ${Fe}`,"aria-expanded":B==="mode","data-testid":"start-mode",onClick:()=>T(W=>W==="mode"?null:"mode"),children:[o.jsx(Mw,{size:14}),o.jsx("span",{className:"tb-label",children:Fe}),o.jsx(Io,{size:11,className:"tb-chev"})]}),B==="mode"?o.jsx(Bu,{items:xe.map(W=>({value:W,name:ue?.modes?.names?.[W]??W})),current:Se,empty:"the agent lists no modes",onPick:W=>{P(W),T(null)}}):null]}):null,je.length?o.jsx(R1,{label:"model",title:`model — ${fe}`,icon:o.jsx(Im,{size:15}),value:fe,testId:"start-model",open:B==="model",onToggle:()=>T(W=>W==="model"?null:"model"),children:o.jsx(zw,{models:je.map(W=>({modelId:W})),current:ht,onPick:W=>{O(W),T(null)}})}):null,o.jsx("span",{className:"head-spacer"}),o.jsx("button",{className:`icon-btn ${z?"on rec":""}`,title:E.error?E.error:z?"stop dictation":"dictate a prompt","aria-label":"dictate",onClick:()=>{we.cancel(),we.start($)},children:o.jsx(sr,{size:16})}),o.jsx("button",{className:"send-btn",onClick:()=>void be(),disabled:f||!l.trim()&&!u.length||!i.trim(),title:f?"创建中…":"创建并发送 (Enter)","aria-label":"send",children:o.jsx(Dm,{size:16})})]})]}),z||E.status==="transcribing"||E.error?o.jsxs("div",{className:`dict-chip ${E.error?"err":""}`,children:[o.jsx(sr,{size:13}),E.error?E.error:E.status==="requesting"?"waiting for the microphone…":E.status==="transcribing"?"transcribing…":o.jsxs(o.Fragment,{children:[E.text," ",o.jsx("span",{className:"interim",children:E.interim})]}),z?o.jsx("button",{className:"dict-stop",onClick:()=>we.stop(),children:"stop"}):null]}):null]})}),o.jsxs("div",{className:"backend-pick",role:"radiogroup","aria-label":"backend",children:[g&&!b.length&&o.jsx("span",{className:"dim",children:"loading…"}),!g&&!q.length&&o.jsx("span",{className:"dim",children:"no backends"}),q.map(W=>o.jsxs("button",{type:"button",role:"radio","aria-checked":s===W.id,"data-backend":W.id,title:W.home?`${W.label} · home: ${W.home}`:W.label,className:`be-card ${s===W.id?"sel":""}`,onClick:()=>n(W.id),children:[o.jsx(A5,{backend:W.kind||W.id}),o.jsx("span",{className:"be-card-label",children:W.label})]},W.id)),o.jsx("button",{type:"button",className:"be-card reload",title:"重新拉取后端列表","aria-label":"重新拉取后端列表",onClick:G,children:"⟳"})]}),(te?.warnings??[]).map((W,he)=>o.jsx("div",{className:"hint-warn",children:W},he)),te?o.jsxs("div",{className:`be-detail ${I?"open":""}`,children:[o.jsxs("button",{type:"button",className:"be-detail-head","aria-expanded":I,onClick:()=>A(W=>!W),children:[o.jsx(en,{size:12,className:"be-detail-arrow"})," 后端详情"]}),I?o.jsxs("div",{className:"hint be-hint",children:[o.jsxs("div",{children:["runs: ",o.jsxs("code",{children:[te.cmd," ",(te.args??[]).join(" ")]}),te.profile?o.jsxs(o.Fragment,{children:[" · profile ",o.jsx("code",{children:te.profile})]}):null]}),te.home?o.jsxs("div",{children:["home: ",o.jsx("code",{children:te.home})]}):null,te.cwd?o.jsxs("div",{children:["cwd: ",o.jsx("code",{children:te.cwd})]}):null,(te.env??[]).length?o.jsxs("div",{children:["env: ",o.jsx("code",{children:(te.env??[]).join(", ")})]}):null,ue&&!Ie.length&&!je.length?o.jsx("div",{children:"这个后端还没真跑过,所以没有可选的模型 / 设置 —— 建会话后由 agent 自己的清单决定"}):null]}):null]}):null,y&&o.jsx("div",{className:"err",children:y})]})})}DA();window.__cockpit=X;window.__voice={dictation:we,loadVoiceCaps:vu,resampleToPcm16:Xw,voiceCaps:Vn};window.__renderMarkdown=Xm;Ew(document.getElementById("root")).render(o.jsx(K1.StrictMode,{children:o.jsx(zP,{})}));
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
+
* https://github.com/chjj/term.js
|
|
5
|
+
* @license MIT
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
* THE SOFTWARE.
|
|
24
|
+
*
|
|
25
|
+
* Originally forked from (with the author's permission):
|
|
26
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
+
* http://bellard.org/jslinux/
|
|
28
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
+
* The original design remains. The terminal itself
|
|
30
|
+
* has been extended to include xterm CSI codes, among
|
|
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;inset: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;inset: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;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: #0c1116;--bg-panel: #121a22;--bg-raised: #182430;--line: #223140;--text: #e3ecf3;--text-dim: #b6bec3;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #295f7b;--ok: #4ec9a0;--err: #e57373;--err-rgb: 229, 115, 115;--thought: #8f7bd7;--tool: #5ba8d4;--code-bg: #0a0f14;--code-fg: #d7e2ea;--code-bar: rgba(255, 255, 255, .06);--code-line: rgba(255, 255, 255, .1);--chip-bg: #1e2b38;--on-accent: #101820;--accent-text: #4aacdf;--scrim: rgba(0, 0, 0, .55);--shadow: 0 18px 40px rgba(0, 0, 0, .45);--scroll-thumb: rgba(255, 255, 255, .18);--scroll-thumb-hover: rgba(255, 255, 255, .34);--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace}:root[data-theme=light]{--bg: #f4f6f9;--bg-panel: #ffffff;--bg-raised: #eaeef4;--line: #d7dde6;--text: #1c2735;--text-dim: #3f4750;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #9bd1ed;--ok: #1f9d75;--err: #c2453f;--err-rgb: 194, 69, 63;--thought: #6d5bc4;--tool: #2f7fb5;--code-bg: #10171f;--code-fg: #cfd8e3;--code-bar: rgba(255, 255, 255, .07);--code-line: rgba(255, 255, 255, .12);--chip-bg: #e8ecf2;--accent-text: #16659b;--on-accent: #101820;--scrim: rgba(12, 17, 22, .42);--shadow: 0 18px 40px rgba(23, 36, 48, .18);--scroll-thumb: rgba(12, 17, 22, .22);--scroll-thumb-hover: rgba(12, 17, 22, .38)}@media (prefers-color-scheme: light){:root[data-theme=system]{--bg: #f4f6f9;--bg-panel: #ffffff;--bg-raised: #eaeef4;--line: #d7dde6;--text: #1c2735;--text-dim: #3f4750;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #9bd1ed;--ok: #1f9d75;--err: #c2453f;--err-rgb: 194, 69, 63;--thought: #6d5bc4;--tool: #2f7fb5;--code-bg: #10171f;--code-fg: #cfd8e3;--code-bar: rgba(255, 255, 255, .07);--code-line: rgba(255, 255, 255, .12);--chip-bg: #e8ecf2;--accent-text: #16659b;--on-accent: #101820;--scrim: rgba(12, 17, 22, .42);--shadow: 0 18px 40px rgba(23, 36, 48, .18);--scroll-thumb: rgba(12, 17, 22, .22);--scroll-thumb-hover: rgba(12, 17, 22, .38)}}*{box-sizing:border-box}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-corner{background:transparent}*::-webkit-scrollbar-thumb{background-color:transparent;border:2px solid transparent;border-radius:999px;background-clip:padding-box}*:hover::-webkit-scrollbar-thumb{background-color:var(--scroll-thumb)}*::-webkit-scrollbar-thumb:hover{background-color:var(--scroll-thumb-hover)}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:15px/1.5 -apple-system,Segoe UI,PingFang SC,Noto Sans SC,sans-serif;-webkit-font-smoothing:antialiased}button{font:inherit}.app{display:flex;height:100%;overflow:hidden}.sidebar{width:var(--rail-w, 268px);flex:0 0 var(--rail-w, 268px);background:var(--bg-panel);border-right:1px solid var(--line);display:flex;flex-direction:column;position:relative}.sidebar header{padding:14px 16px 10px;display:flex;align-items:baseline;gap:8px;min-width:0}.sidebar header>*{min-width:0}.sidebar header .logo{color:var(--accent-text);font-weight:700;letter-spacing:.5px;display:inline-flex;align-items:center;gap:7px;flex:0 0 auto}.brand-mark{display:block;flex:0 0 auto}.sidebar header .tagline{font-size:11px;color:var(--text-dim);flex:1 1 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-btn{margin:0 12px 10px;padding:9px;border-radius:8px;cursor:pointer;border:1px dashed var(--accent-dim);background:transparent;color:var(--accent-text)}.new-btn:hover{background:rgba(var(--accent-rgb),.08)}.rail-search{margin:0 8px 6px;padding:7px 9px;border-radius:8px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);font-size:12.5px;font-family:var(--mono)}.rail-search:focus{outline:none;border-color:var(--accent-dim)}.rail-search::placeholder{color:var(--text-dim);opacity:1}.load-earlier{display:flex;justify-content:center;margin-bottom:10px}.load-earlier-busy,.load-earlier-end{font-size:11px;color:var(--text-dim);line-height:1.6}.cold-purge{margin-left:auto;background:transparent;border:1px solid transparent;color:var(--text-dim);font-size:11px;line-height:1;padding:2px 5px;border-radius:5px;cursor:pointer}.session-item.cold:hover .cold-purge{border-color:var(--line);color:var(--err)}.session-list{flex:1;overflow-y:auto;padding:0 8px 8px}.session-item{padding:10px;border-radius:8px;cursor:pointer;margin-bottom:4px;border:1px solid transparent}.session-item:hover{background:var(--bg-raised)}.session-item.active{background:var(--bg-raised);border-color:var(--line)}.session-item .title{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-item .meta{font-size:11.5px;color:var(--text-dim);display:flex;gap:8px;margin-top:3px;align-items:center}.dot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}.dot.ready{background:var(--ok)}.dot.running{background:var(--accent);animation:pulse 1s infinite}.dot.starting{background:var(--text-dim)}.dot.error,.dot.closed{background:var(--err)}.rail-sep{display:flex;justify-content:space-between;align-items:baseline;padding:12px 10px 6px;font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:var(--text-dim);border-top:1px solid var(--line);margin:8px 4px 0}.session-item.cold:hover{background:rgba(var(--accent-rgb),.06)}.dot.cold{background:transparent;border:1px solid var(--text-dim)}.hint{color:var(--text-dim)}@keyframes pulse{50%{opacity:.35}}.badge{font-size:10.5px;border:1px solid var(--line);border-radius:5px;padding:0 5px;color:var(--text-dim)}.badge.perm{border-color:var(--accent-dim);color:var(--accent-text)}.badge.bg{border-color:var(--accent-dim);color:var(--accent-text);font-variant-numeric:tabular-nums;display:inline-flex;align-items:center;gap:3px}.bg-row{border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:8px;margin-bottom:6px;background:var(--bg-panel)}.bg-head{display:flex;align-items:center;gap:7px;width:100%;padding:3px 8px;background:none;border:0;color:var(--text-dim);font:inherit;text-align:left;cursor:pointer}.bg-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--accent)}.bg-dot[data-state=exited]{background:var(--text-dim)}.bg-dot[data-wake="1"]{animation:pulse 1.8s ease-in-out infinite}@media (prefers-reduced-motion: reduce){.bg-dot[data-wake="1"]{animation:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 45%,transparent)}}.bg-text{flex:0 0 auto;white-space:nowrap;font-size:12.5px;color:var(--text)}.bg-hint{flex:1 1 auto;min-width:0;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-caret{flex:0 0 auto;font-size:10px;opacity:.7}.bg-list{list-style:none;margin:0;padding:2px 8px 6px;border-top:1px solid var(--line);max-height:40vh;overflow:auto}.bg-item{display:block;padding:4px 0;border-top:1px dashed var(--line)}.bg-item:first-child{border-top:0}.bg-tag{display:inline-block;margin-bottom:2px;padding:0 6px;border-radius:999px;border:1px solid var(--accent);color:var(--accent-text, var(--accent));font-size:9.5px;line-height:15px;letter-spacing:.02em}.bg-item[data-kind=delegation] .bg-cmd-full{color:var(--text);font-style:italic}.bg-cmd-full{margin:0;max-height:132px;overflow:auto;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;line-height:1.45;white-space:pre-wrap;word-break:break-word;color:var(--text)}.bg-item-foot{display:flex;align-items:center;gap:10px;margin-top:2px}.bg-cmd{flex:1 1 auto;min-width:0;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-meta{flex:0 0 auto;color:var(--text-dim);font-variant-numeric:tabular-nums}.bg-item[data-state=exited] .bg-meta{color:var(--accent-text)}.bg-notice{border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:7px;background:var(--bg-panel);max-width:100%}.bg-notice[data-ok=fail]{border-left-color:var(--err)}.bg-notice-head{display:flex;align-items:center;gap:7px;width:100%;padding:4px 8px;background:none;border:0;color:var(--text-dim);font:inherit;text-align:left;cursor:pointer}.bg-notice-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--accent)}.bg-notice[data-ok=fail] .bg-notice-dot{background:var(--err)}.bg-notice-title{flex:0 0 auto;font-size:12.5px;color:var(--text)}.bg-notice-cmd{flex:1 1 auto;min-width:0;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-notice-code{flex:0 0 auto;font-size:11.5px;color:var(--text-dim);font-variant-numeric:tabular-nums}.bg-notice-caret{flex:0 0 auto;font-size:10px;opacity:.7}.bg-notice-body{border-top:1px solid var(--line);padding:4px 8px 7px}.bg-notice-label{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim);margin-top:3px}.bg-notice-pre{margin:2px 0 0;padding:5px 7px;border-radius:5px;background:var(--bg-code, rgba(127, 127, 127, .07));font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;line-height:1.45;white-space:pre-wrap;word-break:break-word;max-height:260px;overflow:auto}@media (max-width: 720px){.bg-notice-cmd{font-size:11px}}.deleg-notice .bg-notice-cmd{font-variant-numeric:normal}.deleg-task{margin-top:7px;padding-top:6px;border-top:1px dashed var(--line)}.deleg-task:first-of-type{margin-top:4px;padding-top:0;border-top:0}.deleg-task-head{display:flex;align-items:baseline;gap:6px}.deleg-mark{flex:0 0 auto;font-size:11.5px;color:var(--accent)}.deleg-task[data-ok=fail] .deleg-mark{color:var(--err)}.deleg-goal{flex:1 1 auto;min-width:0;font-size:12.5px;color:var(--text);word-break:break-word}.deleg-meta{flex:0 0 auto;font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.deleg-body{margin:3px 0 0 13px;max-height:340px;overflow:auto;overscroll-behavior:contain;font-size:12.5px}.deleg-body>:first-child{margin-top:0}.deleg-body>:last-child{margin-bottom:0}@media (max-width: 720px){.deleg-body{max-height:55vh}.deleg-meta{display:none}}@media (max-width: 720px){.bg-hint{display:none}.bg-text{font-size:12px}}.sidebar footer{padding:10px 14px;font-size:11.5px;color:var(--text-dim);border-top:1px solid var(--line)}.sidebar footer .conn.off{color:var(--err)}.main{flex:1;display:flex;flex-direction:column;min-width:0}.chat-head{padding:7px 10px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:6px;flex-wrap:nowrap;background:var(--bg-panel);min-height:46px}.chat-head .title{font-weight:600;font-size:14px;flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-btn .spin,.sess-menu-item .spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.icon-btn .spin,.sess-menu-item .spin{animation:none}}.head-spacer{flex:1 1 auto;min-width:4px}.speak-wrap{position:relative;display:inline-flex}.speak-wrap .auto-read{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:manipulation}.speak-dot{position:absolute;top:4px;right:4px;width:5px;height:5px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 1.5px var(--bg-panel)}.speak-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:40;min-width:240px;max-height:min(70vh,420px);overflow-y:auto;overscroll-behavior:contain;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 30px #00000052;padding:3px;display:flex;flex-direction:column}.speak-menu-item{display:flex;align-items:center;gap:7px;text-align:left;width:100%;background:none;border:1px solid transparent;border-radius:7px;color:var(--text);font:inherit;font-size:12.5px;padding:7px 8px;cursor:pointer}.speak-menu-item:hover{background:var(--bg-panel);border-color:var(--line)}.speak-menu-item.on{color:var(--text);font-weight:600}.speak-check{width:10px;flex:0 0 10px;color:var(--accent);font-size:11px}.speak-hint{margin:2px 4px 4px;padding-top:6px;border-top:1px solid var(--line);font-size:11px;line-height:1.5;color:var(--text-dim)}.bubble-speak{position:relative;display:inline-flex}.bubble-btn .spin{animation:spin 1s linear infinite}@media (prefers-reduced-motion: reduce){.bubble-btn .spin{animation:none}}.bubble-menu{top:auto;bottom:calc(100% + 6px);right:0;min-width:232px}.speech-note{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;margin-top:6px;padding-top:5px;border-top:1px dashed var(--line);font-size:11px;line-height:1.55}.speech-note-tag{flex:0 0 auto;font:inherit;font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--accent);background:none;border:1px solid var(--line);border-radius:5px;padding:0 5px;cursor:pointer}.speech-note-text{flex:1 1 240px;min-width:0;color:var(--text-dim);cursor:pointer;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.speech-note.open .speech-note-text{display:inline;-webkit-line-clamp:unset;overflow:visible}.speech-note-meta{flex:0 0 auto;color:var(--text-dim);opacity:.75;font-size:10.5px}.speech-note-x{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;background:none;border:0;padding:0 2px;color:var(--text-dim);cursor:pointer;opacity:.6}.speech-note-x:hover{opacity:1;color:var(--text)}.bubble-note.err{color:var(--err)}.turn-pulse{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--ok);animation:pulse 1.4s infinite}.turn-pulse.quiet{background:var(--accent);animation-duration:2.6s}@media (prefers-reduced-motion: reduce){.turn-pulse{animation:none}}.head-actions{display:inline-flex;align-items:center;gap:0;flex:0 0 auto}.head-actions .icon-btn{width:28px;height:28px}.chat-head .icon-btn svg{width:18px;height:18px}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;flex:0 0 auto;padding:0;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--text-dim);cursor:pointer}.icon-btn:hover{background:var(--bg-raised);border-color:var(--line);color:var(--text)}.icon-btn.danger:hover{color:var(--err);border-color:var(--err)}.chip{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;font-size:11px;padding:2px 7px;border-radius:999px}.perm-chip{border:1px solid var(--accent-dim);color:var(--accent-text)}.perm-pulse{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:pulse 1.2s infinite}.ghost-btn{background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:4px 10px;cursor:pointer;font-size:12.5px}.ghost-btn:hover{color:var(--text);border-color:var(--text-dim)}.ghost-btn.danger:hover{color:var(--err);border-color:var(--err)}.stream-wrap{flex:1;min-height:0;position:relative;display:flex}.stream{flex:1;overflow-y:auto;padding:18px 0;overscroll-behavior:contain}.stream:focus{outline:none}.stream-hint{display:flex;gap:7px;padding:2px 0;color:var(--text-dim);font-size:12.5px;align-items:baseline;flex-wrap:nowrap;min-width:0}.stream-hint>span{flex:0 0 auto;white-space:nowrap}.stream-hint .elapsed{opacity:.75;font-variant-numeric:tabular-nums}.status-note{display:flex;gap:8px;align-items:baseline;margin:6px 0 6px 10px;padding:1px 0 1px 9px;border-left:2px solid var(--line);font-size:11.5px;line-height:1.45;color:var(--text-dim)}.status-note-time{flex:0 0 auto;font-family:var(--mono);font-size:10.5px;opacity:.6;font-variant-numeric:tabular-nums}.status-note-text{flex:1 1 auto;min-width:0;overflow-wrap:anywhere}.status-note[data-kind=warn]{color:var(--warn, #c07a12);border-left-color:var(--warn, #c07a12)}.status-note[data-kind=compacted]{color:var(--ok, #3f8f5f);border-left-color:var(--ok, #3f8f5f)}.status-note{flex-wrap:wrap}.status-note-text{flex:0 1 auto}.status-note-toggle{flex:0 0 auto;padding:0 5px;border-radius:4px;margin-left:2px;border:1px solid var(--line);background:transparent;color:var(--text-dim);font-size:10.5px;line-height:15px;cursor:pointer}.status-note-toggle:hover{color:var(--text);border-color:var(--text-dim)}.status-note-drawer-wrap{flex:0 0 100%;min-width:0}.status-note-drawer{width:100%;max-width:78ch;position:relative;margin:5px 0 1px;border:1px solid var(--line);border-radius:7px;background:var(--panel-2, rgba(127, 127, 127, .04));overflow:hidden}.status-note-drawer-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:3px 9px;border-bottom:1px solid var(--line);font-size:10px;line-height:16px;color:var(--text-dim);opacity:.72}.status-note-drawer-hint{flex:0 0 auto;font-variant-numeric:tabular-nums}.status-note-drawer[data-scroll="1"]:after{content:"";position:absolute;left:1px;right:1px;bottom:1px;height:20px;background:linear-gradient(to bottom,transparent,var(--bg));pointer-events:none}.status-note-items{margin:0;padding:3px 5px 5px;list-style:none;display:flex;flex-direction:column;max-height:200px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.status-note-item{display:flex;gap:7px;align-items:baseline;padding:4px 5px;font-size:11px;line-height:1.52;color:var(--text)}.status-note-item+.status-note-item{border-top:1px solid var(--line)}.status-note-item-n{flex:0 0 auto;width:15px;text-align:right;font-size:9.5px;line-height:1.9;color:var(--text-dim);opacity:.55;font-variant-numeric:tabular-nums}.status-note-item-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 auto}.status-note-item-text{overflow-wrap:anywhere}.status-note-item-tags{color:var(--text-dim);font-size:9.5px;line-height:14px;opacity:.8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:60%}.status-note-item.more{border-top:0;padding-left:27px;color:var(--text-dim);font-style:italic}.stream-spin{flex:0 0 auto;align-self:flex-start;margin-top:4px;width:11px;height:11px;border-radius:50%;border:1.5px solid var(--line);border-top-color:var(--accent);animation:spin .8s linear infinite}@media (prefers-reduced-motion: reduce){.stream-spin{animation:none}}.jump-latest{position:absolute;left:50%;bottom:14px;transform:translate(-50%);width:34px;height:34px;border-radius:50%;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);box-shadow:0 6px 18px #0006}.jump-latest:hover{color:var(--text);border-color:var(--text-dim)}.jump-latest.has-new{color:var(--accent-text);border-color:var(--accent-dim)}.jump-dot{position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;background:var(--accent);animation:pulse 1.2s infinite}.rail-search-wrap{position:relative;margin:0 8px 6px;display:flex;align-items:center}.rail-search-wrap>svg{position:absolute;left:9px;color:var(--text-dim);pointer-events:none}.rail-search-wrap .rail-search{margin:0;padding-left:27px;width:100%}.cold-resume{background:transparent;border:1px solid transparent;color:var(--text-dim);padding:2px 4px;border-radius:5px;cursor:pointer;line-height:1;display:inline-flex;align-items:center}.session-item.cold:hover .cold-resume{border-color:var(--line);color:var(--ok)}.stream-inner{margin:0;padding:0 20px}.msg{margin-bottom:14px;display:flex;flex-direction:column;align-items:flex-start;min-width:0}.msg>*{max-width:100%}.msg.user{align-items:flex-end}.msg.user.from-agent .role{color:var(--accent, #6ea8fe);letter-spacing:.2px}.msg.user.from-agent .bubble{border-style:dashed;border-color:var(--accent, #6ea8fe)}.msg.plan,.msg.meta{align-items:stretch}.msg .role{font-size:11px;color:var(--text-dim);margin-bottom:3px;letter-spacing:.4px}.msg .role.with-mark{display:flex;align-items:center;gap:5px}.agent-mark{flex:0 0 auto;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:9.5px}.agent-mark img{display:block;width:16px;height:16px;border-radius:4px;object-fit:contain}.msg .bubble{border-radius:10px;padding:10px 14px;white-space:pre-wrap;overflow-wrap:anywhere}.msg .bubble:has(.md),.msg .bubble>.md{white-space:normal}.msg.user .bubble{background:var(--bg-raised);border:1px solid var(--line)}.msg.agent .bubble{background:transparent}.msg.thought .bubble{background:#8f7bd712;border-left:3px solid var(--thought);color:var(--text-dim);font-size:13.5px;white-space:pre-wrap}.thought-head{display:flex;align-items:center;gap:5px;background:none;border:none;padding:2px 4px;border-radius:6px;cursor:pointer;color:var(--text-dim);font:inherit;font-size:11px;letter-spacing:.4px}.thought-head:hover{background:var(--bg-raised);color:var(--text)}.thought-chev,.tool-chev{flex:0 0 auto;color:var(--text-dim);transition:transform .15s ease}.thought-chev.open,.tool-chev.open{transform:rotate(90deg)}.thought-meta{color:var(--text-dim);opacity:.75;font-variant-numeric:tabular-nums}.msg.thought.live .thought-head{color:var(--thought)}.msg.thought .bubble.live{max-height:6.6em;overflow-y:auto}.thought-stick{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;margin:2px 0 0;padding:2px 8px;border-radius:999px;cursor:pointer;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);font:inherit;font-size:11px;letter-spacing:.3px}.thought-stick:hover{color:var(--text);border-color:var(--text-dim)}.work-run-head{display:flex;align-items:center;gap:6px;width:fit-content;max-width:100%;min-height:30px;padding:4px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text-dim);font:inherit;font-size:11.5px;text-align:left;cursor:pointer}.work-run.active{align-self:stretch}.work-run-head:hover,.work-run-head:focus-visible{outline:none;border-color:var(--accent-dim);background:rgba(var(--accent-rgb),.055)}.work-run.active .work-run-head{border-color:var(--accent-dim)}.work-chev{flex:0 0 auto;color:var(--text-dim);transition:transform .15s ease}.work-chev.open{transform:rotate(90deg)}.work-run-icon{flex:0 0 auto;color:var(--accent-text)}.work-run-count{flex:0 0 auto;font-weight:600;color:var(--text)}.work-run-names,.work-run-chars{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.work-run-state{flex:0 0 auto}.work-run-state.ok{color:var(--ok)}.work-run-state.err{color:var(--err)}.work-run-state.run{color:var(--accent-text)}.work-run-items{display:flex;flex-direction:column;gap:2px;margin:4px 0 0 11px;padding:3px 4px 3px 12px;border-left:1px solid var(--line);max-height:42vh;overflow-y:auto}.work-run-items .msg{margin-bottom:4px}.work-run-items .bubble{max-height:none}@media (max-width: 700px){.work-run-head{min-height:34px}.work-run-items{max-height:38vh}.msg.thought .bubble.live{max-height:7.4em}}.msg.meta .bubble{color:var(--err);font-size:13px;background:#e5737314}.usage-note{color:var(--text-dim);font-size:11.5px;line-height:1.5;max-width:46ch}.msg.plan .bubble{border-left:3px solid var(--ok);background:#4ec9a00f;font-size:13.5px}.plan-card{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:3px 8px;background:var(--bg-panel)}.plan-card.completed{border-left-color:var(--ok)}.plan-head{display:flex;align-items:center;gap:8px;width:100%;padding:3px 0;border:0;background:none;color:var(--text);font:inherit;font-size:13px;cursor:pointer;text-align:start}.plan-head:hover{color:var(--accent-text)}.plan-title{font-weight:600;flex:0 0 auto}.plan-count{font-size:12px;color:var(--text-dim);font-variant-numeric:tabular-nums}.plan-state{font-size:11.5px;padding:0 6px;border-radius:999px;line-height:18px}.plan-state.running{color:var(--accent-text);background:rgba(var(--accent-rgb, 90, 140, 255),.12)}.plan-state.done{color:var(--ok);background:#4ec9a01f}.plan-state.terminal{color:var(--err);background:rgba(var(--err-rgb),.1)}.plan-head .tool-chev{margin-inline-start:auto}.plan-body{list-style:none;margin:2px 0 4px;padding:4px 0 0;border-top:1px dashed var(--line)}.plan-name{padding:1px 0 6px;margin-bottom:2px;border-bottom:1px dotted var(--line);font-weight:600;font-size:13px;overflow-wrap:anywhere}.plan-step{display:flex;align-items:baseline;gap:8px;padding:2.5px 0;font-size:13px}@media (max-width: 720px){.plan-step{font-size:12px;gap:6px}.plan-step .step-icon{flex-basis:12px}.plan-name{font-size:12.5px}}.plan-step .step-icon{flex:0 0 14px;text-align:center;color:var(--text-dim)}.plan-step.completed .step-icon{color:var(--ok)}.plan-step.completed .step-title{color:var(--text-dim)}.plan-step.in_progress .step-icon{color:var(--accent);animation:pulse 1.2s infinite}.plan-step.cancelled .step-icon{color:var(--err)}.plan-step.cancelled .step-title{color:var(--text-dim);text-decoration:line-through}.plan-step .step-title{flex:1;min-width:0;overflow-wrap:anywhere}.plan-explanation{margin:6px 0 2px;padding-top:4px;border-top:1px dashed var(--line);font-size:12px;opacity:.7;overflow-wrap:anywhere}.plan-bar{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:1px 8px;margin-bottom:6px;background:var(--bg-panel)}.plan-bar.completed{border-left-color:var(--ok)}.plan-bar .plan-body{max-height:40vh;overflow-y:auto}.plan-dots{display:inline-flex;align-items:center;gap:2.5px;margin-inline-start:2px;flex:0 0 auto}.plan-dots .dot{flex:0 0 5px;width:5px;height:5px;border-radius:50%;background:var(--line);border:1px solid var(--text-dim);box-sizing:border-box}.plan-dots .dot.completed{background:var(--ok);border-color:var(--ok)}.plan-dots .dot.in_progress{background:var(--accent);border-color:var(--accent);animation:pulse 1.2s infinite}.plan-dots .dot.cancelled{background:var(--err);border-color:var(--err)}@media (max-width: 700px){.plan-step{font-size:12px;padding:2px 0;gap:6px}.plan-step .step-icon{flex-basis:12px}.plan-name{font-size:12.5px;padding-bottom:5px}.plan-explanation{font-size:11.5px}.plan-head{font-size:12.5px}}pre.code{background:var(--code-bg);color:var(--code-fg);border:1px solid var(--line);border-radius:8px;padding:10px 12px;overflow-x:auto;font-family:var(--mono);font-size:12.8px}code.inline{font-family:var(--mono);background:var(--chip-bg);color:var(--text);border:1px solid var(--line);padding:1px 5px;border-radius:4px;font-size:.92em}.bubble-actions{display:flex;align-items:center;gap:4px;margin-top:4px;opacity:0;transition:opacity .12s}.msg:hover .bubble-actions{opacity:1}@media (hover: none){.bubble-actions{opacity:.75}}.msg-at{font-size:10.5px;color:var(--text-dim);opacity:.9;font-variant-numeric:tabular-nums;white-space:nowrap;flex:0 0 auto}.bubble-actions .msg-at{flex:1 1 auto;text-align:left}.bubble-note{font-size:10.5px;color:var(--text-dim)}.bubble-files{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.bubble-file{display:inline-flex;align-items:center;gap:4px;font-size:11px;border:1px solid var(--line);border-radius:6px;padding:1px 6px;color:var(--text-dim)}.tool-card{border:1px solid var(--line);border-left:3px solid var(--tool);border-radius:8px;padding:3px 8px;background:var(--bg-panel)}.tool-head{display:flex;align-items:center;gap:6px;width:100%;min-width:0;background:transparent;border:none;padding:2px 0;cursor:pointer;color:var(--text);font-family:var(--mono);font-size:11.5px;text-align:left}.tool-head:hover{color:var(--accent-text)}.tool-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-chev{flex:0 0 auto;opacity:.5;transition:transform .12s ease}.tool-chev.open{transform:rotate(90deg)}.tool-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--text-dim)}.tool-dot.running{background:var(--accent);animation:pulse 1.2s infinite}.tool-dot.ok{background:var(--ok)}.tool-dot.err{background:var(--err)}.tool-card.completed{border-left-color:var(--ok)}.tool-card.failed{border-left-color:var(--err)}.tool-card .tool-body{margin-top:8px;border-top:1px dashed var(--line);padding-top:6px}.tool-card .tool-body .lbl{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim)}.tool-card .tool-body pre{margin:4px 0 8px;padding:6px 9px;max-height:260px;overflow:auto;background:var(--bg);border:1px solid var(--line);border-radius:6px;font-family:var(--mono);font-size:11px;line-height:1.45;white-space:pre-wrap;word-break:break-word}.tool-card .tool-body pre.tool-meta{color:var(--text-dim);margin-bottom:6px}.ctx{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;color:var(--ok)}.ctx.warn{color:#d9a03a}.ctx.hot{color:var(--err)}.ctx .ctx-text{font-size:11px;font-family:var(--mono);color:var(--text-dim)}.slash-palette{position:absolute;bottom:calc(100% + 6px);left:0;right:0;max-height:260px;overflow:auto;background:var(--bg-panel);border:1px solid var(--line);border-radius:10px;padding:4px;box-shadow:0 10px 26px #00000059;z-index:5}.slash-item{display:flex;align-items:baseline;gap:8px;padding:6px 9px;border-radius:6px;cursor:pointer}.slash-item.sel{background:#ffffff0f}.slash-item .cmd{font-family:var(--mono);font-size:12.5px;color:var(--accent-text)}.slash-item .desc{font-size:11.5px;color:var(--text-dim);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slash-item .src{font-size:10px;color:var(--text-dim);border:1px solid var(--line);border-radius:4px;padding:0 4px}.slash-item.empty{color:var(--text-dim);font-size:12px;cursor:default}.perm-card{border:1px solid var(--accent-dim);border-radius:10px;padding:12px 14px;background:rgba(var(--accent-rgb),.05)}.perm-card .q{font-size:13.5px;margin-bottom:4px}.perm-card .tc{font-family:var(--mono);font-size:12.5px;color:var(--text-dim);margin-bottom:10px;overflow-wrap:anywhere}.perm-card .opts{display:flex;gap:8px;flex-wrap:wrap}.perm-card .opts button{border-radius:7px;padding:6px 12px;cursor:pointer;font-size:13px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text)}.perm-card .opts button.allow{border-color:var(--ok);color:var(--ok)}.perm-card .opts button.reject{border-color:var(--err);color:var(--err)}.perm-card.resolved{opacity:.55}.perm-card.resolved .picked{font-size:12px;color:var(--accent-text);margin-top:8px}.perm-card.done{background:transparent;border-style:dashed;opacity:.9}.perm-card.done.yes{border-color:var(--ok)}.perm-card.done.no{border-color:var(--err);opacity:.75}.perm-card .perm-decision{font-size:12.5px;margin-top:8px;color:var(--text-dim)}.perm-card.done.yes .perm-decision{color:var(--ok)}.perm-card.done.no .perm-decision{color:var(--err)}.perm-card.skills{border-color:var(--accent-dim)}.perm-dialog{max-width:560px;max-height:92vh;overflow-y:auto}.perm-ask{font-size:13px;line-height:1.5;color:var(--text)}.perm-file{display:flex;align-items:center;gap:6px;margin-top:10px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.perm-file code{font-family:var(--mono);font-size:12px;word-break:break-all;color:var(--accent-text)}.perm-changes{margin-top:10px}.perm-change-row{display:flex;align-items:center;gap:7px;width:100%;text-align:left;cursor:pointer;padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text);font:inherit}.perm-change-row:hover{border-color:var(--accent-dim)}.perm-change-row code{font-family:var(--mono);font-size:12px;color:var(--accent-text);flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.perm-counts{display:flex;gap:6px;font-family:var(--mono);font-size:11.5px;flex:0 0 auto}.perm-counts .add{color:var(--ok)}.perm-counts .del{color:var(--err)}.perm-caret{color:var(--text-dim);font-size:11px;flex:0 0 auto}.perm-diff{margin-top:6px;border:1px solid var(--line);border-radius:8px;background:var(--bg);max-height:34vh;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.5}.perm-diff-line{display:grid;grid-template-columns:3.2em 3.2em 1.2em 1fr;white-space:pre-wrap;overflow-wrap:anywhere;padding:0 6px}.perm-diff-line .no{color:var(--text-dim);text-align:right;padding-right:6px;user-select:none}.perm-diff-line .sig{text-align:center}.perm-diff-line.add{background:#30a46c1f}.perm-diff-line.add .sig{color:var(--ok)}.perm-diff-line.del{background:#e25a501f}.perm-diff-line.del .sig{color:var(--err)}.perm-diff-line.ctx{color:var(--text-dim)}.perm-diff-gap{color:var(--text-dim);font-size:10.5px;text-align:center;padding:3px 0;background:#7f7f7f0f}.perm-cut{font-size:11px;color:var(--text-dim);margin-top:4px}.file-changes{margin:10px 0 2px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.file-changes.one{padding:2px 8px}.fc-head{display:flex;align-items:center;gap:7px;width:100%;text-align:left;cursor:pointer;padding:4px 2px;border:0;background:none;color:var(--text);font:inherit}.fc-head:hover .fc-title{color:var(--accent-text)}.fc-title{flex:1 1 auto;min-width:0;font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fc-counts.static{cursor:default}.fc-row{padding:4px 2px;border-top:1px solid var(--line);min-width:0}.file-changes.one .fc-row{border-top:0}.fc-line{display:flex;align-items:center;gap:7px;min-width:0}.fc-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:var(--ok)}.fc-name{display:flex;align-items:baseline;gap:6px;min-width:0;flex:1 1 auto;cursor:pointer;border:0;background:none;padding:0;color:var(--accent-text);font-family:var(--mono);font-size:12px}.fc-name:hover{text-decoration:underline}.fc-dir{color:var(--text-dim);font-size:10.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fc-dir:before{content:"· "}.fc-edits{color:var(--text-dim);font-size:10.5px;flex:0 0 auto}.fc-edits:before{content:"· "}.fc-counts{display:flex;gap:6px;flex:0 0 auto;cursor:pointer;font-family:var(--mono);font-size:11.5px;border:1px solid var(--line);border-radius:6px;padding:1px 6px;background:var(--bg);color:var(--text)}.fc-counts:hover:not(:disabled){border-color:var(--accent-dim)}.fc-counts:disabled{cursor:default;opacity:.6}.fc-counts .add{color:var(--ok)}.fc-counts .del{color:var(--err)}.file-changes .perm-diff{margin:2px 2px 6px}.stale-banner{position:fixed;left:50%;transform:translate(-50%);bottom:calc(10px + env(safe-area-inset-bottom,0px));z-index:80;cursor:pointer;border:1px solid var(--accent-dim);border-radius:999px;background:var(--accent);color:var(--on-accent);font-weight:700;font-size:12.5px;padding:9px 16px;box-shadow:0 6px 18px #00000059}.stale-banner:hover{filter:brightness(1.06)}.perm-opts{margin-top:14px}.perm-note{font-size:11.5px;color:var(--text-dim);margin-top:10px;line-height:1.5}.perm-answered{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ok);border:1px solid var(--ok);border-radius:7px;padding:6px 11px;background:#4ec9a014}.perm-answered-tick{font-weight:700}.perm-queue{margin-top:10px;font-size:12px;color:var(--accent-text);line-height:1.5}.perm-unconfirmed{margin-top:10px;font-size:12.5px;color:var(--warn, #d08a2a);border:1px solid var(--warn, #d08a2a);border-radius:7px;padding:6px 10px;line-height:1.5}.ns-fixed-dir{display:flex;align-items:center;gap:6px;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text-dim)}.ns-fixed-dir code{font-family:var(--mono);font-size:12px;word-break:break-all;color:var(--accent-text)}.composer{border-top:1px solid var(--line);background:var(--bg-panel);padding:8px 20px calc(10px + env(safe-area-inset-bottom))}.composer.drop-active .composer-box{border-color:var(--accent-text);background:rgba(var(--accent-rgb),.06)}.composer-inner{position:relative;display:flex;flex-direction:column;gap:6px}.composer-box{display:flex;flex-direction:column;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px}.composer-box:focus-within{border-color:var(--accent-dim)}.composer textarea{flex:0 0 auto;resize:none;background:transparent;color:var(--text);border:none;padding:10px 12px 4px;font:inherit;min-height:42px;max-height:40vh;overflow-y:auto}.composer textarea:focus{outline:none}.composer-bar{display:flex;align-items:center;gap:6px;padding:2px 6px 6px}.icon-btn.on{background:var(--bg-panel);border-color:var(--accent-dim);color:var(--accent-text)}.icon-btn.rec{color:var(--err);border-color:var(--err);animation:pulse 1.4s infinite}.icon-btn.tiny{width:22px;height:22px;border-radius:6px}.send-btn{border:none;background:var(--accent);color:var(--on-accent);font-weight:700;border-radius:9px;padding:0;cursor:pointer;width:40px;height:34px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.send-btn.stop{background:var(--err);color:#180e0e}.send-btn:disabled{opacity:.4;cursor:default}.usage-row{display:flex;align-items:center;gap:8px;padding:0 2px;position:relative}.usage-text{background:transparent;border:none;padding:0;cursor:pointer;font-size:11px;color:var(--text-dim);font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;display:inline-flex;align-items:center;gap:5px}.usage-text:hover{color:var(--text)}.usage-row.warn .usage-text{color:var(--accent-text)}.usage-row.hot .usage-text{color:var(--err)}.usage-icon{flex:none;opacity:.75}.usage-bar{flex:1 1 auto;max-width:220px;height:5px;border-radius:3px;background:var(--line);overflow:hidden}.usage-bar>i{display:block;height:100%;background:var(--ok);transition:width .22s ease}.usage-row.warn .usage-bar>i{background:var(--accent)}.usage-row.hot .usage-bar>i{background:var(--err)}.usage-set{margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--line)}.usage-set-head{display:flex;align-items:center;gap:5px;color:var(--text);margin-bottom:6px}.usage-set-scope{margin-left:auto;font-size:10px;color:var(--text-dim);border:1px solid var(--line);border-radius:999px;padding:0 6px}.usage-set-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.usage-chip{background:var(--chip-bg);border:1px solid var(--line);border-radius:6px;color:var(--text-dim);font-family:inherit;font-size:11px;padding:4px 8px;cursor:pointer}.usage-chip:hover{color:var(--text);border-color:var(--accent-dim)}.usage-chip.sel{color:var(--bg);background:var(--accent);border-color:var(--accent)}.settings-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--effort, var(--text-dim));margin-right:6px}.usage-detail{position:absolute;left:0;right:auto;width:min(560px,100%);bottom:calc(100% + 8px);z-index:12;max-height:min(60vh,420px);overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:8px 10px;font-size:11.5px;color:var(--text-dim);font-family:var(--mono);box-shadow:0 12px 30px #00000059}.draft-row{display:flex;flex-wrap:wrap;align-items:center;gap:5px}.draft{display:inline-flex;align-items:center;gap:5px;max-width:220px;border:1px solid var(--line);border-radius:8px;padding:2px 4px 2px 5px;background:var(--bg-raised);font-size:11.5px;color:var(--text-dim)}.draft img{width:20px;height:20px;object-fit:cover;border-radius:4px}.draft-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.draft-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;display:inline-flex;padding:0 2px}.draft-x:hover{color:var(--err)}.draft-clear{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:11px;text-decoration:underline}.draft-clear:hover{color:var(--text)}.queue-list{display:flex;flex-direction:column;gap:4px}.queue-head{display:flex;align-items:baseline;gap:8px;font-size:11px;color:var(--text-dim)}.queue-title{font-weight:600;letter-spacing:.3px;text-transform:uppercase}.queue-hint{opacity:.85}.queue-row{display:flex;align-items:flex-start;gap:7px;padding:5px 6px 5px 8px;border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:8px;background:var(--bg-raised);font-size:12.5px;color:var(--text)}.queue-row.inflight{border-left-color:var(--accent);opacity:.75}.queue-row.unsure{border-left-color:var(--warn, #d08a2a);border-color:var(--warn, #d08a2a)}.queue-flag{flex:0 0 auto;font-size:10.5px;color:var(--warn, #d08a2a);padding-top:2px;white-space:nowrap}.queue-idx{flex:0 0 auto;min-width:14px;text-align:right;font-size:10.5px;color:var(--text-dim);font-variant-numeric:tabular-nums;padding-top:2px}.queue-text{flex:1 1 auto;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:5.6em;overflow:hidden}.queue-edit{flex:1 1 auto;min-width:0;font:inherit;font-size:12.5px;color:var(--text);background:var(--bg-panel);border:1px solid var(--accent-dim);border-radius:6px;padding:2px 6px;resize:vertical}.queue-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px}.queue-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--line);border-radius:6px;background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.queue-btn:hover{color:var(--text);border-color:var(--accent-dim);background:rgba(var(--accent-rgb),.08)}.queue-btn.danger:hover{color:var(--err);border-color:var(--err);background:#e5737314}@media (max-width: 720px){.queue-btn{width:28px;height:28px}.queue-text{max-height:3.6em}}.composer-note{font-size:11.5px;color:var(--text-dim)}.composer-note.err{color:var(--err)}.dict-chip{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--accent-text);border:1px dashed var(--accent-dim);border-radius:8px;padding:4px 8px}.dict-chip.err{color:var(--err);border-color:var(--err)}.dict-chip .interim{color:var(--text-dim)}.dict-stop{margin-left:auto;background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:1px 8px;cursor:pointer;font-size:11px}.dict-stop:hover{color:var(--err);border-color:var(--err)}.settings-pop{position:absolute;left:0;bottom:calc(100% + 8px);z-index:14;width:min(340px,92vw);max-height:70vh;overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:12px;padding:8px 10px 10px;box-shadow:0 16px 40px #00000073}.settings-head{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px}.settings-group{border-top:1px solid var(--line);padding:7px 0 4px}.settings-group:first-of-type{border-top:none}.settings-label{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text-dim);margin-bottom:5px}.settings-opt{display:block;width:100%;text-align:left;margin:2px 0;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font-size:12.5px;padding:5px 8px;font-family:inherit}.settings-opt:hover{background:var(--bg-panel);border-color:var(--line)}.settings-opt.sel{background:rgba(var(--accent-rgb),.1);border-color:var(--accent-dim);color:var(--accent-text)}.settings-toggle{display:flex;align-items:center;gap:7px;font-size:12.5px;margin:5px 0;cursor:pointer}.settings-select,.settings-input{width:100%;margin:3px 0;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:7px;padding:5px 7px;font-size:12px;font-family:inherit}.settings-select:focus,.settings-input:focus{outline:none;border-color:var(--accent-dim)}.settings-freeform{display:flex;gap:6px;align-items:center;margin-top:6px}.settings-freeform .settings-input{flex:1 1 auto;min-width:0}.settings-note{font-size:10.5px;color:var(--text-dim);margin-top:4px}.settings-range{display:block;font-size:11.5px;color:var(--text-dim);margin:5px 0}.settings-range input{width:100%}.empty{margin:auto;text-align:center;color:var(--text-dim)}.empty .big{font-size:42px;display:flex;justify-content:center;margin-bottom:4px}.modal-bg{position:fixed;inset:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:35;padding:16px;overflow-y:auto;overscroll-behavior:contain}.modal{background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;padding:20px;width:100%;max-width:420px;max-height:calc(100dvh - 32px);overflow-y:auto}.modal.start-page{max-width:560px}.start-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}.start-head h3{margin:0;flex:1;min-width:0}.ws-pill{display:inline-flex;align-items:center;gap:6px;max-width:58%;flex:0 1 auto;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:999px;padding:5px 10px;font:inherit;font-size:12.5px;cursor:pointer}.ws-pill:hover{border-color:var(--accent-dim)}.ws-pill.empty{color:var(--text-dim);border-style:dashed}.ws-pill.locked{cursor:default;color:var(--text-dim);background:transparent}.ws-pill.locked:hover{border-color:var(--line)}.ws-pill-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ws-modal-bg{z-index:60}.ws-modal{max-width:520px}.composer.start-composer{border-top:none;background:transparent;padding:0}.start-page .backend-pick{margin-top:14px}.start-input{width:100%;box-sizing:border-box;resize:vertical;min-height:86px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:10px;padding:11px 12px;font:inherit;line-height:1.5}.start-input:focus{outline:none;border-color:var(--accent-dim)}.start-hold{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--text-dim);font-size:12.5px;padding:22px 8px}.start-fail{border:1px solid var(--err);border-radius:10px;padding:12px 14px;margin:8px 0 12px;background:color-mix(in srgb,var(--err) 10%,transparent)}.start-fail-why{color:var(--err);font-size:12.5px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.start-fail-act{display:flex;gap:8px;margin-top:10px}.modal h3{margin:0 0 14px;font-size:16px}.modal label{display:block;font-size:12.5px;color:var(--text-dim);margin:10px 0 4px}.modal input,.modal select{width:100%;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:9px 10px;font:inherit}.modal .row{display:flex;gap:10px;margin-top:18px}.modal .row button{flex:1;padding:9px;border-radius:8px;cursor:pointer}.modal .row .cancel{background:transparent;border:1px solid var(--line);color:var(--text-dim)}.modal .row .go{background:var(--accent);border:none;color:var(--on-accent);font-weight:700}.modal .row .go.danger{background:var(--err);color:#fff}.modal .err{color:var(--err);font-size:12.5px;margin-top:10px}@media (max-width: 520px){.modal-bg{align-items:flex-start;padding:10px}.modal{padding:14px;border-radius:12px}.modal h3{margin:0 0 8px;font-size:15px}.modal label{margin:8px 0 3px}.modal input,.modal select{padding:8px 9px}.modal .row{margin-top:12px}.backend-pick .be-card{width:68px;min-height:58px}}.blocked-homes{margin-top:12px;display:flex;flex-direction:column;gap:6px}.blocked-homes div{display:flex;gap:8px;align-items:baseline;font-size:12px}.blocked-homes span{color:var(--text-dim);min-width:104px;flex:none}.blocked-homes code{font-family:var(--mono);word-break:break-all}.backend-pick{display:flex;gap:8px;overflow-x:auto;overscroll-behavior-x:contain;padding-bottom:2px}.backend-pick .be-card{flex:0 0 auto;width:74px;min-height:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;padding:8px 6px;border-radius:10px;cursor:pointer;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);font:inherit}.backend-pick .be-card.sel{border-color:var(--accent-text);color:var(--accent-text);background:rgba(var(--accent-rgb),.1)}.be-card-mark{flex:0 0 auto;width:26px;height:26px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:var(--be-tone, var(--text-dim));background:color-mix(in srgb,var(--be-tone, var(--text-dim)) 16%,transparent);border:1px solid color-mix(in srgb,var(--be-tone, var(--text-dim)) 40%,transparent)}.be-card-mark img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.be-card-label{max-width:100%;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backend-pick .be-card.reload{width:42px;font-size:15px}.be-detail{margin-top:6px}.be-detail-head{display:inline-flex;align-items:center;gap:4px;background:transparent;border:none;padding:2px 0;cursor:pointer;color:var(--text-dim);font-size:11.5px}.be-detail-head:hover{color:var(--accent-text)}.be-detail-arrow{transition:transform .12s}.be-detail.open .be-detail-arrow{transform:rotate(90deg)}.dim{color:var(--text-dim);font-size:12.5px;align-self:center}.hint{color:var(--text-dim);font-size:11.5px;margin-top:8px;font-family:ui-monospace,monospace;word-break:break-all}.net-banner{margin:8px 12px 0;padding:8px 10px;border-radius:8px;font-size:12.5px;background:rgba(var(--err-rgb),.12);border:1px solid rgba(var(--err-rgb),.45);color:var(--err);display:flex;gap:8px;align-items:center;justify-content:space-between}.net-banner button{background:transparent;border:1px solid rgba(var(--err-rgb),.55);color:var(--err);border-radius:6px;padding:3px 9px;cursor:pointer;font-size:12px}.menu-btn{display:inline-flex;background:none;border:none;color:var(--text);font-size:20px;padding:2px 8px;cursor:pointer}@media (min-width: 721px){.sidebar.compact{--rail-w: 60px}.sidebar.compact header{padding:12px 0 8px;justify-content:center;gap:0}.sidebar.compact header .logo{font-size:0;gap:0}.sidebar.compact header .tagline,.sidebar.compact .rail-search-wrap,.sidebar.compact .rail-error,.sidebar.compact .rail-empty,.sidebar.compact .rail-section span,.sidebar.compact .rail-placeholder,.sidebar.compact footer,.sidebar.compact .rail-group-name,.sidebar.compact .rail-group-count,.sidebar.compact .group-add,.sidebar.compact .rail-more,.sidebar.compact .session-item .title,.sidebar.compact .session-item .rail-at,.sidebar.compact .session-item .badge,.sidebar.compact .session-item .unread-dot,.sidebar.compact .session-item .row-menu,.sidebar.compact .new-btn .new-label{display:none}.sidebar.compact .new-btn{margin:0 auto 10px;width:40px;height:36px;padding:0;display:flex;align-items:center;justify-content:center}.sidebar.compact .rail-section{justify-content:center;padding:4px 0;min-height:22px}.sidebar.compact .rail-group-head{justify-content:center;padding-left:0;padding-right:0}.sidebar.compact .rail-group-row{padding:0 4px}.sidebar.compact .rail-group-body{padding-left:0}.sidebar.compact .session-item{justify-content:center;padding:6px 0;display:flex;align-items:center;width:auto;margin:0 2px 4px}.sidebar.compact>.pane-handle{display:none}.sidebar.hidden{display:none}.sidebar.hidden>.pane-handle{display:none}}@media (max-width: 720px){.sidebar{position:fixed;inset:0 auto 0 0;z-index:30;width:min(82vw,320px);transform:translate(-105%);transition:transform .22s ease}.sidebar.open{transform:translate(0);box-shadow:0 0 40px #0009}.sidebar.compact,.sidebar.hidden{display:flex}.sidebar header .tagline{display:none}.scrim{position:fixed;inset:0;background:#00000073;z-index:25}.chip{padding:2px 6px}.perm-card button{min-height:44px;padding:10px 14px;font-size:14px}.perm-dialog{max-width:none;max-height:100%}.perm-dialog .perm-opts button{min-height:44px;padding:10px 14px;font-size:14px}.perm-diff{max-height:42vh}.perm-change-row{min-height:44px}.rail-group .group-add{width:32px;height:30px}.rail-section{min-height:34px;margin-top:6px}.slash-palette{max-height:40vh}.slash-item{min-height:44px}.msg{max-width:100%}.empty .big{font-size:42px}}.sidebar footer{display:flex;align-items:center;gap:6px}.sidebar footer .logout-btn{margin-left:auto;background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:2px 8px;cursor:pointer;line-height:1.4}.sidebar footer .logout-btn:hover{color:var(--err);border-color:var(--err)}.auth-wrap{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(1000px 500px at 50% -10%,rgba(var(--accent-rgb),.07),transparent 60%),var(--bg)}.auth-card{width:100%;max-width:360px;background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;padding:26px 24px 20px;display:flex;flex-direction:column;gap:12px;box-shadow:0 18px 50px #00000073}.auth-logo{color:var(--accent-text);font-weight:700;font-size:20px;letter-spacing:.5px;display:flex;align-items:center;justify-content:center;gap:9px}.auth-sub{font-size:11.5px;color:var(--text-dim);margin-top:-8px}.auth-note{font-size:12.5px;color:var(--text-dim);padding:6px 0}.auth-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--text-dim)}.auth-field input{font:inherit;font-size:16px;padding:10px 11px;border-radius:8px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text)}.auth-field input:focus{outline:none;border-color:var(--accent-dim)}.auth-btn{margin-top:4px;padding:11px;min-height:44px;border-radius:8px;cursor:pointer;border:1px solid var(--accent-dim);background:rgba(var(--accent-rgb),.12);color:var(--accent-text);font-weight:600}.auth-btn:disabled{opacity:.6;cursor:default}.auth-err{color:var(--err);font-size:12.5px;border-left:2px solid var(--err);padding-left:8px}.auth-warn{color:var(--accent-text);font-size:11.5px;line-height:1.5;opacity:.9}.auth-foot{color:var(--text-dim);font-size:11px;line-height:1.5;border-top:1px solid var(--line);padding-top:10px}.auth-card code{font-family:var(--mono);font-size:11px;color:var(--text)}@media (max-width: 480px){.auth-card{padding:20px 16px 16px}.sidebar footer .logout-btn{min-height:44px;padding:2px 12px}}.wp{display:flex;flex-direction:column;gap:5px}.wp-bar{display:flex;align-items:center;gap:6px}.wp-bar>svg{color:var(--text-dim);flex:0 0 auto}.wp-path{flex:1;min-width:0;padding:8px 10px;border-radius:8px;font-size:13px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);font-family:var(--mono)}.wp-path:focus{outline:none;border-color:var(--accent-dim)}.wp-list{max-height:210px;overflow-y:auto;border:1px solid var(--line);border-radius:8px;background:#0000002e;padding:3px}.wp-row{display:flex;align-items:center;gap:6px;padding:4px 7px;border-radius:6px;cursor:pointer;font-size:12.5px;color:var(--text)}.wp-row>svg{color:var(--text-dim);flex:0 0 auto}.wp-row:hover{background:var(--bg-raised)}.wp-row.sel{background:rgba(var(--accent-rgb),.1);outline:1px solid var(--accent-dim)}.wp-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-enter{background:transparent;border:1px solid transparent;border-radius:5px;color:var(--text-dim);cursor:pointer;padding:1px 3px;display:inline-flex}.wp-enter:hover{color:var(--accent-text);border-color:var(--line)}.wp-note{padding:10px;font-size:12px;color:var(--text-dim);text-align:center}.wp-note.err{color:var(--err)}.wp-recent{display:flex;flex-wrap:nowrap;align-items:center;gap:4px;overflow-x:auto;overscroll-behavior-x:contain;padding-bottom:1px}.wp-recent-label{font-size:11px;color:var(--text-dim)}.wp-chip{flex:0 0 auto;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim);border-radius:999px;padding:1px 8px;font-size:10.5px;line-height:1.5;cursor:pointer;font-family:var(--mono);max-width:116px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-chip:hover{color:var(--text);border-color:var(--text-dim)}.wp-chip.sel{color:var(--accent-text);border-color:var(--accent-dim)}.wp-use{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;border:1px solid var(--line);background:transparent;color:var(--text-dim);border-radius:7px;padding:5px 9px;font-size:12px;cursor:pointer}.wp-use:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent-dim)}.wp-use:disabled{opacity:.5;cursor:default}@media (max-width: 480px){.wp-row{min-height:40px}.wp-chip{min-height:26px}.wp-path{font-size:16px}.wp-list{max-height:150px}}.main-body{flex:1;display:flex;min-height:0}.chat-col{flex:1;display:flex;flex-direction:column;min-width:0;container-type:inline-size}.tool-panel{width:var(--panel-w, 430px);flex:0 0 auto;display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--line);background:var(--bg-panel);position:relative}.panel-split{flex:1;display:flex;min-height:0;position:relative}.preview-col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}.explorer-col{position:relative;flex:0 0 auto;width:var(--explorer-w, 300px);display:flex;flex-direction:column;min-height:0}.panel-split:not(.has-preview) .explorer-col{width:100%}.panel-split.tree-folded .explorer-col,.panel-split.preview-folded .preview-col{display:none}.panel-split.preview-folded .explorer-col{width:100%}.pane-handle{position:absolute;top:0;bottom:0;width:12px;z-index:12;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.sidebar>.pane-handle{right:-6px}.tool-panel>.pane-handle{left:-6px}.explorer-col>.pane-handle{left:-6px}.pane-handle-line{width:2px;height:100%;background:transparent;transition:background .15s ease}.pane-handle:hover .pane-handle-line,.pane-handle:active .pane-handle-line{background:var(--accent-dim)}body.pane-dragging{cursor:col-resize;user-select:none}body.pane-dragging *{cursor:col-resize!important}@media (max-width: 720px){.pane-handle{display:none}}@media (pointer: coarse) and (min-width: 721px){.pane-handle-line{background:var(--line)}.pane-handle{width:18px}.sidebar>.pane-handle{right:-9px}.tool-panel>.pane-handle,.explorer-col>.pane-handle{left:-9px}}.tool-tabs{display:flex;align-items:center;gap:3px;padding:4px 6px;border-bottom:1px solid var(--line)}.tool-tab{display:inline-flex;align-items:center;gap:5px;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text-dim);font-size:12px;padding:3px 8px;font-family:inherit}.tool-tab:hover{background:var(--bg-raised);color:var(--text)}.tool-tab.active{background:var(--bg-raised);border-color:var(--line);color:var(--accent-text)}.tool-body{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.ws-root{display:flex;align-items:center;gap:5px;padding:6px 9px 0;font-size:11px;color:var(--text-dim);font-family:var(--mono)}.ws-root-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-bar{display:flex;align-items:center;gap:2px;padding:3px 6px;border-bottom:1px solid var(--line)}.file-bar-path{flex:1;min-width:0;font-size:10.5px;color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-list{flex:1;overflow-y:auto;padding:4px}.file-row{display:flex;align-items:center;gap:7px;width:100%;text-align:left;background:transparent;border:none;border-radius:6px;color:var(--text);font-size:12.5px;padding:4px 7px;cursor:pointer;font-family:inherit}.file-row:hover{background:var(--bg-raised)}.file-row.sel{background:rgba(var(--accent-rgb),.1)}.file-row>svg:first-child{color:var(--text-dim);flex:0 0 auto}.file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-size{font-size:10.5px;color:var(--text-dim);font-family:var(--mono)}.file-enter{opacity:.45}.file-preview{flex:1;min-height:0;display:flex;flex-direction:column}.file-preview-head{display:flex;align-items:center;gap:6px;padding:4px 8px;font-size:11.5px;border-bottom:1px solid var(--line)}.file-preview-body{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.file-preview-body>*{min-height:0}.file-text{margin:0;padding:4px 9px 10px;overflow:auto;white-space:pre;font-family:var(--mono);font-size:11.5px;line-height:1.45;color:var(--text)}.file-image-wrap{display:flex;padding:8px;align-items:flex-start}.file-image{max-width:100%;border-radius:6px;border:1px solid var(--line)}.file-frame{flex:1;min-height:260px;width:100%;border:0;background:var(--bg-raised)}.file-audio{width:calc(100% - 16px);margin:8px}.file-video{max-width:100%;max-height:100%;margin:8px}.file-fallback{padding-top:6px}.file-view-toggle{display:flex;gap:6px;padding:4px 8px 0}.file-source{font-family:var(--mono);font-size:11.5px;line-height:1.45;padding:4px 0 10px;overflow-x:auto}.file-line{display:flex;gap:8px;padding:0 9px;white-space:pre}.file-line.hit{background:rgba(var(--accent-rgb),.14);box-shadow:inset 2px 0 0 var(--accent-text)}.file-ln{flex:0 0 34px;text-align:right;color:var(--text-dim);opacity:.6;user-select:none}.file-lt{flex:1}.file-edit{flex:1;min-height:220px;border:0;outline:0;resize:none;padding:8px 10px;background:var(--code-bg);color:var(--code-fg);white-space:pre;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.5}.file-dirty{color:var(--accent-text)}.file-conflict{display:flex;align-items:center;gap:6px;padding:5px 8px;font-size:11.5px;color:var(--text);background:rgba(var(--accent-rgb),.12);border-bottom:1px solid var(--line)}.file-md{padding:6px 10px 12px}.tool-note{padding:8px;font-size:11.5px;color:var(--text-dim)}.tool-error{padding:6px 9px;font-size:11.5px;color:var(--err)}.term-bar{display:flex;align-items:center;gap:6px;padding:4px 8px;border-bottom:1px solid var(--line);font-size:11.5px;color:var(--text-dim)}.term-dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim)}.term-dot.ready{background:var(--ok)}.term-dot.error{background:var(--err)}.term-dot.closed{background:var(--accent)}.term-cwd{font-family:var(--mono);color:var(--text)}.term-body{display:flex;flex-direction:column;min-height:0;padding:0}.term-host{flex:1;min-height:0;min-width:0;overflow:hidden;padding:4px 0 0 6px;background:var(--bg-panel)}.term-host .xterm{height:100%}.term-host .xterm-viewport{background:transparent!important}.term-note{padding:4px 9px 7px;font-size:10.5px;color:var(--text-dim)}@media (max-width: 720px){.chat-head{padding:5px 8px;min-height:44px}.chat-head .title{font-size:14px}.chat-head .menu-btn,.chat-head .icon-btn{width:40px;height:40px}.chat-head .head-actions .icon-btn{width:28px;height:28px}.chat-head .head-actions .icon-btn svg{width:18px;height:18px}.composer{padding:6px 8px calc(8px + env(safe-area-inset-bottom,0px))}.composer textarea{font-size:16px;min-height:44px}.composer-bar .icon-btn{width:38px;height:38px}.send-btn{width:46px;height:38px}.usage-row .usage-bar{max-width:90px}.tb-list,.tb-list.wide{position:fixed;left:8px;right:8px;width:auto;max-width:none;bottom:calc(76px + env(safe-area-inset-bottom,0px));max-height:52vh}.settings-pop{width:min(340px,94vw);bottom:calc(100% + 6px)}.tool-panel{position:fixed;inset:44px 0 0;z-index:22;width:auto;max-width:none;border-left:none}.panel-split.has-preview .explorer-col{display:none}.file-row{min-height:42px}.term-host{min-height:30vh}}.md{font-size:13.5px;line-height:1.55;overflow-wrap:anywhere;white-space:normal}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md h1,.md h2,.md h3,.md h4{margin:12px 0 6px;line-height:1.3;font-weight:650}.md h1{font-size:18px}.md h2{font-size:16px}.md h3{font-size:14.5px}.md h4{font-size:13.5px}.md p{margin:6px 0}.md ul,.md ol{margin:6px 0;padding-left:20px}.md li{margin:2px 0}.md li>ul,.md li>ol{margin:2px 0}.md blockquote{margin:6px 0;padding:2px 10px;color:var(--text-dim);border-left:3px solid var(--line)}.md a{color:var(--accent-text);text-decoration:none;border-bottom:1px solid var(--accent-dim)}.md a:hover{border-bottom-color:var(--accent-text)}.md a.md-file-link{font-family:var(--mono);font-size:.94em;padding:0 3px;border-bottom-color:transparent;border-radius:4px;background:rgba(var(--accent-rgb),.1)}.md a.md-file-link:hover{background:rgba(var(--accent-rgb),.2)}.md-file-line{color:var(--text-dim)}.md a.md-img-link{border-bottom:none;display:inline-block;max-width:100%}.md img.md-img{max-width:100%;border-radius:6px;border:1px solid var(--line);display:block;margin:6px 0}.md hr{border:none;border-top:1px solid var(--line);margin:10px 0}.md code{font-family:var(--mono);font-size:12px;padding:1px 4px;border-radius:4px;background:var(--chip-bg);color:var(--text);border:1px solid var(--line)}.md pre{margin:0;padding:8px 10px;overflow-x:auto;background:var(--code-bg);color:var(--code-fg)}.md pre code{padding:0;background:transparent;border:none;color:inherit;font-size:12px;line-height:1.5}.md table{border-collapse:collapse;margin:8px 0;font-size:12.5px;display:block;overflow-x:auto;max-width:100%}.md-table-bar{display:flex;align-items:center;gap:6px;margin:8px 0 -2px}.md-table-filter{flex:1;min-width:0;max-width:240px;font-size:11.5px;padding:3px 7px;background:var(--bg-input, var(--bg-raised));color:var(--text);border:1px solid var(--line);border-radius:5px}.md-table-btn{font-size:11px;line-height:1;padding:3px 7px;cursor:pointer;background:var(--bg-raised);color:var(--text-dim);border:1px solid var(--line);border-radius:5px}.md-table-btn:hover{color:var(--text);border-color:var(--accent-dim)}.md-table-sort{display:inline-flex;align-items:center;gap:4px;width:100%;font:inherit;font-weight:inherit;text-align:left;cursor:pointer;background:none;border:0;padding:0;color:inherit}.md-table-sort:hover{color:var(--accent-text)}.md-table-sort-indicator{font-size:9px;opacity:.55}.md th[aria-sort=ascending] .md-table-sort-indicator,.md th[aria-sort=descending] .md-table-sort-indicator{opacity:1;color:var(--accent-text)}.md-table-overlay{position:fixed;inset:0;z-index:60;display:flex;flex-direction:column;background:#0000009e;backdrop-filter:blur(1.5px)}.md-table-overlay .md-table-bar{margin:8px}.md-table-overlay .md-table-btn{background:var(--bg-panel);font-size:12px;padding:5px 10px}.md-table-stage{flex:1;min-height:0;position:relative;overflow:hidden}.md-table-zoom{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);max-width:96vw;max-height:96vh;overflow:auto;background:var(--bg-panel);border:1px solid var(--line);border-radius:8px;padding:8px}.md-table-zoom.rot{width:96vh;height:96vw;max-width:none;max-height:none;transform:translate(-50%,-50%) rotate(90deg);transform-origin:center}.md-table-zoom table{display:table;max-width:none;margin:0}.md th,.md td{border:1px solid var(--line);padding:4px 8px;text-align:left}.md th{background:var(--bg-raised);font-weight:600}.md-code{margin:8px 0;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--code-bg);color:var(--code-fg)}.md-code-bar{display:flex;align-items:center;gap:6px;padding:3px 8px;background:var(--code-bar);border-bottom:1px solid var(--code-line)}.md-lang{font-family:var(--mono);font-size:10.5px;color:#9fb0c0;text-transform:lowercase}.md-copy{margin-left:auto;background:transparent;border:1px solid transparent;border-radius:5px;color:#9fb0c0;font-size:10.5px;padding:0 5px;cursor:pointer;font-family:inherit}.md-copy:hover{color:#e3ebf4;border-color:var(--code-line)}.md .hljs-comment,.md .hljs-quote{color:#7f8c98;font-style:italic}.md .hljs-keyword,.md .hljs-selector-tag,.md .hljs-literal,.md .hljs-section,.md .hljs-doctag,.md .hljs-name{color:#c792ea}.md .hljs-string,.md .hljs-regexp,.md .hljs-addition,.md .hljs-attribute,.md .hljs-meta .hljs-string{color:#a5d6a7}.md .hljs-number,.md .hljs-symbol,.md .hljs-bullet,.md .hljs-variable,.md .hljs-template-variable{color:#f0a35e}.md .hljs-title,.md .hljs-title.class_,.md .hljs-title.function_{color:#82b1ff}.md .hljs-built_in,.md .hljs-type,.md .hljs-class .hljs-title{color:#ffd479}.md .hljs-attr,.md .hljs-property,.md .hljs-params{color:#ffcb6b}.md .hljs-deletion{color:#ff6b6b}.md .hljs-emphasis{font-style:italic}.md .hljs-strong{font-weight:700}.tb-wrap{position:relative;flex:0 0 auto}.tb-btn{display:inline-flex;align-items:center;gap:5px;max-width:190px;height:30px;padding:0 7px;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--text-dim);font-size:12px;font-family:inherit;cursor:pointer}.tb-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--text)}.tb-btn.on{background:var(--bg-panel);border-color:var(--accent-dim);color:var(--accent-text)}.tb-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-chev{opacity:.55}.tb-list{position:fixed;z-index:15;min-width:180px;max-width:min(420px,78vw);max-height:46vh;overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:4px;box-shadow:0 14px 34px #00000073}.tb-list.wide{min-width:320px}.tb-list.stacked{display:flex;flex-direction:column;overflow:hidden}.tb-list.stacked .tb-err,.tb-list.stacked .tb-search{flex:0 0 auto}.tb-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}.tb-list.stacked .tb-group{border-top:1px solid var(--line)}.tb-list.stacked .tb-group:first-child{border-top:none}.tb-list.stacked .tb-group-head{position:sticky;top:0;z-index:1;background:var(--bg-raised)}.tb-search{width:100%;margin-bottom:3px;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:4px 6px;font-size:12px}.tb-search:focus{outline:none;border-color:var(--accent-dim)}.tb-opt{display:flex;flex-direction:column;gap:1px;width:100%;text-align:left;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font-size:12.5px;padding:4px 7px;cursor:pointer;font-family:inherit}.tb-opt:hover{background:var(--bg-panel);border-color:var(--line)}.tb-opt.sel{background:rgba(var(--accent-rgb),.1);border-color:var(--accent-dim);color:var(--accent-text)}.tb-opt.bad{border-color:var(--err);color:var(--err)}.tb-opt.bad:hover{background:rgba(var(--err-rgb),.08)}.tb-err{display:flex;flex-direction:column;gap:2px;margin:6px 4px;padding:6px 8px;border:1px solid var(--err);border-radius:7px;background:rgba(var(--err-rgb),.08);color:var(--err);font-size:11.5px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.tb-err-id{font-family:var(--mono, monospace);font-size:11px;opacity:.85}.tb-err-text{color:var(--text)}.tb-opt-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-opt-hint{font-size:10.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-empty{padding:8px;font-size:11.5px;color:var(--text-dim);text-align:center}.usage-edit{display:flex;align-items:center;gap:5px;margin:6px 0 2px}.usage-edit input{flex:1;min-width:0;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:3px 6px;font-family:var(--mono);font-size:12px}.usage-edit input:focus{outline:none;border-color:var(--accent-dim)}.usage-edit-btn{background:transparent;border:1px solid var(--line);border-radius:6px;color:var(--text-dim);font-size:11px;padding:2px 8px;cursor:pointer;font-family:inherit}.usage-edit-btn:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent-dim)}.usage-edit-btn:disabled{opacity:.45;cursor:default}.usage-edit-err{color:var(--err);font-size:11px;margin-top:3px}.usage-note{margin-top:6px;color:var(--text-dim);font-size:10.5px;line-height:1.4}@media (max-width: 720px){.tb-list,.tb-list.wide{min-width:0;width:min(86vw,420px)}.tb-btn{max-width:34vw}.md{font-size:14px}}.tb-wrap{flex:0 1 auto;min-width:0}.tb-btn,.tb-label{min-width:0}.tb-wrap>.tb-btn{max-width:100%}.tb-effort{padding:0 5px;gap:4px}.tb-pips{display:inline-flex;align-items:flex-end;gap:2px;height:12px}.tb-pips i{display:block;width:3px;border-radius:1px;background:var(--line)}.tb-pips i:nth-child(1){height:4px}.tb-pips i:nth-child(2){height:5px}.tb-pips i:nth-child(3){height:6px}.tb-pips i:nth-child(4){height:7px}.tb-pips i:nth-child(5){height:9px}.tb-pips i:nth-child(6){height:11px}.tb-pips i:nth-child(7){height:13px}.tb-dot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px;vertical-align:middle}.tb-group{border-top:1px solid var(--line)}.tb-group:first-of-type{border-top:none}.tb-group-head{display:flex;align-items:center;gap:5px;width:100%;text-align:left;background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-family:inherit;font-size:11px;letter-spacing:.03em;text-transform:uppercase;padding:5px 6px;border-radius:6px}.tb-group-head:hover{background:var(--bg-panel);color:var(--text)}.tb-group-chev{transition:transform .12s ease}.tb-group-chev.open{transform:rotate(90deg)}.tb-group-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-group-count{font-size:10px;color:var(--text-dim)}.tb-group-body{padding:0 0 4px 8px}@media (max-width: 720px){.tb-btn{max-width:34vw;padding:0 4px;gap:3px}.tb-btn .tb-chev{display:none}.tb-effort{max-width:none}.composer-bar{gap:6px;padding:2px 5px 5px}.composer-bar .icon-btn{width:32px;height:32px}.send-btn{width:40px;height:36px}.composer-bar .tb-wrap:has([data-testid=start-model]),.composer-bar .tb-wrap:has([data-testid=tb-model]){flex-shrink:6}.composer-bar .tb-wrap:has([data-testid=start-mode]){flex-shrink:0;max-width:42vw}}@media (max-width: 420px){.tb-pips{gap:1px}.tb-pips i{width:2px}}@media (max-width: 340px){.composer-bar .tb-wrap:has([data-testid=start-model]),.composer-bar .tb-wrap:has([data-testid=tb-model]){flex-shrink:1}.composer-bar .tb-wrap:has([data-testid=start-model]) .tb-label,.composer-bar .tb-wrap:has([data-testid=tb-model]) .tb-label{display:none}.composer-bar .tb-wrap:has([data-testid=start-model]) .tb-btn,.composer-bar .tb-wrap:has([data-testid=tb-model]) .tb-btn{min-width:0}.composer-bar{gap:4px;padding:2px 4px 4px}.composer-bar .icon-btn{width:30px;height:30px}.composer-bar .send-btn{width:36px}}.rail-section{display:flex;align-items:center;gap:4px;width:calc(100% - 10px);margin:9px 10px 3px 0;background:transparent;border:none;font-family:inherit;text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-dim);padding:3px 2px;border-radius:6px;cursor:pointer}.rail-section:hover{color:var(--text)}.rail-section-chev{flex:0 0 auto;transition:transform .12s ease}.rail-section-chev.open{transform:rotate(90deg)}.rail-section-count{margin-left:auto;letter-spacing:0;font-variant-numeric:tabular-nums}.rail-section:first-child{margin-top:3px}.rail-placeholder{display:flex;align-items:center;gap:6px;margin:0 10px 2px;padding:5px 7px;border-radius:6px;border:1px dashed var(--line);color:var(--text-dim);font-size:11px;cursor:default}.rail-placeholder-name{color:var(--text);opacity:.75}.rail-placeholder-note{margin-left:auto;font-size:11px}.rail-group{margin-bottom:2px}.rail-group-row{display:flex;align-items:center;gap:2px}.rail-group-head{display:flex;align-items:center;gap:6px;flex:1 1 auto;min-width:0;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--text);font-family:inherit;font-size:12px;padding:5px 6px;border-radius:6px;margin-left:0}.rail-group-head:hover{background:var(--bg-raised)}.group-add{flex:0 0 auto;opacity:0;transition:opacity .12s}.rail-group:hover .group-add,.rail-group:focus-within .group-add{opacity:1}@media (hover: none){.group-add{opacity:.7}}.rail-group-folder{flex:0 0 auto;color:var(--text-dim)}.rail-group-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-group-count{font-size:11px;color:var(--text-dim)}.rail-group-body{padding-left:28px}.rail-more{display:flex;align-items:center;gap:5px;width:calc(100% - 28px);margin:1px 0 4px 28px;padding:3px 6px;background:transparent;border:none;border-radius:6px;cursor:pointer;color:var(--text-dim);font-family:inherit;font-size:11px;text-align:left}.rail-more:hover{background:var(--bg-raised);color:var(--text)}.rail-more-chev{transition:transform .12s ease;opacity:.7}.rail-more-chev.open{transform:rotate(90deg)}.item-actions{display:inline-flex;align-items:center;gap:2px;margin-left:auto}.item-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;padding:0;background:transparent;border:1px solid transparent;border-radius:5px;color:var(--text-dim);cursor:pointer;font-family:inherit;font-size:11px}.item-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--accent-text)}.item-btn.danger:hover{color:var(--err);border-color:var(--err)}.item-btn:disabled{opacity:.5;cursor:default}.rail-error{margin:4px 8px;padding:5px 7px;border:1px solid var(--err);border-radius:6px;color:var(--err);font-size:11px;display:flex;align-items:center;gap:6px}.rail-error .draft-x{margin-left:auto}.rail-empty{padding:14px 10px;color:var(--text-dim);font-size:12.5px}.rail-gear{margin-left:auto;width:26px;height:26px;border-radius:7px}.set-head .title{display:inline-flex;align-items:center;gap:6px}.set-save{padding:6px 14px;border-radius:8px;cursor:pointer;font-weight:600;font-size:12.5px;background:var(--accent);color:var(--on-accent);border:1px solid var(--accent)}.set-save:disabled{background:transparent;color:var(--text-dim);border-color:var(--line);cursor:default}.set-toast{font-size:12px;color:var(--ok)}.set-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:14px}.set-main{flex:1;display:flex;min-height:0}.set-nav{width:196px;flex:0 0 auto;overflow-y:auto;padding:14px 10px 18px;border-right:1px solid var(--line);display:flex;flex-direction:column}.set-nav-group{display:flex;flex-direction:column;margin-bottom:10px}.set-nav-cat{text-align:left;font-size:11px;font-weight:600;color:var(--text-dim);background:none;border:0;cursor:pointer;padding:4px 8px 3px;border-radius:6px}.set-nav-cat:hover{color:var(--text);background:var(--chip-bg)}.set-nav-cat.on{color:var(--text);background:var(--chip-bg);box-shadow:inset 2px 0 0 var(--accent)}.set-nav-item{text-align:left;font-size:12.5px;color:var(--text-dim);background:none;border:0;border-left:2px solid transparent;cursor:pointer;padding:5px 8px;border-radius:0 6px 6px 0;line-height:1.4}.set-nav-item:hover{color:var(--text);background:var(--chip-bg)}.set-nav-item.on{color:var(--text);font-weight:600;border-left-color:var(--accent);background:var(--chip-bg)}.set-group{margin:4px 0 -6px;font-size:11.5px;font-weight:600;letter-spacing:.06em;color:var(--text-dim);max-width:900px;width:100%;align-self:center}.set-body[data-cat=account]>[data-setgroup]:not([data-setgroup=account]),.set-body[data-cat=agent]>[data-setgroup]:not([data-setgroup=agent]),.set-body[data-cat=notify]>[data-setgroup]:not([data-setgroup=notify]),.set-body[data-cat=look]>[data-setgroup]:not([data-setgroup=look]),.set-body[data-cat=voice]>[data-setgroup]:not([data-setgroup=voice]){display:none}.set-card{background:var(--bg-panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px 16px;max-width:900px;width:100%;align-self:center}.set-card h3{margin:0 0 6px;font-size:13.5px}.set-hint{margin:6px 0 0;font-size:12px;color:var(--text-dim);line-height:1.6;display:flex;flex-wrap:wrap;gap:8px;align-items:center}.set-hint code{font-family:var(--mono);background:var(--chip-bg);color:var(--text);border:1px solid var(--line);padding:1px 5px;border-radius:4px;font-size:11.5px}.set-row{display:flex;gap:12px;align-items:flex-start;margin-top:12px}.set-row>label{flex:0 0 84px;font-size:12.5px;color:var(--text-dim);padding-top:7px}.set-input,.set-select,.set-textarea,.set-num{background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12.5px;font-family:var(--mono);min-width:0;flex:1 1 auto}.set-textarea{width:100%;margin-top:10px;resize:vertical;line-height:1.6}.set-builtin{margin-top:10px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.set-builtin>summary{padding:8px 10px;font-size:12.5px;color:var(--text-dim);cursor:pointer}.set-builtin[open]>summary{border-bottom:1px solid var(--line)}.set-builtin>.set-hint{padding:8px 10px 0;margin:0}.set-builtin-item{padding:8px 10px 0}.set-builtin-item:last-child{padding-bottom:10px}.set-builtin-when{font-size:12px;color:var(--text-dim);margin-bottom:5px}.set-builtin-text{margin:0;padding:8px 10px;border-radius:6px;background:var(--bg-panel);border:1px solid var(--line);color:var(--text);font-family:var(--mono);font-size:11.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}.set-num{flex:0 0 70px}.set-input:focus,.set-select:focus,.set-textarea:focus{outline:none;border-color:var(--accent-dim)}.set-pair{display:flex;gap:10px;flex-wrap:wrap;flex:1 1 320px;align-items:center;min-width:0}.set-check{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-dim);white-space:nowrap}.set-seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}.set-seg button{padding:6px 12px;background:transparent;color:var(--text-dim);border:none;border-right:1px solid var(--line);cursor:pointer;font-size:12.5px}.set-seg button:last-child{border-right:none}.set-seg button.on{background:var(--accent);color:var(--on-accent);font-weight:600}.set-swatches{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.set-swatch{width:22px;height:22px;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}.set-swatch.on{border-color:var(--text)}.set-color{width:26px;height:24px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--bg-raised)}.set-mini{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:5px 9px;border-radius:7px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim);cursor:pointer}.set-mini:hover:not(:disabled){color:var(--text);border-color:var(--accent-dim)}.set-mini:disabled{opacity:.55;cursor:default}.set-hot{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}.set-hot-title{font-size:12px;color:var(--text-dim)}.set-hot-list{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.set-chip{font-size:11.5px;font-family:var(--mono);padding:2px 7px;border-radius:6px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim)}.set-chip.fixed{border-color:var(--accent-dim);color:var(--text)}.set-chip.dynamic{border-style:dashed}.set-chip b{color:var(--accent-text);margin-left:4px;font-size:10.5px}.set-err{max-width:900px;width:100%;align-self:center;display:flex;gap:8px;align-items:center;font-size:12.5px;color:var(--err);background:var(--bg-panel);border:1px solid var(--err);border-radius:10px;padding:9px 12px}.set-inline-err{color:var(--err);font-size:12px}.set-actions{display:flex;gap:10px;align-items:center;max-width:900px;width:100%;align-self:center;padding-bottom:8px}@media (max-width: 720px){.set-row{flex-direction:column;gap:6px}.set-row>label{padding-top:0}.set-body{padding:10px}.set-main{flex-direction:column}.set-nav{width:auto;flex-direction:row;align-items:center;gap:6px;overflow-x:auto;overflow-y:hidden;padding:8px 10px;border-right:0;border-bottom:1px solid var(--line)}.set-nav-group{flex-direction:row;align-items:center;gap:6px;margin-bottom:0}.set-nav-cat{white-space:nowrap;font-size:12px;padding:4px 10px;border-radius:999px;border:1px solid var(--line);background:var(--chip-bg)}.set-nav-item{display:none}}.usage-row .usage-act{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;font-size:10.5px;padding:2px 7px;border-radius:6px;cursor:pointer;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim)}.usage-row.hot .usage-act{border-color:rgba(var(--err-rgb),.5);color:var(--err)}.usage-row .usage-act:hover{color:var(--text);border-color:var(--accent-dim)}.usage-actions{display:flex;gap:6px;margin:6px 0 2px;flex-wrap:wrap}.usage-check{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-dim)}.usage-note code{background:var(--chip-bg);border:1px solid var(--line);border-radius:4px;padding:0 4px}@media (max-width: 720px){.usage-text{padding:9px 2px;margin:-9px -2px}.tb-btn,.tb-effort{min-width:40px}.item-btn{min-width:34px;min-height:32px}.set-swatch{width:32px;height:32px}.set-color{width:36px;height:32px}.set-seg button{padding:8px 12px}.usage-act{padding:5px 9px}}.acct-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}.acct-row{display:flex;align-items:center;gap:10px;padding:8px 10px;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px}.acct-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.acct-name{font-size:12.5px;color:var(--text);display:inline-flex;align-items:center;gap:6px}.acct-sub{font-size:11px;color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acct-badge{font-size:10px;padding:1px 5px;border-radius:999px;color:var(--ok);border:1px solid rgba(var(--accent-rgb),.4);background:rgba(var(--accent-rgb),.12)}.acct-badge.danger{color:var(--err);border-color:rgba(var(--err-rgb),.45);background:rgba(var(--err-rgb),.12)}.acct-when{font-size:11px;color:var(--text-dim);font-family:var(--mono)}.acct-empty{font-size:12px;color:var(--text-dim);padding:6px 2px}.set-mini.danger{color:var(--err);border-color:rgba(var(--err-rgb),.35)}.set-mini.danger:hover:not(:disabled){color:var(--err);border-color:var(--err)}.pw-wrap{position:relative;display:flex;align-items:center}.pw-wrap input{padding-right:34px}.pw-eye{position:absolute;right:4px;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;border-radius:6px}.pw-eye:hover{color:var(--text);background:var(--bg-raised)}.modal-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.modal-head h3{margin:0;flex:1}@media (max-width: 720px){.pw-eye{width:34px;height:34px}.acct-row{padding:10px}.acct-row .set-mini{min-height:34px}.set-row .set-pair{flex:0 0 auto}.set-row>label{flex:0 0 auto}}.session-item{display:flex;align-items:center;gap:8px;padding:4px 6px;min-height:30px}.session-item .title{flex:1 1 auto;min-width:0}.session-item .badge.perm{flex:0 0 auto}.rail-at{flex:0 0 auto;font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.session-item.active .rail-at{color:var(--text-dim)}.unread-dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px rgba(var(--accent-rgb),.18)}.be-avatar{position:relative;flex:0 0 auto;width:20px;height:20px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;letter-spacing:.2px;color:var(--be-tone, var(--text-dim));background:color-mix(in srgb,var(--be-tone, var(--text-dim)) 16%,transparent);border:1px solid color-mix(in srgb,var(--be-tone, var(--text-dim)) 40%,transparent)}.be-avatar.be-hermes,.be-card-mark[data-backend=hermes]{--be-tone: #a98bff}.be-avatar.be-qoder,.be-card-mark[data-backend=qoder]{--be-tone: #4f9bf5}.be-avatar.be-mock,.be-card-mark[data-backend=mock]{--be-tone: #94a3b8}.be-avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.be-avatar .be-dot{position:absolute;right:-2px;bottom:-2px;width:7px;height:7px;border-radius:50%;border:1px solid var(--bg);background:var(--text-dim)}.be-avatar .be-dot.running{background:var(--ok)}.be-avatar.live{animation:rail-live 1.8s ease-in-out infinite}@keyframes rail-live{0%,to{box-shadow:0 0 0 1.5px color-mix(in srgb,var(--ok) 55%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 10%,transparent)}}@media (prefers-reduced-motion: reduce){.be-avatar.live{animation:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--ok) 55%,transparent)}}.title-input{flex:1 1 auto;min-width:0;font:inherit;font-size:13.5px;color:var(--text);background:var(--bg-panel);border:1px solid var(--accent-dim);border-radius:6px;padding:2px 6px}.title-input:focus{outline:none;border-color:var(--accent)}.row-menu{flex:0 0 auto;opacity:0;transition:opacity .12s}.session-item:hover .row-menu,.session-item.active .row-menu,.session-item:focus-within .row-menu{opacity:1}@media (hover: none){.row-menu{opacity:.7}}.sess-menu{position:fixed;z-index:40;width:max-content;max-width:min(320px,calc(100vw - 12px));background:var(--bg-panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:5px;display:flex;flex-direction:column;gap:1px}.sess-menu-head{display:flex;align-items:center;gap:8px;padding:6px 7px 8px;margin-bottom:3px;border-bottom:1px solid var(--line)}.sess-menu-title{font-size:12.5px;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sess-menu-item{display:flex;align-items:center;gap:9px;width:100%;padding:7px 8px;text-align:left;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font:inherit;font-size:13px;cursor:pointer}.sess-menu-item:hover{background:var(--bg-raised);border-color:var(--line)}.sess-menu-item.danger{color:var(--err)}.sess-menu-item.danger:hover{border-color:var(--err);background:rgba(var(--err-rgb),.08)}.sess-menu-item svg{flex:0 0 auto;color:var(--text-dim)}.sess-menu-item.danger svg{color:var(--err)}.bubble-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;background:transparent;border:1px solid transparent;border-radius:6px;color:var(--text-dim);font:inherit;cursor:pointer}.bubble-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--text)}.bubble-btn.copy.ok{color:var(--ok);border-color:var(--ok)}.bubble-btn.copy.no{color:var(--err);border-color:var(--err)}.bubble-btn.speak.on,.bubble-btn.fork:hover{color:var(--accent-text);border-color:var(--accent-dim)}.bubble-btn.fork.failed{color:var(--err);border-color:var(--err)}.bubble-btn.fork.working{opacity:.55}.bubble-btn:disabled{opacity:.55;cursor:default}@media (max-width: 720px){.sess-menu{left:8px!important;right:8px;top:auto!important;bottom:calc(10px + env(safe-area-inset-bottom,0px));width:auto!important;max-width:none;min-width:0}.sess-menu-item{padding:11px 10px;font-size:14px}.session-item{min-height:36px}.bubble-btn{width:34px;height:30px}}.call-mode{position:fixed;inset:0;z-index:60;--bg-panel: rgba(255,255,255,.07);--bg-raised: rgba(255,255,255,.14);--line: rgba(255,255,255,.16);--text: #eef2f7;--text-dim: rgba(238,242,247,.6);--err: #f2555a;--on-accent: #0b1220;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:max(20px,env(safe-area-inset-top)) 18px calc(20px + env(safe-area-inset-bottom));background:radial-gradient(120% 90% at 50% 33%,#111827,#080a12 60%,#05060b);color:var(--text);overflow:hidden;animation:call-in .24s ease-out}@keyframes call-in{0%{opacity:0;transform:scale(1.015)}to{opacity:1;transform:none}}.call-mode[data-phase=connecting]{--call-tone: #7d91c8}.call-mode[data-phase=listening]{--call-tone: #38bdf8}.call-mode[data-phase=thinking]{--call-tone: #a78bfa}.call-mode[data-phase=speaking]{--call-tone: #fbbf24}.call-mode[data-phase=error]{--call-tone: #f87171}.call-mode:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(26% 19% at 50% 37%,color-mix(in srgb,var(--call-tone, #38bdf8) 26%,transparent) 0%,transparent 100%),radial-gradient(62% 44% at 50% 37%,color-mix(in srgb,var(--call-tone, #38bdf8) 15%,transparent) 0%,transparent 74%);transition:background .5s ease}.call-head,.call-orb,.call-lines,.call-wave,.call-controls{position:relative}.call-head{display:flex;flex-direction:column;align-items:center;gap:4px}.call-title{font-size:17px;font-weight:600;letter-spacing:.03em;color:var(--call-tone, var(--text));text-shadow:0 0 18px color-mix(in srgb,var(--call-tone, #38bdf8) 45%,transparent)}.call-sub{font-size:11.5px;color:var(--text-dim);letter-spacing:.04em}.call-orb{height:min(46vh,76vw,380px);aspect-ratio:1;flex:0 1 auto;padding:0;border:none;background:transparent;cursor:pointer;-webkit-tap-highlight-color:transparent}.call-orb-canvas{display:block;width:100%;height:100%}.call-orb:focus-visible{outline:2px solid var(--call-tone, var(--accent));outline-offset:6px;border-radius:50%}.call-lines{display:flex;flex-direction:column;align-items:center;gap:6px;width:min(560px,92vw);min-height:60px;flex:0 1 auto;overflow:hidden}.call-heard{margin:0;font-size:15px;line-height:1.45;text-align:center}.call-reply{margin:0;font-size:13.5px;line-height:1.5;color:var(--text-dim);text-align:center;max-height:24vh;overflow-y:auto;white-space:pre-wrap}.call-hint{margin:0;font-size:12.5px;color:var(--text-dim)}.call-err{margin:0;font-size:12.5px;color:var(--err)}.call-note{margin:0;font-size:12.5px;color:var(--warn, #d08a2a)}.call-wave{width:min(420px,80vw);height:46px;display:block;flex:0 1 auto;min-height:34px;border-radius:12px;background:linear-gradient(to bottom,#ffffff03,#ffffff09)}.call-hist{width:min(560px,92vw);flex:0 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--line);border-radius:14px;background:#ffffff0a}.call-hist-bar{display:flex;align-items:center;gap:8px;width:100%;min-height:44px;padding:0 12px;border:0;background:transparent;color:var(--text-dim);cursor:pointer;text-align:left}.call-hist-bar:hover{color:var(--text)}.call-hist-title{font-size:12.5px;color:var(--text)}.call-hist-n{font-size:11.5px;color:var(--text-dim)}.call-hist-peek{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.call-hist-chev{margin-left:auto;display:inline-flex;transition:transform .18s ease}.call-hist[data-open=true] .call-hist-chev{transform:rotate(180deg)}.call-hist-list{flex:1 1 auto;min-height:0;max-height:min(38vh,300px);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:10px 12px 12px;display:flex;flex-direction:column;gap:9px;border-top:1px solid var(--line)}.call-hm{font-size:12.5px;line-height:1.5;color:var(--text)}.call-hm-who{display:block;margin-bottom:2px;font-size:10.5px;letter-spacing:.08em;color:var(--text-dim);opacity:.7}.call-hm.meta,.call-hm.tool{font-size:11.5px;font-style:italic;color:var(--text-dim)}.call-hm.current{border-left:2px solid var(--call-tone, #38bdf8);margin-left:-12px;padding-left:10px}.call-hm .code{margin:4px 0;padding:6px 8px;font-size:11.5px;color:var(--text)}.call-hist-back{align-self:center;margin:0 0 10px;min-height:32px;padding:0 12px;border-radius:999px;border:1px solid var(--line);background:#ffffff0f;color:var(--text);font-size:12px;cursor:pointer}.call-hist-back:hover{background:var(--bg-raised)}.call-modes{display:inline-flex;align-items:center;gap:2px;margin-top:6px;padding:2px;border:1px solid var(--line);border-radius:999px;background:#ffffff0a}.call-mode-btn{min-height:28px;padding:0 11px;border:0;border-radius:999px;cursor:pointer;background:transparent;color:var(--text-dim);font-size:12px;letter-spacing:.02em}.call-mode-btn:hover{color:var(--text)}.call-mode-btn.on{background:var(--call-tone, #38bdf8);color:#0b1220;font-weight:600;box-shadow:0 0 12px color-mix(in srgb,var(--call-tone, #38bdf8) 40%,transparent)}@media (max-width: 400px){.call-modes{flex-wrap:wrap;justify-content:center;margin-top:4px}.call-mode-btn{min-height:26px;padding:0 8px;font-size:11.5px}}.call-controls{display:flex;align-items:center;gap:16px;margin-top:2px}.call-btn{width:52px;height:52px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text);cursor:pointer}.call-btn:hover{background:var(--bg-raised);border-color:var(--text-dim)}.call-btn.on{background:var(--accent);color:var(--on-accent);border-color:transparent}.call-btn.hangup{width:60px;height:60px;background:var(--err);border-color:transparent;color:#fff}.call-btn.hangup:hover{background:var(--err);filter:brightness(1.1)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.call-gear{position:absolute;z-index:2;top:max(14px,env(safe-area-inset-top));right:14px;width:38px;height:38px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.call-gear:hover{color:var(--text);background:var(--bg-raised)}.call-cc-btn{position:absolute;z-index:3;top:max(14px,env(safe-area-inset-top));right:60px;width:38px;height:38px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.call-cc-btn:hover{color:var(--text);background:var(--bg-raised)}.call-cc-btn.on{color:#0b1220;background:var(--call-tone, #38bdf8);border-color:transparent}.call-mode[data-caption=true]{gap:10px;padding-top:calc(max(14px,env(safe-area-inset-top)) + 44px)}.call-mode[data-caption=true] .call-gear{z-index:3}.call-mode[data-caption=true] .call-orb{position:absolute;inset:0;z-index:0;width:auto;height:auto;aspect-ratio:auto;pointer-events:none;cursor:default}.call-mode[data-caption=true] .call-orb-canvas{width:100%;height:100%;filter:blur(34px) saturate(1.3) brightness(1.35);transform:scale(1.08)}.call-mode[data-caption=true]:before{z-index:1}.call-mode[data-caption=true] .call-wave{display:none}.call-cc{position:relative;z-index:2;width:min(560px,94vw);flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid rgba(255,255,255,.14);border-radius:18px;background:linear-gradient(180deg,#1218264d,#090c1494);-webkit-backdrop-filter:blur(22px) saturate(1.35);backdrop-filter:blur(22px) saturate(1.35);box-shadow:inset 0 1px #ffffff12,0 20px 60px #0000006b}.call-cc-head{display:flex;align-items:center;gap:10px;padding:7px 12px;border-bottom:1px solid rgba(255,255,255,.07)}.call-cc-head .call-modes{margin-top:0}.call-cc-state{display:inline-flex;align-items:center;gap:7px;min-height:30px;padding:0 4px;border:0;background:transparent;cursor:pointer;color:var(--call-tone, #38bdf8);font-size:12.5px;font-weight:600;letter-spacing:.02em}.call-cc-dot{width:7px;height:7px;border-radius:50%;background:currentColor;box-shadow:0 0 10px currentColor;animation:cc-pulse 2.4s ease-in-out infinite}@keyframes cc-pulse{0%,to{opacity:.5;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}.call-cc-n{margin-left:auto;font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--text-dim)}.call-cc-latest{position:absolute;left:50%;bottom:58px;transform:translate(-50%);z-index:3;min-height:28px;padding:0 12px;border-radius:999px;border:1px solid var(--line);background:#141a28d1;color:var(--text);font-size:11.5px;cursor:pointer;backdrop-filter:blur(8px)}.call-cc-latest:hover{background:var(--bg-raised)}.call-cc-list{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:12px 14px 16px;display:flex;flex-direction:column;gap:12px}.call-cc-inner{display:flex;flex-direction:column}.call-cc-inner .msg{margin-bottom:13px}.call-cc-inner .msg:last-child{margin-bottom:2px}.call-cc-inner .msg .role{color:#ffffff85}.call-cc-inner .msg .bubble{color:#fffffff2}.call-cc-inner .msg.user .bubble{background:#ffffff12;border:1px solid rgba(255,255,255,.09)}.call-cc-inner .msg.agent .bubble{background:transparent;border:0}.call-cc-inner .msg.meta .bubble{color:#fca5a5;background:#f871711a}.call-cc-inner .tool-card,.call-cc-inner .plan-card,.call-cc-inner .thought .bubble{background:#ffffff0b;border-color:#ffffff17}.call-floor-row{flex:0 0 auto;display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:8px 10px;border-top:1px solid rgba(255,255,255,.09)}.call-floor-row.single{grid-template-columns:1fr}.call-floor{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:46px;margin:0;padding:0 12px;border:0;border-radius:12px;background:#ffffff0d;color:var(--text);font-size:14px;font-weight:650;letter-spacing:.01em;cursor:pointer;-webkit-tap-highlight-color:transparent;touch-action:manipulation;user-select:none;-webkit-user-select:none}.call-floor:hover:not(:disabled){background:#ffffff17}.call-floor.is-take{background:color-mix(in srgb,var(--call-tone, #fbbf24) 88%,#000);color:#0b1220}.call-floor.is-take:hover{background:var(--call-tone, #fbbf24)}.call-floor.is-send{background:color-mix(in srgb,var(--call-tone, #38bdf8) 88%,#000);color:#0b1220}.call-floor.is-send:hover{background:var(--call-tone, #38bdf8)}.call-floor.is-retry{background:#ffffff1a}.call-floor:disabled{color:var(--text-dim);background:#ffffff08;cursor:default}.call-floor.is-done{background:color-mix(in srgb,var(--call-tone, #38bdf8) 80%,#000);color:#0b1220}.call-floor.is-done:hover{background:var(--call-tone, #38bdf8)}.call-floor.is-ptt{background:#ffffff17}.call-floor.is-ptt.on{background:color-mix(in srgb,var(--call-tone, #38bdf8) 82%,#000);color:#0b1220;box-shadow:0 0 0 2px color-mix(in srgb,var(--call-tone, #38bdf8) 45%,transparent)}.call-cc-list .call-hm{font-size:13.5px;line-height:1.62}.call-cc-list .call-hm.meta,.call-cc-list .call-hm.tool{font-size:12px}.call-cc-list .call-hint,.call-cc-list .call-err,.call-cc-list .call-note{margin:0}.call-hm.live .call-hm-who:after{content:" · 在说";color:var(--call-tone, #38bdf8)}.call-sheet{position:absolute;inset:0;z-index:3;display:flex;align-items:center;justify-content:center;padding:16px;background:#04060cbd;animation:call-in .16s ease-out}.call-sheet-card{width:min(460px,100%);max-height:88%;overflow-y:auto;display:flex;flex-direction:column;gap:14px;padding:16px;border:1px solid var(--line);border-radius:18px;background:#0d1220;box-shadow:0 24px 60px #0000008c}.call-sheet-head{display:flex;align-items:center;justify-content:space-between;font-size:15px;font-weight:600}.call-sheet-x{width:30px;height:30px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:transparent;color:var(--text-dim);cursor:pointer}.call-sheet-note{margin:0;font-size:11.5px;line-height:1.5;color:var(--text-dim)}.call-knob{display:flex;flex-direction:column;gap:4px}.call-knob-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.call-knob-name{font-size:13.5px}.call-knob-val{font-size:13px;font-variant-numeric:tabular-nums;color:var(--call-tone, #38bdf8)}.call-knob input[type=range]{width:100%;height:30px;accent-color:var(--call-tone, #38bdf8);background:transparent;cursor:pointer}.call-knob-ends{display:flex;justify-content:space-between;font-size:10.5px;color:var(--text-dim)}.call-knob-hint{font-size:11px;line-height:1.45;color:var(--text-dim)}.call-knob.off{opacity:.45}.call-knob.off input[type=range]{cursor:not-allowed}.call-sheet-warn{margin:0;padding:9px 11px;border-radius:10px;font-size:11.5px;line-height:1.5;border:1px solid color-mix(in srgb,var(--call-tone, #38bdf8) 35%,transparent);background:color-mix(in srgb,var(--call-tone, #38bdf8) 12%,transparent);color:var(--text)}.call-sheet-echo{margin:0;font-size:11.5px;line-height:1.5;color:var(--text-dim)}.call-sheet-echo.bad{color:#fbbf24}.call-sheet-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:2px}.call-sheet-btn{min-height:40px;padding:0 14px;border-radius:10px;font-size:13px;border:1px solid var(--line);background:transparent;color:var(--text);cursor:pointer}.call-sheet-btn:hover{background:var(--bg-raised)}.call-sheet-btn.primary{background:var(--call-tone, #38bdf8);border-color:transparent;color:#0b1220;font-weight:600}@media (max-width: 720px){.call-mode{gap:8px}.call-sheet{align-items:flex-end;padding:0}.call-sheet-card{width:100%;max-height:84%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.call-gear{width:42px;height:42px}.call-cc-btn{width:42px;height:42px;right:64px}.call-mode[data-caption=true]{padding-top:calc(max(14px,env(safe-area-inset-top)) + 48px)}.call-cc-head .call-mode-btn{min-height:26px;padding:0 9px;font-size:11.5px}.call-cc-head .call-cc-state{font-size:12px;gap:6px}.call-cc{width:94vw;border-radius:16px}.call-cc-head{padding:5px 10px;gap:8px}.call-cc-list{padding:10px 12px 14px;gap:11px}.call-cc-list .call-hm{font-size:13px}.call-floor{min-height:48px;font-size:14px}.call-floor span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call-cc-inner .msg .bubble{font-size:13.5px;padding:9px 12px}.call-knob input[type=range]{height:34px}.call-orb{height:min(42vh,72vw,300px)}.call-lines{min-height:88px}.call-reply{max-height:20vh}.call-hist-list{max-height:min(30vh,240px)}.call-hist-peek{display:none}.call-btn{width:56px;height:56px}.call-btn.hangup{width:64px;height:64px}}@media (prefers-reduced-motion: reduce){.call-mode,.call-cc-dot{animation:none}}.be-list{display:flex;flex-direction:column;gap:8px;margin-top:12px}.be-row{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:10px 12px}.be-row-main{min-width:0;display:flex;flex-direction:column;gap:3px}.be-row-title{display:flex;gap:8px;align-items:center;flex-wrap:wrap;font-size:13px}.be-row-sub{font-size:11.5px;color:var(--text-dim);font-family:var(--mono);word-break:break-all}.be-row-note{font-size:11.5px;color:var(--text-dim)}.be-kind-help{display:block;margin:6px 0 0;padding:8px 10px;border-left:2px solid var(--accent-dim);background:var(--chip-bg);border-radius:0 8px 8px 0;line-height:1.75}.be-kind-help b{color:var(--text)}.be-kind-help code{font-size:11px}.be-row-actions{display:flex;gap:6px;flex-shrink:0;flex-wrap:wrap}.be-badge{font-size:10.5px;padding:1px 6px;border-radius:999px;border:1px solid var(--line);color:var(--text-dim);background:var(--chip-bg)}.be-badge.be-warn{color:var(--accent);border-color:var(--accent-dim)}.be-badge.be-danger,.be-danger{color:var(--err)}.be-badge.be-dim{opacity:.75}.be-badge.be-ok{color:var(--ok, #3fb950);border-color:var(--ok, #3fb950)}.be-health{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px;font-size:11.5px}.be-code{font-family:var(--mono);font-size:10.5px;padding:0 4px;border:1px solid var(--line);border-radius:4px;color:var(--text-dim)}.be-guidance{flex-basis:100%;color:var(--text-dim);font-size:11.5px}.be-handshake{margin-top:4px;font-size:11.5px;color:var(--text-dim)}.be-handshake code{font-family:var(--mono)}.be-dim{color:var(--text-dim);font-size:11.5px}.hint-warn{color:var(--accent);font-size:11.5px;margin-top:4px}.be-hint{display:block}.be-hint code,.be-inspect code,.be-inspect-out{font-family:var(--mono)}.be-hint code{word-break:break-all}.be-inspect{margin-top:12px;border:1px dashed var(--line);border-radius:10px;padding:10px 12px;font-size:12px;background:var(--bg-raised)}.be-inspect-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.be-inspect ul{margin:8px 0 0;padding-left:18px;display:flex;flex-direction:column;gap:4px}.be-inspect-out{margin-top:4px;font-size:11px;color:var(--text-dim);white-space:pre-wrap;word-break:break-all}.be-backdrop{position:fixed;inset:0;z-index:60;background:#00000073;display:flex;align-items:center;justify-content:center;padding:20px}.be-modal{background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;width:min(560px,100%);max-height:min(86vh,780px);display:flex;flex-direction:column;box-shadow:0 18px 48px #00000080}.be-modal-head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line);font-size:13.5px}.be-modal-head b{font-size:13.5px}.be-modal-head code{font-family:var(--mono);font-size:11.5px;color:var(--text-dim)}.be-modal-x{margin-left:auto}.be-modal-body{overflow:auto;overscroll-behavior:contain;padding:2px 16px 14px}.be-modal-foot{display:flex;align-items:center;gap:8px;padding:12px 16px;border-top:1px solid var(--line)}.be-modal-foot button{flex:0 0 auto;white-space:nowrap}.be-modal-foot .set-mini{margin-left:auto}.be-modal-err{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--err);border:none;padding:0;background:none}@media (max-width: 720px){.be-backdrop{padding:0;align-items:flex-end}.be-modal{width:100%;max-height:92vh;border-radius:14px 14px 0 0}}@media (max-width: 720px){.be-row{flex-direction:column}}.tls-once{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:7px 10px;font-size:12px;line-height:1.5;background:var(--chip-bg);border:1px solid var(--accent-dim);border-radius:8px}.tls-warn{color:var(--warn, #b4690e)}.tls-cols{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.4fr);gap:18px;margin-top:12px}@media (max-width: 1024px){.tls-cols{grid-template-columns:minmax(0,1fr);gap:14px}}.tls-left{min-width:0}.tls-meta span{min-width:0;overflow-wrap:anywhere}.tls-dl{display:inline-flex;align-items:center;gap:6px;text-decoration:none;font-size:13px;font-weight:600;padding:7px 12px;border-radius:8px;background:var(--accent);color:var(--accent-ink, #fff);border:1px solid transparent}.tls-dl:hover{filter:brightness(1.06)}.tls-meta{gap:10px}.tls-side{font-size:11.5px;color:var(--text-dim);line-height:1.55}.tls-right{min-width:0;border-left:1px solid var(--line);padding-left:16px}@media (max-width: 1024px){.tls-right{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:12px}}.tls-steps-title{font-size:12.5px;font-weight:600;margin-bottom:6px}.tls-os{margin-top:10px}.tls-os-name{font-size:12px;font-weight:600;color:var(--accent-text)}.tls-os ol{margin:4px 0 0;padding-left:18px;font-size:12px;line-height:1.65;color:var(--text-dim)}.tls-os ol li{margin:3px 0}.tls-os code{font-family:var(--mono);background:var(--chip-bg);border:1px solid var(--line);border-radius:4px;padding:1px 4px;font-size:11px}.tls-cmd{display:block;margin-top:4px;white-space:pre-wrap;word-break:break-all}@media (min-width: 721px) and (pointer: coarse){.sidebar header .tagline{font-size:12px}.rail-section{font-size:12px;min-height:34px}.rail-group-name{font-size:13px}.rail-group-count{font-size:12px}.rail-placeholder{font-size:12.5px;min-height:34px}.session-item{min-height:42px;padding-top:6px;padding-bottom:6px}.session-item .title{font-size:14.5px}.session-item .meta,.rail-at{font-size:12px}.rail-search{font-size:14px;min-height:38px}.new-btn{min-height:40px;font-size:14px}.rail-more{min-height:34px;font-size:12px}}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
<link rel="icon" href="/icons/favicon.ico" sizes="any" />
|
|
15
15
|
<link rel="apple-touch-icon" href="/icons/apple-touch-icon-180.png" />
|
|
16
16
|
<title>Agentus</title>
|
|
17
|
-
<script type="module" crossorigin src="/assets/index-
|
|
18
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
17
|
+
<script type="module" crossorigin src="/assets/index-C9RyEkdh.js"></script>
|
|
18
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Dej-v4qD.css">
|
|
19
19
|
</head>
|
|
20
20
|
<body>
|
|
21
21
|
<div id="root"></div>
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
-
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
-
* https://github.com/chjj/term.js
|
|
5
|
-
* @license MIT
|
|
6
|
-
*
|
|
7
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
-
* in the Software without restriction, including without limitation the rights
|
|
10
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
-
* furnished to do so, subject to the following conditions:
|
|
13
|
-
*
|
|
14
|
-
* The above copyright notice and this permission notice shall be included in
|
|
15
|
-
* all copies or substantial portions of the Software.
|
|
16
|
-
*
|
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
-
* THE SOFTWARE.
|
|
24
|
-
*
|
|
25
|
-
* Originally forked from (with the author's permission):
|
|
26
|
-
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
-
* http://bellard.org/jslinux/
|
|
28
|
-
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
-
* The original design remains. The terminal itself
|
|
30
|
-
* has been extended to include xterm CSI codes, among
|
|
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;inset: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;inset: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;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: #0c1116;--bg-panel: #121a22;--bg-raised: #182430;--line: #223140;--text: #e3ecf3;--text-dim: #b6bec3;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #295f7b;--ok: #4ec9a0;--err: #e57373;--err-rgb: 229, 115, 115;--thought: #8f7bd7;--tool: #5ba8d4;--code-bg: #0a0f14;--code-fg: #d7e2ea;--code-bar: rgba(255, 255, 255, .06);--code-line: rgba(255, 255, 255, .1);--chip-bg: #1e2b38;--on-accent: #101820;--accent-text: #4aacdf;--scrim: rgba(0, 0, 0, .55);--shadow: 0 18px 40px rgba(0, 0, 0, .45);--scroll-thumb: rgba(255, 255, 255, .18);--scroll-thumb-hover: rgba(255, 255, 255, .34);--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace}:root[data-theme=light]{--bg: #f4f6f9;--bg-panel: #ffffff;--bg-raised: #eaeef4;--line: #d7dde6;--text: #1c2735;--text-dim: #3f4750;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #9bd1ed;--ok: #1f9d75;--err: #c2453f;--err-rgb: 194, 69, 63;--thought: #6d5bc4;--tool: #2f7fb5;--code-bg: #10171f;--code-fg: #cfd8e3;--code-bar: rgba(255, 255, 255, .07);--code-line: rgba(255, 255, 255, .12);--chip-bg: #e8ecf2;--accent-text: #16659b;--on-accent: #101820;--scrim: rgba(12, 17, 22, .42);--shadow: 0 18px 40px rgba(23, 36, 48, .18);--scroll-thumb: rgba(12, 17, 22, .22);--scroll-thumb-hover: rgba(12, 17, 22, .38)}@media (prefers-color-scheme: light){:root[data-theme=system]{--bg: #f4f6f9;--bg-panel: #ffffff;--bg-raised: #eaeef4;--line: #d7dde6;--text: #1c2735;--text-dim: #3f4750;--accent: #4aacdf;--accent-rgb: 74, 172, 223;--accent-dim: #9bd1ed;--ok: #1f9d75;--err: #c2453f;--err-rgb: 194, 69, 63;--thought: #6d5bc4;--tool: #2f7fb5;--code-bg: #10171f;--code-fg: #cfd8e3;--code-bar: rgba(255, 255, 255, .07);--code-line: rgba(255, 255, 255, .12);--chip-bg: #e8ecf2;--accent-text: #16659b;--on-accent: #101820;--scrim: rgba(12, 17, 22, .42);--shadow: 0 18px 40px rgba(23, 36, 48, .18);--scroll-thumb: rgba(12, 17, 22, .22);--scroll-thumb-hover: rgba(12, 17, 22, .38)}}*{box-sizing:border-box}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-corner{background:transparent}*::-webkit-scrollbar-thumb{background-color:transparent;border:2px solid transparent;border-radius:999px;background-clip:padding-box}*:hover::-webkit-scrollbar-thumb{background-color:var(--scroll-thumb)}*::-webkit-scrollbar-thumb:hover{background-color:var(--scroll-thumb-hover)}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font:15px/1.5 -apple-system,Segoe UI,PingFang SC,Noto Sans SC,sans-serif;-webkit-font-smoothing:antialiased}button{font:inherit}.app{display:flex;height:100%;overflow:hidden}.sidebar{width:var(--rail-w, 268px);flex:0 0 var(--rail-w, 268px);background:var(--bg-panel);border-right:1px solid var(--line);display:flex;flex-direction:column;position:relative}.sidebar header{padding:14px 16px 10px;display:flex;align-items:baseline;gap:8px;min-width:0}.sidebar header>*{min-width:0}.sidebar header .logo{color:var(--accent-text);font-weight:700;letter-spacing:.5px;display:inline-flex;align-items:center;gap:7px;flex:0 0 auto}.brand-mark{display:block;flex:0 0 auto}.sidebar header .tagline{font-size:11px;color:var(--text-dim);flex:1 1 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.new-btn{margin:0 12px 10px;padding:9px;border-radius:8px;cursor:pointer;border:1px dashed var(--accent-dim);background:transparent;color:var(--accent-text)}.new-btn:hover{background:rgba(var(--accent-rgb),.08)}.rail-search{margin:0 8px 6px;padding:7px 9px;border-radius:8px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);font-size:12.5px;font-family:var(--mono)}.rail-search:focus{outline:none;border-color:var(--accent-dim)}.rail-search::placeholder{color:var(--text-dim);opacity:1}.load-earlier{display:flex;justify-content:center;margin-bottom:10px}.load-earlier-busy,.load-earlier-end{font-size:11px;color:var(--text-dim);line-height:1.6}.cold-purge{margin-left:auto;background:transparent;border:1px solid transparent;color:var(--text-dim);font-size:11px;line-height:1;padding:2px 5px;border-radius:5px;cursor:pointer}.session-item.cold:hover .cold-purge{border-color:var(--line);color:var(--err)}.session-list{flex:1;overflow-y:auto;padding:0 8px 8px}.session-item{padding:10px;border-radius:8px;cursor:pointer;margin-bottom:4px;border:1px solid transparent}.session-item:hover{background:var(--bg-raised)}.session-item.active{background:var(--bg-raised);border-color:var(--line)}.session-item .title{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-item .meta{font-size:11.5px;color:var(--text-dim);display:flex;gap:8px;margin-top:3px;align-items:center}.dot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}.dot.ready{background:var(--ok)}.dot.running{background:var(--accent);animation:pulse 1s infinite}.dot.starting{background:var(--text-dim)}.dot.error,.dot.closed{background:var(--err)}.rail-sep{display:flex;justify-content:space-between;align-items:baseline;padding:12px 10px 6px;font-size:11px;letter-spacing:.4px;text-transform:uppercase;color:var(--text-dim);border-top:1px solid var(--line);margin:8px 4px 0}.session-item.cold:hover{background:rgba(var(--accent-rgb),.06)}.dot.cold{background:transparent;border:1px solid var(--text-dim)}.hint{color:var(--text-dim)}@keyframes pulse{50%{opacity:.35}}.badge{font-size:10.5px;border:1px solid var(--line);border-radius:5px;padding:0 5px;color:var(--text-dim)}.badge.perm{border-color:var(--accent-dim);color:var(--accent-text)}.badge.bg{border-color:var(--accent-dim);color:var(--accent-text);font-variant-numeric:tabular-nums;display:inline-flex;align-items:center;gap:3px}.bg-row{border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:8px;margin-bottom:6px;background:var(--bg-panel)}.bg-head{display:flex;align-items:center;gap:7px;width:100%;padding:3px 8px;background:none;border:0;color:var(--text-dim);font:inherit;text-align:left;cursor:pointer}.bg-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--accent)}.bg-dot[data-state=exited]{background:var(--text-dim)}.bg-dot[data-wake="1"]{animation:pulse 1.8s ease-in-out infinite}@media (prefers-reduced-motion: reduce){.bg-dot[data-wake="1"]{animation:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 45%,transparent)}}.bg-text{flex:0 0 auto;white-space:nowrap;font-size:12.5px;color:var(--text)}.bg-hint{flex:1 1 auto;min-width:0;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-caret{flex:0 0 auto;font-size:10px;opacity:.7}.bg-list{list-style:none;margin:0;padding:2px 8px 6px;border-top:1px solid var(--line);max-height:40vh;overflow:auto}.bg-item{display:block;padding:4px 0;border-top:1px dashed var(--line)}.bg-item:first-child{border-top:0}.bg-tag{display:inline-block;margin-bottom:2px;padding:0 6px;border-radius:999px;border:1px solid var(--accent);color:var(--accent-text, var(--accent));font-size:9.5px;line-height:15px;letter-spacing:.02em}.bg-item[data-kind=delegation] .bg-cmd-full{color:var(--text);font-style:italic}.bg-cmd-full{margin:0;max-height:132px;overflow:auto;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;line-height:1.45;white-space:pre-wrap;word-break:break-word;color:var(--text)}.bg-item-foot{display:flex;align-items:center;gap:10px;margin-top:2px}.bg-cmd{flex:1 1 auto;min-width:0;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-meta{flex:0 0 auto;color:var(--text-dim);font-variant-numeric:tabular-nums}.bg-item[data-state=exited] .bg-meta{color:var(--accent-text)}.bg-notice{border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:7px;background:var(--bg-panel);max-width:100%}.bg-notice[data-ok=fail]{border-left-color:var(--err)}.bg-notice-head{display:flex;align-items:center;gap:7px;width:100%;padding:4px 8px;background:none;border:0;color:var(--text-dim);font:inherit;text-align:left;cursor:pointer}.bg-notice-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--accent)}.bg-notice[data-ok=fail] .bg-notice-dot{background:var(--err)}.bg-notice-title{flex:0 0 auto;font-size:12.5px;color:var(--text)}.bg-notice-cmd{flex:1 1 auto;min-width:0;font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bg-notice-code{flex:0 0 auto;font-size:11.5px;color:var(--text-dim);font-variant-numeric:tabular-nums}.bg-notice-caret{flex:0 0 auto;font-size:10px;opacity:.7}.bg-notice-body{border-top:1px solid var(--line);padding:4px 8px 7px}.bg-notice-label{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim);margin-top:3px}.bg-notice-pre{margin:2px 0 0;padding:5px 7px;border-radius:5px;background:var(--bg-code, rgba(127, 127, 127, .07));font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:11.5px;line-height:1.45;white-space:pre-wrap;word-break:break-word;max-height:260px;overflow:auto}@media (max-width: 720px){.bg-notice-cmd{font-size:11px}}.deleg-notice .bg-notice-cmd{font-variant-numeric:normal}.deleg-task{margin-top:7px;padding-top:6px;border-top:1px dashed var(--line)}.deleg-task:first-of-type{margin-top:4px;padding-top:0;border-top:0}.deleg-task-head{display:flex;align-items:baseline;gap:6px}.deleg-mark{flex:0 0 auto;font-size:11.5px;color:var(--accent)}.deleg-task[data-ok=fail] .deleg-mark{color:var(--err)}.deleg-goal{flex:1 1 auto;min-width:0;font-size:12.5px;color:var(--text);word-break:break-word}.deleg-meta{flex:0 0 auto;font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.deleg-body{margin:3px 0 0 13px;max-height:340px;overflow:auto;overscroll-behavior:contain;font-size:12.5px}.deleg-body>:first-child{margin-top:0}.deleg-body>:last-child{margin-bottom:0}@media (max-width: 720px){.deleg-body{max-height:55vh}.deleg-meta{display:none}}@media (max-width: 720px){.bg-hint{display:none}.bg-text{font-size:12px}}.sidebar footer{padding:10px 14px;font-size:11.5px;color:var(--text-dim);border-top:1px solid var(--line)}.sidebar footer .conn.off{color:var(--err)}.main{flex:1;display:flex;flex-direction:column;min-width:0}.chat-head{padding:7px 10px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:6px;flex-wrap:nowrap;background:var(--bg-panel);min-height:46px}.chat-head .title{font-weight:600;font-size:14px;flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.icon-btn .spin,.sess-menu-item .spin{animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.icon-btn .spin,.sess-menu-item .spin{animation:none}}.head-spacer{flex:1 1 auto;min-width:4px}.speak-wrap{position:relative;display:inline-flex}.speak-wrap .auto-read{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:manipulation}.speak-dot{position:absolute;top:4px;right:4px;width:5px;height:5px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 1.5px var(--bg-panel)}.speak-menu{position:absolute;top:calc(100% + 6px);right:0;z-index:40;min-width:240px;max-height:min(70vh,420px);overflow-y:auto;overscroll-behavior:contain;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 30px #00000052;padding:3px;display:flex;flex-direction:column}.speak-menu-item{display:flex;align-items:center;gap:7px;text-align:left;width:100%;background:none;border:1px solid transparent;border-radius:7px;color:var(--text);font:inherit;font-size:12.5px;padding:7px 8px;cursor:pointer}.speak-menu-item:hover{background:var(--bg-panel);border-color:var(--line)}.speak-menu-item.on{color:var(--text);font-weight:600}.speak-check{width:10px;flex:0 0 10px;color:var(--accent);font-size:11px}.speak-hint{margin:2px 4px 4px;padding-top:6px;border-top:1px solid var(--line);font-size:11px;line-height:1.5;color:var(--text-dim)}.bubble-speak{position:relative;display:inline-flex}.bubble-btn .spin{animation:spin 1s linear infinite}@media (prefers-reduced-motion: reduce){.bubble-btn .spin{animation:none}}.bubble-menu{top:auto;bottom:calc(100% + 6px);right:0;min-width:232px}.speech-note{display:flex;align-items:baseline;gap:6px;flex-wrap:wrap;margin-top:6px;padding-top:5px;border-top:1px dashed var(--line);font-size:11px;line-height:1.55}.speech-note-tag{flex:0 0 auto;font:inherit;font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--accent);background:none;border:1px solid var(--line);border-radius:5px;padding:0 5px;cursor:pointer}.speech-note-text{flex:1 1 240px;min-width:0;color:var(--text-dim);cursor:pointer;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.speech-note.open .speech-note-text{display:inline;-webkit-line-clamp:unset;overflow:visible}.speech-note-meta{flex:0 0 auto;color:var(--text-dim);opacity:.75;font-size:10.5px}.speech-note-x{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;background:none;border:0;padding:0 2px;color:var(--text-dim);cursor:pointer;opacity:.6}.speech-note-x:hover{opacity:1;color:var(--text)}.bubble-note.err{color:var(--err)}.turn-pulse{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--ok);animation:pulse 1.4s infinite}.turn-pulse.quiet{background:var(--accent);animation-duration:2.6s}@media (prefers-reduced-motion: reduce){.turn-pulse{animation:none}}.head-actions{display:inline-flex;align-items:center;gap:0;flex:0 0 auto}.head-actions .icon-btn{width:28px;height:28px}.chat-head .icon-btn svg{width:18px;height:18px}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;flex:0 0 auto;padding:0;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--text-dim);cursor:pointer}.icon-btn:hover{background:var(--bg-raised);border-color:var(--line);color:var(--text)}.icon-btn.danger:hover{color:var(--err);border-color:var(--err)}.chip{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;font-size:11px;padding:2px 7px;border-radius:999px}.perm-chip{border:1px solid var(--accent-dim);color:var(--accent-text)}.perm-pulse{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:pulse 1.2s infinite}.ghost-btn{background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:4px 10px;cursor:pointer;font-size:12.5px}.ghost-btn:hover{color:var(--text);border-color:var(--text-dim)}.ghost-btn.danger:hover{color:var(--err);border-color:var(--err)}.stream-wrap{flex:1;min-height:0;position:relative;display:flex}.stream{flex:1;overflow-y:auto;padding:18px 0;overscroll-behavior:contain}.stream:focus{outline:none}.stream-hint{display:flex;gap:7px;padding:2px 0;color:var(--text-dim);font-size:12.5px;align-items:baseline;flex-wrap:nowrap;min-width:0}.stream-hint>span{flex:0 0 auto;white-space:nowrap}.stream-hint .elapsed{opacity:.75;font-variant-numeric:tabular-nums}.status-note{display:flex;gap:8px;align-items:baseline;margin:6px 0 6px 10px;padding:1px 0 1px 9px;border-left:2px solid var(--line);font-size:11.5px;line-height:1.45;color:var(--text-dim)}.status-note-time{flex:0 0 auto;font-family:var(--mono);font-size:10.5px;opacity:.6;font-variant-numeric:tabular-nums}.status-note-text{flex:1 1 auto;min-width:0;overflow-wrap:anywhere}.status-note[data-kind=warn]{color:var(--warn, #c07a12);border-left-color:var(--warn, #c07a12)}.status-note[data-kind=compacted]{color:var(--ok, #3f8f5f);border-left-color:var(--ok, #3f8f5f)}.status-note{flex-wrap:wrap}.status-note-text{flex:0 1 auto}.status-note-toggle{flex:0 0 auto;padding:0 5px;border-radius:4px;margin-left:2px;border:1px solid var(--line);background:transparent;color:var(--text-dim);font-size:10.5px;line-height:15px;cursor:pointer}.status-note-toggle:hover{color:var(--text);border-color:var(--text-dim)}.status-note-drawer-wrap{flex:0 0 100%;min-width:0}.status-note-drawer{width:100%;max-width:78ch;position:relative;margin:5px 0 1px;border:1px solid var(--line);border-radius:7px;background:var(--panel-2, rgba(127, 127, 127, .04));overflow:hidden}.status-note-drawer-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:3px 9px;border-bottom:1px solid var(--line);font-size:10px;line-height:16px;color:var(--text-dim);opacity:.72}.status-note-drawer-hint{flex:0 0 auto;font-variant-numeric:tabular-nums}.status-note-drawer[data-scroll="1"]:after{content:"";position:absolute;left:1px;right:1px;bottom:1px;height:20px;background:linear-gradient(to bottom,transparent,var(--bg));pointer-events:none}.status-note-items{margin:0;padding:3px 5px 5px;list-style:none;display:flex;flex-direction:column;max-height:200px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}.status-note-item{display:flex;gap:7px;align-items:baseline;padding:4px 5px;font-size:11px;line-height:1.52;color:var(--text)}.status-note-item+.status-note-item{border-top:1px solid var(--line)}.status-note-item-n{flex:0 0 auto;width:15px;text-align:right;font-size:9.5px;line-height:1.9;color:var(--text-dim);opacity:.55;font-variant-numeric:tabular-nums}.status-note-item-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 auto}.status-note-item-text{overflow-wrap:anywhere}.status-note-item-tags{color:var(--text-dim);font-size:9.5px;line-height:14px;opacity:.8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:60%}.status-note-item.more{border-top:0;padding-left:27px;color:var(--text-dim);font-style:italic}.stream-spin{flex:0 0 auto;align-self:flex-start;margin-top:4px;width:11px;height:11px;border-radius:50%;border:1.5px solid var(--line);border-top-color:var(--accent);animation:spin .8s linear infinite}@media (prefers-reduced-motion: reduce){.stream-spin{animation:none}}.jump-latest{position:absolute;left:50%;bottom:14px;transform:translate(-50%);width:34px;height:34px;border-radius:50%;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);box-shadow:0 6px 18px #0006}.jump-latest:hover{color:var(--text);border-color:var(--text-dim)}.jump-latest.has-new{color:var(--accent-text);border-color:var(--accent-dim)}.jump-dot{position:absolute;top:3px;right:3px;width:7px;height:7px;border-radius:50%;background:var(--accent);animation:pulse 1.2s infinite}.rail-search-wrap{position:relative;margin:0 8px 6px;display:flex;align-items:center}.rail-search-wrap>svg{position:absolute;left:9px;color:var(--text-dim);pointer-events:none}.rail-search-wrap .rail-search{margin:0;padding-left:27px;width:100%}.cold-resume{background:transparent;border:1px solid transparent;color:var(--text-dim);padding:2px 4px;border-radius:5px;cursor:pointer;line-height:1;display:inline-flex;align-items:center}.session-item.cold:hover .cold-resume{border-color:var(--line);color:var(--ok)}.stream-inner{margin:0;padding:0 20px}.msg{margin-bottom:14px;display:flex;flex-direction:column;align-items:flex-start;min-width:0}.msg>*{max-width:100%}.msg.user{align-items:flex-end}.msg.user.from-agent .role{color:var(--accent, #6ea8fe);letter-spacing:.2px}.msg.user.from-agent .bubble{border-style:dashed;border-color:var(--accent, #6ea8fe)}.msg.plan,.msg.meta{align-items:stretch}.msg .role{font-size:11px;color:var(--text-dim);margin-bottom:3px;letter-spacing:.4px}.msg .role.with-mark{display:flex;align-items:center;gap:5px}.agent-mark{flex:0 0 auto;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:9.5px}.agent-mark img{display:block;width:16px;height:16px;border-radius:4px;object-fit:contain}.msg .bubble{border-radius:10px;padding:10px 14px;white-space:pre-wrap;overflow-wrap:anywhere}.msg .bubble:has(.md),.msg .bubble>.md{white-space:normal}.msg.user .bubble{background:var(--bg-raised);border:1px solid var(--line)}.msg.agent .bubble{background:transparent}.msg.thought .bubble{background:#8f7bd712;border-left:3px solid var(--thought);color:var(--text-dim);font-size:13.5px;white-space:pre-wrap}.thought-head{display:flex;align-items:center;gap:5px;background:none;border:none;padding:2px 4px;border-radius:6px;cursor:pointer;color:var(--text-dim);font:inherit;font-size:11px;letter-spacing:.4px}.thought-head:hover{background:var(--bg-raised);color:var(--text)}.thought-chev,.tool-chev{flex:0 0 auto;color:var(--text-dim);transition:transform .15s ease}.thought-chev.open,.tool-chev.open{transform:rotate(90deg)}.thought-meta{color:var(--text-dim);opacity:.75;font-variant-numeric:tabular-nums}.msg.thought.live .thought-head{color:var(--thought)}.msg.thought .bubble.live{max-height:6.6em;overflow-y:auto}.thought-stick{align-self:flex-start;display:inline-flex;align-items:center;gap:4px;margin:2px 0 0;padding:2px 8px;border-radius:999px;cursor:pointer;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);font:inherit;font-size:11px;letter-spacing:.3px}.thought-stick:hover{color:var(--text);border-color:var(--text-dim)}.work-run-head{display:flex;align-items:center;gap:6px;width:fit-content;max-width:100%;min-height:30px;padding:4px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text-dim);font:inherit;font-size:11.5px;text-align:left;cursor:pointer}.work-run.active{align-self:stretch}.work-run-head:hover,.work-run-head:focus-visible{outline:none;border-color:var(--accent-dim);background:rgba(var(--accent-rgb),.055)}.work-run.active .work-run-head{border-color:var(--accent-dim)}.work-chev{flex:0 0 auto;color:var(--text-dim);transition:transform .15s ease}.work-chev.open{transform:rotate(90deg)}.work-run-icon{flex:0 0 auto;color:var(--accent-text)}.work-run-count{flex:0 0 auto;font-weight:600;color:var(--text)}.work-run-names,.work-run-chars{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.work-run-state{flex:0 0 auto}.work-run-state.ok{color:var(--ok)}.work-run-state.err{color:var(--err)}.work-run-state.run{color:var(--accent-text)}.work-run-items{display:flex;flex-direction:column;gap:2px;margin:4px 0 0 11px;padding:3px 4px 3px 12px;border-left:1px solid var(--line);max-height:42vh;overflow-y:auto}.work-run-items .msg{margin-bottom:4px}.work-run-items .bubble{max-height:none}@media (max-width: 700px){.work-run-head{min-height:34px}.work-run-items{max-height:38vh}.msg.thought .bubble.live{max-height:7.4em}}.msg.meta .bubble{color:var(--err);font-size:13px;background:#e5737314}.usage-note{color:var(--text-dim);font-size:11.5px;line-height:1.5;max-width:46ch}.msg.plan .bubble{border-left:3px solid var(--ok);background:#4ec9a00f;font-size:13.5px}.plan-card{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:3px 8px;background:var(--bg-panel)}.plan-card.completed{border-left-color:var(--ok)}.plan-head{display:flex;align-items:center;gap:8px;width:100%;padding:3px 0;border:0;background:none;color:var(--text);font:inherit;font-size:13px;cursor:pointer;text-align:start}.plan-head:hover{color:var(--accent-text)}.plan-title{font-weight:600;flex:0 0 auto}.plan-count{font-size:12px;color:var(--text-dim);font-variant-numeric:tabular-nums}.plan-state{font-size:11.5px;padding:0 6px;border-radius:999px;line-height:18px}.plan-state.running{color:var(--accent-text);background:rgba(var(--accent-rgb, 90, 140, 255),.12)}.plan-state.done{color:var(--ok);background:#4ec9a01f}.plan-state.terminal{color:var(--err);background:rgba(var(--err-rgb),.1)}.plan-head .tool-chev{margin-inline-start:auto}.plan-body{list-style:none;margin:2px 0 4px;padding:4px 0 0;border-top:1px dashed var(--line)}.plan-name{padding:1px 0 6px;margin-bottom:2px;border-bottom:1px dotted var(--line);font-weight:600;font-size:13px;overflow-wrap:anywhere}.plan-step{display:flex;align-items:baseline;gap:8px;padding:2.5px 0;font-size:13px}@media (max-width: 720px){.plan-step{font-size:12px;gap:6px}.plan-step .step-icon{flex-basis:12px}.plan-name{font-size:12.5px}}.plan-step .step-icon{flex:0 0 14px;text-align:center;color:var(--text-dim)}.plan-step.completed .step-icon{color:var(--ok)}.plan-step.completed .step-title{color:var(--text-dim)}.plan-step.in_progress .step-icon{color:var(--accent);animation:pulse 1.2s infinite}.plan-step.cancelled .step-icon{color:var(--err)}.plan-step.cancelled .step-title{color:var(--text-dim);text-decoration:line-through}.plan-step .step-title{flex:1;min-width:0;overflow-wrap:anywhere}.plan-explanation{margin:6px 0 2px;padding-top:4px;border-top:1px dashed var(--line);font-size:12px;opacity:.7;overflow-wrap:anywhere}.plan-bar{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:1px 8px;margin-bottom:6px;background:var(--bg-panel)}.plan-bar.completed{border-left-color:var(--ok)}.plan-bar .plan-body{max-height:40vh;overflow-y:auto}.plan-dots{display:inline-flex;align-items:center;gap:2.5px;margin-inline-start:2px;flex:0 0 auto}.plan-dots .dot{flex:0 0 5px;width:5px;height:5px;border-radius:50%;background:var(--line);border:1px solid var(--text-dim);box-sizing:border-box}.plan-dots .dot.completed{background:var(--ok);border-color:var(--ok)}.plan-dots .dot.in_progress{background:var(--accent);border-color:var(--accent);animation:pulse 1.2s infinite}.plan-dots .dot.cancelled{background:var(--err);border-color:var(--err)}@media (max-width: 700px){.plan-step{font-size:12px;padding:2px 0;gap:6px}.plan-step .step-icon{flex-basis:12px}.plan-name{font-size:12.5px;padding-bottom:5px}.plan-explanation{font-size:11.5px}.plan-head{font-size:12.5px}}pre.code{background:var(--code-bg);color:var(--code-fg);border:1px solid var(--line);border-radius:8px;padding:10px 12px;overflow-x:auto;font-family:var(--mono);font-size:12.8px}code.inline{font-family:var(--mono);background:var(--chip-bg);color:var(--text);border:1px solid var(--line);padding:1px 5px;border-radius:4px;font-size:.92em}.bubble-actions{display:flex;align-items:center;gap:4px;margin-top:4px;opacity:0;transition:opacity .12s}.msg:hover .bubble-actions{opacity:1}@media (hover: none){.bubble-actions{opacity:.75}}.msg-at{font-size:10.5px;color:var(--text-dim);opacity:.9;font-variant-numeric:tabular-nums;white-space:nowrap;flex:0 0 auto}.bubble-actions .msg-at{flex:1 1 auto;text-align:left}.bubble-note{font-size:10.5px;color:var(--text-dim)}.bubble-files{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.bubble-file{display:inline-flex;align-items:center;gap:4px;font-size:11px;border:1px solid var(--line);border-radius:6px;padding:1px 6px;color:var(--text-dim)}.tool-card{border:1px solid var(--line);border-left:3px solid var(--tool);border-radius:8px;padding:3px 8px;background:var(--bg-panel)}.tool-head{display:flex;align-items:center;gap:6px;width:100%;min-width:0;background:transparent;border:none;padding:2px 0;cursor:pointer;color:var(--text);font-family:var(--mono);font-size:11.5px;text-align:left}.tool-head:hover{color:var(--accent-text)}.tool-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-chev{flex:0 0 auto;opacity:.5;transition:transform .12s ease}.tool-chev.open{transform:rotate(90deg)}.tool-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--text-dim)}.tool-dot.running{background:var(--accent);animation:pulse 1.2s infinite}.tool-dot.ok{background:var(--ok)}.tool-dot.err{background:var(--err)}.tool-card.completed{border-left-color:var(--ok)}.tool-card.failed{border-left-color:var(--err)}.tool-card .tool-body{margin-top:8px;border-top:1px dashed var(--line);padding-top:6px}.tool-card .tool-body .lbl{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim)}.tool-card .tool-body pre{margin:4px 0 8px;padding:6px 9px;max-height:260px;overflow:auto;background:var(--bg);border:1px solid var(--line);border-radius:6px;font-family:var(--mono);font-size:11px;line-height:1.45;white-space:pre-wrap;word-break:break-word}.tool-card .tool-body pre.tool-meta{color:var(--text-dim);margin-bottom:6px}.ctx{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;color:var(--ok)}.ctx.warn{color:#d9a03a}.ctx.hot{color:var(--err)}.ctx .ctx-text{font-size:11px;font-family:var(--mono);color:var(--text-dim)}.slash-palette{position:absolute;bottom:calc(100% + 6px);left:0;right:0;max-height:260px;overflow:auto;background:var(--bg-panel);border:1px solid var(--line);border-radius:10px;padding:4px;box-shadow:0 10px 26px #00000059;z-index:5}.slash-item{display:flex;align-items:baseline;gap:8px;padding:6px 9px;border-radius:6px;cursor:pointer}.slash-item.sel{background:#ffffff0f}.slash-item .cmd{font-family:var(--mono);font-size:12.5px;color:var(--accent-text)}.slash-item .desc{font-size:11.5px;color:var(--text-dim);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slash-item .src{font-size:10px;color:var(--text-dim);border:1px solid var(--line);border-radius:4px;padding:0 4px}.slash-item.empty{color:var(--text-dim);font-size:12px;cursor:default}.perm-card{border:1px solid var(--accent-dim);border-radius:10px;padding:12px 14px;background:rgba(var(--accent-rgb),.05)}.perm-card .q{font-size:13.5px;margin-bottom:4px}.perm-card .tc{font-family:var(--mono);font-size:12.5px;color:var(--text-dim);margin-bottom:10px;overflow-wrap:anywhere}.perm-card .opts{display:flex;gap:8px;flex-wrap:wrap}.perm-card .opts button{border-radius:7px;padding:6px 12px;cursor:pointer;font-size:13px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text)}.perm-card .opts button.allow{border-color:var(--ok);color:var(--ok)}.perm-card .opts button.reject{border-color:var(--err);color:var(--err)}.perm-card.resolved{opacity:.55}.perm-card.resolved .picked{font-size:12px;color:var(--accent-text);margin-top:8px}.perm-card.done{background:transparent;border-style:dashed;opacity:.9}.perm-card.done.yes{border-color:var(--ok)}.perm-card.done.no{border-color:var(--err);opacity:.75}.perm-card .perm-decision{font-size:12.5px;margin-top:8px;color:var(--text-dim)}.perm-card.done.yes .perm-decision{color:var(--ok)}.perm-card.done.no .perm-decision{color:var(--err)}.perm-card.skills{border-color:var(--accent-dim)}.perm-dialog{max-width:560px;max-height:92vh;overflow-y:auto}.perm-ask{font-size:13px;line-height:1.5;color:var(--text)}.perm-file{display:flex;align-items:center;gap:6px;margin-top:10px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.perm-file code{font-family:var(--mono);font-size:12px;word-break:break-all;color:var(--accent-text)}.perm-changes{margin-top:10px}.perm-change-row{display:flex;align-items:center;gap:7px;width:100%;text-align:left;cursor:pointer;padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text);font:inherit}.perm-change-row:hover{border-color:var(--accent-dim)}.perm-change-row code{font-family:var(--mono);font-size:12px;color:var(--accent-text);flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.perm-counts{display:flex;gap:6px;font-family:var(--mono);font-size:11.5px;flex:0 0 auto}.perm-counts .add{color:var(--ok)}.perm-counts .del{color:var(--err)}.perm-caret{color:var(--text-dim);font-size:11px;flex:0 0 auto}.perm-diff{margin-top:6px;border:1px solid var(--line);border-radius:8px;background:var(--bg);max-height:34vh;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.5}.perm-diff-line{display:grid;grid-template-columns:3.2em 3.2em 1.2em 1fr;white-space:pre-wrap;overflow-wrap:anywhere;padding:0 6px}.perm-diff-line .no{color:var(--text-dim);text-align:right;padding-right:6px;user-select:none}.perm-diff-line .sig{text-align:center}.perm-diff-line.add{background:#30a46c1f}.perm-diff-line.add .sig{color:var(--ok)}.perm-diff-line.del{background:#e25a501f}.perm-diff-line.del .sig{color:var(--err)}.perm-diff-line.ctx{color:var(--text-dim)}.perm-diff-gap{color:var(--text-dim);font-size:10.5px;text-align:center;padding:3px 0;background:#7f7f7f0f}.perm-cut{font-size:11px;color:var(--text-dim);margin-top:4px}.file-changes{margin:10px 0 2px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.file-changes.one{padding:2px 8px}.fc-head{display:flex;align-items:center;gap:7px;width:100%;text-align:left;cursor:pointer;padding:4px 2px;border:0;background:none;color:var(--text);font:inherit}.fc-head:hover .fc-title{color:var(--accent-text)}.fc-title{flex:1 1 auto;min-width:0;font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fc-counts.static{cursor:default}.fc-row{padding:4px 2px;border-top:1px solid var(--line);min-width:0}.file-changes.one .fc-row{border-top:0}.fc-line{display:flex;align-items:center;gap:7px;min-width:0}.fc-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;background:var(--ok)}.fc-name{display:flex;align-items:baseline;gap:6px;min-width:0;flex:1 1 auto;cursor:pointer;border:0;background:none;padding:0;color:var(--accent-text);font-family:var(--mono);font-size:12px}.fc-name:hover{text-decoration:underline}.fc-dir{color:var(--text-dim);font-size:10.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fc-dir:before{content:"· "}.fc-edits{color:var(--text-dim);font-size:10.5px;flex:0 0 auto}.fc-edits:before{content:"· "}.fc-counts{display:flex;gap:6px;flex:0 0 auto;cursor:pointer;font-family:var(--mono);font-size:11.5px;border:1px solid var(--line);border-radius:6px;padding:1px 6px;background:var(--bg);color:var(--text)}.fc-counts:hover:not(:disabled){border-color:var(--accent-dim)}.fc-counts:disabled{cursor:default;opacity:.6}.fc-counts .add{color:var(--ok)}.fc-counts .del{color:var(--err)}.file-changes .perm-diff{margin:2px 2px 6px}.stale-banner{position:fixed;left:50%;transform:translate(-50%);bottom:calc(10px + env(safe-area-inset-bottom,0px));z-index:80;cursor:pointer;border:1px solid var(--accent-dim);border-radius:999px;background:var(--accent);color:var(--on-accent);font-weight:700;font-size:12.5px;padding:9px 16px;box-shadow:0 6px 18px #00000059}.stale-banner:hover{filter:brightness(1.06)}.perm-opts{margin-top:14px}.perm-note{font-size:11.5px;color:var(--text-dim);margin-top:10px;line-height:1.5}.perm-answered{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ok);border:1px solid var(--ok);border-radius:7px;padding:6px 11px;background:#4ec9a014}.perm-answered-tick{font-weight:700}.perm-queue{margin-top:10px;font-size:12px;color:var(--accent-text);line-height:1.5}.perm-unconfirmed{margin-top:10px;font-size:12.5px;color:var(--warn, #d08a2a);border:1px solid var(--warn, #d08a2a);border-radius:7px;padding:6px 10px;line-height:1.5}.ns-fixed-dir{display:flex;align-items:center;gap:6px;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised);color:var(--text-dim)}.ns-fixed-dir code{font-family:var(--mono);font-size:12px;word-break:break-all;color:var(--accent-text)}.composer{border-top:1px solid var(--line);background:var(--bg-panel);padding:8px 20px calc(10px + env(safe-area-inset-bottom))}.composer.drop-active .composer-box{border-color:var(--accent-text);background:rgba(var(--accent-rgb),.06)}.composer-inner{position:relative;display:flex;flex-direction:column;gap:6px}.composer-box{display:flex;flex-direction:column;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px}.composer-box:focus-within{border-color:var(--accent-dim)}.composer textarea{flex:0 0 auto;resize:none;background:transparent;color:var(--text);border:none;padding:10px 12px 4px;font:inherit;min-height:42px;max-height:40vh;overflow-y:auto}.composer textarea:focus{outline:none}.composer-bar{display:flex;align-items:center;gap:6px;padding:2px 6px 6px}.icon-btn.on{background:var(--bg-panel);border-color:var(--accent-dim);color:var(--accent-text)}.icon-btn.rec{color:var(--err);border-color:var(--err);animation:pulse 1.4s infinite}.icon-btn.tiny{width:22px;height:22px;border-radius:6px}.send-btn{border:none;background:var(--accent);color:var(--on-accent);font-weight:700;border-radius:9px;padding:0;cursor:pointer;width:40px;height:34px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.send-btn.stop{background:var(--err);color:#180e0e}.send-btn:disabled{opacity:.4;cursor:default}.usage-row{display:flex;align-items:center;gap:8px;padding:0 2px;position:relative}.usage-text{background:transparent;border:none;padding:0;cursor:pointer;font-size:11px;color:var(--text-dim);font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;display:inline-flex;align-items:center;gap:5px}.usage-text:hover{color:var(--text)}.usage-row.warn .usage-text{color:var(--accent-text)}.usage-row.hot .usage-text{color:var(--err)}.usage-icon{flex:none;opacity:.75}.usage-bar{flex:1 1 auto;max-width:220px;height:5px;border-radius:3px;background:var(--line);overflow:hidden}.usage-bar>i{display:block;height:100%;background:var(--ok);transition:width .22s ease}.usage-row.warn .usage-bar>i{background:var(--accent)}.usage-row.hot .usage-bar>i{background:var(--err)}.usage-set{margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--line)}.usage-set-head{display:flex;align-items:center;gap:5px;color:var(--text);margin-bottom:6px}.usage-set-scope{margin-left:auto;font-size:10px;color:var(--text-dim);border:1px solid var(--line);border-radius:999px;padding:0 6px}.usage-set-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}.usage-chip{background:var(--chip-bg);border:1px solid var(--line);border-radius:6px;color:var(--text-dim);font-family:inherit;font-size:11px;padding:4px 8px;cursor:pointer}.usage-chip:hover{color:var(--text);border-color:var(--accent-dim)}.usage-chip.sel{color:var(--bg);background:var(--accent);border-color:var(--accent)}.settings-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--effort, var(--text-dim));margin-right:6px}.usage-detail{position:absolute;left:0;right:auto;width:min(560px,100%);bottom:calc(100% + 8px);z-index:12;max-height:min(60vh,420px);overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:8px 10px;font-size:11.5px;color:var(--text-dim);font-family:var(--mono);box-shadow:0 12px 30px #00000059}.draft-row{display:flex;flex-wrap:wrap;align-items:center;gap:5px}.draft{display:inline-flex;align-items:center;gap:5px;max-width:220px;border:1px solid var(--line);border-radius:8px;padding:2px 4px 2px 5px;background:var(--bg-raised);font-size:11.5px;color:var(--text-dim)}.draft img{width:20px;height:20px;object-fit:cover;border-radius:4px}.draft-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.draft-x{background:transparent;border:none;color:var(--text-dim);cursor:pointer;display:inline-flex;padding:0 2px}.draft-x:hover{color:var(--err)}.draft-clear{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:11px;text-decoration:underline}.draft-clear:hover{color:var(--text)}.queue-list{display:flex;flex-direction:column;gap:4px}.queue-head{display:flex;align-items:baseline;gap:8px;font-size:11px;color:var(--text-dim)}.queue-title{font-weight:600;letter-spacing:.3px;text-transform:uppercase}.queue-hint{opacity:.85}.queue-row{display:flex;align-items:flex-start;gap:7px;padding:5px 6px 5px 8px;border:1px solid var(--line);border-left:3px solid var(--accent-dim);border-radius:8px;background:var(--bg-raised);font-size:12.5px;color:var(--text)}.queue-row.inflight{border-left-color:var(--accent);opacity:.75}.queue-row.unsure{border-left-color:var(--warn, #d08a2a);border-color:var(--warn, #d08a2a)}.queue-flag{flex:0 0 auto;font-size:10.5px;color:var(--warn, #d08a2a);padding-top:2px;white-space:nowrap}.queue-idx{flex:0 0 auto;min-width:14px;text-align:right;font-size:10.5px;color:var(--text-dim);font-variant-numeric:tabular-nums;padding-top:2px}.queue-text{flex:1 1 auto;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:5.6em;overflow:hidden}.queue-edit{flex:1 1 auto;min-width:0;font:inherit;font-size:12.5px;color:var(--text);background:var(--bg-panel);border:1px solid var(--accent-dim);border-radius:6px;padding:2px 6px;resize:vertical}.queue-actions{flex:0 0 auto;display:flex;align-items:center;gap:2px}.queue-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--line);border-radius:6px;background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.queue-btn:hover{color:var(--text);border-color:var(--accent-dim);background:rgba(var(--accent-rgb),.08)}.queue-btn.danger:hover{color:var(--err);border-color:var(--err);background:#e5737314}@media (max-width: 720px){.queue-btn{width:28px;height:28px}.queue-text{max-height:3.6em}}.composer-note{font-size:11.5px;color:var(--text-dim)}.composer-note.err{color:var(--err)}.dict-chip{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--accent-text);border:1px dashed var(--accent-dim);border-radius:8px;padding:4px 8px}.dict-chip.err{color:var(--err);border-color:var(--err)}.dict-chip .interim{color:var(--text-dim)}.dict-stop{margin-left:auto;background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:1px 8px;cursor:pointer;font-size:11px}.dict-stop:hover{color:var(--err);border-color:var(--err)}.settings-pop{position:absolute;left:0;bottom:calc(100% + 8px);z-index:14;width:min(340px,92vw);max-height:70vh;overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:12px;padding:8px 10px 10px;box-shadow:0 16px 40px #00000073}.settings-head{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px}.settings-group{border-top:1px solid var(--line);padding:7px 0 4px}.settings-group:first-of-type{border-top:none}.settings-label{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text-dim);margin-bottom:5px}.settings-opt{display:block;width:100%;text-align:left;margin:2px 0;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font-size:12.5px;padding:5px 8px;font-family:inherit}.settings-opt:hover{background:var(--bg-panel);border-color:var(--line)}.settings-opt.sel{background:rgba(var(--accent-rgb),.1);border-color:var(--accent-dim);color:var(--accent-text)}.settings-toggle{display:flex;align-items:center;gap:7px;font-size:12.5px;margin:5px 0;cursor:pointer}.settings-select,.settings-input{width:100%;margin:3px 0;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:7px;padding:5px 7px;font-size:12px;font-family:inherit}.settings-select:focus,.settings-input:focus{outline:none;border-color:var(--accent-dim)}.settings-freeform{display:flex;gap:6px;align-items:center;margin-top:6px}.settings-freeform .settings-input{flex:1 1 auto;min-width:0}.settings-note{font-size:10.5px;color:var(--text-dim);margin-top:4px}.settings-range{display:block;font-size:11.5px;color:var(--text-dim);margin:5px 0}.settings-range input{width:100%}.empty{margin:auto;text-align:center;color:var(--text-dim)}.empty .big{font-size:42px;display:flex;justify-content:center;margin-bottom:4px}.modal-bg{position:fixed;inset:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:35;padding:16px;overflow-y:auto;overscroll-behavior:contain}.modal{background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;padding:20px;width:100%;max-width:420px;max-height:calc(100dvh - 32px);overflow-y:auto}.modal.start-page{max-width:560px}.start-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}.start-head h3{margin:0;flex:1;min-width:0}.ws-pill{display:inline-flex;align-items:center;gap:6px;max-width:58%;flex:0 1 auto;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:999px;padding:5px 10px;font:inherit;font-size:12.5px;cursor:pointer}.ws-pill:hover{border-color:var(--accent-dim)}.ws-pill.empty{color:var(--text-dim);border-style:dashed}.ws-pill.locked{cursor:default;color:var(--text-dim);background:transparent}.ws-pill.locked:hover{border-color:var(--line)}.ws-pill-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ws-modal-bg{z-index:60}.ws-modal{max-width:520px}.composer.start-composer{border-top:none;background:transparent;padding:0}.start-page .backend-pick{margin-top:14px}.start-input{width:100%;box-sizing:border-box;resize:vertical;min-height:86px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:10px;padding:11px 12px;font:inherit;line-height:1.5}.start-input:focus{outline:none;border-color:var(--accent-dim)}.start-hold{display:flex;align-items:center;justify-content:center;gap:8px;color:var(--text-dim);font-size:12.5px;padding:22px 8px}.start-fail{border:1px solid var(--err);border-radius:10px;padding:12px 14px;margin:8px 0 12px;background:color-mix(in srgb,var(--err) 10%,transparent)}.start-fail-why{color:var(--err);font-size:12.5px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.start-fail-act{display:flex;gap:8px;margin-top:10px}.modal h3{margin:0 0 14px;font-size:16px}.modal label{display:block;font-size:12.5px;color:var(--text-dim);margin:10px 0 4px}.modal input,.modal select{width:100%;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:9px 10px;font:inherit}.modal .row{display:flex;gap:10px;margin-top:18px}.modal .row button{flex:1;padding:9px;border-radius:8px;cursor:pointer}.modal .row .cancel{background:transparent;border:1px solid var(--line);color:var(--text-dim)}.modal .row .go{background:var(--accent);border:none;color:var(--on-accent);font-weight:700}.modal .row .go.danger{background:var(--err);color:#fff}.modal .err{color:var(--err);font-size:12.5px;margin-top:10px}@media (max-width: 520px){.modal-bg{align-items:flex-start;padding:10px}.modal{padding:14px;border-radius:12px}.modal h3{margin:0 0 8px;font-size:15px}.modal label{margin:8px 0 3px}.modal input,.modal select{padding:8px 9px}.modal .row{margin-top:12px}.backend-pick .be-card{width:68px;min-height:58px}}.blocked-homes{margin-top:12px;display:flex;flex-direction:column;gap:6px}.blocked-homes div{display:flex;gap:8px;align-items:baseline;font-size:12px}.blocked-homes span{color:var(--text-dim);min-width:104px;flex:none}.blocked-homes code{font-family:var(--mono);word-break:break-all}.backend-pick{display:flex;gap:8px;overflow-x:auto;overscroll-behavior-x:contain;padding-bottom:2px}.backend-pick .be-card{flex:0 0 auto;width:74px;min-height:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;padding:8px 6px;border-radius:10px;cursor:pointer;background:var(--bg-raised);border:1px solid var(--line);color:var(--text-dim);font:inherit}.backend-pick .be-card.sel{border-color:var(--accent-text);color:var(--accent-text);background:rgba(var(--accent-rgb),.1)}.be-card-mark{flex:0 0 auto;width:26px;height:26px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;color:var(--be-tone, var(--text-dim));background:color-mix(in srgb,var(--be-tone, var(--text-dim)) 16%,transparent);border:1px solid color-mix(in srgb,var(--be-tone, var(--text-dim)) 40%,transparent)}.be-card-mark img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.be-card-label{max-width:100%;font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.backend-pick .be-card.reload{width:42px;font-size:15px}.be-detail{margin-top:6px}.be-detail-head{display:inline-flex;align-items:center;gap:4px;background:transparent;border:none;padding:2px 0;cursor:pointer;color:var(--text-dim);font-size:11.5px}.be-detail-head:hover{color:var(--accent-text)}.be-detail-arrow{transition:transform .12s}.be-detail.open .be-detail-arrow{transform:rotate(90deg)}.dim{color:var(--text-dim);font-size:12.5px;align-self:center}.hint{color:var(--text-dim);font-size:11.5px;margin-top:8px;font-family:ui-monospace,monospace;word-break:break-all}.net-banner{margin:8px 12px 0;padding:8px 10px;border-radius:8px;font-size:12.5px;background:rgba(var(--err-rgb),.12);border:1px solid rgba(var(--err-rgb),.45);color:var(--err);display:flex;gap:8px;align-items:center;justify-content:space-between}.net-banner button{background:transparent;border:1px solid rgba(var(--err-rgb),.55);color:var(--err);border-radius:6px;padding:3px 9px;cursor:pointer;font-size:12px}.menu-btn{display:inline-flex;background:none;border:none;color:var(--text);font-size:20px;padding:2px 8px;cursor:pointer}.sidebar.compact{--rail-w: 60px}.sidebar.compact header{padding:12px 0 8px;justify-content:center;gap:0}.sidebar.compact header .logo{font-size:0;gap:0}.sidebar.compact header .tagline,.sidebar.compact .rail-search-wrap,.sidebar.compact .rail-error,.sidebar.compact .rail-section span,.sidebar.compact .rail-placeholder,.sidebar.compact footer,.sidebar.compact .rail-group-name,.sidebar.compact .rail-group-count,.sidebar.compact .group-add,.sidebar.compact .rail-more,.sidebar.compact .session-item .title,.sidebar.compact .session-item .rail-at,.sidebar.compact .session-item .badge,.sidebar.compact .session-item .unread-dot,.sidebar.compact .session-item .row-menu,.sidebar.compact .new-btn .new-label{display:none}.sidebar.compact .new-btn{margin:0 auto 10px;width:40px;height:36px;padding:0;display:flex;align-items:center;justify-content:center}.sidebar.compact .rail-section{justify-content:center;padding:4px 0;min-height:22px}.sidebar.compact .rail-group-head{justify-content:center;padding-left:0;padding-right:0}.sidebar.compact .rail-group-row{padding:0 4px}.sidebar.compact .session-item{justify-content:center;padding:6px 0}.sidebar.compact>.pane-handle{display:none}.sidebar.hidden{display:none}.sidebar.hidden>.pane-handle{display:none}@media (max-width: 720px){.sidebar{position:fixed;inset:0 auto 0 0;z-index:30;width:min(82vw,320px);transform:translate(-105%);transition:transform .22s ease}.sidebar.open{transform:translate(0);box-shadow:0 0 40px #0009}.sidebar header .tagline{display:none}.scrim{position:fixed;inset:0;background:#00000073;z-index:25}.chip{padding:2px 6px}.perm-card button{min-height:44px;padding:10px 14px;font-size:14px}.perm-dialog{max-width:none;max-height:100%}.perm-dialog .perm-opts button{min-height:44px;padding:10px 14px;font-size:14px}.perm-diff{max-height:42vh}.perm-change-row{min-height:44px}.rail-group .group-add{width:32px;height:30px}.rail-section{min-height:34px;margin-top:6px}.slash-palette{max-height:40vh}.slash-item{min-height:44px}.msg{max-width:100%}.empty .big{font-size:42px}}.sidebar footer{display:flex;align-items:center;gap:6px}.sidebar footer .logout-btn{margin-left:auto;background:transparent;border:1px solid var(--line);color:var(--text-dim);border-radius:6px;padding:2px 8px;cursor:pointer;line-height:1.4}.sidebar footer .logout-btn:hover{color:var(--err);border-color:var(--err)}.auth-wrap{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(1000px 500px at 50% -10%,rgba(var(--accent-rgb),.07),transparent 60%),var(--bg)}.auth-card{width:100%;max-width:360px;background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;padding:26px 24px 20px;display:flex;flex-direction:column;gap:12px;box-shadow:0 18px 50px #00000073}.auth-logo{color:var(--accent-text);font-weight:700;font-size:20px;letter-spacing:.5px;display:flex;align-items:center;justify-content:center;gap:9px}.auth-sub{font-size:11.5px;color:var(--text-dim);margin-top:-8px}.auth-note{font-size:12.5px;color:var(--text-dim);padding:6px 0}.auth-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--text-dim)}.auth-field input{font:inherit;font-size:16px;padding:10px 11px;border-radius:8px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text)}.auth-field input:focus{outline:none;border-color:var(--accent-dim)}.auth-btn{margin-top:4px;padding:11px;min-height:44px;border-radius:8px;cursor:pointer;border:1px solid var(--accent-dim);background:rgba(var(--accent-rgb),.12);color:var(--accent-text);font-weight:600}.auth-btn:disabled{opacity:.6;cursor:default}.auth-err{color:var(--err);font-size:12.5px;border-left:2px solid var(--err);padding-left:8px}.auth-warn{color:var(--accent-text);font-size:11.5px;line-height:1.5;opacity:.9}.auth-foot{color:var(--text-dim);font-size:11px;line-height:1.5;border-top:1px solid var(--line);padding-top:10px}.auth-card code{font-family:var(--mono);font-size:11px;color:var(--text)}@media (max-width: 480px){.auth-card{padding:20px 16px 16px}.sidebar footer .logout-btn{min-height:44px;padding:2px 12px}}.wp{display:flex;flex-direction:column;gap:5px}.wp-bar{display:flex;align-items:center;gap:6px}.wp-bar>svg{color:var(--text-dim);flex:0 0 auto}.wp-path{flex:1;min-width:0;padding:8px 10px;border-radius:8px;font-size:13px;background:var(--bg-raised);color:var(--text);border:1px solid var(--line);font-family:var(--mono)}.wp-path:focus{outline:none;border-color:var(--accent-dim)}.wp-list{max-height:210px;overflow-y:auto;border:1px solid var(--line);border-radius:8px;background:#0000002e;padding:3px}.wp-row{display:flex;align-items:center;gap:6px;padding:4px 7px;border-radius:6px;cursor:pointer;font-size:12.5px;color:var(--text)}.wp-row>svg{color:var(--text-dim);flex:0 0 auto}.wp-row:hover{background:var(--bg-raised)}.wp-row.sel{background:rgba(var(--accent-rgb),.1);outline:1px solid var(--accent-dim)}.wp-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-enter{background:transparent;border:1px solid transparent;border-radius:5px;color:var(--text-dim);cursor:pointer;padding:1px 3px;display:inline-flex}.wp-enter:hover{color:var(--accent-text);border-color:var(--line)}.wp-note{padding:10px;font-size:12px;color:var(--text-dim);text-align:center}.wp-note.err{color:var(--err)}.wp-recent{display:flex;flex-wrap:nowrap;align-items:center;gap:4px;overflow-x:auto;overscroll-behavior-x:contain;padding-bottom:1px}.wp-recent-label{font-size:11px;color:var(--text-dim)}.wp-chip{flex:0 0 auto;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim);border-radius:999px;padding:1px 8px;font-size:10.5px;line-height:1.5;cursor:pointer;font-family:var(--mono);max-width:116px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-chip:hover{color:var(--text);border-color:var(--text-dim)}.wp-chip.sel{color:var(--accent-text);border-color:var(--accent-dim)}.wp-use{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;border:1px solid var(--line);background:transparent;color:var(--text-dim);border-radius:7px;padding:5px 9px;font-size:12px;cursor:pointer}.wp-use:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent-dim)}.wp-use:disabled{opacity:.5;cursor:default}@media (max-width: 480px){.wp-row{min-height:40px}.wp-chip{min-height:26px}.wp-path{font-size:16px}.wp-list{max-height:150px}}.main-body{flex:1;display:flex;min-height:0}.chat-col{flex:1;display:flex;flex-direction:column;min-width:0;container-type:inline-size}.tool-panel{width:var(--panel-w, 430px);flex:0 0 auto;display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--line);background:var(--bg-panel);position:relative}.panel-split{flex:1;display:flex;min-height:0;position:relative}.preview-col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}.explorer-col{position:relative;flex:0 0 auto;width:var(--explorer-w, 300px);display:flex;flex-direction:column;min-height:0}.panel-split:not(.has-preview) .explorer-col{width:100%}.panel-split.tree-folded .explorer-col,.panel-split.preview-folded .preview-col{display:none}.panel-split.preview-folded .explorer-col{width:100%}.pane-handle{position:absolute;top:0;bottom:0;width:12px;z-index:12;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.sidebar>.pane-handle{right:-6px}.tool-panel>.pane-handle{left:-6px}.explorer-col>.pane-handle{left:-6px}.pane-handle-line{width:2px;height:100%;background:transparent;transition:background .15s ease}.pane-handle:hover .pane-handle-line,.pane-handle:active .pane-handle-line{background:var(--accent-dim)}body.pane-dragging{cursor:col-resize;user-select:none}body.pane-dragging *{cursor:col-resize!important}@media (max-width: 720px){.pane-handle{display:none}}@media (pointer: coarse) and (min-width: 721px){.pane-handle-line{background:var(--line)}.pane-handle{width:18px}.sidebar>.pane-handle{right:-9px}.tool-panel>.pane-handle,.explorer-col>.pane-handle{left:-9px}}.tool-tabs{display:flex;align-items:center;gap:3px;padding:4px 6px;border-bottom:1px solid var(--line)}.tool-tab{display:inline-flex;align-items:center;gap:5px;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text-dim);font-size:12px;padding:3px 8px;font-family:inherit}.tool-tab:hover{background:var(--bg-raised);color:var(--text)}.tool-tab.active{background:var(--bg-raised);border-color:var(--line);color:var(--accent-text)}.tool-body{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.ws-root{display:flex;align-items:center;gap:5px;padding:6px 9px 0;font-size:11px;color:var(--text-dim);font-family:var(--mono)}.ws-root-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-bar{display:flex;align-items:center;gap:2px;padding:3px 6px;border-bottom:1px solid var(--line)}.file-bar-path{flex:1;min-width:0;font-size:10.5px;color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-list{flex:1;overflow-y:auto;padding:4px}.file-row{display:flex;align-items:center;gap:7px;width:100%;text-align:left;background:transparent;border:none;border-radius:6px;color:var(--text);font-size:12.5px;padding:4px 7px;cursor:pointer;font-family:inherit}.file-row:hover{background:var(--bg-raised)}.file-row.sel{background:rgba(var(--accent-rgb),.1)}.file-row>svg:first-child{color:var(--text-dim);flex:0 0 auto}.file-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-size{font-size:10.5px;color:var(--text-dim);font-family:var(--mono)}.file-enter{opacity:.45}.file-preview{flex:1;min-height:0;display:flex;flex-direction:column}.file-preview-head{display:flex;align-items:center;gap:6px;padding:4px 8px;font-size:11.5px;border-bottom:1px solid var(--line)}.file-preview-body{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column}.file-preview-body>*{min-height:0}.file-text{margin:0;padding:4px 9px 10px;overflow:auto;white-space:pre;font-family:var(--mono);font-size:11.5px;line-height:1.45;color:var(--text)}.file-image-wrap{display:flex;padding:8px;align-items:flex-start}.file-image{max-width:100%;border-radius:6px;border:1px solid var(--line)}.file-frame{flex:1;min-height:260px;width:100%;border:0;background:var(--bg-raised)}.file-audio{width:calc(100% - 16px);margin:8px}.file-video{max-width:100%;max-height:100%;margin:8px}.file-fallback{padding-top:6px}.file-view-toggle{display:flex;gap:6px;padding:4px 8px 0}.file-source{font-family:var(--mono);font-size:11.5px;line-height:1.45;padding:4px 0 10px;overflow-x:auto}.file-line{display:flex;gap:8px;padding:0 9px;white-space:pre}.file-line.hit{background:rgba(var(--accent-rgb),.14);box-shadow:inset 2px 0 0 var(--accent-text)}.file-ln{flex:0 0 34px;text-align:right;color:var(--text-dim);opacity:.6;user-select:none}.file-lt{flex:1}.file-edit{flex:1;min-height:220px;border:0;outline:0;resize:none;padding:8px 10px;background:var(--code-bg);color:var(--code-fg);white-space:pre;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.5}.file-dirty{color:var(--accent-text)}.file-conflict{display:flex;align-items:center;gap:6px;padding:5px 8px;font-size:11.5px;color:var(--text);background:rgba(var(--accent-rgb),.12);border-bottom:1px solid var(--line)}.file-md{padding:6px 10px 12px}.tool-note{padding:8px;font-size:11.5px;color:var(--text-dim)}.tool-error{padding:6px 9px;font-size:11.5px;color:var(--err)}.term-bar{display:flex;align-items:center;gap:6px;padding:4px 8px;border-bottom:1px solid var(--line);font-size:11.5px;color:var(--text-dim)}.term-dot{width:8px;height:8px;border-radius:50%;background:var(--text-dim)}.term-dot.ready{background:var(--ok)}.term-dot.error{background:var(--err)}.term-dot.closed{background:var(--accent)}.term-cwd{font-family:var(--mono);color:var(--text)}.term-body{display:flex;flex-direction:column;min-height:0;padding:0}.term-host{flex:1;min-height:0;min-width:0;overflow:hidden;padding:4px 0 0 6px;background:var(--bg-panel)}.term-host .xterm{height:100%}.term-host .xterm-viewport{background:transparent!important}.term-note{padding:4px 9px 7px;font-size:10.5px;color:var(--text-dim)}@media (max-width: 720px){.chat-head{padding:5px 8px;min-height:44px}.chat-head .title{font-size:14px}.chat-head .menu-btn,.chat-head .icon-btn{width:40px;height:40px}.chat-head .head-actions .icon-btn{width:28px;height:28px}.chat-head .head-actions .icon-btn svg{width:18px;height:18px}.composer{padding:6px 8px calc(8px + env(safe-area-inset-bottom,0px))}.composer textarea{font-size:16px;min-height:44px}.composer-bar .icon-btn{width:38px;height:38px}.send-btn{width:46px;height:38px}.usage-row .usage-bar{max-width:90px}.tb-list,.tb-list.wide{position:fixed;left:8px;right:8px;width:auto;max-width:none;bottom:calc(76px + env(safe-area-inset-bottom,0px));max-height:52vh}.settings-pop{width:min(340px,94vw);bottom:calc(100% + 6px)}.tool-panel{position:fixed;inset:44px 0 0;z-index:22;width:auto;max-width:none;border-left:none}.panel-split.has-preview .explorer-col{display:none}.file-row{min-height:42px}.term-host{min-height:30vh}}.md{font-size:13.5px;line-height:1.55;overflow-wrap:anywhere;white-space:normal}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md h1,.md h2,.md h3,.md h4{margin:12px 0 6px;line-height:1.3;font-weight:650}.md h1{font-size:18px}.md h2{font-size:16px}.md h3{font-size:14.5px}.md h4{font-size:13.5px}.md p{margin:6px 0}.md ul,.md ol{margin:6px 0;padding-left:20px}.md li{margin:2px 0}.md li>ul,.md li>ol{margin:2px 0}.md blockquote{margin:6px 0;padding:2px 10px;color:var(--text-dim);border-left:3px solid var(--line)}.md a{color:var(--accent-text);text-decoration:none;border-bottom:1px solid var(--accent-dim)}.md a:hover{border-bottom-color:var(--accent-text)}.md a.md-file-link{font-family:var(--mono);font-size:.94em;padding:0 3px;border-bottom-color:transparent;border-radius:4px;background:rgba(var(--accent-rgb),.1)}.md a.md-file-link:hover{background:rgba(var(--accent-rgb),.2)}.md-file-line{color:var(--text-dim)}.md a.md-img-link{border-bottom:none;display:inline-block;max-width:100%}.md img.md-img{max-width:100%;border-radius:6px;border:1px solid var(--line);display:block;margin:6px 0}.md hr{border:none;border-top:1px solid var(--line);margin:10px 0}.md code{font-family:var(--mono);font-size:12px;padding:1px 4px;border-radius:4px;background:var(--chip-bg);color:var(--text);border:1px solid var(--line)}.md pre{margin:0;padding:8px 10px;overflow-x:auto;background:var(--code-bg);color:var(--code-fg)}.md pre code{padding:0;background:transparent;border:none;color:inherit;font-size:12px;line-height:1.5}.md table{border-collapse:collapse;margin:8px 0;font-size:12.5px;display:block;overflow-x:auto;max-width:100%}.md-table-bar{display:flex;align-items:center;gap:6px;margin:8px 0 -2px}.md-table-filter{flex:1;min-width:0;max-width:240px;font-size:11.5px;padding:3px 7px;background:var(--bg-input, var(--bg-raised));color:var(--text);border:1px solid var(--line);border-radius:5px}.md-table-btn{font-size:11px;line-height:1;padding:3px 7px;cursor:pointer;background:var(--bg-raised);color:var(--text-dim);border:1px solid var(--line);border-radius:5px}.md-table-btn:hover{color:var(--text);border-color:var(--accent-dim)}.md-table-sort{display:inline-flex;align-items:center;gap:4px;width:100%;font:inherit;font-weight:inherit;text-align:left;cursor:pointer;background:none;border:0;padding:0;color:inherit}.md-table-sort:hover{color:var(--accent-text)}.md-table-sort-indicator{font-size:9px;opacity:.55}.md th[aria-sort=ascending] .md-table-sort-indicator,.md th[aria-sort=descending] .md-table-sort-indicator{opacity:1;color:var(--accent-text)}.md-table-overlay{position:fixed;inset:0;z-index:60;display:flex;flex-direction:column;background:#0000009e;backdrop-filter:blur(1.5px)}.md-table-overlay .md-table-bar{margin:8px}.md-table-overlay .md-table-btn{background:var(--bg-panel);font-size:12px;padding:5px 10px}.md-table-stage{flex:1;min-height:0;position:relative;overflow:hidden}.md-table-zoom{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);max-width:96vw;max-height:96vh;overflow:auto;background:var(--bg-panel);border:1px solid var(--line);border-radius:8px;padding:8px}.md-table-zoom.rot{width:96vh;height:96vw;max-width:none;max-height:none;transform:translate(-50%,-50%) rotate(90deg);transform-origin:center}.md-table-zoom table{display:table;max-width:none;margin:0}.md th,.md td{border:1px solid var(--line);padding:4px 8px;text-align:left}.md th{background:var(--bg-raised);font-weight:600}.md-code{margin:8px 0;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--code-bg);color:var(--code-fg)}.md-code-bar{display:flex;align-items:center;gap:6px;padding:3px 8px;background:var(--code-bar);border-bottom:1px solid var(--code-line)}.md-lang{font-family:var(--mono);font-size:10.5px;color:#9fb0c0;text-transform:lowercase}.md-copy{margin-left:auto;background:transparent;border:1px solid transparent;border-radius:5px;color:#9fb0c0;font-size:10.5px;padding:0 5px;cursor:pointer;font-family:inherit}.md-copy:hover{color:#e3ebf4;border-color:var(--code-line)}.md .hljs-comment,.md .hljs-quote{color:#7f8c98;font-style:italic}.md .hljs-keyword,.md .hljs-selector-tag,.md .hljs-literal,.md .hljs-section,.md .hljs-doctag,.md .hljs-name{color:#c792ea}.md .hljs-string,.md .hljs-regexp,.md .hljs-addition,.md .hljs-attribute,.md .hljs-meta .hljs-string{color:#a5d6a7}.md .hljs-number,.md .hljs-symbol,.md .hljs-bullet,.md .hljs-variable,.md .hljs-template-variable{color:#f0a35e}.md .hljs-title,.md .hljs-title.class_,.md .hljs-title.function_{color:#82b1ff}.md .hljs-built_in,.md .hljs-type,.md .hljs-class .hljs-title{color:#ffd479}.md .hljs-attr,.md .hljs-property,.md .hljs-params{color:#ffcb6b}.md .hljs-deletion{color:#ff6b6b}.md .hljs-emphasis{font-style:italic}.md .hljs-strong{font-weight:700}.tb-wrap{position:relative;flex:0 0 auto}.tb-btn{display:inline-flex;align-items:center;gap:5px;max-width:190px;height:30px;padding:0 7px;background:transparent;border:1px solid transparent;border-radius:8px;color:var(--text-dim);font-size:12px;font-family:inherit;cursor:pointer}.tb-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--text)}.tb-btn.on{background:var(--bg-panel);border-color:var(--accent-dim);color:var(--accent-text)}.tb-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-chev{opacity:.55}.tb-list{position:fixed;z-index:15;min-width:180px;max-width:min(420px,78vw);max-height:46vh;overflow-y:auto;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:4px;box-shadow:0 14px 34px #00000073}.tb-list.wide{min-width:320px}.tb-list.stacked{display:flex;flex-direction:column;overflow:hidden}.tb-list.stacked .tb-err,.tb-list.stacked .tb-search{flex:0 0 auto}.tb-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}.tb-list.stacked .tb-group{border-top:1px solid var(--line)}.tb-list.stacked .tb-group:first-child{border-top:none}.tb-list.stacked .tb-group-head{position:sticky;top:0;z-index:1;background:var(--bg-raised)}.tb-search{width:100%;margin-bottom:3px;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:4px 6px;font-size:12px}.tb-search:focus{outline:none;border-color:var(--accent-dim)}.tb-opt{display:flex;flex-direction:column;gap:1px;width:100%;text-align:left;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font-size:12.5px;padding:4px 7px;cursor:pointer;font-family:inherit}.tb-opt:hover{background:var(--bg-panel);border-color:var(--line)}.tb-opt.sel{background:rgba(var(--accent-rgb),.1);border-color:var(--accent-dim);color:var(--accent-text)}.tb-opt.bad{border-color:var(--err);color:var(--err)}.tb-opt.bad:hover{background:rgba(var(--err-rgb),.08)}.tb-err{display:flex;flex-direction:column;gap:2px;margin:6px 4px;padding:6px 8px;border:1px solid var(--err);border-radius:7px;background:rgba(var(--err-rgb),.08);color:var(--err);font-size:11.5px;line-height:1.4;white-space:pre-wrap;word-break:break-word}.tb-err-id{font-family:var(--mono, monospace);font-size:11px;opacity:.85}.tb-err-text{color:var(--text)}.tb-opt-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-opt-hint{font-size:10.5px;color:var(--text-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-empty{padding:8px;font-size:11.5px;color:var(--text-dim);text-align:center}.usage-edit{display:flex;align-items:center;gap:5px;margin:6px 0 2px}.usage-edit input{flex:1;min-width:0;background:var(--bg-panel);color:var(--text);border:1px solid var(--line);border-radius:6px;padding:3px 6px;font-family:var(--mono);font-size:12px}.usage-edit input:focus{outline:none;border-color:var(--accent-dim)}.usage-edit-btn{background:transparent;border:1px solid var(--line);border-radius:6px;color:var(--text-dim);font-size:11px;padding:2px 8px;cursor:pointer;font-family:inherit}.usage-edit-btn:hover:not(:disabled){color:var(--accent-text);border-color:var(--accent-dim)}.usage-edit-btn:disabled{opacity:.45;cursor:default}.usage-edit-err{color:var(--err);font-size:11px;margin-top:3px}.usage-note{margin-top:6px;color:var(--text-dim);font-size:10.5px;line-height:1.4}@media (max-width: 720px){.tb-list,.tb-list.wide{min-width:0;width:min(86vw,420px)}.tb-btn{max-width:34vw}.md{font-size:14px}}.tb-wrap{flex:0 1 auto;min-width:0}.tb-btn,.tb-label{min-width:0}.tb-wrap>.tb-btn{max-width:100%}.tb-effort{padding:0 5px;gap:4px}.tb-pips{display:inline-flex;align-items:flex-end;gap:2px;height:12px}.tb-pips i{display:block;width:3px;border-radius:1px;background:var(--line)}.tb-pips i:nth-child(1){height:4px}.tb-pips i:nth-child(2){height:5px}.tb-pips i:nth-child(3){height:6px}.tb-pips i:nth-child(4){height:7px}.tb-pips i:nth-child(5){height:9px}.tb-pips i:nth-child(6){height:11px}.tb-pips i:nth-child(7){height:13px}.tb-dot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px;vertical-align:middle}.tb-group{border-top:1px solid var(--line)}.tb-group:first-of-type{border-top:none}.tb-group-head{display:flex;align-items:center;gap:5px;width:100%;text-align:left;background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-family:inherit;font-size:11px;letter-spacing:.03em;text-transform:uppercase;padding:5px 6px;border-radius:6px}.tb-group-head:hover{background:var(--bg-panel);color:var(--text)}.tb-group-chev{transition:transform .12s ease}.tb-group-chev.open{transform:rotate(90deg)}.tb-group-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-group-count{font-size:10px;color:var(--text-dim)}.tb-group-body{padding:0 0 4px 8px}@media (max-width: 720px){.tb-btn{max-width:34vw;padding:0 4px;gap:3px}.tb-btn .tb-chev{display:none}.tb-effort{max-width:none}.composer-bar{gap:6px;padding:2px 5px 5px}.composer-bar .icon-btn{width:32px;height:32px}.send-btn{width:40px;height:36px}.composer-bar .tb-wrap:has([data-testid=start-model]),.composer-bar .tb-wrap:has([data-testid=tb-model]){flex-shrink:6}.composer-bar .tb-wrap:has([data-testid=start-mode]){flex-shrink:0;max-width:42vw}}@media (max-width: 420px){.tb-pips{gap:1px}.tb-pips i{width:2px}}@media (max-width: 340px){.composer-bar .tb-wrap:has([data-testid=start-model]),.composer-bar .tb-wrap:has([data-testid=tb-model]){flex-shrink:1}.composer-bar .tb-wrap:has([data-testid=start-model]) .tb-label,.composer-bar .tb-wrap:has([data-testid=tb-model]) .tb-label{display:none}.composer-bar .tb-wrap:has([data-testid=start-model]) .tb-btn,.composer-bar .tb-wrap:has([data-testid=tb-model]) .tb-btn{min-width:0}.composer-bar{gap:4px;padding:2px 4px 4px}.composer-bar .icon-btn{width:30px;height:30px}.composer-bar .send-btn{width:36px}}.rail-section{display:flex;align-items:center;gap:4px;width:calc(100% - 10px);margin:9px 10px 3px 0;background:transparent;border:none;font-family:inherit;text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-dim);padding:3px 2px;border-radius:6px;cursor:pointer}.rail-section:hover{color:var(--text)}.rail-section-chev{flex:0 0 auto;transition:transform .12s ease}.rail-section-chev.open{transform:rotate(90deg)}.rail-section-count{margin-left:auto;letter-spacing:0;font-variant-numeric:tabular-nums}.rail-section:first-child{margin-top:3px}.rail-placeholder{display:flex;align-items:center;gap:6px;margin:0 10px 2px;padding:5px 7px;border-radius:6px;border:1px dashed var(--line);color:var(--text-dim);font-size:11px;cursor:default}.rail-placeholder-name{color:var(--text);opacity:.75}.rail-placeholder-note{margin-left:auto;font-size:11px}.rail-group{margin-bottom:2px}.rail-group-row{display:flex;align-items:center;gap:2px}.rail-group-head{display:flex;align-items:center;gap:6px;flex:1 1 auto;min-width:0;text-align:left;background:transparent;border:none;cursor:pointer;color:var(--text);font-family:inherit;font-size:12px;padding:5px 6px;border-radius:6px;margin-left:0}.rail-group-head:hover{background:var(--bg-raised)}.group-add{flex:0 0 auto;opacity:0;transition:opacity .12s}.rail-group:hover .group-add,.rail-group:focus-within .group-add{opacity:1}@media (hover: none){.group-add{opacity:.7}}.rail-group-folder{flex:0 0 auto;color:var(--text-dim)}.rail-group-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rail-group-count{font-size:11px;color:var(--text-dim)}.rail-group-body{padding-left:28px}.rail-more{display:flex;align-items:center;gap:5px;width:calc(100% - 28px);margin:1px 0 4px 28px;padding:3px 6px;background:transparent;border:none;border-radius:6px;cursor:pointer;color:var(--text-dim);font-family:inherit;font-size:11px;text-align:left}.rail-more:hover{background:var(--bg-raised);color:var(--text)}.rail-more-chev{transition:transform .12s ease;opacity:.7}.rail-more-chev.open{transform:rotate(90deg)}.item-actions{display:inline-flex;align-items:center;gap:2px;margin-left:auto}.item-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:20px;padding:0;background:transparent;border:1px solid transparent;border-radius:5px;color:var(--text-dim);cursor:pointer;font-family:inherit;font-size:11px}.item-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--accent-text)}.item-btn.danger:hover{color:var(--err);border-color:var(--err)}.item-btn:disabled{opacity:.5;cursor:default}.rail-error{margin:4px 8px;padding:5px 7px;border:1px solid var(--err);border-radius:6px;color:var(--err);font-size:11px;display:flex;align-items:center;gap:6px}.rail-error .draft-x{margin-left:auto}.rail-empty{padding:14px 10px;color:var(--text-dim);font-size:12.5px}.rail-gear{margin-left:auto;width:26px;height:26px;border-radius:7px}.set-head .title{display:inline-flex;align-items:center;gap:6px}.set-save{padding:6px 14px;border-radius:8px;cursor:pointer;font-weight:600;font-size:12.5px;background:var(--accent);color:var(--on-accent);border:1px solid var(--accent)}.set-save:disabled{background:transparent;color:var(--text-dim);border-color:var(--line);cursor:default}.set-toast{font-size:12px;color:var(--ok)}.set-body{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:14px}.set-main{flex:1;display:flex;min-height:0}.set-nav{width:196px;flex:0 0 auto;overflow-y:auto;padding:14px 10px 18px;border-right:1px solid var(--line);display:flex;flex-direction:column}.set-nav-group{display:flex;flex-direction:column;margin-bottom:10px}.set-nav-cat{text-align:left;font-size:11px;font-weight:600;color:var(--text-dim);background:none;border:0;cursor:pointer;padding:4px 8px 3px;border-radius:6px}.set-nav-cat:hover{color:var(--text);background:var(--chip-bg)}.set-nav-cat.on{color:var(--text);background:var(--chip-bg);box-shadow:inset 2px 0 0 var(--accent)}.set-nav-item{text-align:left;font-size:12.5px;color:var(--text-dim);background:none;border:0;border-left:2px solid transparent;cursor:pointer;padding:5px 8px;border-radius:0 6px 6px 0;line-height:1.4}.set-nav-item:hover{color:var(--text);background:var(--chip-bg)}.set-nav-item.on{color:var(--text);font-weight:600;border-left-color:var(--accent);background:var(--chip-bg)}.set-group{margin:4px 0 -6px;font-size:11.5px;font-weight:600;letter-spacing:.06em;color:var(--text-dim);max-width:900px;width:100%;align-self:center}.set-body[data-cat=account]>[data-setgroup]:not([data-setgroup=account]),.set-body[data-cat=agent]>[data-setgroup]:not([data-setgroup=agent]),.set-body[data-cat=notify]>[data-setgroup]:not([data-setgroup=notify]),.set-body[data-cat=look]>[data-setgroup]:not([data-setgroup=look]),.set-body[data-cat=voice]>[data-setgroup]:not([data-setgroup=voice]){display:none}.set-card{background:var(--bg-panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px 16px;max-width:900px;width:100%;align-self:center}.set-card h3{margin:0 0 6px;font-size:13.5px}.set-hint{margin:6px 0 0;font-size:12px;color:var(--text-dim);line-height:1.6;display:flex;flex-wrap:wrap;gap:8px;align-items:center}.set-hint code{font-family:var(--mono);background:var(--chip-bg);color:var(--text);border:1px solid var(--line);padding:1px 5px;border-radius:4px;font-size:11.5px}.set-row{display:flex;gap:12px;align-items:flex-start;margin-top:12px}.set-row>label{flex:0 0 84px;font-size:12.5px;color:var(--text-dim);padding-top:7px}.set-input,.set-select,.set-textarea,.set-num{background:var(--bg-raised);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12.5px;font-family:var(--mono);min-width:0;flex:1 1 auto}.set-textarea{width:100%;margin-top:10px;resize:vertical;line-height:1.6}.set-builtin{margin-top:10px;border:1px solid var(--line);border-radius:8px;background:var(--bg-raised)}.set-builtin>summary{padding:8px 10px;font-size:12.5px;color:var(--text-dim);cursor:pointer}.set-builtin[open]>summary{border-bottom:1px solid var(--line)}.set-builtin>.set-hint{padding:8px 10px 0;margin:0}.set-builtin-item{padding:8px 10px 0}.set-builtin-item:last-child{padding-bottom:10px}.set-builtin-when{font-size:12px;color:var(--text-dim);margin-bottom:5px}.set-builtin-text{margin:0;padding:8px 10px;border-radius:6px;background:var(--bg-panel);border:1px solid var(--line);color:var(--text);font-family:var(--mono);font-size:11.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}.set-num{flex:0 0 70px}.set-input:focus,.set-select:focus,.set-textarea:focus{outline:none;border-color:var(--accent-dim)}.set-pair{display:flex;gap:10px;flex-wrap:wrap;flex:1 1 320px;align-items:center;min-width:0}.set-check{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-dim);white-space:nowrap}.set-seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}.set-seg button{padding:6px 12px;background:transparent;color:var(--text-dim);border:none;border-right:1px solid var(--line);cursor:pointer;font-size:12.5px}.set-seg button:last-child{border-right:none}.set-seg button.on{background:var(--accent);color:var(--on-accent);font-weight:600}.set-swatches{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.set-swatch{width:22px;height:22px;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}.set-swatch.on{border-color:var(--text)}.set-color{width:26px;height:24px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--bg-raised)}.set-mini{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:5px 9px;border-radius:7px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim);cursor:pointer}.set-mini:hover:not(:disabled){color:var(--text);border-color:var(--accent-dim)}.set-mini:disabled{opacity:.55;cursor:default}.set-hot{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}.set-hot-title{font-size:12px;color:var(--text-dim)}.set-hot-list{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.set-chip{font-size:11.5px;font-family:var(--mono);padding:2px 7px;border-radius:6px;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim)}.set-chip.fixed{border-color:var(--accent-dim);color:var(--text)}.set-chip.dynamic{border-style:dashed}.set-chip b{color:var(--accent-text);margin-left:4px;font-size:10.5px}.set-err{max-width:900px;width:100%;align-self:center;display:flex;gap:8px;align-items:center;font-size:12.5px;color:var(--err);background:var(--bg-panel);border:1px solid var(--err);border-radius:10px;padding:9px 12px}.set-inline-err{color:var(--err);font-size:12px}.set-actions{display:flex;gap:10px;align-items:center;max-width:900px;width:100%;align-self:center;padding-bottom:8px}@media (max-width: 720px){.set-row{flex-direction:column;gap:6px}.set-row>label{padding-top:0}.set-body{padding:10px}.set-main{flex-direction:column}.set-nav{width:auto;flex-direction:row;align-items:center;gap:6px;overflow-x:auto;overflow-y:hidden;padding:8px 10px;border-right:0;border-bottom:1px solid var(--line)}.set-nav-group{flex-direction:row;align-items:center;gap:6px;margin-bottom:0}.set-nav-cat{white-space:nowrap;font-size:12px;padding:4px 10px;border-radius:999px;border:1px solid var(--line);background:var(--chip-bg)}.set-nav-item{display:none}}.usage-row .usage-act{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;font-size:10.5px;padding:2px 7px;border-radius:6px;cursor:pointer;border:1px solid var(--line);background:var(--bg-raised);color:var(--text-dim)}.usage-row.hot .usage-act{border-color:rgba(var(--err-rgb),.5);color:var(--err)}.usage-row .usage-act:hover{color:var(--text);border-color:var(--accent-dim)}.usage-actions{display:flex;gap:6px;margin:6px 0 2px;flex-wrap:wrap}.usage-check{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-dim)}.usage-note code{background:var(--chip-bg);border:1px solid var(--line);border-radius:4px;padding:0 4px}@media (max-width: 720px){.usage-text{padding:9px 2px;margin:-9px -2px}.tb-btn,.tb-effort{min-width:40px}.item-btn{min-width:34px;min-height:32px}.set-swatch{width:32px;height:32px}.set-color{width:36px;height:32px}.set-seg button{padding:8px 12px}.usage-act{padding:5px 9px}}.acct-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}.acct-row{display:flex;align-items:center;gap:10px;padding:8px 10px;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px}.acct-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.acct-name{font-size:12.5px;color:var(--text);display:inline-flex;align-items:center;gap:6px}.acct-sub{font-size:11px;color:var(--text-dim);font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.acct-badge{font-size:10px;padding:1px 5px;border-radius:999px;color:var(--ok);border:1px solid rgba(var(--accent-rgb),.4);background:rgba(var(--accent-rgb),.12)}.acct-badge.danger{color:var(--err);border-color:rgba(var(--err-rgb),.45);background:rgba(var(--err-rgb),.12)}.acct-when{font-size:11px;color:var(--text-dim);font-family:var(--mono)}.acct-empty{font-size:12px;color:var(--text-dim);padding:6px 2px}.set-mini.danger{color:var(--err);border-color:rgba(var(--err-rgb),.35)}.set-mini.danger:hover:not(:disabled){color:var(--err);border-color:var(--err)}.pw-wrap{position:relative;display:flex;align-items:center}.pw-wrap input{padding-right:34px}.pw-eye{position:absolute;right:4px;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;color:var(--text-dim);cursor:pointer;border-radius:6px}.pw-eye:hover{color:var(--text);background:var(--bg-raised)}.modal-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.modal-head h3{margin:0;flex:1}@media (max-width: 720px){.pw-eye{width:34px;height:34px}.acct-row{padding:10px}.acct-row .set-mini{min-height:34px}.set-row .set-pair{flex:0 0 auto}.set-row>label{flex:0 0 auto}}.session-item{display:flex;align-items:center;gap:8px;padding:4px 6px;min-height:30px}.session-item .title{flex:1 1 auto;min-width:0}.session-item .badge.perm{flex:0 0 auto}.rail-at{flex:0 0 auto;font-size:11px;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.session-item.active .rail-at{color:var(--text-dim)}.unread-dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px rgba(var(--accent-rgb),.18)}.be-avatar{position:relative;flex:0 0 auto;width:20px;height:20px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;letter-spacing:.2px;color:var(--be-tone, var(--text-dim));background:color-mix(in srgb,var(--be-tone, var(--text-dim)) 16%,transparent);border:1px solid color-mix(in srgb,var(--be-tone, var(--text-dim)) 40%,transparent)}.be-avatar.be-hermes,.be-card-mark[data-backend=hermes]{--be-tone: #a98bff}.be-avatar.be-qoder,.be-card-mark[data-backend=qoder]{--be-tone: #4f9bf5}.be-avatar.be-mock,.be-card-mark[data-backend=mock]{--be-tone: #94a3b8}.be-avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.be-avatar .be-dot{position:absolute;right:-2px;bottom:-2px;width:7px;height:7px;border-radius:50%;border:1px solid var(--bg);background:var(--text-dim)}.be-avatar .be-dot.running{background:var(--ok)}.be-avatar.live{animation:rail-live 1.8s ease-in-out infinite}@keyframes rail-live{0%,to{box-shadow:0 0 0 1.5px color-mix(in srgb,var(--ok) 55%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 10%,transparent)}}@media (prefers-reduced-motion: reduce){.be-avatar.live{animation:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--ok) 55%,transparent)}}.title-input{flex:1 1 auto;min-width:0;font:inherit;font-size:13.5px;color:var(--text);background:var(--bg-panel);border:1px solid var(--accent-dim);border-radius:6px;padding:2px 6px}.title-input:focus{outline:none;border-color:var(--accent)}.row-menu{flex:0 0 auto;opacity:0;transition:opacity .12s}.session-item:hover .row-menu,.session-item.active .row-menu,.session-item:focus-within .row-menu{opacity:1}@media (hover: none){.row-menu{opacity:.7}}.sess-menu{position:fixed;z-index:40;width:max-content;max-width:min(320px,calc(100vw - 12px));background:var(--bg-panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:5px;display:flex;flex-direction:column;gap:1px}.sess-menu-head{display:flex;align-items:center;gap:8px;padding:6px 7px 8px;margin-bottom:3px;border-bottom:1px solid var(--line)}.sess-menu-title{font-size:12.5px;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sess-menu-item{display:flex;align-items:center;gap:9px;width:100%;padding:7px 8px;text-align:left;background:transparent;border:1px solid transparent;border-radius:7px;color:var(--text);font:inherit;font-size:13px;cursor:pointer}.sess-menu-item:hover{background:var(--bg-raised);border-color:var(--line)}.sess-menu-item.danger{color:var(--err)}.sess-menu-item.danger:hover{border-color:var(--err);background:rgba(var(--err-rgb),.08)}.sess-menu-item svg{flex:0 0 auto;color:var(--text-dim)}.sess-menu-item.danger svg{color:var(--err)}.bubble-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;background:transparent;border:1px solid transparent;border-radius:6px;color:var(--text-dim);font:inherit;cursor:pointer}.bubble-btn:hover{background:var(--bg-panel);border-color:var(--line);color:var(--text)}.bubble-btn.copy.ok{color:var(--ok);border-color:var(--ok)}.bubble-btn.copy.no{color:var(--err);border-color:var(--err)}.bubble-btn.speak.on,.bubble-btn.fork:hover{color:var(--accent-text);border-color:var(--accent-dim)}.bubble-btn.fork.failed{color:var(--err);border-color:var(--err)}.bubble-btn.fork.working{opacity:.55}.bubble-btn:disabled{opacity:.55;cursor:default}@media (max-width: 720px){.sess-menu{left:8px!important;right:8px;top:auto!important;bottom:calc(10px + env(safe-area-inset-bottom,0px));width:auto!important;max-width:none;min-width:0}.sess-menu-item{padding:11px 10px;font-size:14px}.session-item{min-height:36px}.bubble-btn{width:34px;height:30px}}.call-mode{position:fixed;inset:0;z-index:60;--bg-panel: rgba(255,255,255,.07);--bg-raised: rgba(255,255,255,.14);--line: rgba(255,255,255,.16);--text: #eef2f7;--text-dim: rgba(238,242,247,.6);--err: #f2555a;--on-accent: #0b1220;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:max(20px,env(safe-area-inset-top)) 18px calc(20px + env(safe-area-inset-bottom));background:radial-gradient(120% 90% at 50% 33%,#111827,#080a12 60%,#05060b);color:var(--text);overflow:hidden;animation:call-in .24s ease-out}@keyframes call-in{0%{opacity:0;transform:scale(1.015)}to{opacity:1;transform:none}}.call-mode[data-phase=connecting]{--call-tone: #7d91c8}.call-mode[data-phase=listening]{--call-tone: #38bdf8}.call-mode[data-phase=thinking]{--call-tone: #a78bfa}.call-mode[data-phase=speaking]{--call-tone: #fbbf24}.call-mode[data-phase=error]{--call-tone: #f87171}.call-mode:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(26% 19% at 50% 37%,color-mix(in srgb,var(--call-tone, #38bdf8) 26%,transparent) 0%,transparent 100%),radial-gradient(62% 44% at 50% 37%,color-mix(in srgb,var(--call-tone, #38bdf8) 15%,transparent) 0%,transparent 74%);transition:background .5s ease}.call-head,.call-orb,.call-lines,.call-wave,.call-controls{position:relative}.call-head{display:flex;flex-direction:column;align-items:center;gap:4px}.call-title{font-size:17px;font-weight:600;letter-spacing:.03em;color:var(--call-tone, var(--text));text-shadow:0 0 18px color-mix(in srgb,var(--call-tone, #38bdf8) 45%,transparent)}.call-sub{font-size:11.5px;color:var(--text-dim);letter-spacing:.04em}.call-orb{height:min(46vh,76vw,380px);aspect-ratio:1;flex:0 1 auto;padding:0;border:none;background:transparent;cursor:pointer;-webkit-tap-highlight-color:transparent}.call-orb-canvas{display:block;width:100%;height:100%}.call-orb:focus-visible{outline:2px solid var(--call-tone, var(--accent));outline-offset:6px;border-radius:50%}.call-lines{display:flex;flex-direction:column;align-items:center;gap:6px;width:min(560px,92vw);min-height:60px;flex:0 1 auto;overflow:hidden}.call-heard{margin:0;font-size:15px;line-height:1.45;text-align:center}.call-reply{margin:0;font-size:13.5px;line-height:1.5;color:var(--text-dim);text-align:center;max-height:24vh;overflow-y:auto;white-space:pre-wrap}.call-hint{margin:0;font-size:12.5px;color:var(--text-dim)}.call-err{margin:0;font-size:12.5px;color:var(--err)}.call-note{margin:0;font-size:12.5px;color:var(--warn, #d08a2a)}.call-wave{width:min(420px,80vw);height:46px;display:block;flex:0 1 auto;min-height:34px;border-radius:12px;background:linear-gradient(to bottom,#ffffff03,#ffffff09)}.call-hist{width:min(560px,92vw);flex:0 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--line);border-radius:14px;background:#ffffff0a}.call-hist-bar{display:flex;align-items:center;gap:8px;width:100%;min-height:44px;padding:0 12px;border:0;background:transparent;color:var(--text-dim);cursor:pointer;text-align:left}.call-hist-bar:hover{color:var(--text)}.call-hist-title{font-size:12.5px;color:var(--text)}.call-hist-n{font-size:11.5px;color:var(--text-dim)}.call-hist-peek{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.call-hist-chev{margin-left:auto;display:inline-flex;transition:transform .18s ease}.call-hist[data-open=true] .call-hist-chev{transform:rotate(180deg)}.call-hist-list{flex:1 1 auto;min-height:0;max-height:min(38vh,300px);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:10px 12px 12px;display:flex;flex-direction:column;gap:9px;border-top:1px solid var(--line)}.call-hm{font-size:12.5px;line-height:1.5;color:var(--text)}.call-hm-who{display:block;margin-bottom:2px;font-size:10.5px;letter-spacing:.08em;color:var(--text-dim);opacity:.7}.call-hm.meta,.call-hm.tool{font-size:11.5px;font-style:italic;color:var(--text-dim)}.call-hm.current{border-left:2px solid var(--call-tone, #38bdf8);margin-left:-12px;padding-left:10px}.call-hm .code{margin:4px 0;padding:6px 8px;font-size:11.5px;color:var(--text)}.call-hist-back{align-self:center;margin:0 0 10px;min-height:32px;padding:0 12px;border-radius:999px;border:1px solid var(--line);background:#ffffff0f;color:var(--text);font-size:12px;cursor:pointer}.call-hist-back:hover{background:var(--bg-raised)}.call-modes{display:inline-flex;align-items:center;gap:2px;margin-top:6px;padding:2px;border:1px solid var(--line);border-radius:999px;background:#ffffff0a}.call-mode-btn{min-height:28px;padding:0 11px;border:0;border-radius:999px;cursor:pointer;background:transparent;color:var(--text-dim);font-size:12px;letter-spacing:.02em}.call-mode-btn:hover{color:var(--text)}.call-mode-btn.on{background:var(--call-tone, #38bdf8);color:#0b1220;font-weight:600;box-shadow:0 0 12px color-mix(in srgb,var(--call-tone, #38bdf8) 40%,transparent)}@media (max-width: 400px){.call-modes{flex-wrap:wrap;justify-content:center;margin-top:4px}.call-mode-btn{min-height:26px;padding:0 8px;font-size:11.5px}}.call-controls{display:flex;align-items:center;gap:16px;margin-top:2px}.call-btn{width:52px;height:52px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text);cursor:pointer}.call-btn:hover{background:var(--bg-raised);border-color:var(--text-dim)}.call-btn.on{background:var(--accent);color:var(--on-accent);border-color:transparent}.call-btn.hangup{width:60px;height:60px;background:var(--err);border-color:transparent;color:#fff}.call-btn.hangup:hover{background:var(--err);filter:brightness(1.1)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.call-gear{position:absolute;z-index:2;top:max(14px,env(safe-area-inset-top));right:14px;width:38px;height:38px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.call-gear:hover{color:var(--text);background:var(--bg-raised)}.call-cc-btn{position:absolute;z-index:3;top:max(14px,env(safe-area-inset-top));right:60px;width:38px;height:38px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:var(--bg-panel);color:var(--text-dim);cursor:pointer}.call-cc-btn:hover{color:var(--text);background:var(--bg-raised)}.call-cc-btn.on{color:#0b1220;background:var(--call-tone, #38bdf8);border-color:transparent}.call-mode[data-caption=true]{gap:10px;padding-top:calc(max(14px,env(safe-area-inset-top)) + 44px)}.call-mode[data-caption=true] .call-gear{z-index:3}.call-mode[data-caption=true] .call-orb{position:absolute;inset:0;z-index:0;width:auto;height:auto;aspect-ratio:auto;pointer-events:none;cursor:default}.call-mode[data-caption=true] .call-orb-canvas{width:100%;height:100%;filter:blur(34px) saturate(1.3) brightness(1.35);transform:scale(1.08)}.call-mode[data-caption=true]:before{z-index:1}.call-mode[data-caption=true] .call-wave{display:none}.call-cc{position:relative;z-index:2;width:min(560px,94vw);flex:1 1 auto;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid rgba(255,255,255,.14);border-radius:18px;background:linear-gradient(180deg,#1218264d,#090c1494);-webkit-backdrop-filter:blur(22px) saturate(1.35);backdrop-filter:blur(22px) saturate(1.35);box-shadow:inset 0 1px #ffffff12,0 20px 60px #0000006b}.call-cc-head{display:flex;align-items:center;gap:10px;padding:7px 12px;border-bottom:1px solid rgba(255,255,255,.07)}.call-cc-head .call-modes{margin-top:0}.call-cc-state{display:inline-flex;align-items:center;gap:7px;min-height:30px;padding:0 4px;border:0;background:transparent;cursor:pointer;color:var(--call-tone, #38bdf8);font-size:12.5px;font-weight:600;letter-spacing:.02em}.call-cc-dot{width:7px;height:7px;border-radius:50%;background:currentColor;box-shadow:0 0 10px currentColor;animation:cc-pulse 2.4s ease-in-out infinite}@keyframes cc-pulse{0%,to{opacity:.5;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}.call-cc-n{margin-left:auto;font-size:11.5px;font-variant-numeric:tabular-nums;color:var(--text-dim)}.call-cc-latest{position:absolute;left:50%;bottom:58px;transform:translate(-50%);z-index:3;min-height:28px;padding:0 12px;border-radius:999px;border:1px solid var(--line);background:#141a28d1;color:var(--text);font-size:11.5px;cursor:pointer;backdrop-filter:blur(8px)}.call-cc-latest:hover{background:var(--bg-raised)}.call-cc-list{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:12px 14px 16px;display:flex;flex-direction:column;gap:12px}.call-cc-inner{display:flex;flex-direction:column}.call-cc-inner .msg{margin-bottom:13px}.call-cc-inner .msg:last-child{margin-bottom:2px}.call-cc-inner .msg .role{color:#ffffff85}.call-cc-inner .msg .bubble{color:#fffffff2}.call-cc-inner .msg.user .bubble{background:#ffffff12;border:1px solid rgba(255,255,255,.09)}.call-cc-inner .msg.agent .bubble{background:transparent;border:0}.call-cc-inner .msg.meta .bubble{color:#fca5a5;background:#f871711a}.call-cc-inner .tool-card,.call-cc-inner .plan-card,.call-cc-inner .thought .bubble{background:#ffffff0b;border-color:#ffffff17}.call-floor-row{flex:0 0 auto;display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:8px 10px;border-top:1px solid rgba(255,255,255,.09)}.call-floor-row.single{grid-template-columns:1fr}.call-floor{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:46px;margin:0;padding:0 12px;border:0;border-radius:12px;background:#ffffff0d;color:var(--text);font-size:14px;font-weight:650;letter-spacing:.01em;cursor:pointer;-webkit-tap-highlight-color:transparent;touch-action:manipulation;user-select:none;-webkit-user-select:none}.call-floor:hover:not(:disabled){background:#ffffff17}.call-floor.is-take{background:color-mix(in srgb,var(--call-tone, #fbbf24) 88%,#000);color:#0b1220}.call-floor.is-take:hover{background:var(--call-tone, #fbbf24)}.call-floor.is-send{background:color-mix(in srgb,var(--call-tone, #38bdf8) 88%,#000);color:#0b1220}.call-floor.is-send:hover{background:var(--call-tone, #38bdf8)}.call-floor.is-retry{background:#ffffff1a}.call-floor:disabled{color:var(--text-dim);background:#ffffff08;cursor:default}.call-floor.is-done{background:color-mix(in srgb,var(--call-tone, #38bdf8) 80%,#000);color:#0b1220}.call-floor.is-done:hover{background:var(--call-tone, #38bdf8)}.call-floor.is-ptt{background:#ffffff17}.call-floor.is-ptt.on{background:color-mix(in srgb,var(--call-tone, #38bdf8) 82%,#000);color:#0b1220;box-shadow:0 0 0 2px color-mix(in srgb,var(--call-tone, #38bdf8) 45%,transparent)}.call-cc-list .call-hm{font-size:13.5px;line-height:1.62}.call-cc-list .call-hm.meta,.call-cc-list .call-hm.tool{font-size:12px}.call-cc-list .call-hint,.call-cc-list .call-err,.call-cc-list .call-note{margin:0}.call-hm.live .call-hm-who:after{content:" · 在说";color:var(--call-tone, #38bdf8)}.call-sheet{position:absolute;inset:0;z-index:3;display:flex;align-items:center;justify-content:center;padding:16px;background:#04060cbd;animation:call-in .16s ease-out}.call-sheet-card{width:min(460px,100%);max-height:88%;overflow-y:auto;display:flex;flex-direction:column;gap:14px;padding:16px;border:1px solid var(--line);border-radius:18px;background:#0d1220;box-shadow:0 24px 60px #0000008c}.call-sheet-head{display:flex;align-items:center;justify-content:space-between;font-size:15px;font-weight:600}.call-sheet-x{width:30px;height:30px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);background:transparent;color:var(--text-dim);cursor:pointer}.call-sheet-note{margin:0;font-size:11.5px;line-height:1.5;color:var(--text-dim)}.call-knob{display:flex;flex-direction:column;gap:4px}.call-knob-top{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.call-knob-name{font-size:13.5px}.call-knob-val{font-size:13px;font-variant-numeric:tabular-nums;color:var(--call-tone, #38bdf8)}.call-knob input[type=range]{width:100%;height:30px;accent-color:var(--call-tone, #38bdf8);background:transparent;cursor:pointer}.call-knob-ends{display:flex;justify-content:space-between;font-size:10.5px;color:var(--text-dim)}.call-knob-hint{font-size:11px;line-height:1.45;color:var(--text-dim)}.call-knob.off{opacity:.45}.call-knob.off input[type=range]{cursor:not-allowed}.call-sheet-warn{margin:0;padding:9px 11px;border-radius:10px;font-size:11.5px;line-height:1.5;border:1px solid color-mix(in srgb,var(--call-tone, #38bdf8) 35%,transparent);background:color-mix(in srgb,var(--call-tone, #38bdf8) 12%,transparent);color:var(--text)}.call-sheet-echo{margin:0;font-size:11.5px;line-height:1.5;color:var(--text-dim)}.call-sheet-echo.bad{color:#fbbf24}.call-sheet-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:2px}.call-sheet-btn{min-height:40px;padding:0 14px;border-radius:10px;font-size:13px;border:1px solid var(--line);background:transparent;color:var(--text);cursor:pointer}.call-sheet-btn:hover{background:var(--bg-raised)}.call-sheet-btn.primary{background:var(--call-tone, #38bdf8);border-color:transparent;color:#0b1220;font-weight:600}@media (max-width: 720px){.call-mode{gap:8px}.call-sheet{align-items:flex-end;padding:0}.call-sheet-card{width:100%;max-height:84%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.call-gear{width:42px;height:42px}.call-cc-btn{width:42px;height:42px;right:64px}.call-mode[data-caption=true]{padding-top:calc(max(14px,env(safe-area-inset-top)) + 48px)}.call-cc-head .call-mode-btn{min-height:26px;padding:0 9px;font-size:11.5px}.call-cc-head .call-cc-state{font-size:12px;gap:6px}.call-cc{width:94vw;border-radius:16px}.call-cc-head{padding:5px 10px;gap:8px}.call-cc-list{padding:10px 12px 14px;gap:11px}.call-cc-list .call-hm{font-size:13px}.call-floor{min-height:48px;font-size:14px}.call-floor span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call-cc-inner .msg .bubble{font-size:13.5px;padding:9px 12px}.call-knob input[type=range]{height:34px}.call-orb{height:min(42vh,72vw,300px)}.call-lines{min-height:88px}.call-reply{max-height:20vh}.call-hist-list{max-height:min(30vh,240px)}.call-hist-peek{display:none}.call-btn{width:56px;height:56px}.call-btn.hangup{width:64px;height:64px}}@media (prefers-reduced-motion: reduce){.call-mode,.call-cc-dot{animation:none}}.be-list{display:flex;flex-direction:column;gap:8px;margin-top:12px}.be-row{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;background:var(--bg-raised);border:1px solid var(--line);border-radius:10px;padding:10px 12px}.be-row-main{min-width:0;display:flex;flex-direction:column;gap:3px}.be-row-title{display:flex;gap:8px;align-items:center;flex-wrap:wrap;font-size:13px}.be-row-sub{font-size:11.5px;color:var(--text-dim);font-family:var(--mono);word-break:break-all}.be-row-note{font-size:11.5px;color:var(--text-dim)}.be-kind-help{display:block;margin:6px 0 0;padding:8px 10px;border-left:2px solid var(--accent-dim);background:var(--chip-bg);border-radius:0 8px 8px 0;line-height:1.75}.be-kind-help b{color:var(--text)}.be-kind-help code{font-size:11px}.be-row-actions{display:flex;gap:6px;flex-shrink:0;flex-wrap:wrap}.be-badge{font-size:10.5px;padding:1px 6px;border-radius:999px;border:1px solid var(--line);color:var(--text-dim);background:var(--chip-bg)}.be-badge.be-warn{color:var(--accent);border-color:var(--accent-dim)}.be-badge.be-danger,.be-danger{color:var(--err)}.be-badge.be-dim{opacity:.75}.be-badge.be-ok{color:var(--ok, #3fb950);border-color:var(--ok, #3fb950)}.be-health{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px;font-size:11.5px}.be-code{font-family:var(--mono);font-size:10.5px;padding:0 4px;border:1px solid var(--line);border-radius:4px;color:var(--text-dim)}.be-guidance{flex-basis:100%;color:var(--text-dim);font-size:11.5px}.be-handshake{margin-top:4px;font-size:11.5px;color:var(--text-dim)}.be-handshake code{font-family:var(--mono)}.be-dim{color:var(--text-dim);font-size:11.5px}.hint-warn{color:var(--accent);font-size:11.5px;margin-top:4px}.be-hint{display:block}.be-hint code,.be-inspect code,.be-inspect-out{font-family:var(--mono)}.be-hint code{word-break:break-all}.be-inspect{margin-top:12px;border:1px dashed var(--line);border-radius:10px;padding:10px 12px;font-size:12px;background:var(--bg-raised)}.be-inspect-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.be-inspect ul{margin:8px 0 0;padding-left:18px;display:flex;flex-direction:column;gap:4px}.be-inspect-out{margin-top:4px;font-size:11px;color:var(--text-dim);white-space:pre-wrap;word-break:break-all}.be-backdrop{position:fixed;inset:0;z-index:60;background:#00000073;display:flex;align-items:center;justify-content:center;padding:20px}.be-modal{background:var(--bg-panel);border:1px solid var(--line);border-radius:14px;width:min(560px,100%);max-height:min(86vh,780px);display:flex;flex-direction:column;box-shadow:0 18px 48px #00000080}.be-modal-head{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line);font-size:13.5px}.be-modal-head b{font-size:13.5px}.be-modal-head code{font-family:var(--mono);font-size:11.5px;color:var(--text-dim)}.be-modal-x{margin-left:auto}.be-modal-body{overflow:auto;overscroll-behavior:contain;padding:2px 16px 14px}.be-modal-foot{display:flex;align-items:center;gap:8px;padding:12px 16px;border-top:1px solid var(--line)}.be-modal-foot button{flex:0 0 auto;white-space:nowrap}.be-modal-foot .set-mini{margin-left:auto}.be-modal-err{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--err);border:none;padding:0;background:none}@media (max-width: 720px){.be-backdrop{padding:0;align-items:flex-end}.be-modal{width:100%;max-height:92vh;border-radius:14px 14px 0 0}}@media (max-width: 720px){.be-row{flex-direction:column}}.tls-once{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:7px 10px;font-size:12px;line-height:1.5;background:var(--chip-bg);border:1px solid var(--accent-dim);border-radius:8px}.tls-warn{color:var(--warn, #b4690e)}.tls-cols{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.4fr);gap:18px;margin-top:12px}@media (max-width: 1024px){.tls-cols{grid-template-columns:minmax(0,1fr);gap:14px}}.tls-left{min-width:0}.tls-meta span{min-width:0;overflow-wrap:anywhere}.tls-dl{display:inline-flex;align-items:center;gap:6px;text-decoration:none;font-size:13px;font-weight:600;padding:7px 12px;border-radius:8px;background:var(--accent);color:var(--accent-ink, #fff);border:1px solid transparent}.tls-dl:hover{filter:brightness(1.06)}.tls-meta{gap:10px}.tls-side{font-size:11.5px;color:var(--text-dim);line-height:1.55}.tls-right{min-width:0;border-left:1px solid var(--line);padding-left:16px}@media (max-width: 1024px){.tls-right{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:12px}}.tls-steps-title{font-size:12.5px;font-weight:600;margin-bottom:6px}.tls-os{margin-top:10px}.tls-os-name{font-size:12px;font-weight:600;color:var(--accent-text)}.tls-os ol{margin:4px 0 0;padding-left:18px;font-size:12px;line-height:1.65;color:var(--text-dim)}.tls-os ol li{margin:3px 0}.tls-os code{font-family:var(--mono);background:var(--chip-bg);border:1px solid var(--line);border-radius:4px;padding:1px 4px;font-size:11px}.tls-cmd{display:block;margin-top:4px;white-space:pre-wrap;word-break:break-all}@media (min-width: 721px) and (pointer: coarse){.sidebar header .tagline{font-size:12px}.rail-section{font-size:12px;min-height:34px}.rail-group-name{font-size:13px}.rail-group-count{font-size:12px}.rail-placeholder{font-size:12.5px;min-height:34px}.session-item{min-height:42px;padding-top:6px;padding-bottom:6px}.session-item .title{font-size:14.5px}.session-item .meta,.rail-at{font-size:12px}.rail-search{font-size:14px;min-height:38px}.new-btn{min-height:40px;font-size:14px}.rail-more{min-height:34px;font-size:12px}}
|