@spencer-kit/coder-studio 0.4.8 → 0.4.9

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.
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-CpWojdLp.js";import{A as t,At as n,B as r,Bt as i,C as a,Ct as o,Dt as s,E as c,Et as l,F as u,Ft as d,Ht as f,I as p,It as ee,Jt as te,Kt as m,L as ne,Lt as h,Mt as g,Nt as re,Ot as _,P as v,Pt as ie,Q as y,Qt as ae,R as oe,Rt as se,T as ce,Tt as le,U as ue,Ut as b,X as x,Xt as de,Y as S,Yt as fe,Z as C,Zt as pe,an as w,at as T,b as me,c as he,ct as E,dn as D,dt as O,fn as k,gn as A,hn as ge,in as _e,it as ve,jt as ye,kt as be,lt as xe,mn as j,nn as Se,nt as M,on as Ce,pn as N,qt as we,rn as P,st as Te,t as Ee,tn as De,un as F,ut as I,w as L,wt as R,x as Oe,z,zt as ke}from"./components-SjBXPKn9.js";import"./xterm-BVlcrOZ1.js";var B=e(A(),1),V=e(F(),1),H=o();function Ae(){return w()===`mobile`?(0,H.jsx)(Ee,{}):(0,H.jsx)(he,{})}function U(){return(0,H.jsx)(Ce,{children:(0,H.jsx)(Ae,{})})}var W=1e3;function je(){let e=N(se),t=N(g),n=N(_e),[r,i]=k(P),[a,o]=k(De),s=j(Se),c=(0,B.useRef)(null),l=(0,B.useRef)(null),u=(0,B.useCallback)(async()=>{if(!e)return!1;if(t!==`connected`)try{await e.connect()}catch{return s(null),i(e=>e===`gated`?e:`idle`),!1}if(c.current)return c.current;i(`claiming`);let r=e.sendCommand(`activation.claim`,{clientInstanceId:n}).then(e=>(o(e.generation),s(null),i(`active`),!0)).catch(()=>(s(null),i(e=>e===`gated`?e:`idle`),!1)).finally(()=>{c.current=null});return c.current=r,r},[n,t,o,s,i,e]);return(0,B.useEffect)(()=>{if(l.current!==null&&(clearTimeout(l.current),l.current=null),!(!e||t!==`connected`||r!==`idle`))return l.current=setTimeout(()=>{l.current=null,c.current||u()},W),()=>{l.current!==null&&(clearTimeout(l.current),l.current=null)}},[u,t,r,e]),(0,B.useEffect)(()=>()=>{l.current!==null&&(clearTimeout(l.current),l.current=null),!(!e||a===null)&&e.sendCommand(`activation.release`,{clientInstanceId:n,generation:a}).catch(()=>{})},[n,a,e]),{status:r,generation:a,claim:u}}var G=null,K=null,Me={refreshGit:!1,refreshBranches:!1,refreshWorktrees:!1,markTreeStale:!1,refreshEditorBuffers:!1},Ne=250,q=`ui.themeId`,J=`ui.theme`;function Y(e){return e===`fs_change`}function Pe(){let e=localStorage.getItem(q);if(e!==null)try{return JSON.parse(e)}catch{return}let t=localStorage.getItem(J);if(t!==null)try{return JSON.parse(t)}catch{return}}function Fe(e,t){console.error(`[RecoveryCoordinator] ${e} failed:`,t)}function Ie(e,t){return{refreshGit:e.refreshGit||!!t.refreshGit,refreshBranches:e.refreshBranches||!!t.refreshBranches,refreshWorktrees:e.refreshWorktrees||!!t.refreshWorktrees,markTreeStale:e.markTreeStale||!!t.markTreeStale,refreshEditorBuffers:e.refreshEditorBuffers||!!t.refreshEditorBuffers}}function Le(e){let n=e.get(l),r=e.get(s),i=Object.values(e.get(R)).map(e=>e.terminalId).filter(e=>!!e);e.set(s,{}),e.set(l,[]),e.set(be,`idle`),e.set(_,null),e.set(R,{}),e.set(le,null),e.set(t,new Map);for(let t of n){let n=r[t];n&&v.disposeWorkspace(n.path),e.set(xe(t),null),e.set(O(t),new Set),e.set(E(t),null),e.set(ve(t),null),e.set(M(t),{current:``,branches:[],loading:!1}),e.set(T(t),{items:[],loading:!1}),e.set(I(t),!1),e.set(Te(t),0)}for(let t of i)e.set(c(t),null)}function Re(e,t){let n=e.match(/^workspace\.([^.]+)\.(fs\.dirty|git\.state)$/);if(!n)return null;let r=n[1];if(n[2]===`fs.dirty`){let e=t??{};return{workspaceId:r,hint:{refreshGit:!0,refreshBranches:e.reason===`git_metadata`,refreshWorktrees:e.reason===`git_metadata`,markTreeStale:Y(e.reason),refreshEditorBuffers:e.reason===`fs_change`||e.reason===`file_content`}}}let i=t??{};return{workspaceId:r,hint:{refreshGit:!0,refreshBranches:!!i.branchChanged,refreshWorktrees:!!i.worktreeChanged,markTreeStale:!!i.treeChanged,refreshEditorBuffers:!!i.treeChanged}}}function ze({children:e}){let[,o]=k(se),[c,l]=k(m),_=N(n),v=N(b),y=N(g),x=N(P),S=N(le),C=j(g),w=j(ye),he=j(h),E=j(n),D=j(ee),O=j(d),A=j(ie),_e=j(s),be=j(R),xe=j(t),Ce=j(r),Ee=j(u),F=ge(),V=N(re),{claim:Ae}=je();ue();let U=(0,B.useRef)(null),W=(0,B.useRef)(V),J=(0,B.useRef)(new Map),Y=(0,B.useRef)(new Map),ze=(0,B.useRef)(S),X=(0,B.useRef)(!1),Z=(0,B.useRef)(null),Q=(0,B.useRef)({mode:`inactive`,workspaceId:null}),$=(0,B.useRef)({theme:0,personalization:0}),Ve=(0,B.useRef)(!1);(0,B.useEffect)(()=>{W.current=V},[V]);let He=()=>{if(!X.current||y!==`connected`||document.visibilityState!==`visible`||x!==`active`)return;let e=S;e&&(X.current=!1,W.current(`git.status`,{workspaceId:e}).then(t=>{t.ok&&t.data&&F.set(ve(e),t.data)}),W.current(`git.branches`,{workspaceId:e}).then(t=>{t.ok&&t.data&&F.set(M(e),{current:t.data.current,branches:t.data.branches,loading:!1})}),W.current(`worktree.list`,{workspaceId:e}).then(t=>{t.ok&&t.data&&Array.isArray(t.data.worktrees)&&F.set(T(e),{items:t.data.worktrees,loading:!1,lastLoadedAt:Date.now()})}))};return(0,B.useEffect)(()=>{He()},[x,S,y]),(0,B.useEffect)(()=>{if(y!==`connected`)return;let e=!1,t=F.get(r),n=!1,i=!1,a=!1,o=F.sub(r,()=>{let e=F.get(r);e.copyOnSelect!==t.copyOnSelect&&(n=!0),e.desktopFontSize!==t.desktopFontSize&&(i=!0),e.mobileFontSize!==t.mobileFontSize&&(a=!0),t=e});return(async()=>{let t=await V(`settings.get`,{});if(e||!t.ok||!t.data)return;let o=F.get(r),s=i?o.desktopFontSize:z(t.data,`desktop`),c=a?o.mobileFontSize:z(t.data,`mobile`),l=ne(t.data),u=p(t.data,`desktop`),d=p(t.data,`mobile`);Ce({copyOnSelect:n?o.copyOnSelect:oe(t.data),desktopFontSize:s,mobileFontSize:c,fontSize:u||d||l?z(t.data,`desktop`):o.fontSize})})(),()=>{e=!0,o()}},[y,V,Ce,F]),(0,B.useEffect)(()=>{if(y!==`connected`)return;let e=!1;return(async()=>{let t=await V(`updates.getState`,{});e||!t.ok||!t.data||Ee(t.data)})(),()=>{e=!0}},[y,V,Ee]),(0,B.useEffect)(()=>{ze.current=S},[S]),(0,B.useEffect)(()=>{y===`connected`&&F.get(P)!==`gated`&&Ae()},[Ae,y,F]),(0,B.useEffect)(()=>{a()?.handleActivationStatus(x)},[x]),(0,B.useEffect)(()=>{Ve.current=localStorage.getItem(q)!==null;let e=te(Pe());l(e),localStorage.setItem(q,JSON.stringify(e))},[l]),(0,B.useEffect)(()=>{let e=pe(c);document.documentElement.setAttribute(`data-theme`,e.documentThemeAttr),localStorage.setItem(q,JSON.stringify(e.id))},[c]),(0,B.useEffect)(()=>{let e=()=>{we(F.get(f),F.get(m))};e();let t=F.sub(m,e),n=F.sub(f,e);if(typeof window>`u`||typeof window.matchMedia!=`function`)return()=>{t(),n()};let r=window.matchMedia(`(max-width: 899px), (pointer: coarse)`),i=()=>{e()};return typeof r.addEventListener==`function`?(r.addEventListener(`change`,i),()=>{t(),n(),r.removeEventListener(`change`,i)}):(r.addListener(i),()=>{t(),n(),r.removeListener(i)})},[F]),(0,B.useEffect)(()=>{if(y!==`connected`)return;let e=!1;return(async()=>{let t={...$.current},n=await V(`settings.get`,{});if(e||!n.ok||!n.data)return;let r=n.data,i=$.current.theme===t.theme;Ve.current?Ve.current=!1:i&&l(ae(r[`appearance.themeId`]??r[`appearance.theme`]??Pe())),$.current.personalization===t.personalization&&F.set(f,de(r))})(),()=>{e=!0}},[y,V,l]),(0,B.useEffect)(()=>{let e=F.sub(m,()=>{$.current.theme+=1}),t=F.sub(f,()=>{F.get(f)!==fe&&($.current.personalization+=1)});return()=>{e(),t()}},[F]),(0,B.useEffect)(()=>{(async()=>{try{let e=await(await fetch(`/auth/status`)).json();E(!!e.authEnabled),F.set(b,!!e.authenticated||e.authEnabled===!1)}catch{F.set(b,!1)}})()},[E,F]),(0,B.useEffect)(()=>{if(_===null)return;if(_===!0&&!v){K&&=(clearTimeout(K),null),G&&=(G.disconnect(`auth_required`),null),L(),U.current=null,o(null),C(`connecting`),w(null),he(null),D(0),O(null),A(!1);return}let e=e=>{C(e),e===`reconnecting`&&(D(e=>e+1),O(e=>e??Date.now()),F.set(P,e=>e===`gated`?e:`idle`),Q.current={mode:`inactive`,workspaceId:null},X.current=!0),(e===`disconnected`||e===`rejected`)&&(A(!1),F.set(P,e=>e===`gated`?e:`idle`),Q.current={mode:`inactive`,workspaceId:null},e===`disconnected`&&(X.current=!0)),e===`connected`&&(D(0),O(null),s(!0))},t=e=>{W.current(`git.status`,{workspaceId:e}).then(t=>{t.ok&&t.data&&F.set(ve(e),t.data)}).catch(e=>{console.error(`[Git Status] git.status command threw error:`,e)})},n=()=>{if(Q.current.mode===`inactive`)return;let e=U.current;e&&(Q.current={mode:`inactive`,workspaceId:null},e.sendCommand(`workspace.deactivate`,{}).catch(()=>{}))},r=e=>{if(F.get(P)!==`active`)return;let t=Q.current;if(t.mode===`active`&&t.workspaceId===e)return;let n=U.current;n&&(Q.current={mode:`active`,workspaceId:e},n.sendCommand(`workspace.activate`,{workspaceId:e}).catch(()=>{}))},s=(e=!1)=>{if(document.visibilityState===`hidden`){n();return}let t=ze.current;if(!t){n();return}e&&(Q.current={mode:`inactive`,workspaceId:null}),r(t)},c=()=>{if(F.get(P)===`gated`)return;if(s(),document.visibilityState!==`visible`){Z.current=null;return}let e=Date.now(),t=Z.current;t!==null&&e-t<Ne||(Z.current=e,a()?.notifyReason(`foreground_resume`).catch(e=>{Fe(`foreground_resume`,e)}))},l=()=>{if(document.visibilityState===`hidden`){Z.current=null,s();return}c()},u=()=>{c()},d=()=>{c()},f=()=>{F.get(P)!==`gated`&&a()?.notifyReason(`network_online`).catch(e=>{Fe(`network_online`,e)})},p=e=>{W.current(`git.branches`,{workspaceId:e}).then(t=>{if(t.ok&&t.data){F.set(M(e),{current:t.data.current,branches:t.data.branches,loading:!1});return}F.set(M(e),e=>({...e,loading:!1,error:t.error?.message??e.error}))}).catch(e=>{console.error(`[Git Branches] git.branches command threw error:`,e)})},ee=e=>{F.set(T(e),e=>({...e,loading:!0,error:void 0})),W.current(`worktree.list`,{workspaceId:e}).then(t=>{if(t.ok&&t.data&&Array.isArray(t.data.worktrees)){F.set(T(e),{items:t.data.worktrees,loading:!1,lastLoadedAt:Date.now()});return}F.set(T(e),e=>({...e,loading:!1,error:t.error?.message??e.error}))}).catch(t=>{console.error(`[Worktree List] worktree.list command threw error:`,t),F.set(T(e),e=>({...e,loading:!1,error:t instanceof Error?t.message:String(t)}))})},te=(e,n)=>{let r=Ie(Y.current.get(e)??Me,n);if(Y.current.set(e,r),J.current.get(e))return;let i=setTimeout(()=>{J.current.delete(e);let n=Y.current.get(e)??Me;Y.current.delete(e),n.markTreeStale&&F.set(I(e),!0),n.refreshEditorBuffers&&F.set(Te(e),e=>e+1),n.refreshGit&&t(e),n.refreshBranches&&p(e),n.refreshWorktrees&&ee(e)},60);J.current.set(e,i)},m=(e,t,n)=>{if(e===`activation.revoked`){let e=t??{};F.set(P,`gated`),F.set(Se,typeof e.reason==`string`&&e.reason.length>0?e.reason:`displaced`),F.set(De,typeof e.generation==`number`?e.generation:null),Le(F),Q.current={mode:`inactive`,workspaceId:null},X.current=!1,U.current?.disconnect(`single_active_displaced`);return}let r=Re(e,t);r&&te(r.workspaceId,r.hint);try{Be(e,t,F)}catch(t){console.error(`Error handling event for topic ${e}:`,t)}},ne=[`connection.*`,`activation.*`,`update.*`,`workspace.*`];if(K&&=(clearTimeout(K),null),G){U.current=G,o(G);let t=G.getStatus();C(t);let n=G.onStatus(e),r=G.subscribe(ne,m);return a()||ce(me({wsClient:G,sendCommand:Oe((e,t,n)=>G.sendCommand(e,t,n)),applyReplay:async()=>{},applySnapshot:async()=>{}})),(t===`disconnected`||t===`reconnecting`)&&G.recoverConnection(`manual_retry`),s(),document.addEventListener(`visibilitychange`,l),window.addEventListener(`focus`,u),window.addEventListener(`pageshow`,d),window.addEventListener(`online`,f),()=>{document.removeEventListener(`visibilitychange`,l),window.removeEventListener(`focus`,u),window.removeEventListener(`pageshow`,d),window.removeEventListener(`online`,f),n(),r(),J.current.forEach(e=>clearTimeout(e)),J.current.clear(),Y.current.clear(),U.current=null,G&&(K=setTimeout(()=>{G&&=(G.disconnect(`app_unmount`),null),L(),K=null},50))}}let h=new ke(i());G=h,ce(me({wsClient:h,sendCommand:Oe((e,t,n)=>h.sendCommand(e,t,n)),applyReplay:async()=>{},applySnapshot:async()=>{}})),U.current=h,o(h);let g=h.onStatus(e),re=h.subscribe(ne,m);return h.connect().catch(e=>{console.error(`Failed to connect WebSocket:`,e),w(e.message||`Connection failed`)}),s(),document.addEventListener(`visibilitychange`,l),window.addEventListener(`focus`,u),window.addEventListener(`pageshow`,d),window.addEventListener(`online`,f),()=>{document.removeEventListener(`visibilitychange`,l),window.removeEventListener(`focus`,u),window.removeEventListener(`pageshow`,d),window.removeEventListener(`online`,f),g(),re(),J.current.forEach(e=>clearTimeout(e)),J.current.clear(),Y.current.clear(),U.current=null,K=setTimeout(()=>{G&&=(G.disconnect(`app_unmount`),null),L(),K=null},50)}},[o,C,w,he,E,D,O,A,_e,be,xe,F,_,v]),(0,B.useEffect)(()=>{if(_===null)return;if(_===!0&&!v){Q.current={mode:`inactive`,workspaceId:null};return}if(y!==`connected`||x!==`active`)return;if(document.visibilityState===`hidden`){if(Q.current.mode!==`inactive`){let e=U.current;if(!e)return;Q.current={mode:`inactive`,workspaceId:null},e.sendCommand(`workspace.deactivate`,{}).catch(()=>{})}return}if(!S){if(Q.current.mode!==`inactive`){let e=U.current;if(!e)return;Q.current={mode:`inactive`,workspaceId:null},e.sendCommand(`workspace.deactivate`,{}).catch(()=>{})}return}if(Q.current.mode===`active`&&Q.current.workspaceId===S)return;let e=U.current;e&&(Q.current={mode:`active`,workspaceId:S},e.sendCommand(`workspace.activate`,{workspaceId:S}).catch(()=>{}))},[S,x,_,v,y]),(0,H.jsx)(H.Fragment,{children:e})}function X(e,t){let n=e;return typeof n.version!=`string`||typeof n.serverInstanceId!=`string`?!1:(t.set(h,{version:n.version,serverInstanceId:n.serverInstanceId,authEnabled:typeof n.authEnabled==`boolean`?n.authEnabled:void 0}),typeof n.isWriter==`boolean`&&t.set(ie,n.isWriter),!0)}function Be(e,n,r){if(e===`connection.ready`){X(n,r),r.set(ye,null);return}if(e===`connection.status`){let e=n;e.status===`connected`&&X(n,r),e.status===`connected`&&e.authEnabled===!1&&r.set(b,!0),e.status===`error`&&e.message&&r.set(ye,e.message);return}if(e===`update.state.changed`){r.set(u,n);return}let i=e.match(/^workspace\.([^.]+)\.(.+)$/);if(i){let e=i[1],a=i[2];if(a===`meta`){let t=n;if(!(r.get(s)[e]||t.path))return;let i=t.uiState?{...t,uiState:x(t.uiState)}:t;r.set(s,t=>({...t,[e]:{...t[e],...i,id:e}}));let a=i.uiState?.paneLayout,o=a?C(a):null;o&&r.set(y(e),o),S(r,e,i.uiState),r.set(l,t=>t.includes(e)?t:[...t,e]),r.set(be,`ready`),r.set(_,null);return}if(a===`fs.dirty`){if(Y((n??{}).reason)){let t=I(e);r.set(t,!0)}return}if(a===`git.state`)return;let o=a.match(/^session\.([^.]+)\.(.+)$/);if(o){let e=o[1],i=o[2];if(i===`lifecycle`){if(n.event===`removed`){let t=r.get(R)[e];t?.terminalId&&r.set(c(t.terminalId),null),r.set(R,t=>{if(!(e in t))return t;let n={...t};return delete n[e],n})}return}if(i===`state`){let e=n;r.set(R,t=>({...t,[e.id]:e}));return}if(i===`progress`){console.log(`Session ${e} progress:`,n);return}if(i===`supervisor.state`){let e=n;if(e.event===`deleted`&&e.supervisorId)r.set(t,t=>{let n=new Map(t);for(let[t,r]of n.entries())if(r.id===e.supervisorId){n.delete(t);break}return n});else if(e.supervisor){let n=e.supervisor;r.set(t,e=>{let t=new Map(e);return t.set(n.sessionId,n),t})}return}}let u=a.match(/^terminal\.([^.]+)\.(.+)$/);if(u){let t=u[1],i=u[2];if(i===`created`){let i=n,a=c(t);r.set(a,{id:i.id,workspaceId:e,kind:i.kind,alive:!0,title:i.title});return}if(i===`output`)return;if(i===`exit`){let e=n,i=c(t),a=r.get(i);a&&r.set(i,{...a,exitCode:e.code,alive:!1});return}}}console.log(`Unhandled event topic: ${e}`,n)}V.createRoot(document.getElementById(`root`)).render((0,H.jsx)(D,{children:(0,H.jsx)(ze,{children:(0,H.jsx)(U,{})})}));
2
+ //# sourceMappingURL=main-BjHz157g.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-BjHz157g.js","names":[],"sources":["../../src/app.tsx","../../src/hooks/use-activation.ts","../../src/ws/reconnect.ts","../../src/app/providers.tsx","../../src/main.tsx"],"sourcesContent":["/**\n * Application root.\n *\n * Provides BrowserRouter and picks a shell based on viewport:\n * - mobile (< 900px) -> MobileShell\n * - desktop -> DesktopShell\n */\n\nimport { BrowserRouter } from \"react-router-dom\";\nimport { useViewport } from \"./hooks/use-viewport\";\nimport { DesktopShell } from \"./shells/desktop-shell\";\nimport { MobileShell } from \"./shells/mobile-shell\";\n\nfunction ShellSwitch() {\n const viewport = useViewport();\n\n return viewport === \"mobile\" ? <MobileShell /> : <DesktopShell />;\n}\n\nfunction App() {\n return (\n <BrowserRouter>\n <ShellSwitch />\n </BrowserRouter>\n );\n}\n\nexport default App;\n","import { useAtom, useAtomValue, useSetAtom } from \"jotai\";\nimport { useCallback, useEffect, useRef } from \"react\";\nimport {\n activationGenerationAtom,\n activationReasonAtom,\n activationStatusAtom,\n clientInstanceIdAtom,\n} from \"../atoms/activation\";\nimport { connectionStatusAtom, wsClientAtom } from \"../atoms/connection\";\n\ninterface ActivationClaimPayload {\n active: true;\n generation: number;\n recoveryMode: \"fresh\" | \"grace_recover\" | \"takeover\";\n}\n\nconst CLAIM_RETRY_DELAY_MS = 1_000;\n\nexport function useActivation() {\n const wsClient = useAtomValue(wsClientAtom);\n const connectionStatus = useAtomValue(connectionStatusAtom);\n const clientInstanceId = useAtomValue(clientInstanceIdAtom);\n const [status, setStatus] = useAtom(activationStatusAtom);\n const [generation, setGeneration] = useAtom(activationGenerationAtom);\n const setReason = useSetAtom(activationReasonAtom);\n const claimInFlightRef = useRef<Promise<boolean> | null>(null);\n const claimRetryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const claim = useCallback(async (): Promise<boolean> => {\n if (!wsClient) {\n return false;\n }\n\n if (connectionStatus !== \"connected\") {\n try {\n await wsClient.connect();\n } catch {\n setReason(null);\n setStatus((current) => (current === \"gated\" ? current : \"idle\"));\n return false;\n }\n }\n\n if (claimInFlightRef.current) {\n return claimInFlightRef.current;\n }\n\n setStatus(\"claiming\");\n\n const pending = wsClient\n .sendCommand<ActivationClaimPayload>(\"activation.claim\", {\n clientInstanceId,\n })\n .then((result) => {\n setGeneration(result.generation);\n setReason(null);\n setStatus(\"active\");\n return true;\n })\n .catch(() => {\n setReason(null);\n setStatus((current) => (current === \"gated\" ? current : \"idle\"));\n return false;\n })\n .finally(() => {\n claimInFlightRef.current = null;\n });\n\n claimInFlightRef.current = pending;\n return pending;\n }, [clientInstanceId, connectionStatus, setGeneration, setReason, setStatus, wsClient]);\n\n useEffect(() => {\n if (claimRetryTimerRef.current !== null) {\n clearTimeout(claimRetryTimerRef.current);\n claimRetryTimerRef.current = null;\n }\n\n if (!wsClient || connectionStatus !== \"connected\" || status !== \"idle\") {\n return;\n }\n\n claimRetryTimerRef.current = setTimeout(() => {\n claimRetryTimerRef.current = null;\n if (!claimInFlightRef.current) {\n void claim();\n }\n }, CLAIM_RETRY_DELAY_MS);\n\n return () => {\n if (claimRetryTimerRef.current !== null) {\n clearTimeout(claimRetryTimerRef.current);\n claimRetryTimerRef.current = null;\n }\n };\n }, [claim, connectionStatus, status, wsClient]);\n\n useEffect(() => {\n return () => {\n if (claimRetryTimerRef.current !== null) {\n clearTimeout(claimRetryTimerRef.current);\n claimRetryTimerRef.current = null;\n }\n\n if (!wsClient || generation === null) {\n return;\n }\n\n void wsClient\n .sendCommand(\"activation.release\", {\n clientInstanceId,\n generation,\n })\n .catch(() => {});\n };\n }, [clientInstanceId, generation, wsClient]);\n\n return {\n status,\n generation,\n claim,\n };\n}\n","/**\n * Reconnection Utilities\n *\n * Exponential backoff and reconnect state management.\n */\n\nexport interface ReconnectState {\n attempts: number;\n lastAttemptAt: number | null;\n nextDelayMs: number;\n maxAttemptsReached: boolean;\n}\n\nexport interface ReconnectConfig {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n jitterMs: number;\n}\n\nconst DEFAULT_CONFIG: ReconnectConfig = {\n maxAttempts: Number.POSITIVE_INFINITY,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitterMs: 100,\n};\n\n/**\n * Calculate next reconnect delay using exponential backoff with jitter\n */\nexport function calculateReconnectDelay(\n attempts: number,\n config: Partial<ReconnectConfig> = {}\n): number {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n\n // Exponential backoff: base * 2^attempts\n const exponentialDelay = cfg.baseDelayMs * Math.pow(2, attempts);\n\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, cfg.maxDelayMs);\n\n // Add jitter to prevent thundering herd\n const jitter = Math.random() * cfg.jitterMs;\n\n return cappedDelay + jitter;\n}\n\n/**\n * Create reconnect state tracker\n */\nexport function createReconnectTracker(config: Partial<ReconnectConfig> = {}) {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n let attempts = 0;\n let lastAttemptAt: number | null = null;\n\n return {\n recordAttempt(): ReconnectState {\n attempts++;\n lastAttemptAt = Date.now();\n\n return {\n attempts,\n lastAttemptAt,\n nextDelayMs: calculateReconnectDelay(attempts, cfg),\n maxAttemptsReached: attempts >= cfg.maxAttempts,\n };\n },\n\n reset(): void {\n attempts = 0;\n lastAttemptAt = null;\n },\n\n getState(): ReconnectState {\n return {\n attempts,\n lastAttemptAt,\n nextDelayMs: calculateReconnectDelay(attempts, cfg),\n maxAttemptsReached: attempts >= cfg.maxAttempts,\n };\n },\n };\n}\n","/**\n * Application Providers\n *\n * Initializes WebSocket connection and sets up event routing.\n * Manages connection lifecycle and maps WS events to Jotai atoms.\n */\n\nimport type {\n GitBranch,\n GitStatus,\n Session,\n Supervisor,\n UpdateStateView,\n Workspace,\n WorktreeInfo,\n} from \"@coder-studio/core\";\nimport { useAtom, useAtomValue, useSetAtom, useStore } from \"jotai\";\nimport type { Store } from \"jotai/vanilla/store\";\nimport { useEffect, useRef } from \"react\";\nimport {\n applyAppearancePersonalizationToDocument,\n applyResolvedTheme,\n DEFAULT_APPEARANCE_PERSONALIZATION,\n resolveAppearancePersonalizationSetting,\n} from \"../appearance\";\nimport {\n authEnabledAtom,\n connectionErrorAtom,\n connectionStatusAtom,\n dispatchCommandAtom,\n isWriterAtom,\n lastReconnectAttemptAtom,\n reconnectAttemptCountAtom,\n serverInfoAtom,\n sessionsAtom,\n workspaceOrderAtom,\n workspacesAtom,\n workspacesLoadErrorAtom,\n workspacesLoadStateAtom,\n wsClientAtom,\n} from \"../atoms\";\nimport {\n activationGenerationAtom,\n activationReasonAtom,\n activationStatusAtom,\n} from \"../atoms/activation\";\nimport { appearancePersonalizationAtom, authenticatedAtom, themeAtom } from \"../atoms/app-ui\";\nimport type { DispatchCommand } from \"../atoms/connection\";\nimport { activeWorkspaceIdAtom } from \"../atoms/workspaces\";\nimport {\n normalizePaneLayout,\n paneLayoutAtomFamily,\n} from \"../features/agent-panes/atoms/pane-layout\";\nimport { monacoModelRegistry } from \"../features/code-editor/monaco/model-registry\";\nimport { useSessionNotifications } from \"../features/notifications\";\nimport { supervisorsAtom } from \"../features/supervisor/atoms\";\nimport { terminalMetaAtomFamily } from \"../features/terminal-panel/atoms\";\nimport {\n hasExplicitTerminalFontSizeSetting,\n hasLegacyTerminalFontSizeSetting,\n resolveTerminalCopyOnSelectSetting,\n resolveTerminalFontSizeSetting,\n terminalPreferencesAtom,\n} from \"../features/terminal-panel/preferences\";\nimport {\n createRecoveryCoordinator,\n createRecoveryDispatchCommand,\n} from \"../features/terminal-panel/recovery-coordinator\";\nimport {\n getGlobalRecoveryCoordinator,\n resetGlobalRecoveryCoordinator,\n setGlobalRecoveryCoordinator,\n} from \"../features/terminal-panel/recovery-singleton\";\nimport { updateStateAtom } from \"../features/updates/atoms\";\nimport {\n hydrateWorkspaceEditorState,\n normalizeWorkspaceEditorUiState,\n} from \"../features/workspace/actions/open-editor-state\";\nimport {\n editorRefreshTokenAtomFamily,\n expandedDirsAtomFamily,\n fileTreeAtomFamily,\n fileTreeStaleAtomFamily,\n gitBranchListAtomFamily,\n gitStateAtomFamily,\n loadedDirsAtomFamily,\n worktreeListAtomFamily,\n} from \"../features/workspace/atoms\";\nimport { useActivation } from \"../hooks/use-activation\";\nimport { getThemeById, resolveStoredThemeId } from \"../theme\";\nimport type { ConnectionStatus, EventListener } from \"../ws\";\nimport { resolveWsUrl, WsClient } from \"../ws\";\n\n/**\n * Module-level WebSocket client singleton.\n * Prevents duplicate connections in React StrictMode.\n */\nlet globalWsClient: WsClient | null = null;\nlet pendingDisconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\ninterface WorkspaceRefreshHint {\n refreshGit: boolean;\n refreshBranches: boolean;\n refreshWorktrees: boolean;\n markTreeStale: boolean;\n refreshEditorBuffers: boolean;\n}\n\ninterface WorkspaceActivityState {\n mode: \"active\" | \"inactive\";\n workspaceId: string | null;\n}\n\ninterface AppearanceSelectionVersion {\n theme: number;\n personalization: number;\n}\n\nconst DEFAULT_REFRESH_HINT: WorkspaceRefreshHint = {\n refreshGit: false,\n refreshBranches: false,\n refreshWorktrees: false,\n markTreeStale: false,\n refreshEditorBuffers: false,\n};\nconst FOREGROUND_RECOVERY_COOLDOWN_MS = 250;\nconst THEME_ID_STORAGE_KEY = \"ui.themeId\";\nconst LEGACY_THEME_STORAGE_KEY = \"ui.theme\";\n\nfunction shouldMarkTreeStaleForFsReason(reason?: string): boolean {\n return reason === \"fs_change\";\n}\n\nfunction readStoredThemePreference(): unknown {\n const storedThemeId = localStorage.getItem(THEME_ID_STORAGE_KEY);\n if (storedThemeId !== null) {\n try {\n return JSON.parse(storedThemeId);\n } catch {\n return undefined;\n }\n }\n\n const legacyTheme = localStorage.getItem(LEGACY_THEME_STORAGE_KEY);\n if (legacyTheme !== null) {\n try {\n return JSON.parse(legacyTheme);\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n}\n\nexport function resetAppProvidersSingletonsForTests() {\n if (pendingDisconnectTimer) {\n clearTimeout(pendingDisconnectTimer);\n pendingDisconnectTimer = null;\n }\n globalWsClient = null;\n resetGlobalRecoveryCoordinator();\n}\n\nfunction reportRecoveryCoordinatorError(context: string, error: unknown) {\n console.error(`[RecoveryCoordinator] ${context} failed:`, error);\n}\n\nfunction mergeRefreshHints(\n current: WorkspaceRefreshHint,\n next: Partial<WorkspaceRefreshHint>\n): WorkspaceRefreshHint {\n return {\n refreshGit: current.refreshGit || Boolean(next.refreshGit),\n refreshBranches: current.refreshBranches || Boolean(next.refreshBranches),\n refreshWorktrees: current.refreshWorktrees || Boolean(next.refreshWorktrees),\n markTreeStale: current.markTreeStale || Boolean(next.markTreeStale),\n refreshEditorBuffers: current.refreshEditorBuffers || Boolean(next.refreshEditorBuffers),\n };\n}\n\nfunction resetServerProjectedState(store: Store): void {\n const workspaceIds = store.get(workspaceOrderAtom);\n const workspaces = store.get(workspacesAtom);\n const terminalIds = Object.values(store.get(sessionsAtom))\n .map((session) => session.terminalId)\n .filter((terminalId): terminalId is string => Boolean(terminalId));\n\n store.set(workspacesAtom, {});\n store.set(workspaceOrderAtom, []);\n store.set(workspacesLoadStateAtom, \"idle\");\n store.set(workspacesLoadErrorAtom, null);\n store.set(sessionsAtom, {});\n store.set(activeWorkspaceIdAtom, null);\n store.set(supervisorsAtom, new Map());\n\n for (const workspaceId of workspaceIds) {\n const workspace = workspaces[workspaceId];\n if (workspace) {\n monacoModelRegistry.disposeWorkspace(workspace.path);\n }\n store.set(fileTreeAtomFamily(workspaceId), null);\n store.set(loadedDirsAtomFamily(workspaceId), new Set());\n store.set(expandedDirsAtomFamily(workspaceId), null);\n store.set(gitStateAtomFamily(workspaceId), null);\n store.set(gitBranchListAtomFamily(workspaceId), {\n current: \"\",\n branches: [],\n loading: false,\n });\n store.set(worktreeListAtomFamily(workspaceId), {\n items: [],\n loading: false,\n });\n store.set(fileTreeStaleAtomFamily(workspaceId), false);\n store.set(editorRefreshTokenAtomFamily(workspaceId), 0);\n }\n\n for (const terminalId of terminalIds) {\n store.set(terminalMetaAtomFamily(terminalId), null);\n }\n}\n\nfunction parseWorkspaceRefreshHint(\n topic: string,\n payload: unknown\n): {\n workspaceId: string;\n hint: WorkspaceRefreshHint;\n} | null {\n const match = topic.match(/^workspace\\.([^.]+)\\.(fs\\.dirty|git\\.state)$/);\n if (!match) {\n return null;\n }\n\n const workspaceId = match[1]!;\n const subtopic = match[2]!;\n\n if (subtopic === \"fs.dirty\") {\n const data = (payload ?? {}) as { reason?: string };\n return {\n workspaceId,\n hint: {\n refreshGit: true,\n refreshBranches: data.reason === \"git_metadata\",\n refreshWorktrees: data.reason === \"git_metadata\",\n markTreeStale: shouldMarkTreeStaleForFsReason(data.reason),\n refreshEditorBuffers: data.reason === \"fs_change\" || data.reason === \"file_content\",\n },\n };\n }\n\n const data = (payload ?? {}) as {\n treeChanged?: boolean;\n branchChanged?: boolean;\n worktreeChanged?: boolean;\n };\n\n return {\n workspaceId,\n hint: {\n refreshGit: true,\n refreshBranches: Boolean(data.branchChanged),\n refreshWorktrees: Boolean(data.worktreeChanged),\n markTreeStale: Boolean(data.treeChanged),\n refreshEditorBuffers: Boolean(data.treeChanged),\n },\n };\n}\n\ninterface AppProvidersProps {\n children: React.ReactNode;\n}\n\nexport function AppProviders({ children }: AppProvidersProps) {\n const [, setWsClient] = useAtom(wsClientAtom);\n const [theme, setTheme] = useAtom(themeAtom);\n const authEnabled = useAtomValue(authEnabledAtom);\n const authenticated = useAtomValue(authenticatedAtom);\n const connectionStatus = useAtomValue(connectionStatusAtom);\n const activationStatus = useAtomValue(activationStatusAtom);\n const activeWorkspaceId = useAtomValue(activeWorkspaceIdAtom);\n const setConnectionStatus = useSetAtom(connectionStatusAtom);\n const setConnectionError = useSetAtom(connectionErrorAtom);\n const setServerInfo = useSetAtom(serverInfoAtom);\n const setAuthEnabled = useSetAtom(authEnabledAtom);\n const setReconnectCount = useSetAtom(reconnectAttemptCountAtom);\n const setLastReconnect = useSetAtom(lastReconnectAttemptAtom);\n const setIsWriter = useSetAtom(isWriterAtom);\n\n // Server state atoms\n const setWorkspaces = useSetAtom(workspacesAtom);\n const setSessions = useSetAtom(sessionsAtom);\n // Supervisor state atoms\n const setSupervisors = useSetAtom(supervisorsAtom);\n const setTerminalPreferences = useSetAtom(terminalPreferencesAtom);\n const setUpdateState = useSetAtom(updateStateAtom);\n\n // Get Jotai store for writing to atomFamily atoms\n const store = useStore();\n const dispatch = useAtomValue(dispatchCommandAtom);\n const { claim } = useActivation();\n\n useSessionNotifications();\n\n // Use refs to avoid stale closures in event handlers\n const wsClientRef = useRef<WsClient | null>(null);\n const dispatchRef = useRef<DispatchCommand>(dispatch);\n const refreshTimersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const refreshHintsRef = useRef<Map<string, WorkspaceRefreshHint>>(new Map());\n const activeWorkspaceIdRef = useRef<string | null>(activeWorkspaceId);\n const pendingReconnectRefreshRef = useRef(false);\n const lastForegroundRecoveryAtRef = useRef<number | null>(null);\n const workspaceActivityRef = useRef<WorkspaceActivityState>({\n mode: \"inactive\",\n workspaceId: null,\n });\n const appearanceSelectionVersionRef = useRef<AppearanceSelectionVersion>({\n theme: 0,\n personalization: 0,\n });\n const preferPersistedThemeOnFirstHydrationRef = useRef(false);\n\n // Keep dispatchRef in sync\n useEffect(() => {\n dispatchRef.current = dispatch;\n }, [dispatch]);\n\n const refreshPendingReconnectState = () => {\n if (!pendingReconnectRefreshRef.current) {\n return;\n }\n\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n if (document.visibilityState !== \"visible\") {\n return;\n }\n\n if (activationStatus !== \"active\") {\n return;\n }\n\n const workspaceId = activeWorkspaceId;\n if (!workspaceId) {\n return;\n }\n\n pendingReconnectRefreshRef.current = false;\n dispatchRef.current<GitStatus>(\"git.status\", { workspaceId }).then((result) => {\n if (result.ok && result.data) {\n store.set(gitStateAtomFamily(workspaceId), result.data);\n }\n });\n dispatchRef\n .current<{ current: string; branches: GitBranch[] }>(\"git.branches\", { workspaceId })\n .then((result) => {\n if (result.ok && result.data) {\n store.set(gitBranchListAtomFamily(workspaceId), {\n current: result.data.current,\n branches: result.data.branches,\n loading: false,\n });\n }\n });\n dispatchRef\n .current<{ worktrees: WorktreeInfo[] }>(\"worktree.list\", { workspaceId })\n .then((result) => {\n if (result.ok && result.data && Array.isArray(result.data.worktrees)) {\n store.set(worktreeListAtomFamily(workspaceId), {\n items: result.data.worktrees,\n loading: false,\n lastLoadedAt: Date.now(),\n });\n }\n });\n };\n\n useEffect(() => {\n refreshPendingReconnectState();\n }, [activationStatus, activeWorkspaceId, connectionStatus]);\n\n useEffect(() => {\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n let cancelled = false;\n let terminalPreferencesAtSubscriptionStart = store.get(terminalPreferencesAtom);\n let localTerminalCopyOnSelectUpdated = false;\n let localDesktopTerminalFontSizeUpdated = false;\n let localMobileTerminalFontSizeUpdated = false;\n const unsubscribeTerminalPreferences = store.sub(terminalPreferencesAtom, () => {\n const nextTerminalPreferences = store.get(terminalPreferencesAtom);\n if (\n nextTerminalPreferences.copyOnSelect !== terminalPreferencesAtSubscriptionStart.copyOnSelect\n ) {\n localTerminalCopyOnSelectUpdated = true;\n }\n if (\n nextTerminalPreferences.desktopFontSize !==\n terminalPreferencesAtSubscriptionStart.desktopFontSize\n ) {\n localDesktopTerminalFontSizeUpdated = true;\n }\n if (\n nextTerminalPreferences.mobileFontSize !==\n terminalPreferencesAtSubscriptionStart.mobileFontSize\n ) {\n localMobileTerminalFontSizeUpdated = true;\n }\n terminalPreferencesAtSubscriptionStart = nextTerminalPreferences;\n });\n\n const hydrateTerminalPreferences = async () => {\n const result = await dispatch<Record<string, unknown>>(\"settings.get\", {});\n if (cancelled || !result.ok || !result.data) {\n return;\n }\n\n const currentTerminalPreferences = store.get(terminalPreferencesAtom);\n const shouldHydrateDesktopTerminalFontSize = localDesktopTerminalFontSizeUpdated\n ? currentTerminalPreferences.desktopFontSize\n : resolveTerminalFontSizeSetting(result.data, \"desktop\");\n const shouldHydrateMobileTerminalFontSize = localMobileTerminalFontSizeUpdated\n ? currentTerminalPreferences.mobileFontSize\n : resolveTerminalFontSizeSetting(result.data, \"mobile\");\n const hasLegacyFontSize = hasLegacyTerminalFontSizeSetting(result.data);\n const hasExplicitDesktopFontSize = hasExplicitTerminalFontSizeSetting(result.data, \"desktop\");\n const hasExplicitMobileFontSize = hasExplicitTerminalFontSizeSetting(result.data, \"mobile\");\n const nextTerminalPreferences = {\n copyOnSelect: localTerminalCopyOnSelectUpdated\n ? currentTerminalPreferences.copyOnSelect\n : resolveTerminalCopyOnSelectSetting(result.data),\n desktopFontSize: shouldHydrateDesktopTerminalFontSize,\n mobileFontSize: shouldHydrateMobileTerminalFontSize,\n fontSize:\n hasExplicitDesktopFontSize || hasExplicitMobileFontSize || hasLegacyFontSize\n ? resolveTerminalFontSizeSetting(result.data, \"desktop\")\n : currentTerminalPreferences.fontSize,\n };\n setTerminalPreferences(nextTerminalPreferences);\n };\n\n void hydrateTerminalPreferences();\n\n return () => {\n cancelled = true;\n unsubscribeTerminalPreferences();\n };\n }, [connectionStatus, dispatch, setTerminalPreferences, store]);\n\n useEffect(() => {\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n let cancelled = false;\n\n const hydrateUpdateState = async () => {\n const result = await dispatch<UpdateStateView>(\"updates.getState\", {});\n if (cancelled || !result.ok || !result.data) {\n return;\n }\n setUpdateState(result.data);\n };\n\n void hydrateUpdateState();\n\n return () => {\n cancelled = true;\n };\n }, [connectionStatus, dispatch, setUpdateState]);\n\n useEffect(() => {\n activeWorkspaceIdRef.current = activeWorkspaceId;\n }, [activeWorkspaceId]);\n\n useEffect(() => {\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n if (store.get(activationStatusAtom) === \"gated\") {\n return;\n }\n\n void claim();\n }, [claim, connectionStatus, store]);\n\n // Forward activation status transitions to the recovery coordinator so that\n // any recovery deferred during the post-reconnect \"no lease yet\" window can\n // resume once the client has re-claimed the activation lease. Without this\n // the coordinator would either surface a spurious \"terminal recovery check\n // failed\" notice or — after the activation-aware defer landed — stay stuck\n // in loading because nothing else would re-trigger reconcile when the\n // session is idle.\n useEffect(() => {\n getGlobalRecoveryCoordinator()?.handleActivationStatus(activationStatus);\n }, [activationStatus]);\n\n // Initialize theme from localStorage\n useEffect(() => {\n preferPersistedThemeOnFirstHydrationRef.current =\n localStorage.getItem(THEME_ID_STORAGE_KEY) !== null;\n const resolvedThemeId = applyResolvedTheme(readStoredThemePreference());\n setTheme(resolvedThemeId);\n localStorage.setItem(THEME_ID_STORAGE_KEY, JSON.stringify(resolvedThemeId));\n }, [setTheme]);\n\n useEffect(() => {\n const resolvedTheme = getThemeById(theme);\n document.documentElement.setAttribute(\"data-theme\", resolvedTheme.documentThemeAttr);\n localStorage.setItem(THEME_ID_STORAGE_KEY, JSON.stringify(resolvedTheme.id));\n }, [theme]);\n\n useEffect(() => {\n const applyCurrentAppearance = () => {\n applyAppearancePersonalizationToDocument(\n store.get(appearancePersonalizationAtom),\n store.get(themeAtom)\n );\n };\n\n applyCurrentAppearance();\n\n const unsubscribeTheme = store.sub(themeAtom, applyCurrentAppearance);\n const unsubscribePersonalization = store.sub(\n appearancePersonalizationAtom,\n applyCurrentAppearance\n );\n\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return () => {\n unsubscribeTheme();\n unsubscribePersonalization();\n };\n }\n\n const mediaQueryList = window.matchMedia(\"(max-width: 899px), (pointer: coarse)\");\n const handleViewportChange = () => {\n applyCurrentAppearance();\n };\n\n if (typeof mediaQueryList.addEventListener === \"function\") {\n mediaQueryList.addEventListener(\"change\", handleViewportChange);\n return () => {\n unsubscribeTheme();\n unsubscribePersonalization();\n mediaQueryList.removeEventListener(\"change\", handleViewportChange);\n };\n }\n\n mediaQueryList.addListener(handleViewportChange);\n return () => {\n unsubscribeTheme();\n unsubscribePersonalization();\n mediaQueryList.removeListener(handleViewportChange);\n };\n }, [store]);\n\n useEffect(() => {\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n let cancelled = false;\n\n const hydrateTheme = async () => {\n const appearanceSelectionVersionAtRequestStart = {\n ...appearanceSelectionVersionRef.current,\n };\n const result = await dispatch<Record<string, unknown>>(\"settings.get\", {});\n if (cancelled || !result.ok || !result.data) {\n return;\n }\n\n const settings = result.data;\n const shouldHydrateTheme =\n appearanceSelectionVersionRef.current.theme ===\n appearanceSelectionVersionAtRequestStart.theme;\n if (preferPersistedThemeOnFirstHydrationRef.current) {\n preferPersistedThemeOnFirstHydrationRef.current = false;\n } else if (shouldHydrateTheme) {\n const resolvedThemeId = resolveStoredThemeId(\n settings[\"appearance.themeId\"] ??\n settings[\"appearance.theme\"] ??\n readStoredThemePreference()\n );\n setTheme(resolvedThemeId);\n }\n\n if (\n appearanceSelectionVersionRef.current.personalization ===\n appearanceSelectionVersionAtRequestStart.personalization\n ) {\n store.set(appearancePersonalizationAtom, resolveAppearancePersonalizationSetting(settings));\n }\n };\n\n void hydrateTheme();\n\n return () => {\n cancelled = true;\n };\n }, [connectionStatus, dispatch, setTheme]);\n\n useEffect(() => {\n const unsubscribeTheme = store.sub(themeAtom, () => {\n appearanceSelectionVersionRef.current.theme += 1;\n });\n const unsubscribePersonalization = store.sub(appearancePersonalizationAtom, () => {\n const next = store.get(appearancePersonalizationAtom);\n if (next !== DEFAULT_APPEARANCE_PERSONALIZATION) {\n appearanceSelectionVersionRef.current.personalization += 1;\n }\n });\n\n return () => {\n unsubscribeTheme();\n unsubscribePersonalization();\n };\n }, [store]);\n\n useEffect(() => {\n const loadAuthStatus = async () => {\n try {\n const response = await fetch(\"/auth/status\");\n const data = await response.json();\n setAuthEnabled(Boolean(data.authEnabled));\n store.set(authenticatedAtom, Boolean(data.authenticated) || data.authEnabled === false);\n } catch {\n store.set(authenticatedAtom, false);\n }\n };\n\n void loadAuthStatus();\n }, [setAuthEnabled, store]);\n\n useEffect(() => {\n if (authEnabled === null) {\n return;\n }\n\n if (authEnabled === true && !authenticated) {\n if (pendingDisconnectTimer) {\n clearTimeout(pendingDisconnectTimer);\n pendingDisconnectTimer = null;\n }\n\n if (globalWsClient) {\n globalWsClient.disconnect(\"auth_required\");\n globalWsClient = null;\n }\n resetGlobalRecoveryCoordinator();\n\n wsClientRef.current = null;\n setWsClient(null);\n setConnectionStatus(\"connecting\");\n setConnectionError(null);\n setServerInfo(null);\n setReconnectCount(0);\n setLastReconnect(null);\n setIsWriter(false);\n return;\n }\n\n // Subscribe to connection status changes\n const handleStatusChange = (status: ConnectionStatus) => {\n setConnectionStatus(status);\n\n // Track reconnect attempts\n if (status === \"reconnecting\") {\n setReconnectCount((count) => count + 1);\n setLastReconnect((previous) => previous ?? Date.now());\n store.set(activationStatusAtom, (current) => (current === \"gated\" ? current : \"idle\"));\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n pendingReconnectRefreshRef.current = true;\n }\n\n // Reset writer status on disconnect\n if (status === \"disconnected\" || status === \"rejected\") {\n setIsWriter(false);\n store.set(activationStatusAtom, (current) => (current === \"gated\" ? current : \"idle\"));\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n if (status === \"disconnected\") {\n pendingReconnectRefreshRef.current = true;\n }\n }\n\n if (status === \"connected\") {\n setReconnectCount(0);\n setLastReconnect(null);\n syncWorkspaceActivity(true);\n }\n };\n\n const refreshGitState = (workspaceId: string) => {\n dispatchRef\n .current<GitStatus>(\"git.status\", { workspaceId })\n .then((result) => {\n if (result.ok && result.data) {\n store.set(gitStateAtomFamily(workspaceId), result.data);\n }\n })\n .catch((error) => {\n console.error(\"[Git Status] git.status command threw error:\", error);\n });\n };\n\n const sendWorkspaceDeactivate = () => {\n const currentState = workspaceActivityRef.current;\n if (currentState.mode === \"inactive\") {\n return;\n }\n const client = wsClientRef.current;\n if (!client) {\n return;\n }\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n void client.sendCommand(\"workspace.deactivate\", {}).catch(() => {});\n };\n\n const sendWorkspaceActivate = (workspaceId: string) => {\n if (store.get(activationStatusAtom) !== \"active\") {\n return;\n }\n\n const currentState = workspaceActivityRef.current;\n if (currentState.mode === \"active\" && currentState.workspaceId === workspaceId) {\n return;\n }\n const client = wsClientRef.current;\n if (!client) {\n return;\n }\n workspaceActivityRef.current = {\n mode: \"active\",\n workspaceId,\n };\n void client.sendCommand(\"workspace.activate\", { workspaceId }).catch(() => {});\n };\n\n const syncWorkspaceActivity = (force = false) => {\n if (document.visibilityState === \"hidden\") {\n sendWorkspaceDeactivate();\n return;\n }\n\n const workspaceId = activeWorkspaceIdRef.current;\n if (!workspaceId) {\n sendWorkspaceDeactivate();\n return;\n }\n\n if (force) {\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n }\n\n sendWorkspaceActivate(workspaceId);\n };\n\n const triggerForegroundRecovery = () => {\n if (store.get(activationStatusAtom) === \"gated\") {\n return;\n }\n\n syncWorkspaceActivity();\n if (document.visibilityState !== \"visible\") {\n lastForegroundRecoveryAtRef.current = null;\n return;\n }\n\n const now = Date.now();\n const lastForegroundRecoveryAt = lastForegroundRecoveryAtRef.current;\n if (\n lastForegroundRecoveryAt !== null &&\n now - lastForegroundRecoveryAt < FOREGROUND_RECOVERY_COOLDOWN_MS\n ) {\n return;\n }\n\n lastForegroundRecoveryAtRef.current = now;\n void getGlobalRecoveryCoordinator()\n ?.notifyReason(\"foreground_resume\")\n .catch((error) => {\n reportRecoveryCoordinatorError(\"foreground_resume\", error);\n });\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState === \"hidden\") {\n lastForegroundRecoveryAtRef.current = null;\n syncWorkspaceActivity();\n return;\n }\n\n triggerForegroundRecovery();\n };\n\n const handleWindowFocus = () => {\n triggerForegroundRecovery();\n };\n\n const handlePageShow = () => {\n triggerForegroundRecovery();\n };\n\n const handleOnline = () => {\n if (store.get(activationStatusAtom) === \"gated\") {\n return;\n }\n\n void getGlobalRecoveryCoordinator()\n ?.notifyReason(\"network_online\")\n .catch((error) => {\n reportRecoveryCoordinatorError(\"network_online\", error);\n });\n };\n\n const refreshBranchState = (workspaceId: string) => {\n dispatchRef\n .current<{ current: string; branches: GitBranch[] }>(\"git.branches\", { workspaceId })\n .then((result) => {\n if (result.ok && result.data) {\n store.set(gitBranchListAtomFamily(workspaceId), {\n current: result.data.current,\n branches: result.data.branches,\n loading: false,\n });\n return;\n }\n\n store.set(gitBranchListAtomFamily(workspaceId), (prev) => ({\n ...prev,\n loading: false,\n error: result.error?.message ?? prev.error,\n }));\n })\n .catch((error) => {\n console.error(\"[Git Branches] git.branches command threw error:\", error);\n });\n };\n\n const refreshWorktreeList = (workspaceId: string) => {\n store.set(worktreeListAtomFamily(workspaceId), (prev) => ({\n ...prev,\n loading: true,\n error: undefined,\n }));\n dispatchRef\n .current<{ worktrees: WorktreeInfo[] }>(\"worktree.list\", { workspaceId })\n .then((result) => {\n if (result.ok && result.data && Array.isArray(result.data.worktrees)) {\n store.set(worktreeListAtomFamily(workspaceId), {\n items: result.data.worktrees,\n loading: false,\n lastLoadedAt: Date.now(),\n });\n return;\n }\n\n store.set(worktreeListAtomFamily(workspaceId), (prev) => ({\n ...prev,\n loading: false,\n error: result.error?.message ?? prev.error,\n }));\n })\n .catch((error) => {\n console.error(\"[Worktree List] worktree.list command threw error:\", error);\n store.set(worktreeListAtomFamily(workspaceId), (prev) => ({\n ...prev,\n loading: false,\n error: error instanceof Error ? error.message : String(error),\n }));\n });\n };\n\n const queueWorkspaceRefresh = (workspaceId: string, hint: Partial<WorkspaceRefreshHint>) => {\n const nextHint = mergeRefreshHints(\n refreshHintsRef.current.get(workspaceId) ?? DEFAULT_REFRESH_HINT,\n hint\n );\n refreshHintsRef.current.set(workspaceId, nextHint);\n\n const existingTimer = refreshTimersRef.current.get(workspaceId);\n if (existingTimer) {\n return;\n }\n\n const timer = setTimeout(() => {\n refreshTimersRef.current.delete(workspaceId);\n const queuedHint = refreshHintsRef.current.get(workspaceId) ?? DEFAULT_REFRESH_HINT;\n refreshHintsRef.current.delete(workspaceId);\n\n if (queuedHint.markTreeStale) {\n store.set(fileTreeStaleAtomFamily(workspaceId), true);\n }\n if (queuedHint.refreshEditorBuffers) {\n store.set(editorRefreshTokenAtomFamily(workspaceId), (prev) => prev + 1);\n }\n if (queuedHint.refreshGit) {\n refreshGitState(workspaceId);\n }\n if (queuedHint.refreshBranches) {\n refreshBranchState(workspaceId);\n }\n if (queuedHint.refreshWorktrees) {\n refreshWorktreeList(workspaceId);\n }\n }, 60);\n\n refreshTimersRef.current.set(workspaceId, timer);\n };\n\n // Event handler: route WS events to atoms\n const handleEvent: EventListener = (topic: string, payload: unknown, _seq: number) => {\n if (topic === \"activation.revoked\") {\n const data = (payload ?? {}) as {\n reason?: string;\n generation?: number;\n };\n\n store.set(activationStatusAtom, \"gated\");\n store.set(\n activationReasonAtom,\n typeof data.reason === \"string\" && data.reason.length > 0 ? data.reason : \"displaced\"\n );\n store.set(\n activationGenerationAtom,\n typeof data.generation === \"number\" ? data.generation : null\n );\n resetServerProjectedState(store);\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n pendingReconnectRefreshRef.current = false;\n wsClientRef.current?.disconnect(\"single_active_displaced\");\n return;\n }\n\n const refreshInfo = parseWorkspaceRefreshHint(topic, payload);\n if (refreshInfo) {\n queueWorkspaceRefresh(refreshInfo.workspaceId, refreshInfo.hint);\n }\n\n try {\n routeEventToAtom(topic, payload, store);\n } catch (err) {\n console.error(`Error handling event for topic ${topic}:`, err);\n }\n };\n\n // Subscribe to all topics we care about\n const topics = [\n \"connection.*\", // Connection-level events\n \"activation.*\",\n \"update.*\",\n \"workspace.*\", // All workspace events (glob pattern)\n ];\n\n // Reuse existing WebSocket client if available (StrictMode safety)\n // Cancel any pending disconnect from StrictMode cleanup\n if (pendingDisconnectTimer) {\n clearTimeout(pendingDisconnectTimer);\n pendingDisconnectTimer = null;\n }\n\n if (globalWsClient) {\n wsClientRef.current = globalWsClient;\n setWsClient(globalWsClient);\n const status = globalWsClient.getStatus();\n setConnectionStatus(status);\n\n // Re-establish subscriptions for this mount\n const unsubscribeStatus = globalWsClient.onStatus(handleStatusChange);\n const unsubscribeEvents = globalWsClient.subscribe(topics, handleEvent);\n\n if (!getGlobalRecoveryCoordinator()) {\n setGlobalRecoveryCoordinator(\n createRecoveryCoordinator({\n wsClient: globalWsClient,\n sendCommand: createRecoveryDispatchCommand((op, args, options) =>\n globalWsClient!.sendCommand(op, args, options)\n ),\n applyReplay: async () => {},\n applySnapshot: async () => {},\n })\n );\n }\n\n if (status === \"disconnected\" || status === \"reconnecting\") {\n globalWsClient.recoverConnection(\"manual_retry\");\n }\n\n syncWorkspaceActivity();\n\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n window.addEventListener(\"focus\", handleWindowFocus);\n window.addEventListener(\"pageshow\", handlePageShow);\n window.addEventListener(\"online\", handleOnline);\n\n return () => {\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n window.removeEventListener(\"focus\", handleWindowFocus);\n window.removeEventListener(\"pageshow\", handlePageShow);\n window.removeEventListener(\"online\", handleOnline);\n unsubscribeStatus();\n unsubscribeEvents();\n refreshTimersRef.current.forEach((timer) => clearTimeout(timer));\n refreshTimersRef.current.clear();\n refreshHintsRef.current.clear();\n wsClientRef.current = null;\n // Deferred disconnect: wait 50ms to see if StrictMode remounts\n if (globalWsClient) {\n pendingDisconnectTimer = setTimeout(() => {\n if (globalWsClient) {\n globalWsClient.disconnect(\"app_unmount\");\n globalWsClient = null;\n }\n resetGlobalRecoveryCoordinator();\n pendingDisconnectTimer = null;\n }, 50);\n }\n };\n }\n\n // Create new WebSocket client singleton\n const client = new WsClient(resolveWsUrl());\n globalWsClient = client;\n setGlobalRecoveryCoordinator(\n createRecoveryCoordinator({\n wsClient: client,\n sendCommand: createRecoveryDispatchCommand((op, args, options) =>\n client.sendCommand(op, args, options)\n ),\n applyReplay: async () => {},\n applySnapshot: async () => {},\n })\n );\n wsClientRef.current = client;\n setWsClient(client);\n\n // Subscribe to connection status changes\n const unsubscribeStatus = client.onStatus(handleStatusChange);\n\n // Subscribe to events\n const unsubscribeEvents = client.subscribe(topics, handleEvent);\n\n // Connect to server\n client.connect().catch((err) => {\n console.error(\"Failed to connect WebSocket:\", err);\n setConnectionError(err.message || \"Connection failed\");\n });\n\n syncWorkspaceActivity();\n\n document.addEventListener(\"visibilitychange\", handleVisibilityChange);\n window.addEventListener(\"focus\", handleWindowFocus);\n window.addEventListener(\"pageshow\", handlePageShow);\n window.addEventListener(\"online\", handleOnline);\n\n // Cleanup on unmount\n return () => {\n document.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n window.removeEventListener(\"focus\", handleWindowFocus);\n window.removeEventListener(\"pageshow\", handlePageShow);\n window.removeEventListener(\"online\", handleOnline);\n unsubscribeStatus();\n unsubscribeEvents();\n refreshTimersRef.current.forEach((timer) => clearTimeout(timer));\n refreshTimersRef.current.clear();\n refreshHintsRef.current.clear();\n wsClientRef.current = null;\n // Deferred disconnect: wait 50ms to see if StrictMode remounts\n pendingDisconnectTimer = setTimeout(() => {\n if (globalWsClient) {\n globalWsClient.disconnect(\"app_unmount\");\n globalWsClient = null;\n }\n resetGlobalRecoveryCoordinator();\n pendingDisconnectTimer = null;\n }, 50);\n };\n }, [\n setWsClient,\n setConnectionStatus,\n setConnectionError,\n setServerInfo,\n setAuthEnabled,\n setReconnectCount,\n setLastReconnect,\n setIsWriter,\n setWorkspaces,\n setSessions,\n setSupervisors,\n store,\n authEnabled,\n authenticated,\n ]);\n\n useEffect(() => {\n if (authEnabled === null) {\n return;\n }\n\n if (authEnabled === true && !authenticated) {\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n return;\n }\n\n if (connectionStatus !== \"connected\") {\n return;\n }\n\n if (activationStatus !== \"active\") {\n return;\n }\n\n if (document.visibilityState === \"hidden\") {\n if (workspaceActivityRef.current.mode !== \"inactive\") {\n const client = wsClientRef.current;\n if (!client) {\n return;\n }\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n void client.sendCommand(\"workspace.deactivate\", {}).catch(() => {});\n }\n return;\n }\n\n if (!activeWorkspaceId) {\n if (workspaceActivityRef.current.mode !== \"inactive\") {\n const client = wsClientRef.current;\n if (!client) {\n return;\n }\n workspaceActivityRef.current = {\n mode: \"inactive\",\n workspaceId: null,\n };\n void client.sendCommand(\"workspace.deactivate\", {}).catch(() => {});\n }\n return;\n }\n\n if (\n workspaceActivityRef.current.mode === \"active\" &&\n workspaceActivityRef.current.workspaceId === activeWorkspaceId\n ) {\n return;\n }\n\n const client = wsClientRef.current;\n if (!client) {\n return;\n }\n\n workspaceActivityRef.current = {\n mode: \"active\",\n workspaceId: activeWorkspaceId,\n };\n void client\n .sendCommand(\"workspace.activate\", { workspaceId: activeWorkspaceId })\n .catch(() => {});\n }, [activeWorkspaceId, activationStatus, authEnabled, authenticated, connectionStatus]);\n\n return <>{children}</>;\n}\n\nfunction storeServerMetadata(\n payload: unknown,\n store: Store\n): payload is {\n version: string;\n serverInstanceId: string;\n authEnabled?: boolean;\n isWriter?: boolean;\n} {\n const data = payload as {\n version?: unknown;\n serverInstanceId?: unknown;\n authEnabled?: unknown;\n isWriter?: unknown;\n };\n\n if (typeof data.version !== \"string\" || typeof data.serverInstanceId !== \"string\") {\n return false;\n }\n\n store.set(serverInfoAtom, {\n version: data.version,\n serverInstanceId: data.serverInstanceId,\n authEnabled: typeof data.authEnabled === \"boolean\" ? data.authEnabled : undefined,\n });\n if (typeof data.isWriter === \"boolean\") {\n store.set(isWriterAtom, data.isWriter);\n }\n\n return true;\n}\n\n/**\n * Route incoming WebSocket events to appropriate Jotai atoms\n */\nexport function routeEventToAtom(topic: string, payload: unknown, store: Store): void {\n // Parse topic to determine event type\n // Topic format: workspace.{id}.session.{sessionId}.state\n // or: connection.ready\n\n if (topic === \"connection.ready\") {\n storeServerMetadata(payload, store);\n store.set(connectionErrorAtom, null);\n return;\n }\n\n if (topic === \"connection.status\") {\n // Connection-level status event\n const data = payload as {\n status: string;\n message?: string;\n authEnabled?: boolean;\n version?: string;\n serverInstanceId?: string;\n isWriter?: boolean;\n };\n if (data.status === \"connected\") {\n storeServerMetadata(payload, store);\n }\n if (data.status === \"connected\" && data.authEnabled === false) {\n store.set(authenticatedAtom, true);\n }\n if (data.status === \"error\" && data.message) {\n store.set(connectionErrorAtom, data.message);\n }\n return;\n }\n\n if (topic === \"update.state.changed\") {\n store.set(updateStateAtom, payload as UpdateStateView);\n return;\n }\n\n // Workspace-level events: workspace.{id}.{subtopic}\n const workspaceMatch = topic.match(/^workspace\\.([^.]+)\\.(.+)$/);\n if (workspaceMatch) {\n const workspaceId = workspaceMatch[1]!;\n const subtopic = workspaceMatch[2]!;\n\n // workspace.{id}.meta - workspace metadata update\n if (subtopic === \"meta\") {\n const patch = payload as Partial<Workspace>;\n const existing = store.get(workspacesAtom)[workspaceId];\n const shouldAcceptWorkspace = Boolean(existing || patch.path);\n\n if (!shouldAcceptWorkspace) {\n return;\n }\n\n const normalizedPatch: Partial<Workspace> = patch.uiState\n ? {\n ...patch,\n uiState: normalizeWorkspaceEditorUiState(patch.uiState),\n }\n : patch;\n\n store.set(workspacesAtom, (prev: Record<string, Workspace>) => ({\n ...prev,\n [workspaceId]: {\n ...prev[workspaceId],\n ...normalizedPatch,\n id: workspaceId,\n } as Workspace,\n }));\n const paneLayout = normalizedPatch.uiState?.paneLayout;\n const normalizedPaneLayout = paneLayout ? normalizePaneLayout(paneLayout) : null;\n if (normalizedPaneLayout) {\n store.set(paneLayoutAtomFamily(workspaceId), normalizedPaneLayout);\n }\n hydrateWorkspaceEditorState(store, workspaceId, normalizedPatch.uiState);\n store.set(workspaceOrderAtom, (prev: string[]) => {\n if (prev.includes(workspaceId)) {\n return prev;\n }\n return [...prev, workspaceId];\n });\n store.set(workspacesLoadStateAtom, \"ready\");\n store.set(workspacesLoadErrorAtom, null);\n return;\n }\n\n // workspace.{id}.fs.dirty - filesystem dirty state\n if (subtopic === \"fs.dirty\") {\n const data = (payload ?? {}) as { reason?: string };\n if (shouldMarkTreeStaleForFsReason(data.reason)) {\n const atom = fileTreeStaleAtomFamily(workspaceId);\n store.set(atom, true);\n }\n return;\n }\n\n // workspace.{id}.git.state - git state changed notification\n if (subtopic === \"git.state\") {\n return;\n }\n\n // workspace.{id}.session.{sessionId}.{type}\n const sessionMatch = subtopic.match(/^session\\.([^.]+)\\.(.+)$/);\n if (sessionMatch) {\n const sessionId = sessionMatch[1]!;\n const sessionSubtopic = sessionMatch[2]!;\n\n if (sessionSubtopic === \"lifecycle\") {\n const data = payload as { event?: string };\n if (data.event === \"removed\") {\n const removedSession = store.get(sessionsAtom)[sessionId];\n if (removedSession?.terminalId) {\n store.set(terminalMetaAtomFamily(removedSession.terminalId), null);\n }\n store.set(sessionsAtom, (prev: Record<string, Session>) => {\n if (!(sessionId in prev)) {\n return prev;\n }\n const next = { ...prev };\n delete next[sessionId];\n return next;\n });\n }\n return;\n }\n\n // workspace.{id}.session.{sessionId}.state\n if (sessionSubtopic === \"state\") {\n const session = payload as Session;\n store.set(sessionsAtom, (prev: Record<string, Session>) => ({\n ...prev,\n [session.id]: session,\n }));\n return;\n }\n\n // workspace.{id}.session.{sessionId}.progress\n if (sessionSubtopic === \"progress\") {\n // Progress updates can be handled separately if needed\n // For now, we'll just log them\n console.log(`Session ${sessionId} progress:`, payload);\n return;\n }\n\n // workspace.{id}.session.{sessionId}.supervisor.state\n if (sessionSubtopic === \"supervisor.state\") {\n const data = payload as { supervisor?: Supervisor; supervisorId?: string; event: string };\n if (data.event === \"deleted\" && data.supervisorId) {\n store.set(supervisorsAtom, (prev: Map<string, Supervisor>) => {\n const next = new Map(prev);\n // Find and remove by supervisor ID\n for (const [sessId, sup] of next.entries()) {\n if (sup.id === data.supervisorId) {\n next.delete(sessId);\n break;\n }\n }\n return next;\n });\n } else if (data.supervisor) {\n const supervisor = data.supervisor;\n store.set(supervisorsAtom, (prev: Map<string, Supervisor>) => {\n const next = new Map(prev);\n next.set(supervisor.sessionId, supervisor);\n return next;\n });\n }\n return;\n }\n }\n\n // workspace.{id}.terminal.{terminalId}.{type}\n const terminalMatch = subtopic.match(/^terminal\\.([^.]+)\\.(.+)$/);\n if (terminalMatch) {\n const terminalId = terminalMatch[1]!;\n const terminalSubtopic = terminalMatch[2]!;\n\n // workspace.{id}.terminal.{terminalId}.created\n if (terminalSubtopic === \"created\") {\n const data = payload as { id: string; kind: string; title?: string; cwd?: string };\n const atom = terminalMetaAtomFamily(terminalId);\n store.set(atom, {\n id: data.id,\n workspaceId,\n kind: data.kind as \"agent\" | \"shell\",\n alive: true,\n title: data.title,\n });\n return;\n }\n\n // workspace.{id}.terminal.{terminalId}.output\n // Terminal panels consume output directly via xterm.js — no router-level\n // handling needed.\n if (terminalSubtopic === \"output\") {\n return;\n }\n\n // workspace.{id}.terminal.{terminalId}.exit\n if (terminalSubtopic === \"exit\") {\n const data = payload as { code: number };\n const atom = terminalMetaAtomFamily(terminalId);\n const current = store.get(atom);\n if (current) {\n store.set(atom, {\n ...current,\n exitCode: data.code,\n alive: false,\n });\n }\n return;\n }\n }\n }\n\n // Unknown topic - log for debugging\n console.log(`Unhandled event topic: ${topic}`, payload);\n}\n","/**\n * Application Entry Point\n */\n\nimport \"@vitejs/plugin-react/preamble\";\nimport { Provider } from \"jotai\";\nimport React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport App from \"./app\";\nimport { AppProviders } from \"./app/providers\";\n\nimport \"@xterm/xterm/css/xterm.css\";\n\n// Import fonts\nimport \"./styles/fonts.css\";\n\n// Import styles\nimport \"./styles/tokens.css\";\nimport \"./styles/base.css\";\nimport \"./styles/components.css\";\n\n// Mount application\nconst root = ReactDOM.createRoot(document.getElementById(\"root\") as HTMLElement);\n\nroot.render(\n <Provider>\n <AppProviders>\n <App />\n </AppProviders>\n </Provider>\n);\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import{r as e}from"./rolldown-runtime-CpWojdLp.js";import{$ as t,$t as n,A as r,At as i,Ct as a,D as o,Dt as ee,E as te,Et as ne,F as re,G as ie,Gt as ae,H as oe,Ht as se,J as s,Jt as ce,K as c,Kt as le,M as ue,Mt as de,N as l,O as fe,Ot as pe,Q as me,Qt as he,Rt as ge,S as _e,St as u,Tt as ve,Ut as ye,V as be,Vt as xe,W as Se,Wt as Ce,Xt as we,Zt as Te,_ as Ee,_n as De,_t as d,a as Oe,at as ke,bt as Ae,c as je,cn as Me,d as f,dn as Ne,en as Pe,et as Fe,f as p,ft as Ie,g as Le,gn as Re,gt as ze,h as m,ht as Be,i as h,it as Ve,j as He,k as Ue,kt as We,l as g,ln as Ge,lt as Ke,m as _,mt as qe,n as Je,nt as Ye,o as v,ot as Xe,p as Ze,pn as Qe,pt as $e,q as et,qt as tt,r as nt,rt,s as it,sn as at,t as ot,tt as st,u as ct,un as lt,v as y,vt as b,wt as ut,xt as dt,y as ft,yt as x}from"./components-SjBXPKn9.js";import"./xterm-BVlcrOZ1.js";var pt=e(lt(),1),S=e(Re(),1),C=a();function mt(e){return e.startsWith(`diff --git`)||e.startsWith(`index `)||e.startsWith(`--- `)||e.startsWith(`+++ `)||e.startsWith(`@@`)?`meta`:e.startsWith(`+`)?`added`:e.startsWith(`-`)?`removed`:`context`}var ht=({workspaceId:e,onClose:t,showCloseButton:n=!0})=>{let r=u(),{preview:i,closePreview:a}=Le(e),o=t??a,ee=(0,S.useMemo)(()=>i?.diff.split(`
2
+ `).map((e,t)=>({id:`${t}:${e}`,line:e,tone:mt(e),lineNumber:t+1}))??[],[i]);return(0,C.jsx)(`div`,{className:`workspace-git-view`,children:(0,C.jsxs)(`div`,{className:`code-editor workspace-git-editor`,children:[(0,C.jsx)(He,{title:i?.title??i?.path??r(`git.diff_select_title`),actions:i&&n?(0,C.jsx)(`div`,{className:`code-mode-toggle`,children:(0,C.jsx)(Be,{content:r(`action.close`),children:(0,C.jsx)(Ae,{"aria-label":r(`action.close`),className:`code-mode-btn`,icon:(0,C.jsx)(Pe,{size:12}),onClick:o,size:`sm`})})}):null}),(0,C.jsx)(`div`,{className:`code-editor-body`,children:i?(0,C.jsx)(`div`,{className:`code-lines git-diff-lines`,children:ee.map(e=>(0,C.jsxs)(`div`,{className:`code-line git-diff-line git-diff-line-${e.tone}`,children:[(0,C.jsx)(`span`,{className:`code-line-num`,children:e.lineNumber}),(0,C.jsx)(`span`,{className:`git-diff-line-text`,children:e.line||` `})]},e.id))}):(0,C.jsx)(d,{className:`git-diff-empty`,description:(0,C.jsx)(`p`,{className:`git-diff-empty-body`,children:r(`git.diff_empty_body`)}),title:(0,C.jsx)(`p`,{className:`git-diff-empty-title`,children:r(`label.git`)})})})]})})};function w(){return[...n]}function gt(){return n.filter(e=>e.endsWith(`-light`))}var _t=[{id:`welcome`,title:`Welcome`,category:`page`,source:`real-route`,description:`Welcome page on the real / route under the preview harness.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.welcome-card`}},{id:`settings-general`,title:`Settings / General`,category:`page`,source:`real-route`,description:`Settings page at /settings with deterministic settings.get data.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page`,settingsSection:`general`}},{id:`settings-appearance`,title:`Settings / Appearance`,category:`page`,source:`real-route`,description:`Settings appearance section using route-backed production UI with deterministic appearance personalization seed data.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page`,settingsSection:`appearance`}},{id:`settings-providers`,title:`Settings / Providers`,category:`page`,source:`real-route`,description:`Settings providers section with fixed provider args.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page`,settingsSection:`providers`}},{id:`settings-shortcuts`,title:`Settings / Shortcuts`,category:`page`,source:`real-route`,description:`Settings shortcuts section with the keyboard shortcut list and category tabs.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page`,settingsSection:`shortcuts`}},{id:`settings-monitoring`,title:`Settings / Monitoring`,category:`page`,source:`real-route`,description:`Settings monitoring section with deterministic monitoring data for desktop and mobile review.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-monitoring-shell`}},{id:`settings-mobile-root`,title:`Settings / Mobile Root`,category:`page`,source:`real-route`,description:`Mobile settings root list before drilling into any subsection.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-mobile-root`}},{id:`app-loading-shell`,title:`App Loading Shell`,category:`loading`,source:`real-route`,description:`Top-level shell shown while auth state is still unresolved before routes render.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.app-loading-shell`}},{id:`workspace-desktop`,title:`Workspace / Desktop`,category:`page`,source:`real-route`,description:`Desktop workspace shell with seeded workspace, git status, file tree, and appearance personalization coverage.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-page`}},{id:`workspace-mobile`,title:`Workspace / Mobile`,category:`page`,source:`real-route`,description:`Mobile workspace shell with seeded workspace, no active sessions, and appearance personalization coverage.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`[data-testid='mobile-shell']`}},{id:`workspace-draft-pane-editor-review`,title:`Workspace / Draft Pane Editor Review`,category:`page`,source:`real-route`,description:`Desktop workspace review scene for validating draft-pane file drop conversion, editor pane routing, and close-back-to-draft behavior.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-page`}},{id:`workspace-editor-pane-review`,title:`Workspace / Editor Pane Review`,category:`page`,source:`real-route`,description:`Desktop workspace scene with an active agent editor pane leaf, toolbar chrome, and neighboring draft pane for acceptance review.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-page`}},{id:`auth-preview`,title:`Auth Preview`,category:`page`,source:`real-route`,description:`Login/auth page component on the real /login route under preview harness.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.auth-card-shell`}},{id:`session-gate`,title:`Session Gate`,category:`error`,source:`real-route`,description:`Session gate shell shown when activation is displaced and the app requires re-entry.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.auth-card-shell`}},{id:`not-found`,title:`Not Found`,category:`page`,source:`real-route`,description:`Not found page for an unknown route path.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.welcome-card`}},{id:`workspace-load-error`,title:`Workspace / Load Error`,category:`error`,source:`real-route`,description:`Shared workspace route error shell when workspace list loading fails.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-resolving-card`}},{id:`workspace-launch-modal`,title:`Workspace Launch Modal`,category:`modal`,source:`showcase`,description:`Workspace open modal with fixed browse/open responses.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.launch-modal, .mobile-sheet--launch`}},{id:`command-palette`,title:`Command Palette`,category:`modal`,source:`showcase`,description:`Command palette forced open with a seeded active workspace.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.command-palette, .command-palette-sheet`}},{id:`branch-quick-pick`,title:`Branch Quick Pick`,category:`sheet`,source:`showcase`,description:`Branch picker opened via seeded branchQuickPick atom and fake git.branches data.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.mobile-select-sheet--command`}},{id:`toast-stack`,title:`Toast Stack`,category:`toast`,source:`showcase`,description:`Success and error toasts for visual review.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.toast-container`}},{id:`footer-update-rail-review`,title:`Footer Update Rail Review`,category:`page`,source:`showcase`,description:`Workspace footer review with a seeded update-available rail on desktop and mobile.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.footer-update-rail-review`}},{id:`footer-update-rail-confirm-review`,title:`Footer Update Rail Confirm Review`,category:`modal`,source:`showcase`,description:`Workspace footer review with the confirmation dialog opened after clicking Update Now.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.modal-overlay`}},{id:`workspace-icon-review`,title:`Workspace Icon Review`,category:`page`,source:`showcase`,description:`File tree, git states, terminal empty state, and mobile dock/supervisor icon surfaces for theme review.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-icon-review`}},{id:`toast-icon-review`,title:`Toast Icon Review`,category:`toast`,source:`showcase`,description:`Success, warning, error, and info toast icons rendered together for theme review.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.toast-container`}},{id:`supervisor-icon-review`,title:`Supervisor Icon Review`,category:`modal`,source:`showcase`,description:`Supervisor dialog header icon and destructive callout surface review.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.supervisor-dialog, .mobile-supervisor-sheet`}},{id:`mobile-workspace-drawer`,title:`Mobile Workspace Drawer`,category:`sheet`,source:`showcase`,description:`Opened mobile workspace drawer with two example workspaces.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.mobile-workspace-drawer`}},{id:`mobile-files-sheet`,title:`Mobile Files Sheet`,category:`sheet`,source:`showcase`,description:`Static mobile files sheet chrome for screenshot comparison.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.mobile-sheet--files`}},{id:`mobile-terminal-sheet`,title:`Mobile Terminal Sheet`,category:`sheet`,source:`showcase`,description:`Mobile terminal fullscreen sheet with compact tool chrome and status bar for screenshot comparison.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.mobile-sheet--terminal`}},{id:`mobile-supervisor-sheet`,title:`Mobile Supervisor Sheet`,category:`sheet`,source:`showcase`,description:`Mobile supervisor sheet with a seeded supervisor state.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.mobile-supervisor-sheet`}},{id:`supervisor-dialog`,title:`Supervisor Dialog`,category:`modal`,source:`showcase`,description:`Desktop supervisor objective dialog opened by atom seed.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.supervisor-dialog`}},{id:`readme-desktop-hero`,title:`README / Desktop Hero`,category:`page`,source:`showcase`,description:`README-focused desktop workspace scene with a live agent session, supervisor summary, and shell verification terminal.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-page`}},{id:`readme-desktop-review`,title:`README / Desktop Review`,category:`page`,source:`showcase`,description:`README-focused desktop scene showing git review workflow with changed files, history, and an open diff.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-page`}},{id:`readme-mobile-progress`,title:`README / Mobile Progress`,category:`page`,source:`showcase`,description:`README-focused mobile scene showing an active session with supervisor continuity and branch status.`,devices:[`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`[data-testid='mobile-shell']`}},{id:`workspace-topbar-review`,title:`Workspace / Topbar Review`,category:`page`,source:`showcase`,description:`Desktop topbar chrome review with seeded workspaces and quick actions.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--topbar`}},{id:`workspace-sidebar-files-review`,title:`Workspace / Sidebar Files Review`,category:`page`,source:`showcase`,description:`Desktop file tree sidebar review with seeded search and file hierarchy.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--sidebar`}},{id:`workspace-sidebar-git-review`,title:`Workspace / Sidebar Git Review`,category:`page`,source:`showcase`,description:`Desktop git sidebar review with seeded status, history, and worktrees.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--sidebar`}},{id:`workspace-editor-review`,title:`Workspace / Editor Review`,category:`page`,source:`showcase`,description:`Desktop editor review with code chrome, dirty state, and static content density.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--editor`}},{id:`workspace-diff-review`,title:`Workspace / Diff Review`,category:`page`,source:`showcase`,description:`Desktop diff review with populated git preview lines and editor-surface chrome.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--diff`}},{id:`workspace-terminal-empty-review`,title:`Workspace / Terminal Empty Review`,category:`empty`,source:`showcase`,description:`Desktop terminal empty state review for bottom panel density and hierarchy.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--terminal`}},{id:`settings-density-review`,title:`Settings / Density Review`,category:`page`,source:`showcase`,description:`Desktop settings page review for spacing, grouping, and information density.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page`}},{id:`settings-light-theme-review`,title:`Settings / Light Theme Review`,category:`page`,source:`showcase`,description:`Desktop settings review constrained to light themes for surface hierarchy checks.`,devices:[`desktop`],themes:gt(),locales:[`zh`,`en`],capture:{selector:`.settings-page`}},{id:`desktop-overlay-review`,title:`Desktop / Overlay Review`,category:`modal`,source:`showcase`,description:`Desktop overlay comparison for command palette, launcher, and worktree manager.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-grid`}},{id:`desktop-statusbar-review`,title:`Desktop / Status Bar Review`,category:`page`,source:`showcase`,description:`Desktop status bar review with seeded branch and file-change state.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.desktop-review-card--statusbar`}},{id:`worktree-manager`,title:`Worktree Manager`,category:`modal`,source:`showcase`,description:`Worktree manager surface with seeded worktree list, status, diff, and tree.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.worktree-manager-surface, .mobile-sheet--worktree`}},{id:`confirm-dialog-danger`,title:`Confirm Dialog / Danger`,category:`modal`,source:`showcase`,description:`Generic destructive confirm dialog for screenshot review.`,devices:[`desktop`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.modal-card`}},{id:`provider-error-state`,title:`Provider Error State`,category:`error`,source:`showcase`,description:`Inline settings error state for provider/config failures.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.settings-page__notice`}},{id:`file-tree-delete-confirm`,title:`File Tree / Delete Confirm`,category:`modal`,source:`showcase`,description:`Shared destructive confirm dialog used by the file tree when deleting a file.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.modal-card`}},{id:`empty-state`,title:`Empty State`,category:`empty`,source:`showcase`,description:`Shared empty-state shell.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.welcome-card`}},{id:`loading-state`,title:`Loading State`,category:`loading`,source:`showcase`,description:`Workspace resolving/loading shell.`,devices:[`desktop`,`mobile`],themes:w(),locales:[`zh`,`en`],capture:{selector:`.workspace-resolving-card`}}],vt=new Map(_t.map(e=>[e.id,e]));function T(e){return vt.get(e)??null}var E={id:`ws-review`,name:`coder-studio`,path:`/home/spencer/workspace/coder-studio`,targetRuntime:`native`,openedAt:1,lastActiveAt:1,uiState:{leftPanelWidth:280,bottomPanelHeight:220,focusMode:!1,activeSessionId:void 0,paneLayout:{id:`root`,type:`leaf`}}},D={branch:`main`,ahead:1,behind:0,staged:[{path:`packages/web/src/styles/tokens.css`,status:`modified`}],modified:[{path:`packages/web/src/styles/components.css`,status:`modified`},{path:`packages/web/src/ui-preview/scenes/desktop-review-scenes.tsx`,status:`modified`}],untracked:[{path:`e2e-ui/output/screenshots/page/workspace-topbar-review.png`,status:`untracked`}],deleted:[]},O=[{sha:`8f5f7d54d9f8b7f08f483699f2f16c3c442f0a11`,shortSha:`8f5f7d5`,subject:`style: tighten workspace desktop chrome`,authorName:`Spencer`,authoredAt:17157312e5},{sha:`f1c44d42d2b8ef3c83bb8aeeb0898422bf94b31c`,shortSha:`f1c44d4`,subject:`test: add ui preview desktop review scenes`,authorName:`Spencer`,authoredAt:17156448e5}],k=[{name:`main`,path:`/home/spencer/workspace/coder-studio`,branch:`main`,commit:`8f5f7d5`,status:`clean`},{name:`feat-pc-style-polish`,path:`/home/spencer/workspace/coder-studio/.worktrees/feat-pc-style-polish`,branch:`feat/pc-style-polish`,commit:`f1c44d4`,status:`dirty`}],yt={[k[1].path]:D},bt={[k[1].path]:[{name:`packages`,path:`packages`,kind:`dir`},{name:`docs`,path:`docs`,kind:`dir`},{name:`README.md`,path:`README.md`,kind:`file`}]},xt=[{name:`packages`,path:`packages`,kind:`dir`},{name:`docs`,path:`docs`,kind:`dir`},{name:`README.md`,path:`README.md`,kind:`file`}],St=[{name:`web`,path:`packages/web`,kind:`dir`},{name:`core`,path:`packages/core`,kind:`dir`}],Ct=[{name:`src`,path:`packages/web/src`,kind:`dir`},{name:`package.json`,path:`packages/web/package.json`,kind:`file`}],wt=[{name:`styles`,path:`packages/web/src/styles`,kind:`dir`},{name:`ui-preview`,path:`packages/web/src/ui-preview`,kind:`dir`},{name:`app.tsx`,path:`packages/web/src/app.tsx`,kind:`file`}],Tt=[{name:`components.css`,path:`packages/web/src/styles/components.css`,kind:`file`},{name:`tokens.css`,path:`packages/web/src/styles/tokens.css`,kind:`file`}],Et=[`const headerTitle = isMobile`,` ? t(shouldShowMobileRoot ? "settings.title" : activeSectionMeta.labelKey)`,` : t("settings.title");`,``,`return (`,' <div className={`settings-page ${isMobile ? "settings-page--mobile" : ""}`}>',` <header className="settings-header">`,` <PageHeader`,` ...`];function A(e,t){let n=T(e);if(!n)throw Error(`Missing UI preview metadata for ${e}`);return{...n,...t}}function j(e){return{...e,workspaces:[E,{...E,id:`ws-review-2`,name:`playground`,path:`/home/spencer/workspace/playground`}],activeWorkspaceId:E.id,fileTreeByWorkspaceId:{[E.id]:new Map([[`.`,xt],[`packages`,St],[`packages/web`,Ct],[`packages/web/src`,wt]])},gitStateByWorkspaceId:{[E.id]:D},gitBranchListByWorkspaceId:{[E.id]:{current:`main`,branches:[{name:`main`,isCurrent:!0,isRemote:!1},{name:`feat/pc-style-polish`,isCurrent:!1,isRemote:!1},{name:`origin/main`,isCurrent:!1,isRemote:!0}]}},worktreeListByWorkspaceId:{[E.id]:k},commands:{workspaceList:[E],fileTreeByWorkspaceId:{[E.id]:{".":xt,packages:St,"packages/web":Ct,"packages/web/src":wt}},fileSearchByWorkspaceId:{[E.id]:Tt},gitStatusByWorkspaceId:{[E.id]:D},gitBranchesByWorkspaceId:{[E.id]:{current:`main`,branches:[{name:`main`,isCurrent:!0,isRemote:!1},{name:`feat/pc-style-polish`,isCurrent:!1,isRemote:!1},{name:`origin/main`,isCurrent:!1,isRemote:!0}]}},gitLogByWorkspaceId:{[E.id]:{entries:O}},gitDiffByWorkspaceId:{[E.id]:{diff:`@@ preview diff
3
+ - background: #11181f;
4
+ + background: var(--bg-elevated);`,renderAs:`text`,status:`modified`}},gitCommitDetailByWorkspaceId:{[E.id]:{commit:{...O[0],parentSha:O[1]?.sha},files:[{path:`packages/web/src/ui-preview/scenes/desktop-review-scenes.tsx`,status:`modified`,renderAs:`text`}]}},worktreeListByWorkspaceId:{[E.id]:k},worktreeStatusByPath:yt,worktreeDiffByPath:{[k[1].path]:`@@ worktree diff
5
+ + packages/web/src/styles/components.css`},worktreeTreeByPath:bt,terminalListByWorkspaceId:{[E.id]:[]}}}}function M({children:e,className:t}){return(0,C.jsx)(`div`,{className:t?`desktop-review-shell ${t}`:`desktop-review-shell`,children:e})}function Dt(){return(0,C.jsx)(`div`,{className:`workspace-git-view`,children:(0,C.jsxs)(`div`,{className:`code-editor workspace-git-editor`,children:[(0,C.jsxs)(`div`,{className:`code-editor-header`,children:[(0,C.jsxs)(`span`,{className:`code-file-path`,children:[`packages/web/src/features/settings/components/settings-page.tsx`,(0,C.jsx)(`span`,{className:`dirty-indicator`,children:`*`})]}),(0,C.jsxs)(`div`,{className:`code-mode-toggle`,children:[(0,C.jsx)(`button`,{type:`button`,className:`code-mode-btn`,"aria-label":`Save file`,disabled:!0,children:`Save`}),(0,C.jsx)(`button`,{type:`button`,className:`code-mode-btn active`,"aria-label":`Preview desktop header`,children:`Preview`})]})]}),(0,C.jsx)(`div`,{className:`code-editor-body`,children:(0,C.jsx)(`div`,{className:`code-lines`,children:Et.map((e,t)=>(0,C.jsxs)(`div`,{className:`code-line`,children:[(0,C.jsx)(`span`,{className:`code-line-num`,children:t+1}),(0,C.jsx)(`span`,{className:`git-diff-line-text`,children:e||` `})]},`${t}:${e}`))})})]})})}function Ot(){return[A(`workspace-topbar-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--topbar`,children:(0,C.jsx)(y,{})})})}),A(`workspace-sidebar-files-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--sidebar`,children:(0,C.jsx)(Ee,{workspaceId:E.id,variant:`desktop`})})})}),A(`workspace-sidebar-git-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--sidebar`,children:(0,C.jsx)(_,{workspaceId:E.id,variant:`desktop`})})})}),A(`workspace-editor-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--editor`,children:(0,C.jsx)(Dt,{})})})}),A(`workspace-diff-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...j(e),gitDiffPreviewByWorkspaceId:{[E.id]:{kind:`worktree-file-diff`,path:`packages/web/src/styles/components.css`,diff:[`@@ workspace shell`,`- background: var(--bg-surface);`,`+ background: var(--bg-elevated);`,`+ border-radius: var(--radius-xl);`].join(`
6
+ `),renderAs:`text`,status:`modified`}}}),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--diff`,children:(0,C.jsx)(ht,{workspaceId:E.id,showCloseButton:!1})})})}),A(`workspace-terminal-empty-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--terminal`,children:(0,C.jsx)(ft,{})})})}),A(`settings-density-review`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>({...j(e),commands:{...j(e).commands,settingsGet:{"notifications.enabled":!0,"notifications.soundEnabled":!0,"supervisor.evaluationTimeoutSec":600,"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.terminalRenderer":`standard`,"providers.claude.additionalArgs":[`--verbose`],"providers.codex.additionalArgs":[`--sandbox`,`workspace-write`]},settingsUpdate:{},settingsPreviewCommandByProviderId:{claude:`claude --verbose`,codex:`codex --sandbox workspace-write`}}}),render:()=>(0,C.jsx)(l,{})}),A(`settings-light-theme-review`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>({...j(e),commands:{...j(e).commands,settingsGet:{"notifications.enabled":!0,"notifications.soundEnabled":!0,"supervisor.evaluationTimeoutSec":600,"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.terminalRenderer":`standard`,"providers.claude.additionalArgs":[`--verbose`],"providers.codex.additionalArgs":[`--sandbox`,`workspace-write`]},settingsUpdate:{},settingsPreviewCommandByProviderId:{claude:`claude --verbose`,codex:`codex --sandbox workspace-write`}}}),render:()=>(0,C.jsx)(l,{})}),A(`desktop-overlay-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...j(e),commandPaletteOpen:!0,commands:{...j(e).commands,workspaceBrowse:{currentPath:`/home/spencer/workspace`,parentPath:`/home/spencer`,directories:[{name:`coder-studio`,path:`/home/spencer/workspace/coder-studio`,itemCount:24},{name:`playground`,path:`/home/spencer/workspace/playground`,itemCount:6}]},workspaceOpen:E}}),render:()=>(0,C.jsxs)(`div`,{className:`desktop-review-grid`,children:[(0,C.jsx)(`div`,{className:`desktop-review-card`,children:(0,C.jsx)(et,{})}),(0,C.jsx)(`div`,{className:`desktop-review-card`,children:(0,C.jsx)(s,{onClose:()=>{}})}),(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--worktree`,children:(0,C.jsx)(`div`,{className:`desktop-review-embedded-worktree`,children:(0,C.jsx)(m,{desktopPreviewInline:!0,workspaceId:E.id,openView:`list`,onClose:()=>{}})})})]})}),A(`desktop-statusbar-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>j(e),render:()=>(0,C.jsx)(M,{children:(0,C.jsx)(`div`,{className:`desktop-review-card desktop-review-card--statusbar`,children:(0,C.jsx)(p,{align:`start`,gitState:D,workspaceId:E.id})})})})]}var N={id:`ws-preview`,name:`coder-studio`,path:`/home/spencer/workspace/coder-studio`,targetRuntime:`native`,openedAt:1,lastActiveAt:1,uiState:{leftPanelWidth:402,bottomPanelHeight:220,focusMode:!1,fileTreeExpandedDirs:[],paneLayout:{id:`root`,type:`leaf`}}},P={branch:`feature/ai-agent`,ahead:0,behind:0,staged:[],modified:[{path:`packages/web/src/app.tsx`,status:`modified`}],untracked:[{path:`e2e-ui/src/index.ts`,status:`untracked`}],deleted:[]},F=new Map;F.set(`.`,[{name:`packages`,path:`packages`,kind:`dir`},{name:`core`,path:`core`,kind:`dir`},{name:`README.md`,path:`README.md`,kind:`file`}]);var kt={},At={"packages/web/src/app.tsx":{kind:`text`,path:`packages/web/src/app.tsx`,content:[`export function App() {`,` const searchQuery = workspacePanelState.query;`,``,` if (!searchQuery.trim()) {`,` return null;`,` }`,``,` return <WorkspacePage />;`,`}`].join(`
7
+ `),savedContent:[`export function App() {`,` const searchQuery = workspacePanelState.query;`,``,` if (!searchQuery.trim()) {`,` return null;`,` }`,``,` return <WorkspacePage />;`,`}`].join(`
8
+ `),baseHash:`preview:app-tsx`,isDirty:!1}},I={sessionId:`preview-search-session`,files:[{path:`packages/web/src/app.tsx`,name:`app.tsx`,matchCount:4,hasMoreMatches:!1,matches:[{line:24,id:`preview-match-1`,column:7,endColumn:18,preview:`const searchQuery = workspacePanelState.query;`,previewColumnStart:7,previewColumnEnd:18,replacementPreview:`const workspaceQuery = workspacePanelState.query;`,replacementPreviewColumnStart:7,replacementPreviewColumnEnd:21,isReplacementPreviewTruncated:!1},{line:86,id:`preview-match-2`,column:8,endColumn:19,preview:`return searchQuery.trim() ? results : [];`,previewColumnStart:8,previewColumnEnd:19,replacementPreview:`return workspaceQuery.trim() ? results : [];`,replacementPreviewColumnStart:8,replacementPreviewColumnEnd:22,isReplacementPreviewTruncated:!1}]},{baseHash:`preview:tree-tsx`,path:`packages/web/src/tree.tsx`,name:`tree.tsx`,matchCount:2,hasMoreMatches:!1,matches:[]}],totalMatchCount:12,totalFileCount:2,hasMoreFiles:!1,truncatedMatchFileCount:0,skippedBinaryFileCount:0,skippedLargeFileCount:0},jt={"README.md":{content:[`# Coder Studio`,``,`Use the draft pane to open a file directly into an editor pane.`,``,`- Drop a workspace file onto the draft pane.`,`- Keep later file opens routed into the focused editor pane.`,`- Close the editor pane to return the leaf back to draft.`,``,`This preview exists only for acceptance capture.`].join(`
9
+ `),baseHash:`preview:readme`},"packages/web/src/app.tsx":{content:[`export function App() {`,` const searchQuery = workspacePanelState.query;`,``,` if (!searchQuery.trim()) {`,` return null;`,` }`,``,` return <WorkspacePage />;`,`}`].join(`
10
+ `),baseHash:`preview:app-tsx`},"packages/web/src/tree.tsx":{content:[`export function TreePreview() {`,` return searchQuery.trim() ? results : [];`,`}`].join(`
11
+ `),baseHash:`preview:tree-tsx`}},L=Date.UTC(2026,4,27,14,27,49);function R(e,t){return{points:e.map((n,r)=>({sampledAt:L-(e.length-1-r)*3e4,cpuPercent:n,memoryBytes:t[r]??t[t.length-1]??null}))}}function z(e){let t={enabled:!0,hostMetricsEnabled:!0,runtimeSummaryEnabled:!0,workspaceAttributionEnabled:!0,subprocessDrilldownEnabled:!0,sampleIntervalMs:1e4},n={settings:t,snapshot:{sampledAt:L,mode:xe(t),host:{cpuPercent:7.6,memoryUsedBytes:29.7*1024**3,memoryTotalBytes:63.8*1024**3,memoryAvailableBytes:34.1*1024**3,loadAverage:[.62,.54,.49],uptimeSec:8340*60,pressure:`normal`},runtime:{serverCpuPercent:.8,serverMemoryBytes:182*1024**2,totalManagedCpuPercent:2.1,totalManagedMemoryBytes:814*1024**2,managedProcessCount:4,cpuShareOfHostPercent:0,memoryShareOfHostPercent:0},workspaces:[{id:`workspace:observability`,kind:`workspace`,label:`workspace/coder-studio-observability-dashboard-long-name-preview`,cpuPercent:7.6,memoryBytes:29.7*1024**3,processCount:4,uptimeSec:8340*60,trend:`steady`}],sessions:[{id:`session:review-agent`,parentId:`workspace:observability`,kind:`session`,label:`session/review-agent`,cpuPercent:1.4,memoryBytes:630*1024**2,processCount:1,uptimeSec:2520,trend:`steady`},{id:`session:build-runner`,parentId:`workspace:observability`,kind:`session`,label:`session/build-runner`,cpuPercent:.4,memoryBytes:92*1024**2,processCount:1,uptimeSec:1020,trend:`falling`}],subprocessGroups:[{id:`subprocess:vite-dev-server`,parentId:`session:review-agent`,kind:`subprocess_group`,label:`vite dev server`,cpuPercent:.4,memoryBytes:92*1024**2,processCount:1,uptimeSec:1020,trend:`steady`},{id:`subprocess:preview-store-watcher`,parentId:`session:review-agent`,kind:`subprocess_group`,label:`preview store watcher`,cpuPercent:.2,memoryBytes:54*1024**2,processCount:1,uptimeSec:660,trend:`steady`},{id:`subprocess:drilldown-guide`,parentId:`session:build-runner`,kind:`subprocess_group`,label:`drilldown entry guide`,cpuPercent:.1,memoryBytes:28*1024**2,processCount:1,uptimeSec:300,trend:`steady`}],backgroundGroups:[]},history:{host:{points:Array.from({length:30},(e,t)=>({sampledAt:L-(29-t)*3e4,cpuPercent:[9,6,8,7,7,6,7,9,8,7,8,6,5,12,7,9,8,16,11,10,8,7,6,8,7,6,5,9,4,7][t]??7,memoryBytes:(29+t%3)*1024**3}))},runtime:{points:Array.from({length:30},(e,t)=>({sampledAt:L-(29-t)*3e4,cpuPercent:[.8,.5,.9,1.1,.7,1.4,1.9,1.3,1.7,2.1][t%10]??1.2,memoryBytes:(760+t%5*14)*1024**2,processCount:4}))},workspaces:{"workspace:observability":R([5.2,4.1,6.3,5.4,7.8,6.6,7.1,5.5,6.4,7.6],[28.4*1024**3,28.7*1024**3,28.9*1024**3,29.1*1024**3,29.3*1024**3,29.5*1024**3,29.4*1024**3,29.6*1024**3,29.7*1024**3,29.7*1024**3])},sessions:{"session:review-agent":R([.9,1.2,1,1.5,1.3,1.8,1.7,1.4,1.6,1.4],[580*1024**2,590*1024**2,602*1024**2,608*1024**2,618*1024**2,624*1024**2,628*1024**2,631*1024**2,633*1024**2,630*1024**2]),"session:build-runner":R([.8,.7,.6,.6,.5,.5,.4,.4,.4,.4],[118*1024**2,112*1024**2,107*1024**2,104*1024**2,101*1024**2,98*1024**2,96*1024**2,94*1024**2,93*1024**2,92*1024**2])},subprocessGroups:{"subprocess:vite-dev-server":R([.5,.3,.4,.6,.5,.4,.6,.5,.4,.4],[88*1024**2,89*1024**2,90*1024**2,92*1024**2,93*1024**2,92*1024**2,94*1024**2,93*1024**2,92*1024**2,92*1024**2]),"subprocess:preview-store-watcher":R([.2,.2,.1,.3,.2,.2,.2,.1,.2,.2],[50*1024**2,51*1024**2,52*1024**2,54*1024**2,54*1024**2,55*1024**2,55*1024**2,54*1024**2,54*1024**2,54*1024**2]),"subprocess:drilldown-guide":R([.2,.2,.1,.1,.2,.1,.1,.1,.1,.1],[24*1024**2,25*1024**2,25*1024**2,26*1024**2,27*1024**2,27*1024**2,28*1024**2,28*1024**2,28*1024**2,28*1024**2])}},capabilities:{loadAverageAvailable:!0,processMetricsAvailable:!0,subprocessHistoryLimited:!1},telemetry:{durationMs:39,processRowCount:4,subprocessGroupCount:3,historyTrimmed:!1,degraded:!1}};return{...e,workspaces:[N],activeWorkspaceId:N.id,commands:{settingsGet:{"notifications.enabled":!0,"notifications.soundEnabled":!0,"supervisor.evaluationTimeoutSec":600,"monitoring.enabled":t.enabled,"monitoring.hostMetricsEnabled":t.hostMetricsEnabled,"monitoring.runtimeSummaryEnabled":t.runtimeSummaryEnabled,"monitoring.workspaceAttributionEnabled":t.workspaceAttributionEnabled,"monitoring.subprocessDrilldownEnabled":t.subprocessDrilldownEnabled,"monitoring.sampleIntervalMs":t.sampleIntervalMs,"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.personalization.version":1,"appearance.personalization.common.backgroundMode":`image`,"appearance.personalization.common.backgroundAssetId":`preview-background`,"appearance.personalization.common.backgroundFit":`cover`,"appearance.personalization.common.backgroundDimness":36,"appearance.personalization.common.backgroundBlur":8,"appearance.personalization.common.glassEnabled":!0,"appearance.personalization.common.glassIntensity":18,"appearance.personalization.common.surfaceOpacity":90,"appearance.personalization.desktop.surfaceOpacity":88,"appearance.personalization.mobile.surfaceOpacity":96,"appearance.terminalRenderer":`standard`,"providers.claude.additionalArgs":[`--verbose`],"providers.codex.additionalArgs":[`--sandbox`,`workspace-write`]},settingsUpdate:{},settingsPreviewCommandByProviderId:{claude:`claude --verbose`,codex:`codex --sandbox workspace-write`},monitoringGet:n,monitoringRecheck:n}}}function Mt(e,t=[]){return{...e,workspaces:[N],activeWorkspaceId:N.id,sessions:t,paneLayoutByWorkspaceId:{[N.id]:{id:`root`,type:`leaf`}},fileTreeByWorkspaceId:{[N.id]:F},openFilesByWorkspaceId:{[N.id]:kt},activeFilePathByWorkspaceId:{[N.id]:`README.md`},gitStateByWorkspaceId:{[N.id]:P},gitDiffPreviewByWorkspaceId:{[N.id]:{path:`packages/web/src/app.tsx`,diff:`diff --git a/packages/web/src/app.tsx b/packages/web/src/app.tsx`,source:`file`,staged:!1}},gitBranchListByWorkspaceId:{[N.id]:{current:`feature/ai-agent`,branches:[{name:`main`,isCurrent:!1,isRemote:!1},{name:`feature/e2e-ui`,isCurrent:!1,isRemote:!1},{name:`feature/ai-agent`,isCurrent:!0,isRemote:!1}]}},worktreeListByWorkspaceId:{[N.id]:[]},commands:{settingsGet:{"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.personalization.version":1,"appearance.personalization.common.backgroundMode":`image`,"appearance.personalization.common.backgroundAssetId":`preview-background`,"appearance.personalization.common.backgroundFit":`cover`,"appearance.personalization.common.backgroundDimness":36,"appearance.personalization.common.backgroundBlur":8,"appearance.personalization.common.glassEnabled":!0,"appearance.personalization.common.glassIntensity":18,"appearance.personalization.common.surfaceOpacity":90,"appearance.personalization.desktop.surfaceOpacity":88,"appearance.personalization.mobile.surfaceOpacity":96},workspaceList:[N],sessionListByWorkspaceId:{[N.id]:t},gitStatusByWorkspaceId:{[N.id]:P},gitLogByWorkspaceId:{[N.id]:{entries:[]}},gitBranchesByWorkspaceId:{[N.id]:{current:`feature/ai-agent`,branches:[{name:`main`,isCurrent:!1,isRemote:!1},{name:`feature/e2e-ui`,isCurrent:!1,isRemote:!1},{name:`feature/ai-agent`,isCurrent:!0,isRemote:!1}]}},fileTreeByWorkspaceId:{[N.id]:{".":F.get(`.`)??[]}},fileSearchSessionByWorkspaceId:{[N.id]:I},worktreeListByWorkspaceId:{[N.id]:[]},terminalListByWorkspaceId:{[N.id]:[]}}}}function Nt(e){let t={...N,uiState:{...N.uiState,paneLayout:{id:`root`,type:`split`,direction:`horizontal`,children:[{id:`left`,type:`leaf`,leafKind:`draft`},{id:`right`,type:`leaf`,leafKind:`draft`}]}}};return{...e,workspaces:[t],activeWorkspaceId:t.id,sessions:[],paneLayoutByWorkspaceId:{[t.id]:{id:`root`,type:`split`,direction:`horizontal`,children:[{id:`left`,type:`leaf`,leafKind:`draft`},{id:`right`,type:`leaf`,leafKind:`draft`}]}},fileTreeByWorkspaceId:{[t.id]:F},openFilesByWorkspaceId:{[t.id]:{}},gitStateByWorkspaceId:{[t.id]:P},gitBranchListByWorkspaceId:{[t.id]:{current:`feature/draft-pane-editor-integration`,branches:[{name:`develop`,isCurrent:!1,isRemote:!1},{name:`feature/draft-pane-editor-integration`,isCurrent:!0,isRemote:!1}]}},terminalPanelVisible:!1,commands:{settingsGet:{"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.personalization.version":1,"appearance.personalization.common.backgroundMode":`image`,"appearance.personalization.common.backgroundAssetId":`preview-background`,"appearance.personalization.common.backgroundFit":`cover`,"appearance.personalization.common.backgroundDimness":36,"appearance.personalization.common.backgroundBlur":8,"appearance.personalization.common.glassEnabled":!0,"appearance.personalization.common.glassIntensity":18,"appearance.personalization.common.surfaceOpacity":90,"appearance.personalization.desktop.surfaceOpacity":88},workspaceList:[t],sessionListByWorkspaceId:{[t.id]:[]},gitStatusByWorkspaceId:{[t.id]:P},gitLogByWorkspaceId:{[t.id]:{entries:[]}},gitBranchesByWorkspaceId:{[t.id]:{current:`feature/draft-pane-editor-integration`,branches:[{name:`develop`,isCurrent:!1,isRemote:!1},{name:`feature/draft-pane-editor-integration`,isCurrent:!0,isRemote:!1}]}},fileTreeByWorkspaceId:{[t.id]:{".":F.get(`.`)??[]}},fileReadByWorkspaceId:{[t.id]:jt},fileSearchSessionByWorkspaceId:{[t.id]:I},worktreeListByWorkspaceId:{[t.id]:[]},terminalListByWorkspaceId:{[t.id]:[]}}}}function Pt(e){let t={...N,uiState:{...N.uiState,paneLayout:{id:`root`,type:`split`,direction:`horizontal`,children:[{id:`left`,type:`leaf`,leafKind:`editor`},{id:`right`,type:`leaf`,leafKind:`draft`}]}}};return{...e,workspaces:[t],activeWorkspaceId:t.id,sessions:[],paneLayoutByWorkspaceId:{[t.id]:{id:`root`,type:`split`,direction:`horizontal`,children:[{id:`left`,type:`leaf`,leafKind:`editor`},{id:`right`,type:`leaf`,leafKind:`draft`}]}},activeEditorPaneIdByWorkspaceId:{[t.id]:`left`},focusedEditorPaneIdByWorkspaceId:{[t.id]:`left`},fileTreeByWorkspaceId:{[t.id]:F},openFilesByWorkspaceId:{[t.id]:At},activeFilePathByWorkspaceId:{[t.id]:`packages/web/src/app.tsx`},gitStateByWorkspaceId:{[t.id]:P},gitDiffPreviewByWorkspaceId:{[t.id]:{path:`packages/web/src/app.tsx`,diff:[`@@ app shell`,`- const query = state.query;`,`+ const searchQuery = workspacePanelState.query;`,``,`- return <MainLayout />;`,`+ return <WorkspacePage />;`].join(`
12
+ `),source:`file`}},gitBranchListByWorkspaceId:{[t.id]:{current:`feature/draft-pane-editor-integration`,branches:[{name:`develop`,isCurrent:!1,isRemote:!1},{name:`feature/draft-pane-editor-integration`,isCurrent:!0,isRemote:!1}]}},terminalPanelVisible:!1,commands:{settingsGet:{"appearance.locale":e.locale,"appearance.themeId":e.theme,"appearance.personalization.version":1,"appearance.personalization.common.backgroundMode":`image`,"appearance.personalization.common.backgroundAssetId":`preview-background`,"appearance.personalization.common.backgroundFit":`cover`,"appearance.personalization.common.backgroundDimness":36,"appearance.personalization.common.backgroundBlur":8,"appearance.personalization.common.glassEnabled":!0,"appearance.personalization.common.glassIntensity":18,"appearance.personalization.common.surfaceOpacity":90,"appearance.personalization.desktop.surfaceOpacity":88},workspaceList:[t],sessionListByWorkspaceId:{[t.id]:[]},gitStatusByWorkspaceId:{[t.id]:P},gitLogByWorkspaceId:{[t.id]:{entries:[]}},gitBranchesByWorkspaceId:{[t.id]:{current:`feature/draft-pane-editor-integration`,branches:[{name:`develop`,isCurrent:!1,isRemote:!1},{name:`feature/draft-pane-editor-integration`,isCurrent:!0,isRemote:!1}]}},fileTreeByWorkspaceId:{[t.id]:{".":F.get(`.`)??[]}},fileReadByWorkspaceId:{[t.id]:jt},gitDiffByWorkspaceId:{[t.id]:{diff:[`@@ app shell`,`- const query = state.query;`,`+ const searchQuery = workspacePanelState.query;`,``,`- return <MainLayout />;`,`+ return <WorkspacePage />;`].join(`
13
+ `)}},fileSearchSessionByWorkspaceId:{[t.id]:I},worktreeListByWorkspaceId:{[t.id]:[]},terminalListByWorkspaceId:{[t.id]:[]}}}}function B(e,t){let n=T(e);if(!n)throw Error(`Missing UI preview metadata for ${e}`);return{...n,...t}}function Ft(){return[B(`welcome`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e}),render:()=>(0,C.jsx)(ue,{})}),B(`settings-general`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>z(e),render:()=>(0,C.jsx)(l,{})}),B(`settings-appearance`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>z(e),render:()=>(0,C.jsx)(l,{})}),B(`settings-providers`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>z(e),render:()=>(0,C.jsx)(l,{})}),B(`settings-shortcuts`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>z(e),render:()=>(0,C.jsx)(l,{})}),B(`settings-monitoring`,{router:()=>({initialEntries:[`/settings?section=monitoring`],path:`/settings`}),seed:e=>z(e),render:()=>(0,C.jsx)(l,{})}),B(`settings-mobile-root`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>z({...e,device:`mobile`}),render:()=>(0,C.jsx)(l,{})}),B(`app-loading-shell`,{router:()=>({initialEntries:[`/`],path:`*`}),seed:e=>({...e,authEnabled:null,authenticated:!1,connectionStatus:`connecting`,workspaces:[],activeWorkspaceId:null,workspacesLoadState:`idle`}),render:e=>e.device===`mobile`?(0,C.jsx)(ot,{}):(0,C.jsx)(je,{})}),B(`workspace-desktop`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>Mt(e),render:()=>(0,C.jsx)(g,{children:(0,C.jsx)(f,{})})}),B(`workspace-mobile`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>Mt(e),render:()=>(0,C.jsx)(g,{children:(0,C.jsx)(Je,{})})}),B(`workspace-draft-pane-editor-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>Nt(e),render:()=>(0,C.jsx)(g,{children:(0,C.jsx)(f,{})})}),B(`workspace-editor-pane-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>Pt(e),render:()=>(0,C.jsx)(g,{children:(0,C.jsx)(f,{})})}),B(`auth-preview`,{router:()=>({initialEntries:[`/login`],path:`/login`}),seed:e=>({...e,authEnabled:!0,authenticated:!1}),render:()=>(0,C.jsx)(qe,{})}),B(`session-gate`,{router:()=>({initialEntries:[`/session-gate`],path:`/session-gate`}),seed:e=>({...e,authEnabled:!1,authenticated:!1}),render:()=>(0,C.jsx)($e,{})}),B(`not-found`,{router:()=>({initialEntries:[`/preview-missing`],path:`*`}),seed:e=>({...e}),render:()=>(0,C.jsx)(c,{})}),B(`workspace-load-error`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,authEnabled:!1,authenticated:!0,workspaces:[],activeWorkspaceId:null,workspacesLoadState:`error`,workspacesLoadError:`Preview workspace load failure`}),render:()=>(0,C.jsx)(g,{children:(0,C.jsx)(ct,{})})})]}function It({sessionId:e,onOpen:t}){let n=Qe(r),i=u(),a=(0,S.useMemo)(()=>{if(!e)return null;let t=n.get(e);return t?{state:t.state,label:i(`supervisor.title`)}:{state:`inactive`,label:i(`supervisor.title`)}},[e,n,i]);return a?(0,C.jsxs)(`button`,{type:`button`,className:`mobile-supervisor-badge mobile-supervisor-badge--${a.state}`,"aria-label":i(`mobile.supervisor.open_sheet`),onClick:t,children:[(0,C.jsx)(`span`,{className:`mobile-supervisor-badge__icon`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`supervisor.entry`,size:13})}),(0,C.jsx)(`span`,{className:`mobile-supervisor-badge__label`,children:a.label})]}):null}var V={id:`ws-preview`,name:`coder-studio`,path:`/home/spencer/workspace/coder-studio`,targetRuntime:`native`,openedAt:1,lastActiveAt:1,uiState:{leftPanelWidth:280,bottomPanelHeight:220,focusMode:!1,activeSessionId:`session-preview-1`,paneLayout:{id:`root`,type:`leaf`}}},H={id:`sup-preview-1`,sessionId:`session-preview-1`,workspaceId:`ws-preview`,state:`idle`,targetId:`target-preview-1`,objective:`Review UI regressions before shipping`,evaluatorProviderId:`claude`,maxSupervisionCount:0,completedSupervisionCount:0,currentTargetMemory:{targetId:`target-preview-1`,decompositionGenerated:!0,decompositionMode:`stage`,items:[{id:`stage-1`,kind:`stage`,title:`Audit compact strip density`,objective:`Review density regressions in the compact strip`,deliverable:`A verified density audit`,acceptanceCriteria:[`Density issues are identified`],status:`done`},{id:`stage-2`,kind:`stage`,title:`Move memory into expandable detail`,objective:`Expose target memory without bloating the strip`,deliverable:`A compact card with explicit decomposition detail`,acceptanceCriteria:[`Decomposition is visible without expanding layout noise`],status:`in_progress`},{id:`stage-3`,kind:`stage`,title:`Validate preview coverage across themes`,objective:`Ensure preview coverage is representative`,deliverable:`A validated preview pass`,acceptanceCriteria:[`Preview coverage is confirmed`],status:`pending`}],activeItemId:`stage-2`,progressSummary:`Compact strip restored; preview coverage still under review.`,stalledCount:0,updatedAt:1},recentTargetCycles:[{cycleId:`target-cycle-preview-1`,targetId:`target-preview-1`,startedAt:1,completedAt:2,result:`continue`,reason:`Keep the strip compact and move detailed memory into an explicit disclosure.`}],createdAt:1,updatedAt:1},U=[{name:`feature/e2e-ui`,path:`/home/spencer/workspace/coder-studio-feature-e2e-ui`,branch:`feature/e2e-ui`,commit:`abc1234`,status:`dirty`}],Lt={branch:`feature/e2e-ui`,ahead:1,behind:0,staged:[],modified:[{path:`packages/web/src/ui-preview/app.tsx`,status:`modified`}],untracked:[],deleted:[]},Rt=[{name:`packages`,path:`packages`,kind:`dir`},{name:`e2e-ui`,path:`e2e-ui`,kind:`dir`}],zt={version:1,currentVersion:`0.4.0`,latestVersion:`0.5.0`,availability:`update_available`,updateStatus:`idle`,lastCheckedAt:17157312e5,targetVersion:null,startedAt:null,finishedAt:null,requiresManualStep:!1,manualCommand:null,errorSummary:null,supported:!0,installKind:`global_npm`,unsupportedReason:null},Bt=[{name:`packages`,path:`packages`,kind:`dir`},{name:`README.md`,path:`README.md`,kind:`file`},{name:`pnpm-workspace.yaml`,path:`pnpm-workspace.yaml`,kind:`file`}],Vt=[{name:`web`,path:`packages/web`,kind:`dir`},{name:`core`,path:`packages/core`,kind:`dir`}],Ht={sessionId:`mobile-preview-search-session`,files:[{path:`packages/web/src/features/workspace/views/mobile/mobile-files-sheet.tsx`,name:`mobile-files-sheet.tsx`,matchCount:2,hasMoreMatches:!1,baseHash:`preview:mobile-files-sheet`,matches:[{id:`mobile-search-match-1`,line:64,column:11,endColumn:17,preview:` <SearchPanel workspaceId={workspaceId} variant="mobile" />`,previewColumnStart:8,previewColumnEnd:14,replacementPreview:` <SearchPanel workspaceId={workspaceId} variant="mobile" />`,replacementPreviewColumnStart:8,replacementPreviewColumnEnd:14,isReplacementPreviewTruncated:!1},{id:`mobile-search-match-2`,line:88,column:15,endColumn:21,preview:` aria-label={t("workspace.sidebar.search")}`,previewColumnStart:13,previewColumnEnd:19,replacementPreview:` aria-label={t("workspace.sidebar.search")}`,replacementPreviewColumnStart:13,replacementPreviewColumnEnd:19,isReplacementPreviewTruncated:!1}]},{path:`packages/web/src/styles/components.css`,name:`components.css`,matchCount:2,hasMoreMatches:!1,baseHash:`preview:components-css`,matches:[{id:`mobile-search-match-3`,line:13812,column:28,endColumn:34,preview:`.workspace-search-panel__summary {`,previewColumnStart:12,previewColumnEnd:18,replacementPreview:`.workspace-search-panel__summary {`,replacementPreviewColumnStart:12,replacementPreviewColumnEnd:18,isReplacementPreviewTruncated:!1},{id:`mobile-search-match-4`,line:13994,column:12,endColumn:18,preview:`.workspace-search-panel__line {`,previewColumnStart:12,previewColumnEnd:18,replacementPreview:`.workspace-search-panel__line {`,replacementPreviewColumnStart:12,replacementPreviewColumnEnd:18,isReplacementPreviewTruncated:!1}]}],totalMatchCount:4,totalFileCount:2,hasMoreFiles:!1,truncatedMatchFileCount:0,skippedBinaryFileCount:0,skippedLargeFileCount:0},W={branch:`feature/readme-refresh`,ahead:2,behind:0,headSha:`97cc218f926d61bbeca0d6a8bd4b62582cbf93ea`,headShortSha:`97cc218`,headSubject:`feat: stage readme screenshot refresh scenes`,staged:[{path:`README.md`,status:`modified`}],modified:[{path:`packages/web/src/features/topbar/index.tsx`,status:`modified`},{path:`docs/help/assets/screenshot-desktop-workspace-full.png`,status:`modified`}],untracked:[{path:`docs/help/assets/screenshot-mobile-progress.png`,status:`untracked`}],deleted:[]},Ut=[{sha:`97cc218f926d61bbeca0d6a8bd4b62582cbf93ea`,shortSha:`97cc218`,subject:`feat: stage readme screenshot refresh scenes`,authorName:`Spencer`,authoredAt:17157312e5},{sha:`4d6fd0bbce5100f39277c9c9c92677b87de17b73`,shortSha:`4d6fd0b`,subject:`style: tighten header action hierarchy`,authorName:`Spencer`,authoredAt:17156448e5}],Wt=[{id:`session-readme-hero`,workspaceId:V.id,terminalId:`term-agent-readme-hero`,providerId:`codex`,state:`running`,capability:`full`,startedAt:1,lastActiveAt:3,title:`Ship the header polish and verify README visuals`}],Gt=[{id:`session-readme-mobile`,workspaceId:V.id,terminalId:`term-agent-readme-mobile`,providerId:`claude`,state:`idle`,capability:`full`,startedAt:1,lastActiveAt:4,title:`Resume mobile progress review`}],G={id:`sup-readme-hero`,sessionId:`session-readme-hero`,workspaceId:V.id,state:`evaluating`,targetId:`target-readme-refresh`,objective:`Refresh README screenshots to highlight active cross-device coding flows`,evaluatorProviderId:`claude`,maxSupervisionCount:0,completedSupervisionCount:3,currentTargetMemory:{targetId:`target-readme-refresh`,decompositionGenerated:!0,decompositionMode:`stage`,items:[{id:`stage-1`,kind:`stage`,title:`Capture a desktop hero with active session context`,objective:`Show an active desktop coding flow`,deliverable:`A readable hero screenshot`,acceptanceCriteria:[`Hero capture is readable`],status:`done`},{id:`stage-2`,kind:`stage`,title:`Capture a focused git review scene for README`,objective:`Highlight review context clearly`,deliverable:`A focused review screenshot`,acceptanceCriteria:[`Diff emphasis is readable`],status:`in_progress`},{id:`stage-3`,kind:`stage`,title:`Capture a mobile progress check with supervisor status`,objective:`Show mobile progress visibility`,deliverable:`A mobile supervisor progress screenshot`,acceptanceCriteria:[`Mobile supervisor state is legible`],status:`pending`}],activeItemId:`stage-2`,progressSummary:`Hero scene locked. Review capture is being polished for README readability.`,stalledCount:0,updatedAt:4},recentTargetCycles:[{cycleId:`target-cycle-readme-1`,targetId:`target-readme-refresh`,startedAt:2,completedAt:3,result:`continue`,reason:`Hero screenshot is readable. Review scene still needs clearer diff emphasis.`}],createdAt:1,updatedAt:4},Kt={...G,id:`sup-readme-mobile`,sessionId:`session-readme-mobile`,state:`idle`,currentTargetMemory:{targetId:`target-readme-refresh`,decompositionGenerated:!0,decompositionMode:`stage`,items:[{id:`stage-1`,kind:`stage`,title:`Capture a desktop hero with active session context`,objective:`Show an active desktop coding flow`,deliverable:`A readable hero screenshot`,acceptanceCriteria:[`Hero capture is readable`],status:`done`},{id:`stage-2`,kind:`stage`,title:`Capture a focused git review scene for README`,objective:`Highlight review context clearly`,deliverable:`A focused review screenshot`,acceptanceCriteria:[`Diff emphasis is readable`],status:`done`},{id:`stage-3`,kind:`stage`,title:`Capture a mobile progress check with supervisor status`,objective:`Show mobile progress visibility`,deliverable:`A mobile supervisor progress screenshot`,acceptanceCriteria:[`Mobile supervisor state is legible`],status:`in_progress`}],activeItemId:`stage-3`,progressSummary:`Desktop captures are ready. Mobile continuity shot is the last remaining asset.`,stalledCount:0,updatedAt:5},recentTargetCycles:[{cycleId:`target-cycle-readme-mobile-1`,targetId:`target-readme-refresh`,startedAt:4,completedAt:5,result:`continue`,reason:`Desktop assets are approved. Capture a mobile status-check scene that shows continuity.`}],createdAt:1,updatedAt:5};function K(){return{".":[{name:`docs`,path:`docs`,kind:`dir`},{name:`packages`,path:`packages`,kind:`dir`},{name:`README.md`,path:`README.md`,kind:`file`},{name:`README.zh-CN.md`,path:`README.zh-CN.md`,kind:`file`}],docs:[{name:`help`,path:`docs/help`,kind:`dir`},{name:`promotion`,path:`docs/promotion`,kind:`dir`}],"docs/help":[{name:`assets`,path:`docs/help/assets`,kind:`dir`},{name:`desktop-guide.md`,path:`docs/help/desktop-guide.md`,kind:`file`}],"docs/help/assets":[{name:`screenshot-desktop-workspace-full.png`,path:`docs/help/assets/screenshot-desktop-workspace-full.png`,kind:`file`},{name:`screenshot-pc.png`,path:`docs/help/assets/screenshot-pc.png`,kind:`file`},{name:`screenshot-mobile.png`,path:`docs/help/assets/screenshot-mobile.png`,kind:`file`}],packages:[{name:`web`,path:`packages/web`,kind:`dir`},{name:`core`,path:`packages/core`,kind:`dir`}]}}function q(e){let t=K();return{...e,workspaces:[V],activeWorkspaceId:V.id,sessions:Wt,paneLayoutByWorkspaceId:{[V.id]:{id:`root`,type:`split`,direction:`horizontal`,children:[{id:`hero-left`,type:`leaf`,sessionId:`session-readme-hero`},{id:`hero-right`,type:`leaf`,sessionId:`session-readme-hero`}],sessionId:`session-readme-hero`}},fileTreeByWorkspaceId:{[V.id]:new Map(Object.entries(t))},gitStateByWorkspaceId:{[V.id]:W},gitBranchListByWorkspaceId:{[V.id]:{current:`feature/readme-refresh`,branches:[{name:`feature/readme-refresh`,isCurrent:!0,isRemote:!1},{name:`main`,isCurrent:!1,isRemote:!1},{name:`origin/main`,isCurrent:!1,isRemote:!0}]}},terminalMetaById:{"term-agent-readme-hero":{id:`term-agent-readme-hero`,workspaceId:V.id,kind:`agent`,alive:!0,title:`Codex session`},"term-shell-readme-hero":{id:`term-shell-readme-hero`,workspaceId:V.id,kind:`shell`,alive:!0,title:`Workspace Shell`}},terminalOutputById:{"term-agent-readme-hero":[new TextEncoder().encode([`$ codex run --model gpt-5.5 --task "refresh readme screenshots"`,`Analyzing README usage and current preview scenes...`,`Plan: add README-specific preview scenes, capture desktop hero, capture mobile continuity shot.`,``,`Editing packages/web/src/ui-preview/scenes/showcase-scenes.tsx`,`Preparing fresh assets in docs/help/assets/`].join(`
14
+ `))],"term-shell-readme-hero":[new TextEncoder().encode([`$ pnpm --filter @coder-studio/web exec vitest run src/ui-preview/scene-metadata.test.ts src/ui-preview/catalog.test.tsx`,`✓ src/ui-preview/scene-metadata.test.ts (9)`,`✓ src/ui-preview/catalog.test.tsx (35)`,``,`$ pnpm --dir e2e-ui exec playwright test --grep "README /"`,`capturing desktop hero and mobile progress scenes...`].join(`
15
+ `))]},supervisorBySessionId:{"session-readme-hero":G},commands:{workspaceList:[V],sessionListByWorkspaceId:{[V.id]:Wt},fileTreeByWorkspaceId:{[V.id]:t},gitStatusByWorkspaceId:{[V.id]:W},gitBranchesByWorkspaceId:{[V.id]:{current:`feature/readme-refresh`,branches:[{name:`feature/readme-refresh`,isCurrent:!0,isRemote:!1},{name:`main`,isCurrent:!1,isRemote:!1},{name:`origin/main`,isCurrent:!1,isRemote:!0}]}},terminalListByWorkspaceId:{[V.id]:[{id:`term-shell-readme-hero`,workspaceId:V.id,kind:`shell`,title:`Workspace Shell`,cwd:V.path,argv:[`zsh`],cols:120,rows:28,alive:!0,createdAt:2},{id:`term-shell-readme-verify`,workspaceId:V.id,kind:`shell`,title:`Preview Runner`,cwd:V.path,argv:[`zsh`],cols:120,rows:28,alive:!0,createdAt:3}]},supervisorBySessionId:{"session-readme-hero":G}}}}function qt(e){let t=K();return{...q(e),fileTreeByWorkspaceId:{[V.id]:new Map(Object.entries(t))},gitDiffPreviewByWorkspaceId:{[V.id]:{kind:`worktree-file-diff`,path:`packages/web/src/features/topbar/index.tsx`,title:`README capture polish`,diff:[`diff --git a/packages/web/src/features/topbar/index.tsx b/packages/web/src/features/topbar/index.tsx`,`@@ Refine the desktop topbar hierarchy`,`- <span className="topbar-btn-label">Quick Actions</span>`,`+ <span className="topbar-btn-label">Quick Actions</span>`,`+ <span className="topbar-btn-hint">Review README capture targets</span>`,``,`@@ screenshot staging`,`+ <WorkspaceLaunchModal onClose={() => setWorkspaceLaunchOpen(false)} />`].join(`
16
+ `),renderAs:`text`,status:`modified`}},commands:{...q(e).commands,fileTreeByWorkspaceId:{[V.id]:t},gitStatusByWorkspaceId:{[V.id]:W},gitLogByWorkspaceId:{[V.id]:{entries:[...Ut]}},gitDiffByWorkspaceId:{[V.id]:{diff:[`diff --git a/packages/web/src/features/topbar/index.tsx b/packages/web/src/features/topbar/index.tsx`,`@@ Refine the desktop topbar hierarchy`,`+ <span className="topbar-btn-hint">Review README capture targets</span>`,`+ <span className="topbar-btn-hint">Keep the workspace hero readable at README width</span>`].join(`
17
+ `),renderAs:`text`,status:`modified`}},gitCommitDetailByWorkspaceId:{[V.id]:{commit:{...Ut[0],parentSha:`4d6fd0bbce5100f39277c9c9c92677b87de17b73`},files:[{path:`packages/web/src/features/topbar/index.tsx`,status:`modified`,renderAs:`text`}]}},supervisorBySessionId:{"session-readme-hero":G}}}}function Jt(){return(0,C.jsxs)(`div`,{className:`workspace-page workspace-page--desktop`,children:[(0,C.jsx)(y,{}),(0,C.jsxs)(`div`,{className:`workspace-body`,children:[(0,C.jsx)(`aside`,{className:`left-panel`,style:{width:`324px`},children:(0,C.jsx)(`div`,{className:`nav-panel workspace-sidebar-panel`,children:(0,C.jsx)(`div`,{className:`workspace-sidebar-panel__body`,children:(0,C.jsx)(_,{workspaceId:V.id,variant:`desktop`})})})}),(0,C.jsx)(`div`,{className:`split-divider-v`,"aria-hidden":`true`}),(0,C.jsx)(`div`,{className:`workspace-main-area`,children:(0,C.jsx)(`div`,{className:`workspace-main-stage`,children:(0,C.jsx)(ht,{workspaceId:V.id,showCloseButton:!1})})})]}),(0,C.jsx)(p,{align:`start`,workspaceId:V.id,gitState:W})]})}function Yt(){return(0,C.jsxs)(`div`,{className:`mobile-shell mobile-shell--stacked mobile-shell--motion-reduced`,"data-testid":`mobile-shell`,children:[(0,C.jsx)(h,{activeWorkspace:V,drawerOpen:!1,onOpenSettings:()=>{},onToggleDrawer:()=>{}}),(0,C.jsx)(`main`,{className:`mobile-shell__viewport`,children:(0,C.jsxs)(`div`,{className:`mobile-shell__content`,style:{gap:`12px`,paddingBottom:`144px`},children:[(0,C.jsx)(`section`,{className:`mobile-shell__agent-stage`,style:{flex:`0 0 420px`},children:(0,C.jsx)(_e,{sessionId:`session-readme-mobile`,showHeaderActions:!1,showSupervisorInline:!1,headerAccessory:(0,C.jsx)(It,{sessionId:`session-readme-mobile`,onOpen:()=>{}})})}),(0,C.jsx)(`section`,{style:{padding:`0 12px`},children:(0,C.jsx)(o,{sessionId:`session-readme-mobile`,workspaceId:V.id})})]})}),(0,C.jsxs)(`div`,{className:`mobile-shell__bottom-stack`,"data-testid":`mobile-bottom-stack`,style:{"--mobile-keyboard-inset":`0px`},children:[(0,C.jsx)(`div`,{className:`mobile-dock-shell`,children:(0,C.jsx)(v,{activeItem:`agent`,onSelectItem:()=>{}})}),(0,C.jsx)(p,{workspaceId:V.id,gitState:{branch:`feature/readme-refresh`,ahead:2,behind:0,staged:[{path:`README.md`,status:`modified`}],modified:[{path:`docs/help/assets/screenshot-mobile.png`,status:`modified`}],untracked:[],deleted:[]}})]})]})}function Xt(e){let t={...V,uiState:{...V.uiState,activeSessionId:`session-readme-mobile`,paneLayout:{id:`root`,type:`leaf`,sessionId:`session-readme-mobile`}}};return{...e,workspaces:[t],activeWorkspaceId:t.id,sessions:Gt,paneLayoutByWorkspaceId:{[t.id]:{id:`root`,type:`leaf`,sessionId:`session-readme-mobile`}},gitStateByWorkspaceId:{[t.id]:{branch:`feature/readme-refresh`,ahead:2,behind:0,staged:[{path:`README.md`,status:`modified`}],modified:[{path:`docs/help/assets/screenshot-mobile.png`,status:`modified`}],untracked:[],deleted:[]}},terminalMetaById:{"term-agent-readme-mobile":{id:`term-agent-readme-mobile`,workspaceId:t.id,kind:`agent`,alive:!0,title:`Claude progress review`}},terminalOutputById:{"term-agent-readme-mobile":[new TextEncoder().encode([`$ claude review --scene readme-mobile-progress`,`Checking continuity between desktop hero and mobile status view...`,`Recommendation: keep supervisor progress visible above the dock.`,`Status: desktop captures approved, mobile continuity shot queued for export.`].join(`
18
+ `))]},supervisorBySessionId:{"session-readme-mobile":Kt},commands:{workspaceList:[t],sessionListByWorkspaceId:{[t.id]:Gt},gitStatusByWorkspaceId:{[t.id]:{branch:`feature/readme-refresh`,ahead:2,behind:0,staged:[{path:`README.md`,status:`modified`}],modified:[{path:`docs/help/assets/screenshot-mobile.png`,status:`modified`}],untracked:[],deleted:[]}},gitBranchesByWorkspaceId:{[t.id]:{current:`feature/readme-refresh`,branches:[{name:`feature/readme-refresh`,isCurrent:!0,isRemote:!1},{name:`main`,isCurrent:!1,isRemote:!1}]}},supervisorBySessionId:{"session-readme-mobile":Kt}}}}function J(e,t){let n=T(e);if(!n)throw Error(`Missing UI preview metadata for ${e}`);return{...n,...t}}function Zt(){let[e,t]=(0,S.useState)(`explorer`),[n,r]=(0,S.useState)({kind:`root`});return(0,C.jsx)(Oe,{workspaceId:V.id,route:n,activeView:e,onRouteChange:r,onTabChange:t})}function Y({device:e,className:t}){return e===`mobile`?(0,C.jsxs)(`div`,{className:`${t} mobile-shell mobile-shell--stacked mobile-shell--motion-reduced`,"data-testid":`mobile-shell`,children:[(0,C.jsx)(h,{activeWorkspace:V,drawerOpen:!1,onOpenSettings:()=>{},onToggleDrawer:()=>{}}),(0,C.jsx)(`main`,{className:`mobile-shell__viewport`,children:(0,C.jsx)(`div`,{className:`mobile-shell__content`,style:{paddingBottom:`144px`}})}),(0,C.jsxs)(`div`,{className:`mobile-shell__bottom-stack`,"data-testid":`mobile-bottom-stack`,style:{"--mobile-keyboard-inset":`0px`},children:[(0,C.jsx)(`div`,{className:`mobile-dock-shell`,children:(0,C.jsx)(v,{activeItem:`agent`,onSelectItem:()=>{}})}),(0,C.jsx)(p,{workspaceId:V.id,gitState:W})]})]}):(0,C.jsx)(`div`,{className:t,children:(0,C.jsxs)(`div`,{className:`workspace-page workspace-page--desktop`,children:[(0,C.jsx)(y,{}),(0,C.jsx)(`div`,{className:`workspace-body`,children:(0,C.jsx)(`div`,{className:`workspace-main-area`,children:(0,C.jsx)(`div`,{className:`workspace-main-stage`})})}),(0,C.jsx)(p,{align:`start`,workspaceId:V.id,gitState:W})]})})}function Qt({device:e}){let t=u();return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(Y,{className:`footer-update-rail-confirm-review`,device:e}),(0,C.jsx)(b,{open:!0,onOpenChange:()=>{},title:t(`settings.about.confirm_update_title`),description:(0,C.jsxs)(`div`,{className:`settings-dialog-copy`,children:[(0,C.jsx)(`p`,{children:t(`settings.about.confirm_update_message`)}),(0,C.jsx)(`p`,{children:t(`settings.about.confirm_update_activity`,{terminals:1,sessions:2,supervisors:3})})]}),cancelText:t(`action.cancel`),confirmText:t(`settings.about.update_now`),tone:`danger`,onConfirm:()=>{}})]})}function $t(){return[J(`workspace-launch-modal`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e,commands:{workspaceBrowse:{currentPath:`/home/spencer/workspace`,parentPath:`/home/spencer`,directories:[{name:`coder-studio`,path:`/home/spencer/workspace/coder-studio`,itemCount:24},{name:`playground`,path:`/home/spencer/workspace/playground`,itemCount:6}]},workspaceOpen:V}}),render:()=>(0,C.jsx)(s,{onClose:()=>{}})}),J(`command-palette`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,commandPaletteOpen:!0}),render:()=>(0,C.jsx)(et,{})}),J(`branch-quick-pick`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,branchQuickPick:{visible:!0,workspaceId:V.id,inputValue:``},commands:{gitBranchesByWorkspaceId:{[V.id]:{current:`main`,branches:[{name:`main`,isCurrent:!0,isRemote:!1},{name:`feature/e2e-ui`,isCurrent:!1,isRemote:!1},{name:`origin/main`,isCurrent:!1,isRemote:!0}]}},gitStatusByWorkspaceId:{[V.id]:Lt}}}),render:()=>(0,C.jsx)(Ze,{})}),J(`toast-stack`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e,toasts:[{id:`toast-success-preview`,kind:`success`,title:`Workspace opened`,body:`coder-studio is ready.`,createdAt:1,duration:0},{id:`toast-error-preview`,kind:`error`,title:`Failed to refresh provider config`,body:`Retry after checking the provider settings.`,createdAt:2,duration:0}]}),render:()=>(0,C.jsx)(Se,{})}),J(`footer-update-rail-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,gitStateByWorkspaceId:{[V.id]:W},updateState:zt}),render:e=>(0,C.jsx)(Y,{className:`footer-update-rail-review`,device:e.device})}),J(`footer-update-rail-confirm-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,gitStateByWorkspaceId:{[V.id]:W},updateState:zt}),render:e=>(0,C.jsx)(Qt,{device:e.device})}),J(`workspace-icon-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,supervisorBySessionId:{"session-preview-1":H}}),render:e=>e.device===`mobile`?(0,C.jsx)(`div`,{className:`workspace-icon-review`,children:(0,C.jsxs)(`div`,{className:`mobile-shell__stage`,children:[(0,C.jsx)(`div`,{className:`flex items-center justify-between gap-3 p-3`,children:(0,C.jsx)(It,{sessionId:`session-preview-1`,onOpen:()=>{}})}),(0,C.jsxs)(`div`,{className:`file-tree-shell file-tree-shell--mobile`,children:[(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon folder`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.folder.closed`,size:14})}),(0,C.jsx)(`span`,{children:`packages`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon code`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.code`,size:14})}),(0,C.jsx)(`span`,{children:`app.tsx`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon data`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.data`,size:14})}),(0,C.jsx)(`span`,{children:`theme.json`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon doc`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.doc`,size:14})}),(0,C.jsx)(`span`,{children:`README.md`})]})]}),(0,C.jsx)(d,{className:`bottom-terminal-empty`,description:(0,C.jsx)(`p`,{className:`bottom-terminal-empty-hint`,children:`Review the terminal empty-state icon and surface treatment.`}),icon:(0,C.jsx)(x,{className:`bottom-terminal-empty-icon`,semantic:`state.emptyTerminal`,size:32}),title:(0,C.jsx)(`p`,{className:`bottom-terminal-empty-text`,children:`No terminal session`})}),(0,C.jsx)(v,{activeItem:`files`,onSelectItem:()=>{}})]})}):(0,C.jsxs)(`div`,{className:`workspace-icon-review`,children:[(0,C.jsxs)(`div`,{className:`file-tree-shell`,children:[(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon folder`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.folder.closed`,size:14})}),(0,C.jsx)(`span`,{children:`packages`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon code`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.code`,size:14})}),(0,C.jsx)(`span`,{children:`app.tsx`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon data`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.data`,size:14})}),(0,C.jsx)(`span`,{children:`theme.json`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon doc`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.doc`,size:14})}),(0,C.jsx)(`span`,{children:`README.md`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon media`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.media`,size:14})}),(0,C.jsx)(`span`,{children:`logo.png`})]}),(0,C.jsxs)(`div`,{className:`tree-item`,children:[(0,C.jsx)(`span`,{className:`tree-icon file`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`file.type.default`,size:14})}),(0,C.jsx)(`span`,{children:`LICENSE`})]})]}),(0,C.jsxs)(`div`,{className:`git-panel`,children:[(0,C.jsxs)(`div`,{className:`git-row`,children:[(0,C.jsx)(`span`,{className:`git-row-icon git-row-icon-staged`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`git.status.staged`,size:12})}),(0,C.jsx)(`span`,{children:`staged.ts`})]}),(0,C.jsxs)(`div`,{className:`git-row`,children:[(0,C.jsx)(`span`,{className:`git-row-icon git-row-icon-modified`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`git.status.modified`,size:12})}),(0,C.jsx)(`span`,{children:`modified.ts`})]}),(0,C.jsxs)(`div`,{className:`git-row`,children:[(0,C.jsx)(`span`,{className:`git-row-icon git-row-icon-deleted`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`git.status.deleted`,size:12})}),(0,C.jsx)(`span`,{children:`deleted.ts`})]}),(0,C.jsxs)(`div`,{className:`git-row`,children:[(0,C.jsx)(`span`,{className:`git-row-icon git-row-icon-untracked`,"aria-hidden":`true`,children:(0,C.jsx)(x,{semantic:`git.status.untracked`,size:12})}),(0,C.jsx)(`span`,{children:`untracked.ts`})]})]}),(0,C.jsx)(d,{className:`bottom-terminal-empty`,description:(0,C.jsx)(`p`,{className:`bottom-terminal-empty-hint`,children:`Review the terminal empty-state icon and surface treatment.`}),icon:(0,C.jsx)(x,{className:`bottom-terminal-empty-icon`,semantic:`state.emptyTerminal`,size:32}),title:(0,C.jsx)(`p`,{className:`bottom-terminal-empty-text`,children:`No terminal session`})})]})}),J(`toast-icon-review`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e,toasts:[{id:`toast-success`,kind:`success`,title:`Workspace opened`,body:`coder-studio is ready.`,createdAt:1,duration:0},{id:`toast-warning`,kind:`warning`,title:`Unsaved config`,body:`Review pending changes before continuing.`,createdAt:2,duration:0},{id:`toast-error`,kind:`error`,title:`Failed to refresh provider config`,body:`Retry after checking the provider settings.`,createdAt:3,duration:0},{id:`toast-info`,kind:`info`,title:`Theme preview active`,body:`Comparing icon palettes across themes.`,createdAt:4,duration:0}]}),render:()=>(0,C.jsx)(Se,{})}),J(`supervisor-icon-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,supervisorBySessionId:{"session-preview-1":H},supervisorDialog:{open:!0,sessionId:`session-preview-1`,mode:`edit`,draftObjective:H.objective,draftEvaluatorProviderId:`claude`,draftEvaluatorModel:``,draftMaxSupervisionCount:`0`,draftScheduledAt:``}}),render:e=>e.device===`mobile`?(0,C.jsx)(it,{sessionId:`session-preview-1`,workspaceId:V.id,onClose:()=>{}}):(0,C.jsx)(fe,{workspaceId:V.id,sessionId:`session-preview-1`})}),J(`mobile-workspace-drawer`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V,{...V,id:`ws-preview-2`,name:`playground`,path:`/home/spencer/workspace/playground`}],activeWorkspaceId:V.id}),render:()=>(0,C.jsx)(nt,{activeWorkspaceId:V.id,isOpen:!0,workspaces:[V,{...V,id:`ws-preview-2`,name:`playground`,path:`/home/spencer/workspace/playground`}],onClose:()=>{},onOpenWorkspaceLauncher:()=>{}})}),J(`mobile-files-sheet`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,commands:{fileTreeByWorkspaceId:{[V.id]:{".":Bt,packages:Vt}},gitStatusByWorkspaceId:{[V.id]:{branch:`feature/mobile-polish`,ahead:2,behind:0,staged:[{path:`packages/web/src/styles/components.css`,status:`modified`}],modified:[{path:`packages/web/src/features/settings/components/settings-page.tsx`,status:`modified`},{path:`packages/web/src/features/workspace/views/mobile/mobile-workspace-drawer.tsx`,status:`modified`}],untracked:[{path:`e2e-ui/output/mobile-review.png`,status:`untracked`}],deleted:[]}},gitBranchesByWorkspaceId:{[V.id]:{current:`feature/mobile-polish`,branches:[{name:`feature/mobile-polish`,isCurrent:!0,isRemote:!1},{name:`develop`,isCurrent:!1,isRemote:!1}]}},terminalListByWorkspaceId:{[V.id]:[]},fileSearchSessionByWorkspaceId:{[V.id]:Ht}}}),render:()=>(0,C.jsx)(dt,{title:`Explorer`,kicker:`Workspace`,fullscreen:!0,bodyClassName:`mobile-sheet__body--flush mobile-sheet__body--fullscreen`,contentClassName:`mobile-sheet--files`,onClose:()=>{},body:(0,C.jsx)(Zt,{})})}),J(`mobile-terminal-sheet`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,terminalMetaById:{"term-preview-1":{id:`term-preview-1`,workspaceId:V.id,kind:`shell`,alive:!0,title:`Workspace Shell`},"term-preview-2":{id:`term-preview-2`,workspaceId:V.id,kind:`shell`,alive:!0,title:`Preview Runner`}},terminalOutputById:{"term-preview-1":[new TextEncoder().encode(`$ pnpm --filter @coder-studio/web test
19
+ `)],"term-preview-2":[new TextEncoder().encode(`$ playwright test --project=mobile
20
+ `)]},commands:{terminalListByWorkspaceId:{[V.id]:[{id:`term-preview-1`,workspaceId:V.id,kind:`shell`,title:`Workspace Shell`,cwd:V.path,argv:[`zsh`],cols:120,rows:28,alive:!0,createdAt:1},{id:`term-preview-2`,workspaceId:V.id,kind:`shell`,title:`Preview Runner`,cwd:V.path,argv:[`zsh`],cols:120,rows:28,alive:!0,createdAt:2}]}}}),render:()=>(0,C.jsx)(()=>{let[e,t]=(0,S.useState)(null);return(0,C.jsx)(dt,{title:`Terminal`,kicker:null,fullscreen:!0,bodyClassName:`mobile-sheet__body--flush mobile-sheet__body--fullscreen`,contentClassName:`mobile-sheet--terminal`,headerAction:e,onClose:()=>{},body:(0,C.jsx)(`div`,{className:`mobile-terminal-sheet mobile-terminal-sheet--fullscreen`,children:(0,C.jsx)(ft,{chrome:`mobile-fullscreen`,onMobileHeaderActionsChange:t})}),footer:(0,C.jsx)(p,{workspaceId:V.id,gitState:{branch:`feature/mobile-terminal`,ahead:0,behind:0,staged:[],modified:[{path:`packages/web/src/styles/components.css`,status:`modified`}],untracked:[],deleted:[]},flush:!0})})},{})}),J(`mobile-supervisor-sheet`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,supervisorBySessionId:{"session-preview-1":H}}),render:()=>(0,C.jsx)(it,{sessionId:`session-preview-1`,workspaceId:V.id,onClose:()=>{}})}),J(`supervisor-dialog`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,supervisorBySessionId:{"session-preview-1":H},supervisorDialog:{open:!0,sessionId:`session-preview-1`,mode:`edit`,draftObjective:H.objective,draftEvaluatorProviderId:`claude`}}),render:()=>(0,C.jsx)(fe,{workspaceId:V.id,sessionId:`session-preview-1`})}),J(`readme-desktop-hero`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>q(e),render:()=>(0,C.jsx)(f,{})}),J(`readme-desktop-review`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>qt(e),render:()=>(0,C.jsx)(Jt,{})}),J(`readme-mobile-progress`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>Xt({...e,device:`mobile`}),render:()=>(0,C.jsx)(Yt,{})}),J(`worktree-manager`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[V],activeWorkspaceId:V.id,worktreeListByWorkspaceId:{[V.id]:U},commands:{worktreeListByWorkspaceId:{[V.id]:U},worktreeStatusByPath:{[U[0].path]:Lt},worktreeDiffByPath:{[U[0].path]:`diff --git a/src/app.tsx b/src/app.tsx`},worktreeTreeByPath:{[U[0].path]:Rt}}}),render:()=>(0,C.jsx)(m,{workspaceId:V.id,openView:`list`,onClose:()=>{}})}),J(`confirm-dialog-danger`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e}),render:()=>(0,C.jsx)(b,{open:!0,onOpenChange:()=>{},tone:`danger`,title:`Delete worktree?`,description:`This removes the worktree directory from disk.`,cancelText:`Cancel`,confirmText:`Delete`,onConfirm:()=>{}})}),J(`provider-error-state`,{router:()=>({initialEntries:[`/settings`],path:`/settings`}),seed:e=>({...e}),render:()=>(0,C.jsx)(`div`,{className:`settings-page`,children:(0,C.jsx)(ze,{tone:`error`,title:`Failed to refresh provider config`,message:`Retry after checking the provider settings.`,action:(0,C.jsx)(`button`,{className:`settings-link`,children:`Retry`})})})}),J(`file-tree-delete-confirm`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e}),render:()=>(0,C.jsx)(b,{open:!0,onOpenChange:()=>{},tone:`danger`,title:`Delete preview-file.ts?`,description:`This permanently removes the file from the current workspace.`,cancelText:`Cancel`,confirmText:`Delete`,onConfirm:()=>{}})}),J(`empty-state`,{router:()=>({initialEntries:[`/`],path:`/`}),seed:e=>({...e}),render:()=>(0,C.jsx)(`div`,{className:`welcome-card`,children:(0,C.jsx)(d,{title:(0,C.jsx)(`p`,{children:`No results`}),description:(0,C.jsx)(`p`,{children:`Try a different filter.`})})})}),J(`loading-state`,{router:()=>({initialEntries:[`/workspace`],path:`/workspace`}),seed:e=>({...e,workspaces:[],activeWorkspaceId:null}),render:()=>(0,C.jsx)(`div`,{className:`workspace-resolving-shell`,children:(0,C.jsx)(`div`,{className:`workspace-resolving-card`,children:(0,C.jsx)(d,{title:(0,C.jsx)(`p`,{children:`Loading workspace`}),description:(0,C.jsx)(`p`,{children:`Please wait...`})})})})})]}var en=[...Ft(),...$t(),...Ot()];function tn(e){return en.find(t=>t.id===e)??null}function nn(e){let t=new URLSearchParams(e),n=t.get(`scene`)??`welcome`,r=he(t.get(`theme`)),i=t.get(`locale`)===`en`?`en`:`zh`,a=t.get(`device`)===`mobile`?`mobile`:`desktop`,o=tn(n);return{sceneId:n,theme:r,locale:i,device:a,context:{theme:r,locale:i,device:a},scene:o}}function rn({sceneId:e}){return(0,C.jsx)(`div`,{className:`welcome-container`,children:(0,C.jsx)(`div`,{className:`welcome-card`,children:(0,C.jsx)(d,{title:(0,C.jsx)(`p`,{children:`Unknown preview scene`}),description:(0,C.jsx)(`p`,{children:e})})})})}function an({request:e}){if(document.documentElement.setAttribute(`data-theme`,Te(e.theme).documentThemeAttr),document.documentElement.setAttribute(`lang`,e.locale===`zh`?`zh`:`en`),document.body.dataset.uiPreviewDevice=e.device,!e.scene)return(0,C.jsx)(rn,{sceneId:e.sceneId});let t=e.scene.router(e.context);return(0,C.jsx)(at,{initialEntries:t.initialEntries,children:(0,C.jsx)(Ge,{children:(0,C.jsx)(Me,{path:t.path,element:e.scene.render(e.context)})})})}function X(e){return{ok:!0,data:e}}function Z(e,t){let n=e.terminalOutputById?.[t]??[];if(n.length===0)return new Uint8Array;let r=n.reduce((e,t)=>e+t.byteLength,0),i=new Uint8Array(r),a=0;for(let e of n)i.set(e,a),a+=e.byteLength;return i}function on(e,t){return Z(e,t).byteLength}function Q(e){return{ok:!1,error:{code:`preview_missing_handler`,message:e}}}function sn(e,t){return async(n,r)=>{let i=e.commands??{};if(n===`settings.get`)return X(i.settingsGet??{});if(n===`settings.update`)return X(i.settingsUpdate??{});if(n===`settings.previewCommand`){let e=r?.providerId??``;return X({preview:i.settingsPreviewCommandByProviderId?.[e]??``})}if(n===`settings.readConfigFile`)return X({exists:!0,content:`# preview config
21
+ `});if(n===`settings.writeConfigFile`)return X({ok:!0});if(n===`monitoring.get`)return i.monitoringGet?X(i.monitoringGet):Q(`Missing preview handler for monitoring.get`);if(n===`monitoring.recheck`)return X(i.monitoringRecheck??i.monitoringGet??null);if(n===`workspace.list`)return X(i.workspaceList??e.workspaces??[]);if(n===`workspace.browse`)return i.workspaceBrowse?X(i.workspaceBrowse):Q(`Missing workspace.browse preview handler`);if(n===`workspace.open`)return i.workspaceOpen?X(i.workspaceOpen):Q(`Missing workspace.open preview handler`);if(n===`workspace.uiState.set`){let n=r?.workspaceId??``,a=r?.uiState;return n&&a?.paneLayout&&t.set(me(n),a.paneLayout),X(i.workspaceUiStateSet??i.workspaceOpen??e.workspaces?.[0])}if(n===`session.list`){let e=r?.workspaceId??``;return X((i.sessionListByWorkspaceId?.[e]??[]).slice())}if(n===`git.status`){let t=r?.workspaceId??``,n=i.gitStatusByWorkspaceId?.[t];return X(n||(e.gitStateByWorkspaceId?.[t]??null))}if(n===`git.branches`){let e=r?.workspaceId??``,t=i.gitBranchesByWorkspaceId?.[e];return X(t||{current:``,branches:[]})}if(n===`git.log`){let e=r?.workspaceId??``;return X(i.gitLogByWorkspaceId?.[e]??{entries:[]})}if(n===`git.diff`){let e=r?.workspaceId??``;return X(i.gitDiffByWorkspaceId?.[e]??{diff:``,renderAs:`text`,status:`modified`})}if(n===`git.commitDetail`){let e=r?.workspaceId??``;return X(i.gitCommitDetailByWorkspaceId?.[e]??{commit:{sha:``,shortSha:``,subject:``,authorName:``,authoredAt:0},files:[]})}if(n===`git.commitFileDiff`){let e=r?.workspaceId??``;return X(i.gitCommitFileDiffByWorkspaceId?.[e]??{diff:``,renderAs:`text`,status:`modified`})}if(n===`git.checkout`)return X({success:!0,message:`Preview checkout`,branch:`main`});if(n===`git.fetch`||n===`git.pull`||n===`git.push`)return X({success:!0,message:`Preview sync`});if(n===`file.readTree`){let{workspaceId:e=``,subPath:t}=r??{},n=t??`.`;return X({path:n,children:i.fileTreeByWorkspaceId?.[e]?.[n]??[]})}if(n===`file.read`){let{workspaceId:e=``,path:t=``}=r??{},n=i.fileReadByWorkspaceId?.[e]?.[t];return X({kind:`text`,content:n?.content??`// Preview file: ${t}\n`,baseHash:n?.baseHash??``,encoding:`utf-8`})}if(n===`file.search`){let e=r?.workspaceId??``;return X({files:i.fileSearchByWorkspaceId?.[e]??[]})}if(n===`file.searchSession.start`){let e=r?.workspaceId??``;return X(i.fileSearchSessionByWorkspaceId?.[e]??{files:[],sessionId:`preview-search-session`,totalMatchCount:0,totalFileCount:0,hasMoreFiles:!1,truncatedMatchFileCount:0,skippedBinaryFileCount:0,skippedLargeFileCount:0})}if(n===`file.searchSession.previewFile`){let e=r?.workspaceId??``,t=r?.path??``;return X(i.fileSearchPreviewByWorkspaceId?.[e]?.[t]??{kind:`search-replace-file-diff`,path:t,title:t,sessionId:`preview-search-session`,baseHash:`preview-base-hash`,originalContent:`// Preview before replacement: ${t}\n`,modifiedContent:`// Preview after replacement: ${t}\n`})}if(n===`file.searchSession.apply`){let e=r?.workspaceId??``;return X(i.fileSearchApplyByWorkspaceId?.[e]??{sessionId:`preview-search-session`,status:`ok`,appliedFileCount:1,conflictFileCount:0,skippedFileCount:0,results:[]})}if(n===`worktree.list`){let e=r?.workspaceId??``;return X({worktrees:i.worktreeListByWorkspaceId?.[e]??[]})}if(n===`worktree.status`){let e=r?.worktreePath??``,t=i.worktreeStatusByPath?.[e];return X(t?{status:t}:{status:null})}if(n===`worktree.diff`){let e=r?.worktreePath??``;return X({diff:i.worktreeDiffByPath?.[e]??``})}if(n===`worktree.tree`){let e=r?.worktreePath??``;return X({tree:i.worktreeTreeByPath?.[e]??[]})}if(n===`worktree.create`||n===`worktree.remove`)return X({ok:!0});if(n===`terminal.list`){let e=r?.workspaceId??``;return X(i.terminalListByWorkspaceId?.[e]??[])}if(n===`terminal.create`)return X({id:`terminal-preview-created`,workspaceId:r?.workspaceId??e.activeWorkspaceId??``,kind:`shell`,title:`Preview Terminal`,cwd:`/home/spencer/workspace/coder-studio`,argv:[],cols:120,rows:32,alive:!0,createdAt:1});if(n===`terminal.snapshot`){let t=r?.terminalId??``,n=Z(e,t);return X({status:`ok`,transport:`binary`,streamId:1,size:n.byteLength,seq:on(e,t),rows:28,cols:120,source:`headless`,bytes:n})}if(n===`terminal.replay`){let t=r?.terminalId??``,n=r?.lastSeq??0,i=Z(e,t),a=i.subarray(Math.max(0,n));return X({status:`ok`,transport:`binary`,streamId:1,size:a.byteLength,seq:i.byteLength,bytes:a})}if(n===`terminal.close`||n===`terminal.resize`||n===`terminal.input`||n===`provider.runtimeStatus`||n===`provider.install.start`||n===`provider.install.get`||n===`session.create`||n===`session.stop`||n===`session.remove`||n===`file.create`||n===`file.mkdir`||n===`file.delete`||n===`supervisor.create`||n===`supervisor.update`||n===`supervisor.delete`)return X({});if(n===`supervisor.get`){let t=r?.sessionId??``;return X({supervisor:i.supervisorBySessionId?.[t]??e.supervisorBySessionId?.[t]??null})}return Q(`Missing preview handler for ${n}`)}}function cn(e){let n=De(),a=sn(e,n),o=e.workspaces??[],s=he(e.theme),c=we(e.commands?.settingsGet??{});n.set(le,s),n.set(se,c),n.set(ae,e.locale),n.set(i,e.authEnabled===void 0?!1:e.authEnabled),n.set(ye,e.authenticated??!0),n.set(de,e.connectionStatus??`connected`),n.set(ee,Object.fromEntries(o.map(e=>[e.id,e]))),n.set(ne,o.map(e=>e.id)),n.set(We,e.workspacesLoadState??`ready`),n.set(pe,e.workspacesLoadError??null),n.set(ve,e.activeWorkspaceId===void 0?o[0]?.id??null:e.activeWorkspaceId);for(let t of o)n.set(Fe(t.id),{focusMode:t.uiState.focusMode,leftPanelWidth:t.uiState.leftPanelWidth,bottomPanelHeight:t.uiState.bottomPanelHeight,sidebarCollapsed:!1,desktopSidebarView:`explorer`,terminalPanelVisible:e.terminalPanelVisible??!0});n.set(ut,Object.fromEntries((e.sessions??[]).map(e=>[e.id,e]))),n.set(Ce,e.commandPaletteOpen??!1),n.set(st,e.branchQuickPick??{visible:!1,inputValue:``}),n.set(t,e.terminalPanelVisible??!0),n.set(ie,e.toasts??[]),n.set(re,e.updateState??null),n.set(Ue,e.supervisorDialog?{draftEvaluatorModel:``,draftMaxSupervisionCount:`0`,draftScheduledAt:``,...e.supervisorDialog}:{open:!1,sessionId:null,mode:`enable`,draftObjective:``,draftEvaluatorProviderId:`claude`,draftEvaluatorModel:``,draftMaxSupervisionCount:`0`,draftScheduledAt:``}),n.set(r,new Map(Object.entries(e.supervisorBySessionId??{}))),n.set(ge,{sendCommand:async(e,t)=>{let n=await a(e,t);if(!n.ok)throw Error(n.error?.message??`Preview command failed: ${e}`);return n.data},sendTerminalInput:async()=>{},subscribe:()=>()=>{},connect:async()=>{},disconnect:()=>{},getStatus:()=>`connected`}),typeof document<`u`&&(ce(s),document.documentElement.setAttribute(`lang`,e.locale),document.body.dataset.uiPreviewDevice=e.device,tt(c,s));for(let[t,r]of Object.entries(e.paneLayoutByWorkspaceId??{}))n.set(me(t),r);for(let[t,r]of Object.entries(e.activeEditorPaneIdByWorkspaceId??{}))n.set(be(t),r);for(let[t,r]of Object.entries(e.focusedEditorPaneIdByWorkspaceId??{}))n.set(oe(t),r);for(let[t,r]of Object.entries(e.fileTreeByWorkspaceId??{}))n.set(Ke(t),r);for(let[t,r]of Object.entries(e.openFilesByWorkspaceId??{}))n.set(Ie(t),r);for(let[t,r]of Object.entries(e.activeFilePathByWorkspaceId??{}))n.set(Xe(t),r);for(let[t,r]of Object.entries(e.gitStateByWorkspaceId??{}))n.set(Ve(t),r);for(let[t,r]of Object.entries(e.gitBranchListByWorkspaceId??{}))n.set(Ye(t),{...r,loading:!1});for(let[t,r]of Object.entries(e.gitDiffPreviewByWorkspaceId??{}))n.set(rt(t),r);for(let[t,r]of Object.entries(e.worktreeListByWorkspaceId??{}))n.set(ke(t),{items:r,loading:!1,lastLoadedAt:1});for(let[t,r]of Object.entries(e.terminalMetaById??{}))n.set(te(t),r);return n}var $=nn(window.location.search),ln=cn($.scene?$.scene.seed($.context):$.context);pt.createRoot(document.getElementById(`root`)).render((0,C.jsx)(Ne,{store:ln,children:(0,C.jsx)(an,{request:$})}));
22
+ //# sourceMappingURL=ui-preview-tdq8QPlu.js.map