@huynle/hub 0.8.3 → 0.8.5
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/CHANGELOG.md +80 -0
- package/README.md +40 -3
- package/package.json +1 -1
- package/packages/claude-code/package.json +1 -1
- package/packages/cli/dist/hub-cli.js +5288 -4415
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/bootstrap/PHASE2-CONTRACT.md +87 -0
- package/packages/cli/src/bootstrap/adapters/claude/node.ts +11 -43
- package/packages/cli/src/bootstrap/adapters/codex/verify.ts +19 -12
- package/packages/cli/src/bootstrap/adapters/opencode/README.md +42 -6
- package/packages/cli/src/bootstrap/adapters/opencode/apply.ts +18 -7
- package/packages/cli/src/bootstrap/adapters/opencode/archive.ts +36 -19
- package/packages/cli/src/bootstrap/adapters/opencode/config.ts +19 -3
- package/packages/cli/src/bootstrap/adapters/opencode/index.ts +2 -5
- package/packages/cli/src/bootstrap/adapters/opencode/plan.ts +37 -6
- package/packages/cli/src/bootstrap/adapters/opencode/verify.ts +49 -26
- package/packages/cli/src/bootstrap/adapters/process-tree.ts +263 -0
- package/packages/cli/src/bootstrap/contracts/paths.ts +7 -4
- package/packages/cli/src/bootstrap/contracts/platform.ts +9 -5
- package/packages/cli/src/bootstrap/contracts/validate.ts +20 -4
- package/packages/cli/src/bootstrap/discovery/discover.ts +3 -1
- package/packages/cli/src/bootstrap/discovery/executables.ts +49 -14
- package/packages/cli/src/bootstrap/discovery/host.ts +16 -8
- package/packages/cli/src/bootstrap/discovery/node-probe.ts +41 -5
- package/packages/cli/src/bootstrap/discovery/probe.ts +7 -3
- package/packages/cli/src/bootstrap/discovery/util.ts +42 -5
- package/packages/cli/src/bootstrap/enrollment/store.ts +13 -6
- package/packages/cli/src/bootstrap/preview/plan.ts +3 -0
- package/packages/cli/src/bootstrap/profiles/desired.ts +10 -3
- package/packages/cli/src/bootstrap/release/README.md +63 -9
- package/packages/cli/src/bootstrap/release/cli.ts +94 -16
- package/packages/cli/src/bootstrap/release/harness-pins.pending.json +24 -0
- package/packages/cli/src/bootstrap/release/manifest.ts +3 -0
- package/packages/cli/src/bootstrap/release/pins.ts +60 -9
- package/packages/cli/src/bootstrap/transaction/builtin.ts +18 -6
- package/packages/cli/src/bootstrap/transaction/engine.ts +166 -12
- package/packages/cli/src/bootstrap/transaction/executor.ts +5 -0
- package/packages/cli/src/bootstrap/transaction/fs.ts +142 -3
- package/packages/cli/src/bootstrap/transaction/shim.ts +31 -0
- package/packages/cli/src/bootstrap/transaction/state.ts +11 -6
- package/packages/cli/src/credentials.ts +5 -2
- package/packages/cli/src/main.ts +3 -2
- package/packages/cli/src/setup/commands.ts +96 -18
- package/packages/cli/src/setup/contributors.ts +45 -10
- package/packages/cli/src/setup/runtime.ts +25 -6
- package/packages/cli/src/setup/self-aside.ts +130 -0
- package/packages/codex/package.json +1 -1
- package/packages/node/package.json +1 -1
- package/packages/node/src/opencode-warm.ts +12 -4
- package/packages/preset/package.json +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/src/index.ts +7 -2
- package/packages/runtime-openshell/package.json +1 -1
- package/packages/runtime-sdk/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/packages/spoke-sdk/package.json +1 -1
- package/src/central/config.ts +12 -0
- package/src/central/http.ts +10 -0
- package/src/central/install/CONTRACT.md +66 -0
- package/src/central/install/install.ps1 +349 -0
- package/src/central/install/install.sh +266 -0
- package/src/central/install/render.ts +146 -0
- package/src/central/install/templates.ts +6 -0
- package/src/central/install/text-assets.d.ts +9 -0
- package/src/central/registry.ts +93 -22
- package/src/config.ts +12 -7
- package/src/index.ts +28 -0
- package/src/spoke/env-inject.ts +17 -2
- package/src/spoke/launchers.ts +145 -9
- package/src/spoke/spoke.ts +150 -10
- package/src/status.ts +70 -14
- package/src/win-acl.ts +154 -0
- package/web/dist/assets/ArtifactPage-Dq7VW-bU.js +1 -0
- package/web/dist/assets/{ArtifactPane-DPHjiWce.js → ArtifactPane-DKwbMTX9.js} +1 -1
- package/web/dist/assets/ArtifactWorkbench-vrgIfncX.js +6 -0
- package/web/dist/assets/Library-D6-Go6Cu.js +2 -0
- package/web/dist/assets/{ProfilesDestination-GriuOpiZ.js → ProfilesDestination-BOML2Dgf.js} +1 -1
- package/web/dist/assets/{TeamsPage-C-5lYeeM.js → TeamsPage-CNBTE8gB.js} +1 -1
- package/web/dist/assets/Watchtower-Dor1Ubjy.js +2 -0
- package/web/dist/assets/Watchtower-RphjcL0_.css +1 -0
- package/web/dist/assets/hub-CrbItiwP.js +13 -0
- package/web/dist/assets/index-82Ce0IAf.css +1 -0
- package/web/dist/assets/index-D9SP3_0z.js +22 -0
- package/web/dist/assets/{live-CDWcyavI.js → live-BNJgy0vg.js} +3 -3
- package/web/dist/assets/{pane-layout-Csk-vPNe.js → pane-layout-EdR1kRrG.js} +1 -1
- package/web/dist/assets/preload-helper-DqrJTq0t.js +1 -0
- package/web/dist/assets/{renderer2d-CNFdTDTr.js → renderer2d-CYag1CnR.js} +1 -1
- package/web/dist/assets/{renderer3d-C45jPvYX.js → renderer3d-BRB6rgDJ.js} +1 -1
- package/web/dist/assets/{safe-area-sA9a8vYJ.js → safe-area-fOy0AOuG.js} +1 -1
- package/web/dist/assets/{source-BFLJQ43_.js → source-Wbq35qGp.js} +1 -1
- package/web/dist/assets/{ui-Qo2Pd9-O.js → ui-j5FFk90B.js} +1 -1
- package/web/dist/index.html +6 -4
- package/web/dist/assets/ArtifactPage-CSotAWob.js +0 -1
- package/web/dist/assets/ArtifactWorkbench-CkmWnP6L.js +0 -6
- package/web/dist/assets/Library-DTLEyekn.js +0 -2
- package/web/dist/assets/Watchtower-CTgqHk5g.css +0 -1
- package/web/dist/assets/Watchtower-DOlPsiIy.js +0 -2
- package/web/dist/assets/index-6mdQ7eUY.js +0 -34
- package/web/dist/assets/index-C5OmwA1y.css +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{$ as e,C as t,E as n,It as r,Lt as i,Mt as a,Nt as o,St as s,Ut as c,at as l,it as u,kt as d,nt as f,ot as p,rt as m,tt as h,w as ee,xt as g,y as _,zt as te}from"./ui-j5FFk90B.js";import{n as ne,t as re}from"./pane-layout-EdR1kRrG.js";var v=e=>e==null?``:String(e).trim(),ie=Object.freeze([[`role`,`Admins first`],[`email`,`Email`],[`lastSeen`,`Last seen`]]),ae=Object.freeze([[`all`,`All`],[`admins`,`Admins`],[`active`,`Active`],[`disabled`,`Disabled`]]),oe=Object.freeze({signin:`Signed in`,"signin.denied":`Sign-in refused`,"device.pair":`Paired a device`,"device.revoke":`Revoked a device`,"machine.approve":`Approved a machine`,"machine.deny":`Denied a machine`,"machine.revoke":`Revoked a machine`,"user.role":`Changed a role`,"user.disable":`Disabled a user`,"user.enable":`Enabled a user`,"speech.default":`Changed the server speech default`,"migrate.local":`Moved the hub owner's machines and devices to the first admin`});function y(e){return e?.user?.role===`admin`}function se(e){let t=e?.user,n=e?.auth===`oidc`?`oidc`:`pairing`,r=y(e);if(n!==`oidc`)return{mode:n,admin:r,title:`This hub`,initial:`H`};let i=v(t?.name),a=v(t?.email),o=i||a||`Signed in`;return{mode:n,admin:r,title:o,...i&&a?{subtitle:a}:{},initial:(o.match(/[\p{L}\p{N}]/u)?.[0]??`?`).toUpperCase(),...r?{badge:`Admin`}:{}}}var ce=Object.freeze([[`users`,`Users`],[`machines`,`Machines`],[`approvals`,`Approvals`],[`audit`,`Audit log`]]);function le(e){return y(e)?ce.filter(([t])=>t!==`users`||e?.auth===`oidc`):[]}function ue(e,t){return y(e)&&t?.scope===`user`?[`user`,`default`]:[`user`]}function de(e){return e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`}function fe(e,t){if(e?.mode===`oidc`&&typeof e.signIn==`string`&&e.signIn)return`${e.signIn}?next=${encodeURIComponent(de(t))}`}function pe(e){let t=e?.auth===`oidc`?v(e?.user?.email):``;return t?`This machine will belong to you (${t}).`:`This machine will belong to you.`}var me={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]};function he(e){let t=e;if(t?.scope!==`user`)return;let n=t.default??{},r=t.user&&typeof t.user==`object`?t.user:void 0,i={own:{stt:0,tts:0}};for(let e of[`stt`,`tts`]){let a=t[e]??{},o=n[e]??{},s=r?.[e]??{},c={};for(let t of me[e]){let n=r?s[t]===void 0||s[t]===null:v(a[t])===v(o[t]),l=v(o[t]);c[t]=n?{inherited:n,note:l?`Using server default: ${l}`:`Server default: not set`}:{inherited:n},n||i.own[e]++}let l=r?!!s.apiKey?.set:a.apiKey?.source===`user`;c.apiKey=l?{inherited:!1}:{inherited:!0,note:o.apiKey?.set===!1?`Key: server default (none set)`:`Key: server default`},l&&i.own[e]++,i[e]=c}return i}function ge(e){return{[e]:Object.fromEntries([...me[e],`apiKey`].map(e=>[e,null]))}}function _e(e){let t=v(e);if(!t)return`Unknown action`;if(oe[t])return oe[t];let n=t.replace(/[._-]+/g,` `).trim().toLowerCase();return n.charAt(0).toUpperCase()+n.slice(1)}function ve(e,t=[]){let n=new Map(t.map(e=>[e.id,v(e.email)||v(e.name)||e.id])),r=e=>e===`system`?`System`:n.get(e)??e;return[...e??[]].sort((e,t)=>t.at-e.at).map(e=>({at:e.at,actor:r(e.actor),action:_e(e.action),target:e.target===void 0?void 0:n.get(e.target)??e.target,detail:e.detail}))}var ye=e=>(v(e.email)||v(e.name)||e.id).toLowerCase();function be(e,{query:t=``,filter:n=`all`,sort:r=`role`}={}){let i=v(t).toLowerCase(),a=e=>(!i||`${v(e.email)} ${v(e.name)}`.toLowerCase().includes(i))&&(n===`admins`?e.role===`admin`:n===`disabled`?!!e.disabled:n!==`active`||!e.disabled),o=(e,t)=>ye(e).localeCompare(ye(t)),s=r===`lastSeen`?(e,t)=>(t.lastSeen??0)-(e.lastSeen??0)||o(e,t):r===`email`?o:(e,t)=>Number(!!e.disabled)-Number(!!t.disabled)||Number(t.role===`admin`)-Number(e.role===`admin`)||o(e,t);return(e??[]).filter(a).sort(s)}function xe(e,t,n){let r=v(e.email)||v(e.name)||e.id,i=e.id===n,a=(t??[]).filter(e=>e.role===`admin`&&!e.disabled).length,o=e.role===`admin`&&!e.disabled&&a<=1;return[e.role===`admin`?{label:`Remove admin`,change:{role:`user`},danger:!0,...o?{lastAdmin:!0}:{},confirm:i?`Remove your own admin role? You will lose access to the admin screens.`:`Remove admin from ${r}?`}:{label:`Make admin`,change:{role:`admin`},confirm:`Make ${r} an admin? Admins manage users, machines and the server speech default.`},e.disabled?{label:`Enable`,change:{disabled:!1},confirm:`Enable ${r}?`}:{label:`Disable`,change:{disabled:!0},danger:!0,...o?{lastAdmin:!0}:{},confirm:i?`Disable your own account? This device is signed out.`:`Disable ${r}? Their phones and machines are disconnected until you enable them again.`}]}function Se(e){let t=v(e?.message);return t&&!/^HTTP \d+$/.test(t)?t:e?.status===403?`Only admins can do that.`:`The server refused the change (HTTP ${e?.status??`?`}).`}var Ce=e=>String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase(),we=e=>`${e.providerID}/${e.modelID}`,Te=class{models;constructor(e=[]){this.models=Array.isArray(e)?e.filter(e=>e&&typeof e.providerID==`string`&&typeof e.modelID==`string`):[]}groups(e=``){let t=Ce(e.trim()),n=new Map,r=this.models.some(e=>e.enabled!==!1);for(let e of this.models){if(r&&e.enabled===!1||t&&!Ce([e.name,e.modelID,e.providerID].join(` `)).includes(t))continue;let i=n.get(e.providerID)??[];i.push({...e,variants:[...e.variants??[]]}),n.set(e.providerID,i)}return[...n].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({providerID:e,items:t.sort((e,t)=>(e.name||e.modelID).localeCompare(t.name||t.modelID))}))}selection(e){if(!e)return;let t=this.models.find(t=>t.providerID===e.providerID&&t.modelID===e.modelID);return t?{...t,variants:[...t.variants??[]],stale:t.enabled===!1}:{...e,name:we(e),variants:e.variant?[e.variant]:[],stale:!0}}},Ee=e=>`${e}:reasoning`,De=(e,t)=>t===void 0?`${e}:text`:`${e}:text:${t}`,Oe=e=>`hubmsg:${e}`,ke=1e3,Ae=(e,t)=>`activity:${e}:${t}`,je=(e,t)=>e.pos-t.pos||e.live-t.live,Me=class{items=new Map;subagents=new Map;details=new Map;places=new Map;top=0;bottom=0;liveSeq=0;seenSeq=0;loaded=!1;snapshots=0;history=new Set;load(e,t={}){let n=(e??[]).filter(e=>e&&typeof e.key==`string`),r=n.filter(e=>typeof e.pos!=`number`&&!this.places.has(e.key));r.forEach((e,n)=>{this.places.set(e.key,{pos:t.older?this.bottom-r.length+n:this.top+1+n,live:0})});for(let e of n){typeof e.pos==`number`&&Number.isFinite(e.pos)&&this.places.set(e.key,{pos:e.pos,live:0});let t=this.places.get(e.key).pos;this.top=Math.max(this.top,t),this.bottom=Math.min(this.bottom,t),this.history.add(e.key)}for(let e of n){let t=this.liveTwin(e);t?(this.items.delete(t.key),this.places.delete(t.key),t.kind===`reasoning`?this.put({...e,text:e.text||t.text||``}):t.kind===`tool`?this.put({...Ne(t,[`summary`,`error`]),...e}):this.put(e)):this.put(e)}if(!t.older){this.loaded=!0;for(let[e,t]of this.places)t.live>0&&t.pos<this.top&&this.places.set(e,{...t,pos:this.top});for(let e of this.subagents.values())e.place&&e.place.pos<this.top&&(e.place={...e.place,pos:this.top})}}liveTwin(e){if(this.history.has(e.key)&&this.items.has(e.key))return;let t=typeof e.messageID==`string`?e.messageID:void 0,n=[];e.kind===`reasoning`&&t&&n.push(Ee(t)),e.kind===`assistant`&&t&&(typeof e.ordinal==`number`&&n.push(De(t,e.ordinal)),(e.ordinal===void 0||e.ordinal===0)&&n.push(De(t))),e.kind===`tool`&&typeof e.callID==`string`&&typeof e.sessionID==`string`&&n.push(Ae(e.sessionID,e.callID)),e.kind===`message`&&t&&n.push(Oe(t));for(let t of n){let n=t===e.key?void 0:this.items.get(t);if(n&&!this.history.has(t))return n}if(e.kind===`user`&&typeof e.text==`string`&&e.text){for(let t of this.items.values())if(t.kind===`user`&&!t.messageID&&!this.history.has(t.key)&&t.text===e.text)return t}}appendReasoning({sessionID:e,messageID:t,delta:n,at:r=Date.now()}){let i;for(let e of this.items.values())e.kind===`reasoning`&&e.messageID===t&&e.state===`running`&&(i=e);i??=this.items.get(Ee(t));let a=i?.key??Ee(t);this.upsert({key:a,kind:`reasoning`,messageID:t,...e?{sessionID:e}:{},text:`${i?.text??``}${n}`,state:`running`,at:i?.at??r})}appendText({sessionID:e,messageID:t,ordinal:n,delta:r,at:i=Date.now()}){let a=De(t,n),o=this.items.get(a);this.upsert({key:a,messageID:t,...e?{sessionID:e}:{},kind:`assistant`,text:`${o?.text??``}${r}`,live:!0,at:o?.at??i}),this.endReasoning(e)}liveTextKey(e){let t=De(e),n=-1;for(let r of this.items.values()){if(r.kind!==`assistant`||r.messageID!==e||this.history.has(r.key))continue;let i=r.key.startsWith(`${e}:text:`)?Number(r.key.slice(e.length+6)):NaN;Number.isInteger(i)&&i>n&&([t,n]=[r.key,i])}return t}activity(e,t){if(!t||typeof t.id!=`string`||t.kind===`thinking`)return;let n=Ae(e,t.id),r=this.items.get(n);this.upsert({key:n,sessionID:e,kind:`tool`,callID:t.id,...t.tool?{name:t.tool}:{},...t.summary?{summary:t.summary}:{},...t.error?{error:t.error}:{},...t.childSessionID?{childSessionID:t.childSessionID}:{},state:t.state,at:r?.at??t.at})}endReasoning(e,t=Date.now()){for(let n of this.items.values())n.kind===`reasoning`&&n.state===`running`&&(e===void 0||n.sessionID===e)&&this.upsert({key:n.key,kind:n.kind,state:`done`,completed:t})}upsert(e){e&&typeof e.key==`string`&&(this.places.has(e.key)||this.places.set(e.key,this.livePlace()),this.put(e))}livePlace(){return{pos:this.top,live:++this.liveSeq}}put(e){this.items.set(e.key,{...this.items.get(e.key)??{},...e})}hubMessage(e){if(e&&typeof e.key==`string`&&typeof e.messageID==`string`){for(let[t,n]of this.items)if(t!==e.key&&n.kind===`message`&&n.messageID===e.messageID&&this.history.has(t))return;if(!this.places.has(e.key)){if(typeof e.at==`number`&&Number.isFinite(e.at)){let t=e.at*ke;this.places.set(e.key,{pos:t,live:0}),this.top=Math.max(this.top,t)}else this.places.set(e.key,this.livePlace())}this.put(e)}}fromHistory(e){return this.history.has(e)}forgetHistory(){for(let e of this.history)this.items.delete(e),this.places.delete(e);this.history.clear()}clear(){this.items.clear(),this.places.clear(),this.details.clear(),this.history.clear(),this.top=0,this.bottom=0,this.loaded=!1}get(e){return this.items.get(e)}status(e,t){let n=new Set,r=new Set([t]);for(let t=!0;t;){t=!1;for(let n of e??[])typeof n?.id==`string`&&typeof n.parentID==`string`&&r.has(n.parentID)&&!r.has(n.id)&&(r.add(n.id),t=!0)}let i=(e??[]).every(e=>e?.id===t||typeof e?.parentID!=`string`),a=this.snapshots>0&&this.loaded;e?.length&&this.snapshots++;for(let o of e??[]){let s=o?.id;if(!o||typeof s!=`string`||!s||s===t||!r.has(s)&&!(i&&(e??[])[0]?.id===t))continue;n.add(s);let c=typeof o.since==`number`?o.since:void 0,l=o.state===`idle`?`done`:o.state,u=this.subagents.get(s)??{id:s,seen:++this.seenSeq,...a&&l===`working`?{place:this.livePlace()}:{}};this.subagents.set(s,{...u,title:typeof o.title==`string`?o.title:void 0,state:l,since:c})}for(let e of this.subagents.values())!n.has(e.id)&&e.state===`working`&&(e.state=`done`)}detail(e,t){this.details.set(e,t)}rows(){let e=[],t=new Map;for(let n of this.items.values()){let r={...n,depth:0,...this.details.has(n.key)?{detail:this.details.get(n.key)}:{}};if(n.sessionID&&this.subagents.has(n.sessionID)){let e=t.get(n.sessionID)??[];e.push({...r,depth:1}),t.set(n.sessionID,e)}else e.push(r)}let n=e=>this.places.get(e)??{pos:this.top,live:2**53-1},r=(e,t)=>je(n(e.key),n(t.key)),i=e=>[{key:`sub:${e.id}`,kind:`subagent`,label:e.title||e.id,state:e.state,sessionID:e.id,depth:0},...(t.get(e.id)??[]).sort(r)],a=[],o=new Set;for(let t of e.sort(r)){let e=typeof t.childSessionID==`string`&&!o.has(t.childSessionID)?this.subagents.get(t.childSessionID):void 0;e&&o.add(e.id),a.push({place:n(t.key),rows:e?i(e):[t]})}let s=[...this.subagents.values()].filter(e=>!o.has(e.id));s.filter(e=>!e.place).sort((e,t)=>(e.since??1/0)-(t.since??1/0)||e.seen-t.seen).forEach((e,t)=>a.push({place:{pos:-1/0,live:t},rows:i(e)}));for(let e of s)e.place&&a.push({place:e.place,rows:i(e)});return a.sort((e,t)=>je(e.place,t.place)).flatMap(e=>e.rows)}};function Ne(e,t){return Object.fromEntries(t.filter(t=>e[t]!==void 0).map(t=>[t,e[t]]))}function Pe(e){let t=e&&typeof e==`object`?e:{},n=e=>typeof e==`string`&&e?e:void 0;return t.kind===`session`?n(t.name)?`@${t.name}`:String(t.sessionID??`?`):t.kind===`user`?`@me`:t.kind===`app`?`app ${n(t.label)??String(t.tokenID??`?`)}`:`?`}function Fe(e,t){let n=t&&typeof t==`object`?t:void 0;if(!n||typeof n.id!=`string`||!n.id||typeof n.kind!=`string`||typeof n.to!=`string`)return;let r=t=>t?.kind===`session`&&t.sessionID===e,i=r(n.from)?`out`:r(n.recipient)?`in`:void 0;if(i)return{key:Oe(n.id),kind:`message`,messageID:n.id,sessionID:e,text:typeof n.text==`string`?n.text:``,...typeof n.at==`number`?{at:n.at}:{},direction:i,message:{kind:n.kind,from:Pe(n.from),to:n.to,...typeof n.replyTo==`string`?{replyTo:n.replyTo}:{}},recipient:Pe(n.recipient),...typeof n.state==`string`?{state:n.state}:{},...typeof n.delivery==`string`?{delivery:n.delivery}:{}}}var Ie=new Set([`open`,`answered`,`expired`,`closed`]),Le=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Re(e){if(!Le(e))return;let{id:t,question:n,options:r,state:i,about:a,at:o,from:s}=e;if(typeof t!=`string`||!t.startsWith(`dec_`)||typeof n!=`string`||!Array.isArray(r)||!Array.isArray(a)||typeof i!=`string`||!Ie.has(i)||typeof o!=`number`||!Le(s))return;let c=r.filter(e=>Le(e)&&typeof e.id==`string`&&typeof e.label==`string`),{as:l,...u}=e;return{...u,...l===`concierge`?{as:`concierge`}:{},options:c,about:a.filter(e=>typeof e==`string`)}}var ze=(e,t)=>t.at-e.at||(e.id<t.id?1:-1);function Be(e){return e.filter(e=>e.state===`open`).sort(ze)}function Ve(e,t){return Be([...e.filter(e=>e.id!==t.id),t])}function He(e,t){return e.filter(e=>e.from.kind===`session`&&e.from.sessionID===t||e.about.includes(t))}var Ue=new Set,We=(e,t=Ue)=>e.as===`concierge`||e.from.kind===`session`&&t.has(e.from.sessionID)?`@@concierge`:Pe(e.from),Ge=e=>e.tier===`tap`?`Answer here (tap): only a signed-in console can answer this one.`:``;function Ke(e,t){let n=e-t;if(n<0)return``;let r=Math.floor(n/1e3),i=Math.floor(r/86400),a=Math.floor(r%86400/3600),o=Math.floor(r%3600/60);return i?`${i}d ${a}h`:a?`${a}h ${o}m`:o?`${o}m ${r%60}s`:`${r}s`}function qe(e,t){if(e.deadline===void 0)return``;let n=Ke(e.deadline,t);if(!n)return`Past its deadline`;let r=e.onTimeout?e.options.find(t=>t.id===e.onTimeout)?.label:void 0;return`Deadline in ${n}${r?` · then ${r}`:``}`}function Je(e,t,n){let r=n.trim();return e.options.length?t===void 0||!e.options.some(e=>e.id===t)?{ok:!1,problem:`Pick one of the options`}:{ok:!0,body:{option:t,...r?{text:r}:{}}}:r?{ok:!0,body:{text:r}}:{ok:!1,problem:`Type an answer`}}var Ye=class{seq=0;settled=0;pending=new Map;begin(e=Date.now()){let t=++this.seq;return this.pending.set(t,{at:e,events:[]}),t}event(e,t=Date.now()){for(let[n,r]of this.pending)t-r.at>3e4?this.pending.delete(n):r.events.push(e)}settle(e,t){let n=this.pending.get(e)?.events;if(this.pending.delete(e),!(!n||e<this.settled))return this.settled=e,n.reduce((e,t)=>Ve(e,t),Be(t))}fail(e){this.pending.delete(e)}},Xe=`@@concierge`,Ze=/\nThe Concierge's note: ([\s\S]*)$/,Qe=/proposes to deny ([\s\S]*) in (?:@[\w-]+|ses_\w+)\.(?:\nThe Concierge's note: [\s\S]*)?$/,$e=/^[\s\S]*? asks to approve( always(?: \(saves [\s\S]*?\))?)? ([\s\S]*)\. Outside its grant: ([\s\S]*)$/,et=`a permission request (details unknown)`,b=e=>typeof e==`string`&&e?e:void 0;function tt(e){let t=Array.isArray(e.resources)?e.resources.filter(e=>typeof e==`string`):void 0,n=b(e.action);if(n&&t)return e.summary===`${n}: ${t.join(`, `)}`||!e.summary.startsWith(`${n}: `)?{action:n,resources:t}:{action:n,resources:[e.summary.slice(n.length+2)]};let r=e.summary.indexOf(`: `);return r<0?{action:n??b(e.summary),resources:t??[]}:{action:n??e.summary.slice(0,r),resources:t??[e.summary.slice(r+2)]}}function nt(e){let t=e.indexOf(`: `);return t<0?{action:e,resources:[]}:{action:e.slice(0,t),resources:[e.slice(t+2)]}}function rt(e,t,n){if(e)return{...tt(e),...t?.save?.length?{saves:[...t.save]}:{},source:`live`};if(t&&typeof t.action==`string`){let e=[...t.resources??[]],n=t.save?.length?[...t.save]:void 0,r=(e,t)=>typeof e==`number`&&e>t?e-t:void 0,i=r(t.resourcesTotal,e.length),a=r(t.savesTotal,n?.length??0),o=Array.isArray(t.cut)?t.cut.filter(e=>(e.field===`resources`||e.field===`save`)&&Number.isInteger(e.index)&&typeof e.length==`number`):[];return{action:t.action,resources:e,...n?{saves:n}:{},source:`request`,...i?{resourcesMore:i}:{},...a?{savesMore:a}:{},...o.length?{cut:o}:{},...t.truncated===!0?{incomplete:!0}:{}}}let r=n();return r?{...r,source:`text`}:void 0}var it=e=>e?{...e.action?{action:e.action}:{},resources:e.resources,...e.saves?{saves:e.saves}:{},source:e.source,...e.resourcesMore?{resourcesMore:e.resourcesMore}:{},...e.savesMore?{savesMore:e.savesMore}:{},...e.cut?{cut:e.cut}:{},...e.incomplete?{incomplete:e.incomplete}:{}}:{resources:[]};function at(e,t,n,r){if(r)for(let i of new Set(t.filter(e=>!!e))){let t=e.blockers(i).find(e=>e.kind===n&&e.id===r);if(t)return t}}var ot=(e,t)=>({id:t,label:e.label(t)??t}),st=e=>Array.isArray(e)?e.map(String).join(`, `):typeof e==`object`&&e?JSON.stringify(e):String(e);function ct(e,t){let n=e.action;if(n?.kind===`permission`){let r=We(e),i=e.from.kind===`session`&&r===e.from.sessionID?t.label(e.from.sessionID)??r:r,a=$e.exec(e.question),o=n.sessionID??n.rootID??e.about[0],s=rt(at(t,[n.sessionID,n.rootID,...e.about],`permission`,n.requestID),n.request,()=>a&&a[2]!==et?nt(a[2]):void 0),c=b(n.reason)??a?.[3]?.trim(),l=e.recommendation?.why;return{kind:`permission`,requester:i,...o?{target:ot(t,o)}:{},...it(s),always:n.always===!0||!!a?.[1],...n.requestID?{requestID:n.requestID}:{},...c?{outsideGrant:c}:{},...l?{purpose:{by:i,text:l}}:{}}}if(n?.kind===`act`&&n.target){let r=n.input??{},i=e.recommendation?.why??Ze.exec(e.question)?.[1]?.trim(),a={kind:`proposal`,verb:n.verb??`act`,target:ot(t,n.target),always:!1,...i?{purpose:{by:Xe,text:i}}:{}};switch(n.verb){case`deny`:{let i=b(r.requestID),o=at(t,[n.target],`permission`,i),s=Qe.exec(e.question)?.[1],c=rt(o,n.request,()=>s&&s!==`permission request ${i}`?nt(s):void 0);return{...a,...it(c),...i?{requestID:i}:{}}}case`prompt`:return{...a,resources:[],...b(r.text)?{text:b(r.text)}:{}};case`answer`:{let e=b(r.formID),i=at(t,[n.target],`form`,e),o=r.answer&&typeof r.answer==`object`&&!Array.isArray(r.answer)?Object.entries(r.answer).map(([e,t])=>({key:e,value:st(t)})):void 0;return{...a,resources:[],...e?{formID:e}:{},...i?{form:i.summary}:{},...r.cancel===!0?{cancel:!0}:o?{answer:o}:{},...i?{source:`live`}:{}}}default:return{...a,resources:[]}}}if(n)return;let r=[...new Set(e.about)].flatMap(e=>t.blockers(e).filter(e=>e.kind===`permission`).map(t=>({s:e,b:t})));if(r.length!==1)return;let{s:i,b:a}=r[0],o=tt(a);return{kind:`ask`,target:ot(t,i),...o.action?{action:o.action}:{},resources:o.resources,always:!1,requestID:a.id,source:`live`}}function lt(e){if(e.action?.kind!==`act`)return e.question;let t=e.question.replace(Ze,``);return e.action.verb===`prompt`||e.action.verb===`answer`?t.split(`
|
|
2
|
+
`)[0]:t}var ut=typeof Intl<`u`&&`Segmenter`in Intl?new Intl.Segmenter(void 0,{granularity:`grapheme`}):void 0;function dt(e){return ut?Array.from(ut.segment(e),e=>e.segment):Array.from(e)}function ft(e,{chars:t=400,lines:n=8}={}){let r=e,i=!1,a=r.split(`
|
|
3
|
+
`);a.length>n&&(r=a.slice(0,n).join(`
|
|
4
|
+
`),i=!0);let o=dt(r);return o.length>t&&(r=o.slice(0,t).join(``),i=!0),{text:i?`${r}…`:r,cut:i}}var pt=RegExp(`(\\u{1F3F4}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,30}\\u{E007F})|[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F\\u00AD\\u034F\\u061C\\u115F\\u1160\\u180E\\u200B\\u200C\\u200E\\u200F\\u2028-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\u3164\\uFEFF\\uFFA0\\uFFF9-\\uFFFB\\u{E0000}-\\u{E007F}]`,`gu`);function mt(e){return e.replace(pt,(e,t)=>t||`⟨U+${e.codePointAt(0).toString(16).toUpperCase().padStart(4,`0`)}⟩`)}var ht=/(?<![\w/.-])ses_[A-Za-z0-9]{1,64}(?![\w])/g,gt=10,_t=e=>e.length>12?`${e.slice(0,gt)}…`:e,vt=e=>e.replace(/[/\\]+$/,``).split(/[/\\]/).pop()||``;function yt(e,t,n=!1){if(n)return`the Concierge`;let r=t?.name?.trim().replace(/^@+/,``);if(r)return`@${r}`;let i=t?.title?.trim();if(i)return i;let a=t?.directory?vt(t.directory):``;return a?`${a} · ${_t(e)}`:_t(e)}function bt(e,t){return e.replace(ht,e=>t(e))}function xt(e,t){let n=e&&typeof e==`object`?e:{},r=e=>typeof e==`string`&&e?e:void 0;return n.kind===`session`?r(n.name)?`@${String(n.name).replace(/^@+/,``)}`:typeof n.sessionID==`string`?t(n.sessionID):`?`:n.kind===`user`?`@me`:n.kind===`app`?`app ${r(n.label)??String(n.tokenID??`?`)}`:`?`}function St(e,t,n=new Set){return We(e,n)===`@@concierge`?`@@concierge`:xt(e.from,t)}var Ct=e=>e.from.kind===`session`?e.from.sessionID:e.from.kind===`app`?e.from.tokenID:void 0;function wt(e,t,n=new Set){let r=e.action;return r?.kind===`permission`&&r.request&&typeof r.request.action==`string`?`${St(e,t,n)} asks to approve ${r.request.action}${r.always?` always`:``}`:bt(lt(e),t)}var Tt=[`approve`,`deny`,`answer`,`prompt`,`stop`,`roles`,`launch`],Et=new Set([`active`,`expired`,`revoked`]),x=e=>!!e&&typeof e==`object`&&!Array.isArray(e),S=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),C=[`sessions:read`,`sessions:manage`,`messages:send`,`messages:read`,`sessions:act`,`sessions:launch`,`events:subscribe`,`profiles:read`,`profiles:manage`,`profiles:assign`,`workspaces:read`,`workspaces:manage`,`artifacts:read`,`artifacts:write`,`artifacts:ai`,`teams:read`,`teams:manage`,`teams:submit`];function Dt(e){if(x(e)&&typeof e.id==`string`&&/^[0-9a-f]{16}$/.test(e.id)&&S(e.scopes))return{id:e.id,...typeof e.label==`string`?{label:e.label}:{},scopes:e.scopes.filter(e=>C.includes(e)),...typeof e.created==`number`?{created:e.created}:{}}}function Ot(e){return(x(e)&&Array.isArray(e.tokens)?e.tokens:[]).map(Dt).filter(e=>!!e)}function kt(e,t){let n=e.trim();if(!n)return{ok:!1,error:`Give the token a label`};if(!t.length)return{ok:!1,error:`Pick at least one scope`};let r=t.find(e=>!C.includes(e));return r?{ok:!1,error:`Unknown scope: ${r}`}:{ok:!0,body:{label:n,scopes:[...new Set(t)]}}}var At={"sessions:read":`Read your sessions and their activity`,"sessions:manage":`Name sessions and claim roles`,"messages:send":`Send messages and asks, reply and decline`,"messages:read":`Read messages to it`,"sessions:act":`Approve, deny, answer, prompt and stop sessions (only under a grant)`,"sessions:launch":`Launch sessions (only under a grant with verb launch for the repo)`,"events:subscribe":`Subscribe webhooks to events`,"profiles:read":`Read your shared agent profiles (instructions, skills, commands)`,"profiles:manage":`Create, revise and archive your agent profiles`,"profiles:assign":`Pin agent profiles to sessions (also needs a prompt grant on the session)`,"workspaces:read":`Read your workspaces, their members, supervision and boards`,"workspaces:manage":`Create, edit and archive workspaces; add members, supervise, start side chats`,"artifacts:read":`Read your artifacts and their revisions (including workspace-shared ones)`,"artifacts:write":`Create and revise artifacts, and accept AI edits the app requested`,"artifacts:ai":`Ask AI about artifacts and request edits or actions (run by sessions it may already use)`,"teams:read":`Read your teams, their roles, roster and intake`,"teams:manage":`Create, edit, publish, staff, pause and archive teams`,"teams:submit":`Submit work to a team's intake`},jt=e=>C.includes(e);function Mt(e){let t=x(e)?e.login:void 0;if(x(t)&&typeof t.userCode==`string`&&typeof t.clientName==`string`&&S(t.scopes)&&typeof t.created==`number`&&typeof t.expiresAt==`number`)return{userCode:t.userCode,clientName:t.clientName,scopes:t.scopes.filter(jt),created:t.created,expiresAt:t.expiresAt}}function Nt(e){return C.map(t=>{let n=e.scopes.includes(t);return{scope:t,label:At[t],requested:n,checked:n}})}function Pt(e){if(!e.length)return{ok:!1,error:`Pick at least one scope`};let t=e.find(e=>!jt(e));return t?{ok:!1,error:`Unknown scope: ${t}`}:{ok:!0,body:{scopes:[...new Set(e)]}}}function Ft(e){if(!x(e))return;let{id:t,holder:n,scope:r,allow:i,permissions:a,allowAlways:o,maxActionsPerHour:s,created:c,expiresAt:l,state:u}=e;if(typeof t==`string`&&typeof n==`string`&&typeof u==`string`&&Et.has(u)&&x(r)&&S(r.projects)&&S(i)&&x(a)&&S(a.allow)&&S(a.never)&&typeof o==`boolean`&&typeof s==`number`&&typeof c==`number`&&typeof l==`number`)return e}function It(e){return(x(e)&&Array.isArray(e.grants)?e.grants:[]).map(Ft).filter(e=>!!e)}function Lt(e,t){return e.state===`revoked`||e.revokedAt!==void 0?`revoked`:e.state===`expired`||t>=e.expiresAt?`expired`:`active`}var Rt={active:`Active`,expired:`Expired`,revoked:`Revoked`};function zt(e,t){if(e<=t)return``;let n=Math.ceil((e-t)/6e4),r=Math.floor(n/1440),i=Math.floor(n%1440/60),a=n%60;return r>=2?`${Math.round(n/1440)} d`:r===1?i?`1 d ${i} h`:`1 d`:i?a?`${i} h ${a} min`:`${i} h`:`${a} min`}function Bt(e,t){let n=Lt(e,t);return{id:e.id,holder:e.holderSessionID?`${e.holder} (${e.holderSessionID})`:e.holder,state:n,stateLabel:Rt[n],projects:e.scope.projects.join(`, `),verbs:e.allow.join(`, `),permit:e.permissions.allow.join(`, `),never:e.permissions.never.join(`, `),limits:[e.allowAlways?`may allow always`:``,`${e.maxActionsPerHour} actions an hour`].filter(Boolean).join(` · `),expiry:n===`active`?`Expires in ${zt(e.expiresAt,t)}`:Rt[n],editable:n===`active`}}function Vt(e){return{holder:e?.holder??``,projects:e?e.scope.projects.join(`
|
|
5
|
+
`):``,allow:e?[...e.allow]:[],permit:e?e.permissions.allow.join(`
|
|
6
|
+
`):``,never:e?e.permissions.never.join(`
|
|
7
|
+
`):``,expires:`8h`,maxActionsPerHour:String(e?.maxActionsPerHour??60),allowAlways:e?.allowAlways??!1}}var Ht=e=>e.split(`
|
|
8
|
+
`).map(e=>e.trim()).filter(Boolean),Ut=/^\d+(s|m|h|d)?$/,Wt=e=>/^([A-Za-z]:)?[\\/]/.test(e);function Gt(e){let t={},n=e.holder.trim();n||(t.holder=`Who holds it: @@orchestrator, @name, ses_… or app:<token id>`);let r=Ht(e.projects),i=r.find(e=>!Wt(e));r.length?i!==void 0&&(t.projects=`${i} is not an absolute directory`):t.projects=`At least one project directory`;let a=Tt.filter(t=>e.allow.includes(t));a.length||(t.allow=`Pick at least one action`);let o=e.expires.trim();Ut.test(o)||(t.expires=`A duration: seconds, or 30m, 8h, 2d`);let s=e.maxActionsPerHour.trim(),c=/^\d+$/.test(s)?Number(s):NaN;return c>=1&&c<=1e3||(t.maxActionsPerHour=`A whole number from 1 to 1000`),Object.keys(t).length?{ok:!1,errors:t}:{ok:!0,body:{holder:n,scope:{projects:r},allow:a,permissions:{allow:Ht(e.permit),never:Ht(e.never)},expires:o,maxActionsPerHour:c,allowAlways:e.allowAlways}}}function Kt(e){if(/^permissions\.never/.test(e))return`never`;if(/^permissions/.test(e))return`permit`;if(/^scope/.test(e))return`projects`;if(/^allow\b/.test(e))return`allow`;if(/^expires/.test(e))return`expires`;if(/^maxActionsPerHour/.test(e))return`maxActionsPerHour`;if(/^allowAlways/.test(e))return`allowAlways`;if(/holder|^No app token|^No session|^No such session/i.test(e))return`holder`}function qt(e){if(!x(e))return;let{seq:t,at:n,actor:r,verb:i,target:a,decision:o,outcome:s}=e;if(typeof t==`number`&&typeof n==`number`&&x(r)&&typeof r.kind==`string`&&typeof i==`string`&&x(a)&&typeof o==`string`&&typeof s==`string`)return e}function Jt(e){if(!x(e))return{entries:[]};let t=(Array.isArray(e.entries)?e.entries:[]).map(qt).filter(e=>!!e);return typeof e.next==`number`?{entries:t,next:e.next}:{entries:t}}var Yt={allow:`allowed`,needs_user:`needs you`,forbidden:`refused`,paused:`paused`,rate_limited:`rate limited`,busy:`hub busy`},Xt={ok:`done`,failed:`failed`,gone:`already answered`,offline:`offline`,unsupported:`unsupported`,escalated:`sent to you`,refused:`refused`},Zt=new Set([`forbidden`,`paused`,`rate_limited`,`busy`]),Qt=new Set([`failed`,`refused`,`offline`,`unsupported`]),$t={"acting.pause":`turned agent actions off`,"acting.resume":`turned agent actions on`},en={approve:[`approved`,`approved $`],deny:[`denied`,`denied $`],answer:[`answered`,`answered $`],prompt:[`prompted a session`,`prompted $`],stop:[`stopped a session`,`stopped $`],propose:[`proposed an action`,`proposed an action for $`],msg:[`sent a message`,`messaged $`],roles:[`claimed a role`,`claimed a role for $`],"roles.release":[`released a role`,`released a role of $`],launch:[`launched a session`,`launched $`],"launch.stop":[`stopped a launch`,`stopped the launch of $`],"team.staff":[`staffed a team role`,`staffed a team role with $`],"team.unstaff":[`unstaffed a team role`,`unstaffed $ from a team role`],"team.denied":[`sent a message the team's rules refused`,`sent $ a message the team's rules refused`],"grant.request":[`asked for a grant`,`asked for a grant for $`],"grant.approve":[`approved a grant request`,`approved a grant request from $`],"grant.deny":[`denied a grant request`,`denied a grant request from $`]},tn={deny:[`proposed denying`,`proposed denying a request in`],answer:[`proposed answering`,`proposed answering a form in`],prompt:[`proposed prompting`,`proposed a prompt to`],stop:[`proposed stopping`,`proposed stopping`]},nn=/^Decision dec_[A-Za-z0-9]{1,64}: (\w+)$/;function rn(e,t,n){let r=tn[nn.exec(e??``)?.[1]??``],i=n?` in ${n}`:``;return t?`${r?r[0]:`proposed an action on`} ${t}${i}`:n?`${r?r[1]:`proposed an action for`} ${n}`:`proposed an action`}function an(e,t,n,r){if(e===`propose`)return rn(r,t,n);let i=en[e];return i?t?`${i[0]} ${t}${n?` in ${n}`:``}`:n?i[1].replace(`$`,n):i[0]:[e.replace(/[._]+/g,` `).trim()||e,t,t&&n?`in ${n}`:n].filter(Boolean).join(` `)}var on=(e,t)=>e.as===`concierge`?`@@concierge`:e.actor.kind===`user`?`you`:t?xt(e.actor,e=>t(e)??_t(e)):Pe(e.actor);function sn(e,t){if(e.outcome!==`escalated`)return;let n=/\bDecision (dec_[A-Za-z0-9]{1,64})\b/.exec(e.reason??``)?.[1];for(let r of t)if(n?r.id===n:e.target.requestID&&r.action?.requestID===e.target.requestID)return r}function cn(e){if(e.state!==`answered`)return e.state;let t=e.answer?.option,n=e.options.find(e=>e.id===t)?.label??t;return n?`answered “${n}”`:`answered`}var ln=`Shell, outside folders and tools always need the user's tap`,un=`The Concierge never answers “always”: the user decides`,dn={approve:`Approved`,deny:`Denied`,answer:`Answered`,prompt:`Prompted`,stop:`Stopped`},fn=e=>e.replace(/\binGrant\s*=\s*yes\b/gi,`inside your grant`).replace(/\binGrant\s*=\s*no\b/gi,`outside your grant`).replace(/\bauto\s*=\s*yes\b/gi,`approvable without you`).replace(/\bauto\s*=\s*no\b/gi,`needs your tap`).replace(/\bdec_[A-Za-z0-9]{1,64}\b/g,`a Decision`),pn=/[\u061c\u200b-\u200f\u2028-\u202e\u2060-\u206f\ufeff\u{E0000}-\u{E007F}]/gu,mn=300;function hn(e){let t=fn(e).replace(pn,``).replace(/«/g,`‹`).replace(/»/g,`›`).replace(/[\u0000-\u001f\u007f-\u009f]/g,` `).replace(/\s+/g,` `).trim(),n=Array.from(t);return`«${n.length>mn?`${n.slice(0,299).join(``)}…`:t}»`}function gn(e){let t=e.reason??``;if(e.decision===`busy`)return`Refused: the hub was busy (its state did not answer in time); try again`;if(e.reason===`concierge inbound rule`)return`Refused: only you can message the Concierge`;if(e.actor.kind===`user`&&/^Decision dec_[A-Za-z0-9]{1,64} proposed by @@concierge$/.test(t))return`You said yes to the Concierge's proposal`;if(e.as!==`concierge`)return t;if(t===`concierge outbound rule`)return`Refused: the Concierge may message only you`;if(e.verb===`propose`)return`The Concierge proposed this for your answer`;if(t===ln)return`Needed your tap: shell commands, outside folders and tools always do`;if(t===un)return`Needed your tap: the Concierge never answers “always”`;if(e.decision===`needs_user`)return t?`Needed you: ${fn(t).replace(/ outside the grant\b/,` outside the Concierge's grant`)}`:`Needed you`;let n=dn[e.verb];return n&&e.decision===`allow`&&e.outcome===`ok`?`${n} by the Concierge inside your grant${t?`. Its note: ${hn(t)}`:``}`:fn(t)}function _n(e,t,n){let r=e.target.requestID??e.target.formID,i=e.target.requestID?`a permission request`:e.target.formID?`a form`:void 0,a=e.target.sessionID,o=a?n?.(a)??_t(a):``,s=$t[e.verb]??an(e.verb,i,o,e.reason),c=$t[e.verb]?void 0:[r,r&&a?`in ${a}`:a].filter(Boolean).join(` `)||void 0,l=Yt[e.decision]??e.decision,u=Xt[e.outcome]??e.outcome,d=e.decision===`allow`&&e.outcome===`ok`,f=t&&t.state!==`open`?`${u} · ${cn(t)}`:void 0;return{seq:e.seq,at:e.at,who:on(e,n??(()=>void 0)),what:s,...c?{whatTitle:c}:{},result:d?`done`:f??(l===u?l:`${l} · ${u}`),tone:d||t?.state===`answered`?`ok`:Zt.has(e.decision)||Qt.has(e.outcome)?`err`:`warn`,grant:e.grant?`grant`:``,...e.grant?{grantTitle:e.grant}:{},reason:gn(e)}}var vn={approve:`Approved`,deny:`Denied`,answer:`Answered`},yn=3,bn=3,xn=e=>e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e;function Sn(e,t,n){let r=n?.(e);if(t.as===`concierge`||r?.holder===`@@concierge`)return`the Concierge's grant`;let i=r?.scope.projects.map(xn)??[];if(!i.length)return`your grant`;let a=i.slice(0,bn).join(`, `);return`your grant for ${i.length>bn?`${a} and ${i.length-bn} more`:a}`}function Cn(e,t,n){let r=vn[e.verb];if(!r||e.decision!==`allow`||e.outcome!==`ok`)return;let i=`${r} by ${on(e,t)}`;return e.grant?{text:`${i} · ${Sn(e.grant,e,n)}`,title:e.grant}:{text:i}}function wn(e,t,n){return Cn(e,t,n)?.text}function Tn(e,t){return[t,...e.filter(e=>e.seq!==t.seq)].sort((e,t)=>t.seq-e.seq).slice(0,100)}function En(e,t,n,r){for(let i of e){if(i.target.requestID!==t&&i.target.formID!==t)continue;let e=Cn(i,n,r);if(e)return e}}function Dn(e,t,n,r,i,a,o){let s=[];for(let c of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(s.length>=yn)break;if(!c.target.sessionID||!t.has(c.target.sessionID)||n-c.at>6e5||r!==void 0&&c.at<r)continue;let e=Cn(c,a,o),l=c.target.requestID??c.target.formID??`seq-${c.seq}`;e&&!i?.has(l)&&!s.some(e=>e.key===l)&&s.push({key:l,...e,at:c.at})}return s}function On(e,t,n,r=6e4,i){for(let a of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(n-a.at>r)break;if(a.verb!==`deny`||!a.target.sessionID||!t.has(a.target.sessionID))continue;let e=wn(a,void 0,i);if(e)return{key:a.target.requestID??a.target.formID??`seq-${a.seq}`,text:e}}}function kn(e,t,n,r){let{since:i,until:a}=n,o;for(let n of e){if(n.verb!==`deny`||n.target.sessionID!==t||i!==void 0&&n.at<i||a!==void 0&&n.at>=a)continue;let e=wn(n,void 0,r);e&&(!o||(i===void 0?n.at>o.e.at||n.at===o.e.at&&n.seq>o.e.seq:n.at<o.e.at||n.at===o.e.at&&n.seq<o.e.seq))&&(o={e:n,text:e})}return o&&{key:o.e.target.requestID??o.e.target.formID??`seq-${o.e.seq}`,text:o.text}}function An(e,t){return e.filter(e=>e.denial===void 0||!t.has(e.denial))}function jn(e){let t=e.enabled!==!1,n=e.hubEnabled!==!1;return{on:t,hubOn:n,note:n?t?``:`Agents cannot act for you (approve, deny, answer, prompt, stop, launch). Reading and messaging still work.`:`An admin turned agent actions off for the whole hub: no agent can approve, deny, answer, prompt, stop or launch until it is on again.`}}var Mn=/^(.*?) asks to approve( always(?: \(saves .*?\))?)? (.*?)\. Outside its grant: (.*)$/s,Nn=`a permission request (details unknown)`;function Pn(e){if(e.action?.kind!==`permission`)return;let t={requester:We(e),always:e.action.always===!0,...e.action.requestID?{requestID:e.action.requestID}:{}},n=Mn.exec(e.question);if(!n)return{...t,action:void 0,resources:[],reason:void 0};let r=n[3],i=r.indexOf(`: `),a=r!==Nn;return{...t,always:t.always||!!n[2],action:a?i<0?r:r.slice(0,i):void 0,resources:a&&i>=0?r.slice(i+2).split(`, `).filter(Boolean):[],reason:n[4].trim()||void 0}}function Fn(e,t){return!x(e)||typeof e.by!=`string`||e.recommends!==`approve`?``:`${t?bt(e.by,t):e.by} recommends Approve${typeof e.why==`string`&&e.why?`: ${e.why}`:``}`}var In=Symbol(`store-raw`),w=Symbol(`store-node`),T=Symbol(`store-has`),Ln=Symbol(`store-self`);function Rn(e){let t=e[g];if(!t&&(Object.defineProperty(e,g,{value:t=new Proxy(e,Wn)}),!Array.isArray(e))){let n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e),i=Object.getPrototypeOf(e),a=i!==null&&typeof e==`object`&&!!e&&!Array.isArray(e)&&i!==Object.prototype;if(a){let e=Object.getOwnPropertyDescriptors(i);n.push(...Object.keys(e)),Object.assign(r,e)}for(let i=0,o=n.length;i<o;i++){let o=n[i];a&&o===`constructor`||r[o].get&&Object.defineProperty(e,o,{configurable:!0,enumerable:r[o].enumerable,get:r[o].get.bind(t)})}}return t}function E(e){let t;return typeof e==`object`&&!!e&&(e[g]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function D(e,t=new Set){let n,r,i,a;if(n=e!=null&&e[In])return n;if(!E(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let n=0,a=e.length;n<a;n++)i=e[n],(r=D(i,t))!==i&&(e[n]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);let n=Object.keys(e),o=Object.getOwnPropertyDescriptors(e);for(let s=0,c=n.length;s<c;s++)a=n[s],!o[a].get&&(i=e[a],(r=D(i,t))!==i&&(e[a]=r))}return e}function zn(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function Bn(e,t,n){if(e[t])return e[t];let[r,a]=i(n,{equals:!1,internal:!0});return r.$=a,e[t]=r}function Vn(e,t){let n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===g||t===w||(delete n.value,delete n.writable,n.get=()=>e[g][t]),n}function Hn(e){te()&&Bn(zn(e,w),Ln)()}function Un(e){return Hn(e),Reflect.ownKeys(e)}var Wn={get(e,t,n){if(t===In)return e;if(t===g)return n;if(t===s)return Hn(e),n;let r=zn(e,w),i=r[t],a=i?i():e[t];if(t===w||t===T||t===`__proto__`)return a;if(!i){let n=Object.getOwnPropertyDescriptor(e,t);te()&&(typeof a!=`function`||Object.prototype.hasOwnProperty.call(e,t))&&!(n&&n.get)&&(a=Bn(r,t,a)())}return E(a)?Rn(a):a},has(e,t){return t===In||t===g||t===s||t===w||t===T||t===`__proto__`||(te()&&Bn(zn(e,T),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:Un,getOwnPropertyDescriptor:Vn};function O(e,t,n,r=!1){if(t===`__proto__`||!r&&e[t]===n)return;let i=e[t],a=e.length;n===void 0?(delete e[t],e[T]&&e[T][t]&&i!==void 0&&e[T][t].$()):(e[t]=n,e[T]&&e[T][t]&&i===void 0&&e[T][t].$());let o=zn(e,w),s;if((s=Bn(o,t,i))&&s.$(()=>n),Array.isArray(e)&&e.length!==a){for(let t=e.length;t<a;t++)(s=o[t])&&s.$();(s=Bn(o,`length`,a))&&s.$(e.length)}(s=o[Ln])&&s.$()}function Gn(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r+=1){let i=n[r];Kn(i)||O(e,i,t[i])}}function Kn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function qn(e,t){if(typeof t==`function`&&(t=t(e)),t=D(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){let r=t[n];e[n]!==r&&O(e,n,r)}O(e,`length`,r)}else Gn(e,t)}function Jn(e,t,n=[]){let r,i=e;if(t.length>1){r=t.shift();let a=typeof r,o=Array.isArray(e);if(a===`string`&&(r===`__proto__`||t.length>1&&Kn(r)))return;if(Array.isArray(r)){for(let i=0;i<r.length;i++)Jn(e,[r[i]].concat(t),n);return}if(o&&a===`function`){for(let i=0;i<e.length;i++)r(e[i],i)&&Jn(e,[i].concat(t),n);return}if(o&&a===`object`){let{from:i=0,to:a=e.length-1,by:o=1}=r;for(let r=i;r<=a;r+=o)Jn(e,[r].concat(t),n);return}if(t.length>1){Jn(e[r],t,[r].concat(n));return}i=e[r],n=[r].concat(n)}let a=t[0];typeof a==`function`&&(a=a(i,n),a===i)||(r!==void 0||a!=null)&&(a=D(a),r===void 0||E(i)&&E(a)&&!Array.isArray(a)?Gn(i,a):O(e,r,a))}function Yn(...[e,t]){let n=D(e||{}),r=Array.isArray(n),i=Rn(n);function a(...e){d(()=>{r&&e.length===1?qn(n,e[0]):Jn(n,e)})}return[i,a]}var Xn=Symbol(`store-root`);function Zn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function k(e,t,n,r,i){if(Zn(n))return;let a=t[n];if(e===a)return;let o=Array.isArray(e);if(n!==Xn&&(!E(e)||!E(a)||o!==Array.isArray(a)||i&&e[i]!==a[i])){O(t,n,e);return}if(o){if(e.length&&a.length&&(!r||i&&e[0]&&e[0][i]!=null)){let t,n,o,s,c,l,u,d;for(o=0,s=Math.min(a.length,e.length);o<s&&(a[o]===e[o]||i&&a[o]&&e[o]&&a[o][i]&&a[o][i]===e[o][i]);o++)k(e[o],a,o,r,i);let f=Array(e.length),p=new Map;for(s=a.length-1,c=e.length-1;s>=o&&c>=o&&(a[s]===e[c]||i&&a[s]&&e[c]&&a[s][i]&&a[s][i]===e[c][i]);s--,c--)f[c]=a[s];if(o>c||o>s){for(n=o;n<=c;n++)O(a,n,e[n]);for(;n<e.length;n++)O(a,n,f[n]),k(e[n],a,n,r,i);a.length>e.length&&O(a,`length`,e.length);return}for(u=Array(c+1),n=c;n>=o;n--)l=e[n],d=i&&l?l[i]:l,t=p.get(d),u[n]=t===void 0?-1:t,p.set(d,n);for(t=o;t<=s;t++)l=a[t],d=i&&l?l[i]:l,n=p.get(d),n!==void 0&&n!==-1&&(f[n]=a[t],n=u[n],p.set(d,n));for(n=o;n<e.length;n++)n in f?(O(a,n,f[n]),k(e[n],a,n,r,i)):O(a,n,e[n])}else for(let t=0,n=e.length;t<n;t++)k(e[t],a,t,r,i);a.length>e.length&&O(a,`length`,e.length);return}let s=Object.keys(e);for(let t=0,n=s.length;t<n;t++)Zn(s[t])||k(e[s[t]],a,s[t],r,i);let c=Object.keys(a);for(let t=0,n=c.length;t<n;t++)e[c[t]]===void 0&&O(a,c[t],void 0)}function Qn(e,t={}){let{merge:n,key:r=`id`}=t,i=D(e);return e=>{if(!E(e)||!E(i))return i;let t=k(i,{[Xn]:e},Xn,n,r);return t===void 0?e:t}}var $n=new WeakMap,er={get(e,t){if(t===In)return e;let n=e[t];if(t===g||t===s||t===w||t===T||t===`__proto__`)return n;let r;return E(n)?$n.get(n)||($n.set(n,r=new Proxy(n,er)),r):n},set(e,t,n){return O(e,t,D(n)),!0},deleteProperty(e,t){return O(e,t,void 0,!0),!0}};function A(e){return t=>{if(E(t)){let n;(n=$n.get(t))||$n.set(t,n=new Proxy(t,er)),e(n)}return t}}var j={blocked:0,working:1,error:2,idle:3},tr=e=>j[e]??3,nr=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`);function rr(e){let t=Array.isArray(e?.status)?e.status:[];return t.length?t.some(e=>e.state===`blocked`)?`blocked`:t[0]?.state===`error`?`error`:t.some(e=>e.state===`working`)?`working`:`idle`:e?.blockers?.length?`blocked`:e?.state!==void 0&&e.state in j?e.state:`idle`}function ir(e){let t=Array.isArray(e?.status)?e.status:[];return(t.length?t:[{id:e?.id,title:e?.title,blockers:e?.blockers}]).flatMap(e=>(e.blockers??[]).map(t=>({...t,sessionID:e.id,sessionTitle:e.title})))}function ar(e){let t=`idle`;for(let n of e)tr(n)<j[t]&&(t=n);return t}function or(e){if(!e)return;if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}function sr(e){return String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase()}var cr=e=>sr(e).split(/\s+/).filter(Boolean);function lr(e,t){let n=cr(t);if(!n.length)return!0;let r=[e.title||`Untitled`,e.projectName,e.project,e.directory].filter(Boolean).map(sr);return n.every(e=>r.some(t=>t.includes(e)))}function ur(e,t){let n=nr(e),r=nr(t);return n===r?``:n.startsWith(`${r}/`)?n.slice(r.length+1):n}var M=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`),dr=e=>M(e).split(/[\\/]/).pop()||String(e??``),fr=[`hiddenSessions`,`hiddenWorkspaces`,`pinnedSessions`,`pinnedWorkspaces`],pr=500,mr=5e3,hr=4096,gr=e=>e===`hiddenSessions`?mr:pr,_r=(e,t=pr)=>{if(!Array.isArray(e))return[];let n=[...new Set(e.filter(e=>typeof e==`string`&&e.length>0&&e.length<=hr))];return n.length>t?n.slice(n.length-t):n};function vr(e){let t=e,n=t&&typeof t==`object`&&t.prefs&&typeof t.prefs==`object`?t.prefs:e??{};return Object.fromEntries(fr.map(e=>[e,_r(n[e],gr(e))]))}function yr(e){let t=e.trim();return t?t.length>200?{error:`Title is longer than 200 characters`}:{title:t}:{error:`Enter a title`}}function br(e,t,n){let r;for(let i of e??[])for(let e of i.processes)for(let i of e.sessions)if(i.id===t){r??=i.title??``,i.title=n;for(let e of i.status??[])e.id===t&&(e.title=n)}return r}var xr=class{graceMs;pending=new Map;constructor(e=5e3){this.graceMs=e}set(e,t,n){this.pending.set(e,{title:t,at:n})}has(e){return this.pending.has(e)}drop(e,t){this.pending.get(e)?.title===t&&this.pending.delete(e)}apply(e,t){for(let[n,{title:r,at:i}]of[...this.pending]){let a=Sr(e,n);a===r||t-i>this.graceMs?this.pending.delete(n):a!==void 0&&br(e,n,r)}}},Sr=(e,t)=>{for(let n of e??[])for(let e of n.processes)for(let n of e.sessions)if(n.id===t)return n.title??``};function Cr(e,t,n,r){if(!fr.includes(t))throw Error(`unknown prefs list: ${t}`);let i=e[t]??[],a=new Set(i),o=new Set(n.filter(e=>a.has(e)!==r));if(!o.size)return{prefs:e,patch:void 0};let s=r?_r([...i,...o],gr(t)):i.filter(e=>!o.has(e));return{prefs:{...e,[t]:s},patch:{[t]:s}}}var wr=e=>{try{let t=JSON.parse(e??`null`);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}};function Tr(e,t,n){let r=e!=null||t!=null,i={};for(let[r,a]of[[`pinnedSessions`,e],[`pinnedWorkspaces`,t]]){let e=n[r]??[],t=wr(a).filter(t=>!e.includes(t));t.length&&(i[r]=_r([...e,...t]))}return{clear:r,patch:Object.keys(i).length?i:void 0}}var Er={working:`working`,blocked:`blocked`};function Dr(e){let t=rr(e);return ar([t,e?.terminal?.status===`blocked`&&t!==`blocked`?`working`:Er[e?.terminal?.status??``]??`idle`])}function Or(e){return e?.terminal?.status===`blocked`&&rr(e)!==`blocked`}var kr=e=>!!e?.open&&e.terminal?.source===`herdr`&&!!e.terminal.workspaceID,Ar=e=>M(e?.project||e?.directory);function jr(e){return kr(e)?`herdr:${e.terminal.workspaceID}`:Ar(e)}var Mr=(e,t)=>Ar(e)===t||M(e.directory)===t||kr(e)&&jr(e)===t;function Nr(e,t){if(t.sessions.has(e.id))return!0;for(let n of t.workspaces)if(Mr(e,n))return!0;return!1}function Pr(e,t){let n=(t.updated??0)>(e.updated??0)?t:e,r=e.open?e:t.open?t:void 0;return{...n,conversation:!!(e.conversation||t.conversation),busy:!!(e.busy||t.busy),...r?{open:!0,terminal:r.terminal}:{}}}function Fr(e){let t=e?.processes??[],n=new Set(t.flatMap(e=>e.sessions.map(e=>e.id))),r=new Map;for(let e of t)for(let t of e.sessions){if(t.parentID&&n.has(t.parentID))continue;let e=r.get(t.id);r.set(t.id,e?Pr(e,t):t)}return[...r.values()]}function Ir(e){let t=Lr(e);return e=>Nr(e,t)}var Lr=e=>({sessions:new Set(e?.hiddenSessions??[]),workspaces:new Set(e?.hiddenWorkspaces??[])}),Rr=e=>e?.terminals?.herdr?.workspaces??[];function zr(e){let t=M(e.project||e.directory),n=e.project?ur(e.directory,t):``;return`${e.projectName||dr(t)}${n?` › ${n}`:``}`}function Br(e,t,n){let r=zr(t),i=n?.trim()||void 0;return{machine:e,where:r,...i?{branch:i}:{},text:[e,r,i].filter(Boolean).join(` · `)}}function Vr(e,t,n){let r=kr(e)?e.terminal.workspace||Rr(t).find(t=>t.id===e.terminal.workspaceID)?.label||e.terminal.workspaceID:void 0;return{...e,title:e.title||e.terminal?.title||`Untitled`,updated:e.updated??0,state:Dr(e),waitingInTerminal:Or(e),blockers:ir(e),exposed:e.exposed!==!1,pinned:n.has(e.id),nowText:or(e.now),where:zr(e),workspace:r??(e.projectName||dr(Ar(e))),machineID:t?.id}}var Hr=50,Ur=200;function Wr(e){let t=Rr(e).map(e=>({kind:`herdr`,key:`herdr:${e.id}`,workspaceID:e.id,label:e.label||e.id,directories:[...e.directories??[]]})),n=new Set(t.flatMap(e=>e.directories.map(M))),r=Fr(e),i=new Map,a=new Map;for(let e of r){let t=M(e.directory);t&&(i.set(t,Math.max(i.get(t)??0,e.updated??0)),a.set(t,zr(e)))}for(let e of r){let t=M(e.project);if(!t||a.has(t))continue;let n=Math.max(...r.filter(e=>M(e.project)===t).map(e=>e.updated??0));i.set(t,n),a.set(t,e.projectName||dr(t))}let o=[...i.entries()].filter(([e])=>!n.has(e)).sort((e,t)=>t[1]-e[1]).slice(0,Hr).map(([e])=>({kind:`folder`,key:e,label:a.get(e)??dr(e),directories:[e]}));return{herdr:!!e?.terminals?.herdr,targets:[...t,...o]}}function Gr({target:e,directory:t,title:n,openInHerdr:r}){let i={directory:t},a=String(n??``).trim().slice(0,Ur);return a&&(i.title=a),r&&e?.kind===`herdr`&&e.workspaceID&&(i.herdrWorkspace=e.workspaceID),i}function Kr(e){if(typeof e==`string`&&e)return e.includes(`budget`)?`Quota exceeded`:qr[e]}var qr={"provider.quota":`Quota exceeded`,"provider.free-limit":`Quota exceeded`,"provider.auth":`Authentication failed`,"provider.rate-limit":`Rate limited`,"provider.internal":`Provider unavailable`,"provider.transport":`Provider unavailable`,"provider.timeout":`Provider unavailable`,"provider.content-filter":`Blocked by content filter`,"provider.no-route":`No route to model`,"provider.invalid-request":`Invalid request`,"provider.invalid-output":`Invalid model output`,"provider.unsupported-operation":`Unsupported operation`,"tool.execution":`Tool failed`,"permission.rejected":`Permission rejected`};function Jr(e){return typeof e==`number`&&Number.isInteger(e)&&e>=100&&e<=999?`HTTP ${e}`:void 0}function Yr(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<=t)return;let n=Math.ceil((e-t)/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m ${n%60}s`:`${Math.floor(r/60)}h ${r%60}m`}var Xr=e=>typeof e==`string`&&e.trim()?e.trim():void 0,Zr=(e,t)=>e.toLowerCase()===t.toLowerCase(),Qr=(e,t)=>e&&t&&!Zr(e,t)?t:void 0;function $r(e){let t=Kr(e.errorType),n=Xr(e.message),r=Jr(e.errorStatus),i=Qr(t,n);return`${t??n??`Error`}${r?` (${r})`:``}${i?`: ${i}`:``}`}function ei(e,t){let n=typeof e.attempt==`number`?` (attempt ${e.attempt})`:``,r=Yr(e.next,t),i=Kr(e.errorType),a=Xr(e.message),o=Qr(i,a),s=i?o?`${i} — ${o}`:i:a;return`Retrying${n}${r?` · next in ${r}`:``}${s?`: ${s}`:``}`}var ti=e=>!!e&&typeof e==`object`&&typeof e.id==`string`;function ni(e,t){let n=Array.isArray(e)?e.filter(ti):[],r=t?n.find(e=>e.id===t):n[0];if(!r)return;if(r.state===`error`)return ri(r);if(r.state===`working`||r.state===`blocked`)return;let i=new Set([r.id]);for(let e=!0;e;){e=!1;for(let t of n)t.parentID&&i.has(t.parentID)&&!i.has(t.id)&&(i.add(t.id),e=!0)}let a=n.find(e=>e.id!==r.id&&i.has(e.id)&&e.state===`error`);return a?ri(a):void 0}function ri(e){let t=Xr(e.detail),n=Jr(e.errorStatus),r=Xr(e.title);return{sessionID:e.id,...r?{title:r}:{},label:Kr(e.errorType)??t??`Error`,...t?{message:t}:{},...n?{status:n}:{},text:$r({errorType:e.errorType,errorStatus:e.errorStatus,message:t})}}var ii=e=>Array.isArray(e)?e:[];function ai(e){return ii(e).flatMap(e=>(Array.isArray(e.jobs)?e.jobs:[]).map(t=>({...t,sessionID:e.id,sessionTitle:e.title??``})))}function oi(e){return ai(e).filter(e=>e.status===`running`).length}function si(e,t){let n=ai(e),r=n.filter(e=>e.status===`running`).sort((e,t)=>(e.started??0)-(t.started??0)),i=n.filter(e=>e.status!==`running`&&e.ended!==void 0&&t-e.ended<=6e4).sort((e,t)=>(t.ended??0)-(e.ended??0));return[...r,...i]}function ci(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}function li(e,t){if(e.status===`running`)return e.started===void 0?`running`:`running · ${ci(t-e.started)}`;let n=e.status===`killed`?`killed`:e.status===`timeout`?`timed out`:void 0,r=e.exit===void 0?void 0:`exit ${e.exit}`,i=e.started!==void 0&&e.ended!==void 0?ci(e.ended-e.started):void 0;return n?[n,r].filter(Boolean).join(` · `):[r??`ended`,i].filter(Boolean).join(` · `)}function ui(e){return e<=0?``:`${e} job${e===1?``:`s`}`}function di(e,t,n=Date.now()){let r=ii(e),i=(t?r.find(e=>e.id===t&&e.retry):void 0)??r.find(e=>e.retry);return i?.retry?ei(i.retry,n):void 0}function fi(e,t,n,r=new Set){let i=new Set(t.pinnedSessions),a=new Set(t.hiddenSessions),o=Ir(t),s=[];for(let t of e??[])for(let e of Fr(t)){if(r.has(e.id))continue;let c=Vr(e,t,i),l=c.open?c.terminal?.source===`herdr`?`herdr`:`tui`:`background`,u=n[c.id],d=c.state===`working`?di(e.status,void 0,1/0):void 0,f=c.state===`error`?ni(e.status,c.id)?.text??`Error`:void 0;s.push({...c,machineName:t.name,machineOnline:!!t.online,source:l,running:c.state===`working`||c.state===`blocked`,hidden:o(e),archived:a.has(c.id),unread:u!==void 0&&c.updated>u,group:jr(e),jobs:oi(e.status),...d?{retry:d}:{},...f?{error:f}:{}})}return s.sort((e,t)=>t.updated-e.updated)}function pi(e,t){if(!e?.length)return t;let n=new Map(e.map(e=>[e.id,e]));return t.map(e=>{let t=n.get(e.id);return t&&JSON.stringify(t)===JSON.stringify(e)?t:e})}var N=Object.freeze({query:``,filters:Object.freeze({status:`all`,source:`all`,machine:``,archived:!1}),sort:Object.freeze({key:`activity`,dir:`desc`})}),mi=[`status`,`title`,`project`,`server`,`source`,`activity`],hi=[`all`,`needs`,`running`,`idle`],gi=[`all`,`open`,`background`],P=(e,t)=>e.localeCompare(t,void 0,{sensitivity:`base`}),F=(e,t)=>t.updated-e.updated,_i={status:(e,t)=>j[e.state]-j[t.state]||F(e,t),title:(e,t)=>P(e.title,t.title)||F(e,t),project:(e,t)=>P(e.workspace,t.workspace)||F(e,t),server:(e,t)=>P(e.machineName,t.machineName)||F(e,t),source:(e,t)=>P(e.source,t.source)||F(e,t),activity:(e,t)=>e.updated-t.updated};function vi(e,t){let n=t.status===`needs`&&e.state===`blocked`;return!((t.archived?!e.hidden:e.hidden&&!n)||t.status===`needs`&&!wi(e)||t.status===`running`&&!e.running||t.status===`idle`&&e.running||t.source===`open`&&e.source===`background`||t.source===`background`&&e.source!==`background`||t.machine&&e.machineID!==t.machine)}function yi(e,t){if(!t.trim()||lr(e,t))return!0;let n=sr(t).split(/\s+/).filter(Boolean),r=[e.title,e.workspace,e.where,e.directory,e.machineName].map(sr);return n.every(e=>r.some(t=>t.includes(e)))}function bi(e,t){let n=_i[t.sort.key],r=t.sort.key===`activity`?t.sort.dir===`desc`?-1:1:t.sort.dir===`asc`?1:-1;return e.filter(e=>vi(e,t.filters)&&yi(e,t.query)).sort((e,t)=>r*n(e,t))}var xi=(e,t,n)=>t.includes(e)?e:n;function Si(e){let t;try{if(t=JSON.parse(e??`null`)??{},typeof t!=`object`||Array.isArray(t))return N}catch{return N}let n=t.filters??{},r=t.sort??{},i=N,a=xi(r.key,mi,i.sort.key),o=a===r.key?xi(r.dir,[`asc`,`desc`],i.sort.dir):i.sort.dir,s=a===i.sort.key&&o===i.sort.dir?i.sort:{key:a,dir:o},c={status:xi(n.status,hi,i.filters.status),source:xi(n.source,gi,i.filters.source),machine:typeof n.machine==`string`&&n.machine.length<=200?n.machine:``,archived:n.archived===!0||n.hidden===!0},l=Object.keys(c).every(e=>c[e]===i.filters[e]);return l&&s===i.sort?N:{query:``,filters:l?i.filters:c,sort:s}}function Ci(e){return JSON.stringify({filters:e.filters,sort:e.sort})}var wi=e=>e.state===`blocked`||e.state===`error`&&!e.hidden;function Ti(e,{query:t,groupBy:n,sortBy:r,recentLimit:i=20}){let a=e.filter(e=>!e.hidden),o=e.filter(wi),s=r===`title`?(e,t)=>P(e.title,t.title)||F(e,t):F;if(t.trim())return[{id:`results`,title:`Results`,kind:`results`,rows:a.filter(e=>yi(e,t)).sort(F)}];let c=new Set,l=e=>{for(let t of e)c.add(t.id);return e},u=[],d=e=>e.rows.length&&u.push(e);d({id:`needs`,title:`Needs you`,kind:`needs`,rows:l(o.sort(F))}),d({id:`running`,title:`Running`,kind:`running`,rows:l(a.filter(e=>!c.has(e.id)&&e.running).sort(F))}),d({id:`pinned`,title:`Pinned`,kind:`pinned`,rows:l(a.filter(e=>!c.has(e.id)&&e.pinned).sort(s))});let f=new Map;for(let e of a){if(c.has(e.id)||!e.open)continue;let t=n===`machine`?e.machineID:`${e.machineID}\u0000${e.group}`,r=f.get(t);r||(r={title:n===`machine`?e.machineName:e.workspace,key:n===`machine`?e.machineID:e.group,machineID:e.machineID,directory:e.directory,rows:[]},f.set(t,r)),r.rows.push(e)}let p=e=>Math.max(...e.map(e=>e.updated)),m=[...f.values()].sort((e,t)=>r===`title`&&P(e.title,t.title)||p(t.rows)-p(e.rows));for(let e of m){e.rows.sort(s),l(e.rows);let t=[...e.rows].sort(F);d({id:`group:${e.machineID}:${e.key}`,title:e.title,kind:`group`,key:e.key,machineID:e.machineID,directory:t[0].directory,rows:e.rows})}return d({id:`recents`,title:`Recents`,kind:`recents`,rows:a.filter(e=>!c.has(e.id)).sort(F).slice(0,i)}),u}var Ei=864e5;function Di(e,t,n){if(!Number.isInteger(t)||t<1)return[];let r=n-t*Ei;return e.filter(e=>!e.hidden&&!e.running&&!e.pinned&&!e.open&&e.updated<r)}function Oi(e,t){return t.phase!==`off`&&t.sessionID===e.id||e.conversation===!0}function ki(e,t,n,r){let i=`${e} of ${t} sessions`;return!r||!n?i:`${i} · ${n===1?`1 Decision waits`:`${n} Decisions wait`} for you (above)`}var Ai=.75,ji=.05;function Mi(e){let t=typeof e==`string`?e.trim()?Number(e):NaN:Number(e??NaN);if(!Number.isFinite(t))return 1;let n=Math.round(t/ji)/Math.round(1/ji);return Math.min(2,Math.max(Ai,Number(n.toFixed(2))))}function Ni(e){let t=Mi(e);return`${Number.isInteger(t)?t.toFixed(1):String(t)}×`}var Pi={working:`working`,blocked:`blocked`,error:`failed`,idle:`done`},Fi=160,Ii=class{rootID;max;maxSubagents;maxText;items=[];subagents=new Map;seq=0;rootState;rootSince;busyAt;writing;lastAt;constructor(e,{max:t=30,maxSubagents:n=10,maxText:r=4e3}={}){this.rootID=e,this.max=t,this.maxSubagents=n,this.maxText=r}touch(e){e!==void 0&&Number.isFinite(e)&&!((this.lastAt??-1/0)>=e)&&(this.lastAt=e)}reasoning(e,t,n,r=Date.now()){let i=`thinking:${t}`;this.items.some(e=>e.id===i)||this.activity(e,{id:i,kind:`thinking`,state:`running`,at:r});let a=this.items.find(e=>e.id===i);a&&(a.text=`${a.text??``}${n??``}`.slice(-this.maxText)),this.touch(r)}text(e,t,n,r=Date.now()){for(let t of this.items)t.sessionID===e&&t.kind===`thinking`&&t.state===`running`&&(t.state=`done`);if(this.touch(r),e===this.rootID){this.writing={messageID:t,at:r};return}let i=this.subagents.get(e);i||(i={id:e,state:`working`,at:r},this.subagents.set(e,i),this.trim()),i.msg!==t&&(i.out=``),i.msg=t,i.out=`${i.out??``}${n??``}`.slice(-600);let a=i.out.split(`
|
|
9
|
+
`).map(e=>e.trim()).filter(Boolean).at(-1);a&&(i.line=a.length>Fi?`…${a.slice(-159)}`:a)}activity(e,t){if(!t||typeof t.id!=`string`)return;let n=t.sessionID??e??this.rootID,r=this.items.find(e=>e.id===t.id);if(r){r.state=t.state??r.state,t.error!==void 0&&(r.error=t.error),t.summary&&(r.summary=t.summary),t.tool&&(r.tool=t.tool),this.touch(t.at);return}let i=Number.isFinite(t.at)?t.at:Date.now();this.touch(i);for(let e of this.items)e.sessionID===n&&e.kind===`thinking`&&e.state===`running`&&e.at<=i&&(e.state=`done`);let a={id:t.id,sessionID:n,kind:t.kind===`thinking`?`thinking`:`tool`,tool:t.tool,summary:t.summary,state:t.state??`running`,error:t.error,at:i,seq:++this.seq},o=this.items.length;for(;o>0&&this.items[o-1].at>i;)o--;this.items.splice(o,0,a),n!==this.rootID&&!this.subagents.has(n)&&this.subagents.set(n,{id:n,state:`working`,at:i}),this.trim()}load(e){for(let t of[...e??[]].sort((e,t)=>(e.at??0)-(t.at??0)))this.activity(t.sessionID??this.rootID,t)}status(e,t=Date.now()){let n=new Set,r=this.stateKey(),i;for(let r of e??[]){if(r.id===this.rootID){i=r;continue}n.add(r.id);let e=Pi[r.state]??`working`,a=this.subagents.get(r.id);a?(a.state=e,r.title&&(a.title=r.title),a.since=r.since):e!==`done`&&this.subagents.set(r.id,{id:r.id,title:r.title,state:e,at:t,since:r.since})}for(let e of this.subagents.values())!n.has(e.id)&&(e.state===`working`||e.state===`blocked`)&&(e.state=`done`);let a=i?.state===`working`||i?.state===`blocked`||[...this.subagents.values()].some(e=>e.state===`working`||e.state===`blocked`);if(i&&!a)for(let e of this.items)e.state===`running`&&(e.state=`done`);i&&(this.rootState=i.state,this.rootSince=i.since,i.state!==`working`&&(this.writing=void 0)),this.rootState===`working`||[...this.subagents.values()].some(e=>e.state===`working`)?this.busyAt===void 0&&(this.busyAt=t):this.busyAt=void 0,r!==void 0&&r!==this.stateKey()&&this.touch(t),this.trim()}stateKey(){if(this.rootState!==void 0)return[this.rootState,...[...this.subagents.values()].map(e=>`${e.id}=${e.state}`)].join(` `)}trim(){for(;this.items.length>this.max;){let e=this.items.findIndex(e=>e.state!==`running`);this.items.splice(e===-1?0:e,1)}if(this.subagents.size>this.maxSubagents){let e=[...this.subagents.values()].filter(e=>e.state===`done`||e.state===`failed`).sort((e,t)=>e.at-t.at);for(let t of e.slice(0,this.subagents.size-this.maxSubagents))this.subagents.delete(t.id)}}rows(){let e=e=>!(e.kind===`thinking`&&e.state!==`running`&&!e.text),t=(e,t)=>({key:e.id,depth:t,kind:e.kind,label:e.kind===`thinking`&&e.state!==`running`?`Thought`:Ri(e),state:e.state,error:e.error,sessionID:e.sessionID,...e.text?{text:e.text}:{}}),n=[];for(let r of this.items)r.sessionID===this.rootID&&e(r)&&n.push({at:r.at,seq:r.seq,rows:[t(r,0)]});for(let r of this.subagents.values())n.push({at:r.at,seq:0,rows:[{key:`sub:${r.id}`,depth:0,kind:`subagent`,label:r.title||r.id,state:r.state,sessionID:r.id,...r.line?{line:r.line}:{}},...this.items.filter(t=>t.sessionID===r.id&&e(t)).map(e=>t(e,1))]});return n.sort((e,t)=>e.at-t.at||e.seq-t.seq).flatMap(e=>e.rows)}now(){for(let e=this.items.length-1;e>=0;e--)if(this.items[e].state===`running`)return Ri(this.items[e]);let e=[...this.subagents.values()].reverse().find(e=>e.state===`working`);return e?`Subagent: ${e.title||e.id}`:void 0}pulse(){let e=[...this.subagents.values()].filter(e=>e.state===`working`),t=this.rootState===`working`,n=t||e.length>0,r=!n&&(this.rootState===`blocked`||[...this.subagents.values()].some(e=>e.state===`blocked`)),i=r?`Needs you`:`Idle`,a;if(n){let n=this.items.filter(e=>e.sessionID===this.rootID),r=[...n].reverse().find(e=>e.state===`running`),o=r?r.kind===`thinking`?`Thinking`:`Running ${Ri(r)}`:void 0,s=this.writing;s&&!n.some(e=>e.at>s.at)&&(o=`Writing reply`);let c=e.length,l=c===0?``:o||c>1?`${c} subagent${c===1?``:`s`} working`:`Subagent “${e[0].title||e[0].id}” working`;i=o&&l?`${o} · ${l}`:o||l||`Working`;let u=[t?this.rootSince:void 0,...e.map(e=>e.since)].filter(e=>typeof e==`number`&&Number.isFinite(e));a=u.length?Math.min(...u):this.busyAt}return{busy:n,blocked:r,label:i,since:a,lastAt:this.lastAt}}};function Li(e){let t=Math.max(0,Math.floor((Number(e)||0)/1e3)),n=e=>String(e).padStart(2,`0`);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m ${n(t%60)}s`:`${Math.floor(t/3600)}h ${n(Math.floor(t%3600/60))}m`}function Ri(e){if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}var zi=Object.freeze({working:Object.freeze([`On it.`,`Give me a sec.`,`One moment.`,`Let me check.`,`Okay, looking into it.`,`Sure, one sec.`,`Hang on.`,`Let me see.`,`Checking now.`,`Bear with me.`]),subagent:Object.freeze([`I'll hand that off.`,`Starting that in the background.`,`Sending that off now.`,`Getting a helper on it.`,`Passing that along.`]),still:Object.freeze([`Still on it.`,`Almost there.`,`Still working through it.`,`Bear with me, still going.`,`Taking a bit longer.`])});function Bi(){let e=Object.values(zi),t=[];for(let n=0;n<Math.max(...e.map(e=>e.length));n++)for(let r of e)n<r.length&&t.push(r[n]);return t}var Vi=class{rng;ready;bags=new Map;last=new Map;used=new Map;count=0;constructor({rng:e=Math.random,ready:t=()=>!0}={}){this.rng=e,this.ready=t}pick(e){let t=zi[e],n=this.last.get(e),r=this.bags.get(e);r?.length||(r=this.shuffle(t),r.length>1&&r[0]===n&&r.push(r.shift()),this.bags.set(e,r));let i=e=>e!==n||t.length<2,a=r.findIndex(e=>i(e)&&this.ready(e)),o;if(a>=0)o=r.splice(a,1)[0];else{let e=t.filter(e=>i(e)&&this.ready(e)).sort((e,t)=>(this.used.get(e)??0)-(this.used.get(t)??0))[0];e?o=e:(a=r.findIndex(i),o=a>=0?r.splice(a,1)[0]:t.find(i))}return o??=t[0],this.last.set(e,o),this.used.set(o,++this.count),o}shuffle(e){let t=[...e];for(let e=t.length-1;e>0;e--){let n=Math.floor(this.rng()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}},Hi=class{ackMs;quietMs;stillMs;enabled=!0;busy=!1;awaiting;pendingSubagent=!1;lastSay=-1/0;lastSpoke=-1/0;user=!1;agent=!1;cue=!1;pick;constructor({ackMs:e=2500,quietMs:t=3e3,stillMs:n=4e4,pick:r}={}){if(!r){let e=new Vi;r=t=>e.pick(t)}this.pick=r,this.ackMs=e,this.quietMs=t,this.stillMs=n}get gated(){return this.user||this.agent||this.cue}heard(e,{tone:t=!0}={}){return this.awaiting=Math.min(this.awaiting??e,e),t&&this.enabled&&!this.user?[{type:`earcon`,name:`heard`}]:[]}awaitReply(e){this.awaiting=e}speechEnded(e){return this.userTalking(!1,e),this.enabled?[{type:`earcon`,name:`heard`}]:[]}working(e,t){e&&!this.busy&&(this.lastSpoke=Math.max(this.lastSpoke,t)),e||(this.awaiting=void 0,this.pendingSubagent=!1),this.busy=e}agentSaid(e){this.lastSay=e,this.spoke(e)}agentSpeaking(e,t){this.agent=e,this.spoke(t)}userTalking(e,t){this.user=e,e||(this.lastSpoke=Math.max(this.lastSpoke,t))}cueSpeaking(e,t){this.cue=e,e||(this.lastSpoke=Math.max(this.lastSpoke,t))}subagentStarted(e){e-this.lastSay>=this.quietMs&&(this.pendingSubagent=!0)}subagentFinished(e){return this.enabled&&!this.user?[{type:`earcon`,name:`done`}]:[]}nextDue(e){if(this.enabled&&!this.gated){if(this.pendingSubagent)return e;if(this.busy)return Math.min(this.awaiting===void 0?1/0:this.awaiting+this.ackMs,this.lastSpoke+this.stillMs)}}tick(e){return!this.enabled||this.gated?[]:this.pendingSubagent?this.say(`subagent`,e):this.awaiting!==void 0&&this.busy&&e-this.awaiting>=this.ackMs?this.say(`working`,e):this.busy&&e-this.lastSpoke>=this.stillMs?this.say(`still`,e):[]}spoke(e){this.awaiting=void 0,this.pendingSubagent=!1,this.lastSpoke=Math.max(this.lastSpoke,e)}say(e,t){return this.spoke(t),[{type:`speak`,cue:e,text:this.pick(e)}]}},Ui=class{scheduler;playFn;ready;now;setTimer;clearTimer;timer;constructor({scheduler:e,play:t,ready:n=()=>!0,now:r=()=>Date.now(),setTimer:i=(e,t)=>setTimeout(e,t),clearTimer:a=e=>clearTimeout(e)}){this.scheduler=e,this.playFn=t,this.ready=n,this.now=r,this.setTimer=i,this.clearTimer=a}poke(){if(this.stop(),this.ready())for(let e=0;e<3;e++){let e=this.now(),t=this.scheduler.nextDue(e);if(t===void 0||!Number.isFinite(t))return;if(t>e){this.timer=this.setTimer(()=>{this.timer=void 0,this.poke()},t-e);return}let n=this.scheduler.tick(e);n.length&&this.playFn(n)}}stop(){this.timer!==void 0&&this.clearTimer(this.timer),this.timer=void 0}},Wi=new Set([`working`,`blocked`]);function Gi(e,t,n){let r=new Map((e??[]).filter(e=>e.id!==n).map(e=>[e.id,e.state])),i=[],a=[];for(let e of t??[]){if(e.id===n)continue;let t=r.get(e.id);r.delete(e.id),e.state===`working`&&!Wi.has(t??``)?i.push(e.id):Wi.has(t??``)&&!Wi.has(e.state)&&a.push(e.id)}for(let[e,t]of r)Wi.has(t)&&a.push(e);return{started:i,finished:a}}function Ki(e){return(e??[]).some(e=>e.state===`working`)}var qi=Object.freeze([`openrouter`,`openai-compatible`]),Ji={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]},I=e=>e==null?``:String(e).trim();function Yi(e){let t={};for(let n of[`stt`,`tts`]){let r=e?.[n]??{};t[n]=Object.fromEntries(Ji[n].map(e=>[e,I(r[e])])),t[n].apiKey={action:`keep`,value:``}}return t}function Xi(e,t){let n={};for(let r of[`stt`,`tts`]){let i=e?.[r]??{},a=t[r],o={};for(let e of Ji[r]){if(e===`baseURL`&&I(a.provider)!==`openai-compatible`)continue;let t=I(a[e]);t!==I(i[e])&&(o[e]=t===``?null:e===`speed`?Number(t):t)}a.apiKey?.action===`set`?o.apiKey=I(a.apiKey.value):a.apiKey?.action===`clear`&&(o.apiKey=null),Object.keys(o).length&&(n[r]=o)}return n}function Zi(e){let t={};for(let n of[`stt`,`tts`]){let r=e[n],i=(e,r)=>t[`${n}.${e}`]=r;if(qi.includes(I(r.provider))||i(`provider`,`Choose a provider.`),I(r.model)||i(`model`,`Enter a model.`),I(r.provider)===`openai-compatible`){let e=I(r.baseURL);e?/^https?:\/\/[^\s/]+/i.test(e)||i(`baseURL`,`Enter an http:// or https:// URL.`):i(`baseURL`,`Enter the server's base URL.`)}if(n===`tts`){I(r.voice)||i(`voice`,`Enter a voice.`);let e=I(r.speed);e&&!(Number(e)>=.25&&Number(e)<=4)&&i(`speed`,`Use a number from 0.25 to 4.`)}r.apiKey?.action===`set`&&!I(r.apiKey.value)&&i(`apiKey`,`Paste the new key, or cancel.`)}return t}function Qi(e,t){let n;for(let r of Object.keys(e??{}))String(t??``).startsWith(r)&&(n===void 0||r.length>n.length)&&(n=r);return n===void 0?[]:[...e[n]??[]]}var $i=/^(localhost|127(?:\.\d{1,3}){3}|\[::1\])$/i;function ea(e,t){if(!e||e.stt&&e.tts)return;let n=!1;try{n=$i.test(new URL(t??``).hostname)}catch{n=!1}return{reason:e.reason||`Choose a speech provider and add its API key in Settings → Speech.`,micBlocked:!e.stt,...n?{storage:`Keys are stored on this computer in ~/.local/state/hub`}:{}}}var ta=()=>({machines:void 0,reads:{},prefs:vr({}),prefsSource:`unknown`,prefsPending:0,prefsStale:!1,connection:`connecting`,enrollmentRev:0}),na=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function ra(e,t,n){for(let r of e??[])for(let e of r.processes)for(let r of e.sessions)r.id===t&&n(r)}function ia(e,t){if(!na(t)||typeof t.type!=`string`)return!1;switch(t.type){case`catalog`:return Array.isArray(t.machines)?(e.machines=t.machines,!0):!1;case`status`:{if(typeof t.sessionID!=`string`||!Array.isArray(t.sessions))return!1;let n=!1;return ra(e.machines,t.sessionID,e=>{e.status=t.sessions,n=!0}),n}case`conversation`:{if(typeof t.sessionID!=`string`||typeof t.on!=`boolean`)return!1;let n=!1;return ra(e.machines,t.sessionID,e=>{e.conversation=t.on,n=!0}),n}case`reads`:return na(t.reads)?(e.reads=Object.fromEntries(Object.entries(t.reads).filter(e=>typeof e[1]==`number`)),!0):!1;case`prefs`:return e.prefsSource===`hub`?e.prefsPending?(e.prefsStale=!0,!0):(e.prefs=vr(t.prefs),!0):!1;case`enrollment`:return e.enrollmentRev++,!0;case`handoff`:return typeof t.sessionID==`string`&&(e.notice={kind:`handoff`,sessionID:t.sessionID,at:Date.now()},!0);default:return!1}}function aa(e,t){let n;for(let r of e??[])for(let e of r.processes){let i=e.sessions.find(e=>e.id===t);i&&(!n||(i.updated??0)>(n.session.updated??0))&&(n={session:i,machine:r,process:e})}return n??oa(e,t)}function oa(e,t){for(let n of e??[])for(let e of n.processes)for(let r of e.sessions){let i=Array.isArray(r.status)?r.status:[],a=i.find(e=>e.id===t);if(!a||r.id===t)continue;let o=sa(i,t),s=i.filter(e=>e.id&&o.has(e.id)),c=s.some(e=>e.state===`blocked`)?`blocked`:a.state===`error`?`error`:s.some(e=>e.state===`working`)?`working`:`idle`;return{session:{...r,id:t,title:a.title??``,...a.parentID?{parentID:a.parentID}:{},rootID:r.id,state:c,blockers:a.blockers??[],busy:!1,conversation:!1},machine:n,process:e}}}function sa(e,t){let n=new Set([t]);for(let t=!0;t;){t=!1;for(let r of e??[])r.id&&r.parentID&&n.has(r.parentID)&&!n.has(r.id)&&(n.add(r.id),t=!0)}return n}function ca(e){return(e??[]).some(e=>e.state===`working`||e.state===`blocked`)}var la=class{max;feeds=new Map;constructor(e=50){this.max=e}has(e){return this.feeds.has(e)}feed(e,t){let n=this.feeds.get(e);if(!n)for(n=new Ii(e),t&&n.status(t),this.feeds.set(e,n);this.feeds.size>this.max;)this.feeds.delete(this.feeds.keys().next().value);return n}apply(e){if(!na(e))return;let t=typeof e.sessionID==`string`?e.sessionID:void 0;if(!t)return;let n=typeof e.rootID==`string`?e.rootID:t,r=typeof e.messageID==`string`?e.messageID:void 0;switch(e.type){case`activity`:return na(e.item)?(this.feed(n).activity(t,e.item),n):void 0;case`delta`:return typeof e.text!=`string`||!e.text?void 0:(this.feed(n).text(t,r,e.text),n);case`reasoning`:return typeof e.delta!=`string`||!e.delta?void 0:(this.feed(n).reasoning(t,r??`unknown`,e.delta),n);case`status`:return Array.isArray(e.sessions)?(this.feed(t).status(e.sessions),t):void 0;default:return}}};function ua(e,t){let n=new URLSearchParams;e.lite&&n.set(`lite`,`1`),e.session&&n.set(`session`,e.session),e.sessions&&e.sessions.length>1&&n.set(`sessions`,e.sessions.join(`,`)),t&&n.set(`last`,t);let r=n.toString().replace(/\+/g,`%20`);return r?`/api/events?${r}`:`/api/events`}var da=class{deps;state=`stopped`;lastID;scope={lite:!1};hideTimer;staleTimer;constructor(e){this.deps=e}start(e){this.scope=e,this.reopen(`start`)}received(e){e&&(this.lastID=e),this.state===`open`&&this.watch()}setScope(e){let t=ua(e)===ua(this.scope);this.scope=e,!t&&this.state===`open`&&this.reopen(`scope`)}hidden(){this.state===`open`&&this.hideTimer===void 0&&(this.hideTimer=this.deps.setTimer(()=>{this.hideTimer=void 0,!(this.state!==`open`||this.deps.keepOpen())&&(this.clear(),this.state=`paused`,this.deps.close())},this.deps.hiddenMs??3e4))}visible(){this.hideTimer!==void 0&&(this.deps.clearTimer(this.hideTimer),this.hideTimer=void 0),this.state===`paused`&&this.reopen(`resume`)}reopen(e=`reconnect`){this.state===`open`&&this.deps.close(),this.clear(),this.state=`open`,this.deps.open(ua(this.scope,this.lastID),e),this.watch()}stop(){if(this.state===`stopped`)return;this.clear();let e=this.state===`open`;this.state=`stopped`,e&&this.deps.close()}watch(){this.staleTimer!==void 0&&this.deps.clearTimer(this.staleTimer),this.staleTimer=this.deps.setTimer(()=>{this.staleTimer=void 0,this.state===`open`&&this.reopen(`stale`)},this.deps.staleMs??45e3)}clear(){for(let e of[this.hideTimer,this.staleTimer])e!==void 0&&this.deps.clearTimer(e);this.hideTimer=this.staleTimer=void 0}};function fa(e,t){return t===`scope`&&e===`live`?{connection:`live`,reconnecting:!1}:{connection:`connecting`,reconnecting:e!==`connecting`}}var pa=e=>e===`app:concierge`||e===`app concierge`,ma=/^(ses_[A-Za-z0-9]+)(?: \(sub ses_[A-Za-z0-9]+\))? (.*)$/,ha=/^[!+-] (.*)$/,ga=/^… (\d+) more updates not listed$/,_a=2,va={permission:`needs a permission`,question:`has a question`};function ya(e,t){let n=/^machine \S+ (online|offline)$/.exec(e);if(n)return`a machine went ${n[1]}`;let r=ma.exec(e);if(!r)return`something changed`;let i=t(r[1])??r[1],a=r[2];if(/^turn_done\b/.test(a))return`${i} finished a turn`;let o=/^blocker:(\w+)/.exec(a);if(o)return`${i} ${va[o[1]]??`is blocked (${o[1]})`}`;if(/^blocker_closed\b/.test(a))return`${i} was unblocked`;if(a===`state:error`)return`${i} hit an error`;if(a===`online`)return`${i} came online`;if(a===`offline`||a===`state:offline`)return`${i} went offline`;if(a===`state:working`)return`${i} started working`;let s=/^state:(\w+)$/.exec(a);if(s)return`${i} is ${s[1]}`;if(/^decision dec_/.test(a))return`${i} has a Decision for you`;let c=/^launch \S+ ended:(\w+)$/.exec(a);return c?`${i}'s launch ended (${c[1]})`:/^intent_cleared\b/.test(a)||/^intent:title\b/.test(a)?`${i}'s intent was cleared (it shows its title again)`:/^intent:/.test(a)?`${i}'s intent changed`:a===`pinned`||a===`unpinned`?`${i} was ${a}`:`${i} changed`}function ba(e,t){if(typeof e!=`string`)return;let[n=``,...r]=e.split(`
|
|
10
|
+
`),i=/^Concierge digest \(.*?\) b\d+ .*?: (.*)$/.exec(n);if(i)return`Digest: ${i[1]}`;if(!/^Concierge update b\d+ /.test(n))return;if(/ changes were missed | some changes were missed/.test(n))return`Update: some changes were missed — catching up`;let a=[],o=0;for(let e of r){let n=ga.exec(e);n&&(o+=Number(n[1]));let r=ha.exec(e);r&&(a.length<_a?a.push(ya(r[1],t)):o++)}return/· quiet hours ended: /.test(n)&&a.unshift(`quiet hours ended`),a.length||a.push(`something changed in your sessions`),`Update: ${[...a,...o?[`${o} more`]:[]].join(` · `)}`}var xa=60,Sa=/(`[^`]*`|\]\([^)]*\)|<[a-z][a-z0-9+.-]*:[^>\s]*>|\b[a-z][a-z0-9+.-]*:\/\/[^\s<>()]+)|(?<![\w#/[(])((?:Decision )?)(dec_[A-Za-z0-9]{1,64})(?!\w)/g,Ca=e=>{let t=Intl.Segmenter;return t?Array.from(new t(void 0,{granularity:`grapheme`}).segment(e),e=>e.segment):Array.from(e)},wa=e=>{let t=e.replace(/\s+/g,` `).trim(),n=Ca(t);return n.length>xa?`${n.slice(0,59).join(``)}…`:t};function Ta(e){if(!e.includes(`dec_`))return[];let t=new Set;for(let n of e.matchAll(Sa))!n[1]&&n[3]&&t.add(n[3]);return[...t]}function Ea(e,t,n={}){let r=n.unknown===`link`;if(!t.length&&!r||!e.includes(`dec_`))return[{text:e}];let i=new Map(t.map(e=>[e.id,e])),a=[],o=0,s=e=>{let t=a.at(-1);!e.href&&t&&!t.href?a[a.length-1]={text:t.text+e.text}:e.text&&a.push(e)};for(let t of e.matchAll(Sa)){let[n,a,c,l]=t;if(a||!l)continue;let u=i.get(l);if(!u&&!r)continue;s({text:e.slice(o,t.index)});let d=`/concierge#decision-${l}`;if(u){let e=`Decision “${wa(u.question)}”`;s({text:u.state===`open`?e:`${e} (${u.state})`,href:d})}else s({text:c&&e.startsWith(`: `,t.index+n.length)?`Decision (answered)`:c?`Decision`:`a Decision`,href:d});o=t.index+n.length}return s({text:e.slice(o)}),a.length?a:[{text:e}]}function Da(e,t,n={}){return Ea(e,t,n).map(e=>e.href?`[${Oa(e.text)}](${e.href})`:e.text).join(``)}var Oa=e=>e.replace(/[\\`*_[\]<>~=]/g,`\\$&`);function ka(e,t){return e.replace(/(?<![\w/])ses_[A-Za-z0-9]{1,64}(?!\w)/g,e=>t(e)??e)}function Aa(e){if(e.state===`expired`)return`Expired without an answer`;if(e.state===`closed`)return e.closed?.reason?`Closed: ${e.closed.reason}`:`Closed`;let t=e.answer,n=t?.option===void 0?t?.text:e.options.find(e=>e.id===t.option)?.label??t.option;return!t||n===void 0?`Answered`:t.answeredBy===`timeout`?`Answered “${n}” when it timed out`:`You answered “${n}”`}var ja=2e3,Ma=6e4,Na=class{options;found=new Map;missing=new Set;failures=new Map;asking=new Map;queue=[];running=0;now;constructor(e){this.options=e,this.now=e.now??Date.now}recall(e){let t=this.found.get(e);if(t!==void 0)return Promise.resolve(t);if(this.missing.has(e))return Promise.resolve(void 0);let n=this.asking.get(e);if(n)return n;let r=this.failures.get(e);if(r&&this.now()<r.retryAt)return Promise.resolve(void 0);let i=this.running<4?this.ask(e):new Promise(e=>this.queue.push(e)).then(()=>this.ask(e));return this.asking.set(e,i),i}async ask(e){this.running++;try{let t=this.options.parse(await this.options.fetch(e));return this.failures.delete(e),t===void 0?this.missing.add(e):this.found.set(e,t),t}catch(t){let n=this.options.status(t);if(n!==void 0&&n!==429&&n<500)this.failures.delete(e),this.missing.add(e);else{let t=(this.failures.get(e)?.count??0)+1;this.failures.set(e,{count:t,retryAt:this.now()+Math.min(ja*2**(t-1),Ma)})}return}finally{this.running--,this.asking.delete(e),this.queue.shift()?.()}}};function Pa(e,t){let n=new Set;for(let r of e)if((r.type===`assistant`?r.live!==!0:r.type===`message`&&!r.primer&&!pa(r.from))&&typeof r.text==`string`)for(let e of Ta(r.text))t.has(e)||n.add(e);return[...n]}var Fa=new Set([`disabled`,`starting`,`running`,`waiting_machine`,`backoff`,`failed`,`stopping`]),L=e=>typeof e==`object`&&!!e&&!Array.isArray(e),R=e=>typeof e==`string`,Ia=e=>typeof e==`number`&&Number.isFinite(e);function La(e){if(L(e)&&R(e.state)&&Fa.has(e.state))return{state:e.state,...R(e.reason)?{reason:e.reason.slice(0,200)}:{},...R(e.sessionID)?{sessionID:e.sessionID}:{},hiddenSessionIDs:Array.isArray(e.hiddenSessionIDs)?e.hiddenSessionIDs.filter(R):[],...R(e.launchID)?{launchID:e.launchID}:{},...R(e.machineID)?{machineID:e.machineID}:{},generation:Ia(e.generation)?e.generation:0,since:Ia(e.since)?e.since:0,...Ia(e.nextAttemptAt)?{nextAttemptAt:e.nextAttemptAt}:{}}}function Ra(e){if(!L(e)||!L(e.settings))return;let t=La(e.status);if(!t)return;let n=Array.isArray(e.machines)?e.machines.filter(L).filter(e=>R(e.id)&&R(e.name)).map(e=>({id:e.id,name:e.name,eligible:e.eligible===!0,online:e.online===!0,...R(e.reason)?{reason:e.reason}:{},roots:Array.isArray(e.roots)?e.roots.filter(R):[]})):[];return{settings:e.settings,status:t,machines:n}}function za(e,t,n){let r=new Set(e?e.hiddenSessionIDs:n??[]);for(let e of t??[])for(let t of e.processes??[])for(let e of t.sessions??[])(e.agent===`concierge`||e.contextRevision!==void 0)&&r.add(e.id);return r}var Ba=4e3,Va=(e,t,n)=>e||t&&n;function Ha(e,t,n,r,i,a){return za(t,r,a).has(e)?`concierge`:!n||i===!1&&!Ua(e,r)?`wait`:`session`}var Ua=(e,t)=>(t??[]).some(t=>(t.processes??[]).some(t=>(t.sessions??[]).some(t=>t.id===e))),Wa=e=>`concierge.hidden.${e??`local`}`;function Ga(e){let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);(r===`concierge.hidden`||r?.startsWith(`concierge.hidden.`))&&t.push(r)}for(let n of t)e.removeItem(n)}function Ka(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length<=128).slice(-20):[]}catch{return[]}}var qa=e=>e<6e4?`${Math.max(1,Math.ceil(e/1e3))} s`:`${Math.ceil(e/6e4)} min`;function Ja(e,t,n){if(!e)return`Off`;let r=t.find(t=>t.id===e.machineID)?.name??`its machine`;switch(e.state){case`disabled`:return`Off`;case`starting`:return e.reason?.startsWith(`Waiting`)?e.reason:`Starting on ${r}`;case`running`:return`Running on ${r}`;case`waiting_machine`:return`Waiting for ${r}${e.reason?`: ${e.reason}`:``}`;case`backoff`:return e.nextAttemptAt===void 0?`Relaunching`:`Relaunching in ${qa(e.nextAttemptAt-n)}`;case`failed`:return`Failed${e.reason?`: ${e.reason}`:``}`;case`stopping`:return`Stopping`}}function Ya(e){let t=e=>e.eligible?0:e.online?2:1;return[...e].sort((e,n)=>t(e)-t(n)||e.name.localeCompare(n.name)).map(e=>({...e,selectable:e.eligible||!e.online,note:e.eligible?`Ready`:e.online?e.reason??`Cannot host the Concierge`:`Offline: the Concierge waits for it`}))}var Xa=(e,t)=>{let n=t.replace(/\/+$/,``);return e===n||e.startsWith(`${n}/`)};function Za(e,t){if(!e.machineID)return`Pick a machine`;let n=t.find(t=>t.id===e.machineID);if(!n)return`That machine is not yours any more: pick another`;if(!n.eligible&&n.online)return`${n.name} cannot host the Concierge: ${n.reason??`not eligible`}`;if(!e.directory)return`Pick a directory (a git repo on ${n.name})`;if(n.roots.length&&!n.roots.some(t=>Xa(e.directory,t)))return`The directory must be under one of ${n.name}'s workspace roots: ${n.roots.join(`, `)}`}var Qa=e=>({allow:[`answer`,`deny`,`approve`],projects:[...e],permissions:{allow:[`read`,`edit`],never:[`shell:git push*`,`shell:rm *`]},allowAlways:!1,expires:`7d`,maxActionsPerHour:60}),$a=[`answer`,`deny`,`approve`,`stop`,`prompt`];function eo(e,t){let n=e??Qa(t?[t]:[]);return{projects:[...n.projects],allow:[...n.allow],permit:n.permissions.allow.join(`
|
|
11
|
+
`),never:n.permissions.never.join(`
|
|
12
|
+
`),expires:n.expires,maxActionsPerHour:String(n.maxActionsPerHour)}}var to=e=>e.split(`
|
|
13
|
+
`).map(e=>e.trim()).filter(Boolean),no=/^(\d+)(h|d)$/;function ro(e){let t={},n=[...new Set(e.projects.map(e=>e.trim()).filter(Boolean))];n.length||(t.projects=`Pick at least one project`),$a.filter(t=>e.allow.includes(t)).length||(t.allow=`Pick at least one action`);let r=e.expires.trim(),i=no.exec(r),a=i?Number(i[1])*(i[2]===`d`?24:1):NaN;a>=1&&a<=720||(t.expires=`1h to 30d, for example 8h or 7d`);let o=e.maxActionsPerHour.trim(),s=/^\d+$/.test(o)?Number(o):NaN;return s>=1&&s<=1e3||(t.maxActionsPerHour=`A whole number from 1 to 1000`),Object.keys(t).length?{ok:!1,errors:t}:{ok:!0,body:{allow:e.allow.filter(e=>$a.includes(e)),projects:n,permissions:{allow:to(e.permit),never:to(e.never)},allowAlways:!1,expires:r,maxActionsPerHour:s}}}function io(e){let t=to(e).filter(e=>/^(shell|bash)\b/.test(e));return t.length?`Shell rules (${t.join(`, `)}) never auto-approve: the Concierge always asks for your tap on a shell request. In shell patterns * also matches &&, | and ;.`:void 0}function ao(e){if(/^grant\.permissions\.never/.test(e))return`never`;if(/^grant\.permissions/.test(e))return`permit`;if(/^grant\.projects|^scope/.test(e))return`projects`;if(/^grant\.allow\b/.test(e))return`allow`;if(/^grant\.expires/.test(e))return`expires`;if(/^grant\.maxActionsPerHour/.test(e))return`maxActionsPerHour`;if(/^permissions\.never/.test(e))return`never`;if(/^permissions/.test(e))return`permit`}function oo(e,t,n){let r=[...(e?.processes??[]).flatMap(e=>e.sessions.map(e=>(e.project||e.directory).replace(/\/+$/,``)))].filter(Boolean).sort();return[...new Set([...t?[t]:[],...n,...r])]}function so(e){let t=e.permissions.allow,n=e.permissions.never;return{head:`${e.allow.join(`, `)} in ${e.projects.join(`, `)}`,permissions:t.length?`Permissions ${t.join(`, `)}${n.length?` · never ${n.join(`, `)}`:``}`:`Permissions: none (it approves nothing)`}}function co(e,t){let n=zt(e,t);return n?`expires in ${n}`:`expired`}var lo=[`machineID`,`directory`,`model`,`grant`,`connectors`,`timeZone`,`quietHours`,`quietAllowsUrgent`,`digests`];function uo(e,t){let n={};for(let r of lo)JSON.stringify(e[r])!==JSON.stringify(t[r])&&(n[r]=t[r]===void 0?null:t[r]);return{...n,expectedRevision:e.revision}}var fo=`__other__`,po=e=>(e??``).replace(/\/+$/,``);function mo(e,t){if(!e)return{projects:[],roots:[]};let n=[...new Set(e.roots.map(po).filter(Boolean))],r=(t??[]).find(t=>t.id===e.id)?.processes.flatMap(e=>e.sessions.map(e=>po(e.project)||po(e.directory)))??[],i=[...new Set(r)].filter(e=>e.startsWith(`/`)&&(!n.length||n.some(t=>Xa(e,t)))).sort();return{projects:i,roots:n.filter(e=>!i.includes(e))}}function ho(e,t){if(!e)return`Pick a machine first.`;if(!e.online)return`${e.name} is offline: its projects show when it is back; you can type a folder.`;let n=[...new Set(e.roots.map(po).filter(Boolean))],r=n.length?` under ${n.join(`, `)}`:``;return t.projects.length?`A git repo on ${e.name}${r}. It is used as is: no branch switch.`:`${e.name} reports no projects${r} yet: pick a root or type a folder.`}var go=(e,t)=>e?t.includes(e)?e:fo:``;function _o(e,t,n,r){if(e.machineID===t.id)return e;let{projects:i,roots:a}=mo(t,n),o=e.directory!==void 0&&(i.includes(e.directory)||a.includes(e.directory)),s=e.model!==void 0&&r!==void 0&&!r.includes(e.model)?void 0:e.model;return{...e,machineID:t.id,directory:o?e.directory:void 0,model:s}}var vo=(e,t)=>e.model!==void 0&&!t.includes(e.model)?{...e,model:void 0}:e,yo=/^[A-Za-z0-9._-]{1,80}\/[!-~]{1,200}$/;function bo(e){let t=L(e)&&Array.isArray(e.models)?e.models:[],n=new Map;for(let e of t){if(!L(e)||!R(e.providerID)||!R(e.modelID)||e.enabled===!1)continue;let t=`${e.providerID}/${e.modelID}`;yo.test(t)&&!n.has(t)&&n.set(t,{value:t,label:R(e.name)&&e.name?e.name.slice(0,120):e.modelID,provider:e.providerID})}return[...n.values()].sort((e,t)=>e.provider.localeCompare(t.provider)||e.label.localeCompare(t.label))}function xo(e){if(!e)return`Pick a machine first`;if(!e.online)return`${e.name} is offline: type a model, or keep the machine default`;if(!e.eligible)return e.reason??`It cannot host the Concierge`}var So=new Set([`yes`,`approve`,`go ahead`,`do it`]),Co=new Set([`no`,`deny`,`don't`,`dont`,`hold`]),wo=new Set([`um`,`umm`,`uh`,`uhm`,`uhh`,`er`,`erm`,`hm`,`hmm`,`ah`,`please`]),To=80;function Eo(e){if(typeof e!=`string`||e.length>To||/[??]/.test(e))return;let t=e.normalize(`NFC`).toLowerCase().replace(/[\u2018\u2019\u02bc`´]/g,`'`).replace(/[.,!?;:…"“”«»()[\]{}\-–—]+/g,` `).split(/\s+/).filter(Boolean),n=0,r=t.length;for(;n<r&&wo.has(t[n]);)n++;for(;r>n&&wo.has(t[r-1]);)r--;let i=t.slice(n,r).join(` `);if(So.has(i))return`yes`;if(Co.has(i))return`no`}function Do(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e))return;let{decisionID:t,expiresAt:n}=e;if(typeof t==`string`&&/^dec_[A-Za-z0-9]{1,64}$/.test(t))return{decisionID:t,...typeof n==`number`&&Number.isFinite(n)?{expiresAt:n}:{}}}function Oo(e,t,n){if(!t||t.expiresAt!==void 0&&t.expiresAt<=n)return;let r=e.find(e=>e.id===t.decisionID);return r&&r.state===`open`&&r.tier===`confirm`?r:void 0}function ko(e,t,{tiers:n=`confirm`}={}){if(!t)return[];let r=new Set([...t.hiddenSessionIDs,...t.sessionID?[t.sessionID]:[]]);return e.filter(e=>e.state===`open`&&(n===`all`||e.tier===`confirm`)&&(e.from.kind===`session`&&r.has(e.from.sessionID)||e.as===`concierge`)).sort((e,t)=>t.at-e.at)}function Ao(e,t){if(t===`yes`&&e.action?.kind===`grant`)return;let n=e.options.filter(e=>t===`yes`?!e.safe&&e.id!==`always`:e.safe===!0);return n.length===1?n[0].id:void 0}function jo(e,t){if(!t||t.tier!==`confirm`||t.state!==`open`)return{kind:`speech`};let n=Eo(e),r=n&&Ao(t,n);return n&&r?{kind:`answer`,decisionID:t.id,option:r,intent:n}:{kind:`speech`}}var Mo=60;function No(e,t){if(!e)return`Answered a Decision by text`;let n=Array.from(e.question.replace(/\s+/g,` `).trim());return`Answered Decision “${n.length>Mo?`${n.slice(0,59).join(``)}…`:n.join(``)}” by text: ${e.options.find(e=>e.id===t)?.label??t}`}var Po=e=>e&&e.state!==`disabled`?!0:`hidden`,Fo={starting:`starting`,backoff:`restarting soon`,waiting_machine:`waiting for its machine`,stopping:`stopping`};function Io(e,t,n,r,i=0,a){if(e.state===`disabled`)return{label:`Concierge (off — set it up)`,title:`Concierge is off — click to set it up in Settings → Concierge`,indicator:`off`};let o=!!t&&(t.expiresAt===void 0||t.expiresAt>r)&&(a===void 0||a.has(t.decisionID)),s=Math.max(i,+!!o),c=s>1?` — ${s} Decisions wait for your answer`:s?` — a Decision waits for your answer`:``,[l,u]=e.state===`failed`?[`Concierge (stopped — restart it)`,`attention`]:e.state===`running`?[`Concierge (running${c})`,s?`attention`:`running`]:[`Concierge (${Fo[e.state]}${c})`,s?`attention`:`busy`];return{label:l,title:`${l} — ${n?`close`:`open`} it`,indicator:u,...i>0?{count:s}:{}}}var Lo=e=>e?`Ask what needs you, or start Voice and talk.`:`Ask what needs you.`,Ro=e=>`${e?`Say or type`:`Type`} “yes” or “no” (or tap). Anything else goes to the Concierge.`,zo=`The Concierge is off. Turn it on in Settings → Concierge.`;function Bo(e,t){if(!e||e.state===`disabled`)return zo;let n=t?.name??`its machine`;switch(e.state){case`failed`:return e.reason?`Stopped: ${e.reason}. Restart it when you are ready.`:`Stopped. Restart it when you are ready.`;case`stopping`:return`Stopping…`;case`backoff`:return`Relaunching…`}if(e.state===`waiting_machine`||t?.online===!1)return`Concierge runs on ${n}, which is offline`;if(e.state===`starting`)return`Starting on ${n}…`}function Vo(e,t){let n=`/api/sessions/${encodeURIComponent(t.sessionID)}/utterance`;return async(r,i)=>{let a=i?.json?.text;if(r!==n||i?.method!==`POST`||typeof a!=`string`||t.current()!==t.sessionID||t.present?.()===!1)return e(r,i);let o=jo(a,t.armed());return o.kind===`speech`?e(r,i):(await t.answer(o.decisionID,o.option),Response.json({inboxID:`decision:${o.decisionID}`}))}}var Ho=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Uo(e,t,n){let r=new Set(e??[0,1,2,3,4,5,6]);n?r.add(t):r.size>1&&r.delete(t);let i=[...r].filter(e=>Number.isInteger(e)&&e>=0&&e<=6).sort((e,t)=>e-t);return i.length===7?void 0:i}function Wo(e,t,n){return n===void 0||!e||e.sessionID===t.sessionID?n:null}function Go(e,t){let n=e;for(let e=n.panes.length-1;e>=0;e--){let r=n.panes[e].sessionID;r!==void 0&&t.has(r)&&(n=ne(n,e))}return n}function Ko(e,t){if(e&&e.expiresAt!==void 0)return Math.max(0,e.expiresAt-t)}function qo(e,t){return e&&e.expiresAt!==void 0&&e.expiresAt<=t?null:e}var Jo=class{events=0;seq=0;settled=0;started=new Map;begin(){let e=++this.seq;return this.started.set(e,this.events),e}event(){this.events++}fresh(e){let t=this.started.get(e);return this.started.delete(e),t!==this.events||e<this.settled?!1:(this.settled=e,!0)}};function Yo(e,t,n){return ko(e,t,{tiers:`all`}).filter(e=>e.id!==n?.id)}var Xo=class{onChange;entries=[];focusedID;seq=0;constructor(e=()=>{}){this.onChange=e}register(e,t=()=>!0){let n=`pane_${++this.seq}`;return this.entries.push({paneID:n,sessionID:e,visible:t}),this.focusedID===void 0&&(this.focusedID=n),this.onChange(),n}release(e){let t=this.entries.length;this.entries=this.entries.filter(t=>t.paneID!==e),this.entries.length!==t&&(this.focusedID===e&&(this.focusedID=this.entries[0]?.paneID),this.onChange())}focus(e){return this.entries.some(t=>t.paneID===e)?(this.focusedID!==e&&(this.focusedID=e,this.onChange()),!0):!1}focused(){return this.focusedID}views(){return this.entries.map(e=>({paneID:e.paneID,sessionID:e.sessionID,visible:e.visible(),focused:e.paneID===this.focusedID}))}};function Zo(e){let t=e.find(e=>e.focused);return t?.visible?t:void 0}function Qo(e,t=re){let n=[],r=Zo(e);for(let i of r?[r,...e]:e){if(n.length>=t)break;i.visible&&!n.includes(i.sessionID)&&n.push(i.sessionID)}return n}function $o(e,t,n){let r=t.length?Qo(t):n?[n]:[],[i]=r;return i?r.length>1?{lite:e,session:i,sessions:r}:{lite:e,session:i}:{lite:e}}function es(e,t,n=re){if(!t)return e;let r=e.sessions??(e.session?[e.session]:[]);if(r.includes(t))return e;let i=[...r.slice(0,Math.max(0,n-1)),t],[a]=i;return i.length>1?{lite:e.lite,session:a,sessions:i}:{lite:e.lite,session:a}}function ts(e){return Zo(e)?.sessionID}function ns(e,t){return Zo(e)?.paneID===t}var rs=class{all=!1;requested=new Set;confirmed=new Set;pending=!1;opened(e){this.all=!e.lite,this.confirmed=new Set(e.session?[e.session]:[]),this.requested=new Set([...this.confirmed,...e.sessions??[]]),this.pending=this.requested.size>this.confirmed.size}message(e){if(!this.pending||typeof e!=`object`||!e)return!1;let{type:t,sessions:n}=e;if(t===`scope`){if(!Array.isArray(n))return!1;for(let e of n)typeof e==`string`&&this.requested.has(e)&&this.confirmed.add(e);return this.pending=!1,!0}return typeof t==`string`&&(this.pending=!1,!0)}covers(e){return this.all||this.confirmed.has(e)?!0:this.pending&&this.requested.has(e)?void 0:!1}},[is,as]=i(0),os=new Xo(()=>as(e=>e+1));function ss(){return is(),os.views()}var cs=()=>ts(ss()),ls=(e,t)=>$o(e,ss(),t);function us(e,t=()=>!0){let n=os.register(e,t);return{paneID:n,focus:()=>void os.focus(n),takesInput:()=>ns(ss(),n),streamed:()=>gs(e),release:()=>os.release(n)}}var ds=new rs,[fs,ps]=i(0);function ms(e){ds.opened(e),ps(e=>e+1)}function hs(e){ds.message(e)&&ps(e=>e+1)}function gs(e){return fs(),ds.covers(e)}var _s=`x-hub-recording`,vs=`x-hub-segment`,ys=`x-hub-tts-ref`,bs=`x-hub-recording-audio`,xs={retentionMs:6048e5,userBytes:524288e3,recordingBytes:157286400,segmentBytes:2097152,segmentsPerRecording:5e3,eventsPerBatch:200,batchBytes:262144,keepaliveBatchBytes:61440,eventsPerRecording:5e4,eventBytesPerRecording:33554432,recordingsStored:200,activePerUser:4,maxDurationMs:144e5,idleEndMs:6e5,sweepMs:9e5,textChars:2e3,utteranceChars:4e3,replyChars:32e3,messageChars:300,consoleBufferEvents:2e3,flushMs:5e3,flushEvents:100,hubFlushMs:2e3,hubFlushEvents:100},z=(e,t=[])=>({required:e,optional:t}),Ss={state:z([`state`]),detector:z([`mode`],[`avgMs`]),"speech.start":z([`bargeIn`]),"speech.end":z([`segment`,`durationMs`,`speechMs`,`forced`]),"segment.closed":z([`segment`,`bytes`,`durationMs`,`speechMs`,`forced`]),"stt.sent":z([`segment`,`bytes`]),"stt.received":z([`segment`,`text`],[`junk`,`empty`,`failed`,`audio`]),"utterance.held":z([`text`]),"utterance.merged":z([`segments`,`pauseMs`]),"utterance.sent":z([`text`,`segments`,`reason`,`holdMs`]),"utterance.accepted":z([`inboxID`]),"utterance.failed":z([`message`],[`status`]),"utterance.command":z([`command`,`text`]),heard:z([`inboxID`]),"say.received":z([`messageID`,`ordinal`,`chars`,`sentences`,`muted`],[`seq`]),"tts.sentence.queued":z([`ref`,`text`]),"tts.request":z([`ref`]),"tts.first.byte":z([`ref`]),"tts.sentence.played":z([`ref`]),"tts.sentence.ended":z([`ref`,`playedMs`,`completed`],[`durationMs`]),"barge.in":z([`cause`,`spoken`,`unplayed`,`mutedMessages`],[`playing`]),"cue.played":z([`cue`],[`name`,`text`]),mic:z([`live`],[`reason`]),control:z([`action`],[`on`]),"turn.timing":z([`firstAudio`],[`speechEnd`,`transcript`,`accepted`,`firstSay`,`firstByte`]),"decision.voice":z([`decisionID`,`option`,`outcome`]),"clock.sync":z([`t0`,`t1`,`hubAt`]),error:z([`where`,`message`])},B=xs,Cs={"stt.received":{text:B.textChars,failed:B.messageChars},"utterance.held":{text:B.utteranceChars},"utterance.sent":{text:B.utteranceChars},"utterance.failed":{message:B.messageChars},"utterance.command":{text:B.utteranceChars},"tts.sentence.queued":{text:B.textChars},"cue.played":{text:B.textChars},error:{message:B.messageChars}};function ws(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=n.charCodeAt(n.length-1);return r>=55296&&r<=56319?n.slice(0,-1):n}function Ts(e,t){let n=Ss[e],r={kind:e};for(let[i,a]of Object.entries(t)){if(a===void 0)continue;if(!n.required.includes(i)&&!n.optional.includes(i))throw Error(`${e}: unknown field ${i}`);let t=Cs[e]?.[i];r[i]=t!==void 0&&typeof a==`string`?ws(a,t):a}for(let t of n.required)if(r[t]===void 0)throw Error(`${e}: missing field ${t}`);if(e===`barge.in`){let e=e=>({...e,text:ws(e.text,B.textChars)}),t=r.spoken;r.spoken={text:ws(t.text,B.replyChars),estimated:t.estimated},r.playing&&=e(r.playing),r.unplayed=r.unplayed.slice(0,Os).map(e),r.mutedMessages=r.mutedMessages.slice(0,Os)}return r}var Es=e=>`${e.messageID}:${e.ordinal}:${e.seq??``}:${e.i}`;function Ds(e){let t=e||``,n=/Android/i.test(t)?`android`:/iPhone|iPad|iPod/i.test(t)?`ios`:`desktop`;return`${n}-${n===`ios`?/CriOS/.test(t)?`chrome`:/FxiOS/.test(t)?`firefox`:`safari`:/Firefox\//.test(t)?`firefox`:/SamsungBrowser/.test(t)?`samsung`:/Edg\//.test(t)?`edge`:/Chrome\//.test(t)?`chrome`:/Safari\//.test(t)?`safari`:`other`}`.slice(0,60)}var Os=20,ks=14;function As(e,t,n){let r=n&&n>0?n:e.length/ks*1e3,i=r>0?Math.min(1,Math.max(0,t/r)):0;if(i>=1)return e.trim();let a=i*e.length,o=0;for(let t=0;t<=e.length;t++)t<e.length&&!/\s/.test(e[t])||Math.abs(t-a)<Math.abs(o-a)&&(o=t);return e.slice(0,o).trim()}function js(e){let{cause:t,completed:n,playing:r,unplayed:i}=e,a=new Set([...r?[r.ref.messageID]:[],...i.map(e=>e.ref.messageID)]),o=e.turnRunning===!1?e.mutedMessages.filter(e=>a.has(e)):e.mutedMessages;if(!r&&!i.length&&!o.length)return;let s=new Set([...r?[r.ref.messageID]:[],...i.map(e=>e.ref.messageID),...o]),c=n.filter(e=>s.has(e.ref.messageID)).map(e=>e.text.trim());return r&&c.push(As(r.text,r.playedMs,r.durationMs)),Ts(`barge.in`,{cause:t,...r?{playing:{ref:r.ref,text:r.text,playedMs:Math.round(r.playedMs),...r.durationMs===void 0?{}:{durationMs:Math.round(r.durationMs)}}}:{},spoken:{text:c.filter(Boolean).join(` `),estimated:!!r},unplayed:i.map(e=>({ref:e.ref,text:e.text})),mutedMessages:[...o]})}function Ms(e,t){return(e===200||e===201)&&typeof t?.recording?.id==`string`?{kind:`started`,recording:t.recording,audio:t.audio!==!1,...typeof t.hubAt==`number`?{hubAt:t.hubAt}:{}}:e===404||e===405||e===501||e===409&&t?.code===`recording_off`?{kind:`off`}:e===0?{kind:`failed`,reason:`offline`}:e===429&&t?.code===`rate_limited`?{kind:`failed`,reason:`${t.limit??B.activePerUser} recordings are already running`}:e===429&&t?.code===`limit`?{kind:`failed`,reason:`${t.limit??B.recordingsStored} recordings stored; delete some in Settings → Voice`}:{kind:`failed`,reason:typeof t?.error==`string`&&t.error?t.error:`HTTP ${e}`}}var Ns=new TextEncoder,V=e=>Ns.encode(e).length,Ps=V(`{"events":[]}`),H=e=>e.kind===`clock.sync`,Fs=e=>Math.max(0,Math.round(e*10)/10);function Is(e,t){let n=[],r=Ps;for(let i of e){if(n.length&&i.seq!==n[n.length-1].seq+1)break;let e=V(JSON.stringify(i))+ +!!n.length;if(r+e>t)break;n.push(i),r+=e}let i=e.length-n.length,a=n[n.length-1];if(!i||!a)return n;let o={seq:a.seq+1,t:a.t,kind:`error`,where:`upload`,message:`dropped ${i} events at page close`};return r+1+V(JSON.stringify(o))<=t&&n.push(o),n}var Ls=class{deps;limits;now;setTimer;clearTimer;seq=0;pending=[];batch;sending=!1;ready=!1;flushTimer;retryTimer;attempt=0;acked=0;flushTarget=0;waiters=[];kickQueued=!1;dropped=0;audio;stopped=!1;constructor(e){this.deps=e,this.limits={...xs,...e.limits},this.now=e.now??(()=>performance.now()),this.setTimer=e.setTimer??((e,t)=>setTimeout(e,t)),this.clearTimer=e.clearTimer??(e=>clearTimeout(e))}get buffered(){return this.pending.length+(this.batch?.length??0)}record(e){return this.add(e,!0)}add(e,t){if(this.stopped)return;let n=++this.seq,r=Fs(this.now()),i={...e,seq:n,t:r},a=V(JSON.stringify(i));for(Ps+a>this.limits.batchBytes&&(i={seq:n,t:r,kind:`error`,where:`upload`,message:`event too large: ${e.kind}`},a=V(JSON.stringify(i))),this.pending.push({e:i,bytes:a});t&&this.pending.length>this.limits.consoleBufferEvents;)this.pending.shift(),this.dropped++;return this.ready&&!H(i)&&this.scheduled(),n}open(e){this.stopped||this.ready||(this.ready=!0,e&&this.record(Ts(`clock.sync`,e)),this.pending.some(e=>!H(e.e))&&this.scheduled())}flush(){let e=this.lastActiveSeq();if(this.stopped||e<=this.acked)return Promise.resolve();this.flushTarget=Math.max(this.flushTarget,e);let t=new Promise(t=>this.waiters.push({target:e,resolve:t}));return this.kick(),t}discard(){this.halt()}close(){if(this.stopped)return;let e=[...this.batch??[],...this.pending.map(e=>e.e)],t=this.ready;if(this.halt(),!t||!e.length)return;let n=Is(e,this.limits.keepaliveBatchBytes);n.length&&this.deps.send(n,{keepalive:!0}).catch(()=>{})}halt(){this.stopped=!0,this.pending=[],this.batch=void 0,this.clearTimer(this.flushTimer),this.clearTimer(this.retryTimer),this.flushTimer=this.retryTimer=void 0,this.settle()}lastActiveSeq(){for(let e=this.pending.length-1;e>=0;e--)if(!H(this.pending[e].e))return this.pending[e].e.seq;let e=this.batch??[];for(let t=e.length-1;t>=0;t--)if(!H(e[t]))return e[t].seq;return 0}activePending(){let e=0;for(let t of this.pending)H(t.e)||e++;return e}scheduled(){if(this.activePending()>=this.limits.flushEvents){if(this.kickQueued)return;this.kickQueued=!0,queueMicrotask(()=>{this.kickQueued=!1,this.kick()})}else this.flushTimer===void 0&&(this.flushTimer=this.setTimer(()=>{this.flushTimer=void 0,this.kick()},this.limits.flushMs))}take(){let e=[],t=Ps;for(;this.pending.length&&e.length<this.limits.eventsPerBatch;){let n=this.pending[0],r=n.bytes+ +!!e.length;if(e.length&&t+r>this.limits.batchBytes)break;e.push(n.e),t+=r,this.pending.shift()}return e}kick(){if(!(!this.ready||this.stopped||this.sending||this.retryTimer!==void 0)){if(!this.batch){if(!this.pending.some(e=>!H(e.e)))return;this.batch=this.take()}this.clearTimer(this.flushTimer),this.flushTimer=void 0,this.sending=!0,this.send(this.batch)}}async send(e){let t=this.now(),n;try{n=await this.deps.send(e,{})}catch{n={status:0}}if(this.sending=!1,this.stopped||this.batch!==e)return;let r=this.now(),{status:i,body:a}=n;if(i>=200&&i<300){if(this.batch=void 0,this.attempt=0,this.acked=Math.max(this.acked,e[e.length-1].seq),typeof a?.hubAt==`number`&&this.add(Ts(`clock.sync`,{t0:Fs(t),t1:Fs(r),hubAt:a.hubAt}),!1),typeof a?.audio==`boolean`&&a.audio!==this.audio&&(this.audio=a.audio,this.deps.onAudio?.(a.audio)),this.dropped){let e=this.dropped;this.dropped=0,this.add(Ts(`error`,{where:`upload`,message:`dropped ${e} events (offline too long)`}),!1)}}else if(i===400)this.batch=void 0,this.attempt=0,this.acked=Math.max(this.acked,e[e.length-1].seq);else if(i===404||i===409||i===413){let e=typeof a?.code==`string`?a.code:i===404?`gone`:i===413?`limit`:`ended`;this.halt(),this.deps.onStop?.({status:i,code:e,...typeof a?.reason==`string`?{reason:a.reason}:{}});return}else{let e=(this.deps.backoffMs??(e=>Math.min(3e4,1e3*2**e)))(this.attempt++);this.retryTimer=this.setTimer(()=>{this.retryTimer=void 0,this.kick()},e);return}this.settle(),this.acked<this.flushTarget||this.activePending()>=this.limits.flushEvents?this.kick():this.activePending()>0&&this.flushTimer===void 0&&this.scheduled()}settle(){let e=this.waiters;this.waiters=[];for(let t of e)this.stopped||t.target<=this.acked?t.resolve():this.waiters.push(t)}},Rs=1048576,zs={label:`Record voice conversations (developer)`,description:`Saves your voice segments, transcripts, replies, timing and Concierge actions on this hub, for 7 days. Only you can see them.`,details:[`While Voice mode runs on this device: each speech segment exactly as sent to speech-to-text, what was heard and sent, the replies and what was actually spoken before you interrupted, the timing, and the Concierge's tool calls and Decisions. Not recorded: costs, other sessions' text, the replies' audio.`,`Applies the next time Voice mode starts; a device shows ● Recording while it records. Kept 7 days, then deleted; at most ${B.userBytes/Rs} MB in all (${B.recordingBytes/Rs} MB per recording, ${B.recordingsStored} recordings).`,`Secrets in known token formats are scrubbed from the text. Audio is kept even when a secret is scrubbed from the text, and secrets spoken in a way the patterns do not match stay in the text and the audio.`,`Recordings are not encrypted at rest: whoever runs this hub can read them on its disk or database. Delete is immediate.`]};function Bs(e){let t=[`B`,`KB`,`MB`,`GB`],n=Math.max(0,e),r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${r===0||n>=10?String(Math.round(n)):n.toFixed(1)} ${t[r]}`}var Vs=e=>`${Bs(e.bytes)} of ${Bs(e.capBytes)}`;function Hs(e){let t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t} s`;let n=Math.floor(t/60);return n<60?`${n} min`:`${Math.floor(n/60)} h${n%60?` ${n%60} min`:``}`}var Us={date:e=>new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`}),time:e=>new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})};function Ws(e){let t=e?.name?.trim().replace(/^@+/,``);if(t)return`@${t}`;let n=e?.directory?.replace(/[/\\]+$/,``).split(/[/\\]/).pop();return n?`OpenCode session · ${n}`:`OpenCode session`}function Gs(e,t,n=Us,r=()=>Ws(void 0)){let i=e.state===`active`;return{kind:e.kind===`concierge`?`Concierge`:`Voice`,title:e.sessionTitle||r(e.sessionID),device:e.deviceName||`a device`,started:`${n.date(e.startedAt)} ${n.time(e.startedAt)}`,length:i?`${Hs(t-e.startedAt)} · recording now`:Hs((e.endedAt??t)-e.startedAt),segments:`${e.segments} segment${e.segments===1?``:`s`}`,size:Bs(e.bytes),expires:`deleted on ${n.date(e.expiresAt)}`,active:i,...e.audio?{}:{note:`no audio (storage full)`}}}function Ks(e){let t=e,n=new Set;return{get:()=>t,set(e){t=e;for(let e of[...n])e()},subscribe(e){return n.add(e),()=>n.delete(e)}}}var U={on:!1,audio:!0},qs=Ks(U),Js=e=>e.audio?`Recording`:`Recording · no audio (storage full)`,Ys=e=>e.on?` · recording`:``,Xs=Ks({}),Zs=5e3,Qs=new Set([`stored`,`skipped-cap`,`failed`,`off`]),$s=e=>e&&Qs.has(e)?e:void 0,ec=()=>{let e=globalThis.crypto;if(e?.randomUUID)return e.randomUUID();let t=Array.from({length:32},()=>Math.floor(Math.random()*16).toString(16)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-4${t.slice(13,16)}-a${t.slice(17,20)}-${t.slice(20)}`},tc=(e,t=!1)=>({method:`POST`,credentials:`same-origin`,headers:{"content-type":`application/json`},body:JSON.stringify(e),...t?{keepalive:!0}:{}}),W;function nc(e){e?.type===`recording`&&(e.settings&&typeof e.settings.enabled==`boolean`&&rc(e.settings),W?.onMessage(e))}function rc(e){Xs.set({supported:!0,settings:e}),e.enabled||W?.turnedOff()}function ic(e,t){W?.event(e,t)}var ac=class{fetch;now;epoch;limits;take;running=!1;rolled=!1;sessionID=``;client={};retried=new Set;audio=!0;onNote;constructor(e={}){this.fetch=e.fetch??((e,t)=>globalThis.fetch(e,{credentials:`same-origin`,...t})),this.now=e.now??(()=>performance.now()),this.epoch=e.epoch??(()=>Date.now()),this.limits=e.limits}get recordingID(){let e=this.take;return e?.id&&!e.uploader.stopped?e.id:void 0}get active(){return this.recordingID!==void 0}get buffered(){return this.take?.uploader.buffered??0}start(e,t={}){if(this.running)return;this.running=!0,this.rolled=!1,this.sessionID=e;let n=globalThis.navigator;this.client={platform:Ds(n?.userAgent??``),...t},W=this,this.indicate(U),this.begin()}event(e,t){try{this.take?.uploader.record(Ts(e,t))}catch{}}record(e){try{this.take?.uploader.record(e)}catch{}}transcribeHeaders(e){let t=this.recordingID;return t?{[_s]:t,[vs]:String(e)}:{}}speakHeaders(e){let t=this.recordingID;return t&&e?{[_s]:t,[ys]:Es(e)}:{}}segmentAudio(e,t,n){let r=this.recordingID;t===`failed`&&r&&!this.retried.has(e)&&(this.retried.add(e),this.fetch(`/api/recordings/${encodeURIComponent(r)}/segments/${e}`,{method:`PUT`,credentials:`same-origin`,headers:{"content-type":`audio/wav`},body:n}).catch(()=>{}))}async stop({keepalive:e=!1,reason:t=`stopped`}={}){if(!this.running)return;this.running=!1,W===this&&(W=void 0);let n=this.take;this.take=void 0,this.indicate(U),n&&(e?(n.uploader.close(),n.id&&this.end(n.id,t,!0)):(await n.started,n.id&&!n.uploader.stopped&&(await Promise.race([n.uploader.flush(),new Promise(e=>setTimeout(e,Zs))]),n.uploader.close(),await this.end(n.id,t,!1))))}turnedOff(){let e=this.take;e&&(e.uploader.discard(),this.take=void 0,this.indicate(U))}onMessage(e){if(e?.type!==`recording`)return;e.settings?.enabled===!1&&this.turnedOff();let t=this.take;if(t?.id&&e.recordingID===t.id){if(typeof e.audio==`boolean`&&this.audioChanged(t,e.audio),e.state===`deleted`)t.uploader.discard(),this.take=void 0,this.indicate(U);else if(e.state===`ended`){if(e.reason===`conversation_off`)return;t.uploader.discard(),this.ended(t,{status:409,code:`recording_ended`,...typeof e.reason==`string`?{reason:e.reason}:{}})}}}begin(){let e;e={uploader:new Ls({send:(t,{keepalive:n})=>this.sendEvents(e,t,!!n),now:this.now,onStop:t=>this.ended(e,t),onAudio:t=>this.audioChanged(e,t),...this.limits?{limits:this.limits}:{}}),started:Promise.resolve()},this.take=e,e.started=this.open(e).catch(()=>e.uploader.discard())}async open(e){let t;try{let n=await this.fetch(`/api/settings/recording`);if(n.status===404||n.status===405)return Xs.set({supported:!1}),e.uploader.discard();if(n.ok){let{settings:e}=await n.json();e&&Xs.set({supported:!0,settings:e}),t=e?.enabled}}catch{}if(t===!1||this.take!==e||!this.running)return e.uploader.discard();let n={perf:this.now(),epoch:this.epoch()},r=this.now(),i=0,a;try{let e=await this.fetch(`/api/recordings`,tc({sessionID:this.sessionID,clientID:ec(),anchor:n,client:this.client}));i=e.status,a=await e.json().catch(()=>({}))}catch{}let o=this.now(),s=Ms(i,a);s.kind===`started`?(e.id=s.recording.id,this.audio=s.audio,e.uploader.open(s.hubAt===void 0?void 0:{t0:r,t1:o,hubAt:s.hubAt}),this.take===e&&this.running&&this.indicate({on:!0,audio:this.audio,sessionID:this.sessionID,recordingID:e.id})):(e.uploader.discard(),s.kind===`failed`&&t===!0&&this.take===e&&this.running&&this.onNote?.(`Not recording: ${s.reason}`))}async sendEvents(e,t,n){let r=await this.fetch(`/api/recordings/${encodeURIComponent(e.id??``)}/events`,tc({events:t},n));return{status:r.status,body:await r.json().catch(()=>({}))}}end(e,t,n){return this.fetch(`/api/recordings/${encodeURIComponent(e)}/end`,tc({reason:t},n)).then(()=>{},()=>{})}ended(e,t){if(this.take!==e)return;this.take=void 0;let n=t.reason;if(n===`max_duration`&&this.running&&!this.rolled){this.rolled=!0,this.indicate(U),this.begin();return}let r=t.code===`limit`||n===`limit`?`Recording stopped: limit reached`:void 0;this.indicate(r?{...U,note:r}:U),r&&this.onNote?.(r)}audioChanged(e,t){if(this.take!==e||t===this.audio)return;this.audio=t;let n=qs.get();n.on&&n.recordingID===e.id&&this.indicate({...n,audio:t})}indicate(e){qs.set(e)}};async function oc(e,t,n={}){let r=await(n.fetch??((e,t)=>globalThis.fetch(e,{credentials:`same-origin`,...t})))(`/api/recordings/${encodeURIComponent(e)}/segments/${t}`);if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(typeof e.error==`string`&&e.error?e.error:`HTTP ${r.status}`)}let i=await r.blob(),a=(n.createURL??(e=>URL.createObjectURL(e)))(i),o=n.revokeURL??(e=>URL.revokeObjectURL(e)),s=!1,c=()=>{s||(s=!0,o(a))},l=(n.audio??(()=>new Audio))();l.addEventListener(`ended`,c),l.addEventListener(`error`,c),l.src=a;try{await l.play()}catch(e){throw c(),e}}var[G,K]=Yn(ta()),sc=new la,[cc,lc]=i(0),uc=cc,[dc,fc]=i(),[pc,mc]=i(),[hc,gc]=i(),[_c,vc]=i([]),[yc,bc]=i([]),[xc,Sc]=i(new Map),Cc=xc,wc=200;function Tc(e){e.length&&Sc(t=>{let n=new Map(t);for(let t of e)n.delete(t.id),n.set(t.id,t);for(;n.size>wc;)n.delete(n.keys().next().value);return n})}var[Ec,Dc]=i(),[q,Oc]=i(!1),[kc,Ac]=i(!1),jc=()=>Va(q(),kc(),G.machines!==void 0),[Mc,Nc]=i();r(()=>a(()=>{let e=Mc(),t=Ko(e,Date.now());if(t===void 0)return;let n=setTimeout(()=>Nc(t=>t===e?qo(t,Date.now()):t),t+50);c(()=>clearTimeout(n))}));var Pc=r(()=>o(()=>{let e=dc();if(!e)return[];try{return Ka(localStorage.getItem(Wa(e.user?.id)))}catch{return[]}}));r(()=>a(()=>{let e=Ec(),t=dc();if(q()&&t)try{localStorage.setItem(Wa(t.user?.id),JSON.stringify((e?.hiddenSessionIDs??[]).slice(-20)))}catch{}}));var Fc=r(()=>o(()=>za(Ec(),G.machines,q()?[]:Pc()),void 0,{equals:(e,t)=>e.size===t.size&&[...e].every(e=>t.has(e))}));n(()=>Fc());var[Ic,Lc]=i([]),[Rc,zc]=i(new Map),Bc=new Set;async function Vc(){try{zc(new Map(It(await u(`/api/agent/grants`)).map(e=>[e.id,e])))}catch{}}var Hc=e=>Rc().get(e),Uc=new Set;function Wc(e){return Uc.add(e),()=>Uc.delete(e)}var Gc=r(()=>o(e=>pi(e,fi(G.machines,G.prefs,G.reads,Fc())))),J=e=>aa(G.machines,e),Kc=e=>Fc().has(e)?`the Concierge`:J(e)?.session.title||void 0,[qc,Jc]=i(new Map);async function Yc(){try{let e=await u(`/api/agent/who`),t=Array.isArray(e?.sessions)?e.sessions:[];Jc(new Map(t.flatMap(e=>e&&typeof e==`object`&&typeof e.sessionID==`string`&&typeof e.name==`string`&&e.name?[[e.sessionID,e.name]]:[])))}catch{}}function Xc(e){if(Fc().has(e))return yt(e,void 0,!0);let t=J(e)?.session,n=qc().get(e);if(!n)for(let t of Cc().values())t.from.kind===`session`&&t.from.sessionID===e&&t.from.name&&(n=t.from.name);return yt(e,{name:n,title:t?.title,directory:typeof t?.project==`string`&&t.project||t?.directory})}var Y=new xr;p(()=>{ee().name!==`pair`&&(gl(),fc(void 0),Zc())});function Zc(){let e=location.pathname+location.search;t(`/pair${e===`/`||e.startsWith(`/pair`)?``:`?next=${f(e)}`}`,{replace:!0})}async function Qc(){if(dc())return!0;let e=await fetch(`/api/me`,{credentials:`same-origin`});if(e.status===401)return Zc(),!1;if(!e.ok)throw Error(`HTTP ${e.status}`);return fc(await e.json()),!0}async function $c(){if(pc()!==void 0)return pc()??null;try{let e=await fetch(`/api/auth`,{credentials:`same-origin`}),t=e.ok?await e.json():null;return mc(t),t}catch{return null}}var X,el,tl=1e3,nl=()=>!1,rl={lite:!1},[il,al]=i(``),ol,sl=!1,Z=new da({setTimer:(e,t)=>setTimeout(e,t),clearTimer:e=>clearTimeout(e),open:(e,t)=>ml(e,t),close:()=>pl(),keepOpen:()=>nl()});function cl(e){nl=e}function ll(e){rl=e,Z.setScope(e)}var ul=!1;function dl(){ul||(ul=!0,document.addEventListener(`visibilitychange`,()=>document.visibilityState===`hidden`?Z.hidden():Z.visible()),window.addEventListener(`pageshow`,e=>{e.persisted&&Z.state!==`stopped`&&Z.reopen()}),window.addEventListener(`online`,()=>Z.state===`open`&&G.connection===`down`&&Z.reopen()))}function fl(e={lite:!1}){Z.state===`stopped`&&(dl(),rl=e,Z.start(e),q()||(Sl(),setTimeout(()=>!q()&&Ac(!0),Ba)),document.visibilityState===`hidden`&&Z.hidden())}function pl(){clearTimeout(el),X?.close(),X=void 0,Z.state===`paused`&&K(`connection`,`paused`)}function ml(e,t){clearTimeout(el),X?.close();let n=fa(G.connection,t);sl=n.reconnecting,n.reconnecting&&hl(`reconnecting`),K(`connection`,n.connection),ms(rl);let r=new EventSource(e,{withCredentials:!0});X=r,r.onopen=()=>{tl=1e3,K(`connection`,`live`),sl&&hl(`updated`,2e3),sl=!1,Il(),vl(),jl(),El(),Yc(),Vc(),Sl()},r.onerror=async()=>{X===r&&(K(`connection`,`down`),(await fetch(`/api/me`,{credentials:`same-origin`}).catch(()=>void 0))?.status===401?(gl(),fc(void 0),Zc()):r.readyState===EventSource.CLOSED&&X===r&&(X=void 0,el=setTimeout(()=>Z.state===`open`&&Z.reopen(),tl),tl=Math.min(3e4,tl*2)))},r.addEventListener(`ping`,()=>Z.received()),r.onmessage=e=>{Z.received(e.lastEventId||void 0);let t;try{t=JSON.parse(e.data)}catch{return}_l(t)}}function hl(e,t){clearTimeout(ol),al(e),t&&(ol=setTimeout(()=>al(``),t))}function gl(){Z.stop(),X?.close(),X=void 0,clearTimeout(el)}function _l(e){d(()=>{if(hs(e),e.type===`prefs`?(K(A(t=>ia(t,e))),G.prefsStale&&!G.prefsPending&&Ll()):e.type===`catalog`?K(A(t=>{ia(t,e),Y.apply(t.machines,Date.now())})):K(A(t=>ia(t,e))),e.type===`status`){let t=J(e.sessionID);!sc.has(e.sessionID)&&t&&sc.feed(e.sessionID)}if(sc.apply(e)!==void 0&&lc(e=>e+1),e.type===`enrollment`&&jl(),e.type===`recording`&&nc(e),e.type===`decision`){let t=Re(e.decision);t&&($.event(t),bc(e=>Ve(e,t)),Tc([t]))}if(e.type===`concierge`){let t=La(e.status);t&&(Nc(e=>Wo(Ec(),t,e)),Dc(t),Oc(!0),bl++);let n=Do(e.armed);n!==void 0&&(wl.event(),Nc(n))}if(e.type===`agent`){let t=qt(e.entry);t&&Lc(e=>Tn(e,t)),t?.grant&&!Rc().has(t.grant)&&!Bc.has(t.grant)&&(Bc.add(t.grant),Vc())}if(e.type===`resync`&&(vl(),Ll(),jl(),El(),Yc(),Vc(),Sl()),e.type===`handoff`&&(ee().name!==`session`||ee().id!==e.sessionID)){let n=J(e.sessionID);_(`Handed off: ${n?.session.title||e.sessionID}`,``,{label:`Open`,run:()=>t(`/s/${f(e.sessionID)}`)})}});for(let t of Uc)t(e)}async function vl(){try{let{reads:e}=await u(`/api/reads`);K(`reads`,e??{})}catch{}}async function yl(e){try{let{reads:t}=await(await h(`${l(e)}/read`,{method:`POST`,json:{}})).json();t&&typeof t==`object`&&K(`reads`,t)}catch{}}var bl=0,Q,xl;function Sl(){return Q?(xl??=Q.then(()=>(xl=void 0,Sl())),xl):(Q=Cl().finally(()=>Q=void 0),Q)}async function Cl(){let t=bl;try{let e=Ra(await u(`/api/agent/concierge`));e&&t===bl&&Dc(e.status)}catch(n){n instanceof e&&n.status===404&&t===bl&&Dc(void 0);return}finally{Oc(!0)}await Tl()}var wl=new Jo;async function Tl(){let t=wl.begin();try{let e=Do((await u(`/api/agent/concierge/arm`)).armed);wl.fresh(t)&&e!==void 0&&Nc(qo(e,Date.now()))}catch(n){wl.fresh(t)&&n instanceof e&&(n.status===404||n.status===403)&&Nc(void 0)}}var $=new Ye;async function El(){let t=$.begin();try{let{decisions:e}=await u(`/api/decisions?state=open`),n=$.settle(t,(e??[]).map(Re).filter(e=>!!e));if(!n)return;bc(n),Tc(n)}catch(n){$.fail(t),n instanceof e&&n.status===404&&bc([])}}var Dl=new Na({fetch:e=>u(`/api/decisions/${f(e)}`),parse:e=>Re(e?.decision)??void 0,status:t=>t instanceof e?t.status:void 0});function Ol(e){let t=xc().get(e);return t?Promise.resolve(t):Dl.recall(e).then(t=>(t&&!xc().has(e)&&Tc([t]),t))}function kl(e){$.event(e),bc(t=>Ve(t,e)),Tc([e])}function Al(e){let t=yc().find(t=>t.id===e);t&&$.event({...t,state:`closed`}),bc(t=>t.filter(t=>t.id!==e)),El()}async function jl(){if(!y(dc()))vc([]);else try{vc((await u(`/api/enrollments`)).enrollments??[])}catch{vc([])}}async function Ml(){try{gc((await u(`/api/settings/speech`)).ready??null)}catch{gc(null)}}var Nl=`voice.viewPrefs`,Pl=!1,Fl=()=>G.prefsSource===`hub`||G.prefsSource===`local`;async function Il(){if(!(Fl()||Pl)){Pl=!0;try{K({prefs:vr(await u(`/api/prefs/view`)),prefsSource:`hub`})}catch(t){if(t instanceof e&&t.status===404){let e;try{e=JSON.parse(localStorage.getItem(Nl)??`null`)}catch{}K({prefs:vr(e),prefsSource:`local`})}else K(`prefsSource`,`error`)}finally{Pl=!1}Fl()&&await Rl()}}async function Ll(){K({prefsStale:!1,prefsSource:`unknown`}),await Il()}async function Rl(){let{clear:e,patch:t}=Tr(localStorage.getItem(`voice.pins`),localStorage.getItem(`voice.pinnedWorkspaces`),G.prefs);e&&(t&&(K(`prefs`,e=>({...e,...t})),!(await zl(t)).ok)||(localStorage.removeItem(`voice.pins`),localStorage.removeItem(`voice.pinnedWorkspaces`)))}async function zl(e){if(G.prefsSource===`local`)return localStorage.setItem(Nl,JSON.stringify(G.prefs)),{ok:!0};K(`prefsPending`,e=>e+1);try{let t=await(await h(`/api/prefs/view`,{method:`PUT`,json:e})).json().catch(()=>void 0);return G.prefsPending===1&&t&&!G.prefsStale&&K(`prefs`,vr(t)),{ok:!0}}catch(e){return{ok:!1,error:e}}finally{K(`prefsPending`,e=>e-1),!G.prefsPending&&G.prefsStale&&Ll()}}function Bl(e,t,n,r={}){Vl(e,[t],n,r)}function Vl(e,t,n,{message:r,undo:i=!1}={}){if(!Fl()){_(`Your view settings are still loading. Try again in a moment.`,`err`),Il();return}let a=new Set(G.prefs[e]),o=t.filter(e=>a.has(e)!==n),{prefs:s,patch:c}=Cr(G.prefs,e,o,n);c&&(K(`prefs`,s),r&&_(r,``,i?{label:`Undo`,run:()=>Vl(e,o,!n)}:void 0),zl(c).then(({ok:t,error:r})=>{t||(K(`prefs`,Cr(G.prefs,e,o,!n).prefs),_(`Could not save that change: ${m(r)}`,`err`))}))}async function Hl(e,t){try{return await h(`${l(e)}/expose`,{method:`POST`,json:{on:t}}),_(t?`Voice enabled`:`Voice disabled`),!0}catch(e){return _(`Could not ${t?`enable`:`disable`} Voice: ${m(e)}`,`err`),!1}}async function Ul(e,t){let n=yr(t);if(`error`in n)return _(n.error,`err`),!1;let{title:r}=n,i=J(e)?.session.title;if(i===r)return!1;Y.set(e,r,Date.now()),K(A(t=>void br(t.machines,e,r)));try{let t=await(await h(`${l(e)}/rename`,{method:`POST`,json:{title:r}})).json().catch(()=>void 0),n=typeof t?.title==`string`&&t.title?t.title:r;return n!==r&&J(e)?.session.title===r&&(Y.drop(e,r),Y.set(e,n,Date.now()),K(A(t=>void br(t.machines,e,n)))),!0}catch(t){return Y.drop(e,r),i!==void 0&&J(e)?.session.title===r&&K(A(t=>void br(t.machines,e,i))),_(`Could not rename: ${m(t)}`,`err`),!1}}var[Wl,Gl]=i(new Set),Kl=e=>Wl().has(e),ql=(e,t)=>Gl(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r}),Jl=6e4;async function Yl(e){if(Kl(e))return;let t=J(e)?.session.title;ql(e,!0);let n=!1;try{let r=await(await h(`${l(e)}/rename`,{method:`POST`,json:{auto:!0}})).json().catch(()=>void 0);if(r?.pending){n=!0,_(`OpenCode is still naming it; the title changes when it's ready`);let r=Date.now()+Jl,i=()=>{let n=J(e)?.session.title;n!==void 0&&n!==t?(ql(e,!1),_(`Renamed to “${n}”`)):Date.now()>=r?ql(e,!1):setTimeout(i,500)};setTimeout(i,500);return}let i=typeof r?.title==`string`?r.title:void 0;if(r?.unchanged||!i||i===t){_(`OpenCode kept the title`);return}Y.set(e,i,Date.now()),K(A(t=>void br(t.machines,e,i))),_(`Renamed to “${i}”`)}catch(e){_(`Could not auto-name: ${m(e)}`,`err`)}finally{n||ql(e,!1)}}async function Xl(e){try{await h(`${l(e)}/error/dismiss`,{method:`POST`,json:{}})}catch(e){_(`Could not dismiss the error: ${m(e)}`,`err`)}}async function Zl(e){try{let{stopped:t}=await(await h(`${l(e)}/stop`,{method:`POST`,json:{}})).json(),n=Array.isArray(t)?t.length:0;_(n?`Stopped ${n} session${n===1?``:`s`}`:`Nothing was running`)}catch(e){_(`Could not stop: ${m(e)}`,`err`)}}export{Ys as $,Nt as $n,Da as $t,Wc as A,oi as An,Me as Ar,ro as At,hc as B,ir as Bn,ge as Br,co as Bt,uc as C,Ci as Cn,Je as Cr,jo as Ct,J as D,li as Dn,Re as Dr,Ga as Dt,Ml as E,Oi as En,He as Er,Qa as Et,fc as F,ei as Fn,Se as Fr,vo as Ft,ac as G,C as Gn,be as Gr,uo as Gt,gl as H,Yn as Hn,he as Hr,Ya as Ht,gc as I,ni as In,le as Ir,bo as It,oc as J,Dn as Jn,Pa as Jt,$s as K,Tt as Kn,io as Kt,ll as L,Gr as Ln,pe as Lr,xo as Lt,Ul as M,Yr as Mn,ae as Mr,ao as Mt,Gc as N,Kr as Nn,ie as Nr,so as Nt,yl as O,ui as On,Ge as Or,ho as Ot,Kc as P,Jr as Pn,se as Pr,_o as Pt,rc as Q,Pt as Qn,pa as Qt,Hl as R,Wr as Rn,ve as Rr,go as Rt,sc as S,Si as Sn,mt as Sr,Bo as St,jl as T,bi as Tn,qe as Tr,fo as Tt,Zl as U,Qn as Un,ue as Ur,Ra as Ut,fl as V,sr as Vn,fe as Vr,oo as Vt,il as W,D as Wn,xe as Wr,Ha as Wt,qs as X,sn as Xn,ba as Xt,ic as Y,kt as Yn,Aa as Yt,Xs as Z,_n as Zn,Ea as Zt,Hc as _,Zi as _n,Ct as _r,Vo as _t,Vl as a,Hi as an,Kt as ar,bs as at,G as b,ki as bn,ft as br,Lo as bt,q as c,Mi as cn,Dt as cr,us as ct,Cc as d,Ni as dn,Mt as dr,No as dt,ka as en,kn as er,zs as et,Xl as f,Ki as fn,Ft as fr,Oo as ft,Qc as g,Gi as gn,St as gr,Po as gt,_c as h,ea as hn,Fn as hr,ko as ht,Bl as i,Vi as in,Bt as ir,Vs as it,Ol as j,si as jn,Fe as jr,eo as jt,dc as k,di as kn,Te as kr,mo as kt,jc as l,Bi as ln,Ot as lr,es as lt,Al as m,Xi as mn,On as mr,Io as mt,Yl as n,ca as nn,Pn as nr,Gs as nt,Ec as o,Ai as on,En as or,cs as ot,Xc as p,Yi as pn,It as pr,Ro as pt,Js as q,jn as qn,Ja as qt,Kl as r,Ui as rn,Gt as rr,Ws as rt,Mc as s,ji as sn,An as sr,ls as st,Ic as t,sa as tn,Vt as tr,js as tt,yc as u,Li as un,Jt as ur,Ho as ut,Fc as v,Qi as vn,wt as vr,Uo as vt,$c as w,Ti as wn,Ke as wr,$a as wt,cl as x,Di as xn,ct as xr,Yo as xt,Pc as y,N as yn,bt as yr,Go as yt,kl as z,Br as zn,y as zr,Za as zt};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.awb{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.av-page{height:100%}.awb.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.awb.resizing iframe{pointer-events:none}.awb-side{border-left:1px solid var(--line);background:var(--bg);flex-direction:column;flex:none;min-height:0;display:flex;position:relative}.awb-side[hidden]{display:none}.awb-side>.aai{flex:1}.awb-resize{z-index:2;cursor:col-resize;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.awb-resize:after{content:"";background:0 0;width:2px;transition:background .15s;position:absolute;top:0;bottom:0;left:3px}.awb-resize:hover:after,.awb-resize:focus-visible:after,.awb.resizing .awb-resize:after{background:var(--accent)}.awb-resize:focus-visible{outline:none}.awb-side.sheet{z-index:25;border:1px solid var(--line-2);height:min(78%,680px);box-shadow:0 -12px 40px var(--shadow);border-bottom:0;border-radius:16px 16px 0 0;position:absolute;bottom:0;left:0;right:0;overflow:hidden}.awb-grab{background:var(--line-2);border-radius:2px;flex:none;width:36px;height:4px;margin:6px auto 0}.awb-scrim{z-index:24;background:color-mix(in srgb, var(--bg) 45%, transparent);position:absolute;inset:0}.awb-ai-toggle{border:1px solid var(--line-2);background:var(--raise);height:30px;color:var(--text);font:600 .75rem/1 var(--sans);cursor:pointer;border-radius:999px;flex:none;align-items:center;gap:5px;margin-left:4px;padding:0 10px 0 8px;display:inline-flex}.awb-ai-toggle .icon{color:var(--accent)}.awb-ai-toggle:hover{background:var(--raise-2)}.awb-ai-toggle[aria-pressed=true]{background:color-mix(in srgb, var(--accent) 14%, var(--raise));border-color:color-mix(in srgb, var(--accent) 45%, var(--line-2))}.awb-ai-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.awb-badge{background:var(--accent);min-width:16px;height:16px;color:var(--accent-ink);border-radius:999px;place-items:center;padding:0 4px;font-size:.625rem;display:inline-grid}.awb.narrow .awb-ai-toggle{height:34px}.cmp-interactive{flex-direction:column;display:flex}.cmp-interactive .artifact-host{gap:0}.cmp-interactive .artifact-host-note{display:none}.cmp-interactive .artifact-host-status{padding:12px 16px}.cmp-interactive .artifact-host-frame{border:0;border-radius:0;min-height:360px}.cmp-disclose{border-top:1px solid var(--line);background:var(--side);color:var(--faint);align-items:flex-start;gap:8px;margin:0;padding:8px 14px;font-size:.75rem;display:flex}.cmp-disclose .icon{flex:none;width:14px;height:14px;margin-top:2px}.cmp-disclose strong{color:var(--muted);font-weight:600}.cmp-consent{flex-direction:column;gap:10px;display:flex}.cmp-card{border:1px solid color-mix(in srgb, var(--accent) 55%, var(--line));background:var(--raise);box-shadow:0 2px 8px var(--shadow);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px 12px;font-size:.8125rem;display:flex}.cmp-card-head{align-items:center;gap:8px;margin:0;display:flex}.cmp-card-icon{background:color-mix(in srgb, var(--accent) 12%, transparent);width:24px;height:24px;color:var(--accent);border-radius:6px;flex:none;place-items:center;display:inline-grid}.cmp-instruction{border-left:3px solid var(--accent);background:var(--side);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:0 8px 8px 0;max-height:12em;margin:0;padding:6px 10px;font-family:inherit;font-size:.875rem;overflow:auto}.cmp-note{color:var(--muted);margin:0;font-size:.75rem}.cmp-note.err{color:var(--err)}.cmp-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.cmp-card .aai-picker{flex:none}.cmp-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.cmp-done{color:var(--muted);align-items:flex-start;gap:6px;margin:0;font-size:.75rem;display:flex}.cmp-done .icon{width:14px;height:14px;color:var(--faint);flex:none;margin-top:2px}.cmp-quote{overflow-wrap:anywhere;font-style:italic}.cmp-page-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.cmp-start{flex-direction:column;gap:10px;display:flex}.cmp-start label{flex-direction:column;gap:2px;display:flex}.cmp-empty{flex-direction:column;gap:8px;padding:24px;display:flex}@media (max-width:640px){.cmp-actions .btn{min-height:40px}}.awb.pane .pane-tools{border-left:1px solid var(--line);align-items:center;margin-left:2px;padding-left:4px;display:inline-flex}.ws-section .link-btn{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.ws-list{margin:0;padding:0;list-style:none}.ws-item{margin:2px 0 6px}.ws-head{width:100%;min-height:30px;color:var(--text);cursor:pointer;text-align:left;font:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;padding:0 8px;display:flex}.ws-head:hover{background:var(--raise-2)}.ws-head .icon{width:14px;height:14px;color:var(--muted);flex:none}.ws-title{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.ws-goal{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0 8px 2px 28px;font-size:.75rem;display:-webkit-box;overflow:hidden}.ws-panel{padding:2px 0 2px 8px}.ws-notice{min-height:0;color:var(--muted);margin:0 8px;font-size:.7188rem}.ws-notice:empty{display:none}.ws-tree{margin:0;padding:0;list-style:none}.ws-node{--ws-depth:0;padding-left:calc(var(--ws-depth) * 14px);border-radius:6px;outline:none;position:relative}.ws-node:focus-visible>.ws-row{box-shadow:0 0 0 2px var(--accent) inset}.ws-node.away .ws-member{color:var(--muted)}.ws-node.dragged{opacity:.5}.ws-node.drop-inside>.ws-row{background:var(--raise-2);box-shadow:0 0 0 1px var(--accent) inset}.ws-node.drop-before>.ws-row{box-shadow:0 -2px 0 var(--accent)}.ws-node.drop-after>.ws-row{box-shadow:0 2px 0 var(--accent)}.ws-node[draggable=true]>.ws-row{cursor:grab}.ws-row{border-radius:6px;align-items:center;gap:6px;min-height:28px;padding:0 2px 0 8px;display:flex}.ws-row:hover{background:var(--raise-2)}.ws-member{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text);flex:auto;font-size:.8125rem;text-decoration:none;overflow:hidden}.ws-meta{color:var(--faint);flex-wrap:wrap;align-items:center;gap:3px 4px;margin:0 8px 2px 30px;font-size:.6875rem;display:flex}.ws-badge{border:1px solid var(--line-2);color:var(--muted);white-space:nowrap;border-radius:6px;padding:2px 4px;font-size:.625rem;line-height:1}.ws-badge.master{color:var(--accent);border-color:var(--accent)}.ws-badge.offline{color:var(--err);border-color:var(--err)}.ws-keys{color:var(--faint);margin:0 8px 2px 30px;font-size:.6875rem}.ws-rel a{color:inherit}.ws-assignments{color:var(--muted);margin:0 8px 2px 30px;padding:0;font-size:.7188rem;list-style:none}.ws-assignment-status{color:var(--faint)}.ws-assignment.blocked .ws-assignment-status{color:var(--warn)}.ws-controls{color:var(--muted);margin:0 8px 4px 30px;font-size:.6875rem}.ws-controls summary{cursor:pointer;color:var(--faint)}.ws-controls p,.ws-controls ul{margin:4px 0}.ws-controls ul{padding-left:14px}.ws-root-drop{border:1px dashed var(--line-2);text-align:center;color:var(--muted);border-radius:6px;margin:4px 8px;padding:6px;font-size:.7188rem}.ws-root-drop.over{border-color:var(--accent);color:var(--accent)}.ws-keys{margin-left:8px}.feature-nav ul,.nav-rail-links ul{margin:0;padding:0;list-style:none}.nav-link .icon{flex:none}.nav-link:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-link.active{color:var(--text)}.nav-link.disabled{opacity:.5;cursor:default}.nav-link.disabled:hover{background:0 0}.side-sessions{flex-direction:column;flex:1;min-height:0;display:flex}.nav-rail{background:var(--side);border-right:1px solid var(--line);flex-direction:column;flex:none;align-items:center;gap:6px;width:48px;padding:9px 0;display:flex}.nav-rail-links ul{flex-direction:column;gap:2px;display:flex}.nav-rail .nav-link{justify-content:center;width:32px;height:32px;margin:0;padding:0}.feature-page{flex-direction:column;flex:1;min-height:0;display:flex}.feature-scroll{flex:1;min-height:0;overflow:auto}.feature-body{max-width:980px;margin:0 auto;padding:16px 20px 40px}.feature-note{color:var(--muted)}@media (max-width:760px){.feature-body{padding:12px 14px 40px}}.side-top-actions{align-items:center;gap:2px;display:flex}.concierge-btn{position:relative}.concierge-btn.on{background:var(--raise-2);color:var(--accent)}.concierge-btn.ind-off{color:var(--muted)}.concierge-btn.ind-running{color:var(--accent)}.concierge-ind{border:1px solid var(--side);pointer-events:none;border-radius:50%;width:8px;height:8px;position:absolute;top:4px;right:4px}.concierge-ind.ind-off{background:var(--muted);opacity:.7}.concierge-ind.ind-busy{background:var(--warn)}.concierge-ind.ind-attention{background:var(--err);color:#fff;place-items:center;width:14px;height:14px;font-size:10px;font-weight:700;line-height:1;display:grid;top:1px;right:1px}.side-top{container:side-top/inline-size}.concierge-btn.labelled{align-items:center;gap:4px;width:auto;min-width:30px;padding-inline:6px;display:inline-flex}.concierge-btn-text{font-size:.8125rem;font-weight:500;display:none}@container side-top (width>=200px){.concierge-btn-text{display:inline}.concierge-btn.labelled .concierge-ind{left:16px;right:auto}.concierge-btn.labelled .concierge-ind.ind-attention{top:-1px;left:12px}}.concierge-panel{background:var(--bg);outline:none;flex-direction:column;min-height:0;display:flex}.concierge-panel.side{height:100%;width:var(--concierge-w,min(440px, 40vw));border-left:1px solid var(--line);min-width:0;box-shadow:-12px 0 32px var(--shadow);flex:none;position:relative}.concierge-panel.page{flex:1;width:100%}.concierge-head{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:8px;min-height:max(48px,2.4rem);padding:8px 10px 8px 14px;display:flex}.concierge-head .title{margin:0;font-size:.9375rem;font-weight:600}.concierge-title{min-width:0}.concierge-status{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.concierge-mark{color:var(--accent);flex:none}.concierge-notice{border-radius:var(--r);border:1px solid color-mix(in srgb, var(--warn) 40%, var(--line));color:var(--warn);background:color-mix(in srgb, var(--warn) 8%, var(--bg));margin:8px 12px 0;padding:8px 10px;font-size:.8125rem}.concierge-notice.err{border-color:color-mix(in srgb, var(--err) 40%, var(--line));color:var(--err);background:color-mix(in srgb, var(--err) 7%, var(--bg))}.concierge-asked{flex-direction:column;gap:8px;margin-top:8px;padding:0 12px;display:flex}.concierge-scroll{overscroll-behavior:contain;flex:1;min-height:0;padding:8px 12px;overflow-y:auto}.concierge-scroll .transcript{max-width:none}.concierge-idle{flex-direction:column;flex:1;justify-content:flex-end;display:flex}.concierge-dock{border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom));flex-direction:column;flex:none;gap:6px;display:flex}.concierge-idle .concierge-composer{margin:8px 12px calc(8px + env(safe-area-inset-bottom))}.concierge-composer{align-items:flex-end;gap:6px;display:flex}.concierge-composer textarea{resize:none;min-height:36px;max-height:200px;font:inherit;flex:1;line-height:1.4}.concierge-composer textarea:disabled{opacity:.6}.concierge-composer .btn.primary:disabled{background:var(--raise-2);color:var(--faint);border-color:var(--line);opacity:1;cursor:not-allowed}.concierge-voice.on{background:var(--accent);color:var(--accent-ink);border-radius:var(--r)}.armed-decision{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent);margin:8px 12px 0}.armed-question{white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0;font-size:.9375rem}.armed-options{flex-wrap:wrap;gap:8px;margin:8px 0 4px;display:flex}.armed-options .btn{min-height:40px;padding:0 18px}.armed-hint{margin:4px 0 0}.armed-left{font-variant-numeric:tabular-nums}@media (max-width:760px){.concierge-head{padding-left:6px}.armed-options .btn{flex:1}}#concierge-quiet .row,#concierge-digests li.row{flex-wrap:wrap;align-items:center;gap:8px}#concierge-quiet .text-field{flex-direction:row;align-items:center;gap:6px}.digest-days{flex-wrap:wrap;flex:1;gap:4px 10px;display:flex}.digest-days .check{align-items:center;gap:3px;display:inline-flex}#concierge-watchlist input[type=number]{width:6em}.concierge-panel .decision.flash{animation:1.2s ease-out 2 concierge-flash}@keyframes concierge-flash{0%{box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 60%, transparent)}to{box-shadow:0 0 #0000}}.concierge-panel .hub-update .fold-head{text-align:start;font-size:.8125rem}.concierge-panel .hub-msg-text a{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.concierge-panel .hub-update .fold-body{white-space:pre-wrap;font-size:.8125rem}#concierge{padding-bottom:72px}#concierge .stack>label.text-field{flex-direction:column;align-items:stretch;gap:4px;display:flex}#concierge .stack>label.text-field>input:not([type=number]),#concierge .stack>label.text-field>textarea,#concierge .stack>label.text-field>select,#concierge-directory>input,#concierge-model>input{box-sizing:border-box;width:100%;max-width:44rem}#concierge-model [data-concierge-models-state]:empty{display:none}#concierge #concierge-time-zone>input{max-width:20rem}#concierge-quiet .text-field input:placeholder-shown{color:var(--muted)}.closed-decision{opacity:.92;margin:8px 12px 0}.closed-decision .decision-head{align-items:center;gap:6px;display:flex}.concierge-panel a[href^="/concierge#decision-"]{-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:2px 0;display:inline}.prof-page{flex-direction:column;height:100%;min-height:0;display:flex}.prof-body{flex:1;min-height:0;display:flex}.prof-list{border-right:1px solid var(--line);flex-direction:column;flex:none;gap:8px;width:280px;padding:10px 8px;display:flex;overflow:auto}.prof-filter{gap:4px;display:flex}.prof-filter .btn[aria-pressed=true]{background:var(--raise-2);border-color:var(--line-2);font-weight:600}.prof-items{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.prof-item{color:var(--text);border-radius:6px;flex-direction:column;gap:2px;padding:7px 9px;text-decoration:none;display:flex}.prof-item:hover{background:var(--raise-2)}.prof-item[aria-current=page]{background:var(--raise-2);box-shadow:0 0 0 1px var(--line-2) inset}.prof-item .prof-sub{color:var(--muted);font-size:.75rem}.prof-detail{flex:1;min-width:0;padding:16px 24px 48px;overflow:auto}.prof-detail h2{font:400 1.25rem var(--serif);margin:0}.prof-detail h3{color:var(--muted);margin:18px 0 6px;font-size:.8125rem;font-weight:500}.prof-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.prof-tag{border:1px solid var(--line-2);color:var(--muted);border-radius:6px;padding:1px 6px;font-size:.6875rem}.prof-tag.archived{color:var(--warn);border-color:var(--warn)}.prof-note{color:var(--muted);margin:6px 0;font-size:.75rem}.prof-tabs{gap:4px;margin:12px 0 4px;display:flex}.prof-tabs .btn[aria-selected=true]{background:var(--raise-2);font-weight:600}.prof-editor{flex-direction:column;gap:10px;max-width:760px;display:flex}.prof-editor label{color:var(--muted);flex-direction:column;gap:4px;font-size:.7812rem;display:flex}.prof-editor textarea,.prof-editor input{color:var(--text);font:inherit;box-sizing:border-box;width:100%;font-size:.8125rem}.prof-editor textarea{font-family:var(--mono);resize:vertical;min-height:64px}.prof-part{border:1px solid var(--line);border-radius:var(--r);flex-direction:column;gap:6px;padding:8px 10px;display:flex}.prof-part-head{align-items:flex-end;gap:6px;display:flex}.prof-part-head label{flex:1;min-width:0}.prof-preview{color:var(--muted);margin:0;font-size:.7188rem}.prof-preview.bad{color:var(--err)}.prof-history{flex-direction:column;gap:4px;max-width:760px;margin:0;padding:0;list-style:none;display:flex}.prof-history li{border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 8px;font-size:.8125rem;display:flex}.prof-history .mono{font-family:var(--mono);color:var(--faint);font-size:.7188rem}.prof-history pre{white-space:pre-wrap;background:var(--side);border-radius:6px;flex-basis:100%;max-height:240px;margin:4px 0 0;padding:6px 8px;font-size:.75rem;overflow:auto}.prof-detail .prof-back{display:none}.prof-filters{flex-wrap:wrap;gap:4px;display:flex}.prof-filters select{font:inherit;color:var(--text);max-width:100%;font-size:.75rem}.prof-item .prof-desc{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;overflow:hidden}.prof-chips{flex-wrap:wrap;gap:4px;margin-top:2px;display:flex}.prof-use{background:var(--raise-2);color:var(--text);border-radius:9px;padding:1px 6px;font-size:.6875rem}.prof-use.unused{color:var(--faint);border:1px dashed var(--line-2);background:0 0}.prof-use.older{color:var(--warn);background:color-mix(in srgb, var(--warn) 12%, transparent)}.prof-details{border:1px solid var(--line);border-radius:var(--r);flex-direction:column;align-items:flex-start;gap:8px;max-width:760px;margin:10px 0 4px;padding:8px 12px;display:flex}.prof-facts{grid-template-columns:max-content 1fr;gap:3px 14px;margin:0;font-size:.8125rem;display:grid}.prof-facts dt{color:var(--muted)}.prof-facts dd{overflow-wrap:anywhere;margin:0}.prof-details .prof-editor{width:100%}.prof-meta-row{align-items:center;gap:6px;display:flex}.prof-meta-row input{flex:1;min-width:0}.prof-usage{max-width:760px}.prof-uses{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.prof-uses li{border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 8px;font-size:.8125rem;display:flex}.prof-uses .mono{font-family:var(--mono);font-size:.7188rem}.prof-dot{background:var(--faint);border-radius:50%;flex:none;width:8px;height:8px}.prof-dot.on{background:var(--ok)}.prof-chip{color:var(--muted);border:1px solid var(--line);white-space:nowrap;cursor:pointer;text-overflow:ellipsis;background:0 0;border-radius:13px;align-items:center;gap:4px;max-width:260px;padding:2px 10px;font-size:.75rem;display:inline-flex;overflow:hidden}.prof-chip:hover{background:var(--raise-2)}.prof-chip.ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 45%, var(--line))}.prof-chip.warn,.prof-chip.pending{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 45%, var(--line))}.prof-chip.pending{border-style:dashed}.prof-chip.err{color:var(--err);border-color:color-mix(in srgb, var(--err) 45%, var(--line))}.prof-chip .prof-up{color:var(--accent);font-weight:600}.prof-dialog .dialog-body{flex-direction:column;gap:10px;display:flex}.prof-dialog h3{margin:4px 0;font-size:.8125rem;font-weight:600}.prof-dialog label{color:var(--muted);flex-direction:column;gap:4px;font-size:.7812rem;display:flex}.prof-dialog select,.prof-dialog input,.prof-dialog textarea{color:var(--text);font:inherit;font-size:.8125rem}.prof-guidance{flex-direction:column;gap:2px;margin:0;padding-left:18px;font-size:.8125rem;display:flex}.prof-status{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.prof-status .prof-chip{cursor:default}.prof-upgrade{border:1px solid color-mix(in srgb, var(--accent) 45%, var(--line));border-radius:var(--r);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;font-size:.8125rem;display:flex}.prof-palette .dialog-body{flex-direction:column;gap:8px;display:flex}.prof-commands{flex-direction:column;gap:2px;max-height:46vh;margin:0;padding:0;list-style:none;display:flex;overflow:auto}.prof-command{cursor:pointer;border-radius:6px;flex-direction:column;gap:1px;padding:6px 8px;display:flex}.prof-command[aria-selected=true]{background:var(--raise-2);box-shadow:0 0 0 1px var(--accent) inset}.prof-command .prof-sub{color:var(--muted);font-size:.75rem}.prof-secret{color:var(--muted);border-left:3px solid var(--warn);margin:0;padding:4px 8px;font-size:.75rem}@media (max-width:760px){.prof-list{border-right:0;flex:1;width:auto}.prof-body.has-detail .prof-list,.prof-body:not(.has-detail) .prof-detail{display:none}.prof-detail{padding:12px 14px 48px}.prof-detail .prof-back{margin-bottom:8px;display:inline-flex}.prof-chip{max-width:140px}}.prof-row-gap{margin-top:10px}.prof-fieldset{border:0;margin:0;padding:0}.pane-drop{z-index:8;outline:1px dashed color-mix(in srgb, var(--accent) 45%, transparent);outline-offset:-4px;background:color-mix(in srgb, var(--bg,#000) 18%, transparent);border-radius:6px;min-width:0;min-height:0;position:relative}.pane-drop-area{pointer-events:none;background:color-mix(in srgb, var(--accent) 22%, transparent);box-shadow:inset 0 0 0 2px var(--accent);border-radius:6px;transition:inset .12s ease-out;position:absolute}.pane-drop-area[data-zone=center]{inset:10%}.pane-drop-area[data-zone=left]{inset:0 50% 0 0}.pane-drop-area[data-zone=right]{inset:0 0 0 50%}.pane-drop-area[data-zone=top]{inset:0 0 50%}.pane-drop-area[data-zone=bottom]{inset:50% 0 0}.pane-drop[data-refused] .pane-drop-area{background:color-mix(in srgb, var(--warn) 18%, transparent);box-shadow:inset 0 0 0 2px var(--warn)}.pane-drop-hint{pointer-events:none;background:var(--raise-2);border:1px solid var(--line-2);box-shadow:0 6px 18px var(--shadow);white-space:nowrap;text-overflow:ellipsis;border-radius:999px;max-width:90%;padding:4px 12px;font-size:.8125rem;position:absolute;top:50%;left:50%;overflow:hidden;transform:translate(-50%,-50%)}.pane-drop[data-refused] .pane-drop-hint{color:var(--warn)}.pane-drop-label{pointer-events:none;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;position:absolute;top:6px;left:8px;right:8px;overflow:hidden}.cmp-empty.pane-empty-drop{flex:1;position:relative}.cmp-empty .pane-drop{position:absolute;inset:8px}.pane-dock{z-index:25;background:color-mix(in srgb, var(--bg,#000) 55%, transparent);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.pane-dock-card{background:var(--raise);border:1px solid var(--line-2);width:min(520px,90%);box-shadow:0 16px 48px var(--shadow);border-radius:12px;padding:14px}.pane-dock-title{white-space:nowrap;text-overflow:ellipsis;margin:0 0 10px;font-weight:500;overflow:hidden}.pane-dock-map{gap:6px;height:260px;display:grid}.pane-dock-pane{background:var(--raise-2)}.pane-dock-empty{justify-content:center;align-items:center;height:200px;display:flex}.pane-dock-empty .pane-drop-label{text-align:center;position:static}.pane-dock-note{margin:10px 0 0;font-size:.75rem}.pane-grip{width:24px;height:24px;color:var(--faint);cursor:grab;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.pane-grip:hover{color:var(--text);background:var(--raise-2)}.pane-grip:active{cursor:grabbing}.pane-grip .icon{width:14px;height:14px}.side-row-link[draggable=true],.lib-row[draggable=true]{-webkit-user-drag:element}.wt-drag{cursor:grab}.seg{border:1px solid var(--line);background:var(--side,transparent);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.seg button{width:30px;height:24px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.seg button:hover{color:var(--text)}.seg button[aria-pressed=true]{background:var(--raise-2);color:var(--text);box-shadow:0 0 0 1px var(--line-2)}.seg button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.seg .icon{width:16px;height:16px}@media (prefers-reduced-motion:reduce){.pane-drop-area{transition:none}}.pane-grip .icon{stroke-width:3.2px}.sidechat-bar{border-bottom:1px solid var(--line);flex-direction:column;flex:none;gap:6px;padding:6px 12px;display:flex}.sidechat-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.sidechat-tools{align-items:center;gap:6px;margin-left:auto;display:inline-flex}.sidechat-note{margin:0;font-size:.8125rem}.sidechat-context{max-height:30vh;margin:0;padding-left:20px;font-size:.8125rem;overflow:auto}.sidechat-context-text{white-space:pre-wrap;overflow-wrap:anywhere}.sidechat-send{flex-direction:column;gap:6px;display:flex}.sidechat-problem{margin:0}:root{--bg:#f6f7f9;--side:#eef0f3;--raise:#fff;--raise-2:#e8ebef;--line:#d9dde3;--line-2:#c9ced6;--text:#22252a;--muted:#69707b;--faint:#9299a3;--accent:#0e7268;--accent-ink:#fff;--ok:#16834a;--warn:#9a5b08;--err:#b42318;--add:#16834a;--del:#b42318;--violet:#8954c7;--orange:#b96508;--blue:#2769b4;--mark:#22252a;--shadow:#1018281f;--serif:ui-serif, "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;--sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--side-w:235px;--rail-w:260px;--col:680px;--r:8px;--font-scale:1;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101214;--side:#171a1e;--raise:#1b1f24;--raise-2:#22272d;--line:#2d333b;--line-2:#3a424d;--text:#e7e5e0;--muted:#9ca3ad;--faint:#6f7782;--accent:#3ad3bf;--accent-ink:#04201c;--ok:#50d890;--warn:#efb851;--err:#ff8e82;--add:#50d890;--del:#ff8e82;--violet:#b68cff;--orange:#f2a340;--blue:#64a8ef;--mark:#e7e5e0;--shadow:#0006}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101214;--side:#171a1e;--raise:#1b1f24;--raise-2:#22272d;--line:#2d333b;--line-2:#3a424d;--text:#e7e5e0;--muted:#9ca3ad;--faint:#6f7782;--accent:#3ad3bf;--accent-ink:#04201c;--ok:#50d890;--warn:#efb851;--err:#ff8e82;--add:#50d890;--del:#ff8e82;--violet:#b68cff;--orange:#f2a340;--blue:#64a8ef;--mark:#e7e5e0;--shadow:#0006}}*{box-sizing:border-box}html{font-size:calc(100% * var(--font-scale,1));-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}html,body{background:var(--bg);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0}body{font:.875rem/1.5 var(--sans)}#root{height:100%}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit;color:inherit}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.muted{color:var(--muted)}.small{font-size:.7812rem}.mono,code,pre{font-family:var(--mono)}.display{font-family:var(--serif);letter-spacing:-.01em;font-weight:400}.grow{flex:1}.row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.stack{flex-direction:column;gap:12px;display:flex}.pad{padding:12px 16px}.error{color:var(--err)}.ok{color:var(--ok)}.icon{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:16px;height:16px}kbd{font:.6875rem var(--mono);color:var(--faint);border:1px solid var(--line-2);border-radius:4px;padding:0 4px}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.btn{border-radius:var(--r);border:1px solid var(--line-2);background:var(--raise);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;min-height:32px;padding:0 12px;display:inline-flex}.btn:hover:not(:disabled){background:var(--raise-2)}.btn:disabled{opacity:.45;cursor:default}.btn.small{height:auto;min-height:26px;padding:0 9px;font-size:.7812rem}.btn.primary{background:var(--accent);color:var(--accent-ink);border-color:#0000;font-weight:600}.btn.primary:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 88%, var(--text))}.btn.danger{color:var(--err)}.icon-btn{width:30px;height:30px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.icon-btn:hover:not(:disabled){background:var(--raise-2);color:var(--text)}.icon-btn:disabled{opacity:.4;cursor:default}.icon-btn.small{width:24px;height:24px}.icon-btn.on,.icon-btn[aria-pressed=true]{color:var(--accent)}.icon-btn.recording{color:var(--err)}input[type=search],input[type=text],input[type=password],select,textarea{background:var(--raise);border:1px solid var(--line);border-radius:var(--r);min-height:32px;padding:6px 10px}input:focus,select:focus,textarea:focus{border-color:var(--line-2);box-shadow:0 0 0 1px var(--line-2);outline:none}.chips{flex-wrap:wrap;gap:6px;display:flex}.chip{border:1px solid var(--line);min-height:26px;color:var(--muted);cursor:pointer;background:0 0;border-radius:13px;padding:0 10px;font-size:.7812rem}.chip[aria-pressed=true]{background:var(--raise-2);color:var(--text);border-color:var(--line-2)}.chip .count{color:var(--accent);margin-left:4px}.card{background:var(--raise);border:1px solid var(--line);border-radius:10px;padding:14px}.banner{border:1px solid var(--line);background:var(--side);border-radius:var(--r);justify-content:space-between;align-items:center;gap:12px;margin:8px 0;padding:8px 12px;display:flex}.banner.warn{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));color:var(--warn);border-width:0 0 1px;border-radius:0;margin:0}.badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-ink);border-radius:9px;place-items:center;padding:0 5px;font-size:.6875rem;font-weight:700;display:inline-grid}.badge-pill{border:1px solid var(--line-2);color:var(--muted);border-radius:8px;margin-left:6px;padding:1px 6px;font-size:.6875rem}.badge-pill.off{color:var(--err)}.status{flex:none;place-items:center;width:14px;height:14px;display:inline-grid}.status-dot{background:var(--faint);border-radius:50%;width:7px;height:7px}.status.blocked .status-dot{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb, var(--warn) 14%, transparent)}.status.error .status-dot{background:var(--err)}.spinner{border:1.6px solid color-mix(in srgb, var(--accent) 27%, transparent);border-top-color:var(--accent);border-radius:50%;flex:none;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}.spinner.small{width:10px;height:10px}@keyframes spin{to{transform:rotate(360deg)}}.unread-dot{background:var(--accent);border-radius:50%;flex:none;width:6px;height:6px;margin-left:6px;display:inline-block}.online-dot{background:var(--faint);vertical-align:middle;border-radius:50%;width:6px;height:6px;margin-right:6px;display:inline-block}.online-dot.on{background:var(--ok)}.voice-dot{background:var(--ok);vertical-align:middle;border-radius:50%;flex:none;width:8px;height:8px;margin-right:6px;animation:1.8s ease-in-out infinite voice-dot-pulse;display:inline-block}@keyframes voice-dot-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb, var(--ok) 55%, transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.voice-dot{animation:none}}.shell{height:100%;display:flex;overflow:hidden}.sidebar{width:var(--side-w);background:var(--side);border-right:1px solid var(--line);flex-direction:column;flex:none;min-height:0;display:flex}.main{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.conn-banner{background:color-mix(in srgb, var(--warn) 16%, var(--bg));color:var(--warn);text-align:center;padding:3px;font-size:.7812rem}.side-top{justify-content:space-between;align-items:center;padding:10px 8px 6px 14px;display:flex}.brand{align-items:center;gap:8px;display:flex}.brand-mark{flex:none}.hub-mark{color:var(--mark);--mark-gap:var(--bg)}.hub-mark-gap{fill:var(--mark-gap)}.hub-mark-hub{fill:var(--accent)}.sidebar .hub-mark{--mark-gap:var(--side)}.brand-name{font-family:var(--serif);font-size:1.0625rem}.side-search{border:1px solid var(--line);border-radius:var(--r);color:var(--faint);background:var(--bg);align-items:center;gap:6px;margin:4px 10px;padding:0 8px;display:flex}.side-search input{width:100%;min-height:30px;box-shadow:none;background:0 0;border:0;padding:0}.side-new,.side-link{color:var(--text);border-radius:6px;align-items:center;gap:8px;margin:2px 8px;padding:6px 8px;display:flex}.side-new:hover,.side-link:hover,.side-link.active{background:var(--raise-2)}.side-link{color:var(--muted)}.side-head{color:var(--faint);justify-content:space-between;align-items:center;padding:10px 8px 0 16px;font-size:.75rem;display:flex}.side-scroll{flex:1;min-height:0;padding:0 6px 12px;overflow:auto}.side-section{margin-top:10px}.side-section-head{justify-content:space-between;align-items:center;height:24px;padding:0 4px 2px 10px;display:flex}.side-section-title{color:var(--faint);text-transform:none;letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;font-size:.7188rem;overflow:hidden}.side-section.needs .side-section-title{color:var(--warn)}.side-section-head .icon-btn{opacity:0}.side-section-head:has(.side-section-toggle){padding-left:2px}.side-section-toggle{min-width:0;height:22px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:5px;flex:1;align-items:center;gap:4px;padding:0 6px 0 4px;display:flex}.side-section-toggle:hover{background:var(--raise-2)}.side-section-toggle:hover .side-section-title{color:var(--muted)}.side-section-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.side-section-caret{width:12px;height:12px;color:var(--faint);flex:none}.side-count{background:var(--raise-2);min-width:16px;color:var(--muted);text-align:center;font-variant-numeric:tabular-nums;border-radius:8px;flex:none;padding:0 5px;font-size:.6562rem;line-height:16px}.side-count.needs{background:color-mix(in srgb, var(--warn) 22%, transparent);color:var(--warn);font-weight:600}.side-section.needs .side-section-toggle .side-section-title{color:var(--warn)}.side-section:hover .side-section-head .icon-btn,.side-section-head .icon-btn:focus-visible{opacity:1}.side-list{margin:0;padding:0;list-style:none}.side-row{border-radius:6px;align-items:center;display:flex;position:relative}.side-row:hover,.side-row.active{background:var(--raise-2)}.side-row-link{min-width:0;color:var(--muted);flex:1;align-items:center;gap:8px;padding:5px 4px 5px 8px;display:flex}.side-row.active .side-row-link,.side-row.unread .side-row-link{color:var(--text)}.side-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.row-more{opacity:0;margin-right:2px}.side-row:hover .row-more,.side-row.active .row-more,.row-more[aria-expanded=true],.row-more:focus-visible{opacity:1}.side-empty{color:var(--faint);padding:12px;font-size:.7812rem}.side-foot{border-top:1px solid var(--line);padding:8px}.account{color:var(--muted);border-radius:6px;align-items:center;gap:8px;padding:6px;display:flex}.account:hover{background:var(--raise-2);color:var(--text)}.account-name{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.avatar{background:var(--raise-2);width:24px;height:24px;color:var(--text);border-radius:50%;flex:none;place-items:center;font-size:.75rem;font-weight:600;display:inline-grid}.avatar.admin{box-shadow:0 0 0 1.5px var(--accent)}.avatar.large{width:40px;height:40px;font-size:1.0625rem}.menu{z-index:50;background:var(--raise);border:1px solid var(--line-2);min-width:200px;max-width:320px;box-shadow:0 12px 32px var(--shadow);border-radius:10px;padding:4px;position:fixed}.menu-item{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px;display:flex}.menu-item:hover:not(:disabled){background:var(--raise-2)}.menu-item.danger{color:var(--err)}.menu-check{width:14px;color:var(--accent)}.menu-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.menu-hint{color:var(--faint);font-size:.75rem}.menu-section{color:var(--faint);padding:6px 8px 2px;font-size:.7188rem}.menu-sep{background:var(--line);height:1px;margin:4px 0}.mic-picker{width:280px}.level{background:var(--bg);border-radius:3px;height:6px;margin:8px;overflow:hidden}.level span{background:var(--ok);height:100%;transition:width 80ms linear;display:block}.dialog{background:var(--raise);color:var(--text);border:1px solid var(--line-2);border-radius:12px;width:min(520px,94vw);max-height:84vh;padding:0}.dialog::backdrop{background:#0009}.dialog-head{justify-content:space-between;align-items:center;padding:12px 14px 6px;display:flex}.dialog-head h2{margin:0;font-size:.9375rem;font-weight:600}.confirm-dialog{width:min(440px,94vw)}.confirm-dialog .dialog-head{padding-bottom:8px}.confirm-message{white-space:pre-line;overflow-wrap:anywhere;color:var(--muted);margin:0 0 14px;font-size:.8438rem}.btn.primary.danger{background:var(--err);color:var(--bg)}.btn.primary.danger:hover:not(:disabled){background:color-mix(in srgb, var(--err) 88%, var(--text))}@media (pointer:coarse){.confirm-dialog .dialog-actions .btn{min-width:44px;min-height:44px;padding-inline:16px}}.dialog-body{max-height:calc(84vh - 56px);padding:4px 14px 14px;overflow:auto}button.account{text-align:left;cursor:pointer;background:0 0;border:0;width:100%}.setup-machine{flex-direction:column;gap:12px;display:flex}.setup-machine input[type=radio],.setup-machine input[type=checkbox]{accent-color:var(--accent)}.setup-machine>p{margin:0}.sm-field{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.sm-field legend,.sm-label{margin-bottom:6px;padding:0;font-size:.7812rem;font-weight:600}.sm-seg{background:var(--raise-2);border-radius:9px;align-self:flex-start;padding:2px;display:inline-flex}.sm-seg-item{min-height:28px;color:var(--muted);cursor:pointer;border-radius:7px;align-items:center;padding:0 12px;font-size:.7812rem;display:inline-flex;position:relative}.sm-seg-item input{opacity:0;cursor:pointer;width:100%;height:100%;margin:0;position:absolute;inset:0}.sm-seg-item.on{background:var(--raise);color:var(--text);box-shadow:0 1px 2px var(--shadow);font-weight:600}.sm-seg-item:has(input:focus-visible){outline:2px solid var(--accent);outline-offset:1px}.sm-profiles{flex-direction:column;gap:4px;display:flex}.sm-profile{border:1px solid var(--line);border-radius:var(--r);cursor:pointer;align-items:baseline;gap:8px;padding:6px 8px;display:flex}.sm-profile.on{border-color:var(--accent)}.sm-profile.disabled{opacity:.55;cursor:default}.sm-profile .grow{flex-direction:column;min-width:0;display:flex}.sm-profile .name{font-weight:600}.sm-root input{box-sizing:border-box;width:100%}.sm-activate .block{display:block}.sm-command-box{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);align-items:center;gap:8px;padding:8px;display:flex}.sm-command-box>p{flex:1;margin:0}.sm-command{white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;flex:1;min-width:0;font-size:.75rem;line-height:1.5}.sm-copy{flex:none}@media (pointer:coarse){.sm-seg-item,.sm-copy{min-height:44px}.sm-profile{padding:10px}}.add-app-body{gap:10px;display:grid}.add-app .qr{width:min(260px,70vw);height:auto;image-rendering:pixelated;border-radius:8px;margin:4px auto;display:block}.add-app-link{word-break:break-all;background:var(--bg);border:1px solid var(--line-2);-webkit-user-select:all;user-select:all;border-radius:6px;padding:6px 8px;font-size:.7188rem}.add-app-countdown{font-variant-numeric:tabular-nums}.add-app-expired{justify-items:center;gap:8px;padding:24px 0;display:grid}.picker-search{width:100%;margin-bottom:8px}.picker-list{max-height:55vh;margin:0;padding:0;list-style:none;overflow:auto}.picker-group{text-transform:none;padding:8px 8px 2px;font-weight:600}.picker-note{margin:0 0 6px}.picker-opt{cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;width:100%;padding:7px 8px;display:flex}.picker-opt:hover,.picker-opt.active{background:var(--raise-2)}.picker-opt[aria-selected=true] .po-name{color:var(--accent)}.po-name{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.po-mark{color:var(--accent);font-size:.75rem}.toast{left:50%;bottom:calc(24px + env(safe-area-inset-bottom));z-index:60;background:var(--raise-2);border:1px solid var(--line-2);box-shadow:0 8px 24px var(--shadow);border-radius:10px;align-items:center;gap:10px;max-width:92vw;padding:8px 12px;display:flex;position:fixed;transform:translate(-50%)}.toast.err{border-color:#6a3036}.toast.warn{border-color:#5a4a2a}.topbar{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:8px;height:max(48px,2.4rem);padding:0 12px;display:flex}.topbar-title{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.topbar .title{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:.875rem;font-weight:500;overflow:hidden}.title-btn{all:unset;cursor:text;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;display:block;overflow:hidden}.title-btn:hover,.title-btn:focus-visible{box-shadow:0 0 0 1px var(--line-2)}input[type=text].rename-field{width:100%;min-width:0;min-height:26px;font:inherit;color:var(--text);flex:1;padding:2px 6px}.topbar input.rename-field.title{max-width:520px}.rename-wrap{vertical-align:middle;flex:1;align-items:center;gap:4px;width:100%;min-width:0;max-width:100%;display:inline-flex}.topbar .rename-wrap{max-width:560px}.auto-name-btn{flex:none;font-size:14px;line-height:1}.naming{white-space:nowrap;flex:none;align-items:center;gap:4px;margin-left:6px;font-weight:400;display:inline-flex}.chip-server{color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:13px;align-items:center;gap:4px;max-width:420px;padding:2px 10px;font-size:.75rem;display:inline-flex;overflow:hidden}.chip-server .place-where{text-overflow:ellipsis;min-width:0;overflow:hidden}.session-place{color:var(--muted);border-bottom:1px solid var(--line);white-space:nowrap;flex:none;align-items:center;gap:4px;padding:4px 12px;font-size:.75rem;display:flex;overflow:hidden}.session-place .place-machine{color:var(--text,inherit);font-weight:500}.session-place .place-where,.session-place .place-branch{text-overflow:ellipsis;min-width:0;overflow:hidden}.session-place .icon{flex:none;width:12px;height:12px;margin-left:4px}.chip-server .icon{width:12px;height:12px;margin-left:6px}.chip-evidence{color:var(--muted);border:1px dashed var(--line);white-space:nowrap;cursor:help;border-radius:13px;align-items:center;padding:2px 10px;font-size:.75rem;display:inline-flex}.chip-evidence.screen,.chip-evidence.unknown{color:var(--warn);border-color:#5a4a2a}.btn.changes{font-family:var(--mono)}.add{color:var(--add)}.del{color:var(--del)}.home-shell{flex-direction:column;height:100%;min-height:0;display:flex}.home-scroll{flex:1;overflow:auto}.home{max-width:1180px;margin:0 auto;padding:24px 28px 48px}.home-head{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.home-head h1{margin:0;font-size:1.75rem}.home-tools{gap:8px;margin:12px 0 8px;display:flex}.search{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);color:var(--faint);flex:1;align-items:center;gap:8px;padding:0 10px;display:flex}.search input{width:100%;box-shadow:none;background:0 0;border:0}.count{margin:10px 0 4px;font-size:.75rem}.sessions-table{border-collapse:collapse;table-layout:fixed;width:100%}.sessions-table th{text-align:left;color:var(--faint);border-bottom:1px solid var(--line);padding:0;font-size:.75rem;font-weight:500}.th-btn{color:inherit;cursor:pointer;background:0 0;border:0;gap:4px;padding:8px 6px;display:inline-flex}.th-btn:hover{color:var(--text)}.sort-mark{color:var(--accent)}.sessions-table td{border-bottom:1px solid var(--line);text-overflow:ellipsis;white-space:nowrap;color:var(--muted);padding:7px 6px;overflow:hidden}.sessions-table tbody tr{cursor:pointer}.sessions-table tbody tr:hover{background:var(--side)}.sessions-table .col-title a{color:var(--text)}.sessions-table tr.unread .col-title a{font-weight:600}.col-status{width:64px}.col-pick{text-align:center;width:32px}.col-pick input{vertical-align:middle;cursor:pointer;margin:0}.home-tools .btn.small{min-height:32px}.bulk-bar{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);align-items:center;gap:8px;margin:8px 0 0;padding:6px 10px;font-size:.8125rem;display:flex}.bulk-bar span{margin-right:auto}.archive-inactive{flex-direction:column;gap:12px;display:flex}.archive-inactive input[type=number]{background:var(--raise);border:1px solid var(--line);border-radius:var(--r);width:120px;min-height:32px;padding:6px 10px}.dialog-actions{justify-content:flex-end;gap:8px;display:flex}.col-title{width:30%}.col-project{width:16%}.col-server,.col-source{width:9%}.col-activity{width:10%}.col-actions{text-align:right;width:40px}.empty-cell{text-align:center;padding:24px!important}.home-list{margin:0;padding:0;list-style:none}.home-item{border-bottom:1px solid var(--line);align-items:center;display:flex}.home-item-link{flex:1;align-items:center;gap:10px;min-width:0;padding:10px 4px;display:flex}.home-item-text{flex-direction:column;flex:1;min-width:0;display:flex}.home-item-title,.home-item-meta{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.home-item.unread .home-item-title{font-weight:600}.home-item-meta{font-size:.7812rem}.offline-line{margin-top:10px}.empty{text-align:center;padding:48px 16px}.empty .display{margin:0 0 6px;font-size:1.375rem}.session-layout{height:100%;min-height:0;display:flex}.session-main{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.scroller{overflow-anchor:none;flex:1;min-height:0;overflow:auto}.history-sentinel{height:1px}.history-edge{text-align:center;justify-content:center;align-items:center;gap:8px;margin:16px 0 0;display:flex}.history-edge.error{color:var(--err)}.column{max-width:var(--col);margin:0 auto;padding:0 20px}.column.narrow{max-width:560px;padding-top:40px}.transcript{flex-direction:column;gap:14px;padding:24px 0 8px;display:flex}.msg.user{align-self:flex-end;align-items:flex-end;gap:6px;max-width:85%;display:flex}.user-body{flex-direction:column;align-items:flex-end;gap:6px;min-width:0;display:flex}.msg-images{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.msg-image{border:1px solid var(--line-2);background:var(--raise-2);border-radius:10px;display:block;overflow:hidden}.msg-image img{object-fit:contain;max-width:min(220px,60vw);max-height:220px;display:block}.file-chip{background:var(--raise-2);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;align-items:center;gap:6px;max-width:240px;padding:4px 10px;font-size:.7812rem;display:inline-flex;overflow:hidden}.file-chip .icon{flex:none;width:14px;height:14px}.pill{background:var(--raise-2);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:14px;padding:8px 14px}.msg-note{text-align:right;overflow-wrap:anywhere;margin:0}.tick{color:var(--faint);font-size:.6875rem}.tick.heard{color:var(--ok)}.tick.failed{color:var(--err)}.tick.queued{color:var(--warn)}.user-body{position:relative}.msg-tools{z-index:2;background:var(--raise);border:1px solid var(--line-2);opacity:0;pointer-events:none;border-radius:8px;gap:2px;margin-top:2px;padding:2px;transition:opacity .12s;display:flex;position:absolute;top:100%;right:0;box-shadow:0 2px 8px #0000001f}.msg-tools .icon-btn{width:28px;height:28px}.msg-tools .icon-btn[aria-disabled=true]{opacity:.4;cursor:default}.msg.user:hover .msg-tools,.msg.user:focus-within .msg-tools,.msg.user.tools-open .msg-tools{opacity:1;pointer-events:auto}.msg-more{opacity:.35;align-self:center;width:26px;height:26px;display:inline-grid}.msg.user:hover .msg-more,.msg.user:focus-within .msg-more,.msg.user.tools-open .msg-more{opacity:1}@media (hover:none){.msg-more{opacity:1}.msg.user:hover:not(.tools-open):not(:focus-within) .msg-tools{opacity:0;pointer-events:none}}.revert-banner{background:var(--raise-2);border:1px solid var(--line-2);border-radius:10px;align-items:center;gap:8px;margin:0 0 8px;padding:6px 8px 6px 12px;font-size:.8125rem;display:flex}.revert-banner .icon{width:16px;height:16px;color:var(--muted);flex:none}.revert-banner .revert-text{flex:1;min-width:0}.hub-msg-delivery{color:var(--warn);font-size:.6875rem}.composer-unavailable{align-items:center;gap:10px;padding:10px 2px;display:flex}.composer-unavailable p{flex:1;margin:0}.msg.assistant{overflow-wrap:anywhere;line-height:1.6}.msg.assistant.live .md>:is(p,h3,h4,h5,h6):last-child:after,.msg.assistant.live .md>:is(ul,ol):last-child>li:last-child>p:last-child:after{content:"▍";color:var(--accent);animation:1s steps(2,end) infinite blink}@keyframes blink{50%{opacity:0}}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md{min-width:0}.md p{margin:0 0 .7em}.md h3,.md h4,.md h5,.md h6{letter-spacing:-.005em;color:var(--violet);margin:1.15em 0 .45em;font-weight:600;line-height:1.35}.md h3{border-bottom:1px solid var(--line);padding-bottom:.25em;font-size:1.14em}.md h4{font-size:1.05em}.md h5,.md h6{color:color-mix(in srgb, var(--violet) 72%, var(--muted));font-size:1em}.md ul,.md ol{margin:0 0 .7em;padding-left:1.5em}.md li{margin:.15em 0}.md li::marker{color:var(--orange)}.md li>p{margin:0}.md li>:is(ul,ol){margin:.15em 0 .2em}.md :is(ul,ol).loose>li{margin:.35em 0}.md :is(ul,ol).loose>li>p{margin:0 0 .5em}.md :is(ul,ol).loose>li>p:last-child{margin-bottom:0}.md li.task{list-style:none;position:relative}.md li.task>input[type=checkbox]{width:.95em;height:.95em;accent-color:var(--accent);margin:0;position:absolute;top:.3em;left:-1.35em}.md li.task>input:checked~p{color:var(--muted)}.md .inline-code{color:var(--ok);background:color-mix(in srgb, var(--accent) 9%, var(--raise-2));border:1px solid color-mix(in srgb, var(--accent) 24%, var(--line));overflow-wrap:anywhere;border-radius:5px;padding:.05em .35em;font-size:.88em}.md a .inline-code{color:inherit}.md :is(th,td) .inline-code{white-space:nowrap;overflow-wrap:normal}.md strong{color:var(--orange);font-weight:600}.md del{color:var(--faint)}.md mark{background:color-mix(in srgb, var(--orange) 18%, transparent);color:var(--orange);-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px;padding:0 .15em}.md .md-image{color:var(--accent)}.md .md-image:before{content:"🖼 "}.md blockquote{border-left:3px solid var(--line-2);color:var(--muted);margin:0 0 .7em;padding:.15em 0 .15em .85em}.md blockquote>:last-child{margin-bottom:0}.md a{color:var(--ok);text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, var(--ok) 40%, transparent);text-decoration-color:color-mix(in srgb, var(--ok) 40%, transparent);text-underline-offset:2px;overflow-wrap:anywhere}.md a:hover{text-decoration-color:currentColor}.md hr{border:0;border-top:1px solid var(--line);margin:1em 0}.md .table-wrap{border:1px solid var(--line);border-radius:var(--r);max-width:100%;margin:0 0 .8em;overflow-x:auto}.md table{border-collapse:collapse;min-width:100%;font-size:.93em;line-height:1.45}.md th,.md td{border-bottom:1px solid var(--line);text-align:left;vertical-align:top;overflow-wrap:normal;padding:.4em .75em}.md th{background:var(--side);color:var(--text);white-space:nowrap;font-weight:600}.md tbody tr:last-child td{border-bottom:0}.md tbody tr:nth-child(2n) td{background:color-mix(in srgb, var(--text) 3%, transparent)}.md th+th,.md td+td{border-left:1px solid var(--line)}.md .code-block{border:1px solid var(--line);border-radius:var(--r);background:var(--side);margin:0 0 .8em;overflow:hidden}.md .code-head{border-bottom:1px solid var(--line);color:var(--faint);align-items:center;gap:2px;padding:2px 4px 2px 10px;font-size:.8em;display:flex}.md .code-lang{font-family:var(--mono);text-transform:lowercase;flex:1}.md .code-btn{color:var(--muted);cursor:pointer;font-size:inherit;background:0 0;border:0;border-radius:5px;min-height:24px;padding:3px 8px}.md .code-btn:hover{background:var(--raise-2);color:var(--text)}.md .code-btn[aria-pressed=true]{color:var(--accent)}.md pre.code{background:0 0;border:0;border-radius:0;margin:0;padding:.7em .9em;line-height:1.5;overflow:auto}.md .code-block.wrap pre.code{white-space:pre-wrap;overflow-wrap:anywhere}.md pre code{background:0 0;padding:0}.tok-comment{color:var(--faint);font-style:italic}.tok-string{color:var(--ok)}.tok-number{color:var(--orange)}.tok-keyword{color:var(--violet)}.tok-type,.tok-attr{color:var(--orange)}.tok-fn,.tok-meta{color:var(--blue)}.tok-prop,.tok-tag{color:var(--err)}.tok-add{color:var(--add);background:color-mix(in srgb, var(--add) 10%, transparent)}.tok-del{color:var(--del);background:color-mix(in srgb, var(--del) 10%, transparent)}pre.code{white-space:pre;font-size:.75rem}.fold-head{color:var(--muted);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 0;font-size:.8125rem;display:inline-flex}.fold-head:hover:not(:disabled){color:var(--text)}.fold-head:disabled{cursor:default}.fold-head .chev{width:13px;height:13px;transition:transform .15s}.fold-head[aria-expanded=true] .chev{transform:rotate(90deg)}.fold.has-failed .fold-head{color:#c9a0a4}.fold-body{border-left:1px solid var(--line);margin:6px 0 0 2px;padding-left:12px}.reasoning{color:var(--muted);white-space:pre-wrap;max-height:320px;font-size:.8125rem;overflow:auto}.reasoning.hidden-reasoning{font-style:italic}.tool-list{list-style:none}.tool-head{cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;width:100%;padding:3px 0;font-size:.8125rem;display:flex}.tool-mark{width:14px;color:var(--ok);font-size:.6875rem}.tool.failed .tool-mark{color:var(--err)}.tool-name{font-family:var(--mono);font-size:.7812rem}.tool-summary{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:.7812rem;overflow:hidden}.tool-detail pre{background:var(--side);border:1px solid var(--line);border-radius:6px;max-height:360px;padding:8px;overflow:auto}.hub-msg{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--r);max-width:85%;padding:6px 10px}.hub-msg.out{align-self:flex-end}.hub-msg-head{color:var(--muted);align-items:center;gap:6px;margin-bottom:2px;font-size:.7812rem;display:flex}.hub-msg-mark{color:var(--accent)}.hub-msg-kind{font-family:var(--mono);text-transform:uppercase;font-size:.7188rem}.hub-msg-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.hub-msg-text{white-space:pre-wrap;overflow-wrap:anywhere;font-size:.875rem}.hub-note .fold-body{color:var(--muted)}.subagent{border:1px solid var(--line);border-radius:var(--r);color:var(--muted);align-items:center;gap:8px;padding:8px 10px;display:flex}.subagent:hover{background:var(--side);color:var(--text)}.sub-mark{color:var(--accent);place-items:center;width:14px;display:inline-grid}.sub-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.sub-label strong{color:var(--text);font-weight:500}.subagent .chev{width:14px;height:14px}.note{color:var(--muted);margin:6px 0;font-size:.7812rem}.note.err{color:var(--err)}.working-line{align-items:center;gap:8px;margin:10px 0;font-size:.8125rem;display:flex}.idle-line{margin:12px 0 20px}.empty-session{text-align:center;padding-top:18vh}.blocker{border-color:#5a4a2a;margin:12px 0}.blocker-head{color:var(--warn);margin:0 0 4px}.blocker-text{white-space:pre-wrap;overflow-wrap:anywhere;margin:0 0 10px;font-size:.7812rem}.decisions{margin:12px 0}.decisions .section-title{color:var(--warn);margin:0 0 6px;font-size:.875rem}.decision{border-color:#5a4a2a;margin:12px 0}.decision.urgency-high{border-color:var(--err)}.decision.targeted{box-shadow:0 0 0 2px var(--accent)}.decision-question{font-size:.875rem}.decision-deadline{color:var(--warn);margin:0 0 8px}.decision-deadline.overdue{color:var(--err)}.decision .badge-pill.urgency.high{color:var(--err);border-color:var(--err)}.decision .badge-pill.recommended{color:var(--accent);border-color:var(--accent)}.decision .badge-pill.safe{color:var(--ok);border-color:var(--ok)}.decision .choice.recommended>span:first-of-type{font-weight:600}.decision-why{margin:6px 0}.decision-note,.decision textarea{width:100%;margin:6px 0}.decision-tier{margin:4px 0 8px}.decision .badge-pill.agent-request{color:var(--warn);border-color:var(--warn)}.escalation-details{grid-template-columns:max-content 1fr;gap:2px 12px;margin:0 0 10px;display:grid}.escalation-details dt{color:var(--muted)}.escalation-details dd{overflow-wrap:anywhere;min-width:0;margin:0}.escalation-resource{margin:0 6px 2px 0;display:inline-block}.decision-details dd{white-space:pre-wrap}.decision-details .escalation-resource,.decision-prompt{white-space:pre-wrap;overflow-wrap:anywhere}.decision-prompt{margin:0}.decision-answer-field{display:block}.cut-note{color:var(--warn);margin:0 0 4px;display:block}.escalation-resource,.decision-answer-value{unicode-bidi:isolate}.decision-prompt,.blocker.permission .blocker-text{unicode-bidi:plaintext}.clamp-toggle{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:0;padding:0 2px;font-size:.75rem;text-decoration:underline;display:inline}.blocker-text+.clamp-toggle{margin:-8px 0 10px;display:block}.blocker-recommendation{color:var(--accent);margin:-4px 0 10px}.answered-by{margin:6px 0}.blocker .answered-by{margin:8px 0 0}.grant-row .grant-facts{grid-template-columns:max-content 1fr;gap:2px 12px;margin:4px 0 0;display:grid}.grant-row .grant-facts dt{color:var(--muted)}.grant-row .grant-facts dd{overflow-wrap:anywhere;min-width:0;margin:0}.grant-row.ended{opacity:.6}.badge-pill.active{color:var(--ok);border-color:var(--ok)}.grant-form{flex-direction:column;gap:12px;display:flex}.grant-form label.text-field{flex-direction:column;gap:4px;display:flex}.grant-form textarea,.grant-form input[type=text]{width:100%}.grant-verbs{border:0;flex-wrap:wrap;gap:4px 14px;margin:0;padding:0;display:flex}.audit-row .audit-result.ok{color:var(--ok)}.audit-row .audit-result.warn{color:var(--warn)}.audit-row .audit-result.err{color:var(--err)}.form-card fieldset{border:0;min-width:0;margin:0;padding:0}.form-card fieldset:disabled{opacity:.6}.form-field{flex-direction:column;gap:4px;margin:0 0 12px;display:flex}.field-title{font-weight:500}.field-desc{display:block}.choice-group{flex-direction:column;gap:4px;display:flex}.choice,.check{cursor:pointer;align-items:baseline;gap:8px;display:flex}.choice-group input[type=text],.form-field>input[type=text]{width:100%}.field-error{color:var(--err);margin:0}.dock{padding:8px 0 calc(12px + env(safe-area-inset-bottom));background:linear-gradient(transparent, var(--bg) 18px);flex:none}.composer-box{border:1px solid var(--line-2);background:var(--raise);border-radius:14px;padding:10px 10px 6px 14px}.composer-box:focus-within{border-color:var(--line-2)}.composer textarea{resize:none;width:100%;min-height:24px;max-height:280px;box-shadow:none;background:0 0;border:0;padding:0;line-height:1.5}.composer.dragging .composer-box{border-color:var(--accent);border-style:dashed}.attachments{flex-wrap:wrap;gap:8px;margin:0 0 8px;padding:0;list-style:none;display:flex}.attachment{border:1px solid var(--line-2);background:var(--raise-2);border-radius:10px;justify-content:center;align-items:center;width:64px;height:64px;display:flex;position:relative;overflow:hidden}.attachment img{object-fit:cover;width:100%;height:100%;display:block}.attachment-remove{color:#fff;cursor:pointer;background:#000000a6;border:0;border-radius:50%;justify-content:center;align-items:center;width:22px;height:22px;padding:0;display:flex;position:absolute;top:3px;right:3px}.attachment-remove .icon{width:13px;height:13px}.composer-actions{align-items:center;gap:4px;margin-top:4px;display:flex}.composer-meta{align-items:center;gap:6px;padding:6px 4px 0;display:flex}.composer-meta>.muted{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-error{color:var(--err);margin:0 0 6px;font-size:.7812rem}.composer-hint{margin:0 0 6px}.btn.send{border-radius:8px;min-width:30px;height:30px;padding:0 9px}.btn.send.steer{padding:0 12px}.btn.stop{height:30px;color:var(--text)}.split{border:1px solid var(--line-2);border-radius:8px;height:30px;display:inline-flex;overflow:hidden}.split button{color:var(--muted);cursor:pointer;background:0 0;border:0;place-items:center;display:grid}.split button:hover:not(:disabled){background:var(--raise-2);color:var(--text)}.split button:disabled{opacity:.4;cursor:default}.split-main{width:32px}.split.on .split-main{background:var(--accent);color:var(--accent-ink)}.split.on .split-main:hover:not(:disabled){background:var(--accent);color:var(--accent-ink);filter:brightness(1.08)}.voice-pill{border:1px solid var(--accent);min-height:28px;color:var(--accent);border-radius:999px;align-items:center;gap:6px;min-width:0;max-width:320px;padding:0 4px 0 8px;font-size:.75rem;display:inline-flex}.voice-pill .icon{flex:none;width:14px;height:14px}.voice-pill-link{color:inherit;text-overflow:ellipsis;white-space:nowrap;min-width:0;text-decoration:none;overflow:hidden}.voice-pill-link strong{color:var(--text);font-weight:500}.voice-pill .btn.small{height:22px;padding:0 8px}.voice-strip{justify-content:flex-end;padding:8px 12px 0;display:flex}.side-row.voice-here .side-title{color:var(--accent)}.voice-error{margin:0 0 8px}.split-chev{width:20px;border-left:1px solid var(--line-2)!important}.split-chev .icon{width:12px;height:12px}.split.on{border-color:var(--accent)}.split.on .split-main{color:var(--accent)}.model-chip{color:var(--faint);cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;border-radius:6px;max-width:220px;padding:2px 6px;font-size:.75rem;overflow:hidden}.model-chip:hover{background:var(--raise-2);color:var(--text)}.voice-bar{border:1px solid var(--line-2);background:var(--side);border-radius:12px;align-items:center;gap:10px;margin-bottom:8px;padding:6px 8px 6px 12px;display:flex}.voice-bar.paused{opacity:.8}.voice-bar.suspended{border-color:#5a4a2a;flex-wrap:wrap}.voice-bar.suspended .voice-state{color:var(--warn);flex:12em;min-width:0}.voice-bar.suspended .wave span{background:var(--warn)}.wave{align-items:center;gap:3px;height:22px;display:flex}.wave span{background:var(--accent);transform-origin:50%;border-radius:2px;width:3px;height:22px;transition:transform 80ms linear}.voice-bar.speaking .wave span{animation:.9s ease-in-out infinite talk}.voice-bar.speaking .wave span:nth-child(2){animation-delay:.15s}.voice-bar.speaking .wave span:nth-child(3){animation-delay:.3s}.voice-bar.speaking .wave span:nth-child(4){animation-delay:.45s}@keyframes talk{50%{transform:scaleY(.25)}}.voice-state{font-size:.8125rem}.voice-ignored{color:var(--faint);font-style:italic}.btn.end{color:var(--err)}.rail{width:var(--rail-w);border-left:1px solid var(--line);background:var(--bg);flex:none;padding:0 12px 24px;overflow:auto}.panel-handle{z-index:6;cursor:col-resize;touch-action:none;outline:none;flex:none;width:6px;margin:0 -3px;position:relative}.panel-handle:before{content:"";background:0 0;width:1px;transition:background .12s;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}.panel-handle:hover:before,.panel-handle.dragging:before,.panel-handle:focus-visible:before{background:var(--accent);width:2px}html.resizing,html.resizing *{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}html.resizing iframe{pointer-events:none}.workspace{flex-direction:column;flex:1;min-height:0;display:flex}.pane-grid{flex:1;min-height:0;display:grid}.pane{outline:none;flex-direction:column;min-width:0;min-height:0;display:flex;container-type:inline-size}.pane[hidden]{display:none}.pane>.session-layout{flex:1;height:auto;min-height:0}.workspace.ws-split .pane{box-shadow:inset 0 0 0 1px var(--line)}.workspace.ws-split .pane[data-focused]{box-shadow:inset 0 2px 0 var(--accent), inset 0 0 0 1px var(--line)}.pane:focus-visible{box-shadow:inset 0 0 0 2px var(--accent)!important}.pane-bar{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:6px;padding:4px 12px;display:flex}.pane-count{margin-left:auto;font-size:.75rem}.pane-tools{flex:none;gap:2px;display:inline-flex}@container (width<=720px){.pane .chip-server{display:none}}.icon-btn.flip svg{transform:rotate(180deg)}.pane-handle{width:auto;margin:0}.pane-handle[data-axis=rows]{cursor:row-resize}.pane-handle[data-axis=rows]:before{width:auto;height:1px;inset:50% 0 auto;transform:translateY(-50%)}.pane-handle[data-axis=rows]:hover:before,.pane-handle[data-axis=rows].dragging:before,.pane-handle[data-axis=rows]:focus-visible:before{width:auto;height:2px}html.resizing-rows,html.resizing-rows *{cursor:row-resize!important;-webkit-user-select:none!important;user-select:none!important}.pane-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;flex:none;display:flex;overflow-x:auto}.pane-tab{border-bottom:2px solid #0000;flex:none;align-items:center;min-width:0;max-width:60%;padding-right:4px;display:flex}.pane-tab.selected{border-bottom-color:var(--accent)}.pane-tab [role=tab]{min-height:40px;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;padding:0 4px 0 12px;overflow:hidden}.pane-tab.selected [role=tab]{color:var(--text)}.rail-head{justify-content:space-between;align-items:center;height:48px;display:flex}.rail-title{color:var(--muted);font-size:.8125rem}.rail-card{border-top:1px solid var(--line);padding:12px 0}.rail-card h3{color:var(--faint);justify-content:space-between;margin:0 0 8px;font-size:.75rem;font-weight:500;display:flex}.kv{grid-template-columns:64px 1fr;gap:4px 8px;margin:0;font-size:.7812rem;display:grid}.kv dt{color:var(--faint)}.kv dd{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.kv dd.kv-path{align-items:center;gap:4px;display:flex}.kv-path .path-tail{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;min-width:0;overflow:hidden}.kv-path .icon-btn{flex:none;width:22px;height:22px}.meter{background:var(--raise-2);border-radius:3px;height:6px;margin-bottom:6px;overflow:hidden}.meter span{background:var(--accent);height:100%;display:block}.meter span.hot{background:var(--warn)}.mcp-list,.file-list{margin:0;padding:0;list-style:none}.mcp-list li{align-items:center;gap:8px;padding:2px 0;font-size:.7812rem;display:flex}.mcp-name{text-overflow:ellipsis;flex:1;overflow:hidden}.mcp-dot{background:var(--faint);border-radius:50%;width:6px;height:6px}.mcp-dot.connected{background:var(--ok)}.mcp-dot.failed,.mcp-dot.needs_auth{background:var(--err)}.mcp-dot.pending{background:var(--warn)}.diffstat{font-family:var(--mono);font-size:.75rem}.file{cursor:pointer;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;width:100%;padding:3px 4px;font-size:.7812rem;display:flex}.file:hover{background:var(--raise-2)}.file-status{font:600 .6562rem var(--mono);width:14px;color:var(--warn)}.file-status.added{color:var(--add)}.file-status.deleted{color:var(--del)}.file-name{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--mono);direction:rtl;flex:1;overflow:hidden}.diff-panel{z-index:20;background:var(--side);border:1px solid var(--line-2);border-radius:12px;flex-direction:column;display:flex;position:absolute;inset:48px 12px 12px;box-shadow:0 16px 48px #000a}.diff-head{border-bottom:1px solid var(--line);align-items:center;gap:10px;padding:8px 10px;display:flex}.diff-head select{min-width:0;font-family:var(--mono);flex:1;font-size:.7812rem}.wrap-toggle{align-items:center;gap:4px;display:inline-flex}.diff-body{flex:1;overflow:auto}table.diff{border-collapse:collapse;width:100%;font:.75rem/1.55 var(--mono)}table.diff td{vertical-align:top;padding:0 8px}table.diff .ln{width:1%;color:var(--faint);text-align:right;-webkit-user-select:none;user-select:none;white-space:nowrap}table.diff .code-line{white-space:pre}.diff-body.wrap table.diff .code-line{white-space:pre-wrap;overflow-wrap:anywhere}table.diff tr.add{background:#7fb68518}table.diff tr.del{background:#e06c7518}table.diff tr.hunk td{color:var(--faint);background:var(--raise);padding:3px 8px}table.diff .sign{color:var(--faint);margin-right:8px}.settings,.new-session{flex-direction:column;height:100%;min-height:0;display:flex}.settings-body{flex:1;gap:28px;padding:0 24px;display:flex;overflow:auto}.settings-nav{flex-direction:column;flex:none;align-self:flex-start;gap:2px;width:200px;padding-top:20px;display:flex;position:sticky;top:0}.settings-nav a{color:var(--muted);border-radius:6px;padding:6px 10px}.settings-nav a:hover{background:var(--raise-2);color:var(--text)}.settings-nav a[aria-current=page]{background:var(--raise-2);color:var(--text);box-shadow:inset 2px 0 0 var(--accent);font-weight:500}.settings-search{margin-bottom:10px}.settings-search input{width:100%}.settings-content{flex:1;min-width:0;max-width:720px;padding:12px 0 48px}.settings-page-title{font:400 1.5rem var(--serif);margin:10px 0 4px}.settings-section{border-bottom:1px solid var(--line);padding:16px 0;scroll-margin-top:8px}.settings-section:last-child{border-bottom:0}.settings-section .section-title{font:400 1.125rem var(--serif);color:var(--text);margin:0 0 10px}.settings-section h3{color:var(--muted);font-size:.8125rem;font-weight:500}.settings-footer{margin-top:24px}.settings-results,.settings-list{border:1px solid var(--line);border-radius:10px;margin:8px 0;padding:0;list-style:none}.settings-results li,.settings-list li{border-bottom:1px solid var(--line)}.settings-results li:last-child,.settings-list li:last-child{border-bottom:0}.settings-results a,.settings-list a{color:inherit;align-items:center;gap:10px;padding:10px 12px;display:flex}.settings-results a{flex-direction:column;align-items:flex-start;gap:2px}.settings-results a:hover,.settings-list a:hover{background:var(--raise-2)}.settings-list .grow{flex-direction:column;gap:2px;min-width:0;display:flex}.settings-list .icon{color:var(--faint);flex:none}.settings-empty{padding:12px 0}.settings-hit{border-radius:6px;animation:2.4s ease-out settings-hit}@keyframes settings-hit{0%,40%{background:color-mix(in srgb, var(--accent) 22%, transparent);box-shadow:0 0 0 2px var(--accent)}to{background:0 0;box-shadow:0 0 0 2px #0000}}.list{border:1px solid var(--line);border-radius:10px;margin:0;padding:0;list-style:none}.list li{border-bottom:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:8px;padding:10px 12px;display:flex}.list li:last-child{border-bottom:0}.list li.disabled{opacity:.6}.name{font-weight:500}.switches{flex-direction:column;gap:10px;margin:10px 0 0;padding:0;list-style:none;display:flex}.appearance-theme{justify-content:space-between;align-items:center;gap:12px;display:flex}.theme-toggle{border:1px solid var(--line);background:var(--raise-2);border-radius:999px;gap:2px;padding:3px;display:inline-flex}.theme-choice{min-height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:999px;align-items:center;gap:5px;padding:2px 9px;font-size:.75rem;display:inline-flex}.theme-choice:hover{color:var(--text)}.theme-choice[aria-checked=true]{background:var(--raise);color:var(--text);box-shadow:0 1px 3px var(--shadow)}.switch{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;display:flex}.speed{align-items:center;gap:12px;display:flex}.speed input{accent-color:var(--accent);flex:1}.account-card{align-items:center;gap:12px;display:flex}.field{flex-direction:column;gap:4px;display:flex}.field label,.field-label{color:var(--muted);font-size:.7812rem}.field .row input{flex:1}.field-error{color:var(--err);margin:0;font-size:.75rem}.inherit{color:var(--faint);margin:0}.speech-card{flex-direction:column;gap:10px;display:flex}.speech-card legend{color:var(--muted);padding:0 6px}.key-summary{margin:0;font-size:.8125rem}.entry{flex-direction:column;gap:14px;max-width:440px;margin:0 auto;padding:12vh 20px 40px;display:flex}.brand-big{align-items:center;gap:12px;margin:0;font-size:1.875rem;display:flex}.pair-code{font-family:var(--mono);letter-spacing:.3em;font-size:1.25rem}.greeting{margin:0 0 18px;font-size:1.625rem}details.card summary{cursor:pointer;color:var(--muted)}.drawer-backdrop,.sheet-backdrop{z-index:30;background:#0009;position:fixed;inset:0}@media (max-width:760px){.shell.phone .sidebar{z-index:40;width:min(86vw,320px);padding-top:env(safe-area-inset-top);position:fixed;inset:0 auto 0 0;box-shadow:8px 0 32px #000a}.topbar{padding-top:env(safe-area-inset-top);height:calc(48px + env(safe-area-inset-top))}.home{padding:16px 14px 40px}.home-head h1{font-size:1.5rem}.column{padding:0 14px}.chip-server,.btn.changes{display:none}.rail{z-index:40;border:1px solid var(--line-2);width:auto;max-height:72vh;padding-bottom:calc(24px + env(safe-area-inset-bottom));border-radius:16px 16px 0 0;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -12px 40px #000a}.diff-panel{inset:calc(48px + env(safe-area-inset-top)) 0 0;border-radius:0}.settings-nav{display:none}.settings-body{padding:0 14px}.settings-page-title{display:none}.composer-meta .model-chip{max-width:40vw}.msg.user{max-width:92%}}.notify-status{border-radius:var(--r);border:1px solid var(--line);margin:8px 0;padding:8px 12px}.notify-status.warn{color:var(--warn);border-color:#5a4a2a}.notify-status.ok{color:var(--ok,inherit)}.notify-facts{grid-template-columns:max-content 1fr;gap:2px 12px;margin:0 0 8px;display:grid}.notify-facts dd{margin:0}.row-actions{flex-wrap:wrap;gap:8px;display:flex}.quiet-hours{flex-wrap:wrap;align-items:center;gap:8px;margin-top:6px;display:flex}.notify-summary{margin:4px 0 8px}.notify-status-row{flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:8px 0;display:flex}.notify-status-row .notify-status{flex:260px;margin:0}.notify-details summary{cursor:pointer;color:var(--muted)}.notify-details[open]{flex-basis:100%}.notify-details .notify-facts{margin:6px 0 0}.notify-group{border:1px solid var(--line);border-radius:10px;margin:8px 0 0}.notify-group>summary{cursor:pointer;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:10px 12px;list-style:none;display:flex}.notify-group>summary::-webkit-details-marker{display:none}.notify-group>summary:before{content:"▸";color:var(--faint);width:.8em}.notify-group[open]>summary:before{content:"▾"}#notifications .notify-group>summary h4{margin:0}.notify-group-summary{text-align:right;flex:1;min-width:0}.notify-group>.switches{padding:0 12px 8px}.notify-group h4,#notifications h4{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:14px 0 0;font-size:.8125rem;font-weight:500}.notify-kind{flex-direction:column;gap:2px;min-width:0;display:flex}.notify-kind .small{line-height:1.35}.switch input[type=checkbox]{flex:none}.notify-test{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.notify-test select{max-width:60vw}p.small.warn{color:var(--warn)}p.small.err{color:var(--err,#e5484d)}p.small.ok{color:var(--ok,inherit)}.voice-bar{flex-wrap:wrap}.voice-hint{color:var(--muted,inherit);flex-basis:100%;margin:2px 0 0}button.link{color:var(--accent,#fab283);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.tap-to-start{width:100%;margin-bottom:8px;padding:14px;font-size:1.05em;display:block}.new-column{max-width:720px;padding-top:12vh}.new-composer .composer-box{padding:14px 12px 8px 16px}.new-composer textarea{resize:none;width:100%;min-height:72px;color:inherit;font:inherit;background:0 0;border:0;outline:0;font-size:.9375rem}.icon-send{background:var(--accent);width:32px;height:32px;color:var(--accent-ink);cursor:pointer;border:0;border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.icon-send:disabled{background:var(--raise-2);color:var(--faint);cursor:not-allowed}.env-meta{flex-wrap:wrap;align-items:center;gap:4px;margin-top:8px;display:flex}.new-dir{overflow-wrap:anywhere;margin:6px 4px 0}.meta-chip{color:var(--faint);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;max-width:280px;padding:4px 8px;font-size:.7812rem;display:inline-flex}.meta-chip:hover:not(:disabled):not(.readonly){background:var(--raise-2);color:var(--text)}.meta-chip.readonly{cursor:default}.meta-chip .icon{flex:none;width:14px;height:14px}.meta-chip .online-dot{margin:0}.chip-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.meta-chip.folder-chip.unset{color:var(--text);box-shadow:inset 0 0 0 1px var(--line-2)}.meta-chip.folder-chip.unset.asked{color:var(--warn);box-shadow:inset 0 0 0 1px var(--warn)}.new-need-project{color:var(--warn);margin:6px 4px 0}.chip-caret{opacity:.6}.toggle-chip input{margin:0}.folder-menu{width:360px;max-width:calc(100vw - 16px);padding:6px}.folder-search{box-sizing:border-box;width:100%;margin-bottom:4px}.folder-list{max-height:50vh;overflow:auto}.folder-list .menu-hint{text-overflow:ellipsis;white-space:nowrap;max-width:160px;overflow:hidden}.rail-card h3{align-items:center}.card-toggle{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:4px;padding:0;display:inline-flex}.card-toggle:hover{color:var(--text)}.card-chevron{width:12px;height:12px;transition:transform .15s;transform:rotate(90deg)}.rail-card.collapsed .card-chevron{transform:rotate(0)}.rail-card.collapsed h3{margin-bottom:0}.new-column{box-sizing:border-box;width:100%}.menu-label{flex:1 0 auto;max-width:100%}.menu-hint{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;overflow:hidden}.crumb{white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:4px;max-width:30%;font-size:.8125rem;text-decoration:none;display:inline-flex;overflow:hidden}.crumb:hover{color:var(--text)}.crumb-chev{width:12px;height:12px;transform:rotate(180deg)}.crumb-sep{margin:0 4px}.sync-note{z-index:30;pointer-events:none;background:var(--side);color:var(--muted,var(--faint));border:1px solid var(--line);border-radius:999px;padding:2px 10px;font-size:.857rem;position:absolute;top:6px;left:50%;transform:translate(-50%)}.sync-note.updated{color:var(--accent)}.jobs-badge{background:var(--line);min-width:16px;height:16px;color:var(--text);border-radius:8px;flex:none;justify-content:center;align-items:center;margin-left:4px;padding:0 4px;font-size:.75rem;line-height:1;display:inline-flex}.terminal-wait{white-space:nowrap;flex:none;margin-left:4px;font-size:.75rem}.job-list{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.job{grid-template-columns:auto 1fr;align-items:center;column-gap:8px;display:grid}.job .muted{grid-column:2}.job-command{text-overflow:ellipsis;white-space:nowrap;font-size:.893rem;overflow:hidden}.job-dot{background:var(--faint);border-radius:50%;width:7px;height:7px}.job-dot.on{background:var(--accent)}.job-dot.bad{background:var(--warn)}.retry-note{color:var(--warn);margin:0 0 6px}.activity-hint{border:1px solid var(--accent);border-radius:var(--r);background:color-mix(in srgb, var(--accent) 10%, transparent);margin:6px 0 10px;padding:8px 10px;font-size:.929rem}.scroller,.home-scroll{touch-action:pan-x pan-y}@media (pointer:coarse){input[type=search],input[type=text],input[type=password],input[type=number],select,textarea,.composer textarea,.new-composer textarea{font-size:max(16px,1rem)}}.banner.session-error{border-width:0 0 1px;border-color:color-mix(in srgb, var(--err) 45%, var(--line));background:color-mix(in srgb, var(--err) 10%, var(--bg));color:var(--text);border-radius:0;justify-content:flex-start;align-items:flex-start;margin:0}.session-error-mark,.turn-error-mark{color:var(--err);flex:none;font-weight:600;line-height:1.4}.session-error-body,.turn-error-body{flex-direction:column;gap:2px;min-width:0;display:flex}.session-error-head,.turn-error-head{color:var(--err);flex-wrap:wrap;align-items:baseline;gap:4px 8px;display:flex}.session-error-status,.turn-error-status{border:1px solid;border-radius:999px;padding:0 6px;font-size:.75rem}.session-error-where{font-size:.8125rem}.session-error-dismiss{flex:none;margin-top:-4px;margin-bottom:-4px;margin-left:auto}.session-error-message,.turn-error-message{overflow-wrap:anywhere;white-space:pre-wrap;max-height:8em;font-size:.8125rem;overflow:auto}.msg.turn-error{border:1px solid color-mix(in srgb, var(--err) 45%, var(--line));border-radius:var(--r);background:color-mix(in srgb, var(--err) 8%, transparent);align-items:flex-start;gap:8px;padding:8px 12px;display:flex}.msg.turn-retry{color:var(--muted);overflow-wrap:anywhere;align-items:baseline;gap:8px;margin:6px 0;font-size:.8125rem;display:flex}.msg.turn-retry.waiting{color:var(--warn)}.turn-retry-mark{flex:none}.error-badge{background:var(--err);min-width:16px;height:16px;color:var(--bg);border-radius:8px;flex:none;justify-content:center;align-items:center;margin-left:4px;font-size:.75rem;font-weight:700;line-height:1;display:inline-flex}.col-now.error,.home-item-meta.error{color:var(--err)}.rail-error{color:var(--err);border:1px solid color-mix(in srgb, var(--err) 45%, var(--line));border-radius:var(--r);overflow-wrap:anywhere;margin:0 0 10px;padding:6px 10px}@media (max-width:760px){.banner.session-error{padding:8px 14px}.session-error-message{max-height:5.5em}}.recording-indicator{border:1px solid var(--err);min-height:22px;color:var(--err);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:5px;padding:0 8px;font-size:.75rem;font-weight:500;text-decoration:none;display:inline-flex}.recording-indicator:hover{background:color-mix(in srgb, var(--err) 10%, transparent)}.recording-indicator:focus-visible{outline:2px solid var(--err);outline-offset:2px}.recording-indicator.no-audio{border-style:dashed}.recording-dot{background:var(--err);border-radius:50%;flex:none;width:8px;height:8px}.recording-note{color:var(--warn);white-space:nowrap}.concierge-status .recording-indicator,.concierge-status .recording-note{vertical-align:middle;margin-left:6px}.recording-details{gap:4px;margin:6px 0 0;padding-left:18px;display:grid}.recording-head{flex-wrap:wrap;align-items:center;gap:8px;margin:12px 0 6px;display:flex}.recording-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.recording-row{border:1px solid var(--line);border-radius:8px;gap:4px;padding:8px 10px;display:grid}.recording-live{color:var(--err)}.recording-actions{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.recording-segment{width:64px}
|