From 1f88850a06d5a67ffba7f80e6ee26feafc3caa34 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:06:00 -0700 Subject: [PATCH 01/23] Add React feed surface and shared feed actions --- .../webviews-app/assets/feedSurface.css | 1 + .../chunks/agentSessionSurface.mjs | 4 +- .../webviews-app/chunks/diffSurface.mjs | 4 +- .../webviews-app/chunks/feedSurface.mjs | 1 + .../chunks/installWebviewStyles.mjs | 2 +- .../webviews-app/chunks/router.mjs | 1 + .../markdown-viewer/webviews-app/feed.html | 13 + .../markdown-viewer/webviews-app/main.mjs | 3 +- Sources/AppDelegate+AgentChat.swift | 44 +++ .../AppDelegate+NewWorkspaceContextMenu.swift | 15 + Sources/AppDelegate.swift | 1 + Sources/CmuxConfig.swift | 3 + Sources/CmuxSurfaceTabBarBuiltInAction.swift | 7 +- .../ContentView+AgentChatCommandPalette.swift | 28 ++ Sources/ContentView.swift | 2 + Sources/Feed/FeedPanelView.swift | 2 +- Sources/Feed/FeedPanelViewModel.swift | 30 +- Sources/Feed/FeedSurfaceBridge.swift | 282 ++++++++++++++++++ Sources/NewWorkspaceMenuModel.swift | 15 + Sources/Panels/BrowserPanel.swift | 62 +++- Sources/Workspace.swift | 8 + cmux.xcodeproj/project.pbxproj | 4 + cmuxTests/FeedCoordinatorTests.swift | 9 + cmuxTests/NewWorkspaceMenuModelTests.swift | 9 + scripts/build-webviews-app.sh | 23 +- webviews/src/feed/App.tsx | 174 +++++++++++ webviews/src/feed/bridge.ts | 64 ++++ webviews/src/feed/styles.css | 40 +++ webviews/src/feed/types.ts | 68 +++++ webviews/src/main.tsx | 17 +- webviews/src/router.tsx | 6 + webviews/src/surfaces/feedSurface.tsx | 11 + webviews/test/feed.test.tsx | 75 +++++ 33 files changed, 1001 insertions(+), 27 deletions(-) create mode 100644 Resources/markdown-viewer/webviews-app/assets/feedSurface.css create mode 100644 Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs create mode 100644 Resources/markdown-viewer/webviews-app/chunks/router.mjs create mode 100644 Resources/markdown-viewer/webviews-app/feed.html create mode 100644 Sources/Feed/FeedSurfaceBridge.swift create mode 100644 webviews/src/feed/App.tsx create mode 100644 webviews/src/feed/bridge.ts create mode 100644 webviews/src/feed/styles.css create mode 100644 webviews/src/feed/types.ts create mode 100644 webviews/src/surfaces/feedSurface.tsx create mode 100644 webviews/test/feed.test.tsx diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css new file mode 100644 index 000000000000..321c6e3ede21 --- /dev/null +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -0,0 +1 @@ +:root{color-scheme:light dark;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif}*{box-sizing:border-box}html,body,#root{width:100%;min-height:100%;margin:0}body{background:transparent;color:CanvasText}button{font:inherit}.feed-shell{min-height:100vh;padding:20px clamp(14px,4vw,42px) 40px}.feed-loading{opacity:.5}.feed-header{align-items:center;display:flex;justify-content:space-between;margin:0 auto 18px;max-width:880px}.feed-header h1{font-size:20px;margin:0}.feed-filter{background:color-mix(in srgb,CanvasText 7%,transparent);border-radius:9px;display:flex;gap:2px;padding:3px}.feed-filter button{background:transparent;border:0;border-radius:7px;color:color-mix(in srgb,CanvasText 68%,transparent);padding:5px 10px}.feed-filter button[aria-selected=true]{background:color-mix(in srgb,Canvas 86%,CanvasText 14%);color:CanvasText;box-shadow:0 1px 3px #0002}.feed-list{display:grid;gap:10px;margin:0 auto;max-width:880px}.feed-card{background:color-mix(in srgb,Canvas 93%,CanvasText 7%);border:1px solid color-mix(in srgb,CanvasText 10%,transparent);border-radius:12px;padding:14px}.feed-card-pending{border-color:color-mix(in srgb,#4c8dff 45%,transparent);box-shadow:0 5px 20px #0000000c}.feed-card-heading{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.feed-card-heading h2{font-size:14px;margin:3px 0 0}.feed-card-heading time,.feed-source,.feed-cwd{color:color-mix(in srgb,CanvasText 52%,transparent);font-size:11px}.feed-source{font-weight:600;text-transform:capitalize}.feed-cwd{font-family:ui-monospace,monospace;margin-top:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:color-mix(in srgb,CanvasText 6%,transparent);border-radius:8px;font:12px/1.5 ui-monospace,monospace;margin:12px 0 0;max-height:280px;overflow:auto;padding:10px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:color-mix(in srgb,CanvasText 8%,transparent);border:1px solid color-mix(in srgb,CanvasText 12%,transparent);border-radius:7px;color:CanvasText;cursor:pointer;padding:6px 10px}.feed-actions .primary,.feed-question-actions .primary{background:#2678ed;border-color:#2678ed;color:#fff}.feed-actions .danger{color:#e05252}.feed-question-actions{display:grid;gap:8px;margin-top:12px}.feed-question{display:grid;gap:7px}.feed-question-prompt{font-size:12px;font-weight:600}.feed-question input{background:color-mix(in srgb,CanvasText 6%,transparent);border:1px solid color-mix(in srgb,CanvasText 12%,transparent);border-radius:7px;color:CanvasText;font:inherit;padding:7px 9px;width:100%}.feed-options{display:grid;gap:6px}.feed-options button{display:grid;gap:2px;text-align:left}.feed-options button[aria-pressed=true]{border-color:#4c8dff;background:color-mix(in srgb,#4c8dff 16%,transparent)}.feed-options span{color:color-mix(in srgb,CanvasText 60%,transparent);font-size:11px}.feed-empty{color:color-mix(in srgb,CanvasText 55%,transparent);padding:80px 20px;text-align:center}.feed-error{background:#e0525220;border:1px solid #e0525260;border-radius:8px;margin:0 auto 10px;max-width:880px;padding:8px 10px}.feed-load-more{justify-self:center;margin-top:4px}button:disabled{cursor:default;opacity:.45}button:focus-visible{outline:2px solid #4c8dff;outline-offset:2px}.feed-question input:focus-visible{outline:2px solid #4c8dff;outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:12px}.feed-filter{align-self:flex-start}} diff --git a/Resources/markdown-viewer/webviews-app/chunks/agentSessionSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/agentSessionSurface.mjs index 5ec667e582f0..7f6ae595a272 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/agentSessionSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/agentSessionSurface.mjs @@ -1,4 +1,4 @@ -import{R as rt,i as b,b as Et,c as Ys,j as Pr,a as Gs}from"./vendor.mjs";import{m as lt,i as Xs,c as Qs}from"./installWebviewStyles.mjs";function ea(n){if(n.activityStatus==="stopped"||n.activityStatus==="failed")return"!";switch(n.activityKind){case"command":return"$";case"fileChange":return"+";default:return"*"}}const ta={isDark:null,pageBackground:"--agent-page-bg",surfaceBackground:"--agent-surface",surfaceElevatedBackground:"--agent-surface-elevated",inputBackground:"--agent-input-bg",border:"--agent-border",borderStrong:"--agent-border-strong",text:"--agent-text",mutedText:"--agent-muted",softText:"--agent-soft",accent:"--agent-accent",accentSoft:"--agent-accent-soft",danger:"--agent-danger",shadow:"--agent-shadow"};function Wn(n){if(typeof document>"u")return;const e=document.documentElement;e.dataset.theme=n.isDark?"dark":"light",jo(),e.classList.toggle("dark",n.isDark),e.classList.toggle("electron-dark",n.isDark),e.classList.toggle("light",!n.isDark),e.style.colorScheme=n.isDark?"dark":"light";for(const[t,r]of Object.entries(ta))r&&e.style.setProperty(r,String(n[t]))}function jo(){if(typeof document>"u")return;const n=document.documentElement;n.dataset.codexWindowType="electron",n.dataset.windowType="electron",n.dataset.codexOs=na(),document.body&&(document.body.dataset.codexWindowType="electron")}function na(){if(typeof navigator>"u")return"unknown";const n=navigator,e=(n.userAgentData?.platform??n.platform??n.userAgent).toLowerCase();return e.includes("win")?"win32":e.includes("mac")||e.includes("darwin")?"darwin":e.includes("linux")?"linux":"unknown"}const Hn=new Set;class Ko extends Error{code;constructor(e,t){super(e),this.name="NativeBridgeError",this.code=t}}typeof window<"u"&&(window.cmuxAgentBridge={applyTheme(n){Wn(n)},receive(n){n.type==="app.theme"&&Wn(n.theme);for(const e of Hn)e(n)}});function ra(n){return Hn.add(n),()=>{Hn.delete(n)}}async function qe(n,e={}){if(typeof window>"u")throw new Error("Native bridge is unavailable.");const t=window.webkit?.messageHandlers?.agentSession;if(!t||typeof t.postMessage!="function")throw new Error("Native bridge is unavailable.");const r=await t.postMessage({id:lt(),method:n,params:e});if(!r.ok)throw new Ko(r.error?.userMessage||"Native bridge request failed.",r.error?.code);return r.value}const ee="border-token-border user-select-none no-drag cursor-interaction flex items-center gap-1 border whitespace-nowrap focus:outline-none disabled:cursor-not-allowed disabled:opacity-40",te="text-token-text-tertiary enabled:hover:bg-token-list-hover-background data-[state=open]:bg-token-list-hover-background border-transparent",Oe="h-token-button-composer px-2 py-0 text-sm leading-[18px]",oa="h-token-button-composer-sm px-1.5 py-0 text-sm leading-[18px]",ln="electron:p-1 electron:[&>svg]:icon-sm flex items-center justify-center p-0.5",Kt="aspect-square items-center justify-center !px-0",ia="focus-visible:outline-token-button-background cursor-interaction size-token-button-composer flex items-center justify-center rounded-full p-0.5 transition-opacity focus-visible:outline-2 bg-token-foreground",sa="agent-composer-stack",aa="codex-composer-frame relative",la="codex-composer-inner relative z-10 flex min-h-0 flex-1 flex-col",ca="codex-composer-surface relative flex flex-col bg-token-input-background/90 backdrop-blur-lg extension:border extension:border-token-border/50 electron:ring electron:ring-black/10 electron:shadow-[0_4px_16px_0_rgba(0,0,0,0.05)] electron:dark:bg-token-dropdown-background",da="composer-footer grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-2 px-2 py-1",ua="composer-footer grid grid-cols-[minmax(0,auto)_auto_minmax(0,1fr)] items-center gap-[5px] mb-2 px-2",Zo="M16.6182 9.33203H3.38184V12.7002C3.38184 13.3753 3.38238 13.8438 3.41211 14.208C3.44124 14.5646 3.49494 14.766 3.57129 14.916L3.63867 15.0361C3.80618 15.3094 4.04683 15.5324 4.33399 15.6787L4.45703 15.7314C4.59362 15.7803 4.77411 15.816 5.04199 15.8379C5.40624 15.8676 5.87469 15.8682 6.54981 15.8682H13.4502C14.1253 15.8682 14.5938 15.8676 14.958 15.8379C15.3146 15.8088 15.516 15.7551 15.666 15.6787L15.7861 15.6113C16.0594 15.4438 16.2824 15.2032 16.4287 14.916L16.4814 14.793C16.5303 14.6564 16.566 14.4759 16.5879 14.208C16.6176 13.8438 16.6182 13.3753 16.6182 12.7002V9.33203ZM17.8818 12.7002C17.8818 13.3547 17.8826 13.8838 17.8477 14.3115C17.8165 14.6922 17.7543 15.0349 17.6172 15.3545L17.5537 15.4902C17.3015 15.9852 16.9182 16.3996 16.4473 16.6885L16.2402 16.8037C15.8824 16.9861 15.4966 17.0621 15.0615 17.0977C14.6338 17.1326 14.1047 17.1318 13.4502 17.1318H6.54981C5.89526 17.1318 5.36616 17.1326 4.93848 17.0977C4.55777 17.0665 4.21506 17.0043 3.89551 16.8672L3.75977 16.8037C3.26483 16.5515 2.85036 16.1682 2.56152 15.6973L2.44629 15.4902C2.26394 15.1324 2.1879 14.7466 2.15235 14.3115C2.1174 13.8838 2.11817 13.3547 2.11817 12.7002V7.29981C2.11817 6.64526 2.1174 6.11616 2.15235 5.68848C2.1879 5.25344 2.26394 4.86765 2.44629 4.50977L2.56152 4.30274C2.85036 3.83179 3.26483 3.44854 3.75977 3.19629L3.89551 3.13281C4.21506 2.99571 4.55777 2.93346 4.93848 2.90235C5.36616 2.8674 5.89526 2.86817 6.54981 2.86817H7.24512C7.38876 2.86816 7.48717 2.86807 7.58399 2.87402L7.83496 2.90039C8.41501 2.98537 8.96006 3.23832 9.40039 3.63086L9.64356 3.86817C9.75546 3.98103 9.79343 4.0181 9.83008 4.05078L9.94238 4.14356C10.2142 4.34787 10.5413 4.46917 10.8828 4.49024L11.1445 4.49317H13.4502C14.1047 4.49317 14.6338 4.4924 15.0615 4.52735C15.4966 4.5629 15.8824 4.63894 16.2402 4.82129L16.4473 4.93652C16.9182 5.22536 17.3015 5.63983 17.5537 6.13477L17.6172 6.27051C17.7543 6.59006 17.8165 6.93277 17.8477 7.31348C17.8826 7.74116 17.8818 8.27026 17.8818 8.92481V12.7002ZM3.38184 8.06836H16.6143C16.6105 7.81516 16.603 7.60256 16.5879 7.41699C16.566 7.14911 16.5303 6.96862 16.4814 6.83203L16.4287 6.70899C16.2824 6.42183 16.0594 6.18118 15.7861 6.01367L15.666 5.94629C15.516 5.86994 15.3146 5.81624 14.958 5.78711C14.5938 5.75738 14.1253 5.75684 13.4502 5.75684H11.1445L10.8047 5.75098C10.2158 5.71466 9.65236 5.50645 9.1836 5.1543L8.98926 4.99414C8.91673 4.92948 8.84746 4.85908 8.7461 4.75684L8.55957 4.57422C8.30416 4.34653 7.98784 4.19959 7.65137 4.15039L7.50684 4.13477C7.45779 4.13174 7.4043 4.13184 7.24512 4.13184H6.54981C5.87469 4.13184 5.40624 4.13238 5.04199 4.16211C4.77411 4.184 4.59362 4.21966 4.45703 4.26856L4.33399 4.32129C4.04683 4.4676 3.80618 4.69061 3.63867 4.96387L3.57129 5.08399C3.49494 5.23405 3.44124 5.43543 3.41211 5.79199C3.38238 6.15624 3.38184 6.62469 3.38184 7.29981V8.06836Z",pa=32;function fa(n){return n.hasVisibleAttachments||n.isEditorMultiline||n.isVoiceLayoutActive?!1:n.singleLineInputWidth==null?!0:n.singleLineTextWidth+pa<=n.singleLineInputWidth}function Yo(n){const e={};for(const t of n)e[t.id]={hideControl:!1,hideLabel:!1};return e}function ha(n){const e=n.items.filter(s=>s.enabled),t=Yo(n.items);if(e.length===0||n.availableWidth<=0)return t;const r=e.reduce((s,a)=>s+a.expandedWidth,0)+n.gap*Math.max(0,e.length-1);if(r<=0)return t;let o=r;for(const s of e)!s.canHideLabel||n.availableWidth>=o||(t[s.id].hideLabel=!0,o-=s.expandedWidth-s.compactWidth);if(ga(t,n.previousState,"hideLabel"))return t;let i=e.length;for(const s of e){const a=t[s.id],l=a.hideLabel?s.compactWidth:s.expandedWidth;(a.hideLabel&&!s.hasMeasuredCompactWidth||n.availableWidth1?n.gap:0),i-=1)}return t}function ma(n,e){const t=Object.keys(n),r=Object.keys(e);if(t.length!==r.length)return!1;for(const o of t)if(n[o]?.hideControl!==e[o]?.hideControl||n[o]?.hideLabel!==e[o]?.hideLabel)return!1;return!0}function ga(n,e,t){const r=Object.keys(n);return r.length!==Object.keys(e).length?!0:r.some(o=>n[o]?.[t]!==e[o]?.[t])}const xa=new Set(["base","embed","form","iframe","link","meta","object","script","style"]),ba=new Set(["poster","src","srcset","xlink:href"]);function ya(n){const e=typeof window>"u"?void 0:window.marked;if(e?.parse)try{const t=e.parse(ka(n),{async:!1,breaks:!0,gfm:!0});if(typeof t=="string")return Ma(t)}catch{return Be(n)}return Be(n)}function ka(n){let e="",t=null;const r=n.match(/[^\r\n]*(?:\r\n|\n|\r|$)/g)??[];for(const o of r){if(o==="")continue;const i=o.match(/(\r\n|\n|\r)$/)?.[0]??"",s=i?o.slice(0,-i.length):o;if(t){e+=s+i,Ca(s,t)&&(t=null);continue}const a=va(s);if(a){t=a,e+=s+i;continue}e+=Sa(s)+i}return e}function Be(n){return wa(n).replace(/\n/g,"
")}function wa(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function va(n){const e=/^( {0,3})(`{3,}|~{3,})/.exec(n);if(!e)return null;const t=e[2];return{character:t[0],length:t.length}}function Ca(n,e){const t=/^( {0,3})(`{3,}|~{3,})\s*$/.exec(n);if(!t)return!1;const r=t[2];return r[0]===e.character&&r.length>=e.length}function Sa(n){let e="",t=0,r=0;for(;r"u")return n;const e=document.createElement("template");e.innerHTML=n;for(const t of Array.from(e.content.querySelectorAll("*"))){if(xa.has(t.localName)){t.remove();continue}for(const r of Array.from(t.attributes)){const o=r.name.toLowerCase();if(o.startsWith("on")||o==="srcdoc"||o==="style"){t.removeAttribute(r.name);continue}const i=Na(t.localName,o,r.value);i===null?t.removeAttribute(r.name):typeof i=="string"&&i!==r.value&&t.setAttribute(r.name,i)}t.localName==="a"&&t.setAttribute("rel","noreferrer")}return e.innerHTML}function Na(n,e,t){const r=e.toLowerCase();if(ba.has(r))return null;if(r==="href")return n.toLowerCase()!=="a"?null:Oa(t)?t:null}function Oa(n){const e=n.trim();if(e.startsWith("#"))return!0;if(e.startsWith("/")||!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e))return!1;try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"||t.protocol==="mailto:"}catch{return!1}}function Go(n){return n.replace(/([\\[\]])/g,"\\$1")}function Xo(n){return encodeURI(n).replace(/([\\()])/g,"\\$1")}function Ta(n,e){const t=e.map(r=>`[${Go(r.label)}](${Xo(r.path)})`).join(" ");return t?n.trim().length>0?`${t} +import{R as rt,i as b,b as Et,c as Ys,j as Pr,a as Gs}from"./vendor.mjs";import{m as lt,i as Xs}from"./installWebviewStyles.mjs";import{c as Qs}from"./router.mjs";function ea(n){if(n.activityStatus==="stopped"||n.activityStatus==="failed")return"!";switch(n.activityKind){case"command":return"$";case"fileChange":return"+";default:return"*"}}const ta={isDark:null,pageBackground:"--agent-page-bg",surfaceBackground:"--agent-surface",surfaceElevatedBackground:"--agent-surface-elevated",inputBackground:"--agent-input-bg",border:"--agent-border",borderStrong:"--agent-border-strong",text:"--agent-text",mutedText:"--agent-muted",softText:"--agent-soft",accent:"--agent-accent",accentSoft:"--agent-accent-soft",danger:"--agent-danger",shadow:"--agent-shadow"};function Wn(n){if(typeof document>"u")return;const e=document.documentElement;e.dataset.theme=n.isDark?"dark":"light",jo(),e.classList.toggle("dark",n.isDark),e.classList.toggle("electron-dark",n.isDark),e.classList.toggle("light",!n.isDark),e.style.colorScheme=n.isDark?"dark":"light";for(const[t,r]of Object.entries(ta))r&&e.style.setProperty(r,String(n[t]))}function jo(){if(typeof document>"u")return;const n=document.documentElement;n.dataset.codexWindowType="electron",n.dataset.windowType="electron",n.dataset.codexOs=na(),document.body&&(document.body.dataset.codexWindowType="electron")}function na(){if(typeof navigator>"u")return"unknown";const n=navigator,e=(n.userAgentData?.platform??n.platform??n.userAgent).toLowerCase();return e.includes("win")?"win32":e.includes("mac")||e.includes("darwin")?"darwin":e.includes("linux")?"linux":"unknown"}const Hn=new Set;class Ko extends Error{code;constructor(e,t){super(e),this.name="NativeBridgeError",this.code=t}}typeof window<"u"&&(window.cmuxAgentBridge={applyTheme(n){Wn(n)},receive(n){n.type==="app.theme"&&Wn(n.theme);for(const e of Hn)e(n)}});function ra(n){return Hn.add(n),()=>{Hn.delete(n)}}async function qe(n,e={}){if(typeof window>"u")throw new Error("Native bridge is unavailable.");const t=window.webkit?.messageHandlers?.agentSession;if(!t||typeof t.postMessage!="function")throw new Error("Native bridge is unavailable.");const r=await t.postMessage({id:lt(),method:n,params:e});if(!r.ok)throw new Ko(r.error?.userMessage||"Native bridge request failed.",r.error?.code);return r.value}const ee="border-token-border user-select-none no-drag cursor-interaction flex items-center gap-1 border whitespace-nowrap focus:outline-none disabled:cursor-not-allowed disabled:opacity-40",te="text-token-text-tertiary enabled:hover:bg-token-list-hover-background data-[state=open]:bg-token-list-hover-background border-transparent",Oe="h-token-button-composer px-2 py-0 text-sm leading-[18px]",oa="h-token-button-composer-sm px-1.5 py-0 text-sm leading-[18px]",ln="electron:p-1 electron:[&>svg]:icon-sm flex items-center justify-center p-0.5",Kt="aspect-square items-center justify-center !px-0",ia="focus-visible:outline-token-button-background cursor-interaction size-token-button-composer flex items-center justify-center rounded-full p-0.5 transition-opacity focus-visible:outline-2 bg-token-foreground",sa="agent-composer-stack",aa="codex-composer-frame relative",la="codex-composer-inner relative z-10 flex min-h-0 flex-1 flex-col",ca="codex-composer-surface relative flex flex-col bg-token-input-background/90 backdrop-blur-lg extension:border extension:border-token-border/50 electron:ring electron:ring-black/10 electron:shadow-[0_4px_16px_0_rgba(0,0,0,0.05)] electron:dark:bg-token-dropdown-background",da="composer-footer grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-2 px-2 py-1",ua="composer-footer grid grid-cols-[minmax(0,auto)_auto_minmax(0,1fr)] items-center gap-[5px] mb-2 px-2",Zo="M16.6182 9.33203H3.38184V12.7002C3.38184 13.3753 3.38238 13.8438 3.41211 14.208C3.44124 14.5646 3.49494 14.766 3.57129 14.916L3.63867 15.0361C3.80618 15.3094 4.04683 15.5324 4.33399 15.6787L4.45703 15.7314C4.59362 15.7803 4.77411 15.816 5.04199 15.8379C5.40624 15.8676 5.87469 15.8682 6.54981 15.8682H13.4502C14.1253 15.8682 14.5938 15.8676 14.958 15.8379C15.3146 15.8088 15.516 15.7551 15.666 15.6787L15.7861 15.6113C16.0594 15.4438 16.2824 15.2032 16.4287 14.916L16.4814 14.793C16.5303 14.6564 16.566 14.4759 16.5879 14.208C16.6176 13.8438 16.6182 13.3753 16.6182 12.7002V9.33203ZM17.8818 12.7002C17.8818 13.3547 17.8826 13.8838 17.8477 14.3115C17.8165 14.6922 17.7543 15.0349 17.6172 15.3545L17.5537 15.4902C17.3015 15.9852 16.9182 16.3996 16.4473 16.6885L16.2402 16.8037C15.8824 16.9861 15.4966 17.0621 15.0615 17.0977C14.6338 17.1326 14.1047 17.1318 13.4502 17.1318H6.54981C5.89526 17.1318 5.36616 17.1326 4.93848 17.0977C4.55777 17.0665 4.21506 17.0043 3.89551 16.8672L3.75977 16.8037C3.26483 16.5515 2.85036 16.1682 2.56152 15.6973L2.44629 15.4902C2.26394 15.1324 2.1879 14.7466 2.15235 14.3115C2.1174 13.8838 2.11817 13.3547 2.11817 12.7002V7.29981C2.11817 6.64526 2.1174 6.11616 2.15235 5.68848C2.1879 5.25344 2.26394 4.86765 2.44629 4.50977L2.56152 4.30274C2.85036 3.83179 3.26483 3.44854 3.75977 3.19629L3.89551 3.13281C4.21506 2.99571 4.55777 2.93346 4.93848 2.90235C5.36616 2.8674 5.89526 2.86817 6.54981 2.86817H7.24512C7.38876 2.86816 7.48717 2.86807 7.58399 2.87402L7.83496 2.90039C8.41501 2.98537 8.96006 3.23832 9.40039 3.63086L9.64356 3.86817C9.75546 3.98103 9.79343 4.0181 9.83008 4.05078L9.94238 4.14356C10.2142 4.34787 10.5413 4.46917 10.8828 4.49024L11.1445 4.49317H13.4502C14.1047 4.49317 14.6338 4.4924 15.0615 4.52735C15.4966 4.5629 15.8824 4.63894 16.2402 4.82129L16.4473 4.93652C16.9182 5.22536 17.3015 5.63983 17.5537 6.13477L17.6172 6.27051C17.7543 6.59006 17.8165 6.93277 17.8477 7.31348C17.8826 7.74116 17.8818 8.27026 17.8818 8.92481V12.7002ZM3.38184 8.06836H16.6143C16.6105 7.81516 16.603 7.60256 16.5879 7.41699C16.566 7.14911 16.5303 6.96862 16.4814 6.83203L16.4287 6.70899C16.2824 6.42183 16.0594 6.18118 15.7861 6.01367L15.666 5.94629C15.516 5.86994 15.3146 5.81624 14.958 5.78711C14.5938 5.75738 14.1253 5.75684 13.4502 5.75684H11.1445L10.8047 5.75098C10.2158 5.71466 9.65236 5.50645 9.1836 5.1543L8.98926 4.99414C8.91673 4.92948 8.84746 4.85908 8.7461 4.75684L8.55957 4.57422C8.30416 4.34653 7.98784 4.19959 7.65137 4.15039L7.50684 4.13477C7.45779 4.13174 7.4043 4.13184 7.24512 4.13184H6.54981C5.87469 4.13184 5.40624 4.13238 5.04199 4.16211C4.77411 4.184 4.59362 4.21966 4.45703 4.26856L4.33399 4.32129C4.04683 4.4676 3.80618 4.69061 3.63867 4.96387L3.57129 5.08399C3.49494 5.23405 3.44124 5.43543 3.41211 5.79199C3.38238 6.15624 3.38184 6.62469 3.38184 7.29981V8.06836Z",pa=32;function fa(n){return n.hasVisibleAttachments||n.isEditorMultiline||n.isVoiceLayoutActive?!1:n.singleLineInputWidth==null?!0:n.singleLineTextWidth+pa<=n.singleLineInputWidth}function Yo(n){const e={};for(const t of n)e[t.id]={hideControl:!1,hideLabel:!1};return e}function ha(n){const e=n.items.filter(s=>s.enabled),t=Yo(n.items);if(e.length===0||n.availableWidth<=0)return t;const r=e.reduce((s,a)=>s+a.expandedWidth,0)+n.gap*Math.max(0,e.length-1);if(r<=0)return t;let o=r;for(const s of e)!s.canHideLabel||n.availableWidth>=o||(t[s.id].hideLabel=!0,o-=s.expandedWidth-s.compactWidth);if(ga(t,n.previousState,"hideLabel"))return t;let i=e.length;for(const s of e){const a=t[s.id],l=a.hideLabel?s.compactWidth:s.expandedWidth;(a.hideLabel&&!s.hasMeasuredCompactWidth||n.availableWidth1?n.gap:0),i-=1)}return t}function ma(n,e){const t=Object.keys(n),r=Object.keys(e);if(t.length!==r.length)return!1;for(const o of t)if(n[o]?.hideControl!==e[o]?.hideControl||n[o]?.hideLabel!==e[o]?.hideLabel)return!1;return!0}function ga(n,e,t){const r=Object.keys(n);return r.length!==Object.keys(e).length?!0:r.some(o=>n[o]?.[t]!==e[o]?.[t])}const xa=new Set(["base","embed","form","iframe","link","meta","object","script","style"]),ba=new Set(["poster","src","srcset","xlink:href"]);function ya(n){const e=typeof window>"u"?void 0:window.marked;if(e?.parse)try{const t=e.parse(ka(n),{async:!1,breaks:!0,gfm:!0});if(typeof t=="string")return Ma(t)}catch{return Be(n)}return Be(n)}function ka(n){let e="",t=null;const r=n.match(/[^\r\n]*(?:\r\n|\n|\r|$)/g)??[];for(const o of r){if(o==="")continue;const i=o.match(/(\r\n|\n|\r)$/)?.[0]??"",s=i?o.slice(0,-i.length):o;if(t){e+=s+i,Ca(s,t)&&(t=null);continue}const a=va(s);if(a){t=a,e+=s+i;continue}e+=Sa(s)+i}return e}function Be(n){return wa(n).replace(/\n/g,"
")}function wa(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function va(n){const e=/^( {0,3})(`{3,}|~{3,})/.exec(n);if(!e)return null;const t=e[2];return{character:t[0],length:t.length}}function Ca(n,e){const t=/^( {0,3})(`{3,}|~{3,})\s*$/.exec(n);if(!t)return!1;const r=t[2];return r[0]===e.character&&r.length>=e.length}function Sa(n){let e="",t=0,r=0;for(;r"u")return n;const e=document.createElement("template");e.innerHTML=n;for(const t of Array.from(e.content.querySelectorAll("*"))){if(xa.has(t.localName)){t.remove();continue}for(const r of Array.from(t.attributes)){const o=r.name.toLowerCase();if(o.startsWith("on")||o==="srcdoc"||o==="style"){t.removeAttribute(r.name);continue}const i=Na(t.localName,o,r.value);i===null?t.removeAttribute(r.name):typeof i=="string"&&i!==r.value&&t.setAttribute(r.name,i)}t.localName==="a"&&t.setAttribute("rel","noreferrer")}return e.innerHTML}function Na(n,e,t){const r=e.toLowerCase();if(ba.has(r))return null;if(r==="href")return n.toLowerCase()!=="a"?null:Oa(t)?t:null}function Oa(n){const e=n.trim();if(e.startsWith("#"))return!0;if(e.startsWith("/")||!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e))return!1;try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"||t.protocol==="mailto:"}catch{return!1}}function Go(n){return n.replace(/([\\[\]])/g,"\\$1")}function Xo(n){return encodeURI(n).replace(/([\\()])/g,"\\$1")}function Ta(n,e){const t=e.map(r=>`[${Go(r.label)}](${Xo(r.path)})`).join(" ");return t?n.trim().length>0?`${t} ${n}`:t:n}function $t(n){switch(n.kind){case"at":return Sn(n.label??n.name,n.path);case"agent":return Sn(`@${n.displayName||n.name}`,n.path);case"skill":return Sn(`$${n.name}`,n.path)}}function Da(n,e,t){if(!t||e==null)return n;const r=$t(e);return n.includes(r)||n.includes(e.path)?n:n.trim().length>0?`${r} @@ -39,4 +39,4 @@ ${Fr}`:Fr}function Aa(n){return n.includes("skill://plan")||/(?:^|\s)\$plan(?:\s `),i=/(^|\s)([@$][^\s@$]*)$/.exec(o);if(!i)return null;const s=i[2]??"",a=s.charAt(0),l=s.slice(1);return{anchorPos:t-s.length,kind:a==="$"?"skill":"mention",query:l}}function cu(n){return n==="ArrowDown"||n==="ArrowUp"||n==="Enter"||n==="Tab"||n==="Escape"}function Vn({dataAttributes:n,icon:e,iconNode:t,text:r,title:o}){const i=document.createElement("span");i.className="prompt-editor-mention group/inline-mention cursor-pointer inline-mention-brand-aware font-medium px-0.5 cursor-interaction",o&&(i.title=o);for(const[a,l]of Object.entries(n))i.setAttribute(a,l);if(e||t){const a=document.createElement("span");if(a.className="prompt-editor-mention-icon relative mr-[3px] inline-block h-[1lh] w-4 align-bottom",t)a.append(t);else if(e){const l=document.createElement("span");l.className="icon-xs absolute top-1/2 -translate-y-1/2",l.textContent=e,a.append(l)}i.append(a)}const s=document.createElement("span");return s.className="min-w-0 break-words",s.textContent=r,i.append(s),i}function du(){const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","icon-xs absolute top-1/2 -translate-y-1/2"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("viewBox","0 0 20 20"),n.setAttribute("fill","none"),n.setAttribute("aria-hidden","true");const e=document.createElementNS("http://www.w3.org/2000/svg","path");return e.setAttribute("d",Zo),e.setAttribute("fill","currentColor"),n.append(e),n}const f=rt.createElement,uu=20,pu={background:"linear-gradient(to bottom, var(--color-token-editor-background), transparent)"},fu={background:"linear-gradient(to top, var(--color-token-editor-background), transparent)"};function hu(n,e){"use no memo";const[t,r]=b.useState(null),[o,i]=b.useState(0),[s,a]=b.useState(null),l=b.useRef(null),c=b.useCallback(d=>{a(d)},[]);return b.useLayoutEffect(()=>{const d=s;if(!d)return;const u=()=>r(d.getBoundingClientRect().width);if(u(),typeof ResizeObserver>"u")return;const p=new ResizeObserver(u);return p.observe(d),()=>p.disconnect()},[s]),b.useLayoutEffect(()=>{const d=l.current;d&&i(d.getBoundingClientRect().width)},[n]),{inputMeasureRef:c,isSingleLine:fa({hasVisibleAttachments:e,isEditorMultiline:n.includes(` `),isVoiceLayoutActive:!1,singleLineInputWidth:t,singleLineTextWidth:o}),textMeasureRef:l}}function mu(n){"use no memo";const[e,t]=b.useState(()=>Yo(n)),r=b.useRef(null),o=b.useRef(new Map),i=b.useRef(new Map),s=b.useRef(new Map),a=b.useRef(n),l=b.useRef(e);a.current=n,l.current=e;const c=b.useCallback(()=>{const p=r.current;if(!p)return;const h=a.current.map(g=>{const k=(o.current.get(g.id)??null)?.offsetWidth??0;k>0&&(l.current[g.id]?.hideLabel===!0?s.current.set(g.id,k):i.current.set(g.id,k));const T=i.current.get(g.id)??s.current.get(g.id)??k,N=s.current.get(g.id),F=g.canHideLabel?Math.min(T,N??T):T;return{...g,compactWidth:F,expandedWidth:T,hasMeasuredCompactWidth:N!=null}}),m=ha({availableWidth:p.getBoundingClientRect().width,gap:$o(window.getComputedStyle(p).columnGap)??$o(window.getComputedStyle(p).gap)??0,items:h,previousState:l.current});ma(m,l.current)||t(m)},[]),d=b.useCallback(p=>{r.current=p,p&&c()},[c]),u=b.useCallback((p,h)=>{h?(o.current.set(p,h),c()):o.current.delete(p)},[c]);return b.useLayoutEffect(()=>{c()},[c,n,e]),b.useLayoutEffect(()=>{if(typeof ResizeObserver>"u")return;const p=new ResizeObserver(c);r.current&&p.observe(r.current);for(const h of o.current.values())p.observe(h);return()=>p.disconnect()},[c,n,e]),{state:e,setContainerRef:d,setItemRef:u}}function $o(n){const e=Number.parseFloat(n);return Number.isFinite(e)?e:null}function gu(n){const e=Et.c(3);let t,r;e[0]!==n?(t=()=>{_a(n)},r=[n],e[0]=n,e[1]=t,e[2]=r):(t=e[1],r=e[2]),b.useEffect(t,r)}function xu(n){const e=Et.c(3);let t,r;e[0]!==n?(t=()=>ra(o=>n({type:"event",event:o})),r=[n],e[0]=n,e[1]=t,e[2]=r):(t=e[1],r=e[2]),b.useEffect(t,r)}function bu(n,e){const t=Et.c(4);let r,o;t[0]!==e||t[1]!==n?(r=()=>{Ha(n,e)},o=[n,e],t[0]=e,t[1]=n,t[2]=r,t[3]=o):(r=t[2],o=t[3]),b.useEffect(r,o)}function yu(){const n=Et.c(3);let e;n[0]===Symbol.for("react.memo_cache_sentinel")?(e=Ba(),n[0]=e):e=n[0];const[t,r]=b.useReducer(Va,e);gu(r),xu(r),bu(t,r);let o;return n[1]!==t?(o=f(ku,{state:t,dispatch:r,renderer:"React"}),n[1]=t,n[2]=o):o=n[2],o}function ku({state:n,dispatch:e,renderer:t}){"use no memo";const r=n.providers.find(v=>v.id===n.selectedProviderId),o=ar(n),i=sr(n),s=Ka(n),[a,l]=b.useState([]),c=n.status==="running"&&(n.input.length>0||a.length>0),d=r?n.autoStartAttemptedProviderIds.includes(r.id):!1,u=i&&(r?.autoStart!==!0||d),p=r?.id==="codex",h=Ra(r),m=r?.id==="codex"?n.context?.copy.reasoningEffortHigh??"High":null,[g,x]=b.useState("default"),[k,T]=b.useState(null),N=Zu(n),F=k??N!=null,X=N!=null&&F,$=hu(n.input,a.length>0),S=$.isSingleLine,A=mu([{canHideLabel:m!=null,enabled:r!=null,id:"intelligence"},{canHideLabel:!0,enabled:X,id:"ide-context"}]),C=S?{hideControl:!1,hideLabel:!1}:A.state.intelligence??{hideControl:!1,hideLabel:!1},O=S?{hideControl:!1,hideLabel:!1}:A.state["ide-context"]??{hideControl:!1,hideLabel:!1},L=b.useRef(null),[I,B]=b.useState(null),[dt,pe]=b.useState(""),[As,xe]=b.useState(0),[yn,ce]=b.useState(!1),[Rs,fe]=b.useState(!1),[Mr,Nr]=b.useState(!1),[ut,Pt]=b.useState(!1),[Is,Or]=b.useState(!1),[Ls,be]=b.useState(!1),Ce=I?Cr(I,n,dt):[],kn=Ce.length===0?-1:Math.min(As,Ce.length-1),wn=()=>{const v=L.current?.getText()??n.input;if(!(n.status==="running"&&(v.length>0||a.length>0)))return;v!==n.input&&e({type:"setInput",input:v}),B(null),pe(""),ce(!1),fe(!1),be(!1);const pt=Da(Ea(v,ut),N?.mention??null,F),V=Ta(pt,a),vn=new Set(a.map(Cn=>Cn.id));Ja(n,e,{attachments:a,clearInput:v,displayText:v,permissionMode:p?g:"default",text:V}).then(Cn=>{Cn&&l(Ks=>Ks.filter(Zs=>!vn.has(Zs.id)))})},Tr=v=>{L.current?.insertMention(v.mention),B(null),pe(""),xe(0),fe(!1)},Dr=()=>{Pt(v=>!v),fe(!1),be(!1),ce(!1),B(null),L.current?.focus()},Ps=()=>{T(v=>!(v??N!=null)),fe(!1),be(!1),ce(!1),B(null),L.current?.focus()},zs=()=>{T(!1),fe(!1),be(!1),ce(!1),B(null),L.current?.focus()},Fs=()=>{Pt(!0),Or(!0),fe(!1),be(!1),ce(!1),B(null),L.current?.focus()},Bs=async()=>{if(Mr)return;const v=n.runningSessionId;Nr(!0),B(null),pe(""),xe(0),fe(!1),be(!1);try{const pt=((await qe("app.pickFiles")).files??[]).filter(V=>V.path.trim().length>0).map(V=>{const vn=V.label&&V.label.trim().length>0?V.label:jt(V.path);return{dataUrl:V.dataUrl,fsPath:V.fsPath??V.path,id:`${V.path}-${Date.now()}-${Math.random().toString(36).slice(2)}`,kind:V.isImage||V.dataUrl?.startsWith("data:image/")?"image":"file",label:vn,mimeType:V.mimeType,path:V.path}});l(V=>ap([...V,...pt])),L.current?.focus()}catch(W){v||e({type:"failed",message:At(W,n)})}finally{Nr(!1)}},Vs=v=>{if(!v){B(null),pe(""),xe(0);return}B(v.kind),pe(v.query),xe(0)},_s=v=>{if(!I)return!1;if(v==="Escape")return B(null),pe(""),xe(0),!0;if(Ce.length===0)return v==="Enter"||v==="Tab";if(v==="ArrowDown")return xe(W=>(W+1)%Ce.length),!0;if(v==="ArrowUp")return xe(W=>(W-1+Ce.length)%Ce.length),!0;if(v==="Enter"||v==="Tab"){const W=Ce[kn>=0?kn:0];return W&&Tr(W),!0}return!1},$s=v=>{qa(v,n,e),ce(!1)},Ws=C.hideControl?null:f("div",{className:"model-picker-root relative min-w-0",ref:v=>A.setItemRef("intelligence",v),onBlur:v=>{v.currentTarget.contains(v.relatedTarget)||ce(!1)}},f("button",{className:`model-picker ${ee} ${te} ${Oe} min-w-0 rounded-full`,type:"button",disabled:!o,"aria-haspopup":"menu","aria-expanded":yn,"data-state":yn?"open":"closed","data-codex-intelligence-trigger":!0,"data-selected-reasoning-effort":"high",onClick:()=>{o&&(fe(!1),be(!1),ce(v=>!v))},onKeyDown:v=>{v.key==="ArrowDown"&&(v.preventDefault(),ce(o))}},C.hideLabel?up("icon-2xs"):f("span",{className:"model-picker-content flex max-w-40 min-w-0 items-center gap-1.5"},f("span",{className:"model-display flex min-w-0 items-center gap-1 tabular-nums"},f("span",{className:"model-label truncate whitespace-nowrap text-token-foreground"},h)),m?f("span",{className:"composer-footer__label--sm shrink-0 text-token-description-foreground"},m):null),f("span",{className:"model-chevron composer-footer__secondary-chevron icon-2xs text-token-input-placeholder-foreground","aria-hidden":!0},gn())),yn?f("div",{className:"provider-dropdown _content_1hiti_1 no-drag bg-token-dropdown-background/90 text-token-foreground ring-token-border z-50 m-px flex select-none flex-col overflow-y-auto rounded-xl ring-[0.5px] px-1 py-1 shadow-xl-spread backdrop-blur-sm w-52",role:"menu","aria-label":n.context?.copy.provider??"","data-state":"open","data-side":"top",style:{"--radix-dropdown-menu-content-transform-origin":"left bottom"}},f("div",{className:"provider-dropdown-title"},n.context?.copy.provider??"Provider"),n.providers.map(v=>f("button",{key:v.id,className:"provider-dropdown-item no-drag group hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",type:"button",role:"menuitem","data-selected":v.id===n.selectedProviderId?"true":void 0,onMouseDown:W=>W.preventDefault(),onClick:()=>$s(v.id)},f("span",{className:"provider-dropdown-item-content flex w-full items-center gap-1.5"},f("span",{className:"min-w-0 flex-1 truncate"},v.displayName),v.id===n.selectedProviderId?f("span",{className:"provider-dropdown-check icon-xs shrink-0","aria-hidden":!0},Ze()):null)))):null),Hs=f(eu,{ref:L,className:S?"text-base":"text-base [&_.ProseMirror]:leading-5",minHeight:S?"1.25rem":"2.75rem",singleLine:S,value:n.input,ariaLabel:n.context?.copy.promptPlaceholder??"",placeholder:n.context?.copy.promptPlaceholder??"",onAutocompleteChange:Vs,onAutocompleteKeyDown:_s,onPlanModeShortcut:Dr,onTextChange:v=>e({type:"setInput",input:v}),onSubmit:wn,onTriggerToken:v=>{B(v==="@"?"mention":"skill"),pe(""),xe(0)}}),Er=(v=!1)=>p?f(qu,{copy:n.context?.copy,hideLabel:v,isEnabled:!0,isOpen:Ls,mode:g,onModeChange:x,onOpenChange:W=>{be(W),W&&(fe(!1),ce(!1),B(null))}}):null,Ar=f("div",{className:"codex-left-rail flex min-w-0 items-center gap-[5px]"},f(Uu,{hasIdeContext:N!=null,isAutoContextOn:F,isOpen:Rs,isPickingFiles:Mr,onOpenChange:v=>{fe(v),v&&(be(!1),ce(!1),B(null))},onPickFiles:()=>{Bs()},onToggleAutoContext:Ps,onTogglePlanMode:Dr,isPlanMode:ut,state:n}),S?null:Er(!1),!S&&ut?f(Wo,{icon:an("icon-xs"),label:n.context?.copy.skillPlan??"Plan",onClear:()=>Pt(!1)}):null),Rr=f("div",{className:"codex-secondary-controls flex min-w-0 items-center gap-1",ref:A.setContainerRef},Ws,X&&!O.hideControl?f("span",{className:"composer-context-indicator flex min-w-0 items-center gap-1",ref:v=>A.setItemRef("ide-context",v)},f("div",{className:"composer-context-divider h-4 w-px bg-token-border/70","aria-hidden":!0}),f(Hu,{hideLabel:O.hideLabel,label:n.context?.copy.ideContext??"IDE context",onClear:zs})):null),Ir=f("div",{className:"codex-action-cluster flex shrink-0 items-center gap-2"},u?f("button",{className:`codex-action codex-start ${ee} ${te} ${Oe} rounded-full`,type:"button",disabled:!i,onClick:()=>{$a(n,e)}},n.context?.copy.start??"Start"):null,s?f("button",{className:`codex-action codex-stop ${ee} ${te} ${Oe} ${Kt} rounded-full`,type:"button","aria-label":n.context?.copy.stop??"Stop",onClick:()=>{Ua(n,e)}},cp()):null,f("button",{className:`codex-action codex-mic ${ee} ${te} ${Oe} ${Kt} rounded-full`,type:"button",disabled:!0,"aria-label":n.context?.copy.voiceInput??""},dp()),f("button",{className:`codex-action send-button ${ia}${c?"":" cursor-default opacity-50"}`,type:"button",disabled:!c,"aria-label":n.context?.copy.send??"Send",onClick:wn},lp("icon-sm text-token-dropdown-background"))),qs=f("div",{className:"flex min-w-0 shrink-0 items-center justify-end gap-2"},Rr,Er(!0),S&&ut?f(Wo,{icon:an("icon-xs"),label:n.context?.copy.skillPlan??"Plan",onClear:()=>Pt(!1)}):null,Ir),Lr=f("div",{key:"composer-input",ref:$.inputMeasureRef,className:S?"min-w-0":"mb-1 flex-grow overflow-y-auto px-3"},Hs),Js=S?f("div",{className:da},Ar,Lr,qs):f("div",{className:"contents"},a.length>0?f("div",{className:"px-2 py-1.5"},f(zu,{attachments:a,copy:n.context?.copy,onRemove:v=>{l(W=>W.filter(pt=>pt.id!==v))}})):null,Lr,f("div",{className:ua},Ar,f("div",{className:"flex items-center"}),f("div",{className:"flex w-full min-w-0 items-center justify-end gap-2"},f("div",{className:"flex min-w-0 flex-1 justify-end"},Rr),f("div",{className:"flex shrink-0 items-center gap-2"},Ir)))),Us=f("div",{className:la},Js),js=!ut&&!Is&&/\bplan\b/i.test(n.input);return f("section",{className:"agent-shell","data-codex-window-type":"electron"},f(vu,{entries:n.transcript,copy:n.context?.copy}),f("div",{className:sa},f("div",{className:"relative flex w-full flex-col gap-2"},f("form",{className:"w-full min-w-0",onSubmit:v=>{v.preventDefault(),wn()}},f("div",{className:aa},f("span",{ref:$.textMeasureRef,className:"composer-single-line-measure text-size-chat pointer-events-none invisible absolute h-0 w-max max-w-none overflow-hidden whitespace-pre","aria-hidden":!0},n.input),js?f(wu,{copy:n.context?.copy,onAction:Fs,onDismiss:()=>Or(!0)}):null,I?f(Wu,{emptyLabel:n.context?.copy?.composerNoResults??"No results",highlightedIndex:kn,items:Ce,onChoose:Tr,onHighlight:xe,query:dt}):null,f("div",{className:ca+" "+(S?"overflow-visible rounded-full":"overflow-y-auto rounded-3xl")},Us)))),f(Bu,{state:n,providerDisplayName:r?.displayName??t})))}function wu({copy:n,onAction:e,onDismiss:t}){return f("div",{className:"above-composer-suggestion-shell pointer-events-none absolute inset-x-0 bottom-full z-20 mb-2 flex justify-center"},f("div",{className:"pointer-events-auto flex w-full max-w-full justify-center"},f("div",{className:"relative inline-flex max-w-full min-w-0 items-center justify-between gap-4 overflow-hidden rounded-3xl border border-token-border/80 bg-token-dropdown-background/90 py-1.5 pr-2 pl-3 text-token-foreground shadow-md backdrop-blur-sm","data-codex-above-composer-suggestion":"keyword-plan-mode"},f("div",{className:"flex min-w-0 flex-1 items-center gap-2"},f("span",{className:"flex items-center justify-center text-token-foreground","aria-hidden":!0},an("icon-xs shrink-0")),f("div",{className:"min-w-0 flex-1 flex items-center gap-2"},f("span",{className:"truncate text-sm font-medium leading-[18px] text-token-foreground"},n?.planSuggestionTitle??"Create a plan"),f("span",{className:"hidden leading-none text-sm text-token-description-foreground @[500px]:inline","aria-hidden":!0},f("span",{className:"pointer-events-none !h-auto rounded-md border border-token-border/80 px-1 py-0.5 text-xs !leading-none text-token-description-foreground"},n?.planSuggestionShortcut??"Shift + Tab")))),f("div",{className:"flex shrink-0 items-center gap-1"},f("button",{className:"user-select-none no-drag cursor-interaction flex h-8 items-center justify-center rounded-full border border-transparent bg-token-button-secondary-background px-2.5 text-sm text-token-button-secondary-foreground hover:bg-token-button-secondary-hover-background focus:outline-none",type:"button",onClick:r=>{r.stopPropagation(),e()}},n?.planSuggestionAction??"Use plan mode"),f("button",{className:"user-select-none no-drag flex size-[22px] shrink-0 cursor-interaction items-center justify-center rounded-full border border-transparent text-token-description-foreground hover:bg-token-list-hover-background focus:outline-none",type:"button","aria-label":n?.planSuggestionDismiss??"Dismiss suggestion",onClick:r=>{r.stopPropagation(),t()}},bn("icon-xs"))))))}const vu=rt.memo(function({entries:e,copy:t}){return f("div",{className:"agent-thread","data-empty":e.length===0?"true":void 0},e.map(r=>f(Cu,{copy:t,entry:r,key:r.id})))}),Cu=rt.memo(function({copy:e,entry:t}){switch(t.role){case"user":{const r=t.attachments??[],o=t.text.trim().length>0;return f("div",{className:"codex-user-turn group flex w-full flex-col items-end justify-end gap-1"},r.length>0?f(Lu,{attachments:r}):null,o?f("div",{className:"codex-user-bubble bg-token-foreground/5 max-w-[77%] min-w-0 overflow-hidden break-words rounded-2xl px-3 py-2 [&_.contain-inline-size]:[contain:initial]"},f(Ru,{copy:e,text:t.text})):null,o?f(Du,{copy:e,sentAtMs:t.sentAtMs,text:t.text}):null)}case"assistant":return t.isComplete===!1?f("div",{className:"codex-assistant-turn group flex min-w-0 flex-col"},f("div",{className:"codex-assistant-message codex-assistant-message-streaming text-size-chat leading-[calc(var(--codex-chat-font-size)+8px)]"},t.text)):f("div",{className:"codex-assistant-turn group flex min-w-0 flex-col"},f("div",{className:"codex-assistant-message text-size-chat leading-[calc(var(--codex-chat-font-size)+8px)] [&>*:last-child]:mb-0 [&>ol:first-child]:mt-0 [&>ul:first-child]:mt-0",dangerouslySetInnerHTML:{__html:ya(t.text)}}),t.text.trim().length>0?f(Eu,{copy:e,sentAtMs:t.sentAtMs,text:t.text}):null);case"notice":return f("div",{className:`codex-notice-turn ${t.tone??"warning"}`},f("div",{className:"codex-notice-content text-size-chat-sm",dangerouslySetInnerHTML:{__html:Be(t.text)}}));case"activity":return f(Su,{copy:e,entry:t})}});function Su({copy:n,entry:e}){"use no memo";const[t,r]=b.useState(!1),[o,i]=b.useState({bottom:!1,top:!1}),s=b.useRef(null),a=n?.copyOutput??"Copy output",l=n?.shellLabel??"",c=n?.copyShellContents??a,d=n?.copiedShellContents??c,u=n?.collapseShell??"",p=n?.shellSuccess??"",h=n?.stopped??"",m=n?.failedStatus??"",g=!!e.output,x=b.useCallback(()=>{r(C=>!C)},[]),k=b.useCallback(()=>{r(!1)},[]),T=b.useCallback(C=>{const O=C===null?{bottom:!1,top:!1}:{bottom:C.scrollTop+C.clientHeight1};i(L=>L.bottom===O.bottom&&L.top===O.top?L:O)},[]),N=b.useCallback(()=>{s.current?.mutation?.disconnect(),s.current?.resize?.disconnect(),s.current=null},[]),F=b.useCallback(C=>{if(N(),C===null){T(null);return}const O=()=>T(C);O();const L=typeof ResizeObserver>"u"?void 0:new ResizeObserver(O);L?.observe(C);const I=typeof MutationObserver>"u"?void 0:new MutationObserver(O);I?.observe(C,{characterData:!0,childList:!0,subtree:!0}),s.current={mutation:I,resize:L}},[N,T]),X=b.useCallback(C=>{T(C.currentTarget)},[T]),$=Nu(e),S=f(rt.Fragment,null,f("span",{className:"codex-tool-activity-icon icon-xs shrink-0","aria-hidden":!0},ea(e)),f("span",{className:"codex-tool-activity-text shrink overflow-hidden [mask-image:linear-gradient(to_right,black_calc(100%_-_0.25rem),transparent)] [mask-repeat:no-repeat] pr-1 group-hover/collapsed-tool-activity:text-token-foreground"},f("span",{className:"codex-tool-activity-action",dangerouslySetInnerHTML:{__html:Be(e.text)}}),e.detail?f("span",{className:"codex-tool-activity-detail",dangerouslySetInnerHTML:{__html:` ${Be(e.detail)}`}}):null)),A=g?f("button",{type:"button",className:"codex-tool-activity-summary group/collapsed-tool-activity group/summary inline-flex w-fit max-w-full cursor-interaction items-center gap-1 self-start text-left","aria-expanded":t,onClick:x},S,f("span",{className:`codex-tool-activity-chevron inline-chevron flex-shrink-0 text-token-input-placeholder-foreground opacity-0 group-hover/summary:opacity-100${t?" opacity-100":""}`},pp(`icon-2xs text-current transition-transform duration-300${t?" rotate-90":""}`))):f("div",{className:"codex-tool-activity-summary group/collapsed-tool-activity group/summary inline-flex w-fit max-w-full items-center gap-1 self-start text-left"},S);return f("div",{className:`codex-tool-activity-turn ${e.activityKind??"other"} ${e.activityStatus??"completed"}`},A,e.output?f("div",{"aria-hidden":!t,className:"codex-tool-activity-output-shell relative overflow-hidden","data-expanded":t?"true":"false"},f("div",{className:"codex-tool-activity-output-shell-inner"},f("div",{className:"codex-tool-activity-output-frame group/output relative pr-0 min-h-[1.25rem] flex flex-col overflow-clip rounded-lg border border-token-border"},f("div",{className:"codex-shell-header flex items-center justify-between bg-token-side-bar-background pl-2 text-sm font-medium text-ellipsis hover:bg-token-editor-background/40"},f("div",{className:"flex min-w-0 items-center"},f("span",{className:"truncate"},l)),f("div",{className:"flex items-center"},f(Ou,{copiedLabel:d,copyLabel:c,text:$}),f("button",{type:"button",className:`codex-shell-collapse ${ee} ${te} ${ln} rounded-full electron:rounded-md hover:bg-transparent hover:text-token-button-foreground`,"aria-label":u,title:u,onClick:k},gn("icon-2xs rotate-180")))),f("div",{className:"relative overflow-hidden"},f("div",{className:"codex-tool-activity-output vertical-scroll-fade-mask [--edge-fade-distance:2rem] box-border flex flex-col gap-1.5 overflow-x-auto overflow-y-auto whitespace-pre p-2 font-vscode-editor font-medium text-size-code-sm text-token-description-foreground max-h-[140px]",onScroll:X,ref:F,dangerouslySetInnerHTML:{__html:Be(e.output)}}),o.top?f("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-x-0 top-0 h-6",style:pu}):null,o.bottom?f("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-x-0 bottom-0 h-6",style:fu}):null),f(Mu,{failedLabel:m,status:e.activityStatus??"completed",stoppedLabel:h,successLabel:p}),f(Tu,{label:a,output:e.output})))):null)}function Mu({failedLabel:n,status:e,stoppedLabel:t,successLabel:r}){return e==="inProgress"?f("div",{className:"codex-shell-footer text-size-chat px-2.5 pt-0.5 pb-1"}):e==="stopped"?f("div",{className:"codex-shell-footer text-size-chat flex items-center gap-2 px-2.5 pt-0.5 pb-1 text-token-input-placeholder-foreground"},f("span",{className:"ml-auto"},t)):e==="failed"?f("div",{className:"codex-shell-footer text-size-chat flex items-center gap-2 px-2.5 pt-0.5 pb-1 text-token-input-placeholder-foreground"},f("span",{className:"ml-auto"},n)):f("div",{className:"codex-shell-footer text-size-chat flex items-center gap-2 px-2.5 pt-0.5 pb-1 text-token-input-placeholder-foreground"},f("span",{className:"ml-auto flex items-center gap-1"},Ze("icon-xxs"),r))}function Nu(n){const e=(n.detail??n.text).trim(),t=n.output?.trimEnd()??"";return[e,t].filter(r=>r.length>0).join(` -`)}function Ou({copiedLabel:n,copyLabel:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=r?n:e,a=b.useCallback(c=>{c!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),l=b.useCallback(c=>{c.stopPropagation(),navigator.clipboard?.writeText(t)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},2e3)},[t]);return f("button",{ref:a,type:"button",className:`codex-shell-copy ${ee} ${te} ${ln} rounded-full electron:rounded-md hover:bg-transparent hover:text-token-button-foreground`,"aria-label":s,title:s,onClick:l},r?Ze("icon-xxs"):xn("icon-xxs"))}function Tu({label:n,output:e}){"use no memo";const[t,r]=b.useState(!1),o=b.useRef(null),i=b.useCallback(a=>{a!==null||o.current===null||(window.clearTimeout(o.current),o.current=null)},[]),s=b.useCallback(a=>{a.stopPropagation(),navigator.clipboard?.writeText(e)?.catch(()=>{}),r(!0),o.current!==null&&window.clearTimeout(o.current),o.current=window.setTimeout(()=>{r(!1),o.current=null},2e3)},[e]);return f("button",{ref:i,type:"button",className:`codex-tool-output-copy ${ee} ${te} rounded-full electron:rounded-md electron:p-1 electron:[&>svg]:icon-sm flex items-center justify-center p-0.5 absolute top-0 right-2.5 opacity-0 transition-opacity duration-200 group-hover/output:opacity-100${t?" text-token-foreground opacity-100":""}`,"aria-label":n,title:n,onClick:s},t?Ze("icon-2xs"):xn("icon-2xs"))}function Du({copy:n,sentAtMs:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=n?.copyUserMessage??"",a=n?.copiedUserMessage??"",l=r?a:s,c=e==null?null:Os(e),d=b.useCallback(p=>{p!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),u=b.useCallback(()=>{const p=t.trim();if(!p)return;navigator.clipboard?.writeText(p)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},1500)},[t]);return f("div",{className:"codex-user-message-actions flex flex-row-reverse items-center gap-1"},f("div",{className:"mr-1 ms-1 flex items-center gap-2 opacity-0 group-focus-within:opacity-100 group-hover:opacity-100"},c==null?null:f("span",{className:"text-xs text-token-text-tertiary"},c),f("button",{ref:d,type:"button",className:`codex-user-message-action-button ${ee} ${te} ${ln} rounded-full electron:rounded-md`,"aria-label":l,title:l,onClick:u},r?Ze("icon-xs"):xn("icon-xs"))))}function Eu({copy:n,sentAtMs:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=n?.copyAssistantMessage??"",a=n?.copiedAssistantMessage??s,l=r?a:s,c=e==null?null:Os(e),d=b.useCallback(p=>{p!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),u=b.useCallback(()=>{const p=t.trim();if(!p)return;navigator.clipboard?.writeText(p)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},2e3)},[t]);return f("div",{className:"codex-assistant-message-actions mt-1.5 flex h-5 items-center justify-start gap-0.5 opacity-0 group-focus-within:opacity-100 group-hover:opacity-100"},f("button",{ref:d,type:"button",className:`codex-assistant-message-action-button ${ee} ${te} ${ln} rounded-full electron:rounded-md`,"aria-label":l,title:l,onClick:u},r?Ze("icon-xs"):xn("icon-xs")),c==null?null:f("span",{className:"ml-1.5 flex h-full items-center text-size-chat leading-5 text-token-input-placeholder-foreground"},c))}function Os(n,e=new Date){const t=new Date(n),r=Au(t,e);return r===0?new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit"}).format(t):r<0&&r>-7?new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit",weekday:"long"}).format(t):new Intl.DateTimeFormat(void 0,{day:"numeric",hour:"numeric",minute:"2-digit",month:"short"}).format(t)}function Au(n,e){const t=new Date(n.getFullYear(),n.getMonth(),n.getDate()),r=new Date(e.getFullYear(),e.getMonth(),e.getDate());return Math.round((t.getTime()-r.getTime())/864e5)}function Ru({copy:n,text:e}){"use no memo";const[t,r]=b.useState(!1),o=Iu(e),i=o&&!t,s=n?.showMore??"",a=n?.showLess??"",l=b.useCallback(()=>{r(c=>!c)},[]);return f("div",{className:"flex flex-col items-end gap-1"},f("div",{className:"codex-user-message-content text-size-chat relative w-full min-w-0 mb-px","data-collapsed":i?"true":void 0,dangerouslySetInnerHTML:{__html:Be(e)}}),o?f("button",{type:"button","aria-expanded":t,className:"codex-user-message-toggle text-size-chat mt-1.5 inline-flex cursor-interaction items-center gap-1 self-start text-token-description-foreground hover:text-token-foreground",onClick:l},f("span",null,t?a:s),gn(`icon-2xs${t?" rotate-180":""}`)):null)}function Iu(n){return n.split(/\r\n|\r|\n/).length>uu||n.length>1600}function Lu({attachments:n}){return f("div",{className:"codex-user-message-attachments flex max-w-[77%] flex-row-reverse flex-wrap items-center gap-1"},n.map(e=>f(Pu,{attachment:e,key:e.id})))}function Pu({attachment:n}){return n.kind==="image"&&n.dataUrl?f("div",{className:"user-message-image-attachment flex size-16 items-center justify-center rounded-lg border border-token-border",title:n.label},f("img",{alt:n.label,className:"h-full w-full rounded-md object-cover",referrerPolicy:"no-referrer",src:n.dataUrl})):f("div",{className:"user-message-file-attachment bg-token-dropdown-background border-token-border inline-flex max-w-[320px] items-center gap-1 rounded-full border px-2 py-1.5 text-sm",title:n.path},f("span",{className:"text-token-input-placeholder-foreground flex-shrink-0","aria-hidden":!0},Sr("icon-2xs")),f("span",{className:"flex max-w-full min-w-0 items-center gap-1"},f("span",{className:"truncate"},n.label)))}function zu({attachments:n,className:e,copy:t,onRemove:r}){return f("div",{className:`codex-attachment-tray w-full overflow-x-auto${e?` ${e}`:""}`,"data-composer-attachments-row":!0},f("div",{className:"codex-attachment-row flex min-w-max items-end gap-2"},n.map(o=>f(Fu,{attachment:o,copy:t,key:o.id,onRemove:r}))))}function Fu({attachment:n,copy:e,onRemove:t}){const r=`${e?.removeAttachment??"Remove attachment"} ${n.label}`,o=t?f("button",{className:"composer-attachment-remove",type:"button","aria-label":r,onClick:()=>t(n.id),onMouseDown:i=>i.preventDefault()},bn("icon-2xs")):null;return n.kind==="image"&&n.dataUrl?f("div",{className:"composer-attachment-image",title:n.label},f("img",{alt:"","aria-hidden":!0,src:n.dataUrl}),o):f("div",{className:"composer-attachment-file",title:n.path},f("span",{className:"composer-attachment-file-icon","aria-hidden":!0},Sr("icon-xs")),f("span",{className:"composer-attachment-file-label"},n.label),o)}function Bu(n){const e=Et.c(6),{state:t,providerDisplayName:r}=n,i=(t.context?.rateLimitRows??[]).map(La),s=t.context?.copy,[a,l]=b.useState(!1);if(i.length===0)return null;const c=s?.rateLimits??"Rate limits";let d;e[0]!==t?(d=ja(t),e[0]=t,e[1]=d):d=e[1];let u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=m=>{m.currentTarget.contains(m.relatedTarget)||l(!1)},e[2]=u):u=e[2];let p;e[3]===Symbol.for("react.memo_cache_sentinel")?(p=()=>l(Vu),e[3]=p):p=e[3];let h;return e[4]!==t?(h=(m,g)=>[g>0?f("span",{key:`${m.role}-separator`,className:"rate-limit-inline-separator","aria-hidden":!0},"•"):null,f(_u,{key:m.role,row:m,state:t})],e[4]=t,e[5]=h):h=e[5],f("div",{className:"rate-line codex-rate-limit-summary relative",role:"status","aria-label":`${r} ${d}`.trim(),onBlur:u},f("button",{className:"rate-limit-trigger rate-limit-trigger-inline flex min-w-0 items-center gap-1",type:"button","aria-expanded":a,onClick:p},f("span",{className:"rate-line-heading"},c),i.flatMap(h)),a?f("div",{className:"rate-limit-popover absolute bottom-[calc(100%+6px)] left-0 z-50 flex min-w-56 flex-col gap-1 rounded-xl border border-token-border bg-token-dropdown-background/95 px-3 py-2 text-sm shadow-xl-spread backdrop-blur-sm"},f("div",{className:"rate-limit-popover-title"},c),i.map(m=>f($u,{key:m.role,row:m,state:t}))):null)}function Vu(n){return!n}function _u({row:n,state:e}){const t=n,r=e.context?.copy,o=t.role==="primary"?r?.rateLimitPrimary??"Primary":r?.rateLimitSecondary??"Secondary",i=ti(t.windowDurationMins,o,{weekly:r?.rateLimitWeekly??"Weekly",monthly:r?.rateLimitMonthly??"Monthly",daysFormat:r?.rateLimitDaysFormat??"",hoursFormat:r?.rateLimitHoursFormat??"",minutesFormat:r?.rateLimitMinutesFormat??""}),s=ei(t.resetsAt);return f("span",{className:"rate-limit-inline-segment"},f("span",{className:"rate-limit-window"},i),f("span",{className:"rate-limit-percent"},Qo(t.remainingPercent)),s?f("span",{className:"rate-limit-reset"},`${r?.rateLimitResets??"resets"} ${s}`):null)}function $u({row:n,state:e}){const t=n,r=e.context?.copy,o=t.role==="primary"?r?.rateLimitPrimary??"Primary":r?.rateLimitSecondary??"Secondary",i=ti(t.windowDurationMins,o,{weekly:r?.rateLimitWeekly??"Weekly",monthly:r?.rateLimitMonthly??"Monthly",daysFormat:r?.rateLimitDaysFormat??"",hoursFormat:r?.rateLimitHoursFormat??"",minutesFormat:r?.rateLimitMinutesFormat??""}),s=ei(t.resetsAt);return f("div",{className:"rate-limit-popover-row"},f("span",{className:"rate-limit-window"},i),f("span",{className:"rate-limit-row-value"},f("span",{className:"rate-limit-percent"},Qo(t.remainingPercent)),s?f("span",{className:"rate-limit-reset"},`${r?.rateLimitResets??"resets"} ${s}`):null))}function Wu({emptyLabel:n,highlightedIndex:e,items:t,onChoose:r,onHighlight:o,query:i}){return f("div",{className:"codex-top-tray-shell absolute z-20"},f("div",{className:"codex-top-tray-panel","cmdk-root":"","data-cmdk-root":!0},f("div",{className:"codex-top-tray-list","cmdk-list":"","data-cmdk-list":!0},t.length===0?f("div",{className:"codex-top-tray-empty","cmdk-empty":"","data-cmdk-empty":!0,"data-command-menu-empty-state":"true"},n):t.map((s,a)=>{const l=s.detail?"codex-top-tray-label max-w-[60%] flex-none truncate":"codex-top-tray-label min-w-0 flex-1 truncate",c=sp(s.label,i),d=c.some(u=>!u.isMatch);return f("button",{key:s.id,className:"codex-top-tray-item",type:"button","aria-selected":a===e?"true":void 0,"cmdk-item":"","data-selected":a===e?"true":void 0,"data-list-navigation-item":!0,onMouseEnter:()=>o(a),onMouseDown:u=>u.preventDefault(),onClick:()=>r(s)},f("div",{className:"codex-top-tray-copy flex w-full items-center gap-2"},f("span",{className:"codex-top-tray-icon icon-xs shrink-0","aria-hidden":!0},s.icon),f("div",{className:l},c.map((u,p)=>f("span",{key:`${u.text}-${p}`,className:!u.isMatch&&d?"text-token-description-foreground":void 0},u.text))),s.detail?f("span",{className:"codex-top-tray-detail min-w-0 flex-1 truncate text-sm text-token-description-foreground"},s.detail):null))}))))}function Wo({icon:n,label:e,onClear:t}){return f("div",{className:"composer-mode-indicator flex min-w-0 items-center gap-1"},f("div",{className:"composer-mode-divider","aria-hidden":!0}),f("button",{className:`composer-mode-button group ${ee} ${te} ${Oe} rounded-full`,type:"button","aria-label":e,onClick:t},f("span",{className:"composer-mode-icon composer-mode-icon-default icon-xs shrink-0","aria-hidden":!0},n),f("span",{className:"composer-mode-icon composer-mode-icon-hover icon-xs shrink-0","aria-hidden":!0},bn("icon-xs")),f("span",{className:"composer-footer__label--sm composer-mode-label max-w-16 truncate"},e)))}function Hu({hideLabel:n,label:e,onClear:t}){return f("button",{className:`composer-context-button group ${ee} ${te} ${Oe} min-w-0 rounded-full`,type:"button","aria-label":e,title:e,onClick:t},f("span",{className:"composer-context-icon composer-context-icon-default icon-xs shrink-0","aria-hidden":!0},Es("icon-xs")),f("span",{className:"composer-context-icon composer-context-icon-hover icon-xs shrink-0","aria-hidden":!0},bn("icon-xs")),n?null:f("span",{className:"composer-footer__label--sm composer-context-label max-w-20 truncate"},e))}function qu({copy:n,hideLabel:e=!1,isEnabled:t,isOpen:r,mode:o,onModeChange:i,onOpenChange:s}){const a=n?.changePermissions??"Change permissions",l=Uo(n,o),c=t?["default","auto-review","full-access","custom"]:[],d=e?oa:Oe,u=h=>{i(h),s(!1)},p=t&&r;return f("div",{className:"permissions-root relative inline-flex",onBlur:h=>{t&&!h.currentTarget.contains(h.relatedTarget)&&s(!1)}},f("button",{className:`permissions-trigger ${ee} ${te} ${d} ${e?Kt:"min-w-0"} rounded-full`,type:"button","aria-label":a,"aria-haspopup":t?"menu":void 0,"aria-expanded":t?p:void 0,"aria-disabled":t?void 0:!0,"data-permission-mode":o,"data-state":p?"open":"closed",disabled:!t,onClick:()=>{t&&s(!p)},onKeyDown:h=>{t&&(h.key==="ArrowDown"&&(h.preventDefault(),s(!0)),h.key==="Escape"&&(h.preventDefault(),s(!1)))}},Ds(o,"icon-xs shrink-0"),e?null:f("span",{className:"permissions-trigger-label composer-footer__label--xs max-w-40 truncate whitespace-nowrap text-left"},l),t?f("span",{className:"permissions-trigger-chevron icon-2xs shrink-0","aria-hidden":!0},gn()):null),p?f("div",{className:"permissions-dropdown _content_1hiti_1 no-drag bg-token-dropdown-background/90 text-token-foreground ring-token-border z-50 m-px flex select-none flex-col overflow-y-auto rounded-xl ring-[0.5px] px-1 py-1 shadow-xl-spread backdrop-blur-sm",role:"menu","aria-label":a,"data-state":"open","data-side":"top",style:{"--radix-dropdown-menu-content-transform-origin":"left bottom"}},c.map(h=>f(Ju,{isSelected:h===o,key:h,label:Uo(n,h),mode:h,onSelect:()=>u(h)}))):null)}function Ju({isSelected:n,label:e,mode:t,onSelect:r}){return f("button",{className:"permissions-item no-drag group hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",type:"button",role:"menuitemradio","aria-checked":n,"data-permission-mode":t,"data-selected":n?"true":void 0,onMouseDown:o=>o.preventDefault(),onClick:r},f("span",{className:"permissions-item-icon icon-xs shrink-0","aria-hidden":!0},Ds(t,"icon-xs shrink-0")),f("span",{className:"permissions-item-label min-w-0 flex-1 truncate"},e),n?f("span",{className:"permissions-item-check icon-xs shrink-0","aria-hidden":!0},Ze()):null)}function Uu({hasIdeContext:n,isAutoContextOn:e,isOpen:t,isPickingFiles:r,isPlanMode:o,onOpenChange:i,onPickFiles:s,onToggleAutoContext:a,onTogglePlanMode:l,state:c}){const d=c.context?.copy,u=d?.addFilesAndMore??"Add files and more",p=d?.addPhotosAndFiles??"Add photos & files",m=Cr("skill",c,"").find(g=>g.id==="plan")??null;return f("div",{className:"add-context-root relative inline-flex",onBlur:g=>{g.currentTarget.contains(g.relatedTarget)||i(!1)}},f("button",{className:`codex-tool codex-tool-plus ${ee} ${te} ${Oe} ${Kt} rounded-full`,type:"button","aria-label":u,"aria-haspopup":"menu","aria-expanded":t,"data-state":t?"open":"closed",onClick:()=>i(!t),onKeyDown:g=>{g.key==="ArrowDown"&&(g.preventDefault(),i(!0)),g.key==="Escape"&&(g.preventDefault(),i(!1))}},fp()),t?f("div",{className:"add-context-dropdown _content_1hiti_1 no-drag bg-token-dropdown-background/90 text-token-foreground ring-token-border z-50 m-px flex select-none flex-col overflow-y-auto rounded-xl ring-[0.5px] px-1 py-1 shadow-xl-spread backdrop-blur-sm",role:"menu","aria-label":u,"data-state":"open","data-side":"top",style:{"--radix-dropdown-menu-content-transform-origin":"left bottom"}},f(ju,{disabled:r,icon:Sr("icon-xs"),label:p,onSelect:s}),n||m?f(Ku):null,n?f(Ho,{checked:e,icon:Es("icon-sm"),label:d?.includeIdeContext??"Include IDE context",onSelect:a}):null,m?f(Ho,{checked:o,icon:an(),label:d?.planMode??"Plan mode",onSelect:l}):null):null)}function ju({detail:n,disabled:e=!1,icon:t,label:r,onSelect:o}){return f("button",{className:"add-context-item group no-drag hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",disabled:e,type:"button",role:"menuitem",onMouseDown:i=>i.preventDefault(),onClick:e?void 0:o},f("span",{className:"add-context-item-icon icon-xs shrink-0","aria-hidden":!0},t),f("span",{className:"add-context-item-copy flex min-w-0 flex-1 items-center gap-2"},f("span",{className:"add-context-item-label min-w-0 truncate"},r),n?f("span",{className:"add-context-item-detail min-w-0 flex-1 truncate text-token-description-foreground"},n):null))}function Ho({checked:n,icon:e,label:t,onSelect:r}){const o=n?"checked":"unchecked",i=n?"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-token-charts-blue transition-colors duration-200 ease-out":"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-token-foreground/10 transition-colors duration-200 ease-out";return f("button",{className:"add-context-item group no-drag hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",type:"button",role:"menuitemcheckbox","aria-checked":n,onMouseDown:s=>s.preventDefault(),onClick:r},f("span",{className:"add-context-item-icon icon-xs shrink-0","aria-hidden":!0},e),f("span",{className:"add-context-switch-row flex w-full min-w-0 items-center justify-between gap-2"},f("span",{className:"flex min-w-0 items-center gap-2"},f("span",{className:"add-context-item-label min-w-0 truncate"},t)),f("span",{className:i,"data-state":o,"aria-hidden":!0},f("span",{className:"h-3 w-3 rounded-full border border-[color:var(--gray-0)] bg-[color:var(--gray-0)] shadow-sm transition-transform duration-200 ease-out data-[state=unchecked]:translate-x-[2px] data-[state=checked]:translate-x-[14px]","data-state":o}))))}function Ku(){return f("div",{className:"add-context-separator w-full px-[var(--padding-row-x)] py-1",role:"separator"},f("div",{className:"add-context-separator-line h-[1px] w-full bg-token-menu-border"}))}function Zu(n){return Cr("mention",n,"").find(e=>e.id==="workspace")??null}function Cr(n,e,t){const r=e.context?.copy,o=n==="mention"?[...e.context?.workingDirectory?[{id:"workspace",icon:hp("icon-xs"),label:r?.mentionCurrentWorkspace??"Current workspace",detail:jt(e.context.workingDirectory),mention:{kind:"at",label:jt(e.context.workingDirectory),name:jt(e.context.workingDirectory),path:e.context.workingDirectory,fsPath:e.context.workingDirectory}}]:[],...e.providers.map(i=>({id:i.id,icon:Ia(i),label:i.displayName,detail:i.executableName,mention:{kind:"agent",label:i.displayName,name:i.id,displayName:i.displayName,path:`provider://${i.id}`,description:i.executableName}}))]:[{id:"plan",icon:"$",label:r?.skillPlan??"Plan",detail:"$plan",mention:{kind:"skill",label:"Plan",name:"plan",displayName:"Plan",path:"skill://plan"}},{id:"review",icon:"$",label:r?.skillCodeReview??"Code review",detail:"$codex-review",mention:{kind:"skill",label:"Code review",name:"codex-review",displayName:"Code review",path:"skill://codex-review"}},{id:"research",icon:"$",label:r?.skillResearch??"Research",detail:"$research",mention:{kind:"skill",label:"Research",name:"research",displayName:"Research",path:"skill://research"}}];return Yu(o,t)}function Yu(n,e){const t=e.trim();return t?n.map(r=>({item:r,score:ip(r.label,t,[r.detail,r.mention.name])})).filter(({score:r})=>r>0).sort((r,o)=>o.score-r.score).map(({item:r})=>r):n}const qo=1,Gu=.9,Xu=.8,Qu=.17,_n=.1,$n=.999,ep=.9999,tp=.99,np=/[\\/_+.#"@[({&]/,rp=/[\\/_+.#"@[({&]/g,op=/[\s-]/,Ts=/[\s-]/g;function ip(n,e,t){const r=t.length>0?`${n} ${t.join(" ")}`:n;return ir(r,e,Jo(r),Jo(e),0,0,{})}function Jo(n){return n.toLowerCase().replace(Ts," ")}function ir(n,e,t,r,o,i,s){if(i===e.length)return o===n.length?qo:tp;const a=`${o},${i}`;if(s[a]!==void 0)return s[a];const l=r.charAt(i);let c=t.indexOf(l,o),d=0;for(;c>=0;){let u=ir(n,e,t,r,c+1,i+1,s);if(u>d){if(c===o)u*=qo;else if(np.test(n.charAt(c-1))){u*=Xu;const p=n.slice(o,c-1).match(rp);p&&o>0&&(u*=$n**p.length)}else if(op.test(n.charAt(c-1))){u*=Gu;const p=n.slice(o,c-1).match(Ts);p&&o>0&&(u*=$n**p.length)}else u*=Qu,o>0&&(u*=$n**(c-o));n.charAt(c)!==e.charAt(i)&&(u*=ep)}if(u<_n&&t.charAt(c-1)===r.charAt(i+1)||r.charAt(i+1)===r.charAt(i)&&t.charAt(c-1)!==r.charAt(i)){const p=ir(n,e,t,r,c+1,i+2,s);p*_n>u&&(u=p*_n)}u>d&&(d=u),c=t.indexOf(l,c+1)}return s[a]=d,d}function sp(n,e){const t=Array.from(n),r=e.trim();if(!r)return t.map(l=>({isMatch:!0,text:l}));const o=t.map(l=>l.toLowerCase()),i=Array.from(r.toLowerCase());let s=-1;for(let l=0;l<=o.length-i.length;l+=1)if(i.every((c,d)=>o[l+d]===c)){s=l;break}if(s>=0){const l=s+i.length;return t.map((c,d)=>({isMatch:d>=s&&d{const c=a{const r=`${t.kind}:${t.path}`;return e.has(r)?!1:(e.add(r),!0)})}function lp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M9.33467 16.6663V4.93978L4.6374 9.63704L4.1667 9.16634L3.69599 8.69661L9.52998 2.86263L9.63447 2.77767C9.8925 2.60753 10.2433 2.63564 10.4704 2.86263L16.3034 8.69661L16.3884 8.80111C16.5588 9.05922 16.5306 9.40982 16.3034 9.63704C16.0762 9.86414 15.7255 9.89242 15.4675 9.722L15.363 9.63704L10.6647 4.9388V16.6663C10.6647 17.0336 10.367 17.3314 9.99971 17.3314C9.63259 17.3312 9.33467 17.0335 9.33467 16.6663ZM4.6374 9.63704C4.3777 9.89674 3.95569 9.89674 3.69599 9.63704C3.43657 9.37744 3.43668 8.95628 3.69599 8.69661L4.6374 9.63704Z",fill:"currentColor"}))}function cp(){return f("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":!0},f("rect",{x:"4.75",y:"4.75",width:"6.5",height:"6.5",rx:"1",fill:"currentColor"}))}function dp(){return f("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":!0},f("path",{d:"M8 2.25a2 2 0 0 0-2 2v3.25a2 2 0 1 0 4 0V4.25a2 2 0 0 0-2-2ZM4 7.5a4 4 0 0 0 8 0M8 11.5v2.25",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}))}function up(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M10 5.14295V14.8441M10 5.14295C10 1.98209 14.8475 1.94468 14.8475 5.07797L14.8473 5.1067C17.1367 5.43539 18.0436 7.54498 16.4225 9.14006C17.8633 10.5577 17.3503 13.9054 15.4449 14.6301C14.8475 17.6527 10.8056 18.4821 10 14.8441M10 5.14295C10 1.98209 5.15249 1.94468 5.15249 5.07797L5.15265 5.1067C2.86325 5.43539 1.95642 7.54498 3.57746 9.14006C2.13674 10.5577 2.64974 13.9054 4.5551 14.6301C5.15249 17.6527 9.19444 18.4821 10 14.8441",stroke:"currentColor",strokeLinejoin:"round",strokeWidth:"1.33"}))}function gn(n="icon-2xs"){return f("svg",{className:n,width:"20",height:"21",viewBox:"0 0 20 21",fill:"none","aria-hidden":!0},f("path",{d:"M15.2793 7.71101C15.539 7.45131 15.961 7.45131 16.2207 7.71101C16.4804 7.97071 16.4804 8.39272 16.2207 8.65242L10.4707 14.4024C10.211 14.6621 9.78902 14.6621 9.52932 14.4024L3.77932 8.65242L3.69436 8.54792C3.52385 8.28979 3.55205 7.93828 3.77932 7.71101C4.00659 7.48374 4.3581 7.45554 4.61623 7.62605L4.72073 7.71101L10 12.9903L15.2793 7.71101Z",fill:"currentColor",stroke:"currentColor",strokeWidth:"0.6"}))}function pp(n="icon-2xs"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M7.52925 3.7793C7.75652 3.55203 8.10803 3.52383 8.36616 3.69434L8.47065 3.7793L14.2207 9.5293C14.4804 9.789 14.4804 10.211 14.2207 10.4707L8.47065 16.2207C8.21095 16.4804 7.78895 16.4804 7.52925 16.2207C7.26955 15.961 7.26955 15.539 7.52925 15.2793L12.8085 10L7.52925 4.7207L7.44429 4.61621C7.27378 4.35808 7.30198 4.00657 7.52925 3.7793Z",fill:"currentColor"}))}function xn(n="icon-sm"){return f("svg",{className:n,width:"21",height:"21",viewBox:"0 0 21 21",fill:"none","aria-hidden":!0},f("path",{d:"M13.468 11.1216C13.468 10.4107 13.468 9.91717 13.4367 9.53369C13.4137 9.25191 13.3758 9.0622 13.3244 8.91846L13.2687 8.78858C13.1148 8.48652 12.8803 8.23344 12.593 8.05713L12.466 7.98584C12.308 7.90546 12.0963 7.84854 11.7209 7.81787C11.3374 7.78656 10.8439 7.78662 10.133 7.78662H7.29999C6.58895 7.78662 6.09562 7.78654 5.7121 7.81787C5.43015 7.84091 5.24064 7.87872 5.09686 7.93018L4.96698 7.98584C4.66487 8.13977 4.41184 8.37419 4.23554 8.66162L4.16522 8.78858C4.08477 8.94657 4.02794 9.15811 3.99725 9.53369C3.96594 9.91718 3.96503 10.4107 3.96503 11.1216V13.9546C3.96503 14.6656 3.96592 15.159 3.99725 15.5425C4.02796 15.9182 4.08471 16.1296 4.16522 16.2876L4.23554 16.4136C4.41185 16.7012 4.66472 16.9353 4.96698 17.0894L5.09686 17.146C5.24061 17.1974 5.43024 17.2343 5.7121 17.2573C6.09562 17.2887 6.58895 17.2896 7.29999 17.2896H10.133C10.8439 17.2896 11.3374 17.2886 11.7209 17.2573C12.0965 17.2266 12.308 17.1698 12.466 17.0894L12.593 17.019C12.8804 16.8427 13.1148 16.5897 13.2687 16.2876L13.3244 16.1577C13.3759 16.0139 13.4137 15.8244 13.4367 15.5425C13.468 15.159 13.468 14.6656 13.468 13.9546V11.1216ZM14.798 13.1196C15.2528 13.118 15.6011 13.1147 15.8879 13.0913C16.2634 13.0606 16.475 13.0038 16.633 12.9233L16.759 12.8521C17.0466 12.6757 17.2808 12.4228 17.4348 12.1206L17.4914 11.9907C17.5428 11.847 17.5797 11.6572 17.6027 11.3755C17.634 10.992 17.6349 10.4985 17.6349 9.7876V6.95459C17.6349 6.24355 17.6341 5.75022 17.6027 5.3667C17.5797 5.08484 17.5428 4.89522 17.4914 4.75147L17.4348 4.62158C17.2807 4.31933 17.0466 4.06645 16.759 3.89014L16.633 3.81982C16.475 3.73932 16.2636 3.68256 15.8879 3.65186C15.5044 3.62052 15.011 3.61963 14.3 3.61963H11.467C10.7561 3.61963 10.2626 3.62054 9.87909 3.65186C9.59738 3.67487 9.40759 3.71179 9.26386 3.76318L9.13397 3.81982C8.83175 3.97382 8.57885 4.20802 8.40253 4.49561L8.33124 4.62158C8.25079 4.77957 8.19396 4.99114 8.16327 5.3667C8.13984 5.65352 8.13561 6.00178 8.13397 6.45654H10.133C10.822 6.45654 11.3791 6.4559 11.8293 6.49268C12.2873 6.5301 12.6937 6.6093 13.0705 6.80127L13.2883 6.92334C13.7839 7.22739 14.1878 7.66313 14.4533 8.18408L14.5197 8.32666C14.6642 8.66318 14.7291 9.02433 14.7619 9.42529C14.7987 9.8755 14.798 10.4326 14.798 11.1216V13.1196ZM18.965 9.7876C18.965 10.4766 18.9657 11.0337 18.9289 11.4839C18.8961 11.8848 18.8311 12.246 18.6867 12.5825L18.6203 12.7251C18.3548 13.246 17.9509 13.6818 17.4553 13.9858L17.2365 14.1079C16.8599 14.2998 16.4541 14.3791 15.9963 14.4165C15.6592 14.444 15.2624 14.4481 14.7951 14.4497C14.7935 14.917 14.7894 15.3138 14.7619 15.6509C14.7292 16.0516 14.664 16.4122 14.5197 16.7485L14.4533 16.8911C14.1878 17.4122 13.7841 17.8487 13.2883 18.1528L13.0705 18.2749C12.6937 18.4669 12.2873 18.5461 11.8293 18.5835C11.3791 18.6203 10.822 18.6196 10.133 18.6196H7.29999C6.6109 18.6196 6.05394 18.6203 5.6037 18.5835C5.20305 18.5508 4.84233 18.4855 4.50604 18.3413L4.36347 18.2749C3.84243 18.0094 3.40584 17.6056 3.10175 17.1099L2.97968 16.8911C2.78787 16.5145 2.70849 16.1087 2.67108 15.6509C2.6343 15.2006 2.63495 14.6437 2.63495 13.9546V11.1216C2.63495 10.4326 2.63431 9.8755 2.67108 9.42529C2.7085 8.96729 2.78771 8.56084 2.97968 8.18408L3.10175 7.96631C3.40585 7.47049 3.84235 7.06679 4.36347 6.80127L4.50604 6.73486C4.84236 6.59059 5.20302 6.52542 5.6037 6.49268C5.9405 6.46516 6.33707 6.4601 6.80389 6.4585C6.8055 5.99167 6.81056 5.5951 6.83807 5.2583C6.87549 4.80047 6.95482 4.39471 7.14667 4.01807L7.26874 3.79932C7.5728 3.30371 8.00855 2.89973 8.52948 2.63428L8.67206 2.56787C9.00854 2.42345 9.36978 2.35844 9.77069 2.32568C10.2209 2.28891 10.778 2.28955 11.467 2.28955H14.3C14.9891 2.28955 15.546 2.2889 15.9963 2.32568C16.4541 2.3631 16.8599 2.44247 17.2365 2.63428L17.4553 2.75635C17.951 3.06044 18.3548 3.49703 18.6203 4.01807L18.6867 4.16065C18.8309 4.49694 18.8962 4.85765 18.9289 5.2583C18.9657 5.70854 18.965 6.2655 18.965 6.95459V9.7876Z",fill:"currentColor"}))}function Ze(n){return f("svg",{className:n,width:"17",height:"17",viewBox:"0 0 17 17",fill:"none","aria-hidden":!0},f("path",{d:"M12.8961 3.64101C13.1297 3.41418 13.4984 3.37523 13.7779 3.56581C14.0571 3.75635 14.1554 4.11331 14.0299 4.41347L13.9615 4.53847L7.71151 13.7045C7.59411 13.8767 7.4063 13.9877 7.19881 14.0072C6.99136 14.0267 6.78564 13.9533 6.63826 13.806L2.88826 10.056L2.79842 9.9457C2.6192 9.67407 2.64927 9.30496 2.88826 9.06581C3.12738 8.82669 3.49647 8.79676 3.76815 8.97597L3.8785 9.06581L7.03084 12.2182L12.8053 3.74941L12.8961 3.64101Z",fill:"currentColor"}))}function bn(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M5.96967 5.96967C6.26256 5.67678 6.73744 5.67678 7.03033 5.96967L10 8.93934L12.9697 5.96967C13.2626 5.67678 13.7374 5.67678 14.0303 5.96967C14.3232 6.26256 14.3232 6.73744 14.0303 7.03033L11.0607 10L14.0303 12.9697C14.3232 13.2626 14.3232 13.7374 14.0303 14.0303C13.7374 14.3232 13.2626 14.3232 12.9697 14.0303L10 11.0607L7.03033 14.0303C6.73744 14.3232 6.26256 14.3232 5.96967 14.0303C5.67678 13.7374 5.67678 13.2626 5.96967 12.9697L8.93934 10L5.96967 7.03033C5.67678 6.73744 5.67678 6.26256 5.96967 5.96967Z",fill:"currentColor"}))}function fp(){return f("svg",{className:"icon-sm",width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M9.33496 16.5V10.665H3.5C3.13273 10.665 2.83496 10.3673 2.83496 10C2.83496 9.63273 3.13273 9.33496 3.5 9.33496H9.33496V3.5C9.33496 3.13273 9.63273 2.83496 10 2.83496C10.3673 2.83496 10.665 3.13273 10.665 3.5V9.33496H16.5L16.6338 9.34863C16.9369 9.41057 17.165 9.67857 17.165 10C17.165 10.3214 16.9369 10.5894 16.6338 10.6514L16.5 10.665H10.665V16.5C10.665 16.8673 10.3673 17.165 10 17.165C9.63273 17.165 9.33496 16.8673 9.33496 16.5Z",fill:"currentColor"}))}function Sr(n="icon-sm"){return f("svg",{className:n,width:"21",height:"21",viewBox:"0 0 21 21",fill:"none","aria-hidden":!0},f("path",{d:"M4.43945 12.8041V7.68261C4.43945 7.30642 4.74446 7.00141 5.12066 7.00141C5.49685 7.00141 5.80186 7.30642 5.80186 7.68261V12.8041C5.80186 15.2565 7.78984 17.2445 10.2422 17.2445C12.6945 17.2445 14.6825 15.2565 14.6825 12.8041V5.9751C14.6823 4.46587 13.4589 3.24247 11.9497 3.24229C10.4403 3.24229 9.21606 4.46576 9.21588 5.9751V12.8041C9.21588 13.3708 9.67553 13.8304 10.2422 13.8304C10.8088 13.8304 11.2685 13.3708 11.2685 12.8041V7.68261C11.2685 7.30642 11.5735 7.00141 11.9497 7.00141C12.3257 7.00159 12.6309 7.30653 12.6309 7.68261V12.8041C12.6309 14.1232 11.5612 15.1929 10.2422 15.1929C8.92314 15.1929 7.85347 14.1232 7.85347 12.8041V5.9751C7.85365 3.71337 9.68791 1.87988 11.9497 1.87988C14.2113 1.88006 16.0447 3.71348 16.0449 5.9751V12.8041C16.0449 16.0089 13.4469 18.6069 10.2422 18.6069C7.03745 18.6069 4.43945 16.0089 4.43945 12.8041Z",fill:"currentColor"}))}function hp(n="icon-sm"){return f("svg",{className:n,width:20,height:20,viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:Zo,fill:"currentColor"}))}function an(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M5.69336 11.0557C7.05891 11.1944 8.12484 12.3479 8.125 13.75L8.11035 14.0273C7.97144 15.3928 6.81814 16.459 5.41602 16.459L5.13965 16.4443C3.86514 16.3149 2.85128 15.3018 2.72168 14.0273L2.70801 13.75C2.70818 12.2546 3.92061 11.0423 5.41602 11.042L5.69336 11.0557ZM5.41602 12.3721C4.65515 12.3724 4.03826 12.9891 4.03809 13.75C4.03826 14.5109 4.65515 15.1286 5.41602 15.1289C6.17714 15.1289 6.79475 14.5111 6.79492 13.75C6.79475 12.9889 6.17714 12.3721 5.41602 12.3721Z",fill:"currentColor"}),f("path",{d:"M16.8008 13.0986C17.1036 13.1608 17.3311 13.4288 17.3311 13.75C17.3311 14.0712 17.1036 14.3392 16.8008 14.4014L16.666 14.415H10.833C10.4659 14.4149 10.168 14.1172 10.168 13.75C10.168 13.3828 10.4659 13.0851 10.833 13.085H16.666L16.8008 13.0986Z",fill:"currentColor"}),f("path",{d:"M16.8008 5.59863C17.1036 5.66081 17.3311 5.92879 17.3311 6.25C17.3311 6.57121 17.1036 6.83919 16.8008 6.90137L16.666 6.91504H10.833C10.4659 6.91491 10.168 6.61719 10.168 6.25C10.168 5.88281 10.4659 5.58509 10.833 5.58496H16.666L16.8008 5.59863Z",fill:"currentColor"}),f("path",{d:"M7.13311 3.76578C7.35346 3.47216 7.771 3.4128 8.06475 3.63297C8.35843 3.85336 8.41789 4.27084 8.19757 4.56461L5.19757 8.56461C5.0819 8.71866 4.90439 8.81462 4.71221 8.82828C4.5201 8.84178 4.33083 8.77209 4.19464 8.6359L2.69464 7.1359C2.43512 6.87623 2.43512 6.45415 2.69464 6.19449C2.95429 5.93484 3.37633 5.93493 3.63604 6.19449L4.59307 7.15152L7.13311 3.76578Z",fill:"currentColor"}))}function mp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M12.6683 4.16699C12.6683 3.84391 12.4065 3.58203 12.0834 3.58203C11.7603 3.58203 11.4984 3.84391 11.4984 4.16699V7.91699L11.4847 8.05078C11.4227 8.35375 11.1547 8.58203 10.8334 8.58203C10.4662 8.58203 10.1685 8.28411 10.1683 7.91699V3.75C10.1683 3.42691 9.90646 3.16504 9.58337 3.16504C9.26029 3.16504 8.99841 3.42691 8.99841 3.75V7.91699C8.99824 8.28411 8.70053 8.58203 8.33337 8.58203C7.96621 8.58203 7.66851 8.28411 7.66833 7.91699V5C7.66833 4.67691 7.40646 4.41504 7.08337 4.41504C6.76029 4.41504 6.49841 4.67691 6.49841 5V9.30371C6.53326 9.3429 6.56715 9.38359 6.59998 9.42578L8.02478 11.2588C8.25005 11.5486 8.19821 11.9659 7.90857 12.1914C7.6187 12.4169 7.20048 12.365 6.97498 12.0752L5.55017 10.2432C5.15812 9.7391 4.41813 9.73637 4.01501 10.1924C4.04396 10.426 4.11486 10.8323 4.25525 11.3486C4.44664 12.0525 4.75404 12.9113 5.21619 13.7383C6.14103 15.3931 7.62465 16.835 10.0004 16.835C12.8545 16.8348 15.1682 14.5211 15.1683 11.667V6.25C15.1683 5.92691 14.9065 5.66504 14.5834 5.66504C14.2603 5.66504 13.9984 5.92691 13.9984 6.25V9.16699C13.9982 9.53411 13.7005 9.83203 13.3334 9.83203C12.9662 9.83203 12.6685 9.53411 12.6683 9.16699V4.16699ZM13.9984 4.42578C14.1828 4.36671 14.3794 4.33496 14.5834 4.33496C15.641 4.33496 16.4984 5.19237 16.4984 6.25V11.667C16.4982 15.2557 13.589 18.1649 10.0004 18.165C6.95953 18.165 5.10939 16.2734 4.05505 14.3867C3.52774 13.4431 3.1843 12.4787 2.97205 11.6982C2.76447 10.9349 2.66834 10.2954 2.66833 10C2.66833 9.87959 2.70117 9.76148 2.76306 9.6582C3.28988 8.78018 4.26555 8.40372 5.16833 8.56152V5C5.16833 3.94237 6.02575 3.08496 7.08337 3.08496C7.31706 3.08496 7.54039 3.12845 7.74744 3.20508C7.98218 2.41297 8.7151 1.83496 9.58337 1.83496C10.1836 1.83496 10.7186 2.11176 11.0697 2.54395C11.3639 2.35978 11.7107 2.25195 12.0834 2.25195C13.141 2.25195 13.9984 3.10937 13.9984 4.16699V4.42578Z",fill:"currentColor"}))}function gp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.06543 1.95123C9.66107 1.69076 10.3389 1.69071 10.9346 1.95123L15.9346 4.13873C16.7832 4.51008 17.3311 5.34917 17.3311 6.27545V10.5528C17.3309 14.6017 14.0489 17.8847 10 17.8848C5.95108 17.8846 2.66813 14.6017 2.66797 10.5528V6.27545C2.66797 5.34924 3.21695 4.51012 4.06543 4.13873L9.06543 1.95123ZM10.4014 3.16998C10.1456 3.05814 9.85444 3.05819 9.59863 3.16998L4.59863 5.35748C4.23427 5.51708 3.99805 5.87764 3.99805 6.27545V10.5528C3.99821 13.8671 6.68563 16.5546 10 16.5547C13.3144 16.5546 16.0008 13.8671 16.001 10.5528V6.27545C16.001 5.87756 15.7658 5.51703 15.4014 5.35748L10.4014 3.16998Z",fill:"currentColor"}),f("path",{d:"M13.4678 11.4318L13.333 11.4182H10.833C10.466 11.4183 10.1682 11.7162 10.168 12.0832C10.168 12.4504 10.4659 12.7481 10.833 12.7482H13.333L13.4678 12.7346C13.7706 12.6724 13.9981 12.4044 13.9981 12.0832C13.9979 11.7621 13.7706 11.494 13.4678 11.4318Z",fill:"currentColor"}),f("path",{d:"M7.65336 12.426C7.46431 12.7406 7.05607 12.8424 6.74125 12.6535C6.42646 12.4646 6.32395 12.0563 6.51274 11.7414L7.55668 10.0002L6.51274 8.25899C6.32395 7.94412 6.42646 7.53583 6.74125 7.34688C7.05607 7.15799 7.46431 7.25975 7.65336 7.57442L8.90336 9.6584C9.0296 9.86893 9.0296 10.1315 8.90336 10.342L7.65336 12.426Z",fill:"currentColor"}))}function xp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.06543 1.95123C9.66107 1.69076 10.3389 1.69071 10.9346 1.95123L15.9346 4.13873C16.7832 4.51008 17.3311 5.34917 17.3311 6.27545V10.5528C17.3309 14.6017 14.0489 17.8847 10 17.8848C5.95108 17.8846 2.66813 14.6017 2.66797 10.5528V6.27545C2.66797 5.34924 3.21695 4.51012 4.06543 4.13873L9.06543 1.95123ZM10.4014 3.16998C10.1456 3.05814 9.85444 3.05819 9.59863 3.16998L4.59863 5.35748C4.23427 5.51708 3.99805 5.87764 3.99805 6.27545V10.5528C3.99821 13.8671 6.68563 16.5546 10 16.5547C13.3144 16.5546 16.0008 13.8671 16.001 10.5528V6.27545C16.001 5.87756 15.7658 5.51703 15.4014 5.35748L10.4014 3.16998Z",fill:"currentColor"}),f("path",{d:"M10.8883 13.1116C10.8883 13.6025 10.4903 14.0005 9.99936 14.0005C9.50844 14.0005 9.11047 13.6025 9.11047 13.1116C9.11047 12.6207 9.50844 12.2227 9.99936 12.2227C10.4903 12.2227 10.8883 12.6207 10.8883 13.1116Z",fill:"currentColor"}),f("path",{d:"M10.5169 10.8949L11.1135 7.31519C11.2283 6.62672 10.6974 6 9.99941 6C9.30145 6 8.77053 6.62672 8.88528 7.31519L9.4819 10.8949C9.52406 11.1479 9.74294 11.3333 9.99941 11.3333C10.2559 11.3333 10.4748 11.1479 10.5169 10.8949Z",fill:"currentColor"}))}function bp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.99944 7.24939C11.5169 7.2495 12.7473 8.47995 12.7475 9.99744C12.7475 11.5151 11.517 12.7454 9.99944 12.7455C8.48176 12.7455 7.2514 11.5151 7.2514 9.99744C7.25155 8.47988 8.48186 7.24939 9.99944 7.24939ZM9.99944 8.57947C9.2164 8.57947 8.58163 9.21442 8.58148 9.99744C8.58148 10.7806 9.2163 11.4154 9.99944 11.4154C10.7825 11.4153 11.4174 10.7805 11.4174 9.99744C11.4173 9.21449 10.7824 8.57958 9.99944 8.57947Z",fill:"currentColor"}),f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M10.6391 1.67517C11.2939 1.67532 11.8991 2.02577 12.226 2.59314L13.2485 4.36755H15.2963C15.9505 4.36758 16.555 4.71709 16.8823 5.28357L17.5219 6.39001C17.8489 6.95668 17.8481 7.65542 17.5209 8.22205L16.4975 9.99451L17.5239 11.7689C17.8519 12.3357 17.8521 13.0347 17.5248 13.6019L16.8862 14.7084C16.559 15.2747 15.9543 15.6243 15.3002 15.6244H13.2514L12.2299 17.3988C11.9029 17.9663 11.297 18.3168 10.642 18.3168L9.3637 18.3158C8.71064 18.3155 8.10718 17.9678 7.77972 17.4027L6.74847 15.6234L4.69964 15.6244C4.04558 15.6242 3.44087 15.2747 3.1137 14.7084L2.47503 13.6019C2.14791 13.0349 2.14836 12.3366 2.47601 11.7699L3.50237 9.99548L2.47894 8.22205C2.15175 7.65533 2.15174 6.95673 2.47894 6.39001L3.11761 5.28259C3.44458 4.71663 4.04894 4.36813 4.70257 4.36755L6.75042 4.36658L7.77581 2.59119C8.10301 2.02476 8.7076 1.67527 9.36175 1.67517H10.6391ZM9.36273 3.00623C9.1835 3.00623 9.01679 3.10199 8.92718 3.2572L7.82659 5.16345C7.63652 5.49253 7.28473 5.69529 6.90472 5.69568L4.70355 5.69763C4.52451 5.69782 4.3585 5.79355 4.26898 5.94861L3.6303 7.05505C3.54091 7.2102 3.54077 7.40192 3.6303 7.55701L4.73089 9.46326C4.92108 9.7929 4.92135 10.1992 4.73089 10.5287L3.62737 12.4359C3.5378 12.591 3.53792 12.7817 3.62737 12.9369L4.26605 14.0433C4.35567 14.1982 4.52067 14.2932 4.69964 14.2933L6.90276 14.2943C7.28242 14.2946 7.63335 14.497 7.82366 14.8256L8.93011 16.7357C9.01984 16.8905 9.18578 16.9857 9.36468 16.9857H10.642C10.8213 16.9857 10.987 16.89 11.0766 16.7347L12.1752 14.8275C12.3653 14.4975 12.7182 14.2943 13.0991 14.2943H15.3002C15.4794 14.2942 15.6452 14.1985 15.7348 14.0433L16.3725 12.9379C16.4621 12.7826 16.4621 12.5911 16.3725 12.4359L15.27 10.5287C15.1032 10.2404 15.0808 9.89331 15.2055 9.59021L15.269 9.46326L16.3696 7.55701C16.4591 7.40189 16.459 7.21022 16.3696 7.05505L15.7309 5.94861C15.6412 5.79363 15.4754 5.69863 15.2963 5.69861L13.0951 5.69763L12.9535 5.68884C12.6751 5.65158 12.4217 5.50519 12.2504 5.28259L12.1723 5.16443L11.0737 3.2572C10.9841 3.10175 10.8175 3.00525 10.6381 3.00525L9.36273 3.00623Z",fill:"currentColor"}))}function Es(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M10.6878 9.46029L10.8421 9.49545L17.2913 11.43L17.4642 11.4974C18.2215 11.8649 18.2705 12.9544 17.5492 13.388L17.3822 13.4701L14.5872 14.5872L13.4701 17.3822C13.1135 18.2734 11.8913 18.2756 11.4974 17.4642L11.43 17.2913L9.49544 10.8421C9.26342 10.0687 9.92452 9.34418 10.6878 9.46029ZM12.4984 16.2288L13.3929 13.9954L13.4388 13.8949C13.5579 13.6675 13.7549 13.4891 13.9954 13.3929L16.2288 12.4984L10.9007 10.9007L12.4984 16.2288ZM5.90365 12.9749C6.16329 12.7153 6.58436 12.7154 6.84408 12.9749C7.10378 13.2346 7.10378 13.6557 6.84408 13.9154L5.0765 15.6829C4.8168 15.9426 4.39577 15.9426 4.13607 15.6829C3.87654 15.4232 3.87643 15.0022 4.13607 14.7425L5.90365 12.9749ZM2.83724 7.3265L5.25228 7.97299L5.37826 8.02084C5.65484 8.1591 5.80597 8.47712 5.72298 8.78744C5.63984 9.09774 5.34997 9.298 5.04134 9.27963L4.90853 9.25814L2.49349 8.61068L2.36752 8.56283C2.09082 8.42452 1.93961 8.10666 2.02279 7.79623C2.10599 7.4859 2.39574 7.28652 2.70443 7.30502L2.83724 7.3265ZM14.847 4.05111C15.1051 3.88059 15.4556 3.90894 15.6829 4.13607C15.9426 4.39577 15.9426 4.8168 15.6829 5.0765L13.9154 6.84408C13.6557 7.10378 13.2346 7.10378 12.9749 6.84408C12.7154 6.58437 12.7153 6.16329 12.9749 5.90365L14.7425 4.13607L14.847 4.05111ZM7.79623 2.02279C8.15098 1.92773 8.51562 2.13874 8.61068 2.49349L9.25814 4.90853L9.27962 5.04135C9.298 5.34998 9.09774 5.63984 8.78744 5.72299C8.47713 5.80592 8.15908 5.65484 8.02084 5.37826L7.97298 5.25228L7.3265 2.83724L7.30502 2.70443C7.28652 2.39577 7.48595 2.10603 7.79623 2.02279Z",fill:"currentColor"}))}const yp='@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid;--top-fade:0;--bottom-fade:0;--edge-fade-distance:1rem}}}@layer theme{:root,:host{--font-sans:var(--vscode-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);--font-mono:var(--vscode-editor-font-family,ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace);--color-black:#000;--spacing:.25rem;--text-xs:11px;--text-xs--line-height:calc(1 / .75);--text-sm:12px;--text-sm--line-height:calc(1.25 / .875);--text-base:14px;--text-base--line-height: 1.5 ;--font-weight-medium:500;--radius-md:calc(var(--radius-md-base) * var(--corner-radius-scale));--radius-lg:calc(var(--radius-lg-base) * var(--corner-radius-scale));--radius-xl:calc(var(--radius-xl-base) * var(--corner-radius-scale));--radius-2xl:calc(var(--radius-2xl-base) * var(--corner-radius-scale));--radius-3xl:calc(var(--radius-3xl-base) * var(--corner-radius-scale));--shadow-xl:0px 8px 16px -4px #0000001f;--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-token-foreground:var(--agent-text);--color-token-description-foreground:var(--agent-muted);--color-token-input-background:var(--agent-input-bg);--color-token-dropdown-background:var(--agent-surface-elevated);--color-token-border:var(--agent-border);--color-token-border-heavy:var(--agent-border-strong);--color-token-button-foreground:var(--agent-text);--color-token-button-background:var(--agent-accent);--color-token-button-secondary-foreground:var(--agent-text);--color-token-button-secondary-background:var(--agent-control);--color-token-button-secondary-hover-background:var(--agent-control-hover);--color-token-input-placeholder-foreground:var(--agent-muted);--color-token-charts-blue:var(--agent-accent);--color-token-text-tertiary:var(--agent-muted);--color-token-menu-border:var(--agent-border);--color-token-list-hover-background:var(--agent-control-hover);--color-token-side-bar-background:var(--agent-surface-elevated);--color-token-text-link-foreground:var(--agent-accent);--color-token-editor-background:var(--agent-page-bg);--corner-radius-scale:1;--radius-md-base:.5rem;--radius-lg-base:.625rem;--radius-xl-base:.75rem;--radius-2xl-base:1rem;--radius-3xl-base:1.25rem;--spacing-token-button-composer:calc(var(--spacing) * 7);--spacing-token-button-composer-sm:calc(var(--spacing) * 5);--spacing-token-button-composer-gap:var(--spacing);--h-token-button-composer-gap:var(--spacing-token-button-composer-gap)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\/2{top:50%}.right-2\\.5{right:calc(var(--spacing) * 2.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\\[calc\\(100\\%\\+6px\\)\\]{bottom:calc(100% + 6px)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-px{margin:1px}.ms-1{margin-inline-start:calc(var(--spacing) * 1)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-\\[3px\\]{margin-right:3px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-px{margin-bottom:1px}.ml-1\\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-\\[22px\\]{width:22px;height:22px}.size-token-button-composer{width:var(--spacing-token-button-composer);height:var(--spacing-token-button-composer)}.\\!h-auto{height:auto!important}.h-0{height:calc(var(--spacing) * 0)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\\[1lh\\]{height:1lh}.h-\\[1px\\]{height:1px}.h-auto{height:auto}.h-full{height:100%}.h-token-button-composer{height:var(--spacing-token-button-composer)}.h-token-button-composer-sm{height:var(--spacing-token-button-composer-sm)}.max-h-\\[25dvh\\]{max-height:25dvh}.max-h-\\[140px\\]{max-height:140px}.max-h-none{max-height:none}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\\[1\\.25rem\\]{min-height:1.25rem}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-52{width:calc(var(--spacing) * 52)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\\[60\\%\\]{max-width:60%}.max-w-\\[77\\%\\]{max-width:77%}.max-w-\\[320px\\]{max-width:320px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-56{min-width:calc(var(--spacing) * 56)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-\\[auto_minmax\\(0\\,1fr\\)_auto\\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\\[minmax\\(0\\,auto\\)_auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,auto) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\\[5px\\]{gap:5px}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\\[color\\:var\\(--gray-0\\)\\]{border-color:var(--gray-0)}.border-token-border,.border-token-border\\/80{border-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.border-token-border\\/80{border-color:color-mix(in oklab,var(--color-token-border) 80%,transparent)}}.border-transparent{border-color:#0000}.bg-\\[color\\:var\\(--gray-0\\)\\]{background-color:var(--gray-0)}.bg-token-border\\/70{background-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.bg-token-border\\/70{background-color:color-mix(in oklab,var(--color-token-border) 70%,transparent)}}.bg-token-button-secondary-background{background-color:var(--color-token-button-secondary-background)}.bg-token-charts-blue{background-color:var(--color-token-charts-blue)}.bg-token-dropdown-background,.bg-token-dropdown-background\\/90{background-color:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-dropdown-background\\/90{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 90%,transparent)}}.bg-token-dropdown-background\\/95{background-color:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-dropdown-background\\/95{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 95%,transparent)}}.bg-token-foreground,.bg-token-foreground\\/5{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-token-foreground\\/5{background-color:color-mix(in oklab,var(--color-token-foreground) 5%,transparent)}}.bg-token-foreground\\/10{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-token-foreground\\/10{background-color:color-mix(in oklab,var(--color-token-foreground) 10%,transparent)}}.bg-token-input-background\\/90{background-color:var(--color-token-input-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-input-background\\/90{background-color:color-mix(in oklab,var(--color-token-input-background) 90%,transparent)}}.bg-token-menu-border{background-color:var(--color-token-menu-border)}.bg-token-side-bar-background{background-color:var(--color-token-side-bar-background)}.\\[mask-image\\:linear-gradient\\(to_right\\,black_calc\\(100\\%_-_0\\.25rem\\)\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000)}.\\[mask-repeat\\:no-repeat\\]{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.object-cover{object-fit:cover}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.\\!px-0{padding-inline:calc(var(--spacing) * 0)!important}.px-0\\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-\\[var\\(--padding-row-x\\)\\]{padding-inline:var(--padding-row-x)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-\\[var\\(--padding-row-y\\)\\]{padding-block:var(--padding-row-y)}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-\\[calc\\(var\\(--codex-chat-font-size\\)\\+8px\\)\\]{--tw-leading:calc(var(--codex-chat-font-size) + 8px);line-height:calc(var(--codex-chat-font-size) + 8px)}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-current{color:currentColor}.text-token-button-secondary-foreground{color:var(--color-token-button-secondary-foreground)}.text-token-description-foreground{color:var(--color-token-description-foreground)}.text-token-dropdown-background{color:var(--color-token-dropdown-background)}.text-token-foreground{color:var(--color-token-foreground)}.text-token-input-placeholder-foreground{color:var(--color-token-input-placeholder-foreground)}.text-token-text-tertiary{color:var(--color-token-text-tertiary)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0px 2px 4px -1px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\\[0\\.5px\\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-token-border{--tw-ring-color:var(--color-token-border)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\\[--edge-fade-distance\\:2rem\\]{--edge-fade-distance:2rem}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/collapsed-tool-activity\\:text-token-foreground:is(:where(.group\\/collapsed-tool-activity):hover *){color:var(--color-token-foreground)}.hover\\:bg-token-button-secondary-hover-background:hover{background-color:var(--color-token-button-secondary-hover-background)}.hover\\:bg-token-editor-background\\/40:hover{background-color:var(--color-token-editor-background)}@supports (color:color-mix(in lab,red,red)){.hover\\:bg-token-editor-background\\/40:hover{background-color:color-mix(in oklab,var(--color-token-editor-background) 40%,transparent)}}.hover\\:bg-token-list-hover-background:hover{background-color:var(--color-token-list-hover-background)}.hover\\:bg-transparent:hover{background-color:#0000}.hover\\:text-token-button-foreground:hover{color:var(--color-token-button-foreground)}.hover\\:text-token-foreground:hover{color:var(--color-token-foreground)}}.focus\\:bg-token-list-hover-background:focus{background-color:var(--color-token-list-hover-background)}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-token-button-background:focus-visible{outline-color:var(--color-token-button-background)}@media(hover:hover){.enabled\\:hover\\:bg-token-foreground\\/80:enabled:hover{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.enabled\\:hover\\:bg-token-foreground\\/80:enabled:hover{background-color:color-mix(in oklab,var(--color-token-foreground) 80%,transparent)}}.enabled\\:hover\\:bg-token-list-hover-background:enabled:hover{background-color:var(--color-token-list-hover-background)}}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.data-\\[state\\=checked\\]\\:translate-x-\\[14px\\][data-state=checked]{--tw-translate-x:14px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[state\\=open\\]\\:bg-token-foreground\\/80[data-state=open]{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.data-\\[state\\=open\\]\\:bg-token-foreground\\/80[data-state=open]{background-color:color-mix(in oklab,var(--color-token-foreground) 80%,transparent)}}.data-\\[state\\=open\\]\\:bg-token-list-hover-background[data-state=open]{background-color:var(--color-token-list-hover-background)}.data-\\[state\\=unchecked\\]\\:translate-x-\\[2px\\][data-state=unchecked]{--tw-translate-x:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}@container (min-width:500px){.\\@\\[500px\\]\\:inline{display:inline}}.electron\\:rounded-md:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){border-radius:var(--radius-md)}.electron\\:p-1:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){padding:calc(var(--spacing) * 1)}.electron\\:shadow-\\[0_4px_16px_0_rgba\\(0\\,0\\,0\\,0\\.05\\)\\]:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-shadow:0 4px 16px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.electron\\:ring:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.electron\\:ring-black\\/10:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.electron\\:ring-black\\/10:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}@media(prefers-color-scheme:dark){.electron\\:dark\\:bg-token-dropdown-background:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){background-color:var(--color-token-dropdown-background)}}.extension\\:border:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-style:var(--tw-border-style);border-width:1px}.extension\\:border-token-border\\/50:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.extension\\:border-token-border\\/50:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-color:color-mix(in oklab,var(--color-token-border) 50%,transparent)}}.\\[\\&_\\.ProseMirror\\]\\:\\!h-5 .ProseMirror{height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:h-auto .ProseMirror{height:auto}.\\[\\&_\\.ProseMirror\\]\\:\\!min-h-5 .ProseMirror{min-height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:min-h-\\[2rem\\] .ProseMirror{min-height:2rem}.\\[\\&_\\.ProseMirror\\]\\:min-w-0 .ProseMirror{min-width:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror\\]\\:flex-1 .ProseMirror{flex:1}.\\[\\&_\\.ProseMirror\\]\\:resize-none .ProseMirror{resize:none}.\\[\\&_\\.ProseMirror\\]\\:overflow-hidden .ProseMirror{overflow:hidden}.\\[\\&_\\.ProseMirror\\]\\:leading-5 .ProseMirror{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.\\[\\&_\\.ProseMirror\\]\\:whitespace-nowrap .ProseMirror{white-space:nowrap}.\\[\\&_\\.ProseMirror\\]\\:focus-visible\\:outline-none .ProseMirror:focus-visible{--tw-outline-style:none;outline-style:none}.\\[\\&_\\.ProseMirror_p\\]\\:m-0 .ProseMirror p{margin:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror_p\\]\\:overflow-hidden .ProseMirror p{overflow:hidden}.\\[\\&_\\.ProseMirror_p\\]\\:text-ellipsis .ProseMirror p{text-overflow:ellipsis}.\\[\\&_\\.ProseMirror_p\\]\\:whitespace-nowrap .ProseMirror p{white-space:nowrap}.\\[\\&_\\.contain-inline-size\\]\\:\\[contain\\:initial\\] .contain-inline-size{contain:initial}.\\[\\&\\>\\*\\:last-child\\]\\:mb-0>:last-child{margin-bottom:calc(var(--spacing) * 0)}.\\[\\&\\>ol\\:first-child\\]\\:mt-0>ol:first-child,.\\[\\&\\>ul\\:first-child\\]\\:mt-0>ul:first-child{margin-top:calc(var(--spacing) * 0)}}@property --top-fade{syntax:"";inherits:false;initial-value:0}@property --bottom-fade{syntax:"";inherits:false;initial-value:0}@property --edge-fade-distance{syntax:"";inherits:false;initial-value:1rem}@keyframes edge-fade{0%,1%{--top-fade:0;--bottom-fade:var(--edge-fade-distance,1rem)}99%,to{--top-fade:var(--edge-fade-distance,1rem);--bottom-fade:0}}@supports (animation-timeline:--scroll-fade){.vertical-scroll-fade-mask{-webkit-mask:linear-gradient(to bottom in oklch,oklch(60% 0 0/0),oklch(85% 0 0) var(--top-fade) calc(100% - var(--bottom-fade)),oklch(60% 0 0/0));mask:linear-gradient(to bottom in oklch,oklch(60% 0 0/0),oklch(85% 0 0) var(--top-fade) calc(100% - var(--bottom-fade)),oklch(60% 0 0/0));animation-name:edge-fade;animation-timing-function:linear;animation-fill-mode:both;animation-timeline:scroll(self y)}}:root{color-scheme:dark;font-family:var(--font-sans);color:var(--agent-text,#f1f0e8);--agent-page-bg:transparent;--agent-surface:#1c1f1b57;--agent-surface-elevated:#1c1f1b7a;--agent-input-bg:#080a085c;--agent-border:#e9e7d81f;--agent-border-strong:#e9e7d838;--agent-text:#f1f0e8;--agent-muted:#f1f0e894;--agent-soft:#f1f0e8c7;--agent-accent:#8ab4f8;--agent-accent-soft:#8ab4f833;--agent-danger:#ff8d7e;--agent-shadow:#0003;--agent-card:var(--agent-input-bg);background:0 0}@supports (color:color-mix(in lab,red,red)){:root{--agent-card:color-mix(in srgb, var(--agent-input-bg) 90%, transparent)}}:root{--agent-card-hover:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){:root{--agent-card-hover:color-mix(in srgb, var(--agent-input-bg) 96%, transparent)}}:root{--agent-control:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){:root{--agent-control:color-mix(in srgb, var(--agent-input-bg) 44%, transparent)}}:root{--agent-control-hover:var(--agent-soft)}@supports (color:color-mix(in lab,red,red)){:root{--agent-control-hover:color-mix(in srgb, var(--agent-soft) 8%, transparent)}}:root{--agent-primary:var(--agent-accent)}@supports (color:color-mix(in lab,red,red)){:root{--agent-primary:color-mix(in srgb, var(--agent-accent) 90%, var(--agent-text))}}:root{--agent-primary-text:#fff;--cubic-enter:cubic-bezier(.19, 1, .22, 1);--cubic-exit-snappy:cubic-bezier(.65, 0, .4, 1);--transition-duration-basic:.15s;--gray-0:#fff;--color-background-surface:transparent;--color-background-surface-under:transparent;--color-background-elevated-primary:var(--agent-surface-elevated);--color-background-elevated-primary-opaque:var(--agent-surface-elevated)}@supports (color:color-mix(in lab,red,red)){:root{--color-background-elevated-primary-opaque:color-mix(in srgb, var(--agent-surface-elevated) 100%, #111)}}:root{--color-background-elevated-secondary:var(--agent-card);--color-background-elevated-secondary-opaque:var(--agent-card)}@supports (color:color-mix(in lab,red,red)){:root{--color-background-elevated-secondary-opaque:color-mix(in srgb, var(--agent-card) 100%, #111)}}:root{--thread-content-max-width:none;--markdown-wide-block-max-width:56rem;--padding-toolbar:calc(var(--spacing) * 4);--vscode-foreground:var(--agent-text);--vscode-descriptionForeground:var(--agent-muted);--vscode-input-background:var(--agent-input-bg);--vscode-dropdown-background:var(--agent-surface-elevated);--vscode-input-placeholderForeground:var(--agent-muted);--vscode-textLink-foreground:var(--agent-accent);--vscode-textLink-activeForeground:var(--agent-accent);--vscode-list-hoverBackground:var(--agent-control-hover);--color-token-editor-foreground:var(--agent-text);--color-token-editor-background:var(--agent-page-bg);--color-token-side-bar-background:var(--agent-surface-elevated);--color-token-main-surface-primary:transparent;--color-token-text-code-block-background:var(--agent-input-bg);--color-token-bg-primary:var(--agent-surface-elevated);--color-token-bg-secondary:var(--agent-card);--color-token-bg-fog:var(--color-background-elevated-secondary);--color-token-bg-tertiary:var(--agent-control);--color-token-list-hover-background:var(--agent-control-hover);--markdown-wide-block-max-height:80vh;--conversation-block-gap:12px;--conversation-tool-assistant-gap:16px;--color-token-terminal-ansi-black:var(--vscode-terminal-ansiBlack,#000);--color-token-terminal-ansi-red:var(--vscode-terminal-ansiRed,#f66);--color-token-terminal-ansi-green:var(--vscode-terminal-ansiGreen,#94f494);--color-token-terminal-ansi-yellow:var(--vscode-terminal-ansiYellow,#f4f47b);--color-token-terminal-ansi-blue:var(--vscode-terminal-ansiBlue,#9e9eff);--color-token-terminal-ansi-magenta:var(--vscode-terminal-ansiMagenta,#db6bdb);--color-token-terminal-ansi-cyan:var(--vscode-terminal-ansiCyan,#81eeee);--color-token-terminal-ansi-white:var(--vscode-terminal-ansiWhite,#d6d6d6);--color-token-terminal-ansi-bright-black:var(--vscode-terminal-ansiBrightBlack,#6e6e6e);--color-token-terminal-ansi-bright-red:var(--vscode-terminal-ansiBrightRed,#ffa8a8);--color-token-terminal-ansi-bright-green:var(--vscode-terminal-ansiBrightGreen,#0f0);--color-token-terminal-ansi-bright-yellow:var(--vscode-terminal-ansiBrightYellow,#ffffa8);--color-token-terminal-ansi-bright-blue:var(--vscode-terminal-ansiBrightBlue,#9494ff);--color-token-terminal-ansi-bright-magenta:var(--vscode-terminal-ansiBrightMagenta,#ffb3ff);--color-token-terminal-ansi-bright-cyan:var(--vscode-terminal-ansiBrightCyan,#adffff);--color-token-terminal-ansi-bright-white:var(--vscode-terminal-ansiBrightWhite,#fff);--padding-row-x:calc(var(--spacing) * 2);--padding-row-y:calc(var(--spacing) * 1.25);--height-token-nav-row:32px;--codex-chat-font-size:var(--vscode-chat-font-size,var(--vscode-font-size,13px));--codex-chat-code-font-size:var(--vscode-chat-editor-font-size,var(--vscode-editor-font-size,12px))}:root[data-codex-window-type=electron]{background:0 0;overflow:hidden}:root[data-codex-window-type=electron] body{--padding-row-y:calc(var(--spacing) * 1.25);--height-token-nav-row:calc(var(--text-base) * 1.5 + var(--padding-row-y) * 2);--padding-panel-base:calc(var(--spacing) * 5);--padding-panel:var(--padding-panel-base);--thread-content-max-width:48rem;--markdown-wide-block-max-width:56rem;--markdown-wide-block-max-height:80vh;--conversation-block-gap:12px;--conversation-tool-assistant-gap:16px;--spacing-token-button-composer-sm:calc(var(--spacing) * 7);--text-heading-md:18px;--cursor-interaction:default;--vscode-editor-font-family:ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--vscode-font-size:var(--text-base);--vscode-editor-font-size:var(--text-sm);--vscode-chat-font-size:var(--vscode-font-size);--vscode-chat-editor-font-size:var(--vscode-editor-font-size);overscroll-behavior:none;overflow:hidden}:root[data-codex-window-type=electron]:not([data-codex-os=win32]) body{background:0 0}*{box-sizing:border-box}html,body,#root{background:0 0;height:100%}body{min-width:0;color:var(--agent-text);font-family:var(--font-sans);font-size:var(--text-base);font-weight:var(--vscode-font-weight,400);margin:0;overflow:hidden}button,select,textarea{font:inherit}button,select{cursor:default}.agent-shell{height:100%;min-height:100%;padding:var(--padding-toolbar);color:var(--agent-text);background:var(--agent-page-bg);flex-direction:column;display:flex}.agent-log,.log,.agent-thread{width:100%;min-height:0;max-width:var(--thread-content-max-width);scrollbar-width:thin;scrollbar-color:var(--agent-muted) transparent;background:0 0;flex:auto;margin:0 auto;padding:6px 2px 18px;overflow:auto}@supports (color:color-mix(in lab,red,red)){.agent-log,.log,.agent-thread{scrollbar-color:color-mix(in srgb,var(--agent-muted) 28%,transparent) transparent}}.agent-thread{gap:var(--conversation-block-gap,12px);flex-direction:column;padding-top:10px;padding-bottom:24px;display:flex;position:relative;overflow-x:hidden}:root[data-codex-window-type=electron] .agent-thread{--color-token-description-foreground:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){:root[data-codex-window-type=electron] .agent-thread{--color-token-description-foreground:color-mix(in srgb, var(--color-token-foreground) 70%, transparent)}}.agent-thread[data-empty]{justify-content:flex-end}.text-size-chat{font-size:var(--codex-chat-font-size)}.text-size-chat-sm{font-size:calc(var(--codex-chat-font-size) - 1px)}.text-size-code{font-size:var(--codex-chat-code-font-size)}.text-size-code-sm{font-size:calc(var(--codex-chat-code-font-size) - 1px)}.font-vscode-editor{font-family:var(--vscode-editor-font-family,var(--font-mono))}.codex-user-turn,.codex-assistant-turn,.codex-notice-turn{width:100%;min-width:0}.codex-user-bubble{color:var(--color-token-foreground);background:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.codex-user-bubble{background:color-mix(in srgb,var(--color-token-foreground) 5%,transparent)}}.codex-user-message-content[data-collapsed=true]{-webkit-line-clamp:20;-webkit-box-orient:vertical;max-height:20lh;display:-webkit-box;overflow:hidden}.codex-user-message-toggle{background:0 0;border:0;padding:0}.codex-assistant-turn{justify-content:flex-start;display:flex}.codex-assistant-message{max-width:100%;color:var(--color-token-foreground);white-space:normal;overflow-wrap:anywhere}.codex-assistant-message-streaming{white-space:break-spaces}.codex-assistant-message :where(p){margin:0 0 .85em}.codex-assistant-message :where(p:last-child){margin-bottom:0}.codex-assistant-message :where(ul,ol){margin:.45em 0 .85em;padding-left:1.35rem}.codex-assistant-message :where(ul){list-style:outside}.codex-assistant-message :where(ol){list-style:decimal}.codex-assistant-message :where(li){margin:.25em 0}.codex-assistant-message :where(blockquote){border-left:2px solid var(--color-token-border);color:var(--agent-soft);margin:.75em 0;padding-left:.85rem}.codex-assistant-message :where(code){background:var(--agent-soft);border-radius:4px;padding:.12em .3em}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(code){background:color-mix(in srgb,var(--agent-soft) 10%,transparent)}}.codex-assistant-message :where(code){font-family:var(--font-mono);font-size:var(--codex-chat-code-font-size)}.codex-assistant-message :where(pre){border:1px solid var(--agent-border);margin:.75em 0;padding:.65rem .75rem;overflow-x:auto}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(pre){border:1px solid color-mix(in srgb,var(--agent-border) 72%,transparent)}}.codex-assistant-message :where(pre){border-radius:var(--radius-lg);background:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(pre){background:color-mix(in srgb,var(--agent-input-bg) 82%,transparent)}}.codex-assistant-message :where(pre code){white-space:pre;background:0 0;border-radius:0;padding:0;display:block}.codex-assistant-message :where(a){color:var(--agent-accent);text-underline-offset:2px;text-decoration:underline}.codex-assistant-message :where(hr){border-top:1px solid var(--color-token-border);margin:1rem 0}.codex-notice-turn{justify-content:flex-start;display:flex}.codex-notice-content{border:1px solid var(--agent-border);max-width:min(100%,44rem);padding:10px 12px}@supports (color:color-mix(in lab,red,red)){.codex-notice-content{border:1px solid color-mix(in srgb,var(--agent-border) 74%,transparent)}}.codex-notice-content{border-radius:var(--radius-lg);color:var(--agent-soft);background:var(--agent-surface-elevated)}@supports (color:color-mix(in lab,red,red)){.codex-notice-content{background:color-mix(in srgb,var(--agent-surface-elevated) 86%,transparent)}}.codex-notice-content{overflow-wrap:anywhere}.codex-notice-turn.error .codex-notice-content{border-color:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{border-color:color-mix(in srgb,var(--agent-danger) 46%,transparent)}}.codex-notice-turn.error .codex-notice-content{color:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{color:color-mix(in srgb,var(--agent-danger) 88%,var(--agent-text))}}.codex-notice-turn.error .codex-notice-content{background:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{background:color-mix(in srgb,var(--agent-danger) 11%,transparent)}}.codex-notice-turn.warning .codex-notice-content{border-color:var(--agent-accent)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.warning .codex-notice-content{border-color:color-mix(in srgb,var(--agent-accent) 30%,transparent)}}.codex-tool-activity-turn{flex-direction:column;align-items:flex-start;gap:0;width:100%;min-width:0;display:flex}.codex-tool-activity-summary{max-width:100%;color:var(--color-token-foreground);border:0;padding:0}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-summary{color:color-mix(in srgb,var(--color-token-foreground) 40%,transparent)}}.codex-tool-activity-summary{font:inherit;font-size:var(--codex-chat-font-size);line-height:calc(var(--codex-chat-font-size) + 8px);background:0 0}.codex-tool-activity-summary:focus-visible{outline:none}.codex-tool-activity-turn.inProgress .codex-tool-activity-summary{color:var(--color-token-description-foreground)}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-turn.inProgress .codex-tool-activity-summary{color:color-mix(in srgb,var(--color-token-description-foreground) 90%,transparent)}}.codex-tool-activity-icon{color:var(--color-token-foreground);justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-icon{color:color-mix(in srgb,var(--color-token-foreground) 35%,transparent)}}.codex-tool-activity-icon{font-family:var(--font-mono);font-size:11px;line-height:1}.codex-tool-activity-turn.inProgress .codex-tool-activity-icon{animation:1.2s ease-in-out infinite codex-tool-activity-pulse}.codex-tool-activity-text{align-items:baseline;gap:4px;min-width:0;max-width:100%;display:inline-flex}.codex-tool-activity-action{color:var(--color-token-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-action{color:color-mix(in srgb,var(--color-token-foreground) 58%,transparent)}}.codex-tool-activity-detail{min-width:0;color:var(--color-token-foreground);overflow:hidden}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-detail{color:color-mix(in srgb,var(--color-token-foreground) 40%,transparent)}}.codex-tool-activity-detail{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap}.codex-tool-activity-summary:hover .codex-tool-activity-action,.codex-tool-activity-summary:hover .codex-tool-activity-detail,.codex-tool-activity-summary:hover .codex-tool-activity-icon{color:var(--color-token-foreground)}.codex-tool-activity-output-shell{opacity:0;pointer-events:none;grid-template-rows:0fr;width:100%;min-width:0;transition:grid-template-rows .18s ease-out,opacity .18s ease-out;display:grid;overflow:hidden}.codex-tool-activity-output-shell[data-expanded=true]{opacity:1;pointer-events:auto;grid-template-rows:1fr}.codex-tool-activity-output-shell-inner{min-height:0;overflow:hidden}.codex-tool-activity-output-frame{min-height:1.25rem;padding-right:0;position:relative}.codex-tool-activity-output{box-sizing:border-box;max-width:min(100%,var(--markdown-wide-block-max-width));max-height:140px;color:var(--color-token-description-foreground);white-space:pre;--edge-fade-distance:2rem;background:0 0;border:0;border-radius:0;flex-direction:column;gap:6px;margin:0;padding:8px;font-weight:500;display:flex;overflow:auto}.codex-tool-output-copy:focus-visible{opacity:1}@keyframes codex-tool-activity-pulse{0%,to{opacity:.45}50%{opacity:1}}.agent-log-line,.log-line{border-bottom:1px solid var(--agent-border);grid-template-columns:4.5rem minmax(0,1fr);gap:12px;padding:9px 0;display:grid}@supports (color:color-mix(in lab,red,red)){.agent-log-line,.log-line{border-bottom:1px solid color-mix(in srgb,var(--agent-border) 55%,transparent)}}.agent-log-line,.log-line{color:var(--agent-soft);font-family:var(--font-mono);font-size:12px;line-height:1.5}.agent-log-line:last-child,.log-line:last-child{border-bottom-color:#0000}.agent-log-label,.log-label{color:var(--agent-muted);text-overflow:ellipsis;text-transform:uppercase;overflow:hidden}.agent-log-line.stdout .agent-log-label,.log-line.stdout .log-label{color:var(--agent-accent)}.agent-log-line.stderr .agent-log-label,.agent-log-line.error .agent-log-label,.log-line.stderr .log-label,.log-line.error .log-label{color:var(--agent-danger)}.agent-log-text,.log-text{overflow-wrap:anywhere;white-space:pre-wrap;word-break:normal;min-width:0}.agent-composer-stack{width:100%;max-width:var(--thread-content-max-width);gap:6px;margin:0 auto;display:grid}.above-composer-suggestion-shell{container-type:inline-size}.codex-composer-frame{--composer-top-tray-inline-padding:12px;--composer-top-tray-top-padding:14px;--composer-top-tray-max-height:177px}.codex-composer-surface{color:var(--color-token-foreground)}.codex-composer-inner{isolation:isolate}@supports (corner-shape:superellipse(1.5)){:root{--corner-radius-scale:1.25}.codex-composer-surface,.codex-user-bubble,.codex-notice-content,.provider-dropdown,.provider-dropdown-item,.add-context-dropdown,.add-context-item,.composer-attachment-file,.composer-attachment-image,.rate-limit-popover,.codex-top-tray-panel,.codex-top-tray-item{corner-shape:superellipse(1.5)}}.codex-composer-single-line{min-height:0}.composer-single-line-measure{pointer-events:none;visibility:hidden;white-space:pre;width:max-content;max-width:none;height:0;font-family:var(--font-sans);font-size:var(--text-base);line-height:20px;position:absolute;overflow:hidden}.h-token-button-composer{height:var(--spacing-token-button-composer);gap:var(--h-token-button-composer-gap)}.h-token-button-composer-sm{height:var(--spacing-token-button-composer-sm);gap:var(--h-token-button-composer-gap)}.size-token-button-composer{width:var(--spacing-token-button-composer);height:var(--spacing-token-button-composer)}.size-token-button-composer-sm{width:var(--spacing-token-button-composer-sm);height:var(--spacing-token-button-composer-sm)}.icon-3xs{width:10px;height:10px}.icon-xxs{width:12px;height:12px}.icon-2xs{width:14px;height:14px}.icon-xs{width:16px;height:16px}.icon-sm{width:18px;height:18px}.icon-base{width:20px;height:20px}.icon-md{width:24px;height:24px}.icon-lg{width:28px;height:28px}.cursor-interaction{cursor:var(--cursor-interaction)}.no-drag{-webkit-app-region:no-drag}.outline-hidden{outline-offset:2px;outline:2px solid #0000}.user-select-none{-webkit-user-select:none;user-select:none}.shadow-xl-spread{--tw-shadow:0px 0px 0px .5px var(--tw-shadow-color,var(--color-token-border)), var(--shadow-xl);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}._content_1hiti_1{--dropdown-content-inset:2px;--dropdown-content-start-transform:translateY(calc(var(--dropdown-content-inset) * -1)) scale(.98);transform-origin:var(--radix-dropdown-menu-content-transform-origin);will-change:opacity,transform}._content_1hiti_1[data-side=top]{--dropdown-content-start-transform:translateY(var(--dropdown-content-inset)) scale(.98)}._content_1hiti_1[data-side=right]{--dropdown-content-start-transform:translateX(calc(var(--dropdown-content-inset) * -1)) scale(.98)}._content_1hiti_1[data-side=left]{--dropdown-content-start-transform:translateX(var(--dropdown-content-inset)) scale(.98)}@media(prefers-reduced-motion:no-preference){._content_1hiti_1[data-state=open]{animation:_dropdown-content-enter_1hiti_1 var(--transition-duration-basic) var(--cubic-enter)}}@keyframes _dropdown-content-enter_1hiti_1{0%{opacity:0;transform:var(--dropdown-content-start-transform)}to{opacity:1;transform:translate(0)translateY(0)scale(1)}}.hide-scrollbar{scrollbar-width:none}.hide-scrollbar::-webkit-scrollbar{display:none}.prompt-input{resize:none;width:100%;min-height:2.75rem;max-height:200px;color:var(--color-token-foreground);font-size:var(--text-base);background:0 0;border:0;outline:none;padding:0;line-height:20px;display:block}.prompt-input::placeholder{color:var(--color-token-input-placeholder-foreground)}@supports (color:color-mix(in lab,red,red)){.prompt-input::placeholder{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 50%,transparent)}}.ProseMirror{min-width:0;color:var(--agent-text);caret-color:var(--agent-text);font-variant-ligatures:none;font-feature-settings:"liga" 0;white-space:pre-wrap;white-space:break-spaces;word-wrap:break-word;word-break:normal;background:0 0;outline:none;position:relative;overflow-y:auto}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection{caret-color:#0000;background:0 0}.ProseMirror-hideselection ::selection{caret-color:#0000;background:0 0}.ProseMirror [draggable][contenteditable=false]{-webkit-user-select:text;user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:"";pointer-events:none;border:2px solid #8cf;position:absolute;inset:-2px -2px -2px -32px}img.ProseMirror-separator{border:none!important;margin:0!important;display:inline!important}.ProseMirror p{margin:0}.ProseMirror .placeholder{pointer-events:none;-webkit-user-select:none;user-select:none;position:relative}.ProseMirror .placeholder:after{color:var(--color-token-input-placeholder-foreground);content:attr(data-placeholder);opacity:.5;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;max-width:100%;position:absolute;inset:0 0 auto;overflow:hidden}.ProseMirror .placeholder::selection{color:inherit;background:0 0}.ProseMirror .placeholder ::selection{color:inherit;background:0 0}.ProseMirror .ProseMirror-selectednode:has([skill-mention-name]){outline:none}.prompt-editor-mention{--inline-mention-base-color:var(--color-token-text-link-foreground)}@supports (color:color-mix(in lab,red,red)){.prompt-editor-mention{--inline-mention-base-color:color-mix(in srgb, var(--color-token-text-link-foreground) 80%, var(--color-token-foreground) 20%)}}.prompt-editor-mention{--inline-mention-color:var(--inline-mention-resolved-base-color,var(--inline-mention-base-color));max-width:100%;color:var(--inline-mention-color);vertical-align:baseline;white-space:nowrap;align-items:baseline;display:inline-flex}.prompt-editor-mention:hover{text-underline-offset:2px;text-decoration-line:underline;text-decoration-style:dashed;text-decoration-thickness:.5px}.prompt-editor-mention-icon{color:currentColor}[cmdk-dialog],[cmdk-dialog]:focus-visible{outline:none}[cmdk-root],[data-cmdk-root]{z-index:1000;gap:var(--spacing);min-width:100%;padding:var(--spacing);border:1px solid var(--color-token-border);border-radius:var(--radius-3xl);color:var(--color-token-foreground);background-color:var(--color-token-dropdown-background);flex-direction:column;display:flex}@supports (color:color-mix(in lab,red,red)){[cmdk-root],[data-cmdk-root]{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 95%,transparent)}}[cmdk-root],[data-cmdk-root]{font-size:var(--text-sm);opacity:1;-webkit-user-select:none;user-select:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);--cmdk-bottom-item-radius:calc(var(--radius-3xl) - var(--spacing));transform:translateZ(0)}[cmdk-item]{content-visibility:auto;width:100%;min-height:calc(var(--spacing) * 6);padding:var(--padding-row-y) var(--padding-row-x);border-radius:var(--radius-lg);color:var(--color-token-foreground);cursor:var(--cursor-interaction);opacity:.75;-webkit-user-select:none;user-select:none;outline:none;flex-direction:row;align-items:center;display:flex}[cmdk-item][aria-disabled=true],[cmdk-item][data-disabled=true]{cursor:default;opacity:.25}[cmdk-item]:hover:not([aria-disabled=true]),[cmdk-item][data-selected=true],[cmdk-item][aria-selected=true],[cmdk-item]:focus-visible,[cmdk-item]:active:not([aria-disabled=true]){background-color:var(--color-token-list-hover-background);opacity:1}[cmdk-item][data-command-menu-loading=true],[cmdk-item][data-command-menu-loading=true]:hover,[cmdk-item][data-command-menu-loading=true][data-selected=true],[cmdk-item][data-command-menu-loading=true][aria-selected=true],[cmdk-item][data-command-menu-loading=true]:focus-visible,[cmdk-item][data-command-menu-loading=true]:active{cursor:default;opacity:.6;background-color:#0000}[cmdk-item][data-command-menu-empty-state=true],[cmdk-item][data-command-menu-empty-state=true]:hover,[cmdk-item][data-command-menu-empty-state=true][data-selected=true],[cmdk-item][data-command-menu-empty-state=true][aria-selected=true],[cmdk-item][data-command-menu-empty-state=true]:focus-visible,[cmdk-item][data-command-menu-empty-state=true]:active{cursor:default;opacity:1;background-color:#0000}[cmdk-list]{min-height:0;max-height:min(300px,var(--cmdk-list-height,300px));gap:var(--spacing);overscroll-behavior:contain;scrollbar-width:none;flex-direction:column;transition:max-height .1s;display:flex;overflow-y:auto}[cmdk-list]:focus-visible{outline:none}.command-menu-dialog [cmdk-list]{max-height:var(--command-menu-list-max-height);scroll-padding-block-start:calc(var(--spacing) * 8)}.composer-home-top-menu [cmdk-list]{max-height:none}.composer-home-top-menu{max-height:min(320px,var(--composer-top-menu-max-height,320px));overflow:hidden}:where([cmdk-list])>[cmdk-item]:not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))),:where([cmdk-list])>[cmdk-group]:not([hidden]):not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))) [cmdk-item]:last-of-type,:where([cmdk-list])>[cmdk-list-sizer]>[cmdk-item]:not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))),:where([cmdk-list])>[cmdk-list-sizer]>[cmdk-group]:not([hidden]):not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))) [cmdk-item]:last-of-type{border-bottom-right-radius:var(--cmdk-bottom-item-radius);border-bottom-left-radius:var(--cmdk-bottom-item-radius)}[cmdk-input]{padding:calc(var(--spacing) * 1.5) calc(var(--spacing) * 2.5)}[cmdk-input]:focus-visible{outline:none}[cmdk-empty],[data-cmdk-empty]{min-height:calc(var(--spacing) * 8);padding:calc(var(--spacing) * 1.5) calc(var(--spacing) * 2.5);color:var(--color-token-description-foreground);text-align:center;white-space:pre-wrap;align-items:center;line-height:1.4;display:flex}[data-codex-window-type=electron] [cmdk-root],[data-codex-window-type=electron] [data-cmdk-root]{font-size:var(--text-base)}.codex-attachment-tray{scrollbar-width:none}.codex-attachment-tray::-webkit-scrollbar{display:none}.codex-user-attachment-tray{max-width:77%}.codex-user-attachment-tray .codex-attachment-row{justify-content:flex-end;min-width:0}.composer-attachment-image{border:1px solid var(--color-token-border-heavy);border-radius:var(--radius-lg);background:var(--color-token-input-background);flex:none;width:80px;height:80px;display:inline-flex;position:relative;overflow:visible}.composer-attachment-image img{border-radius:calc(var(--radius-lg) - 1px);object-fit:cover;width:100%;height:100%}.composer-attachment-file{border:.5px solid var(--color-token-border-heavy);flex:none;align-items:center;gap:7px;max-width:min(220px,70vw);height:32px;padding:0 30px 0 10px;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.composer-attachment-file{border:.5px solid color-mix(in srgb,var(--color-token-border-heavy) 80%,transparent)}}.composer-attachment-file{border-radius:var(--radius-lg);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.composer-attachment-file{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.composer-attachment-file-icon{color:var(--color-token-description-foreground);flex:none;display:inline-flex}.composer-attachment-file-label{min-width:0;font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:1rem;overflow:hidden}.composer-attachment-remove{border:.5px solid var(--color-token-border-heavy);justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex;position:absolute;top:-7px;right:-7px}@supports (color:color-mix(in lab,red,red)){.composer-attachment-remove{border:.5px solid color-mix(in srgb,var(--color-token-border-heavy) 70%,transparent)}}.composer-attachment-remove{color:var(--color-token-foreground);background:var(--color-token-dropdown-background);border-radius:999px;box-shadow:0 1px 3px #0000002e}.composer-attachment-remove:hover,.composer-attachment-remove:focus-visible{background:var(--color-token-list-hover-background)}.codex-left-rail,.codex-secondary-controls,.codex-action-cluster,.model-picker,.rate-line{align-items:center;display:flex}.codex-left-rail{scrollbar-width:none;flex:0 auto;min-width:0;margin:0;padding:0;overflow-x:auto}.codex-left-rail::-webkit-scrollbar{display:none}.composer-mode-indicator{color:var(--color-token-text-link-foreground);flex:0 auto}.composer-mode-divider{background:var(--color-token-border);width:1px;height:1rem;margin:0 1px}@supports (color:color-mix(in lab,red,red)){.composer-mode-divider{background:color-mix(in srgb,var(--color-token-border) 70%,transparent)}}.composer-mode-button{min-width:0;color:var(--color-token-text-link-foreground)}.composer-mode-icon{flex:none;justify-content:center;align-items:center;display:inline-flex}.composer-mode-icon-hover,.composer-mode-button:hover .composer-mode-icon-default,.composer-mode-button:focus-visible .composer-mode-icon-default{display:none}.composer-mode-button:hover .composer-mode-icon-hover,.composer-mode-button:focus-visible .composer-mode-icon-hover{display:inline-flex}.composer-mode-label{color:currentColor;font-weight:500}.composer-context-indicator{color:var(--color-token-text-link-foreground);flex:0 auto}.composer-context-divider{background:var(--color-token-border);margin:0 1px}@supports (color:color-mix(in lab,red,red)){.composer-context-divider{background:color-mix(in srgb,var(--color-token-border) 70%,transparent)}}.composer-context-button{color:var(--color-token-text-link-foreground)}.composer-context-icon{justify-content:center;align-items:center;display:inline-flex}.composer-context-icon-hover,.composer-context-button:hover .composer-context-icon-default,.composer-context-button:focus-visible .composer-context-icon-default{display:none}.composer-context-button:hover .composer-context-icon-hover,.composer-context-button:focus-visible .composer-context-icon-hover{display:inline-flex}.composer-context-label{color:currentColor;font-weight:500}.codex-secondary-controls{flex:0 auto;justify-content:flex-end}.codex-action-cluster{flex:none;justify-content:flex-end}.model-picker-root{flex:none;align-items:center;display:inline-flex}.model-picker,.codex-tool,.codex-action{outline:none;flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.codex-tool,.codex-action{line-height:18px}.model-picker{letter-spacing:0;white-space:nowrap;min-width:0;max-width:10rem}.model-icon{border:1px solid var(--agent-border-strong);flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.model-icon{border:1px solid color-mix(in srgb,var(--agent-border-strong) 70%,transparent)}}.model-icon{color:var(--agent-text);background:var(--agent-control);border-radius:999px;font-size:10px;font-weight:750;line-height:1}.model-label{min-width:0;color:var(--color-token-foreground);text-overflow:ellipsis;overflow:hidden}.model-chevron{color:var(--color-token-input-placeholder-foreground);flex:none;line-height:1}.provider-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:13rem;max-height:min(250px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:0}@supports (color:color-mix(in lab,red,red)){.provider-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.provider-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.provider-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.provider-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.provider-dropdown-title{min-height:24px;padding:var(--padding-row-y) var(--padding-row-x);color:var(--color-token-description-foreground);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;align-items:center;line-height:1rem;display:flex;overflow:hidden}.provider-dropdown-item{width:100%;color:var(--color-token-foreground);text-align:left;background:0 0;border:0}.provider-dropdown-item:hover,.provider-dropdown-item:focus,.provider-dropdown-item[data-selected=true]{background:var(--color-token-list-hover-background)}.provider-dropdown-check{color:var(--color-token-foreground)}.permissions-root{flex:0 auto;min-width:0;display:inline-flex;position:relative}.permissions-trigger{color:var(--color-token-input-placeholder-foreground)}.permissions-trigger[data-permission-mode=auto-review],.permissions-item[data-permission-mode=auto-review] .permissions-item-icon{color:var(--color-token-text-link-foreground)}.permissions-trigger[data-permission-mode=full-access],.permissions-item[data-permission-mode=full-access] .permissions-item-icon{color:var(--agent-danger)}.permissions-trigger-label{color:currentColor;font-weight:500}.permissions-trigger-chevron{color:currentColor;opacity:.72}.permissions-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:13.5rem;max-height:min(250px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:0;overflow-y:auto}@supports (color:color-mix(in lab,red,red)){.permissions-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.permissions-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.permissions-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.permissions-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.permissions-item{width:100%;min-height:calc(var(--spacing) * 8);align-items:center;gap:calc(var(--spacing) * 2);color:var(--color-token-foreground);text-align:left;background:0 0;border:0;display:flex}.permissions-item:hover,.permissions-item:focus-visible,.permissions-item[data-selected=true]{background:var(--color-token-list-hover-background)}.permissions-item-icon,.permissions-item-check{color:var(--color-token-description-foreground);justify-content:center;align-items:center;display:inline-flex}.permissions-item-label{color:var(--color-token-foreground);font-weight:500}.add-context-root{flex:none;display:inline-flex;position:relative}.add-context-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:max-content;min-width:120px;max-width:min(320px,100vw - 16px);max-height:min(270px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:-8px;overflow-y:auto}@supports (color:color-mix(in lab,red,red)){.add-context-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.add-context-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.add-context-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.add-context-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.add-context-item{width:100%;min-height:calc(var(--spacing) * 8);align-items:center;gap:calc(var(--spacing) * 1.5);color:var(--color-token-foreground);cursor:var(--cursor-interaction);text-align:left;background:0 0;border:0;display:flex}.add-context-item:hover,.add-context-item:focus-visible{background:var(--color-token-list-hover-background)}.add-context-item:disabled{cursor:default;opacity:.5}.add-context-item:disabled:hover{background:0 0}.add-context-item-icon{color:var(--color-token-description-foreground);opacity:.75;justify-content:center;align-items:center;display:inline-flex}.add-context-item:hover .add-context-item-icon,.add-context-item:focus-visible .add-context-item-icon{opacity:1}.add-context-glyph{width:14px;height:14px;color:var(--color-token-description-foreground);font-size:var(--text-sm);justify-content:center;align-items:center;font-weight:700;line-height:1;display:inline-flex}.add-context-item-label{color:var(--color-token-foreground);font-weight:500}.add-context-item-detail{color:var(--color-token-description-foreground);font-size:var(--text-sm)}.add-context-separator{flex:none}.add-context-separator-line{background:var(--color-token-menu-border)}.provider-select{appearance:none;color:#0000;opacity:0;background:0 0;outline:none;width:100%;height:100%;position:absolute;inset:0}.composer-separator{background:var(--agent-border-strong);flex:none;width:1px;height:18px;margin:0 3px}@supports (color:color-mix(in lab,red,red)){.composer-separator{background:color-mix(in srgb,var(--agent-border-strong) 72%,transparent)}}.codex-start{width:auto;min-width:56px}.codex-circle-action:before{content:"";border:2px solid;border-radius:999px;width:13px;height:13px}.send-button{border-radius:999px}.provider-select:disabled{opacity:0}.rate-line{min-width:0;color:var(--agent-muted);gap:6px;padding:0 2px}@supports (color:color-mix(in lab,red,red)){.rate-line{color:color-mix(in srgb,var(--agent-muted) 88%,transparent)}}.rate-line{white-space:nowrap;font-size:12px;font-weight:500;line-height:1.35}.rate-line[hidden]{display:none}.rate-line :where(span){text-overflow:ellipsis;min-width:0;overflow:hidden}.codex-rate-limit-summary{flex-wrap:nowrap;justify-content:flex-start;overflow:hidden}.rate-limit-trigger{border-radius:var(--radius-md);max-width:100%;height:22px;color:var(--color-token-input-placeholder-foreground);border:0;padding:0 4px;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.rate-limit-trigger{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 94%,transparent)}}.rate-limit-trigger{font-size:var(--text-sm);background:0 0;font-weight:500;line-height:1}.rate-limit-trigger-inline{gap:6px;overflow:hidden}.rate-limit-trigger:hover,.rate-limit-trigger:focus-visible,.rate-limit-trigger[aria-expanded=true]{background:var(--color-token-list-hover-background);outline:none}.rate-limit-speedometer,.rate-limit-chevron{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-speedometer,.rate-limit-chevron{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 86%,transparent)}}.rate-line-heading{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-line-heading{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 92%,transparent)}}.rate-limit-inline-separator{color:var(--agent-accent);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-inline-separator{color:color-mix(in srgb,var(--agent-accent) 82%,transparent)}}.rate-limit-inline-segment{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.rate-limit-popover{color:var(--color-token-foreground)}.rate-limit-popover-title{color:var(--color-token-description-foreground);font-size:var(--text-xs);padding:2px 0 5px;font-weight:600}.rate-limit-popover-row{min-width:0;min-height:24px;color:var(--color-token-foreground);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;display:grid}.rate-limit-window{min-width:0;color:var(--color-token-foreground);text-overflow:ellipsis;font-weight:500;overflow:hidden}.rate-limit-row-value{min-width:0;color:var(--color-token-description-foreground);text-align:right;justify-content:flex-end;align-items:center;gap:5px;display:inline-flex}.rate-limit-percent{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-percent{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 92%,transparent)}}.rate-limit-percent{font-weight:600}.rate-limit-reset{min-width:0;color:var(--color-token-description-foreground)}.status-dot{background:var(--agent-muted);border-radius:999px;flex:none;width:6px;height:6px}.status-dot.running{background:var(--agent-accent)}.status-dot.failed{background:var(--agent-danger)}.codex-top-tray-shell{width:calc(var(--composer-top-tray-inline-padding,12px) * 2 + 100% + 8px);min-width:0;left:50%;bottom:var(--composer-top-tray-top-padding,14px);transform:translate(-50%)}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{width:100%;min-width:0;max-height:var(--composer-top-tray-max-height,177px);padding:var(--spacing);padding-top:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 2);border:1px solid var(--composer-top-tray-border,var(--color-token-border));flex-direction:column;display:flex;position:relative}@supports (color:color-mix(in lab,red,red)){.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{border:1px solid var(--composer-top-tray-border,color-mix(in srgb, var(--color-token-border) 72%, transparent))}}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl);color:var(--color-token-foreground);background:var(--composer-top-tray-background,var(--color-token-side-bar-background));border-top-color:#0000;border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0}@supports (color:color-mix(in lab,red,red)){.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{background:var(--composer-top-tray-background,color-mix(in oklab, var(--color-token-side-bar-background) 94%, transparent))}}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{box-shadow:none;font-size:var(--text-sm);-webkit-backdrop-filter:none;backdrop-filter:none;isolation:isolate;-webkit-user-select:none;user-select:none;--cmdk-bottom-item-radius:0;overflow:hidden}.codex-top-tray-title{padding:0 var(--padding-row-x) calc(var(--spacing) * 1.25);color:var(--color-token-description-foreground);font-size:var(--text-xs);font-weight:600;line-height:1.2}.codex-top-tray-list,.codex-top-tray-panel [cmdk-list],.codex-top-tray-panel [data-cmdk-list]{gap:var(--spacing);scrollbar-width:none;flex-direction:column;flex:1;width:100%;min-height:0;max-height:none;transition:none;display:flex;overflow-y:auto}.codex-top-tray-list::-webkit-scrollbar{display:none}.codex-top-tray-empty,.codex-top-tray-panel [data-cmdk-empty]{padding:var(--padding-row-y) var(--padding-row-x);color:var(--color-token-input-placeholder-foreground);font-size:var(--text-sm);align-items:center;display:flex}.codex-top-tray-item,.codex-top-tray-item[cmdk-item],.codex-top-tray-item[data-list-navigation-item]{width:calc(100% - var(--spacing) * 2);min-height:calc(var(--spacing) * 6);padding:var(--padding-row-y) var(--padding-row-x);border-radius:var(--radius-lg);color:var(--color-token-foreground);cursor:var(--cursor-interaction,default);font-size:var(--text-sm);opacity:.75;text-align:left;background:0 0;border:0;outline:none;flex-shrink:0;align-items:center;gap:0;display:flex;overflow:hidden}.codex-top-tray-item:hover,.codex-top-tray-item[data-selected=true],.codex-top-tray-item:focus-visible{background:var(--color-token-list-hover-background);opacity:1}.codex-top-tray-icon{width:14px;height:14px;color:var(--color-token-description-foreground);font-size:var(--text-sm);flex:none;justify-content:center;align-items:center;font-weight:700;line-height:1;display:inline-flex}.codex-top-tray-copy{align-items:center;gap:calc(var(--spacing) * 2);min-width:0;display:flex}.codex-top-tray-label,.codex-top-tray-detail{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.codex-top-tray-label{color:var(--color-token-foreground);font-size:var(--text-sm)}.codex-top-tray-detail{color:var(--color-token-description-foreground);font-size:var(--text-sm);flex:1 1 0}@media(max-width:720px){.agent-shell{padding:10px}.prompt-input{min-height:2.75rem;font-size:16px}.model-picker,.codex-tool,.codex-action{height:var(--spacing-token-button-composer)}.codex-tool,.codex-action{width:var(--spacing-token-button-composer)}.codex-tool{width:var(--spacing-token-button-composer-sm);height:var(--spacing-token-button-composer-sm)}.codex-left-rail{min-width:0}.codex-action-cluster{margin-left:auto}}@media(max-width:520px){.agent-log-line,.log-line{grid-template-columns:1fr;gap:2px}.model-picker{min-width:104px;max-width:168px}.codex-tool-skill,.codex-mic,.rate-dot,.rate-limit-reset{display:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}';function vp(n){Xs("agent-session",yp),jo(),document.documentElement.dataset.cmuxWebviewKind="agent-session",document.body.dataset.cmuxWebviewKind="agent-session";const e=Qs(()=>Pr.jsx(yu,{}));Ys.createRoot(n).render(Pr.jsx(Gs,{router:e}))}export{vp as mountAgentSessionSurface}; +`)}function Ou({copiedLabel:n,copyLabel:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=r?n:e,a=b.useCallback(c=>{c!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),l=b.useCallback(c=>{c.stopPropagation(),navigator.clipboard?.writeText(t)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},2e3)},[t]);return f("button",{ref:a,type:"button",className:`codex-shell-copy ${ee} ${te} ${ln} rounded-full electron:rounded-md hover:bg-transparent hover:text-token-button-foreground`,"aria-label":s,title:s,onClick:l},r?Ze("icon-xxs"):xn("icon-xxs"))}function Tu({label:n,output:e}){"use no memo";const[t,r]=b.useState(!1),o=b.useRef(null),i=b.useCallback(a=>{a!==null||o.current===null||(window.clearTimeout(o.current),o.current=null)},[]),s=b.useCallback(a=>{a.stopPropagation(),navigator.clipboard?.writeText(e)?.catch(()=>{}),r(!0),o.current!==null&&window.clearTimeout(o.current),o.current=window.setTimeout(()=>{r(!1),o.current=null},2e3)},[e]);return f("button",{ref:i,type:"button",className:`codex-tool-output-copy ${ee} ${te} rounded-full electron:rounded-md electron:p-1 electron:[&>svg]:icon-sm flex items-center justify-center p-0.5 absolute top-0 right-2.5 opacity-0 transition-opacity duration-200 group-hover/output:opacity-100${t?" text-token-foreground opacity-100":""}`,"aria-label":n,title:n,onClick:s},t?Ze("icon-2xs"):xn("icon-2xs"))}function Du({copy:n,sentAtMs:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=n?.copyUserMessage??"",a=n?.copiedUserMessage??"",l=r?a:s,c=e==null?null:Os(e),d=b.useCallback(p=>{p!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),u=b.useCallback(()=>{const p=t.trim();if(!p)return;navigator.clipboard?.writeText(p)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},1500)},[t]);return f("div",{className:"codex-user-message-actions flex flex-row-reverse items-center gap-1"},f("div",{className:"mr-1 ms-1 flex items-center gap-2 opacity-0 group-focus-within:opacity-100 group-hover:opacity-100"},c==null?null:f("span",{className:"text-xs text-token-text-tertiary"},c),f("button",{ref:d,type:"button",className:`codex-user-message-action-button ${ee} ${te} ${ln} rounded-full electron:rounded-md`,"aria-label":l,title:l,onClick:u},r?Ze("icon-xs"):xn("icon-xs"))))}function Eu({copy:n,sentAtMs:e,text:t}){"use no memo";const[r,o]=b.useState(!1),i=b.useRef(null),s=n?.copyAssistantMessage??"",a=n?.copiedAssistantMessage??s,l=r?a:s,c=e==null?null:Os(e),d=b.useCallback(p=>{p!==null||i.current===null||(window.clearTimeout(i.current),i.current=null)},[]),u=b.useCallback(()=>{const p=t.trim();if(!p)return;navigator.clipboard?.writeText(p)?.catch(()=>{}),o(!0),i.current!==null&&window.clearTimeout(i.current),i.current=window.setTimeout(()=>{o(!1),i.current=null},2e3)},[t]);return f("div",{className:"codex-assistant-message-actions mt-1.5 flex h-5 items-center justify-start gap-0.5 opacity-0 group-focus-within:opacity-100 group-hover:opacity-100"},f("button",{ref:d,type:"button",className:`codex-assistant-message-action-button ${ee} ${te} ${ln} rounded-full electron:rounded-md`,"aria-label":l,title:l,onClick:u},r?Ze("icon-xs"):xn("icon-xs")),c==null?null:f("span",{className:"ml-1.5 flex h-full items-center text-size-chat leading-5 text-token-input-placeholder-foreground"},c))}function Os(n,e=new Date){const t=new Date(n),r=Au(t,e);return r===0?new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit"}).format(t):r<0&&r>-7?new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit",weekday:"long"}).format(t):new Intl.DateTimeFormat(void 0,{day:"numeric",hour:"numeric",minute:"2-digit",month:"short"}).format(t)}function Au(n,e){const t=new Date(n.getFullYear(),n.getMonth(),n.getDate()),r=new Date(e.getFullYear(),e.getMonth(),e.getDate());return Math.round((t.getTime()-r.getTime())/864e5)}function Ru({copy:n,text:e}){"use no memo";const[t,r]=b.useState(!1),o=Iu(e),i=o&&!t,s=n?.showMore??"",a=n?.showLess??"",l=b.useCallback(()=>{r(c=>!c)},[]);return f("div",{className:"flex flex-col items-end gap-1"},f("div",{className:"codex-user-message-content text-size-chat relative w-full min-w-0 mb-px","data-collapsed":i?"true":void 0,dangerouslySetInnerHTML:{__html:Be(e)}}),o?f("button",{type:"button","aria-expanded":t,className:"codex-user-message-toggle text-size-chat mt-1.5 inline-flex cursor-interaction items-center gap-1 self-start text-token-description-foreground hover:text-token-foreground",onClick:l},f("span",null,t?a:s),gn(`icon-2xs${t?" rotate-180":""}`)):null)}function Iu(n){return n.split(/\r\n|\r|\n/).length>uu||n.length>1600}function Lu({attachments:n}){return f("div",{className:"codex-user-message-attachments flex max-w-[77%] flex-row-reverse flex-wrap items-center gap-1"},n.map(e=>f(Pu,{attachment:e,key:e.id})))}function Pu({attachment:n}){return n.kind==="image"&&n.dataUrl?f("div",{className:"user-message-image-attachment flex size-16 items-center justify-center rounded-lg border border-token-border",title:n.label},f("img",{alt:n.label,className:"h-full w-full rounded-md object-cover",referrerPolicy:"no-referrer",src:n.dataUrl})):f("div",{className:"user-message-file-attachment bg-token-dropdown-background border-token-border inline-flex max-w-[320px] items-center gap-1 rounded-full border px-2 py-1.5 text-sm",title:n.path},f("span",{className:"text-token-input-placeholder-foreground flex-shrink-0","aria-hidden":!0},Sr("icon-2xs")),f("span",{className:"flex max-w-full min-w-0 items-center gap-1"},f("span",{className:"truncate"},n.label)))}function zu({attachments:n,className:e,copy:t,onRemove:r}){return f("div",{className:`codex-attachment-tray w-full overflow-x-auto${e?` ${e}`:""}`,"data-composer-attachments-row":!0},f("div",{className:"codex-attachment-row flex min-w-max items-end gap-2"},n.map(o=>f(Fu,{attachment:o,copy:t,key:o.id,onRemove:r}))))}function Fu({attachment:n,copy:e,onRemove:t}){const r=`${e?.removeAttachment??"Remove attachment"} ${n.label}`,o=t?f("button",{className:"composer-attachment-remove",type:"button","aria-label":r,onClick:()=>t(n.id),onMouseDown:i=>i.preventDefault()},bn("icon-2xs")):null;return n.kind==="image"&&n.dataUrl?f("div",{className:"composer-attachment-image",title:n.label},f("img",{alt:"","aria-hidden":!0,src:n.dataUrl}),o):f("div",{className:"composer-attachment-file",title:n.path},f("span",{className:"composer-attachment-file-icon","aria-hidden":!0},Sr("icon-xs")),f("span",{className:"composer-attachment-file-label"},n.label),o)}function Bu(n){const e=Et.c(6),{state:t,providerDisplayName:r}=n,i=(t.context?.rateLimitRows??[]).map(La),s=t.context?.copy,[a,l]=b.useState(!1);if(i.length===0)return null;const c=s?.rateLimits??"Rate limits";let d;e[0]!==t?(d=ja(t),e[0]=t,e[1]=d):d=e[1];let u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=m=>{m.currentTarget.contains(m.relatedTarget)||l(!1)},e[2]=u):u=e[2];let p;e[3]===Symbol.for("react.memo_cache_sentinel")?(p=()=>l(Vu),e[3]=p):p=e[3];let h;return e[4]!==t?(h=(m,g)=>[g>0?f("span",{key:`${m.role}-separator`,className:"rate-limit-inline-separator","aria-hidden":!0},"•"):null,f(_u,{key:m.role,row:m,state:t})],e[4]=t,e[5]=h):h=e[5],f("div",{className:"rate-line codex-rate-limit-summary relative",role:"status","aria-label":`${r} ${d}`.trim(),onBlur:u},f("button",{className:"rate-limit-trigger rate-limit-trigger-inline flex min-w-0 items-center gap-1",type:"button","aria-expanded":a,onClick:p},f("span",{className:"rate-line-heading"},c),i.flatMap(h)),a?f("div",{className:"rate-limit-popover absolute bottom-[calc(100%+6px)] left-0 z-50 flex min-w-56 flex-col gap-1 rounded-xl border border-token-border bg-token-dropdown-background/95 px-3 py-2 text-sm shadow-xl-spread backdrop-blur-sm"},f("div",{className:"rate-limit-popover-title"},c),i.map(m=>f($u,{key:m.role,row:m,state:t}))):null)}function Vu(n){return!n}function _u({row:n,state:e}){const t=n,r=e.context?.copy,o=t.role==="primary"?r?.rateLimitPrimary??"Primary":r?.rateLimitSecondary??"Secondary",i=ti(t.windowDurationMins,o,{weekly:r?.rateLimitWeekly??"Weekly",monthly:r?.rateLimitMonthly??"Monthly",daysFormat:r?.rateLimitDaysFormat??"",hoursFormat:r?.rateLimitHoursFormat??"",minutesFormat:r?.rateLimitMinutesFormat??""}),s=ei(t.resetsAt);return f("span",{className:"rate-limit-inline-segment"},f("span",{className:"rate-limit-window"},i),f("span",{className:"rate-limit-percent"},Qo(t.remainingPercent)),s?f("span",{className:"rate-limit-reset"},`${r?.rateLimitResets??"resets"} ${s}`):null)}function $u({row:n,state:e}){const t=n,r=e.context?.copy,o=t.role==="primary"?r?.rateLimitPrimary??"Primary":r?.rateLimitSecondary??"Secondary",i=ti(t.windowDurationMins,o,{weekly:r?.rateLimitWeekly??"Weekly",monthly:r?.rateLimitMonthly??"Monthly",daysFormat:r?.rateLimitDaysFormat??"",hoursFormat:r?.rateLimitHoursFormat??"",minutesFormat:r?.rateLimitMinutesFormat??""}),s=ei(t.resetsAt);return f("div",{className:"rate-limit-popover-row"},f("span",{className:"rate-limit-window"},i),f("span",{className:"rate-limit-row-value"},f("span",{className:"rate-limit-percent"},Qo(t.remainingPercent)),s?f("span",{className:"rate-limit-reset"},`${r?.rateLimitResets??"resets"} ${s}`):null))}function Wu({emptyLabel:n,highlightedIndex:e,items:t,onChoose:r,onHighlight:o,query:i}){return f("div",{className:"codex-top-tray-shell absolute z-20"},f("div",{className:"codex-top-tray-panel","cmdk-root":"","data-cmdk-root":!0},f("div",{className:"codex-top-tray-list","cmdk-list":"","data-cmdk-list":!0},t.length===0?f("div",{className:"codex-top-tray-empty","cmdk-empty":"","data-cmdk-empty":!0,"data-command-menu-empty-state":"true"},n):t.map((s,a)=>{const l=s.detail?"codex-top-tray-label max-w-[60%] flex-none truncate":"codex-top-tray-label min-w-0 flex-1 truncate",c=sp(s.label,i),d=c.some(u=>!u.isMatch);return f("button",{key:s.id,className:"codex-top-tray-item",type:"button","aria-selected":a===e?"true":void 0,"cmdk-item":"","data-selected":a===e?"true":void 0,"data-list-navigation-item":!0,onMouseEnter:()=>o(a),onMouseDown:u=>u.preventDefault(),onClick:()=>r(s)},f("div",{className:"codex-top-tray-copy flex w-full items-center gap-2"},f("span",{className:"codex-top-tray-icon icon-xs shrink-0","aria-hidden":!0},s.icon),f("div",{className:l},c.map((u,p)=>f("span",{key:`${u.text}-${p}`,className:!u.isMatch&&d?"text-token-description-foreground":void 0},u.text))),s.detail?f("span",{className:"codex-top-tray-detail min-w-0 flex-1 truncate text-sm text-token-description-foreground"},s.detail):null))}))))}function Wo({icon:n,label:e,onClear:t}){return f("div",{className:"composer-mode-indicator flex min-w-0 items-center gap-1"},f("div",{className:"composer-mode-divider","aria-hidden":!0}),f("button",{className:`composer-mode-button group ${ee} ${te} ${Oe} rounded-full`,type:"button","aria-label":e,onClick:t},f("span",{className:"composer-mode-icon composer-mode-icon-default icon-xs shrink-0","aria-hidden":!0},n),f("span",{className:"composer-mode-icon composer-mode-icon-hover icon-xs shrink-0","aria-hidden":!0},bn("icon-xs")),f("span",{className:"composer-footer__label--sm composer-mode-label max-w-16 truncate"},e)))}function Hu({hideLabel:n,label:e,onClear:t}){return f("button",{className:`composer-context-button group ${ee} ${te} ${Oe} min-w-0 rounded-full`,type:"button","aria-label":e,title:e,onClick:t},f("span",{className:"composer-context-icon composer-context-icon-default icon-xs shrink-0","aria-hidden":!0},Es("icon-xs")),f("span",{className:"composer-context-icon composer-context-icon-hover icon-xs shrink-0","aria-hidden":!0},bn("icon-xs")),n?null:f("span",{className:"composer-footer__label--sm composer-context-label max-w-20 truncate"},e))}function qu({copy:n,hideLabel:e=!1,isEnabled:t,isOpen:r,mode:o,onModeChange:i,onOpenChange:s}){const a=n?.changePermissions??"Change permissions",l=Uo(n,o),c=t?["default","auto-review","full-access","custom"]:[],d=e?oa:Oe,u=h=>{i(h),s(!1)},p=t&&r;return f("div",{className:"permissions-root relative inline-flex",onBlur:h=>{t&&!h.currentTarget.contains(h.relatedTarget)&&s(!1)}},f("button",{className:`permissions-trigger ${ee} ${te} ${d} ${e?Kt:"min-w-0"} rounded-full`,type:"button","aria-label":a,"aria-haspopup":t?"menu":void 0,"aria-expanded":t?p:void 0,"aria-disabled":t?void 0:!0,"data-permission-mode":o,"data-state":p?"open":"closed",disabled:!t,onClick:()=>{t&&s(!p)},onKeyDown:h=>{t&&(h.key==="ArrowDown"&&(h.preventDefault(),s(!0)),h.key==="Escape"&&(h.preventDefault(),s(!1)))}},Ds(o,"icon-xs shrink-0"),e?null:f("span",{className:"permissions-trigger-label composer-footer__label--xs max-w-40 truncate whitespace-nowrap text-left"},l),t?f("span",{className:"permissions-trigger-chevron icon-2xs shrink-0","aria-hidden":!0},gn()):null),p?f("div",{className:"permissions-dropdown _content_1hiti_1 no-drag bg-token-dropdown-background/90 text-token-foreground ring-token-border z-50 m-px flex select-none flex-col overflow-y-auto rounded-xl ring-[0.5px] px-1 py-1 shadow-xl-spread backdrop-blur-sm",role:"menu","aria-label":a,"data-state":"open","data-side":"top",style:{"--radix-dropdown-menu-content-transform-origin":"left bottom"}},c.map(h=>f(Ju,{isSelected:h===o,key:h,label:Uo(n,h),mode:h,onSelect:()=>u(h)}))):null)}function Ju({isSelected:n,label:e,mode:t,onSelect:r}){return f("button",{className:"permissions-item no-drag group hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",type:"button",role:"menuitemradio","aria-checked":n,"data-permission-mode":t,"data-selected":n?"true":void 0,onMouseDown:o=>o.preventDefault(),onClick:r},f("span",{className:"permissions-item-icon icon-xs shrink-0","aria-hidden":!0},Ds(t,"icon-xs shrink-0")),f("span",{className:"permissions-item-label min-w-0 flex-1 truncate"},e),n?f("span",{className:"permissions-item-check icon-xs shrink-0","aria-hidden":!0},Ze()):null)}function Uu({hasIdeContext:n,isAutoContextOn:e,isOpen:t,isPickingFiles:r,isPlanMode:o,onOpenChange:i,onPickFiles:s,onToggleAutoContext:a,onTogglePlanMode:l,state:c}){const d=c.context?.copy,u=d?.addFilesAndMore??"Add files and more",p=d?.addPhotosAndFiles??"Add photos & files",m=Cr("skill",c,"").find(g=>g.id==="plan")??null;return f("div",{className:"add-context-root relative inline-flex",onBlur:g=>{g.currentTarget.contains(g.relatedTarget)||i(!1)}},f("button",{className:`codex-tool codex-tool-plus ${ee} ${te} ${Oe} ${Kt} rounded-full`,type:"button","aria-label":u,"aria-haspopup":"menu","aria-expanded":t,"data-state":t?"open":"closed",onClick:()=>i(!t),onKeyDown:g=>{g.key==="ArrowDown"&&(g.preventDefault(),i(!0)),g.key==="Escape"&&(g.preventDefault(),i(!1))}},fp()),t?f("div",{className:"add-context-dropdown _content_1hiti_1 no-drag bg-token-dropdown-background/90 text-token-foreground ring-token-border z-50 m-px flex select-none flex-col overflow-y-auto rounded-xl ring-[0.5px] px-1 py-1 shadow-xl-spread backdrop-blur-sm",role:"menu","aria-label":u,"data-state":"open","data-side":"top",style:{"--radix-dropdown-menu-content-transform-origin":"left bottom"}},f(ju,{disabled:r,icon:Sr("icon-xs"),label:p,onSelect:s}),n||m?f(Ku):null,n?f(Ho,{checked:e,icon:Es("icon-sm"),label:d?.includeIdeContext??"Include IDE context",onSelect:a}):null,m?f(Ho,{checked:o,icon:an(),label:d?.planMode??"Plan mode",onSelect:l}):null):null)}function ju({detail:n,disabled:e=!1,icon:t,label:r,onSelect:o}){return f("button",{className:"add-context-item group no-drag hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",disabled:e,type:"button",role:"menuitem",onMouseDown:i=>i.preventDefault(),onClick:e?void 0:o},f("span",{className:"add-context-item-icon icon-xs shrink-0","aria-hidden":!0},t),f("span",{className:"add-context-item-copy flex min-w-0 flex-1 items-center gap-2"},f("span",{className:"add-context-item-label min-w-0 truncate"},r),n?f("span",{className:"add-context-item-detail min-w-0 flex-1 truncate text-token-description-foreground"},n):null))}function Ho({checked:n,icon:e,label:t,onSelect:r}){const o=n?"checked":"unchecked",i=n?"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-token-charts-blue transition-colors duration-200 ease-out":"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-token-foreground/10 transition-colors duration-200 ease-out";return f("button",{className:"add-context-item group no-drag hover:bg-token-list-hover-background focus:bg-token-list-hover-background cursor-interaction text-token-foreground outline-hidden rounded-lg px-[var(--padding-row-x)] py-[var(--padding-row-y)] text-sm",type:"button",role:"menuitemcheckbox","aria-checked":n,onMouseDown:s=>s.preventDefault(),onClick:r},f("span",{className:"add-context-item-icon icon-xs shrink-0","aria-hidden":!0},e),f("span",{className:"add-context-switch-row flex w-full min-w-0 items-center justify-between gap-2"},f("span",{className:"flex min-w-0 items-center gap-2"},f("span",{className:"add-context-item-label min-w-0 truncate"},t)),f("span",{className:i,"data-state":o,"aria-hidden":!0},f("span",{className:"h-3 w-3 rounded-full border border-[color:var(--gray-0)] bg-[color:var(--gray-0)] shadow-sm transition-transform duration-200 ease-out data-[state=unchecked]:translate-x-[2px] data-[state=checked]:translate-x-[14px]","data-state":o}))))}function Ku(){return f("div",{className:"add-context-separator w-full px-[var(--padding-row-x)] py-1",role:"separator"},f("div",{className:"add-context-separator-line h-[1px] w-full bg-token-menu-border"}))}function Zu(n){return Cr("mention",n,"").find(e=>e.id==="workspace")??null}function Cr(n,e,t){const r=e.context?.copy,o=n==="mention"?[...e.context?.workingDirectory?[{id:"workspace",icon:hp("icon-xs"),label:r?.mentionCurrentWorkspace??"Current workspace",detail:jt(e.context.workingDirectory),mention:{kind:"at",label:jt(e.context.workingDirectory),name:jt(e.context.workingDirectory),path:e.context.workingDirectory,fsPath:e.context.workingDirectory}}]:[],...e.providers.map(i=>({id:i.id,icon:Ia(i),label:i.displayName,detail:i.executableName,mention:{kind:"agent",label:i.displayName,name:i.id,displayName:i.displayName,path:`provider://${i.id}`,description:i.executableName}}))]:[{id:"plan",icon:"$",label:r?.skillPlan??"Plan",detail:"$plan",mention:{kind:"skill",label:"Plan",name:"plan",displayName:"Plan",path:"skill://plan"}},{id:"review",icon:"$",label:r?.skillCodeReview??"Code review",detail:"$codex-review",mention:{kind:"skill",label:"Code review",name:"codex-review",displayName:"Code review",path:"skill://codex-review"}},{id:"research",icon:"$",label:r?.skillResearch??"Research",detail:"$research",mention:{kind:"skill",label:"Research",name:"research",displayName:"Research",path:"skill://research"}}];return Yu(o,t)}function Yu(n,e){const t=e.trim();return t?n.map(r=>({item:r,score:ip(r.label,t,[r.detail,r.mention.name])})).filter(({score:r})=>r>0).sort((r,o)=>o.score-r.score).map(({item:r})=>r):n}const qo=1,Gu=.9,Xu=.8,Qu=.17,_n=.1,$n=.999,ep=.9999,tp=.99,np=/[\\/_+.#"@[({&]/,rp=/[\\/_+.#"@[({&]/g,op=/[\s-]/,Ts=/[\s-]/g;function ip(n,e,t){const r=t.length>0?`${n} ${t.join(" ")}`:n;return ir(r,e,Jo(r),Jo(e),0,0,{})}function Jo(n){return n.toLowerCase().replace(Ts," ")}function ir(n,e,t,r,o,i,s){if(i===e.length)return o===n.length?qo:tp;const a=`${o},${i}`;if(s[a]!==void 0)return s[a];const l=r.charAt(i);let c=t.indexOf(l,o),d=0;for(;c>=0;){let u=ir(n,e,t,r,c+1,i+1,s);if(u>d){if(c===o)u*=qo;else if(np.test(n.charAt(c-1))){u*=Xu;const p=n.slice(o,c-1).match(rp);p&&o>0&&(u*=$n**p.length)}else if(op.test(n.charAt(c-1))){u*=Gu;const p=n.slice(o,c-1).match(Ts);p&&o>0&&(u*=$n**p.length)}else u*=Qu,o>0&&(u*=$n**(c-o));n.charAt(c)!==e.charAt(i)&&(u*=ep)}if(u<_n&&t.charAt(c-1)===r.charAt(i+1)||r.charAt(i+1)===r.charAt(i)&&t.charAt(c-1)!==r.charAt(i)){const p=ir(n,e,t,r,c+1,i+2,s);p*_n>u&&(u=p*_n)}u>d&&(d=u),c=t.indexOf(l,c+1)}return s[a]=d,d}function sp(n,e){const t=Array.from(n),r=e.trim();if(!r)return t.map(l=>({isMatch:!0,text:l}));const o=t.map(l=>l.toLowerCase()),i=Array.from(r.toLowerCase());let s=-1;for(let l=0;l<=o.length-i.length;l+=1)if(i.every((c,d)=>o[l+d]===c)){s=l;break}if(s>=0){const l=s+i.length;return t.map((c,d)=>({isMatch:d>=s&&d{const c=a{const r=`${t.kind}:${t.path}`;return e.has(r)?!1:(e.add(r),!0)})}function lp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M9.33467 16.6663V4.93978L4.6374 9.63704L4.1667 9.16634L3.69599 8.69661L9.52998 2.86263L9.63447 2.77767C9.8925 2.60753 10.2433 2.63564 10.4704 2.86263L16.3034 8.69661L16.3884 8.80111C16.5588 9.05922 16.5306 9.40982 16.3034 9.63704C16.0762 9.86414 15.7255 9.89242 15.4675 9.722L15.363 9.63704L10.6647 4.9388V16.6663C10.6647 17.0336 10.367 17.3314 9.99971 17.3314C9.63259 17.3312 9.33467 17.0335 9.33467 16.6663ZM4.6374 9.63704C4.3777 9.89674 3.95569 9.89674 3.69599 9.63704C3.43657 9.37744 3.43668 8.95628 3.69599 8.69661L4.6374 9.63704Z",fill:"currentColor"}))}function cp(){return f("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":!0},f("rect",{x:"4.75",y:"4.75",width:"6.5",height:"6.5",rx:"1",fill:"currentColor"}))}function dp(){return f("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none","aria-hidden":!0},f("path",{d:"M8 2.25a2 2 0 0 0-2 2v3.25a2 2 0 1 0 4 0V4.25a2 2 0 0 0-2-2ZM4 7.5a4 4 0 0 0 8 0M8 11.5v2.25",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"}))}function up(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M10 5.14295V14.8441M10 5.14295C10 1.98209 14.8475 1.94468 14.8475 5.07797L14.8473 5.1067C17.1367 5.43539 18.0436 7.54498 16.4225 9.14006C17.8633 10.5577 17.3503 13.9054 15.4449 14.6301C14.8475 17.6527 10.8056 18.4821 10 14.8441M10 5.14295C10 1.98209 5.15249 1.94468 5.15249 5.07797L5.15265 5.1067C2.86325 5.43539 1.95642 7.54498 3.57746 9.14006C2.13674 10.5577 2.64974 13.9054 4.5551 14.6301C5.15249 17.6527 9.19444 18.4821 10 14.8441",stroke:"currentColor",strokeLinejoin:"round",strokeWidth:"1.33"}))}function gn(n="icon-2xs"){return f("svg",{className:n,width:"20",height:"21",viewBox:"0 0 20 21",fill:"none","aria-hidden":!0},f("path",{d:"M15.2793 7.71101C15.539 7.45131 15.961 7.45131 16.2207 7.71101C16.4804 7.97071 16.4804 8.39272 16.2207 8.65242L10.4707 14.4024C10.211 14.6621 9.78902 14.6621 9.52932 14.4024L3.77932 8.65242L3.69436 8.54792C3.52385 8.28979 3.55205 7.93828 3.77932 7.71101C4.00659 7.48374 4.3581 7.45554 4.61623 7.62605L4.72073 7.71101L10 12.9903L15.2793 7.71101Z",fill:"currentColor",stroke:"currentColor",strokeWidth:"0.6"}))}function pp(n="icon-2xs"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M7.52925 3.7793C7.75652 3.55203 8.10803 3.52383 8.36616 3.69434L8.47065 3.7793L14.2207 9.5293C14.4804 9.789 14.4804 10.211 14.2207 10.4707L8.47065 16.2207C8.21095 16.4804 7.78895 16.4804 7.52925 16.2207C7.26955 15.961 7.26955 15.539 7.52925 15.2793L12.8085 10L7.52925 4.7207L7.44429 4.61621C7.27378 4.35808 7.30198 4.00657 7.52925 3.7793Z",fill:"currentColor"}))}function xn(n="icon-sm"){return f("svg",{className:n,width:"21",height:"21",viewBox:"0 0 21 21",fill:"none","aria-hidden":!0},f("path",{d:"M13.468 11.1216C13.468 10.4107 13.468 9.91717 13.4367 9.53369C13.4137 9.25191 13.3758 9.0622 13.3244 8.91846L13.2687 8.78858C13.1148 8.48652 12.8803 8.23344 12.593 8.05713L12.466 7.98584C12.308 7.90546 12.0963 7.84854 11.7209 7.81787C11.3374 7.78656 10.8439 7.78662 10.133 7.78662H7.29999C6.58895 7.78662 6.09562 7.78654 5.7121 7.81787C5.43015 7.84091 5.24064 7.87872 5.09686 7.93018L4.96698 7.98584C4.66487 8.13977 4.41184 8.37419 4.23554 8.66162L4.16522 8.78858C4.08477 8.94657 4.02794 9.15811 3.99725 9.53369C3.96594 9.91718 3.96503 10.4107 3.96503 11.1216V13.9546C3.96503 14.6656 3.96592 15.159 3.99725 15.5425C4.02796 15.9182 4.08471 16.1296 4.16522 16.2876L4.23554 16.4136C4.41185 16.7012 4.66472 16.9353 4.96698 17.0894L5.09686 17.146C5.24061 17.1974 5.43024 17.2343 5.7121 17.2573C6.09562 17.2887 6.58895 17.2896 7.29999 17.2896H10.133C10.8439 17.2896 11.3374 17.2886 11.7209 17.2573C12.0965 17.2266 12.308 17.1698 12.466 17.0894L12.593 17.019C12.8804 16.8427 13.1148 16.5897 13.2687 16.2876L13.3244 16.1577C13.3759 16.0139 13.4137 15.8244 13.4367 15.5425C13.468 15.159 13.468 14.6656 13.468 13.9546V11.1216ZM14.798 13.1196C15.2528 13.118 15.6011 13.1147 15.8879 13.0913C16.2634 13.0606 16.475 13.0038 16.633 12.9233L16.759 12.8521C17.0466 12.6757 17.2808 12.4228 17.4348 12.1206L17.4914 11.9907C17.5428 11.847 17.5797 11.6572 17.6027 11.3755C17.634 10.992 17.6349 10.4985 17.6349 9.7876V6.95459C17.6349 6.24355 17.6341 5.75022 17.6027 5.3667C17.5797 5.08484 17.5428 4.89522 17.4914 4.75147L17.4348 4.62158C17.2807 4.31933 17.0466 4.06645 16.759 3.89014L16.633 3.81982C16.475 3.73932 16.2636 3.68256 15.8879 3.65186C15.5044 3.62052 15.011 3.61963 14.3 3.61963H11.467C10.7561 3.61963 10.2626 3.62054 9.87909 3.65186C9.59738 3.67487 9.40759 3.71179 9.26386 3.76318L9.13397 3.81982C8.83175 3.97382 8.57885 4.20802 8.40253 4.49561L8.33124 4.62158C8.25079 4.77957 8.19396 4.99114 8.16327 5.3667C8.13984 5.65352 8.13561 6.00178 8.13397 6.45654H10.133C10.822 6.45654 11.3791 6.4559 11.8293 6.49268C12.2873 6.5301 12.6937 6.6093 13.0705 6.80127L13.2883 6.92334C13.7839 7.22739 14.1878 7.66313 14.4533 8.18408L14.5197 8.32666C14.6642 8.66318 14.7291 9.02433 14.7619 9.42529C14.7987 9.8755 14.798 10.4326 14.798 11.1216V13.1196ZM18.965 9.7876C18.965 10.4766 18.9657 11.0337 18.9289 11.4839C18.8961 11.8848 18.8311 12.246 18.6867 12.5825L18.6203 12.7251C18.3548 13.246 17.9509 13.6818 17.4553 13.9858L17.2365 14.1079C16.8599 14.2998 16.4541 14.3791 15.9963 14.4165C15.6592 14.444 15.2624 14.4481 14.7951 14.4497C14.7935 14.917 14.7894 15.3138 14.7619 15.6509C14.7292 16.0516 14.664 16.4122 14.5197 16.7485L14.4533 16.8911C14.1878 17.4122 13.7841 17.8487 13.2883 18.1528L13.0705 18.2749C12.6937 18.4669 12.2873 18.5461 11.8293 18.5835C11.3791 18.6203 10.822 18.6196 10.133 18.6196H7.29999C6.6109 18.6196 6.05394 18.6203 5.6037 18.5835C5.20305 18.5508 4.84233 18.4855 4.50604 18.3413L4.36347 18.2749C3.84243 18.0094 3.40584 17.6056 3.10175 17.1099L2.97968 16.8911C2.78787 16.5145 2.70849 16.1087 2.67108 15.6509C2.6343 15.2006 2.63495 14.6437 2.63495 13.9546V11.1216C2.63495 10.4326 2.63431 9.8755 2.67108 9.42529C2.7085 8.96729 2.78771 8.56084 2.97968 8.18408L3.10175 7.96631C3.40585 7.47049 3.84235 7.06679 4.36347 6.80127L4.50604 6.73486C4.84236 6.59059 5.20302 6.52542 5.6037 6.49268C5.9405 6.46516 6.33707 6.4601 6.80389 6.4585C6.8055 5.99167 6.81056 5.5951 6.83807 5.2583C6.87549 4.80047 6.95482 4.39471 7.14667 4.01807L7.26874 3.79932C7.5728 3.30371 8.00855 2.89973 8.52948 2.63428L8.67206 2.56787C9.00854 2.42345 9.36978 2.35844 9.77069 2.32568C10.2209 2.28891 10.778 2.28955 11.467 2.28955H14.3C14.9891 2.28955 15.546 2.2889 15.9963 2.32568C16.4541 2.3631 16.8599 2.44247 17.2365 2.63428L17.4553 2.75635C17.951 3.06044 18.3548 3.49703 18.6203 4.01807L18.6867 4.16065C18.8309 4.49694 18.8962 4.85765 18.9289 5.2583C18.9657 5.70854 18.965 6.2655 18.965 6.95459V9.7876Z",fill:"currentColor"}))}function Ze(n){return f("svg",{className:n,width:"17",height:"17",viewBox:"0 0 17 17",fill:"none","aria-hidden":!0},f("path",{d:"M12.8961 3.64101C13.1297 3.41418 13.4984 3.37523 13.7779 3.56581C14.0571 3.75635 14.1554 4.11331 14.0299 4.41347L13.9615 4.53847L7.71151 13.7045C7.59411 13.8767 7.4063 13.9877 7.19881 14.0072C6.99136 14.0267 6.78564 13.9533 6.63826 13.806L2.88826 10.056L2.79842 9.9457C2.6192 9.67407 2.64927 9.30496 2.88826 9.06581C3.12738 8.82669 3.49647 8.79676 3.76815 8.97597L3.8785 9.06581L7.03084 12.2182L12.8053 3.74941L12.8961 3.64101Z",fill:"currentColor"}))}function bn(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M5.96967 5.96967C6.26256 5.67678 6.73744 5.67678 7.03033 5.96967L10 8.93934L12.9697 5.96967C13.2626 5.67678 13.7374 5.67678 14.0303 5.96967C14.3232 6.26256 14.3232 6.73744 14.0303 7.03033L11.0607 10L14.0303 12.9697C14.3232 13.2626 14.3232 13.7374 14.0303 14.0303C13.7374 14.3232 13.2626 14.3232 12.9697 14.0303L10 11.0607L7.03033 14.0303C6.73744 14.3232 6.26256 14.3232 5.96967 14.0303C5.67678 13.7374 5.67678 13.2626 5.96967 12.9697L8.93934 10L5.96967 7.03033C5.67678 6.73744 5.67678 6.26256 5.96967 5.96967Z",fill:"currentColor"}))}function fp(){return f("svg",{className:"icon-sm",width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M9.33496 16.5V10.665H3.5C3.13273 10.665 2.83496 10.3673 2.83496 10C2.83496 9.63273 3.13273 9.33496 3.5 9.33496H9.33496V3.5C9.33496 3.13273 9.63273 2.83496 10 2.83496C10.3673 2.83496 10.665 3.13273 10.665 3.5V9.33496H16.5L16.6338 9.34863C16.9369 9.41057 17.165 9.67857 17.165 10C17.165 10.3214 16.9369 10.5894 16.6338 10.6514L16.5 10.665H10.665V16.5C10.665 16.8673 10.3673 17.165 10 17.165C9.63273 17.165 9.33496 16.8673 9.33496 16.5Z",fill:"currentColor"}))}function Sr(n="icon-sm"){return f("svg",{className:n,width:"21",height:"21",viewBox:"0 0 21 21",fill:"none","aria-hidden":!0},f("path",{d:"M4.43945 12.8041V7.68261C4.43945 7.30642 4.74446 7.00141 5.12066 7.00141C5.49685 7.00141 5.80186 7.30642 5.80186 7.68261V12.8041C5.80186 15.2565 7.78984 17.2445 10.2422 17.2445C12.6945 17.2445 14.6825 15.2565 14.6825 12.8041V5.9751C14.6823 4.46587 13.4589 3.24247 11.9497 3.24229C10.4403 3.24229 9.21606 4.46576 9.21588 5.9751V12.8041C9.21588 13.3708 9.67553 13.8304 10.2422 13.8304C10.8088 13.8304 11.2685 13.3708 11.2685 12.8041V7.68261C11.2685 7.30642 11.5735 7.00141 11.9497 7.00141C12.3257 7.00159 12.6309 7.30653 12.6309 7.68261V12.8041C12.6309 14.1232 11.5612 15.1929 10.2422 15.1929C8.92314 15.1929 7.85347 14.1232 7.85347 12.8041V5.9751C7.85365 3.71337 9.68791 1.87988 11.9497 1.87988C14.2113 1.88006 16.0447 3.71348 16.0449 5.9751V12.8041C16.0449 16.0089 13.4469 18.6069 10.2422 18.6069C7.03745 18.6069 4.43945 16.0089 4.43945 12.8041Z",fill:"currentColor"}))}function hp(n="icon-sm"){return f("svg",{className:n,width:20,height:20,viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:Zo,fill:"currentColor"}))}function an(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M5.69336 11.0557C7.05891 11.1944 8.12484 12.3479 8.125 13.75L8.11035 14.0273C7.97144 15.3928 6.81814 16.459 5.41602 16.459L5.13965 16.4443C3.86514 16.3149 2.85128 15.3018 2.72168 14.0273L2.70801 13.75C2.70818 12.2546 3.92061 11.0423 5.41602 11.042L5.69336 11.0557ZM5.41602 12.3721C4.65515 12.3724 4.03826 12.9891 4.03809 13.75C4.03826 14.5109 4.65515 15.1286 5.41602 15.1289C6.17714 15.1289 6.79475 14.5111 6.79492 13.75C6.79475 12.9889 6.17714 12.3721 5.41602 12.3721Z",fill:"currentColor"}),f("path",{d:"M16.8008 13.0986C17.1036 13.1608 17.3311 13.4288 17.3311 13.75C17.3311 14.0712 17.1036 14.3392 16.8008 14.4014L16.666 14.415H10.833C10.4659 14.4149 10.168 14.1172 10.168 13.75C10.168 13.3828 10.4659 13.0851 10.833 13.085H16.666L16.8008 13.0986Z",fill:"currentColor"}),f("path",{d:"M16.8008 5.59863C17.1036 5.66081 17.3311 5.92879 17.3311 6.25C17.3311 6.57121 17.1036 6.83919 16.8008 6.90137L16.666 6.91504H10.833C10.4659 6.91491 10.168 6.61719 10.168 6.25C10.168 5.88281 10.4659 5.58509 10.833 5.58496H16.666L16.8008 5.59863Z",fill:"currentColor"}),f("path",{d:"M7.13311 3.76578C7.35346 3.47216 7.771 3.4128 8.06475 3.63297C8.35843 3.85336 8.41789 4.27084 8.19757 4.56461L5.19757 8.56461C5.0819 8.71866 4.90439 8.81462 4.71221 8.82828C4.5201 8.84178 4.33083 8.77209 4.19464 8.6359L2.69464 7.1359C2.43512 6.87623 2.43512 6.45415 2.69464 6.19449C2.95429 5.93484 3.37633 5.93493 3.63604 6.19449L4.59307 7.15152L7.13311 3.76578Z",fill:"currentColor"}))}function mp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M12.6683 4.16699C12.6683 3.84391 12.4065 3.58203 12.0834 3.58203C11.7603 3.58203 11.4984 3.84391 11.4984 4.16699V7.91699L11.4847 8.05078C11.4227 8.35375 11.1547 8.58203 10.8334 8.58203C10.4662 8.58203 10.1685 8.28411 10.1683 7.91699V3.75C10.1683 3.42691 9.90646 3.16504 9.58337 3.16504C9.26029 3.16504 8.99841 3.42691 8.99841 3.75V7.91699C8.99824 8.28411 8.70053 8.58203 8.33337 8.58203C7.96621 8.58203 7.66851 8.28411 7.66833 7.91699V5C7.66833 4.67691 7.40646 4.41504 7.08337 4.41504C6.76029 4.41504 6.49841 4.67691 6.49841 5V9.30371C6.53326 9.3429 6.56715 9.38359 6.59998 9.42578L8.02478 11.2588C8.25005 11.5486 8.19821 11.9659 7.90857 12.1914C7.6187 12.4169 7.20048 12.365 6.97498 12.0752L5.55017 10.2432C5.15812 9.7391 4.41813 9.73637 4.01501 10.1924C4.04396 10.426 4.11486 10.8323 4.25525 11.3486C4.44664 12.0525 4.75404 12.9113 5.21619 13.7383C6.14103 15.3931 7.62465 16.835 10.0004 16.835C12.8545 16.8348 15.1682 14.5211 15.1683 11.667V6.25C15.1683 5.92691 14.9065 5.66504 14.5834 5.66504C14.2603 5.66504 13.9984 5.92691 13.9984 6.25V9.16699C13.9982 9.53411 13.7005 9.83203 13.3334 9.83203C12.9662 9.83203 12.6685 9.53411 12.6683 9.16699V4.16699ZM13.9984 4.42578C14.1828 4.36671 14.3794 4.33496 14.5834 4.33496C15.641 4.33496 16.4984 5.19237 16.4984 6.25V11.667C16.4982 15.2557 13.589 18.1649 10.0004 18.165C6.95953 18.165 5.10939 16.2734 4.05505 14.3867C3.52774 13.4431 3.1843 12.4787 2.97205 11.6982C2.76447 10.9349 2.66834 10.2954 2.66833 10C2.66833 9.87959 2.70117 9.76148 2.76306 9.6582C3.28988 8.78018 4.26555 8.40372 5.16833 8.56152V5C5.16833 3.94237 6.02575 3.08496 7.08337 3.08496C7.31706 3.08496 7.54039 3.12845 7.74744 3.20508C7.98218 2.41297 8.7151 1.83496 9.58337 1.83496C10.1836 1.83496 10.7186 2.11176 11.0697 2.54395C11.3639 2.35978 11.7107 2.25195 12.0834 2.25195C13.141 2.25195 13.9984 3.10937 13.9984 4.16699V4.42578Z",fill:"currentColor"}))}function gp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.06543 1.95123C9.66107 1.69076 10.3389 1.69071 10.9346 1.95123L15.9346 4.13873C16.7832 4.51008 17.3311 5.34917 17.3311 6.27545V10.5528C17.3309 14.6017 14.0489 17.8847 10 17.8848C5.95108 17.8846 2.66813 14.6017 2.66797 10.5528V6.27545C2.66797 5.34924 3.21695 4.51012 4.06543 4.13873L9.06543 1.95123ZM10.4014 3.16998C10.1456 3.05814 9.85444 3.05819 9.59863 3.16998L4.59863 5.35748C4.23427 5.51708 3.99805 5.87764 3.99805 6.27545V10.5528C3.99821 13.8671 6.68563 16.5546 10 16.5547C13.3144 16.5546 16.0008 13.8671 16.001 10.5528V6.27545C16.001 5.87756 15.7658 5.51703 15.4014 5.35748L10.4014 3.16998Z",fill:"currentColor"}),f("path",{d:"M13.4678 11.4318L13.333 11.4182H10.833C10.466 11.4183 10.1682 11.7162 10.168 12.0832C10.168 12.4504 10.4659 12.7481 10.833 12.7482H13.333L13.4678 12.7346C13.7706 12.6724 13.9981 12.4044 13.9981 12.0832C13.9979 11.7621 13.7706 11.494 13.4678 11.4318Z",fill:"currentColor"}),f("path",{d:"M7.65336 12.426C7.46431 12.7406 7.05607 12.8424 6.74125 12.6535C6.42646 12.4646 6.32395 12.0563 6.51274 11.7414L7.55668 10.0002L6.51274 8.25899C6.32395 7.94412 6.42646 7.53583 6.74125 7.34688C7.05607 7.15799 7.46431 7.25975 7.65336 7.57442L8.90336 9.6584C9.0296 9.86893 9.0296 10.1315 8.90336 10.342L7.65336 12.426Z",fill:"currentColor"}))}function xp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.06543 1.95123C9.66107 1.69076 10.3389 1.69071 10.9346 1.95123L15.9346 4.13873C16.7832 4.51008 17.3311 5.34917 17.3311 6.27545V10.5528C17.3309 14.6017 14.0489 17.8847 10 17.8848C5.95108 17.8846 2.66813 14.6017 2.66797 10.5528V6.27545C2.66797 5.34924 3.21695 4.51012 4.06543 4.13873L9.06543 1.95123ZM10.4014 3.16998C10.1456 3.05814 9.85444 3.05819 9.59863 3.16998L4.59863 5.35748C4.23427 5.51708 3.99805 5.87764 3.99805 6.27545V10.5528C3.99821 13.8671 6.68563 16.5546 10 16.5547C13.3144 16.5546 16.0008 13.8671 16.001 10.5528V6.27545C16.001 5.87756 15.7658 5.51703 15.4014 5.35748L10.4014 3.16998Z",fill:"currentColor"}),f("path",{d:"M10.8883 13.1116C10.8883 13.6025 10.4903 14.0005 9.99936 14.0005C9.50844 14.0005 9.11047 13.6025 9.11047 13.1116C9.11047 12.6207 9.50844 12.2227 9.99936 12.2227C10.4903 12.2227 10.8883 12.6207 10.8883 13.1116Z",fill:"currentColor"}),f("path",{d:"M10.5169 10.8949L11.1135 7.31519C11.2283 6.62672 10.6974 6 9.99941 6C9.30145 6 8.77053 6.62672 8.88528 7.31519L9.4819 10.8949C9.52406 11.1479 9.74294 11.3333 9.99941 11.3333C10.2559 11.3333 10.4748 11.1479 10.5169 10.8949Z",fill:"currentColor"}))}function bp(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M9.99944 7.24939C11.5169 7.2495 12.7473 8.47995 12.7475 9.99744C12.7475 11.5151 11.517 12.7454 9.99944 12.7455C8.48176 12.7455 7.2514 11.5151 7.2514 9.99744C7.25155 8.47988 8.48186 7.24939 9.99944 7.24939ZM9.99944 8.57947C9.2164 8.57947 8.58163 9.21442 8.58148 9.99744C8.58148 10.7806 9.2163 11.4154 9.99944 11.4154C10.7825 11.4153 11.4174 10.7805 11.4174 9.99744C11.4173 9.21449 10.7824 8.57958 9.99944 8.57947Z",fill:"currentColor"}),f("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M10.6391 1.67517C11.2939 1.67532 11.8991 2.02577 12.226 2.59314L13.2485 4.36755H15.2963C15.9505 4.36758 16.555 4.71709 16.8823 5.28357L17.5219 6.39001C17.8489 6.95668 17.8481 7.65542 17.5209 8.22205L16.4975 9.99451L17.5239 11.7689C17.8519 12.3357 17.8521 13.0347 17.5248 13.6019L16.8862 14.7084C16.559 15.2747 15.9543 15.6243 15.3002 15.6244H13.2514L12.2299 17.3988C11.9029 17.9663 11.297 18.3168 10.642 18.3168L9.3637 18.3158C8.71064 18.3155 8.10718 17.9678 7.77972 17.4027L6.74847 15.6234L4.69964 15.6244C4.04558 15.6242 3.44087 15.2747 3.1137 14.7084L2.47503 13.6019C2.14791 13.0349 2.14836 12.3366 2.47601 11.7699L3.50237 9.99548L2.47894 8.22205C2.15175 7.65533 2.15174 6.95673 2.47894 6.39001L3.11761 5.28259C3.44458 4.71663 4.04894 4.36813 4.70257 4.36755L6.75042 4.36658L7.77581 2.59119C8.10301 2.02476 8.7076 1.67527 9.36175 1.67517H10.6391ZM9.36273 3.00623C9.1835 3.00623 9.01679 3.10199 8.92718 3.2572L7.82659 5.16345C7.63652 5.49253 7.28473 5.69529 6.90472 5.69568L4.70355 5.69763C4.52451 5.69782 4.3585 5.79355 4.26898 5.94861L3.6303 7.05505C3.54091 7.2102 3.54077 7.40192 3.6303 7.55701L4.73089 9.46326C4.92108 9.7929 4.92135 10.1992 4.73089 10.5287L3.62737 12.4359C3.5378 12.591 3.53792 12.7817 3.62737 12.9369L4.26605 14.0433C4.35567 14.1982 4.52067 14.2932 4.69964 14.2933L6.90276 14.2943C7.28242 14.2946 7.63335 14.497 7.82366 14.8256L8.93011 16.7357C9.01984 16.8905 9.18578 16.9857 9.36468 16.9857H10.642C10.8213 16.9857 10.987 16.89 11.0766 16.7347L12.1752 14.8275C12.3653 14.4975 12.7182 14.2943 13.0991 14.2943H15.3002C15.4794 14.2942 15.6452 14.1985 15.7348 14.0433L16.3725 12.9379C16.4621 12.7826 16.4621 12.5911 16.3725 12.4359L15.27 10.5287C15.1032 10.2404 15.0808 9.89331 15.2055 9.59021L15.269 9.46326L16.3696 7.55701C16.4591 7.40189 16.459 7.21022 16.3696 7.05505L15.7309 5.94861C15.6412 5.79363 15.4754 5.69863 15.2963 5.69861L13.0951 5.69763L12.9535 5.68884C12.6751 5.65158 12.4217 5.50519 12.2504 5.28259L12.1723 5.16443L11.0737 3.2572C10.9841 3.10175 10.8175 3.00525 10.6381 3.00525L9.36273 3.00623Z",fill:"currentColor"}))}function Es(n="icon-sm"){return f("svg",{className:n,width:"20",height:"20",viewBox:"0 0 20 20",fill:"none","aria-hidden":!0},f("path",{d:"M10.6878 9.46029L10.8421 9.49545L17.2913 11.43L17.4642 11.4974C18.2215 11.8649 18.2705 12.9544 17.5492 13.388L17.3822 13.4701L14.5872 14.5872L13.4701 17.3822C13.1135 18.2734 11.8913 18.2756 11.4974 17.4642L11.43 17.2913L9.49544 10.8421C9.26342 10.0687 9.92452 9.34418 10.6878 9.46029ZM12.4984 16.2288L13.3929 13.9954L13.4388 13.8949C13.5579 13.6675 13.7549 13.4891 13.9954 13.3929L16.2288 12.4984L10.9007 10.9007L12.4984 16.2288ZM5.90365 12.9749C6.16329 12.7153 6.58436 12.7154 6.84408 12.9749C7.10378 13.2346 7.10378 13.6557 6.84408 13.9154L5.0765 15.6829C4.8168 15.9426 4.39577 15.9426 4.13607 15.6829C3.87654 15.4232 3.87643 15.0022 4.13607 14.7425L5.90365 12.9749ZM2.83724 7.3265L5.25228 7.97299L5.37826 8.02084C5.65484 8.1591 5.80597 8.47712 5.72298 8.78744C5.63984 9.09774 5.34997 9.298 5.04134 9.27963L4.90853 9.25814L2.49349 8.61068L2.36752 8.56283C2.09082 8.42452 1.93961 8.10666 2.02279 7.79623C2.10599 7.4859 2.39574 7.28652 2.70443 7.30502L2.83724 7.3265ZM14.847 4.05111C15.1051 3.88059 15.4556 3.90894 15.6829 4.13607C15.9426 4.39577 15.9426 4.8168 15.6829 5.0765L13.9154 6.84408C13.6557 7.10378 13.2346 7.10378 12.9749 6.84408C12.7154 6.58437 12.7153 6.16329 12.9749 5.90365L14.7425 4.13607L14.847 4.05111ZM7.79623 2.02279C8.15098 1.92773 8.51562 2.13874 8.61068 2.49349L9.25814 4.90853L9.27962 5.04135C9.298 5.34998 9.09774 5.63984 8.78744 5.72299C8.47713 5.80592 8.15908 5.65484 8.02084 5.37826L7.97298 5.25228L7.3265 2.83724L7.30502 2.70443C7.28652 2.39577 7.48595 2.10603 7.79623 2.02279Z",fill:"currentColor"}))}const yp='@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid;--top-fade:0;--bottom-fade:0;--edge-fade-distance:1rem}}}@layer theme{:root,:host{--font-sans:var(--vscode-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);--font-mono:var(--vscode-editor-font-family,ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace);--color-black:#000;--spacing:.25rem;--text-xs:11px;--text-xs--line-height:calc(1 / .75);--text-sm:12px;--text-sm--line-height:calc(1.25 / .875);--text-base:14px;--text-base--line-height: 1.5 ;--font-weight-medium:500;--radius-md:calc(var(--radius-md-base) * var(--corner-radius-scale));--radius-lg:calc(var(--radius-lg-base) * var(--corner-radius-scale));--radius-xl:calc(var(--radius-xl-base) * var(--corner-radius-scale));--radius-2xl:calc(var(--radius-2xl-base) * var(--corner-radius-scale));--radius-3xl:calc(var(--radius-3xl-base) * var(--corner-radius-scale));--shadow-xl:0px 8px 16px -4px #0000001f;--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-token-foreground:var(--agent-text);--color-token-description-foreground:var(--agent-muted);--color-token-input-background:var(--agent-input-bg);--color-token-dropdown-background:var(--agent-surface-elevated);--color-token-border:var(--agent-border);--color-token-border-heavy:var(--agent-border-strong);--color-token-button-foreground:var(--agent-text);--color-token-button-background:var(--agent-accent);--color-token-button-secondary-foreground:var(--agent-text);--color-token-button-secondary-background:var(--agent-control);--color-token-button-secondary-hover-background:var(--agent-control-hover);--color-token-input-placeholder-foreground:var(--agent-muted);--color-token-charts-blue:var(--agent-accent);--color-token-text-tertiary:var(--agent-muted);--color-token-menu-border:var(--agent-border);--color-token-list-hover-background:var(--agent-control-hover);--color-token-side-bar-background:var(--agent-surface-elevated);--color-token-text-link-foreground:var(--agent-accent);--color-token-editor-background:var(--agent-page-bg);--corner-radius-scale:1;--radius-md-base:.5rem;--radius-lg-base:.625rem;--radius-xl-base:.75rem;--radius-2xl-base:1rem;--radius-3xl-base:1.25rem;--spacing-token-button-composer:calc(var(--spacing) * 7);--spacing-token-button-composer-sm:calc(var(--spacing) * 5);--spacing-token-button-composer-gap:var(--spacing);--h-token-button-composer-gap:var(--spacing-token-button-composer-gap)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\/2{top:50%}.right-2\\.5{right:calc(var(--spacing) * 2.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\\[calc\\(100\\%\\+6px\\)\\]{bottom:calc(100% + 6px)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-px{margin:1px}.ms-1{margin-inline-start:calc(var(--spacing) * 1)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-\\[3px\\]{margin-right:3px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-px{margin-bottom:1px}.ml-1\\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-\\[22px\\]{width:22px;height:22px}.size-token-button-composer{width:var(--spacing-token-button-composer);height:var(--spacing-token-button-composer)}.\\!h-auto{height:auto!important}.h-0{height:calc(var(--spacing) * 0)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\\[1lh\\]{height:1lh}.h-\\[1px\\]{height:1px}.h-auto{height:auto}.h-full{height:100%}.h-token-button-composer{height:var(--spacing-token-button-composer)}.h-token-button-composer-sm{height:var(--spacing-token-button-composer-sm)}.max-h-\\[25dvh\\]{max-height:25dvh}.max-h-\\[140px\\]{max-height:140px}.max-h-none{max-height:none}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\\[1\\.25rem\\]{min-height:1.25rem}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-52{width:calc(var(--spacing) * 52)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\\[60\\%\\]{max-width:60%}.max-w-\\[77\\%\\]{max-width:77%}.max-w-\\[320px\\]{max-width:320px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-56{min-width:calc(var(--spacing) * 56)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-\\[auto_minmax\\(0\\,1fr\\)_auto\\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\\[minmax\\(0\\,auto\\)_auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,auto) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\\[5px\\]{gap:5px}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\\[color\\:var\\(--gray-0\\)\\]{border-color:var(--gray-0)}.border-token-border,.border-token-border\\/80{border-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.border-token-border\\/80{border-color:color-mix(in oklab,var(--color-token-border) 80%,transparent)}}.border-transparent{border-color:#0000}.bg-\\[color\\:var\\(--gray-0\\)\\]{background-color:var(--gray-0)}.bg-token-border\\/70{background-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.bg-token-border\\/70{background-color:color-mix(in oklab,var(--color-token-border) 70%,transparent)}}.bg-token-button-secondary-background{background-color:var(--color-token-button-secondary-background)}.bg-token-charts-blue{background-color:var(--color-token-charts-blue)}.bg-token-dropdown-background,.bg-token-dropdown-background\\/90{background-color:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-dropdown-background\\/90{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 90%,transparent)}}.bg-token-dropdown-background\\/95{background-color:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-dropdown-background\\/95{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 95%,transparent)}}.bg-token-foreground,.bg-token-foreground\\/5{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-token-foreground\\/5{background-color:color-mix(in oklab,var(--color-token-foreground) 5%,transparent)}}.bg-token-foreground\\/10{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-token-foreground\\/10{background-color:color-mix(in oklab,var(--color-token-foreground) 10%,transparent)}}.bg-token-input-background\\/90{background-color:var(--color-token-input-background)}@supports (color:color-mix(in lab,red,red)){.bg-token-input-background\\/90{background-color:color-mix(in oklab,var(--color-token-input-background) 90%,transparent)}}.bg-token-menu-border{background-color:var(--color-token-menu-border)}.bg-token-side-bar-background{background-color:var(--color-token-side-bar-background)}.\\[mask-image\\:linear-gradient\\(to_right\\,black_calc\\(100\\%_-_0\\.25rem\\)\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000)}.\\[mask-repeat\\:no-repeat\\]{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.object-cover{object-fit:cover}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.\\!px-0{padding-inline:calc(var(--spacing) * 0)!important}.px-0\\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-\\[var\\(--padding-row-x\\)\\]{padding-inline:var(--padding-row-x)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-\\[var\\(--padding-row-y\\)\\]{padding-block:var(--padding-row-y)}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-\\[calc\\(var\\(--codex-chat-font-size\\)\\+8px\\)\\]{--tw-leading:calc(var(--codex-chat-font-size) + 8px);line-height:calc(var(--codex-chat-font-size) + 8px)}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-current{color:currentColor}.text-token-button-secondary-foreground{color:var(--color-token-button-secondary-foreground)}.text-token-description-foreground{color:var(--color-token-description-foreground)}.text-token-dropdown-background{color:var(--color-token-dropdown-background)}.text-token-foreground{color:var(--color-token-foreground)}.text-token-input-placeholder-foreground{color:var(--color-token-input-placeholder-foreground)}.text-token-text-tertiary{color:var(--color-token-text-tertiary)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0px 2px 4px -1px var(--tw-shadow-color,#00000014);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\\[0\\.5px\\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-token-border{--tw-ring-color:var(--color-token-border)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\\[--edge-fade-distance\\:2rem\\]{--edge-fade-distance:2rem}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\\/collapsed-tool-activity\\:text-token-foreground:is(:where(.group\\/collapsed-tool-activity):hover *){color:var(--color-token-foreground)}.hover\\:bg-token-button-secondary-hover-background:hover{background-color:var(--color-token-button-secondary-hover-background)}.hover\\:bg-token-editor-background\\/40:hover{background-color:var(--color-token-editor-background)}@supports (color:color-mix(in lab,red,red)){.hover\\:bg-token-editor-background\\/40:hover{background-color:color-mix(in oklab,var(--color-token-editor-background) 40%,transparent)}}.hover\\:bg-token-list-hover-background:hover{background-color:var(--color-token-list-hover-background)}.hover\\:bg-transparent:hover{background-color:#0000}.hover\\:text-token-button-foreground:hover{color:var(--color-token-button-foreground)}.hover\\:text-token-foreground:hover{color:var(--color-token-foreground)}}.focus\\:bg-token-list-hover-background:focus{background-color:var(--color-token-list-hover-background)}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:outline-token-button-background:focus-visible{outline-color:var(--color-token-button-background)}@media(hover:hover){.enabled\\:hover\\:bg-token-foreground\\/80:enabled:hover{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.enabled\\:hover\\:bg-token-foreground\\/80:enabled:hover{background-color:color-mix(in oklab,var(--color-token-foreground) 80%,transparent)}}.enabled\\:hover\\:bg-token-list-hover-background:enabled:hover{background-color:var(--color-token-list-hover-background)}}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.data-\\[state\\=checked\\]\\:translate-x-\\[14px\\][data-state=checked]{--tw-translate-x:14px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[state\\=open\\]\\:bg-token-foreground\\/80[data-state=open]{background-color:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.data-\\[state\\=open\\]\\:bg-token-foreground\\/80[data-state=open]{background-color:color-mix(in oklab,var(--color-token-foreground) 80%,transparent)}}.data-\\[state\\=open\\]\\:bg-token-list-hover-background[data-state=open]{background-color:var(--color-token-list-hover-background)}.data-\\[state\\=unchecked\\]\\:translate-x-\\[2px\\][data-state=unchecked]{--tw-translate-x:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}@container (min-width:500px){.\\@\\[500px\\]\\:inline{display:inline}}.electron\\:rounded-md:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){border-radius:var(--radius-md)}.electron\\:p-1:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){padding:calc(var(--spacing) * 1)}.electron\\:shadow-\\[0_4px_16px_0_rgba\\(0\\,0\\,0\\,0\\.05\\)\\]:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-shadow:0 4px 16px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.electron\\:ring:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.electron\\:ring-black\\/10:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.electron\\:ring-black\\/10:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){--tw-ring-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}@media(prefers-color-scheme:dark){.electron\\:dark\\:bg-token-dropdown-background:where([data-codex-window-type=electron],[data-codex-window-type=electron] *){background-color:var(--color-token-dropdown-background)}}.extension\\:border:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-style:var(--tw-border-style);border-width:1px}.extension\\:border-token-border\\/50:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-color:var(--color-token-border)}@supports (color:color-mix(in lab,red,red)){.extension\\:border-token-border\\/50:where([data-codex-window-type=extension],[data-codex-window-type=extension] *){border-color:color-mix(in oklab,var(--color-token-border) 50%,transparent)}}.\\[\\&_\\.ProseMirror\\]\\:\\!h-5 .ProseMirror{height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:h-auto .ProseMirror{height:auto}.\\[\\&_\\.ProseMirror\\]\\:\\!min-h-5 .ProseMirror{min-height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:min-h-\\[2rem\\] .ProseMirror{min-height:2rem}.\\[\\&_\\.ProseMirror\\]\\:min-w-0 .ProseMirror{min-width:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror\\]\\:flex-1 .ProseMirror{flex:1}.\\[\\&_\\.ProseMirror\\]\\:resize-none .ProseMirror{resize:none}.\\[\\&_\\.ProseMirror\\]\\:overflow-hidden .ProseMirror{overflow:hidden}.\\[\\&_\\.ProseMirror\\]\\:leading-5 .ProseMirror{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.\\[\\&_\\.ProseMirror\\]\\:whitespace-nowrap .ProseMirror{white-space:nowrap}.\\[\\&_\\.ProseMirror\\]\\:focus-visible\\:outline-none .ProseMirror:focus-visible{--tw-outline-style:none;outline-style:none}.\\[\\&_\\.ProseMirror_p\\]\\:m-0 .ProseMirror p{margin:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror_p\\]\\:overflow-hidden .ProseMirror p{overflow:hidden}.\\[\\&_\\.ProseMirror_p\\]\\:text-ellipsis .ProseMirror p{text-overflow:ellipsis}.\\[\\&_\\.ProseMirror_p\\]\\:whitespace-nowrap .ProseMirror p{white-space:nowrap}.\\[\\&_\\.contain-inline-size\\]\\:\\[contain\\:initial\\] .contain-inline-size{contain:initial}.\\[\\&\\>\\*\\:last-child\\]\\:mb-0>:last-child{margin-bottom:calc(var(--spacing) * 0)}.\\[\\&\\>ol\\:first-child\\]\\:mt-0>ol:first-child,.\\[\\&\\>ul\\:first-child\\]\\:mt-0>ul:first-child{margin-top:calc(var(--spacing) * 0)}}@property --top-fade{syntax:"";inherits:false;initial-value:0}@property --bottom-fade{syntax:"";inherits:false;initial-value:0}@property --edge-fade-distance{syntax:"";inherits:false;initial-value:1rem}@keyframes edge-fade{0%,1%{--top-fade:0;--bottom-fade:var(--edge-fade-distance,1rem)}99%,to{--top-fade:var(--edge-fade-distance,1rem);--bottom-fade:0}}@supports (animation-timeline:--scroll-fade){.vertical-scroll-fade-mask{-webkit-mask:linear-gradient(to bottom in oklch,oklch(60% 0 0/0),oklch(85% 0 0) var(--top-fade) calc(100% - var(--bottom-fade)),oklch(60% 0 0/0));mask:linear-gradient(to bottom in oklch,oklch(60% 0 0/0),oklch(85% 0 0) var(--top-fade) calc(100% - var(--bottom-fade)),oklch(60% 0 0/0));animation-name:edge-fade;animation-timing-function:linear;animation-fill-mode:both;animation-timeline:scroll(self y)}}:root{color-scheme:dark;font-family:var(--font-sans);color:var(--agent-text,#f1f0e8);--agent-page-bg:transparent;--agent-surface:#1c1f1b57;--agent-surface-elevated:#1c1f1b7a;--agent-input-bg:#080a085c;--agent-border:#e9e7d81f;--agent-border-strong:#e9e7d838;--agent-text:#f1f0e8;--agent-muted:#f1f0e894;--agent-soft:#f1f0e8c7;--agent-accent:#8ab4f8;--agent-accent-soft:#8ab4f833;--agent-danger:#ff8d7e;--agent-shadow:#0003;--agent-card:var(--agent-input-bg);background:0 0}@supports (color:color-mix(in lab,red,red)){:root{--agent-card:color-mix(in srgb, var(--agent-input-bg) 90%, transparent)}}:root{--agent-card-hover:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){:root{--agent-card-hover:color-mix(in srgb, var(--agent-input-bg) 96%, transparent)}}:root{--agent-control:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){:root{--agent-control:color-mix(in srgb, var(--agent-input-bg) 44%, transparent)}}:root{--agent-control-hover:var(--agent-soft)}@supports (color:color-mix(in lab,red,red)){:root{--agent-control-hover:color-mix(in srgb, var(--agent-soft) 8%, transparent)}}:root{--agent-primary:var(--agent-accent)}@supports (color:color-mix(in lab,red,red)){:root{--agent-primary:color-mix(in srgb, var(--agent-accent) 90%, var(--agent-text))}}:root{--agent-primary-text:#fff;--cubic-enter:cubic-bezier(.19, 1, .22, 1);--cubic-exit-snappy:cubic-bezier(.65, 0, .4, 1);--transition-duration-basic:.15s;--gray-0:#fff;--color-background-surface:transparent;--color-background-surface-under:transparent;--color-background-elevated-primary:var(--agent-surface-elevated);--color-background-elevated-primary-opaque:var(--agent-surface-elevated)}@supports (color:color-mix(in lab,red,red)){:root{--color-background-elevated-primary-opaque:color-mix(in srgb, var(--agent-surface-elevated) 100%, #111)}}:root{--color-background-elevated-secondary:var(--agent-card);--color-background-elevated-secondary-opaque:var(--agent-card)}@supports (color:color-mix(in lab,red,red)){:root{--color-background-elevated-secondary-opaque:color-mix(in srgb, var(--agent-card) 100%, #111)}}:root{--thread-content-max-width:none;--markdown-wide-block-max-width:56rem;--padding-toolbar:calc(var(--spacing) * 4);--vscode-foreground:var(--agent-text);--vscode-descriptionForeground:var(--agent-muted);--vscode-input-background:var(--agent-input-bg);--vscode-dropdown-background:var(--agent-surface-elevated);--vscode-input-placeholderForeground:var(--agent-muted);--vscode-textLink-foreground:var(--agent-accent);--vscode-textLink-activeForeground:var(--agent-accent);--vscode-list-hoverBackground:var(--agent-control-hover);--color-token-editor-foreground:var(--agent-text);--color-token-editor-background:var(--agent-page-bg);--color-token-side-bar-background:var(--agent-surface-elevated);--color-token-main-surface-primary:transparent;--color-token-text-code-block-background:var(--agent-input-bg);--color-token-bg-primary:var(--agent-surface-elevated);--color-token-bg-secondary:var(--agent-card);--color-token-bg-fog:var(--color-background-elevated-secondary);--color-token-bg-tertiary:var(--agent-control);--color-token-list-hover-background:var(--agent-control-hover);--markdown-wide-block-max-height:80vh;--conversation-block-gap:12px;--conversation-tool-assistant-gap:16px;--color-token-terminal-ansi-black:var(--vscode-terminal-ansiBlack,#000);--color-token-terminal-ansi-red:var(--vscode-terminal-ansiRed,#f66);--color-token-terminal-ansi-green:var(--vscode-terminal-ansiGreen,#94f494);--color-token-terminal-ansi-yellow:var(--vscode-terminal-ansiYellow,#f4f47b);--color-token-terminal-ansi-blue:var(--vscode-terminal-ansiBlue,#9e9eff);--color-token-terminal-ansi-magenta:var(--vscode-terminal-ansiMagenta,#db6bdb);--color-token-terminal-ansi-cyan:var(--vscode-terminal-ansiCyan,#81eeee);--color-token-terminal-ansi-white:var(--vscode-terminal-ansiWhite,#d6d6d6);--color-token-terminal-ansi-bright-black:var(--vscode-terminal-ansiBrightBlack,#6e6e6e);--color-token-terminal-ansi-bright-red:var(--vscode-terminal-ansiBrightRed,#ffa8a8);--color-token-terminal-ansi-bright-green:var(--vscode-terminal-ansiBrightGreen,#0f0);--color-token-terminal-ansi-bright-yellow:var(--vscode-terminal-ansiBrightYellow,#ffffa8);--color-token-terminal-ansi-bright-blue:var(--vscode-terminal-ansiBrightBlue,#9494ff);--color-token-terminal-ansi-bright-magenta:var(--vscode-terminal-ansiBrightMagenta,#ffb3ff);--color-token-terminal-ansi-bright-cyan:var(--vscode-terminal-ansiBrightCyan,#adffff);--color-token-terminal-ansi-bright-white:var(--vscode-terminal-ansiBrightWhite,#fff);--padding-row-x:calc(var(--spacing) * 2);--padding-row-y:calc(var(--spacing) * 1.25);--height-token-nav-row:32px;--codex-chat-font-size:var(--vscode-chat-font-size,var(--vscode-font-size,13px));--codex-chat-code-font-size:var(--vscode-chat-editor-font-size,var(--vscode-editor-font-size,12px))}:root[data-codex-window-type=electron]{background:0 0;overflow:hidden}:root[data-codex-window-type=electron] body{--padding-row-y:calc(var(--spacing) * 1.25);--height-token-nav-row:calc(var(--text-base) * 1.5 + var(--padding-row-y) * 2);--padding-panel-base:calc(var(--spacing) * 5);--padding-panel:var(--padding-panel-base);--thread-content-max-width:48rem;--markdown-wide-block-max-width:56rem;--markdown-wide-block-max-height:80vh;--conversation-block-gap:12px;--conversation-tool-assistant-gap:16px;--spacing-token-button-composer-sm:calc(var(--spacing) * 7);--text-heading-md:18px;--cursor-interaction:default;--vscode-editor-font-family:ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--vscode-font-size:var(--text-base);--vscode-editor-font-size:var(--text-sm);--vscode-chat-font-size:var(--vscode-font-size);--vscode-chat-editor-font-size:var(--vscode-editor-font-size);overscroll-behavior:none;overflow:hidden}:root[data-codex-window-type=electron]:not([data-codex-os=win32]) body{background:0 0}*{box-sizing:border-box}html,body,#root{background:0 0;height:100%}body{min-width:0;color:var(--agent-text);font-family:var(--font-sans);font-size:var(--text-base);font-weight:var(--vscode-font-weight,400);margin:0;overflow:hidden}button,select,textarea{font:inherit}button,select{cursor:default}.agent-shell{height:100%;min-height:100%;padding:var(--padding-toolbar);color:var(--agent-text);background:var(--agent-page-bg);flex-direction:column;display:flex}.agent-log,.log,.agent-thread{width:100%;min-height:0;max-width:var(--thread-content-max-width);scrollbar-width:thin;scrollbar-color:var(--agent-muted) transparent;background:0 0;flex:auto;margin:0 auto;padding:6px 2px 18px;overflow:auto}@supports (color:color-mix(in lab,red,red)){.agent-log,.log,.agent-thread{scrollbar-color:color-mix(in srgb,var(--agent-muted) 28%,transparent) transparent}}.agent-thread{gap:var(--conversation-block-gap,12px);flex-direction:column;padding-top:10px;padding-bottom:24px;display:flex;position:relative;overflow-x:hidden}:root[data-codex-window-type=electron] .agent-thread{--color-token-description-foreground:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){:root[data-codex-window-type=electron] .agent-thread{--color-token-description-foreground:color-mix(in srgb, var(--color-token-foreground) 70%, transparent)}}.agent-thread[data-empty]{justify-content:flex-end}.text-size-chat{font-size:var(--codex-chat-font-size)}.text-size-chat-sm{font-size:calc(var(--codex-chat-font-size) - 1px)}.text-size-code{font-size:var(--codex-chat-code-font-size)}.text-size-code-sm{font-size:calc(var(--codex-chat-code-font-size) - 1px)}.font-vscode-editor{font-family:var(--vscode-editor-font-family,var(--font-mono))}.codex-user-turn,.codex-assistant-turn,.codex-notice-turn{width:100%;min-width:0}.codex-user-bubble{color:var(--color-token-foreground);background:var(--color-token-foreground)}@supports (color:color-mix(in lab,red,red)){.codex-user-bubble{background:color-mix(in srgb,var(--color-token-foreground) 5%,transparent)}}.codex-user-message-content[data-collapsed=true]{-webkit-line-clamp:20;-webkit-box-orient:vertical;max-height:20lh;display:-webkit-box;overflow:hidden}.codex-user-message-toggle{background:0 0;border:0;padding:0}.codex-assistant-turn{justify-content:flex-start;display:flex}.codex-assistant-message{max-width:100%;color:var(--color-token-foreground);white-space:normal;overflow-wrap:anywhere}.codex-assistant-message-streaming{white-space:break-spaces}.codex-assistant-message :where(p){margin:0 0 .85em}.codex-assistant-message :where(p:last-child){margin-bottom:0}.codex-assistant-message :where(ul,ol){margin:.45em 0 .85em;padding-left:1.35rem}.codex-assistant-message :where(ul){list-style:outside}.codex-assistant-message :where(ol){list-style:decimal}.codex-assistant-message :where(li){margin:.25em 0}.codex-assistant-message :where(blockquote){border-left:2px solid var(--color-token-border);color:var(--agent-soft);margin:.75em 0;padding-left:.85rem}.codex-assistant-message :where(code){background:var(--agent-soft);border-radius:4px;padding:.12em .3em}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(code){background:color-mix(in srgb,var(--agent-soft) 10%,transparent)}}.codex-assistant-message :where(code){font-family:var(--font-mono);font-size:var(--codex-chat-code-font-size)}.codex-assistant-message :where(pre){border:1px solid var(--agent-border);margin:.75em 0;padding:.65rem .75rem;overflow-x:auto}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(pre){border:1px solid color-mix(in srgb,var(--agent-border) 72%,transparent)}}.codex-assistant-message :where(pre){border-radius:var(--radius-lg);background:var(--agent-input-bg)}@supports (color:color-mix(in lab,red,red)){.codex-assistant-message :where(pre){background:color-mix(in srgb,var(--agent-input-bg) 82%,transparent)}}.codex-assistant-message :where(pre code){white-space:pre;background:0 0;border-radius:0;padding:0;display:block}.codex-assistant-message :where(a){color:var(--agent-accent);text-underline-offset:2px;text-decoration:underline}.codex-assistant-message :where(hr){border-top:1px solid var(--color-token-border);margin:1rem 0}.codex-notice-turn{justify-content:flex-start;display:flex}.codex-notice-content{border:1px solid var(--agent-border);max-width:min(100%,44rem);padding:10px 12px}@supports (color:color-mix(in lab,red,red)){.codex-notice-content{border:1px solid color-mix(in srgb,var(--agent-border) 74%,transparent)}}.codex-notice-content{border-radius:var(--radius-lg);color:var(--agent-soft);background:var(--agent-surface-elevated)}@supports (color:color-mix(in lab,red,red)){.codex-notice-content{background:color-mix(in srgb,var(--agent-surface-elevated) 86%,transparent)}}.codex-notice-content{overflow-wrap:anywhere}.codex-notice-turn.error .codex-notice-content{border-color:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{border-color:color-mix(in srgb,var(--agent-danger) 46%,transparent)}}.codex-notice-turn.error .codex-notice-content{color:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{color:color-mix(in srgb,var(--agent-danger) 88%,var(--agent-text))}}.codex-notice-turn.error .codex-notice-content{background:var(--agent-danger)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.error .codex-notice-content{background:color-mix(in srgb,var(--agent-danger) 11%,transparent)}}.codex-notice-turn.warning .codex-notice-content{border-color:var(--agent-accent)}@supports (color:color-mix(in lab,red,red)){.codex-notice-turn.warning .codex-notice-content{border-color:color-mix(in srgb,var(--agent-accent) 30%,transparent)}}.codex-tool-activity-turn{flex-direction:column;align-items:flex-start;gap:0;width:100%;min-width:0;display:flex}.codex-tool-activity-summary{max-width:100%;color:var(--color-token-foreground);border:0;padding:0}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-summary{color:color-mix(in srgb,var(--color-token-foreground) 40%,transparent)}}.codex-tool-activity-summary{font:inherit;font-size:var(--codex-chat-font-size);line-height:calc(var(--codex-chat-font-size) + 8px);background:0 0}.codex-tool-activity-summary:focus-visible{outline:none}.codex-tool-activity-turn.inProgress .codex-tool-activity-summary{color:var(--color-token-description-foreground)}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-turn.inProgress .codex-tool-activity-summary{color:color-mix(in srgb,var(--color-token-description-foreground) 90%,transparent)}}.codex-tool-activity-icon{color:var(--color-token-foreground);justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-icon{color:color-mix(in srgb,var(--color-token-foreground) 35%,transparent)}}.codex-tool-activity-icon{font-family:var(--font-mono);font-size:11px;line-height:1}.codex-tool-activity-turn.inProgress .codex-tool-activity-icon{animation:1.2s ease-in-out infinite codex-tool-activity-pulse}.codex-tool-activity-text{align-items:baseline;gap:4px;min-width:0;max-width:100%;display:inline-flex}.codex-tool-activity-action{color:var(--color-token-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-action{color:color-mix(in srgb,var(--color-token-foreground) 58%,transparent)}}.codex-tool-activity-detail{min-width:0;color:var(--color-token-foreground);overflow:hidden}@supports (color:color-mix(in lab,red,red)){.codex-tool-activity-detail{color:color-mix(in srgb,var(--color-token-foreground) 40%,transparent)}}.codex-tool-activity-detail{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap}.codex-tool-activity-summary:hover .codex-tool-activity-action,.codex-tool-activity-summary:hover .codex-tool-activity-detail,.codex-tool-activity-summary:hover .codex-tool-activity-icon{color:var(--color-token-foreground)}.codex-tool-activity-output-shell{opacity:0;pointer-events:none;grid-template-rows:0fr;width:100%;min-width:0;transition:grid-template-rows .18s ease-out,opacity .18s ease-out;display:grid;overflow:hidden}.codex-tool-activity-output-shell[data-expanded=true]{opacity:1;pointer-events:auto;grid-template-rows:1fr}.codex-tool-activity-output-shell-inner{min-height:0;overflow:hidden}.codex-tool-activity-output-frame{min-height:1.25rem;padding-right:0;position:relative}.codex-tool-activity-output{box-sizing:border-box;max-width:min(100%,var(--markdown-wide-block-max-width));max-height:140px;color:var(--color-token-description-foreground);white-space:pre;--edge-fade-distance:2rem;background:0 0;border:0;border-radius:0;flex-direction:column;gap:6px;margin:0;padding:8px;font-weight:500;display:flex;overflow:auto}.codex-tool-output-copy:focus-visible{opacity:1}@keyframes codex-tool-activity-pulse{0%,to{opacity:.45}50%{opacity:1}}.agent-log-line,.log-line{border-bottom:1px solid var(--agent-border);grid-template-columns:4.5rem minmax(0,1fr);gap:12px;padding:9px 0;display:grid}@supports (color:color-mix(in lab,red,red)){.agent-log-line,.log-line{border-bottom:1px solid color-mix(in srgb,var(--agent-border) 55%,transparent)}}.agent-log-line,.log-line{color:var(--agent-soft);font-family:var(--font-mono);font-size:12px;line-height:1.5}.agent-log-line:last-child,.log-line:last-child{border-bottom-color:#0000}.agent-log-label,.log-label{color:var(--agent-muted);text-overflow:ellipsis;text-transform:uppercase;overflow:hidden}.agent-log-line.stdout .agent-log-label,.log-line.stdout .log-label{color:var(--agent-accent)}.agent-log-line.stderr .agent-log-label,.agent-log-line.error .agent-log-label,.log-line.stderr .log-label,.log-line.error .log-label{color:var(--agent-danger)}.agent-log-text,.log-text{overflow-wrap:anywhere;white-space:pre-wrap;word-break:normal;min-width:0}.agent-composer-stack{width:100%;max-width:var(--thread-content-max-width);gap:6px;margin:0 auto;display:grid}.above-composer-suggestion-shell{container-type:inline-size}.codex-composer-frame{--composer-top-tray-inline-padding:12px;--composer-top-tray-top-padding:14px;--composer-top-tray-max-height:177px}.codex-composer-surface{color:var(--color-token-foreground)}.codex-composer-inner{isolation:isolate}@supports (corner-shape:superellipse(1.5)){:root{--corner-radius-scale:1.25}.codex-composer-surface,.codex-user-bubble,.codex-notice-content,.provider-dropdown,.provider-dropdown-item,.add-context-dropdown,.add-context-item,.composer-attachment-file,.composer-attachment-image,.rate-limit-popover,.codex-top-tray-panel,.codex-top-tray-item{corner-shape:superellipse(1.5)}}.codex-composer-single-line{min-height:0}.composer-single-line-measure{pointer-events:none;visibility:hidden;white-space:pre;width:max-content;max-width:none;height:0;font-family:var(--font-sans);font-size:var(--text-base);line-height:20px;position:absolute;overflow:hidden}.h-token-button-composer{height:var(--spacing-token-button-composer);gap:var(--h-token-button-composer-gap)}.h-token-button-composer-sm{height:var(--spacing-token-button-composer-sm);gap:var(--h-token-button-composer-gap)}.size-token-button-composer{width:var(--spacing-token-button-composer);height:var(--spacing-token-button-composer)}.size-token-button-composer-sm{width:var(--spacing-token-button-composer-sm);height:var(--spacing-token-button-composer-sm)}.icon-3xs{width:10px;height:10px}.icon-xxs{width:12px;height:12px}.icon-2xs{width:14px;height:14px}.icon-xs{width:16px;height:16px}.icon-sm{width:18px;height:18px}.icon-base{width:20px;height:20px}.icon-md{width:24px;height:24px}.icon-lg{width:28px;height:28px}.cursor-interaction{cursor:var(--cursor-interaction)}.no-drag{-webkit-app-region:no-drag}.outline-hidden{outline-offset:2px;outline:2px solid #0000}.user-select-none{-webkit-user-select:none;user-select:none}.shadow-xl-spread{--tw-shadow:0px 0px 0px .5px var(--tw-shadow-color,var(--color-token-border)), var(--shadow-xl);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}._content_1hiti_1{--dropdown-content-inset:2px;--dropdown-content-start-transform:translateY(calc(var(--dropdown-content-inset) * -1)) scale(.98);transform-origin:var(--radix-dropdown-menu-content-transform-origin);will-change:opacity,transform}._content_1hiti_1[data-side=top]{--dropdown-content-start-transform:translateY(var(--dropdown-content-inset)) scale(.98)}._content_1hiti_1[data-side=right]{--dropdown-content-start-transform:translateX(calc(var(--dropdown-content-inset) * -1)) scale(.98)}._content_1hiti_1[data-side=left]{--dropdown-content-start-transform:translateX(var(--dropdown-content-inset)) scale(.98)}@media(prefers-reduced-motion:no-preference){._content_1hiti_1[data-state=open]{animation:_dropdown-content-enter_1hiti_1 var(--transition-duration-basic) var(--cubic-enter)}}@keyframes _dropdown-content-enter_1hiti_1{0%{opacity:0;transform:var(--dropdown-content-start-transform)}to{opacity:1;transform:translate(0)translateY(0)scale(1)}}.hide-scrollbar{scrollbar-width:none}.hide-scrollbar::-webkit-scrollbar{display:none}.prompt-input{resize:none;width:100%;min-height:2.75rem;max-height:200px;color:var(--color-token-foreground);font-size:var(--text-base);background:0 0;border:0;outline:none;padding:0;line-height:20px;display:block}.prompt-input::placeholder{color:var(--color-token-input-placeholder-foreground)}@supports (color:color-mix(in lab,red,red)){.prompt-input::placeholder{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 50%,transparent)}}.ProseMirror{min-width:0;color:var(--agent-text);caret-color:var(--agent-text);font-variant-ligatures:none;font-feature-settings:"liga" 0;white-space:pre-wrap;white-space:break-spaces;word-wrap:break-word;word-break:normal;background:0 0;outline:none;position:relative;overflow-y:auto}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection{caret-color:#0000;background:0 0}.ProseMirror-hideselection ::selection{caret-color:#0000;background:0 0}.ProseMirror [draggable][contenteditable=false]{-webkit-user-select:text;user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:"";pointer-events:none;border:2px solid #8cf;position:absolute;inset:-2px -2px -2px -32px}img.ProseMirror-separator{border:none!important;margin:0!important;display:inline!important}.ProseMirror p{margin:0}.ProseMirror .placeholder{pointer-events:none;-webkit-user-select:none;user-select:none;position:relative}.ProseMirror .placeholder:after{color:var(--color-token-input-placeholder-foreground);content:attr(data-placeholder);opacity:.5;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;max-width:100%;position:absolute;inset:0 0 auto;overflow:hidden}.ProseMirror .placeholder::selection{color:inherit;background:0 0}.ProseMirror .placeholder ::selection{color:inherit;background:0 0}.ProseMirror .ProseMirror-selectednode:has([skill-mention-name]){outline:none}.prompt-editor-mention{--inline-mention-base-color:var(--color-token-text-link-foreground)}@supports (color:color-mix(in lab,red,red)){.prompt-editor-mention{--inline-mention-base-color:color-mix(in srgb, var(--color-token-text-link-foreground) 80%, var(--color-token-foreground) 20%)}}.prompt-editor-mention{--inline-mention-color:var(--inline-mention-resolved-base-color,var(--inline-mention-base-color));max-width:100%;color:var(--inline-mention-color);vertical-align:baseline;white-space:nowrap;align-items:baseline;display:inline-flex}.prompt-editor-mention:hover{text-underline-offset:2px;text-decoration-line:underline;text-decoration-style:dashed;text-decoration-thickness:.5px}.prompt-editor-mention-icon{color:currentColor}[cmdk-dialog],[cmdk-dialog]:focus-visible{outline:none}[cmdk-root],[data-cmdk-root]{z-index:1000;gap:var(--spacing);min-width:100%;padding:var(--spacing);border:1px solid var(--color-token-border);border-radius:var(--radius-3xl);color:var(--color-token-foreground);background-color:var(--color-token-dropdown-background);flex-direction:column;display:flex}@supports (color:color-mix(in lab,red,red)){[cmdk-root],[data-cmdk-root]{background-color:color-mix(in oklab,var(--color-token-dropdown-background) 95%,transparent)}}[cmdk-root],[data-cmdk-root]{font-size:var(--text-sm);opacity:1;-webkit-user-select:none;user-select:none;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);--cmdk-bottom-item-radius:calc(var(--radius-3xl) - var(--spacing));transform:translateZ(0)}[cmdk-item]{content-visibility:auto;width:100%;min-height:calc(var(--spacing) * 6);padding:var(--padding-row-y) var(--padding-row-x);border-radius:var(--radius-lg);color:var(--color-token-foreground);cursor:var(--cursor-interaction);opacity:.75;-webkit-user-select:none;user-select:none;outline:none;flex-direction:row;align-items:center;display:flex}[cmdk-item][aria-disabled=true],[cmdk-item][data-disabled=true]{cursor:default;opacity:.25}[cmdk-item]:hover:not([aria-disabled=true]),[cmdk-item][data-selected=true],[cmdk-item][aria-selected=true],[cmdk-item]:focus-visible,[cmdk-item]:active:not([aria-disabled=true]){background-color:var(--color-token-list-hover-background);opacity:1}[cmdk-item][data-command-menu-loading=true],[cmdk-item][data-command-menu-loading=true]:hover,[cmdk-item][data-command-menu-loading=true][data-selected=true],[cmdk-item][data-command-menu-loading=true][aria-selected=true],[cmdk-item][data-command-menu-loading=true]:focus-visible,[cmdk-item][data-command-menu-loading=true]:active{cursor:default;opacity:.6;background-color:#0000}[cmdk-item][data-command-menu-empty-state=true],[cmdk-item][data-command-menu-empty-state=true]:hover,[cmdk-item][data-command-menu-empty-state=true][data-selected=true],[cmdk-item][data-command-menu-empty-state=true][aria-selected=true],[cmdk-item][data-command-menu-empty-state=true]:focus-visible,[cmdk-item][data-command-menu-empty-state=true]:active{cursor:default;opacity:1;background-color:#0000}[cmdk-list]{min-height:0;max-height:min(300px,var(--cmdk-list-height,300px));gap:var(--spacing);overscroll-behavior:contain;scrollbar-width:none;flex-direction:column;transition:max-height .1s;display:flex;overflow-y:auto}[cmdk-list]:focus-visible{outline:none}.command-menu-dialog [cmdk-list]{max-height:var(--command-menu-list-max-height);scroll-padding-block-start:calc(var(--spacing) * 8)}.composer-home-top-menu [cmdk-list]{max-height:none}.composer-home-top-menu{max-height:min(320px,var(--composer-top-menu-max-height,320px));overflow:hidden}:where([cmdk-list])>[cmdk-item]:not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))),:where([cmdk-list])>[cmdk-group]:not([hidden]):not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))) [cmdk-item]:last-of-type,:where([cmdk-list])>[cmdk-list-sizer]>[cmdk-item]:not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))),:where([cmdk-list])>[cmdk-list-sizer]>[cmdk-group]:not([hidden]):not(:has(~[cmdk-item],~[cmdk-group]:not([hidden]))) [cmdk-item]:last-of-type{border-bottom-right-radius:var(--cmdk-bottom-item-radius);border-bottom-left-radius:var(--cmdk-bottom-item-radius)}[cmdk-input]{padding:calc(var(--spacing) * 1.5) calc(var(--spacing) * 2.5)}[cmdk-input]:focus-visible{outline:none}[cmdk-empty],[data-cmdk-empty]{min-height:calc(var(--spacing) * 8);padding:calc(var(--spacing) * 1.5) calc(var(--spacing) * 2.5);color:var(--color-token-description-foreground);text-align:center;white-space:pre-wrap;align-items:center;line-height:1.4;display:flex}[data-codex-window-type=electron] [cmdk-root],[data-codex-window-type=electron] [data-cmdk-root]{font-size:var(--text-base)}.codex-attachment-tray{scrollbar-width:none}.codex-attachment-tray::-webkit-scrollbar{display:none}.codex-user-attachment-tray{max-width:77%}.codex-user-attachment-tray .codex-attachment-row{justify-content:flex-end;min-width:0}.composer-attachment-image{border:1px solid var(--color-token-border-heavy);border-radius:var(--radius-lg);background:var(--color-token-input-background);flex:none;width:80px;height:80px;display:inline-flex;position:relative;overflow:visible}.composer-attachment-image img{border-radius:calc(var(--radius-lg) - 1px);object-fit:cover;width:100%;height:100%}.composer-attachment-file{border:.5px solid var(--color-token-border-heavy);flex:none;align-items:center;gap:7px;max-width:min(220px,70vw);height:32px;padding:0 30px 0 10px;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.composer-attachment-file{border:.5px solid color-mix(in srgb,var(--color-token-border-heavy) 80%,transparent)}}.composer-attachment-file{border-radius:var(--radius-lg);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.composer-attachment-file{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.composer-attachment-file-icon{color:var(--color-token-description-foreground);flex:none;display:inline-flex}.composer-attachment-file-label{min-width:0;font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:500;line-height:1rem;overflow:hidden}.composer-attachment-remove{border:.5px solid var(--color-token-border-heavy);justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex;position:absolute;top:-7px;right:-7px}@supports (color:color-mix(in lab,red,red)){.composer-attachment-remove{border:.5px solid color-mix(in srgb,var(--color-token-border-heavy) 70%,transparent)}}.composer-attachment-remove{color:var(--color-token-foreground);background:var(--color-token-dropdown-background);border-radius:999px;box-shadow:0 1px 3px #0000002e}.composer-attachment-remove:hover,.composer-attachment-remove:focus-visible{background:var(--color-token-list-hover-background)}.codex-left-rail,.codex-secondary-controls,.codex-action-cluster,.model-picker,.rate-line{align-items:center;display:flex}.codex-left-rail{scrollbar-width:none;flex:0 auto;min-width:0;margin:0;padding:0;overflow-x:auto}.codex-left-rail::-webkit-scrollbar{display:none}.composer-mode-indicator{color:var(--color-token-text-link-foreground);flex:0 auto}.composer-mode-divider{background:var(--color-token-border);width:1px;height:1rem;margin:0 1px}@supports (color:color-mix(in lab,red,red)){.composer-mode-divider{background:color-mix(in srgb,var(--color-token-border) 70%,transparent)}}.composer-mode-button{min-width:0;color:var(--color-token-text-link-foreground)}.composer-mode-icon{flex:none;justify-content:center;align-items:center;display:inline-flex}.composer-mode-icon-hover,.composer-mode-button:hover .composer-mode-icon-default,.composer-mode-button:focus-visible .composer-mode-icon-default{display:none}.composer-mode-button:hover .composer-mode-icon-hover,.composer-mode-button:focus-visible .composer-mode-icon-hover{display:inline-flex}.composer-mode-label{color:currentColor;font-weight:500}.composer-context-indicator{color:var(--color-token-text-link-foreground);flex:0 auto}.composer-context-divider{background:var(--color-token-border);margin:0 1px}@supports (color:color-mix(in lab,red,red)){.composer-context-divider{background:color-mix(in srgb,var(--color-token-border) 70%,transparent)}}.composer-context-button{color:var(--color-token-text-link-foreground)}.composer-context-icon{justify-content:center;align-items:center;display:inline-flex}.composer-context-icon-hover,.composer-context-button:hover .composer-context-icon-default,.composer-context-button:focus-visible .composer-context-icon-default{display:none}.composer-context-button:hover .composer-context-icon-hover,.composer-context-button:focus-visible .composer-context-icon-hover{display:inline-flex}.composer-context-label{color:currentColor;font-weight:500}.codex-secondary-controls{flex:0 auto;justify-content:flex-end}.codex-action-cluster{flex:none;justify-content:flex-end}.model-picker-root{flex:none;align-items:center;display:inline-flex}.model-picker,.codex-tool,.codex-action{outline:none;flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.codex-tool,.codex-action{line-height:18px}.model-picker{letter-spacing:0;white-space:nowrap;min-width:0;max-width:10rem}.model-icon{border:1px solid var(--agent-border-strong);flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.model-icon{border:1px solid color-mix(in srgb,var(--agent-border-strong) 70%,transparent)}}.model-icon{color:var(--agent-text);background:var(--agent-control);border-radius:999px;font-size:10px;font-weight:750;line-height:1}.model-label{min-width:0;color:var(--color-token-foreground);text-overflow:ellipsis;overflow:hidden}.model-chevron{color:var(--color-token-input-placeholder-foreground);flex:none;line-height:1}.provider-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:13rem;max-height:min(250px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:0}@supports (color:color-mix(in lab,red,red)){.provider-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.provider-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.provider-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.provider-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.provider-dropdown-title{min-height:24px;padding:var(--padding-row-y) var(--padding-row-x);color:var(--color-token-description-foreground);font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;align-items:center;line-height:1rem;display:flex;overflow:hidden}.provider-dropdown-item{width:100%;color:var(--color-token-foreground);text-align:left;background:0 0;border:0}.provider-dropdown-item:hover,.provider-dropdown-item:focus,.provider-dropdown-item[data-selected=true]{background:var(--color-token-list-hover-background)}.provider-dropdown-check{color:var(--color-token-foreground)}.permissions-root{flex:0 auto;min-width:0;display:inline-flex;position:relative}.permissions-trigger{color:var(--color-token-input-placeholder-foreground)}.permissions-trigger[data-permission-mode=auto-review],.permissions-item[data-permission-mode=auto-review] .permissions-item-icon{color:var(--color-token-text-link-foreground)}.permissions-trigger[data-permission-mode=full-access],.permissions-item[data-permission-mode=full-access] .permissions-item-icon{color:var(--agent-danger)}.permissions-trigger-label{color:currentColor;font-weight:500}.permissions-trigger-chevron{color:currentColor;opacity:.72}.permissions-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:13.5rem;max-height:min(250px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:0;overflow-y:auto}@supports (color:color-mix(in lab,red,red)){.permissions-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.permissions-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.permissions-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.permissions-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.permissions-item{width:100%;min-height:calc(var(--spacing) * 8);align-items:center;gap:calc(var(--spacing) * 2);color:var(--color-token-foreground);text-align:left;background:0 0;border:0;display:flex}.permissions-item:hover,.permissions-item:focus-visible,.permissions-item[data-selected=true]{background:var(--color-token-list-hover-background)}.permissions-item-icon,.permissions-item-check{color:var(--color-token-description-foreground);justify-content:center;align-items:center;display:inline-flex}.permissions-item-label{color:var(--color-token-foreground);font-weight:500}.add-context-root{flex:none;display:inline-flex;position:relative}.add-context-dropdown{z-index:50;border:.5px solid var(--color-token-menu-border);width:max-content;min-width:120px;max-width:min(320px,100vw - 16px);max-height:min(270px,100vh - 16px);position:absolute;bottom:calc(100% + 6px);left:-8px;overflow-y:auto}@supports (color:color-mix(in lab,red,red)){.add-context-dropdown{border:.5px solid color-mix(in srgb,var(--color-token-menu-border) 78%,transparent)}}.add-context-dropdown{border-radius:var(--radius-xl);color:var(--color-token-foreground);background:var(--color-token-dropdown-background)}@supports (color:color-mix(in lab,red,red)){.add-context-dropdown{background:color-mix(in srgb,var(--color-token-dropdown-background) 90%,transparent)}}.add-context-dropdown{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.add-context-item{width:100%;min-height:calc(var(--spacing) * 8);align-items:center;gap:calc(var(--spacing) * 1.5);color:var(--color-token-foreground);cursor:var(--cursor-interaction);text-align:left;background:0 0;border:0;display:flex}.add-context-item:hover,.add-context-item:focus-visible{background:var(--color-token-list-hover-background)}.add-context-item:disabled{cursor:default;opacity:.5}.add-context-item:disabled:hover{background:0 0}.add-context-item-icon{color:var(--color-token-description-foreground);opacity:.75;justify-content:center;align-items:center;display:inline-flex}.add-context-item:hover .add-context-item-icon,.add-context-item:focus-visible .add-context-item-icon{opacity:1}.add-context-glyph{width:14px;height:14px;color:var(--color-token-description-foreground);font-size:var(--text-sm);justify-content:center;align-items:center;font-weight:700;line-height:1;display:inline-flex}.add-context-item-label{color:var(--color-token-foreground);font-weight:500}.add-context-item-detail{color:var(--color-token-description-foreground);font-size:var(--text-sm)}.add-context-separator{flex:none}.add-context-separator-line{background:var(--color-token-menu-border)}.provider-select{appearance:none;color:#0000;opacity:0;background:0 0;outline:none;width:100%;height:100%;position:absolute;inset:0}.composer-separator{background:var(--agent-border-strong);flex:none;width:1px;height:18px;margin:0 3px}@supports (color:color-mix(in lab,red,red)){.composer-separator{background:color-mix(in srgb,var(--agent-border-strong) 72%,transparent)}}.codex-start{width:auto;min-width:56px}.codex-circle-action:before{content:"";border:2px solid;border-radius:999px;width:13px;height:13px}.send-button{border-radius:999px}.provider-select:disabled{opacity:0}.rate-line{min-width:0;color:var(--agent-muted);gap:6px;padding:0 2px}@supports (color:color-mix(in lab,red,red)){.rate-line{color:color-mix(in srgb,var(--agent-muted) 88%,transparent)}}.rate-line{white-space:nowrap;font-size:12px;font-weight:500;line-height:1.35}.rate-line[hidden]{display:none}.rate-line :where(span){text-overflow:ellipsis;min-width:0;overflow:hidden}.codex-rate-limit-summary{flex-wrap:nowrap;justify-content:flex-start;overflow:hidden}.rate-limit-trigger{border-radius:var(--radius-md);max-width:100%;height:22px;color:var(--color-token-input-placeholder-foreground);border:0;padding:0 4px;display:inline-flex;position:relative}@supports (color:color-mix(in lab,red,red)){.rate-limit-trigger{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 94%,transparent)}}.rate-limit-trigger{font-size:var(--text-sm);background:0 0;font-weight:500;line-height:1}.rate-limit-trigger-inline{gap:6px;overflow:hidden}.rate-limit-trigger:hover,.rate-limit-trigger:focus-visible,.rate-limit-trigger[aria-expanded=true]{background:var(--color-token-list-hover-background);outline:none}.rate-limit-speedometer,.rate-limit-chevron{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-speedometer,.rate-limit-chevron{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 86%,transparent)}}.rate-line-heading{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-line-heading{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 92%,transparent)}}.rate-limit-inline-separator{color:var(--agent-accent);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-inline-separator{color:color-mix(in srgb,var(--agent-accent) 82%,transparent)}}.rate-limit-inline-segment{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.rate-limit-popover{color:var(--color-token-foreground)}.rate-limit-popover-title{color:var(--color-token-description-foreground);font-size:var(--text-xs);padding:2px 0 5px;font-weight:600}.rate-limit-popover-row{min-width:0;min-height:24px;color:var(--color-token-foreground);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;display:grid}.rate-limit-window{min-width:0;color:var(--color-token-foreground);text-overflow:ellipsis;font-weight:500;overflow:hidden}.rate-limit-row-value{min-width:0;color:var(--color-token-description-foreground);text-align:right;justify-content:flex-end;align-items:center;gap:5px;display:inline-flex}.rate-limit-percent{color:var(--color-token-input-placeholder-foreground);flex:none}@supports (color:color-mix(in lab,red,red)){.rate-limit-percent{color:color-mix(in srgb,var(--color-token-input-placeholder-foreground) 92%,transparent)}}.rate-limit-percent{font-weight:600}.rate-limit-reset{min-width:0;color:var(--color-token-description-foreground)}.status-dot{background:var(--agent-muted);border-radius:999px;flex:none;width:6px;height:6px}.status-dot.running{background:var(--agent-accent)}.status-dot.failed{background:var(--agent-danger)}.codex-top-tray-shell{width:calc(var(--composer-top-tray-inline-padding,12px) * 2 + 100% + 8px);min-width:0;left:50%;bottom:var(--composer-top-tray-top-padding,14px);transform:translate(-50%)}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{width:100%;min-width:0;max-height:var(--composer-top-tray-max-height,177px);padding:var(--spacing);padding-top:calc(var(--spacing) * 3);padding-left:calc(var(--spacing) * 2);border:1px solid var(--composer-top-tray-border,var(--color-token-border));flex-direction:column;display:flex;position:relative}@supports (color:color-mix(in lab,red,red)){.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{border:1px solid var(--composer-top-tray-border,color-mix(in srgb, var(--color-token-border) 72%, transparent))}}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl);color:var(--color-token-foreground);background:var(--composer-top-tray-background,var(--color-token-side-bar-background));border-top-color:#0000;border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0}@supports (color:color-mix(in lab,red,red)){.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{background:var(--composer-top-tray-background,color-mix(in oklab, var(--color-token-side-bar-background) 94%, transparent))}}.codex-top-tray-panel,.codex-top-tray-panel[cmdk-root],.codex-top-tray-panel[data-cmdk-root]{box-shadow:none;font-size:var(--text-sm);-webkit-backdrop-filter:none;backdrop-filter:none;isolation:isolate;-webkit-user-select:none;user-select:none;--cmdk-bottom-item-radius:0;overflow:hidden}.codex-top-tray-title{padding:0 var(--padding-row-x) calc(var(--spacing) * 1.25);color:var(--color-token-description-foreground);font-size:var(--text-xs);font-weight:600;line-height:1.2}.codex-top-tray-list,.codex-top-tray-panel [cmdk-list],.codex-top-tray-panel [data-cmdk-list]{gap:var(--spacing);scrollbar-width:none;flex-direction:column;flex:1;width:100%;min-height:0;max-height:none;transition:none;display:flex;overflow-y:auto}.codex-top-tray-list::-webkit-scrollbar{display:none}.codex-top-tray-empty,.codex-top-tray-panel [data-cmdk-empty]{padding:var(--padding-row-y) var(--padding-row-x);color:var(--color-token-input-placeholder-foreground);font-size:var(--text-sm);align-items:center;display:flex}.codex-top-tray-item,.codex-top-tray-item[cmdk-item],.codex-top-tray-item[data-list-navigation-item]{width:calc(100% - var(--spacing) * 2);min-height:calc(var(--spacing) * 6);padding:var(--padding-row-y) var(--padding-row-x);border-radius:var(--radius-lg);color:var(--color-token-foreground);cursor:var(--cursor-interaction,default);font-size:var(--text-sm);opacity:.75;text-align:left;background:0 0;border:0;outline:none;flex-shrink:0;align-items:center;gap:0;display:flex;overflow:hidden}.codex-top-tray-item:hover,.codex-top-tray-item[data-selected=true],.codex-top-tray-item:focus-visible{background:var(--color-token-list-hover-background);opacity:1}.codex-top-tray-icon{width:14px;height:14px;color:var(--color-token-description-foreground);font-size:var(--text-sm);flex:none;justify-content:center;align-items:center;font-weight:700;line-height:1;display:inline-flex}.codex-top-tray-copy{align-items:center;gap:calc(var(--spacing) * 2);min-width:0;display:flex}.codex-top-tray-label,.codex-top-tray-detail{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.codex-top-tray-label{color:var(--color-token-foreground);font-size:var(--text-sm)}.codex-top-tray-detail{color:var(--color-token-description-foreground);font-size:var(--text-sm);flex:1 1 0}@media(max-width:720px){.agent-shell{padding:10px}.prompt-input{min-height:2.75rem;font-size:16px}.model-picker,.codex-tool,.codex-action{height:var(--spacing-token-button-composer)}.codex-tool,.codex-action{width:var(--spacing-token-button-composer)}.codex-tool{width:var(--spacing-token-button-composer-sm);height:var(--spacing-token-button-composer-sm)}.codex-left-rail{min-width:0}.codex-action-cluster{margin-left:auto}}@media(max-width:520px){.agent-log-line,.log-line{grid-template-columns:1fr;gap:2px}.model-picker{min-width:104px;max-width:168px}.codex-tool-skill,.codex-mic,.rate-dot,.rate-limit-reset{display:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}';function Cp(n){Xs("agent-session",yp),jo(),document.documentElement.dataset.cmuxWebviewKind="agent-session",document.body.dataset.cmuxWebviewKind="agent-session";const e=Qs(()=>Pr.jsx(yu,{}));Ys.createRoot(n).render(Pr.jsx(Gs,{router:e}))}export{Cp as mountAgentSessionSurface}; diff --git a/Resources/markdown-viewer/webviews-app/chunks/diffSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/diffSurface.mjs index 987bdfcd9221..62291b9de5d0 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/diffSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/diffSurface.mjs @@ -1,4 +1,4 @@ -import{b as _,j as s,i as I,r as bt,c as wt,a as vt}from"./vendor.mjs";import{W as yt,C as kt,u as St,d as jt,g as Fe,b as Pe,F as Ct,r as De,c as It,p as Pt,a as Mt}from"./diff-vendor.mjs";import{m as Lt,i as Ft,c as _t}from"./installWebviewStyles.mjs";(function(t){var e=[["diffViewerScrollDown","line",1],["diffViewerScrollUp","line",-1],["diffViewerScrollHalfPageDown","halfPage",1],["diffViewerScrollHalfPageUp","halfPage",-1],["diffViewerScrollDownEmacs","line",1],["diffViewerScrollUpEmacs","line",-1],["diffViewerScrollToBottom","edge",1],["diffViewerScrollToTop","edge",-1]],r=new WeakMap;function i(f){return{key:String(f&&f.key||"").toLowerCase(),command:!!(f&&f.command),control:!!(f&&f.control),option:!!(f&&f.option),shift:!!(f&&f.shift)}}function n(f){return!f||f.unbound===!0||!f.first?null:{first:i(f.first),second:f.second?i(f.second):null}}function a(f){return f.code==="Space"?"space":typeof f.key=="string"?f.key.toLowerCase():""}function o(f,g){return!!f&&g.metaKey===f.command&&g.ctrlKey===f.control&&g.altKey===f.option&&g.shiftKey===f.shift&&a(g)===f.key}function c(f){var g=f&&f.closest?f:null;return!!(g&&g.closest("input, textarea, select, [contenteditable='true']"))}function l(f){return f.metaKey||f.ctrlKey||f.altKey||c(f.target)?!1:["arrowdown","arrowup","pagedown","pageup","home","end","space"].indexOf(a(f))>=0}function p(f){var g=Number(f&&f.clientHeight);return Number.isFinite(g)&&g>0?g:Math.max(1,Number(t.innerHeight)||1)}function d(f,g){var x=e.find(function(b){return b[0]===f});return x?(m(g,x[1],x[2]),!0):!1}function u(f){f&&r.delete(f)}function m(f,g,x){if(f){var b=Math.max(0,(Number(f.scrollHeight)||0)-p(f));if(g==="edge"){var v=x>0?b:0;r.set(f,{target:v,time:Date.now()}),f.scrollTo({top:v,behavior:"smooth"});return}var y=g==="halfPage"?Math.max(80,Math.floor(p(f)*.5)):72,k=Date.now(),j=r.get(f),M=Number(f.scrollTop)||0,R=j&&k-j.time<300?j.target:M,S=Math.max(0,Math.min(b,R+x*y));r.set(f,{target:S,time:k}),f.scrollTo({top:S,behavior:"smooth"})}}function h(f){var g=f&&f.target,x=f&&f.getScroller;if(!g||typeof g.addEventListener!="function"||typeof x!="function")return function(){};function b(){u(x())}function v(y){l(y)&&b()}return g.addEventListener("keydown",v,!0),g.addEventListener("wheel",b,!0),g.addEventListener("touchstart",b,!0),g.addEventListener("pointerdown",b,!0),function(){g.removeEventListener("keydown",v,!0),g.removeEventListener("wheel",b,!0),g.removeEventListener("touchstart",b,!0),g.removeEventListener("pointerdown",b,!0)}}function w(f){var g=f&&f.target,x=f&&f.getScroller,b=f&&f.shortcuts||{};if(!g||typeof g.addEventListener!="function"||typeof x!="function")return function(){};var v=e.map(function(S){return{action:S[0],shortcut:n(b[S[0]]),kind:S[1],direction:S[2]}}).filter(function(S){return S.shortcut}),y=null,k=0,j=h({target:g,getScroller:x});function M(){y=null,k&&(t.clearTimeout(k),k=0)}function R(S){if(!(S.defaultPrevented||c(S.target))){if(y){if(o(y.shortcut.second,S)){S.preventDefault(),d(y.action,x()),M();return}M()}for(var T=0;T=0}function p(f){var g=Number(f&&f.clientHeight);return Number.isFinite(g)&&g>0?g:Math.max(1,Number(t.innerHeight)||1)}function d(f,g){var x=e.find(function(b){return b[0]===f});return x?(m(g,x[1],x[2]),!0):!1}function u(f){f&&r.delete(f)}function m(f,g,x){if(f){var b=Math.max(0,(Number(f.scrollHeight)||0)-p(f));if(g==="edge"){var v=x>0?b:0;r.set(f,{target:v,time:Date.now()}),f.scrollTo({top:v,behavior:"smooth"});return}var y=g==="halfPage"?Math.max(80,Math.floor(p(f)*.5)):72,k=Date.now(),j=r.get(f),M=Number(f.scrollTop)||0,R=j&&k-j.time<300?j.target:M,S=Math.max(0,Math.min(b,R+x*y));r.set(f,{target:S,time:k}),f.scrollTo({top:S,behavior:"smooth"})}}function h(f){var g=f&&f.target,x=f&&f.getScroller;if(!g||typeof g.addEventListener!="function"||typeof x!="function")return function(){};function b(){u(x())}function v(y){l(y)&&b()}return g.addEventListener("keydown",v,!0),g.addEventListener("wheel",b,!0),g.addEventListener("touchstart",b,!0),g.addEventListener("pointerdown",b,!0),function(){g.removeEventListener("keydown",v,!0),g.removeEventListener("wheel",b,!0),g.removeEventListener("touchstart",b,!0),g.removeEventListener("pointerdown",b,!0)}}function w(f){var g=f&&f.target,x=f&&f.getScroller,b=f&&f.shortcuts||{};if(!g||typeof g.addEventListener!="function"||typeof x!="function")return function(){};var v=e.map(function(S){return{action:S[0],shortcut:n(b[S[0]]),kind:S[1],direction:S[2]}}).filter(function(S){return S.shortcut}),y=null,k=0,j=h({target:g,getScroller:x});function M(){y=null,k&&(t.clearTimeout(k),k=0)}function R(S){if(!(S.defaultPrevented||c(S.target))){if(y){if(o(y.shortcut.second,S)){S.preventDefault(),d(y.action,x()),M();return}M()}for(var T=0;T=4.5)return i;const o={blue:0,green:0,red:0},c={blue:255,green:255,red:255};return we(o,a)>=we(c,a)?"#000000":"#ffffff"}function me(t,e,r){const i=t.palette??{},n=e.map(a=>i[a]).find(a=>typeof a=="string"&&a.trim()!=="");return Ee(n,t.background,4.5)?ie(n,r):Ee(r,t.background,4.5)?r:de(n,t.background,r)}function ie(t,e){return typeof t=="string"&&t.trim()!==""?t.trim():e}function Et(t){const e=typeof t=="string"&&t.trim()!==""?t.trim():"Menlo";return`${JSON.stringify(e)}, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace`}function ve(t,e){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:e}function At(t){return typeof t!="number"||!Number.isFinite(t)?1:Math.max(0,Math.min(1,t))}function Ee(t,e,r){const i=ye(ie(t,"")),n=ye(ie(e,"#000000"));return!!(i&&n&&we(i,n)>=r)}function ye(t){const e=t.trim(),r=e.match(/^#([0-9a-f]{3})$/i);if(r){const[,a]=r;return{red:Number.parseInt(a[0]+a[0],16),green:Number.parseInt(a[1]+a[1],16),blue:Number.parseInt(a[2]+a[2],16)}}const i=e.match(/^#([0-9a-f]{6})$/i);if(!i)return null;const[,n]=i;return{red:Number.parseInt(n.slice(0,2),16),green:Number.parseInt(n.slice(2,4),16),blue:Number.parseInt(n.slice(4,6),16)}}function we(t,e){const r=Math.max(he(t),he(e)),i=Math.min(he(t),he(e));return(r+.05)/(i+.05)}function he(t){return .2126*je(t.red)+.7152*je(t.green)+.0722*je(t.blue)}function je(t){const e=t/255;return e<=.03928?e/12.92:((e+.055)/1.055)**2.4}function Q(t){const e=_.c(2),{name:r}=t;let i;return e[0]!==r?(i=s.jsx("svg",{viewBox:"0 0 20 20","aria-hidden":"true",children:s.jsx(Ot,{name:r})}),e[0]=r,e[1]=i):i=e[1],i}function Ot(t){const e=_.c(21),{name:r}=t;switch(r){case"arrow":{let i;return e[0]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M4 10h11"}),s.jsx("path",{d:"m11 6 4 4-4 4"})]}),e[0]=i):i=e[0],i}case"background":{let i;return e[1]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"4",y:"4",width:"12",height:"12",rx:"2"}),s.jsx("path",{d:"M7 8h6"}),s.jsx("path",{d:"M7 12h6"})]}),e[1]=i):i=e[1],i}case"bars":{let i;return e[2]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M5 4v12"}),s.jsx("path",{d:"M9 6v8"}),s.jsx("path",{d:"M13 8v4"})]}),e[2]=i):i=e[2],i}case"check":{let i;return e[3]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsx("path",{d:"M4 10.5 8 14l8-9"}),e[3]=i):i=e[3],i}case"classic":{let i;return e[4]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M4 5h12"}),s.jsx("path",{d:"M4 10h12"}),s.jsx("path",{d:"M4 15h12"}),s.jsx("path",{d:"M7 3v4"}),s.jsx("path",{d:"M13 8v4"})]}),e[4]=i):i=e[4],i}case"collapse":{let i;return e[5]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M13.5 11.5 10 15 6.5 11.5"}),s.jsx("path",{d:"M6.5 8.5 10 5l3.5 3.5"})]}),e[5]=i):i=e[5],i}case"clipboard":{let i;return e[6]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"5",y:"4",width:"10",height:"13",rx:"2"}),s.jsx("path",{d:"M8 4a2 2 0 0 1 4 0"}),s.jsx("path",{d:"M8 7h4"})]}),e[6]=i):i=e[6],i}case"document":{let i;return e[7]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M6 3h6l4 4v10H6z"}),s.jsx("path",{d:"M12 3v5h5"})]}),e[7]=i):i=e[7],i}case"dots":{let i;return e[8]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M5 10h.01","data-precision-dot":"true"}),s.jsx("path",{d:"M10 10h.01","data-precision-dot":"true"}),s.jsx("path",{d:"M15 10h.01","data-precision-dot":"true"})]}),e[8]=i):i=e[8],i}case"expand":{let i;return e[9]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsx("path",{d:"M6.5 8 10 11.5 13.5 8"}),e[9]=i):i=e[9],i}case"external":{let i;return e[10]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M7 5H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2v-2"}),s.jsx("path",{d:"M11 3h6v6"}),s.jsx("path",{d:"m10 10 7-7"})]}),e[10]=i):i=e[10],i}case"eye":{let i;return e[11]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M2.5 10s2.75-5 7.5-5 7.5 5 7.5 5-2.75 5-7.5 5-7.5-5-7.5-5z"}),s.jsx("circle",{cx:"10",cy:"10",r:"2.4"})]}),e[11]=i):i=e[11],i}case"files":{let i;return e[12]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"3.5",y:"4",width:"13",height:"12",rx:"2"}),s.jsx("path",{d:"M11.5 4v12"})]}),e[12]=i):i=e[12],i}case"numbers":{let i;return e[13]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M5 5h2v10"}),s.jsx("path",{d:"M4 15h4"}),s.jsx("path",{d:"M11 6.5a2 2 0 1 1 3.2 1.6L11 12h4"}),s.jsx("path",{d:"M11 15h4"})]}),e[13]=i):i=e[13],i}case"refresh":{let i;return e[14]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M16 8a6 6 0 0 0-10.3-3.7L4 6"}),s.jsx("path",{d:"M4 3v3h3"}),s.jsx("path",{d:"M4 12a6 6 0 0 0 10.3 3.7L16 14"}),s.jsx("path",{d:"M16 17v-3h-3"})]}),e[14]=i):i=e[14],i}case"search":{let i;return e[15]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("circle",{cx:"8.5",cy:"8.5",r:"4.5"}),s.jsx("path",{d:"m12 12 4 4"})]}),e[15]=i):i=e[15],i}case"sidebarCollapse":{let i;return e[16]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"3.5",y:"4",width:"13",height:"12",rx:"2"}),s.jsx("path",{d:"M8 4v12"}),s.jsx("path",{d:"m12 8 2 2-2 2"})]}),e[16]=i):i=e[16],i}case"split":{let i;return e[17]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"4",y:"4",width:"12",height:"12",rx:"2"}),s.jsx("rect",{x:"6",y:"6",width:"3.5",height:"8",rx:"1","data-diff-deletion":"true"}),s.jsx("rect",{x:"10.5",y:"6",width:"3.5",height:"8",rx:"1","data-diff-addition":"true"})]}),e[17]=i):i=e[17],i}case"unified":{let i;return e[18]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("rect",{x:"4",y:"4",width:"12",height:"12",rx:"2"}),s.jsx("rect",{x:"6",y:"6",width:"8",height:"3.5",rx:"1","data-diff-deletion":"true"}),s.jsx("rect",{x:"6",y:"10.5",width:"8",height:"3.5",rx:"1","data-diff-addition":"true"})]}),e[18]=i):i=e[18],i}case"word":{let i;return e[19]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M3 6h14"}),s.jsx("path",{d:"M3 10h8"}),s.jsx("path",{d:"M3 14h11"}),s.jsx("path",{d:"M14 10h3"})]}),e[19]=i):i=e[19],i}case"wrap":{let i;return e[20]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs(s.Fragment,{children:[s.jsx("path",{d:"M3 6h10a4 4 0 0 1 0 8H8"}),s.jsx("path",{d:"m10 11-3 3 3 3"})]}),e[20]=i):i=e[20],i}}}function Ae(t){return t.replace(/^[a-zA-Z][\w+.-]*:\/\/[^/]*/,"")}const $t={suggested:50,worktrees:50},Wt=8,Oe=50,Vt={suggested:"branchPickerGroupSuggested",worktrees:"branchPickerGroupWorktrees",branches:"branchPickerGroupBranches",remotes:"branchPickerGroupRemotes",recent:"branchPickerGroupRecent"},Gt=320,ge=6,xe=8,Ut=160;function Ht(t){const e=window.innerWidth,r=window.innerHeight,i=e-Gt-xe,n=Math.max(xe,Math.min(t.left,i)),a=r-t.bottom-ge-xe,o=t.top-ge-xe;return aa?{top:"auto",bottom:r-t.top+ge,left:n,maxHeight:Math.max(0,o)}:{top:t.bottom+ge,bottom:"auto",left:n,maxHeight:Math.max(0,a)}}function qt(t){const e=_.c(61),{label:r,onNavigate:i,picker:n}=t,[a,o]=I.useState(!1),[c,l]=I.useState(""),[p,d]=I.useState(null),[u,m]=I.useState("idle"),[h,w]=I.useState(0),[f,g]=I.useState(null),[x,b]=I.useState(null),v=I.useRef(null),y=I.useRef(null),k=I.useRef(null),j=I.useId(),M=Kt;let R;e[0]!==p||e[1]!==r||e[2]!==c?(R=Qt(p,c,r),e[0]=p,e[1]=r,e[2]=c,e[3]=R):R=e[3];const S=R,T=S.length===0?0:Math.min(h,S.length-1);let B;e[4]!==p||e[5]!==u||e[6]!==n?(B=()=>{o(!0),l(""),w(0),p==null&&u!=="loading"&&(m("loading"),tr(Ae(n.refsURL)).then(L=>{d(L.groups),m("idle")}).catch(L=>{console.warn("cmux diff branch picker refs load failed",L),m("error")}))},e[4]=p,e[5]=u,e[6]=n,e[7]=B):B=e[7];const O=B;let D;e[8]===Symbol.for("react.memo_cache_sentinel")?(D=()=>{o(!1),k.current?.focus()},e[8]=D):D=e[8];const C=D;let F;e[9]!==i||e[10]!==n?(F=L=>{const A=L.trim();A!==""&&(g(A),o(!1),i(Ae(n.regenerateURLTemplate).replace("{ref}",encodeURIComponent(A))))},e[9]=i,e[10]=n,e[11]=F):F=e[11];const P=F;let N,E;e[12]!==a?(N=()=>{if(!a)return;const L=A=>{if(!(A.target instanceof Node))return;const se=A.target;v.current?.contains(se)||y.current?.contains(se)||o(!1)};return document.addEventListener("mousedown",L),()=>document.removeEventListener("mousedown",L)},E=[a],e[12]=a,e[13]=N,e[14]=E):(N=e[13],E=e[14]),I.useEffect(N,E);let $,W;e[15]!==a?($=()=>{if(!a){b(null);return}const L=()=>{const A=k.current;A&&b(Ht(A.getBoundingClientRect()))};return L(),window.addEventListener("resize",L),window.addEventListener("scroll",L,!0),()=>{window.removeEventListener("resize",L),window.removeEventListener("scroll",L,!0)}},W=[a],e[15]=a,e[16]=$,e[17]=W):($=e[16],W=e[17]),I.useEffect($,W);let V;e[18]!==T||e[19]!==S||e[20]!==P?(V=L=>{if(L.key==="Escape"){L.preventDefault(),C();return}if(L.key==="ArrowDown"){L.preventDefault(),S.length>0&&w(A=>(A+1)%S.length);return}if(L.key==="ArrowUp"){L.preventDefault(),S.length>0&&w(A=>(A-1+S.length)%S.length);return}if(L.key==="Enter"){L.preventDefault();const A=S[T];A&&P(A.row.ref);return}},e[18]=T,e[19]=S,e[20]=P,e[21]=V):V=e[21];const U=V;let z;e[22]!==f||e[23]!==r?(z=f!=null?r("branchPickerGenerating").replace("{ref}",f):null,e[22]=f,e[23]=r,e[24]=z):z=e[24];const G=z;let ee;e[25]!==f||e[26]!==r||e[27]!==n?(ee=f!=null?r("branchPickerOpen"):Xt(r,n),e[25]=f,e[26]=r,e[27]=n,e[28]=ee):ee=e[28];const J=ee,Z=a?j:void 0;let H;e[29]!==r?(H=r("branchPickerOpen"),e[29]=r,e[30]=H):H=e[30];const oe=f!=null?"true":"false",ae=f!=null;let q;e[31]!==a||e[32]!==O?(q=()=>a?o(!1):O(),e[31]=a,e[32]=O,e[33]=q):q=e[33];let K;e[34]!==G||e[35]!==f||e[36]!==n?(K=f!=null?s.jsxs(s.Fragment,{children:[s.jsx("span",{className:"base-picker-spinner","aria-hidden":"true"}),s.jsx("span",{className:"base-picker-text",children:G})]}):s.jsx(Yt,{picker:n}),e[34]=G,e[35]=f,e[36]=n,e[37]=K):K=e[37];let X;e[38]!==J||e[39]!==a||e[40]!==Z||e[41]!==H||e[42]!==oe||e[43]!==ae||e[44]!==q||e[45]!==K?(X=s.jsx("button",{ref:k,id:"base-picker-button",type:"button",className:"base-picker-button","aria-haspopup":"listbox","aria-expanded":a,"aria-controls":Z,"aria-label":H,title:J,"data-generating":oe,disabled:ae,onClick:q,children:K}),e[38]=J,e[39]=a,e[40]=Z,e[41]=H,e[42]=oe,e[43]=ae,e[44]=q,e[45]=K,e[46]=X):X=e[46];let Y;e[47]!==T||e[48]!==S||e[49]!==r||e[50]!==j||e[51]!==u||e[52]!==U||e[53]!==a||e[54]!==x||e[55]!==c||e[56]!==P?(Y=a&&x?bt.createPortal(s.jsxs("div",{ref:y,className:"base-picker-popover",role:"dialog","aria-label":r("branchPickerOpen"),style:x,children:[s.jsxs("div",{className:"base-picker-search",children:[s.jsx(Q,{name:"search"}),s.jsx("input",{ref:M,type:"text",className:"base-picker-input",placeholder:r("branchPickerFilterPlaceholder"),"aria-label":r("branchPickerFilterPlaceholder"),"aria-controls":j,"aria-activedescendant":S[T]?$e(j,T):void 0,value:c,onChange:L=>{l(L.currentTarget.value),w(0)},onKeyDown:U})]}),s.jsx("div",{id:j,className:"base-picker-list",role:"listbox","aria-label":r("branchPickerOpen"),children:u==="loading"?s.jsx("div",{className:"base-picker-status",children:r("branchPickerLoading")}):u==="error"?s.jsx("div",{className:"base-picker-status base-picker-status-error",children:r("branchPickerLoadFailed")}):S.length===0?s.jsx("div",{className:"base-picker-status",children:r("branchPickerNoMatches")}):S.map((L,A)=>s.jsx(Jt,{domId:$e(j,A),entry:L,label:r,selected:A===T,onHover:()=>w(A),onSelect:()=>P(L.row.ref)},`${L.groupId}:${L.row.ref}`))})]}),document.body):null,e[47]=T,e[48]=S,e[49]=r,e[50]=j,e[51]=u,e[52]=U,e[53]=a,e[54]=x,e[55]=c,e[56]=P,e[57]=Y):Y=e[57];let te;return e[58]!==X||e[59]!==Y?(te=s.jsxs("div",{id:"base-picker",ref:v,children:[X,Y]}),e[58]=X,e[59]=Y,e[60]=te):te=e[60],te}function Kt(t){t?.focus()}function Xt(t,e){const r=e.confidence==="low",i=[t("branchPickerComparing").replace("{head}",e.headRef).replace("{base}",e.currentRef)];return e.currentReason&&i.push(`(${r?"~":""}${e.currentReason})`),e.aheadBehind&&i.push(`+${e.aheadBehind.ahead} -${e.aheadBehind.behind}`),i.join(" ")}function Yt(t){const e=_.c(15),{picker:r}=t,i=r.confidence==="low",n=`${i?"~":""}${r.currentReason}`,a=r.aheadBehind;let o;e[0]!==r.headRef?(o=s.jsx("span",{className:"base-picker-head",children:r.headRef}),e[0]=r.headRef,e[1]=o):o=e[1];let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=s.jsx(Q,{name:"arrow"}),e[2]=c):c=e[2];let l;e[3]!==r.currentRef?(l=s.jsx("span",{className:"base-picker-ref",children:r.currentRef}),e[3]=r.currentRef,e[4]=l):l=e[4];let p;e[5]!==a||e[6]!==i||e[7]!==r.currentReason||e[8]!==n?(p=r.currentReason||a?s.jsxs("span",{className:"base-picker-meta",children:[r.currentReason?s.jsxs("span",{className:i?"base-picker-reason base-picker-reason-low":"base-picker-reason",children:["(",n,")"]}):null,a?s.jsxs("span",{className:"base-picker-aheadbehind",children:["+",a.ahead," -",a.behind]}):null]}):null,e[5]=a,e[6]=i,e[7]=r.currentReason,e[8]=n,e[9]=p):p=e[9];let d;e[10]===Symbol.for("react.memo_cache_sentinel")?(d=s.jsx(Q,{name:"expand"}),e[10]=d):d=e[10];let u;return e[11]!==o||e[12]!==l||e[13]!==p?(u=s.jsxs("span",{className:"base-picker-label",children:[o,c,l,p,d]}),e[11]=o,e[12]=l,e[13]=p,e[14]=u):u=e[14],u}function Jt(t){const e=_.c(34),{domId:r,entry:i,label:n,onHover:a,onSelect:o,selected:c}=t,{row:l}=i,p=l.secondary??l.worktreeDir??l.reason??"";let d;e[0]!==i.firstInGroup||e[1]!==i.groupLabel?(d=i.firstInGroup?s.jsx("div",{className:"base-picker-group-header",role:"presentation",children:i.groupLabel}):null,e[0]=i.firstInGroup,e[1]=i.groupLabel,e[2]=d):d=e[2];const u=c?"base-picker-row base-picker-row-selected":"base-picker-row";let m;e[3]!==o?(m=y=>{y.preventDefault(),o()},e[3]=o,e[4]=m):m=e[4];let h;e[5]!==i.match||e[6]!==i.raw||e[7]!==n||e[8]!==l.label||e[9]!==l.ref?(h=i.raw?n("branchPickerUseRaw").replace("{ref}",l.ref):Zt(l.label,i.match),e[5]=i.match,e[6]=i.raw,e[7]=n,e[8]=l.label,e[9]=l.ref,e[10]=h):h=e[10];let w;e[11]!==h?(w=s.jsx("span",{className:"base-picker-row-primary",children:h}),e[11]=h,e[12]=w):w=e[12];let f;e[13]!==n||e[14]!==l.current?(f=l.current?s.jsx("span",{className:"base-picker-pill",children:n("branchPickerCurrent")}):null,e[13]=n,e[14]=l.current,e[15]=f):f=e[15];let g;e[16]!==p?(g=p?s.jsx("span",{className:"base-picker-row-secondary",children:p}):null,e[16]=p,e[17]=g):g=e[17];let x;e[18]!==r||e[19]!==a||e[20]!==c||e[21]!==u||e[22]!==m||e[23]!==w||e[24]!==f||e[25]!==g?(x=s.jsxs("div",{id:r,role:"option",tabIndex:-1,"aria-selected":c,className:u,onMouseMove:a,onMouseDown:m,children:[w,f,g]}),e[18]=r,e[19]=a,e[20]=c,e[21]=u,e[22]=m,e[23]=w,e[24]=f,e[25]=g,e[26]=x):x=e[26];let b;e[27]!==i.moreCount||e[28]!==n?(b=i.moreCount>0?s.jsx("div",{className:"base-picker-more",role:"presentation",children:n("branchPickerMore").replace("{count}",String(i.moreCount))}):null,e[27]=i.moreCount,e[28]=n,e[29]=b):b=e[29];let v;return e[30]!==d||e[31]!==x||e[32]!==b?(v=s.jsxs(s.Fragment,{children:[d,x,b]}),e[30]=d,e[31]=x,e[32]=b,e[33]=v):v=e[33],v}function $e(t,e){return`${t}-row-${e}`}function Zt(t,e){if(!e)return t;const[r,i]=e;return s.jsxs(s.Fragment,{children:[t.slice(0,r),s.jsx("strong",{children:t.slice(r,i)}),t.slice(i)]})}function Qt(t,e,r){const i=e.trim(),n=[];let a=!1;if(t&&i==="")for(const o of t){const c=We(o,r),l=$t[o.id]??Wt,p=o.rows.slice(0,l),d=o.rows.length-p.length;p.forEach((u,m)=>{n.push({row:u,groupId:o.id,groupLabel:c,firstInGroup:m===0,match:null,raw:!1,moreCount:m===p.length-1?d:0})})}else if(t)for(const o of t){if(n.length>=Oe)break;const c=We(o,r);let l=!0;for(const p of o.rows){if(n.length>=Oe)break;const d=er(p.label,i);d!=null&&(a=!0,n.push({row:p,groupId:o.id,groupLabel:c,firstInGroup:l,match:d,raw:!1,moreCount:0}),l=!1)}}return i!==""&&!a&&n.unshift({row:{ref:i,label:i},groupId:"__raw",groupLabel:"",firstInGroup:!1,match:null,raw:!0,moreCount:0}),n}function We(t,e){const r=Vt[t.id];return r?e(r):t.label||t.id}function er(t,e){const r=t.toLowerCase(),i=e.toLowerCase(),n=r.indexOf(i);if(n>=0)return[n,n+i.length];let a=0,o=-1;for(let c=0;c=0?[o,o+1]:null}async function tr(t){const e=await fetch(t,{cache:"no-store"});if(!e.ok)throw new Error(`refs request failed (${e.status})`);const r=await e.json();if(!r||!Array.isArray(r.groups))throw new Error("refs response missing groups");return r}const et=40;function Re(t,e){return e==="additions"?{start:t.additionStart,count:t.additionCount,lineIndex:t.additionLineIndex}:{start:t.deletionStart,count:t.deletionCount,lineIndex:t.deletionLineIndex}}function ue(t,e){return(t[e]??"").replace(/\r?\n$/,"")}function tt(t,e){const r=e==="additions"?t?.additionLines:t?.deletionLines;return Array.isArray(r)?r:[]}function rr(t,e,r){if(t?.hunks==null||!Number.isFinite(r))return null;for(const i of t.hunks){const{start:n,count:a,lineIndex:o}=Re(i,e);if(r>=n&&r=d.start+d.count||p.hunkContent==null)continue;let u=p.additionStart,m=p.deletionStart;for(const h of p.hunkContent){if(h.type==="context"){for(let f=0;f=n&&g<=a&&l.push(` ${ue(o,h.additionLineIndex+f)}`)}u+=h.lines,m+=h.lines;continue}if(e==="additions"?h.additions>0&&u<=a&&u+h.additions-1>=n:h.deletions>0&&m<=a&&m+h.deletions-1>=n){for(let f=0;f=8&&e.pendingItems.length=j||k-a>=M)&&(m(),await He(),n=performance.now())}function m(){if(e.pendingItems.length===0)return;const y=e.pendingItems.splice(0,e.pendingItems.length);e.pendingItemById.clear(),e.items.push(...y),t.onBatch(y),r.flushCount+=1,r.maxBatchSize=Math.max(r.maxBatchSize,y.length),r.fileCount=e.items.length,r.renderableFileCount=e.items.length,h(),t.onMetrics({...r}),a=performance.now(),i=!1}function h(){r.treeRefreshCount+=1,t.onTreeSource(dr(e))}async function w(y){if(y.trim()==="")return;const k=mr(y);k!=null&&(o=nt(k,c,t.label),c+=1);const j=`cmux-diff-file-${e.fileIndex}`;await d(t.processFile(y,{cacheKey:j,isGitDiff:!0}),o)}const f=await fetch(t.patchURL,{cache:"no-store"});if(!f.ok)throw new Error(`${t.label("loadingDiff")} (${f.status})`);if(!f.body?.getReader){const y=await f.text();await Ue(y,t,d),await u(!0),r.completedAt=performance.now(),t.onComplete({...r});return}const g=new TextDecoder,x=f.body.getReader(),b=ur();for(;;){const{done:y,value:k}=await x.read();if(y){const j=g.decode();j.length>0&&(b.push(j),await Ce(b,w));break}b.push(g.decode(k,{stream:!0})),await Ce(b,w)}const v=b.finish();v.fileText!=null?(await w(v.fileText),await Ce(b,w)):v.fallbackPatchContent!=null&&await Ue(v.fallbackPatchContent,t,d),await u(!0),r.completedAt=performance.now(),t.onMetrics({...r}),t.onComplete({...r})}function ar(){return{diffStats:{addedLines:0,deletedLines:0,fileCount:0,totalLinesOfCode:0},fileIndex:0,gitStatusByPath:new Map,itemIdToFile:new Map,itemIdByTreePath:new Map,nextCollisionSuffixByBase:new Map,items:[],pathStateByTreePath:new Map,paths:[],pathToItemId:new Map,pendingGitStatusRemovePaths:new Set,pendingGitStatusSetByPath:new Map,pendingItems:[],pendingItemById:new Map,pendingStatsChanged:!1,statsByPath:new Map,treePathByItemId:new Map}}function sr(t,e,r,i,n){if(!e)return null;const a=ce(e,n),o=r==null?a:`${r}/${a}`,c=a.length===0?void 0:t.pathStateByTreePath.get(o),l=c==null?void 0:lr(t,o,c),p=gr(e),u={id:c!=null||t.itemIdToFile.has(o)?it(t,`${o}?2`):o,type:"diff",fileDiff:e,version:0,collapsed:i},m=t.items.length+t.pendingItems.length;t.fileIndex+=1,t.pendingItems.push(u),t.pendingItemById.set(u.id,u),t.itemIdToFile.set(u.id,{fileOrder:m,path:a}),t.itemIdByTreePath.set(o,u.id),t.treePathByItemId.set(u.id,o),t.diffStats.addedLines+=p.added,t.diffStats.deletedLines+=p.deleted,t.diffStats.fileCount+=1,t.diffStats.totalLinesOfCode+=e.unifiedLineCount??e.splitLineCount??0;const h=t.statsByPath.get(o);return t.statsByPath.set(o,p),c!=null&&!xr(h,p)&&(t.pendingStatsChanged=!0),a.length>0&&(c==null&&t.paths.push(o),t.pathToItemId.set(o,u.id),cr(t,o,e.type,c?.sawDeleted===!0),t.pathStateByTreePath.set(o,{currentItem:u,currentItemId:u.id,currentType:e.type,fileOrder:m,sawDeleted:c?.sawDeleted===!0||e.type==="deleted"})),{item:u,renamedItem:l}}function lr(t,e,r){const i=r.currentItemId,n=r.currentType==="deleted"?"?deleted":"?previous",a=it(t,`${e}${n}`),o={...r.currentItem,id:a};r.currentItem=o,r.currentItemId=a,Ve(t.items,i,o);const c=t.itemIdToFile.get(i);if(c&&(t.itemIdToFile.delete(i),t.itemIdToFile.set(a,c)),t.treePathByItemId.has(i)&&(t.treePathByItemId.delete(i),t.treePathByItemId.set(a,e)),t.pendingItemById.has(i)){Ve(t.pendingItems,i,o),t.pendingItemById.delete(i),t.pendingItemById.set(a,o);return}return{oldId:i,newId:a}}function Ve(t,e,r){const i=t.findIndex(n=>n.id===e);i!==-1&&(t[i]=r)}function it(t,e){if(!t.itemIdToFile.has(e))return e;let r=t.nextCollisionSuffixByBase.get(e)??2,i=`${e}-${r}`;for(;t.itemIdToFile.has(i);)r+=1,i=`${e}-${r}`;return t.nextCollisionSuffixByBase.set(e,r+1),i}function cr(t,e,r,i){if(i&&r!=="deleted"){t.gitStatusByPath.delete(e)&&Ge(t,e);return}const n=br(r);if(n==="modified"){t.gitStatusByPath.delete(e)&&Ge(t,e);return}if(t.gitStatusByPath.get(e)?.status===n)return;const o={path:e,status:n};t.gitStatusByPath.set(e,o),t.pendingGitStatusRemovePaths.delete(e),t.pendingGitStatusSetByPath.set(e,o)}function Ge(t,e){t.pendingGitStatusSetByPath.delete(e),t.pendingGitStatusRemovePaths.add(e)}function dr(t){const e=t.lastTreeSource,r=[...t.paths],i={diffStats:{...t.diffStats},gitStatus:Array.from(t.gitStatusByPath.values()),gitStatusPatch:fr(t),pathCount:r.length,paths:r,pathToItemId:new Map(t.pathToItemId),previousSource:e,statsChanged:t.pendingStatsChanged,statsByPath:new Map(t.statsByPath),treePathByItemId:new Map(t.treePathByItemId)};return t.pendingStatsChanged=!1,t.lastTreeSource=i,i}function fr(t){if(t.pendingGitStatusRemovePaths.size===0&&t.pendingGitStatusSetByPath.size===0)return;const e={};return t.pendingGitStatusRemovePaths.size>0&&(e.remove=Array.from(t.pendingGitStatusRemovePaths),t.pendingGitStatusRemovePaths.clear()),t.pendingGitStatusSetByPath.size>0&&(e.set=Array.from(t.pendingGitStatusSetByPath.values()),t.pendingGitStatusSetByPath.clear()),e}async function Ue(t,e,r){const i=e.parsePatchFiles(t,"cmux-diff"),n=i.length>1;for(const[a,o]of i.entries()){const c=n?nt(o.patchMetadata,a,e.label):void 0;for(const l of o.files??[])await r(l,c)}}function ur(){let t,e="",r=0,i=!1;const n="diff --git ",a=` @@ -142,4 +142,4 @@ ${a} background-color: var(--cmux-diff-tree-sticky-bg) !important; box-shadow: 0 1px 0 var(--trees-border-color); } - `}function Qe(t,e){const r=t.palette??{},i=Dt(t.background),n=Jr(t),a=de(t.foreground,n,t.type==="light"?"#000000":"#ffffff"),o=(c,l=a)=>de(c,n,l);return{name:t.name,displayName:t.ghosttyName,type:t.type,colors:{"editor.background":i,"editor.foreground":a,"terminal.background":i,"terminal.foreground":a,"terminal.ansiBlack":o(r[0]),"terminal.ansiRed":o(r[1]),"terminal.ansiGreen":o(r[2]),"terminal.ansiYellow":o(r[3]),"terminal.ansiBlue":o(r[4]),"terminal.ansiMagenta":o(r[5]),"terminal.ansiCyan":o(r[6]),"terminal.ansiWhite":o(r[7]),"terminal.ansiBrightBlack":o(r[8]),"terminal.ansiBrightRed":o(r[9],o(r[1])),"terminal.ansiBrightGreen":o(r[10],o(r[2])),"terminal.ansiBrightYellow":o(r[11],o(r[3])),"terminal.ansiBrightBlue":o(r[12],o(r[4])),"terminal.ansiBrightMagenta":o(r[13],o(r[5])),"terminal.ansiBrightCyan":o(r[14],o(r[6])),"terminal.ansiBrightWhite":o(r[15]),"gitDecoration.addedResourceForeground":o(r[10],o(r[2],"#32d74b")),"gitDecoration.deletedResourceForeground":o(r[9],o(r[1],"#ff453a")),"gitDecoration.modifiedResourceForeground":o(r[12],o(r[4],"#0a84ff")),"editor.selectionBackground":t.selectionBackground,"editor.selectionForeground":t.selectionForeground},tokenColors:[{settings:{foreground:a,background:i}},{scope:["comment","punctuation.definition.comment"],settings:{foreground:o(r[8]),fontStyle:"italic"}},{scope:["string","constant.other.symbol"],settings:{foreground:o(r[2])}},{scope:["constant.numeric","constant.language","support.constant"],settings:{foreground:o(r[3])}},{scope:["keyword","storage","storage.type"],settings:{foreground:o(r[5])}},{scope:["entity.name.function","support.function"],settings:{foreground:o(r[4])}},{scope:["entity.name.type","entity.name.class","support.type"],settings:{foreground:o(r[6])}},{scope:["markup.heading","punctuation.definition.heading"],settings:{foreground:o(r[12],o(r[4])),fontStyle:"bold"}},{scope:["markup.bold","punctuation.definition.bold"],settings:{foreground:o(r[11],o(r[3])),fontStyle:"bold"}},{scope:["markup.italic","punctuation.definition.italic"],settings:{foreground:o(r[13],o(r[5])),fontStyle:"italic"}},{scope:["markup.inline.raw","markup.raw","markup.fenced_code","markup.raw.block"],settings:{foreground:o(r[10],o(r[2]))}},{scope:["markup.underline.link","string.other.link","markup.link"],settings:{foreground:o(r[14],o(r[6]))}},{scope:["markup.quote","punctuation.definition.quote"],settings:{foreground:o(r[8]),fontStyle:"italic"}},{scope:["markup.list","punctuation.definition.list","markup.table"],settings:{foreground:o(r[9],o(r[1]))}},{scope:["variable","meta.definition.variable"],settings:{foreground:a}},{scope:["invalid","message.error"],settings:{foreground:o(r[9],o(r[1]))}}]}}function Jr(t){return typeof t.background=="string"&&t.background.trim()!==""?t.background.trim():t.type==="light"?"#ffffff":"#000000"}function ne(t,e={}){const r=e.pending===!0;return{error:e.error===!0,loading:e.loading===!0||r,message:t,pending:r,statusOnly:e.statusOnly===!0}}function Zr(t,e){const r=t.payload;return r?.pendingReplacement===!0?ne(r.statusMessage??e("loadingDiff"),{loading:!0,pending:!0}):typeof r?.statusMessage=="string"&&r.statusMessage.length>0?ne(r.statusMessage,{error:r.statusIsError===!0,loading:!1,statusOnly:!0}):ne(e("loadingDiff"),{loading:!0})}function ze(t){document.body.dataset.loading=t.loading?"true":"false",document.body.dataset.statusOnly=t.statusOnly?"true":"false"}function Qr(t){const e=(Number.isFinite(t.available)?t.available:0)-t.reserved,r=[],i=[];let n=0,a=!1;for(const o of t.items){const c=n+Math.max(0,o.width);!a&&c<=e?(n=c,r.push(o.id)):(a=!0,i.push(o.id))}return{visible:r,overflow:i}}function ei(t){const e=_.c(3),[r,i]=I.useState(null),n=I.useRef(null);let a,o;return e[0]!==t?(a=()=>{const c=t.current;if(!c||typeof ResizeObserver>"u")return;const l=new ResizeObserver(p=>{for(const d of p){const u=d.contentBoxSize?.[0]?.inlineSize??d.contentRect.width,m=Math.round(u);m!==n.current&&(n.current=m,i(m))}});return l.observe(c),()=>l.disconnect()},o=[t],e[0]=t,e[1]=a,e[2]=o):(a=e[1],o=e[2]),I.useEffect(a,o),r}const ti=/\b(Android|iPhone|iPad|iPod|Mobile)\b/i;function ri(t){return ti.test(t??"")?1:3}function ii(){return ri(typeof navigator>"u"?void 0:navigator.userAgent)}function ni(t){return{poolSize:ii(),workerFactory:()=>new Worker(t,{type:"module"})}}const oi=["82%","64%","76%","58%","70%","46%"],ai=["58%","88%","72%","94%","64%","82%","52%","78%"],si="./assets/pierre-diffs-1.2.7-trees-1.0.0-beta.4/worker-pool/worker-portable.js",mt="cmux.diffViewer.layout";function li(t,e){const r=t.payload??{};return{activeItemId:"",activeTreePath:"",comments:[],copyFeedback:"",draft:null,fileSearchOpen:!1,fileSearchRequest:0,filesWidth:252,filesVisible:!0,items:[],languages:["text"],metrics:null,options:{collapsed:!1,diffIndicators:"bars",expandUnchanged:!1,layout:xi(r),lineNumbers:!0,showBackgrounds:!0,wordDiffs:!1,wordWrap:!1},optionsOpen:!1,status:e,treeSource:null}}function ci(t,e){switch(e.type){case"append-items":{const r=e.items.map(n=>{en(n);const a=kr(n,t.comments,t.draft);return t.options.collapsed?{...a,collapsed:!0}:a}),i=rn(t.languages,r.flatMap(tn));return{...t,activeItemId:t.activeItemId||r[0]?.id||"",items:[...t.items,...r],languages:i,status:t.status.loading?ne("",{loading:!1}):t.status}}case"remove-comment":{const r=t.comments.filter(i=>i.id!==e.id);return{...t,comments:r,items:be(t.items,r,t.draft)}}case"rename-item":return{...t,activeItemId:t.activeItemId===e.oldId?e.newId:t.activeItemId,draft:t.draft?.itemId===e.oldId?{...t.draft,itemId:e.newId}:t.draft,items:t.items.map(r=>r.id===e.oldId||r.id===e.newId?{...r,id:e.newId,version:(r.version??0)+1}:r)};case"set-active-item":return{...t,activeItemId:e.itemId,activeTreePath:e.treePath??t.activeTreePath};case"set-comments":return{...t,comments:e.comments,items:be(t.items,e.comments,t.draft)};case"set-copy-feedback":return{...t,copyFeedback:e.message};case"set-draft":return{...t,draft:e.draft,items:be(t.items,t.comments,e.draft)};case"set-file-search-open":return{...t,fileSearchOpen:e.open,filesVisible:e.open?!0:t.filesVisible};case"request-file-search":return{...t,fileSearchOpen:!0,fileSearchRequest:t.fileSearchRequest+1,filesVisible:!0};case"set-files-width":return{...t,filesWidth:e.width};case"set-files-visible":return{...t,filesVisible:e.visible};case"set-metrics":return{...t,metrics:e.metrics};case"set-option":return e.key==="collapsed"?{...t,options:{...t.options,collapsed:!!e.value},items:t.items.map(r=>({...r,collapsed:!!e.value,version:(r.version??0)+1}))}:{...t,options:{...t.options,[e.key]:e.value}};case"set-options-open":return{...t,optionsOpen:e.open};case"set-status":return{...t,status:e.status};case"set-tree-source":{const r=e.source,i=t.activeItemId?r.treePathByItemId.get(t.activeItemId)??t.activeTreePath:t.activeTreePath;return{...t,activeTreePath:i,treeSource:r}}case"upsert-comment":{const i=t.comments.some(n=>n.id===e.comment.id)?t.comments.map(n=>n.id===e.comment.id?e.comment:n):[...t.comments,e.comment];return{...t,comments:i,items:be(t.items,i,t.draft)}}}}function di({config:t,initialStatus:e}){const r=t.payload??{},i=pt(r.labels,{assertMissing:ut()}),n=_e(r.appearance),[a,o]=I.useReducer(ci,li(t,e)),c=gt(a),l=I.useRef(null),p=I.useRef(0),d=I.useRef(null),u=I.useRef(null),m=fi(t.assets?.workerModuleURL),h=ni(m),w=Kr(a.options,n,a.languages),f=typeof r.repoRoot=="string"&&r.repoRoot!==""?r.repoRoot:null,g=jr()&&f!=null,x=_r(r),b=ui({bridgeAvailable:g,dispatch:o,latestState:c,repoRoot:f}),v=qr(a.options,n);v.onGutterUtilityClick=b.onGutterUtilityClick,sn(a),on(r,i,o),Ji(t,i,o,c),Tr(g?f:null,b.onLoaded),cn(a.optionsOpen,o);const y=(C,F)=>{const P=C.metadata;return P.kind==="draft"?s.jsx(st,{labels:x,onCancel:()=>o({type:"set-draft",draft:null}),onSave:N=>b.saveDraft(F,N)}):s.jsx(Rr,{comment:P.comment,labels:x,onDelete:()=>b.remove(P.comment),onSaveMessage:N=>b.editMessage(P.comment,N,F.fileDiff)})},k=Number.isFinite(a.metrics?.completedAt)&&(a.metrics?.completedAt??0)>0,j=Sr(a.items,a.comments,k),M=C=>{C.itemId!=null&&(C.anchor.state==="outdated"?l.current?.scrollTo({type:"item",id:C.itemId,align:"start",behavior:"smooth-auto"}):l.current?.scrollTo({type:"line",id:C.itemId,lineNumber:C.anchor.line,side:C.comment.side,align:"center",behavior:"smooth-auto"}),o({type:"set-active-item",itemId:C.itemId,treePath:a.treeSource?.treePathByItemId.get(C.itemId)}))},R=a.treeSource?.treePathByItemId.get(a.activeItemId)??a.activeTreePath,S=I.useCallback(C=>{const F=c.current,P=dn(C,F.items);P&&(l.current?.scrollTo({type:"item",id:P,align:"start",behavior:"smooth-auto"}),o({type:"set-active-item",itemId:P,treePath:F.treeSource?.treePathByItemId.get(P)}))},[c]),T=I.useCallback(C=>{const F=c.current,P=un(F.items,p.current,E=>l.current?.getInstance()?.getTopForItem(E)),N=fn(P||F.activeItemId,F.items,C);N&&S(N)},[c,S]),B=I.useCallback(C=>{p.current=C},[]);ln(u,o,T);const O=C=>{ze(C),o({type:"set-status",status:C})},D=C=>{wi(C),o({type:"set-option",key:"layout",value:C})};return s.jsxs("div",{id:"app",children:[s.jsx(yi,{config:t,label:i,onCopyGitApply:async()=>{try{const C=await Bt(r.patchURL,i,d.current);o({type:"set-copy-feedback",message:C})}catch{o({type:"set-copy-feedback",message:i("copyFailedGitApplyCommand")})}},onJump:S,onNavigate:C=>{O(ne(i("loadingDiff"),{pending:!0})),window.location.href=Rt(C)},onReload:()=>window.location.reload(),onSetLayout:D,dispatch:o,state:a}),s.jsxs("section",{id:"content",style:{"--cmux-diff-files-width":`${a.filesWidth}px`},children:[s.jsx(Bi,{commentEntries:j,commentLabels:x,hasDraft:a.draft!=null,label:i,onSelectComment:M,onSelectItem:S,selectedPath:R,dispatch:o,state:a}),s.jsx("main",{id:"viewer","aria-label":i("diffViewer"),children:a.items.length>0?s.jsxs(yt,{poolOptions:h,highlighterOptions:w,children:[s.jsx(vi,{codeViewRef:l,highlighterOptions:w}),s.jsx(kt,{ref:l,className:"code-view-root",containerRef:u,items:a.items,onScroll:B,options:v,renderAnnotation:(C,F)=>y(C,F)})]}):null}),s.jsx($i,{label:i,status:a.status})]}),s.jsx("textarea",{ref:d,"aria-hidden":"true",readOnly:!0,tabIndex:-1,className:"copy-fallback-textarea"})]})}function fi(t){return new URL(t||si,window.location.href)}function ui(t){const e=_.c(23),{bridgeAvailable:r,dispatch:i,latestState:n,repoRoot:a}=t;let o;e[0]!==i?(o=x=>i({type:"set-comments",comments:x}),e[0]=i,e[1]=o):o=e[1];const c=o;let l;e[2]!==i?(l=(x,b)=>{const v=x.side==="deletions"?"deletions":"additions";i({type:"set-draft",draft:{itemId:b.item.id,side:v,startLine:Math.min(x.start,x.end),endLine:Math.max(x.start,x.end)}})},e[2]=i,e[3]=l):l=e[3];const p=l;let d;e[4]!==r||e[5]!==i||e[6]!==n||e[7]!==a?(d=(x,b)=>{const v=n.current.draft;if(v==null||v.itemId!==x.id||b.trim()==="")return;const y={filePath:ce(x.fileDiff,""),side:v.side,startLine:v.startLine,endLine:v.endLine,lineText:Te(x.fileDiff,v.side,v.endLine)??"",message:b},k={...y,submissionText:Ke(y,x.fileDiff)};(r&&a!=null?qe(a,k):Promise.resolve(gi(k))).then(M=>{i({type:"upsert-comment",comment:M}),i({type:"set-draft",draft:null})}).catch(hi)},e[4]=r,e[5]=i,e[6]=n,e[7]=a,e[8]=d):d=e[8];const u=d;let m;e[9]!==r||e[10]!==i||e[11]!==a?(m=(x,b,v)=>{if(b.trim()==="")return;const y={...x,message:b,updatedAt:new Date().toISOString()},k={...y,submissionText:Ke(y,v)};(r&&a!=null?qe(a,k):Promise.resolve(k)).then(M=>i({type:"upsert-comment",comment:M})).catch(mi)},e[9]=r,e[10]=i,e[11]=a,e[12]=m):m=e[12];const h=m;let w;e[13]!==r||e[14]!==i||e[15]!==a?(w=x=>{r&&a!=null&&Ir(a,x.id).catch(pi),i({type:"remove-comment",id:x.id})},e[13]=r,e[14]=i,e[15]=a,e[16]=w):w=e[16];const f=w;let g;return e[17]!==h||e[18]!==p||e[19]!==c||e[20]!==f||e[21]!==u?(g={editMessage:h,onGutterUtilityClick:p,onLoaded:c,remove:f,saveDraft:u},e[17]=h,e[18]=p,e[19]=c,e[20]=f,e[21]=u,e[22]=g):g=e[22],g}function pi(t){return console.warn("cmux diff comment delete failed",t)}function mi(t){return console.warn("cmux diff comment edit failed",t)}function hi(t){return console.warn("cmux diff comment save failed",t)}function gi(t){const e=new Date().toISOString();return{...t,id:crypto.randomUUID(),createdAt:e,updatedAt:e}}function xi(t){const e=ht(t.layout);return t.layoutSource==="explicit"&&e?e:bi()??e??"unified"}function bi(){try{return ht(window.localStorage.getItem(mt))}catch{return null}}function wi(t){try{window.localStorage.setItem(mt,t)}catch{}}function ht(t){return t==="split"||t==="unified"?t:null}function vi(t){const{codeViewRef:e,highlighterOptions:r}=t;return Wi(r,e),null}function yi(t){const e=_.c(63),{config:r,dispatch:i,label:n,onCopyGitApply:a,onJump:o,onNavigate:c,onReload:l,onSetLayout:p,state:d}=t;let u;e[0]!==r.payload?(u=r.payload??{},e[0]=r.payload,e[1]=u):u=e[1];const m=u,h=typeof m.externalURL=="string"&&m.externalURL.length>0?m.externalURL:null,w=I.useRef(null),f=ei(w);let g;if(e[2]!==h||e[3]!==m||e[4]!==f){const $=[{id:"files-toggle",width:Ie},{id:"layout-toggle",width:Ie},...h?[{id:"external-link",width:Ie}]:[]];g=f==null?new Set:new Set(Qr({available:f,reserved:ki+(ji(m)?Si:0),items:$}).overflow),e[2]=h,e[3]=m,e[4]=f,e[5]=g}else g=e[5];const x=g,b=!x.has("files-toggle"),v=!x.has("layout-toggle"),y=h!=null&&!x.has("external-link");let k;e[6]!==n||e[7]!==c||e[8]!==m?(k=s.jsx(Ci,{label:n,onNavigate:c,payload:m}),e[6]=n,e[7]=c,e[8]=m,e[9]=k):k=e[9];let j;e[10]!==n||e[11]!==o||e[12]!==d.activeItemId||e[13]!==d.items?(j=s.jsx("div",{className:"toolbar-middle flex min-w-0 flex-1 items-center justify-center gap-1.5",children:s.jsx(Ri,{items:d.items,label:n,onJump:o,selectedItemId:d.activeItemId})}),e[10]=n,e[11]=o,e[12]=d.activeItemId,e[13]=d.items,e[14]=j):j=e[14];let M;e[15]!==h||e[16]!==n||e[17]!==y?(M=y?s.jsx("a",{id:"external-link",className:"toolbar-icon",href:h??void 0,target:"_blank",rel:"noreferrer",title:n("openSourceURL"),"aria-label":n("openSourceURL"),children:s.jsx(Q,{name:"external"})}):null,e[15]=h,e[16]=n,e[17]=y,e[18]=M):M=e[18];let R;e[19]!==n||e[20]!==p||e[21]!==v||e[22]!==d.options?(R=v?s.jsx("button",{id:"layout-toggle",className:"toolbar-icon",type:"button",title:d.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),"aria-label":d.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),onClick:()=>p(d.options.layout==="split"?"unified":"split"),children:s.jsx(Q,{name:d.options.layout})}):null,e[19]=n,e[20]=p,e[21]=v,e[22]=d.options,e[23]=R):R=e[23];let S;e[24]!==n?(S=n("options"),e[24]=n,e[25]=S):S=e[25];let T;e[26]!==n?(T=n("options"),e[26]=n,e[27]=T):T=e[27];let B;e[28]!==i||e[29]!==d.optionsOpen?(B=()=>i({type:"set-options-open",open:!d.optionsOpen}),e[28]=i,e[29]=d.optionsOpen,e[30]=B):B=e[30];let O;e[31]===Symbol.for("react.memo_cache_sentinel")?(O=s.jsx(Q,{name:"dots"}),e[31]=O):O=e[31];let D;e[32]!==d.optionsOpen||e[33]!==S||e[34]!==T||e[35]!==B?(D=s.jsx("button",{id:"options-button",className:"toolbar-icon",type:"button",title:S,"aria-label":T,"aria-expanded":d.optionsOpen,"aria-controls":"options-menu",onClick:B,children:O}),e[32]=d.optionsOpen,e[33]=S,e[34]=T,e[35]=B,e[36]=D):D=e[36];let C;e[37]!==i||e[38]!==n||e[39]!==b||e[40]!==d.filesVisible?(C=b?s.jsx("button",{id:"files-toggle",className:"toolbar-icon",type:"button",title:d.filesVisible?n("hideFiles"):n("showFiles"),"aria-label":d.filesVisible?n("hideFiles"):n("showFiles"),"aria-pressed":d.filesVisible,onClick:()=>i({type:"set-files-visible",visible:!d.filesVisible}),children:s.jsx(Q,{name:"files"})}):null,e[37]=i,e[38]=n,e[39]=b,e[40]=d.filesVisible,e[41]=C):C=e[41];let F;e[42]!==d.copyFeedback?(F=s.jsx("span",{id:"copy-feedback",className:"visually-hidden","aria-live":"polite",children:d.copyFeedback}),e[42]=d.copyFeedback,e[43]=F):F=e[43];let P;e[44]!==D||e[45]!==C||e[46]!==F||e[47]!==M||e[48]!==R?(P=s.jsxs("div",{className:"toolbar-actions flex items-center gap-1.5",children:[M,R,D,C,F]}),e[44]=D,e[45]=C,e[46]=F,e[47]=M,e[48]=R,e[49]=P):P=e[49];let N;e[50]!==i||e[51]!==h||e[52]!==n||e[53]!==a||e[54]!==l||e[55]!==p||e[56]!==d?(N=d.optionsOpen?s.jsx(Ti,{dispatch:i,externalURL:h,label:n,onCopyGitApply:a,onReload:l,onSetLayout:p,state:d}):null,e[50]=i,e[51]=h,e[52]=n,e[53]=a,e[54]=l,e[55]=p,e[56]=d,e[57]=N):N=e[57];let E;return e[58]!==P||e[59]!==N||e[60]!==k||e[61]!==j?(E=s.jsxs("header",{id:"toolbar",ref:w,children:[k,j,P,N]}),e[58]=P,e[59]=N,e[60]=k,e[61]=j,e[62]=E):E=e[62],E}const Ie=28,ki=248,Si=60;function ji(t){return Array.isArray(t?.repoOptions)&&t.repoOptions.length>=2}function Ci(t){const e=_.c(21),{label:r,onNavigate:i,payload:n}=t;let a;e[0]!==r?(a=r("diffTarget"),e[0]=r,e[1]=a):a=e[1];let o;e[2]!==i||e[3]!==n.sourceOptions||e[4]!==a?(o=s.jsx(Le,{ariaLabel:a,fallbackValue:"",id:"source-select",options:n.sourceOptions,onNavigate:i}),e[2]=i,e[3]=n.sourceOptions,e[4]=a,e[5]=o):o=e[5];let c;e[6]!==r?(c=r("repoPath"),e[6]=r,e[7]=c):c=e[7];const l=n.repoRoot??"";let p;e[8]!==i||e[9]!==n.repoOptions||e[10]!==c||e[11]!==l?(p=s.jsx(Le,{ariaLabel:c,fallbackValue:l,id:"repo-select",options:n.repoOptions,onNavigate:i}),e[8]=i,e[9]=n.repoOptions,e[10]=c,e[11]=l,e[12]=p):p=e[12];let d;e[13]!==r||e[14]!==i||e[15]!==n?(d=s.jsx(Ii,{label:r,onNavigate:i,payload:n}),e[13]=r,e[14]=i,e[15]=n,e[16]=d):d=e[16];let u;return e[17]!==o||e[18]!==p||e[19]!==d?(u=s.jsxs("div",{className:"toolbar-left flex min-w-0 items-center gap-1.5",children:[o,p,d]}),e[17]=o,e[18]=p,e[19]=d,e[20]=u):u=e[20],u}function Ii(t){const e=_.c(13),{label:r,onNavigate:i,payload:n}=t;let a;e[0]!==n?(a=Pi(n),e[0]=n,e[1]=a):a=e[1];const o=a;if(o){let d;return e[2]!==r||e[3]!==i||e[4]!==o?(d=s.jsx(qt,{label:r,onNavigate:i,picker:o}),e[2]=r,e[3]=i,e[4]=o,e[5]=d):d=e[5],d}let c;e[6]!==r?(c=r("branchBase"),e[6]=r,e[7]=c):c=e[7];const l=n.branchBaseRef??"";let p;return e[8]!==i||e[9]!==n.baseOptions||e[10]!==c||e[11]!==l?(p=s.jsx(Le,{ariaLabel:c,fallbackValue:l,id:"base-select",options:n.baseOptions,onNavigate:i}),e[8]=i,e[9]=n.baseOptions,e[10]=c,e[11]=l,e[12]=p):p=e[12],p}function Pi(t){const e=t?.branchPicker;return Mi(e)?e:null}function Mi(t){return!!(t&&typeof t=="object"&&typeof t.refsURL=="string"&&t.refsURL!==""&&typeof t.regenerateURLTemplate=="string"&&t.regenerateURLTemplate!==""&&typeof t.currentRef=="string"&&typeof t.headRef=="string")}function Le(t){const e=_.c(15),{ariaLabel:r,fallbackValue:i,id:n,onNavigate:a,options:o}=t;if(!Array.isArray(o)||o.length<2)return null;let c;e[0]!==o?(c=o.find(_i)??o.find(Fi),e[0]=o,e[1]=c):c=e[1];const l=c,p=l?.value??i;let d;e[2]!==i||e[3]!==a||e[4]!==o||e[5]!==l?.value?(d=h=>{const w=o.find(f=>f.value===h.currentTarget.value);if(!w?.url){h.currentTarget.value=l?.value??i;return}a(w.url)},e[2]=i,e[3]=a,e[4]=o,e[5]=l?.value,e[6]=d):d=e[6];let u;e[7]!==o?(u=o.map(Li),e[7]=o,e[8]=u):u=e[8];let m;return e[9]!==r||e[10]!==n||e[11]!==p||e[12]!==d||e[13]!==u?(m=s.jsx("select",{id:n,"aria-label":r,defaultValue:p,title:r,onChange:d,children:u}),e[9]=r,e[10]=n,e[11]=p,e[12]=d,e[13]=u,e[14]=m):m=e[14],m}function Li(t){return s.jsx("option",{value:t.value,disabled:t.disabled||!t.url,title:t.message,children:t.label},t.value)}function Fi(t){return!t.disabled}function _i(t){return t.selected}function Ri(t){const e=_.c(19),{items:r,label:i,onJump:n,selectedItemId:a}=t;if(r.length===0)return null;let o;e[0]!==i?(o=i("jumpToFile"),e[0]=i,e[1]=o):o=e[1];let c;e[2]!==n?(c=m=>n(m.currentTarget.value),e[2]=n,e[3]=c):c=e[3];let l;e[4]!==i?(l=i("jumpToFile"),e[4]=i,e[5]=l):l=e[5];let p;e[6]!==l?(p=s.jsx("option",{value:"",children:l}),e[6]=l,e[7]=p):p=e[7];let d;if(e[8]!==r||e[9]!==i){let m;e[11]!==i?(m=h=>s.jsx("option",{value:h.id,children:ce(h.fileDiff,i("untitled"))},h.id),e[11]=i,e[12]=m):m=e[12],d=r.map(m),e[8]=r,e[9]=i,e[10]=d}else d=e[10];let u;return e[13]!==a||e[14]!==o||e[15]!==c||e[16]!==p||e[17]!==d?(u=s.jsxs("select",{id:"jump-select","aria-label":o,value:a,onChange:c,children:[p,d]}),e[13]=a,e[14]=o,e[15]=c,e[16]=p,e[17]=d,e[18]=u):u=e[18],u}function Ti(t){const e=_.c(137),{dispatch:r,externalURL:i,label:n,onCopyGitApply:a,onReload:o,onSetLayout:c,state:l}=t;let p;e[0]!==r||e[1]!==l.options?(p=le=>r({type:"set-option",key:le,value:!l.options[le]}),e[0]=r,e[1]=l.options,e[2]=p):p=e[2];const d=p;let u;e[3]!==n?(u=n("options"),e[3]=n,e[4]=u):u=e[4];let m;e[5]!==n?(m=n("refresh"),e[5]=n,e[6]=m):m=e[6];let h;e[7]!==o||e[8]!==m?(h=s.jsx(re,{icon:"refresh",label:m,onClick:o}),e[7]=o,e[8]=m,e[9]=h):h=e[9];let w;e[10]!==n||e[11]!==l.options.wordWrap?(w=l.options.wordWrap?n("disableWordWrap"):n("enableWordWrap"),e[10]=n,e[11]=l.options.wordWrap,e[12]=w):w=e[12];let f;e[13]!==d?(f=()=>d("wordWrap"),e[13]=d,e[14]=f):f=e[14];let g;e[15]!==l.options.wordWrap||e[16]!==w||e[17]!==f?(g=s.jsx(re,{checked:l.options.wordWrap,icon:"wrap",label:w,onClick:f}),e[15]=l.options.wordWrap,e[16]=w,e[17]=f,e[18]=g):g=e[18];const x=l.options.collapsed?"expand":"collapse";let b;e[19]!==n||e[20]!==l.options.collapsed?(b=l.options.collapsed?n("expandAllDiffs"):n("collapseAllDiffs"),e[19]=n,e[20]=l.options.collapsed,e[21]=b):b=e[21];let v;e[22]!==d?(v=()=>d("collapsed"),e[22]=d,e[23]=v):v=e[23];let y;e[24]!==l.options.collapsed||e[25]!==v||e[26]!==x||e[27]!==b?(y=s.jsx(re,{checked:l.options.collapsed,icon:x,label:b,onClick:v}),e[24]=l.options.collapsed,e[25]=v,e[26]=x,e[27]=b,e[28]=y):y=e[28];let k;e[29]===Symbol.for("react.memo_cache_sentinel")?(k=s.jsx("div",{className:"menu-separator"}),e[29]=k):k=e[29];let j;e[30]!==n||e[31]!==l.options.layout?(j=l.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),e[30]=n,e[31]=l.options.layout,e[32]=j):j=e[32];let M;e[33]!==c||e[34]!==l.options.layout?(M=()=>c(l.options.layout==="split"?"unified":"split"),e[33]=c,e[34]=l.options.layout,e[35]=M):M=e[35];let R;e[36]!==l.options.layout||e[37]!==j||e[38]!==M?(R=s.jsx(re,{icon:l.options.layout,label:j,onClick:M}),e[36]=l.options.layout,e[37]=j,e[38]=M,e[39]=R):R=e[39];let S;e[40]!==i||e[41]!==n?(S=i?s.jsx(re,{icon:"external",label:n("openSourceURL"),onClick:()=>window.open(i,"_blank","noreferrer")}):null,e[40]=i,e[41]=n,e[42]=S):S=e[42];let T;e[43]!==n||e[44]!==l.filesVisible?(T=l.filesVisible?n("hideFiles"):n("showFiles"),e[43]=n,e[44]=l.filesVisible,e[45]=T):T=e[45];let B;e[46]!==r||e[47]!==l.filesVisible?(B=()=>r({type:"set-files-visible",visible:!l.filesVisible}),e[46]=r,e[47]=l.filesVisible,e[48]=B):B=e[48];let O;e[49]!==l.filesVisible||e[50]!==T||e[51]!==B?(O=s.jsx(re,{checked:l.filesVisible,icon:"files",label:T,onClick:B}),e[49]=l.filesVisible,e[50]=T,e[51]=B,e[52]=O):O=e[52];let D;e[53]!==n||e[54]!==l.options.expandUnchanged?(D=l.options.expandUnchanged?n("collapseUnchangedContext"):n("expandUnchangedContext"),e[53]=n,e[54]=l.options.expandUnchanged,e[55]=D):D=e[55];let C;e[56]!==d?(C=()=>d("expandUnchanged"),e[56]=d,e[57]=C):C=e[57];let F;e[58]!==l.options.expandUnchanged||e[59]!==D||e[60]!==C?(F=s.jsx(re,{checked:l.options.expandUnchanged,icon:"document",label:D,onClick:C}),e[58]=l.options.expandUnchanged,e[59]=D,e[60]=C,e[61]=F):F=e[61];let P;e[62]!==n||e[63]!==l.options.showBackgrounds?(P=l.options.showBackgrounds?n("hideBackgrounds"):n("showBackgrounds"),e[62]=n,e[63]=l.options.showBackgrounds,e[64]=P):P=e[64];let N;e[65]!==d?(N=()=>d("showBackgrounds"),e[65]=d,e[66]=N):N=e[66];let E;e[67]!==l.options.showBackgrounds||e[68]!==P||e[69]!==N?(E=s.jsx(re,{checked:l.options.showBackgrounds,icon:"background",label:P,onClick:N}),e[67]=l.options.showBackgrounds,e[68]=P,e[69]=N,e[70]=E):E=e[70];let $;e[71]!==n||e[72]!==l.options.lineNumbers?($=l.options.lineNumbers?n("hideLineNumbers"):n("showLineNumbers"),e[71]=n,e[72]=l.options.lineNumbers,e[73]=$):$=e[73];let W;e[74]!==d?(W=()=>d("lineNumbers"),e[74]=d,e[75]=W):W=e[75];let V;e[76]!==l.options.lineNumbers||e[77]!==$||e[78]!==W?(V=s.jsx(re,{checked:l.options.lineNumbers,icon:"numbers",label:$,onClick:W}),e[76]=l.options.lineNumbers,e[77]=$,e[78]=W,e[79]=V):V=e[79];let U;e[80]!==n||e[81]!==l.options.wordDiffs?(U=l.options.wordDiffs?n("disableWordDiffs"):n("enableWordDiffs"),e[80]=n,e[81]=l.options.wordDiffs,e[82]=U):U=e[82];let z;e[83]!==d?(z=()=>d("wordDiffs"),e[83]=d,e[84]=z):z=e[84];let G;e[85]!==l.options.wordDiffs||e[86]!==U||e[87]!==z?(G=s.jsx(re,{checked:l.options.wordDiffs,icon:"word",label:U,onClick:z}),e[85]=l.options.wordDiffs,e[86]=U,e[87]=z,e[88]=G):G=e[88];let ee;e[89]===Symbol.for("react.memo_cache_sentinel")?(ee=s.jsx(Q,{name:"bars"}),e[89]=ee):ee=e[89];let J;e[90]!==n?(J=n("indicatorStyle"),e[90]=n,e[91]=J):J=e[91];let Z;e[92]!==J?(Z=s.jsx("span",{className:"menu-label",children:J}),e[92]=J,e[93]=Z):Z=e[93];let H;e[94]!==n?(H=n("bars"),e[94]=n,e[95]=H):H=e[95];let oe;e[96]!==H?(oe={value:"bars",icon:"bars",label:H},e[96]=H,e[97]=oe):oe=e[97];let ae;e[98]!==n?(ae=n("classic"),e[98]=n,e[99]=ae):ae=e[99];let q;e[100]!==ae?(q={value:"classic",icon:"classic",label:ae},e[100]=ae,e[101]=q):q=e[101];let K;e[102]!==n?(K=n("none"),e[102]=n,e[103]=K):K=e[103];let X;e[104]!==K?(X={value:"none",icon:"eye",label:K},e[104]=K,e[105]=X):X=e[105];let Y;e[106]!==oe||e[107]!==q||e[108]!==X?(Y=[oe,q,X],e[106]=oe,e[107]=q,e[108]=X,e[109]=Y):Y=e[109];let te;e[110]!==r||e[111]!==l.options.diffIndicators||e[112]!==Y?(te=s.jsx("span",{className:"menu-segment-controls",children:Y.map(le=>s.jsx("button",{type:"button",className:"segment-button",title:le.label,"aria-label":le.label,"aria-pressed":l.options.diffIndicators===le.value,onClick:()=>r({type:"set-option",key:"diffIndicators",value:le.value}),children:s.jsx(Q,{name:le.icon})},le.value))}),e[110]=r,e[111]=l.options.diffIndicators,e[112]=Y,e[113]=te):te=e[113];let L;e[114]!==Z||e[115]!==te?(L=s.jsxs("div",{className:"menu-item menu-segment",children:[ee,Z,te]}),e[114]=Z,e[115]=te,e[116]=L):L=e[116];let A;e[117]===Symbol.for("react.memo_cache_sentinel")?(A=s.jsx("div",{className:"menu-separator"}),e[117]=A):A=e[117];let se;e[118]!==n?(se=n("copyGitApplyCommand"),e[118]=n,e[119]=se):se=e[119];let fe;e[120]!==a||e[121]!==se?(fe=s.jsx(re,{icon:"clipboard",label:se,onClick:a}),e[120]=a,e[121]=se,e[122]=fe):fe=e[122];let pe;return e[123]!==y||e[124]!==R||e[125]!==S||e[126]!==O||e[127]!==u||e[128]!==F||e[129]!==E||e[130]!==V||e[131]!==G||e[132]!==h||e[133]!==L||e[134]!==fe||e[135]!==g?(pe=s.jsxs("div",{id:"options-menu","aria-label":u,children:[h,g,y,k,R,S,O,F,E,V,G,L,A,fe]}),e[123]=y,e[124]=R,e[125]=S,e[126]=O,e[127]=u,e[128]=F,e[129]=E,e[130]=V,e[131]=G,e[132]=h,e[133]=L,e[134]=fe,e[135]=g,e[136]=pe):pe=e[136],pe}function re(t){const e=_.c(14),{checked:r,icon:i,label:n,onClick:a}=t,o=r??void 0;let c;e[0]!==i?(c=s.jsx(Q,{name:i}),e[0]=i,e[1]=c):c=e[1];let l;e[2]!==n?(l=s.jsx("span",{className:"menu-label",children:n}),e[2]=n,e[3]=l):l=e[3];let p;e[4]!==r?(p=r?s.jsx(Q,{name:"check"}):null,e[4]=r,e[5]=p):p=e[5];let d;e[6]!==p?(d=s.jsx("span",{className:"menu-check",children:p}),e[6]=p,e[7]=d):d=e[7];let u;return e[8]!==a||e[9]!==o||e[10]!==c||e[11]!==l||e[12]!==d?(u=s.jsxs("button",{type:"button",className:"menu-item","aria-pressed":o,onClick:a,children:[c,l,d]}),e[8]=a,e[9]=o,e[10]=c,e[11]=l,e[12]=d,e[13]=u):u=e[13],u}function Bi(t){const e=_.c(70),{commentEntries:r,commentLabels:i,dispatch:n,hasDraft:a,label:o,onSelectComment:c,onSelectItem:l,selectedPath:p,state:d}=t,u=I.useRef(null);let m;e[0]!==n?(m=z=>{const G=u.current;if(!G)return;const ee=document.documentElement.clientWidth||window.innerWidth,J=Math.max(220,Math.min(520,Math.floor(ee*.55))),Z=Math.max(180,Math.min(J,Math.round(G.startWidth-(z-G.startX))));n({type:"set-files-width",width:Z})},e[0]=n,e[1]=m):m=e[1];const h=m;let w;e[2]!==o?(w=o("changedFiles"),e[2]=o,e[3]=w):w=e[3];const f=!d.filesVisible,g=!d.filesVisible;let x;e[4]!==o?(x=o("files"),e[4]=o,e[5]=x):x=e[5];let b;e[6]!==d.filesWidth?(b=z=>{u.current={startWidth:d.filesWidth,startX:z.clientX},z.currentTarget.setPointerCapture(z.pointerId)},e[6]=d.filesWidth,e[7]=b):b=e[7];let v,y;e[8]!==h?(v=z=>h(z.clientX),y=z=>{h(z.clientX),u.current=null,z.currentTarget.releasePointerCapture(z.pointerId)},e[8]=h,e[9]=v,e[10]=y):(v=e[9],y=e[10]);let k;e[11]===Symbol.for("react.memo_cache_sentinel")?(k=()=>{u.current=null},e[11]=k):k=e[11];let j;e[12]!==n||e[13]!==d.filesWidth?(j=z=>{if(z.key!=="ArrowLeft"&&z.key!=="ArrowRight")return;z.preventDefault();const G=z.key==="ArrowLeft"?20:-20;n({type:"set-files-width",width:Math.max(180,Math.min(520,d.filesWidth+G))})},e[12]=n,e[13]=d.filesWidth,e[14]=j):j=e[14];let M;e[15]!==j||e[16]!==x||e[17]!==b||e[18]!==v||e[19]!==y?(M=s.jsx("button",{id:"files-resize-handle","aria-label":x,type:"button",tabIndex:0,onPointerDown:b,onPointerMove:v,onPointerUp:y,onPointerCancel:k,onKeyDown:j}),e[15]=j,e[16]=x,e[17]=b,e[18]=v,e[19]=y,e[20]=M):M=e[20];let R;e[21]!==o?(R=o("files"),e[21]=o,e[22]=R):R=e[22];let S;e[23]!==R?(S=s.jsx("span",{children:R}),e[23]=R,e[24]=S):S=e[24];const T=d.treeSource?.pathCount??0;let B;e[25]!==T?(B=s.jsx("span",{id:"files-count",children:T}),e[25]=T,e[26]=B):B=e[26];let O;e[27]!==S||e[28]!==B?(O=s.jsxs("span",{id:"files-title",children:[S,B]}),e[27]=S,e[28]=B,e[29]=O):O=e[29];let D;e[30]!==o||e[31]!==d.fileSearchOpen?(D=d.fileSearchOpen?o("hideFileSearch"):o("showFileSearch"),e[30]=o,e[31]=d.fileSearchOpen,e[32]=D):D=e[32];let C;e[33]!==o||e[34]!==d.fileSearchOpen?(C=d.fileSearchOpen?o("hideFileSearch"):o("showFileSearch"),e[33]=o,e[34]=d.fileSearchOpen,e[35]=C):C=e[35];const F=!d.treeSource;let P;e[36]!==n||e[37]!==d.fileSearchOpen?(P=()=>n({type:"set-file-search-open",open:!d.fileSearchOpen}),e[36]=n,e[37]=d.fileSearchOpen,e[38]=P):P=e[38];let N;e[39]===Symbol.for("react.memo_cache_sentinel")?(N=s.jsx(Q,{name:"search"}),e[39]=N):N=e[39];let E;e[40]!==d.fileSearchOpen||e[41]!==D||e[42]!==C||e[43]!==F||e[44]!==P?(E=s.jsx("span",{id:"files-header-actions",children:s.jsx("button",{id:"file-search-toggle",type:"button",title:D,"aria-label":C,"aria-pressed":d.fileSearchOpen,disabled:F,onClick:P,children:N})}),e[40]=d.fileSearchOpen,e[41]=D,e[42]=C,e[43]=F,e[44]=P,e[45]=E):E=e[45];let $;e[46]!==O||e[47]!==E?($=s.jsxs("div",{id:"files-header",children:[O,E]}),e[46]=O,e[47]=E,e[48]=$):$=e[48];let W;e[49]!==o||e[50]!==l||e[51]!==p||e[52]!==d.fileSearchOpen||e[53]!==d.fileSearchRequest||e[54]!==d.status||e[55]!==d.treeSource?(W=s.jsx("div",{id:"file-list",children:d.treeSource?s.jsx(Ni,{fileSearchOpen:d.fileSearchOpen,fileSearchRequest:d.fileSearchRequest,label:o,onSelectItem:l,selectedPath:p,source:d.treeSource}):d.status.loading||d.status.pending?s.jsx(Di,{}):s.jsx("div",{className:"visually-hidden",children:d.status.message})}),e[49]=o,e[50]=l,e[51]=p,e[52]=d.fileSearchOpen,e[53]=d.fileSearchRequest,e[54]=d.status,e[55]=d.treeSource,e[56]=W):W=e[56];let V;e[57]!==r||e[58]!==i||e[59]!==a||e[60]!==c?(V=s.jsx(Lr,{entries:r,hasDraft:a,labels:i,onSelect:c}),e[57]=r,e[58]=i,e[59]=a,e[60]=c,e[61]=V):V=e[61];let U;return e[62]!==M||e[63]!==w||e[64]!==$||e[65]!==W||e[66]!==V||e[67]!==f||e[68]!==g?(U=s.jsxs("aside",{id:"files-sidebar","aria-label":w,"aria-hidden":f,inert:g,children:[M,$,W,V]}),e[62]=M,e[63]=w,e[64]=$,e[65]=W,e[66]=V,e[67]=f,e[68]=g,e[69]=U):U=e[69],U}function Ni(t){const e=_.c(18),{fileSearchOpen:r,fileSearchRequest:i,label:n,onSelectItem:a,selectedPath:o,source:c}=t;let l;e[0]!==n||e[1]!==a||e[2]!==c?(l={label:n,onSelectItem:a,source:c},e[0]=n,e[1]=a,e[2]=c,e[3]=l):l=e[3];const p=gt(l);let d;e[4]!==c.paths?(d=()=>Pe(c.paths),e[4]=c.paths,e[5]=d):d=e[5];const[u]=I.useState(d);let m;e[6]!==o?(m=o?[o]:[],e[6]=o,e[7]=m):m=e[7];let h;e[8]===Symbol.for("react.memo_cache_sentinel")?(h=xt(),e[8]=h):h=e[8];const w=c.gitStatus;let f;e[9]===Symbol.for("react.memo_cache_sentinel")?(f=Yr(),e[9]=f):f=e[9];let g;e[10]!==u||e[11]!==p||e[12]!==m||e[13]!==w?(g={flattenEmptyDirectories:!1,id:"cmux-diff-file-tree",initialExpansion:"open",initialSelectedPaths:m,initialVisibleRowCount:h,itemHeight:24,overscan:12,preparedInput:u,search:!0,searchBlurBehavior:"retain",stickyFolders:!0,gitStatus:w,sort:zi,unsafeCSS:f,onSelectionChange(y){const k=y[y.length-1],j=p.current.source.pathToItemId.get(k);j&&p.current.onSelectItem(j)}},e[10]=u,e[11]=p,e[12]=m,e[13]=w,e[14]=g):g=e[14];const{model:x}=St(g);qi(x,c),Xi(x,r,i),Yi(x,o);let b;e[15]===Symbol.for("react.memo_cache_sentinel")?(b={height:"100%"},e[15]=b):b=e[15];let v;return e[16]!==x?(v=s.jsx(Ct,{model:x,style:b}),e[16]=x,e[17]=v):v=e[17],v}function zi(){return 0}function Di(){const t=_.c(1);let e;return t[0]===Symbol.for("react.memo_cache_sentinel")?(e=s.jsx("div",{className:"diff-loading-placeholder","aria-hidden":"true",children:oi.map(Ei)}),t[0]=e):e=t[0],e}function Ei(t,e){return s.jsxs("div",{className:"grid h-6 grid-cols-[16px_minmax(0,1fr)_44px] items-center gap-2 rounded-[5px] px-[7px]",children:[s.jsx("span",{className:"size-4 rounded-[5px] border border-[color-mix(in_lab,var(--cmux-diff-fg)_18%,transparent)]"}),s.jsx("span",{className:"h-[11px] rounded bg-[var(--cmux-diff-muted-bg)]",style:{width:t}}),s.jsx("span",{className:"h-[11px] justify-self-end rounded bg-[var(--cmux-diff-muted-bg)] opacity-70",style:{width:e%2===0?"34px":"24px"}})]},`${t}-${e}`)}function Ai(){const t=_.c(2);let e;t[0]===Symbol.for("react.memo_cache_sentinel")?(e=s.jsxs("div",{className:"mb-3 grid h-9 grid-cols-[72px_minmax(0,1fr)_96px] items-center gap-3 rounded-md bg-[color-mix(in_lab,var(--cmux-diff-fg)_5%,transparent)] px-3",children:[s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)]"}),s.jsx("span",{className:"h-3 w-2/5 rounded bg-[var(--cmux-diff-muted-bg)]"}),s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)] opacity-70"})]}),t[0]=e):e=t[0];let r;return t[1]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsxs("div",{className:"diff-loading-placeholder mx-3.5 mt-3.5 border-t border-[var(--cmux-diff-border)] pt-3","aria-hidden":"true",children:[e,s.jsx("div",{className:"space-y-[13px] px-3 py-1",children:ai.map(Oi)})]}),t[1]=r):r=t[1],r}function Oi(t,e){return s.jsxs("div",{className:"grid grid-cols-[42px_minmax(0,1fr)] items-center gap-4",children:[s.jsx("span",{className:"h-px bg-[color-mix(in_lab,var(--cmux-diff-fg)_10%,transparent)]"}),s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)]",style:{width:t}})]},`${t}-${e}`)}function $i(t){const e=_.c(16),{label:r,status:i}=t;if(!i.loading&&!i.pending&&!i.statusOnly&&!i.error)return null;const n=i.error?"true":"false",a=i.pending?"true":"false";let o;e[0]===Symbol.for("react.memo_cache_sentinel")?(o=s.jsx("span",{id:"status-icon","aria-hidden":"true"}),e[0]=o):o=e[0];let c;e[1]!==r||e[2]!==i.message?(c=i.message||r("loadingDiff"),e[1]=r,e[2]=i.message,e[3]=c):c=e[3];let l;e[4]!==c?(l=s.jsx("span",{id:"status-text",children:c}),e[4]=c,e[5]=l):l=e[5];let p;e[6]!==n||e[7]!==a||e[8]!==l?(p=s.jsxs("div",{id:"status","data-error":n,"data-pending":a,children:[o,l]}),e[6]=n,e[7]=a,e[8]=l,e[9]=p):p=e[9];let d;e[10]!==i.loading||e[11]!==i.pending?(d=i.loading||i.pending?s.jsx(Ai,{}):null,e[10]=i.loading,e[11]=i.pending,e[12]=d):d=e[12];let u;return e[13]!==p||e[14]!==d?(u=s.jsxs("div",{id:"loading-layer","aria-live":"polite",children:[p,d]}),e[13]=p,e[14]=d,e[15]=u):u=e[15],u}function gt(t){const e=_.c(3),r=I.useRef(t);let i,n;return e[0]!==t?(i=()=>{r.current=t},n=[t],e[0]=t,e[1]=i,e[2]=n):(i=e[1],n=e[2]),I.useEffect(i,n),r}function Wi(t,e){const r=_.c(5),i=jt(),n=I.useRef(null);let a,o;r[0]!==e||r[1]!==t||r[2]!==i?(a=()=>{if(!i||Gi(n.current,t))return;let c=!0;return n.current=t,i.setRenderOptions(t).then(()=>{c&&e.current?.getInstance()?.render(!0)}).catch(Vi),()=>{c=!1}},o=[e,t,i],r[0]=e,r[1]=t,r[2]=i,r[3]=a,r[4]=o):(a=r[3],o=r[4]),I.useEffect(a,o)}function Vi(t){return console.warn("cmux diff worker render options update failed",t)}function Gi(t,e){return t?.lineDiffType===e.lineDiffType&&Ui(t?.langs,e.langs)&&t?.maxLineDiffLength===e.maxLineDiffLength&&t?.preferredHighlighter===e.preferredHighlighter&&Hi(t?.theme,e.theme)&&t?.tokenizeMaxLineLength===e.tokenizeMaxLineLength&&t?.useTokenTransformer===e.useTokenTransformer}function Ui(t,e){return t===e?!0:t==null||e==null||t.length!==e.length?!1:t.every((r,i)=>r===e[i])}function Hi(t,e){return t===e?!0:typeof t!="object"||t==null||typeof e!="object"||e==null?!1:t.dark===e.dark&&t.light===e.light}function qi(t,e){const r=_.c(4),i=I.useRef(null);let n,a;r[0]!==t||r[1]!==e?(n=()=>{const o=i.current;i.current=e;const c=Wr(o,e,e.paths);let l=c.kind==="append"?c.requiresFullGitStatus:!1;if(c.kind==="append"){if(c.addedPaths.length>0)try{t.batch(c.addedPaths.map(Ki)),l=!c.sourceFollowsPrevious}catch{const p=Pe(e.paths);t.resetPaths(e.paths,{preparedInput:p}),l=!0}}else{const p=Pe(e.paths);t.resetPaths(e.paths,{preparedInput:p}),l=!0}Vr(t,e,l)},a=[t,e],r[0]=t,r[1]=e,r[2]=n,r[3]=a):(n=r[2],a=r[3]),I.useEffect(n,a)}function Ki(t){return{type:"add",path:t}}function Xi(t,e,r){const i=_.c(7);let n;i[0]!==e||i[1]!==t?(n=()=>{if(e){const o=t.isSearchOpen();if(t.openSearch(o?t.getSearchValue():""),o){const c=t.getFileTreeContainer();(c?.shadowRoot??c?.getRootNode())?.querySelector("[data-file-tree-search-input]")?.focus()}}else t.closeSearch()},i[0]=e,i[1]=t,i[2]=n):n=i[2];let a;i[3]!==e||i[4]!==r||i[5]!==t?(a=[e,r,t],i[3]=e,i[4]=r,i[5]=t,i[6]=a):a=i[6],I.useEffect(n,a)}function Yi(t,e){const r=_.c(4);let i,n;r[0]!==t||r[1]!==e?(i=()=>{Gr(t,e)},n=[t,e],r[0]=t,r[1]=e,r[2]=i,r[3]=n):(i=r[2],n=r[3]),I.useEffect(i,n)}function Ji(t,e,r,i){const n=_.c(6),a=I.useRef(!1);let o,c;n[0]!==t||n[1]!==r||n[2]!==e||n[3]!==i?(o=()=>{if(a.current||nn(t.payload))return;a.current=!0;const l=t.payload??{},p=_e(l.appearance);p.themes.light.name&&De(p.themes.light.name,()=>Promise.resolve(Qe(p.themes.light))),p.themes.dark.name&&De(p.themes.dark.name,()=>Promise.resolve(Qe(p.themes.dark)));const d=[];r({type:"set-status",status:ne(e("parsingDiff"),{loading:!0})}),or({getCollapsed:()=>i.current.options.collapsed,initialFileTreeRowCount:xt(),label:e,onBatch:u=>{d.push(...u),r({type:"append-items",items:u})},onComplete:u=>{r({type:"set-metrics",metrics:u});const m=d;if(m.length===0){r({type:"set-status",status:ne(e("noFileDiffs"),{error:!0,loading:!1,statusOnly:!0})});return}const h=Array.from(new Set([p.theme?.light,p.theme?.dark].filter(Boolean))),w=Array.from(new Set(m.flatMap(Qi)));Mt({themes:h,langs:w.length>0?w:["text"]}).catch(Zi)},onMetrics:u=>r({type:"set-metrics",metrics:u}),onRename:u=>r({type:"rename-item",oldId:u.oldId,newId:u.newId}),onTreeSource:u=>r({type:"set-tree-source",source:u}),parsePatchFiles:Pt,patchURL:l.patchURL,processFile:It}).catch(u=>{console.error("cmux diff viewer render failed",u),r({type:"set-status",status:ne(e("renderFailed"),{error:!0,loading:!1,statusOnly:!0})})})},c=[t,r,e,i],n[0]=t,n[1]=r,n[2]=e,n[3]=i,n[4]=o,n[5]=c):(o=n[4],c=n[5]),I.useEffect(o,c)}function Zi(t){return console.warn("cmux diff highlighter preload failed",t)}function Qi(t){const e=t.fileDiff??{};return ft(ce(e,""),e.lang,e,Fe)}function en(t){const e=t.fileDiff;if(e==null)return;const r=dt(ce(e,""),e.lang,Fe);e.lang=r}function tn(t){const e=t.fileDiff;return e==null?[]:ft(ce(e,""),e.lang,e,Fe)}function rn(t,e){const r=new Set(t);for(const i of e)i.trim().length>0&&r.add(i);return Array.from(r)}function nn(t){return t?.pendingReplacement===!0||typeof t?.statusMessage=="string"&&t.statusMessage.length>0}function on(t,e,r){const i=_.c(5),n=I.useRef(!1);let a,o;i[0]!==r||i[1]!==e||i[2]!==t?(a=()=>{if(!n.current){if(n.current=!0,t.pendingReplacement===!0){r({type:"set-status",status:ne(t.statusMessage??e("loadingDiff"),{loading:!0,pending:!0})}),fetch("/__cmux_diff_viewer_wait"+location.pathname,{cache:"no-store"}).then(an).catch(c=>{document.documentElement.dataset.cmuxDiffWait="failed",r({type:"set-status",status:ne(e("renderFailed"),{error:!0,loading:!1,statusOnly:!0})}),console.warn("cmux diff viewer deferred load failed",c)});return}typeof t.statusMessage=="string"&&t.statusMessage.length>0&&r({type:"set-status",status:ne(t.statusMessage,{error:t.statusIsError===!0,loading:!1,statusOnly:!0})})}},o=[r,e,t],i[0]=r,i[1]=e,i[2]=t,i[3]=a,i[4]=o):(a=i[3],o=i[4]),I.useEffect(a,o)}async function an(t){if(!t.ok)throw new Error("replacement failed");(await t.text()).includes('data-cmux-diff-pending="true"')||window.location.reload()}function sn(t){const e=_.c(10);let r;e[0]!==t.filesVisible||e[1]!==t.items||e[2]!==t.metrics||e[3]!==t.options.diffIndicators||e[4]!==t.options.layout||e[5]!==t.options.wordWrap||e[6]!==t.status?(r=()=>{document.body.dataset.filesHidden=t.filesVisible?"false":"true",document.body.dataset.loading=t.status.loading?"true":"false",document.documentElement.dataset.layout=t.options.layout,document.documentElement.dataset.wordWrap=String(t.options.wordWrap),document.documentElement.dataset.diffIndicators=t.options.diffIndicators,t.metrics&&(document.body.dataset.streamFileCount=String(t.metrics.fileCount??t.items.length),document.body.dataset.streamRenderableFileCount=String(t.metrics.renderableFileCount??t.items.length),document.body.dataset.streamFlushCount=String(t.metrics.flushCount??0),document.body.dataset.streamMaxBatchSize=String(t.metrics.maxBatchSize??0),document.body.dataset.streamTreeRefreshCount=String(t.metrics.treeRefreshCount??0),Number.isFinite(t.metrics.completedAt)&&t.metrics.completedAt>0&&(document.body.dataset.streamElapsedMs=String(Math.round(t.metrics.completedAt-t.metrics.startedAt)))),ze(t.status)},e[0]=t.filesVisible,e[1]=t.items,e[2]=t.metrics,e[3]=t.options.diffIndicators,e[4]=t.options.layout,e[5]=t.options.wordWrap,e[6]=t.status,e[7]=r):r=e[7];let i;e[8]!==t?(i=[t],e[8]=t,e[9]=i):i=e[9],I.useEffect(r,i)}function ln(t,e,r){const i=_.c(5);let n,a;i[0]!==e||i[1]!==r||i[2]!==t?(n=()=>{window.__cmuxPerformDiffViewerNavigationAction=c=>{const l=t.current;if(l&&CmuxViewerNavigation.performAction(c,l))return!0;switch(c){case"diffViewerOpenFileSearch":return e({type:"request-file-search"}),!0;case"diffViewerNextFile":return l&&CmuxViewerNavigation.resetSmoothTarget(l),r(1),!0;case"diffViewerPreviousFile":return l&&CmuxViewerNavigation.resetSmoothTarget(l),r(-1),!0}return!1},document.documentElement.dataset.cmuxViewerNavigationReady="true",document.dispatchEvent(new window.Event("cmux-diff-viewer-navigation-readiness-change"));const o=CmuxViewerNavigation.installManualInputReset({target:document,getScroller:()=>t.current});return()=>{delete window.__cmuxPerformDiffViewerNavigationAction,delete document.documentElement.dataset.cmuxViewerNavigationReady,document.dispatchEvent(new window.Event("cmux-diff-viewer-navigation-readiness-change")),o()}},a=[e,r,t],i[0]=e,i[1]=r,i[2]=t,i[3]=n,i[4]=a):(n=i[3],a=i[4]),I.useEffect(n,a)}function cn(t,e){const r=_.c(4);let i,n;r[0]!==e||r[1]!==t?(i=()=>{if(!t)return;const a=c=>{c.target instanceof Element&&c.target.closest("#toolbar")||e({type:"set-options-open",open:!1})},o=c=>{c.key==="Escape"&&e({type:"set-options-open",open:!1})};return document.addEventListener("click",a),document.addEventListener("keydown",o),()=>{document.removeEventListener("click",a),document.removeEventListener("keydown",o)}},n=[e,t],r[0]=e,r[1]=t,r[2]=i,r[3]=n):(i=r[2],n=r[3]),I.useEffect(i,n)}function dn(t,e){return e.some(r=>r.id===t)?t:e[0]?.id??""}function fn(t,e,r){if(e.length===0)return"";const i=e.findIndex(a=>a.id===t);if(i<0)return r>0?e[0].id:e[e.length-1].id;const n=i+r;return n>=0&&n0?0:-1;for(;i<=n;){const o=Math.floor((i+n)/2),c=r(t[o].id);c!=null&&c<=e+1?(a=o,i=o+1):n=o-1}return a>=0?t[a].id:""}function xt(){const t=window.visualViewport?.height??window.innerHeight;return!Number.isFinite(t)||t<=0?25:Math.min(96,Math.max(25,Math.ceil(t/24)))}const pn=`@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\/2{top:50%}.right-2\\.5{right:calc(var(--spacing) * 2.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\\[calc\\(100\\%\\+6px\\)\\]{bottom:calc(100% + 6px)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-px{margin:1px}.mx-3\\.5{margin-inline:calc(var(--spacing) * 3.5)}.ms-1{margin-inline-start:calc(var(--spacing) * 1)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-3\\.5{margin-top:calc(var(--spacing) * 3.5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-\\[3px\\]{margin-right:3px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-px{margin-bottom:1px}.ml-1\\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-\\[22px\\]{width:22px;height:22px}.\\!h-auto{height:auto!important}.h-0{height:calc(var(--spacing) * 0)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\\[1lh\\]{height:1lh}.h-\\[1px\\]{height:1px}.h-\\[11px\\]{height:11px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\\[25dvh\\]{max-height:25dvh}.max-h-\\[140px\\]{max-height:140px}.max-h-none{max-height:none}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\\[1\\.25rem\\]{min-height:1.25rem}.w-2\\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-52{width:calc(var(--spacing) * 52)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\\[60\\%\\]{max-width:60%}.max-w-\\[77\\%\\]{max-width:77%}.max-w-\\[320px\\]{max-width:320px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-56{min-width:calc(var(--spacing) * 56)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-\\[16px_minmax\\(0\\,1fr\\)_44px\\]{grid-template-columns:16px minmax(0,1fr) 44px}.grid-cols-\\[42px_minmax\\(0\\,1fr\\)\\]{grid-template-columns:42px minmax(0,1fr)}.grid-cols-\\[72px_minmax\\(0\\,1fr\\)_96px\\]{grid-template-columns:72px minmax(0,1fr) 96px}.grid-cols-\\[auto_minmax\\(0\\,1fr\\)_auto\\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\\[minmax\\(0\\,auto\\)_auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,auto) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\\[5px\\]{gap:5px}:where(.space-y-\\[13px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(13px * var(--tw-space-y-reverse));margin-block-end:calc(13px * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[5px\\]{border-radius:5px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_18\\%\\,transparent\\)\\]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.border-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_18\\%\\,transparent\\)\\]{border-color:color-mix(in lab,var(--cmux-diff-fg) 18%,transparent)}}.border-\\[color\\:var\\(--gray-0\\)\\]{border-color:var(--gray-0)}.border-\\[var\\(--cmux-diff-border\\)\\]{border-color:var(--cmux-diff-border)}.border-transparent{border-color:#0000}.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_5\\%\\,transparent\\)\\]{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_5\\%\\,transparent\\)\\]{background-color:color-mix(in lab,var(--cmux-diff-fg) 5%,transparent)}}.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_10\\%\\,transparent\\)\\]{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_10\\%\\,transparent\\)\\]{background-color:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}.bg-\\[color\\:var\\(--gray-0\\)\\]{background-color:var(--gray-0)}.bg-\\[var\\(--cmux-diff-muted-bg\\)\\]{background-color:var(--cmux-diff-muted-bg)}.\\[mask-image\\:linear-gradient\\(to_right\\,black_calc\\(100\\%_-_0\\.25rem\\)\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000)}.\\[mask-repeat\\:no-repeat\\]{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.object-cover{object-fit:cover}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.\\!px-0{padding-inline:calc(var(--spacing) * 0)!important}.px-0\\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-\\[7px\\]{padding-inline:7px}.px-\\[var\\(--padding-row-x\\)\\]{padding-inline:var(--padding-row-x)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-\\[var\\(--padding-row-y\\)\\]{padding-block:var(--padding-row-y)}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-\\[calc\\(var\\(--codex-chat-font-size\\)\\+8px\\)\\]{--tw-leading:calc(var(--codex-chat-font-size) + 8px);line-height:calc(var(--codex-chat-font-size) + 8px)}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-current{color:currentColor}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\\[0\\.5px\\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\\[--edge-fade-distance\\:2rem\\]{--edge-fade-distance:2rem}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\\:bg-transparent:hover{background-color:#0000}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.data-\\[state\\=checked\\]\\:translate-x-\\[14px\\][data-state=checked]{--tw-translate-x:14px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[state\\=unchecked\\]\\:translate-x-\\[2px\\][data-state=unchecked]{--tw-translate-x:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}@container (min-width:500px){.\\@\\[500px\\]\\:inline{display:inline}}.\\[\\&_\\.ProseMirror\\]\\:\\!h-5 .ProseMirror{height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:h-auto .ProseMirror{height:auto}.\\[\\&_\\.ProseMirror\\]\\:\\!min-h-5 .ProseMirror{min-height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:min-h-\\[2rem\\] .ProseMirror{min-height:2rem}.\\[\\&_\\.ProseMirror\\]\\:min-w-0 .ProseMirror{min-width:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror\\]\\:flex-1 .ProseMirror{flex:1}.\\[\\&_\\.ProseMirror\\]\\:resize-none .ProseMirror{resize:none}.\\[\\&_\\.ProseMirror\\]\\:overflow-hidden .ProseMirror{overflow:hidden}.\\[\\&_\\.ProseMirror\\]\\:leading-5 .ProseMirror{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.\\[\\&_\\.ProseMirror\\]\\:whitespace-nowrap .ProseMirror{white-space:nowrap}.\\[\\&_\\.ProseMirror\\]\\:focus-visible\\:outline-none .ProseMirror:focus-visible{--tw-outline-style:none;outline-style:none}.\\[\\&_\\.ProseMirror_p\\]\\:m-0 .ProseMirror p{margin:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror_p\\]\\:overflow-hidden .ProseMirror p{overflow:hidden}.\\[\\&_\\.ProseMirror_p\\]\\:text-ellipsis .ProseMirror p{text-overflow:ellipsis}.\\[\\&_\\.ProseMirror_p\\]\\:whitespace-nowrap .ProseMirror p{white-space:nowrap}.\\[\\&_\\.contain-inline-size\\]\\:\\[contain\\:initial\\] .contain-inline-size{contain:initial}.\\[\\&\\>\\*\\:last-child\\]\\:mb-0>:last-child{margin-bottom:calc(var(--spacing) * 0)}.\\[\\&\\>ol\\:first-child\\]\\:mt-0>ol:first-child,.\\[\\&\\>ul\\:first-child\\]\\:mt-0>ul:first-child{margin-top:calc(var(--spacing) * 0)}}:root{color-scheme:light dark;--cmux-diff-bg-light:#fff;--cmux-diff-bg-dark:#000;--cmux-diff-fg-light:#000;--cmux-diff-fg-dark:#fff;--cmux-diff-selection-bg-light:#abd8ff;--cmux-diff-selection-bg-dark:#3f638b;--cmux-diff-ui-font-family:system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Arial, sans-serif;--cmux-diff-ui-font-size:12px;--cmux-diff-ui-line-height:16px;--cmux-diff-code-font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;--cmux-diff-font-size:10px;--cmux-diff-line-height:20px;--cmux-diff-bg:var(--cmux-diff-bg-light);--cmux-diff-fg:var(--cmux-diff-fg-light);--cmux-diff-border:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-border:color-mix(in lab, var(--cmux-diff-fg) 12%, transparent)}}:root{--cmux-diff-toolbar-bg:transparent;--cmux-diff-sidebar-bg:transparent;--cmux-diff-muted-bg:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-muted-bg:color-mix(in lab, var(--cmux-diff-fg) 8%, transparent)}}:root{--cmux-diff-hover-bg:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-hover-bg:color-mix(in lab, var(--cmux-diff-fg) 10%, transparent)}}:root{--cmux-diff-accent:light-dark(#0a84ff,#7ab7ff);--cmux-diff-text-muted:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-text-muted:color-mix(in lab, var(--cmux-diff-fg) 72%, var(--cmux-diff-bg))}}:root{--cmux-diff-text-subtle:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-text-subtle:color-mix(in lab, var(--cmux-diff-fg) 84%, var(--cmux-diff-bg))}}:root{--cmux-diff-surface-fill-light:transparent;--cmux-diff-surface-fill-dark:transparent;--cmux-diff-surface-fill:var(--cmux-diff-surface-fill-light);background:var(--cmux-diff-surface-fill);color:var(--cmux-diff-fg)}@media(prefers-color-scheme:dark){:root{--cmux-diff-bg:var(--cmux-diff-bg-dark);--cmux-diff-fg:var(--cmux-diff-fg-dark);--cmux-diff-surface-fill:var(--cmux-diff-surface-fill-dark)}}*{box-sizing:border-box}html,body{background:var(--cmux-diff-surface-fill);height:100%;overflow:hidden}body{background:var(--cmux-diff-surface-fill);height:100vh;min-height:0;color:var(--cmux-diff-fg);font-family:var(--cmux-diff-ui-font-family);font-size:var(--cmux-diff-ui-font-size);line-height:var(--cmux-diff-ui-line-height);flex-direction:column;margin:0;display:flex;overflow:hidden}#root{background:0 0;height:100%;min-height:0}#app{overscroll-behavior:contain;contain:strict;height:100vh;min-height:0;color:inherit;background:0 0;grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr);display:grid;overflow:hidden}.copy-fallback-textarea{opacity:0;pointer-events:none;width:1px;height:1px;position:fixed;top:0;left:-9999px}#toolbar{border-bottom:1px solid var(--cmux-diff-border);background:var(--cmux-diff-toolbar-bg);min-height:32px;color:var(--cmux-diff-fg);flex:none;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr) minmax(0,auto);align-items:center;gap:7px;padding:3px 4px 3px 8px;display:grid;position:relative}@supports (color:color-mix(in lab,red,red)){#toolbar{color:color-mix(in lab,var(--cmux-diff-fg) 76%,var(--cmux-diff-bg))}}#toolbar{z-index:50}@media(min-width:521px){body[data-files-hidden=false] #toolbar{grid-template-columns:minmax(0,1fr) minmax(0,auto)}body[data-files-hidden=false] .toolbar-middle{display:none}}.toolbar-left,.toolbar-middle,.toolbar-actions{align-items:center;min-width:0;display:flex;overflow:clip visible}.toolbar-left,.toolbar-middle{gap:6px}.toolbar-left{justify-self:stretch;container:toolbar-left/inline-size}.toolbar-middle{justify-content:center}.toolbar-actions{justify-self:end;gap:4px}#source-select,#repo-select,#base-select,#jump-select{appearance:none;white-space:nowrap;text-overflow:ellipsis;background:linear-gradient(45deg,transparent 50%,currentcolor 50%) right 11px center / 4px 4px no-repeat,linear-gradient(135deg,currentcolor 50%,transparent 50%) right 7px center / 4px 4px no-repeat,var(--cmux-diff-fg);border:1px solid #0000;border-radius:6px;min-width:0;max-width:100%;height:24px;padding:0 24px 0 9px;overflow:hidden}@supports (color:color-mix(in lab,red,red)){#source-select,#repo-select,#base-select,#jump-select{background:linear-gradient(45deg,transparent 50%,currentcolor 50%) right 11px center / 4px 4px no-repeat,linear-gradient(135deg,currentcolor 50%,transparent 50%) right 7px center / 4px 4px no-repeat,color-mix(in lab,var(--cmux-diff-fg) 7%,transparent)}}#source-select,#repo-select,#base-select,#jump-select{color:inherit;font:inherit}#source-select{field-sizing:content;flex:0 3 auto;min-width:58px}#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{border-color:color-mix(in lab,var(--cmux-diff-fg) 24%,transparent)}}#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{background-color:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}#source-select[hidden],#repo-select[hidden],#base-select[hidden],#jump-select[hidden]{display:none}#jump-select{field-sizing:content;min-width:64px}#repo-select{field-sizing:content;flex:0 5 auto;min-width:56px}#base-select{flex:0 120px}#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline:2px solid var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline:2px solid color-mix(in lab,var(--cmux-diff-fg) 36%,transparent)}}#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline-offset:1px}#base-picker{flex:0 auto;align-items:center;min-width:150px;display:flex;position:relative}.base-picker-button{border:1px solid var(--cmux-diff-fg);align-items:center;gap:5px;min-width:0;max-width:100%;height:24px;padding:0 7px 0 9px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.base-picker-button{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 18%,transparent)}}.base-picker-button{background:var(--cmux-diff-fg);border-radius:6px}@supports (color:color-mix(in lab,red,red)){.base-picker-button{background:color-mix(in lab,var(--cmux-diff-fg) 11%,transparent)}}.base-picker-button{color:var(--cmux-diff-fg);font:inherit;cursor:pointer;font-weight:600}.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{border-color:color-mix(in lab,var(--cmux-diff-fg) 30%,transparent)}}.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{background:color-mix(in lab,var(--cmux-diff-fg) 15%,transparent)}}.base-picker-button:disabled{cursor:default;opacity:.85}.base-picker-button svg{stroke:currentColor;fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.7;flex:none;width:12px;height:12px}.base-picker-label{align-items:center;gap:5px;min-width:0;display:inline-flex}.base-picker-prefix{color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-prefix{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.base-picker-head{text-overflow:ellipsis;white-space:nowrap;min-width:4ch;color:var(--cmux-diff-fg);flex:0 8 auto;font-weight:500;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.base-picker-head{color:color-mix(in lab,var(--cmux-diff-fg) 62%,var(--cmux-diff-bg))}}.base-picker-ref{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:6ch;overflow:hidden}.base-picker-meta{flex:0 1000 auto;align-items:center;gap:5px;min-width:0;display:inline-flex;overflow:hidden}.base-picker-reason{color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-reason{color:color-mix(in lab,var(--cmux-diff-fg) 64%,var(--cmux-diff-bg))}}.base-picker-reason{white-space:nowrap}.base-picker-reason-low{opacity:.6;font-style:italic}.base-picker-aheadbehind{font-variant-numeric:tabular-nums;color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-aheadbehind{color:color-mix(in lab,var(--cmux-diff-fg) 58%,var(--cmux-diff-bg))}}.base-picker-aheadbehind{white-space:nowrap}@container toolbar-left (max-width:380px){.base-picker-aheadbehind{display:none}}@container toolbar-left (max-width:312px){.base-picker-reason{display:none}}.base-picker-text{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.base-picker-spinner{border:1.6px solid var(--cmux-diff-fg);border-radius:50%;flex:none;width:12px;height:12px}@supports (color:color-mix(in lab,red,red)){.base-picker-spinner{border:1.6px solid color-mix(in lab,var(--cmux-diff-fg) 26%,transparent)}}.base-picker-spinner{border-top-color:var(--cmux-diff-fg);animation:.7s linear infinite base-picker-spin}@keyframes base-picker-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.base-picker-spinner{animation-duration:1.6s}}.base-picker-popover{border:1px solid var(--cmux-diff-fg);flex-direction:column;width:320px;max-width:min(86vw,360px);display:flex;position:fixed}@supports (color:color-mix(in lab,red,red)){.base-picker-popover{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 13%,transparent)}}.base-picker-popover{background:var(--cmux-diff-bg);z-index:120;border-radius:8px;overflow:hidden;box-shadow:0 16px 34px lab(0% none none/.28)}.base-picker-search{border-bottom:1px solid var(--cmux-diff-fg);align-items:center;gap:6px;padding:7px 9px;display:flex}@supports (color:color-mix(in lab,red,red)){.base-picker-search{border-bottom:1px solid color-mix(in lab,var(--cmux-diff-fg) 11%,transparent)}}.base-picker-search svg{stroke:currentColor;fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.55;flex:none;width:13px;height:13px}.base-picker-input{min-width:0;color:var(--cmux-diff-fg);font:inherit;background:0 0;border:0;outline:none;flex:auto}.base-picker-list{flex:auto;min-height:0;padding:4px;overflow-y:auto}.base-picker-status{color:var(--cmux-diff-fg);padding:12px 9px}@supports (color:color-mix(in lab,red,red)){.base-picker-status{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.base-picker-status{text-align:center}.base-picker-status-error{color:#ff5f56}@supports (color:color-mix(in lab,red,red)){.base-picker-status-error{color:color-mix(in lab,#ff5f56 70%,var(--cmux-diff-fg))}}.base-picker-group-header{letter-spacing:.06em;text-transform:uppercase;color:var(--cmux-diff-fg);padding:8px 8px 3px;font-size:10px;font-weight:600}@supports (color:color-mix(in lab,red,red)){.base-picker-group-header{color:color-mix(in lab,var(--cmux-diff-fg) 52%,var(--cmux-diff-bg))}}.base-picker-more{color:var(--cmux-diff-fg);padding:5px 8px 7px;font-size:11px}@supports (color:color-mix(in lab,red,red)){.base-picker-more{color:color-mix(in lab,var(--cmux-diff-fg) 48%,var(--cmux-diff-bg))}}.base-picker-more{cursor:default;-webkit-user-select:none;user-select:none}.base-picker-row{cursor:pointer;border-radius:6px;align-items:center;gap:8px;min-height:28px;padding:0 8px;display:flex}.base-picker-row-selected{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-row-selected{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.base-picker-row-primary{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--cmux-diff-fg);flex:auto;overflow:hidden}.base-picker-row-primary strong{font-weight:700}.base-picker-row-secondary{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;max-width:55%;color:var(--cmux-diff-fg);flex:0 auto;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.base-picker-row-secondary{color:color-mix(in lab,var(--cmux-diff-fg) 55%,var(--cmux-diff-bg))}}.base-picker-pill{text-transform:uppercase;letter-spacing:.04em;color:var(--cmux-diff-accent);background:var(--cmux-diff-accent);border-radius:999px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}@supports (color:color-mix(in lab,red,red)){.base-picker-pill{background:color-mix(in lab,var(--cmux-diff-accent) 16%,transparent)}}@media(max-width:760px){#toolbar{grid-template-columns:minmax(0,1fr) minmax(0,auto);grid-template-areas:"source actions""jump actions"}.toolbar-left{grid-area:source}.toolbar-middle{grid-area:jump;justify-content:stretch}.toolbar-actions{grid-area:actions}}.toolbar-icon{width:20px;height:20px;color:var(--cmux-diff-fg);background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.toolbar-icon{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.toolbar-icon{cursor:pointer;padding:0}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{border-color:color-mix(in lab,var(--cmux-diff-fg) 14%,transparent)}}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{background:color-mix(in lab,var(--cmux-diff-fg) 9%,transparent)}}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true],.toolbar-icon[aria-pressed=true]{color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon[aria-pressed=true]{color:color-mix(in lab,var(--cmux-diff-fg) 78%,var(--cmux-diff-bg))}}.toolbar-icon[hidden]{display:none}.toolbar-icon svg,.menu-item svg{fill:none;stroke:currentColor;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px;display:block}#layout-toggle svg [data-diff-deletion],#layout-toggle svg [data-diff-addition]{stroke:none}#layout-toggle svg [data-diff-deletion]{fill:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}#layout-toggle svg [data-diff-addition]{fill:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark))}.toolbar-icon svg [data-precision-dot],.menu-item svg [data-precision-dot]{stroke-width:2px}#options-menu{border:1px solid var(--cmux-diff-fg);min-width:246px;padding:8px;position:absolute;top:calc(100% + 7px);right:10px}@supports (color:color-mix(in lab,red,red)){#options-menu{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 13%,transparent)}}#options-menu{background:var(--cmux-diff-bg);z-index:100;border-radius:8px;box-shadow:0 16px 34px lab(0% none none/.28)}#options-menu[hidden]{display:none}.menu-separator{background:var(--cmux-diff-fg);height:1px;margin:7px 6px}@supports (color:color-mix(in lab,red,red)){.menu-separator{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.menu-item{width:100%;min-height:31px;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:6px;grid-template-columns:22px minmax(0,1fr) 18px;align-items:center;gap:10px;display:grid}@supports (color:color-mix(in lab,red,red)){.menu-item{color:color-mix(in lab,var(--cmux-diff-fg) 86%,var(--cmux-diff-bg))}}.menu-item{font:inherit;text-align:left;padding:0 7px}.menu-item:hover:not(:disabled){background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.menu-item:hover:not(:disabled){background:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}.menu-item:hover:not(:disabled){color:var(--cmux-diff-fg)}.menu-segment{cursor:default}.menu-segment:hover{background:0 0}.menu-segment-controls{background:0 0;border-radius:7px;justify-self:end;align-items:center;gap:2px;padding:2px;display:inline-flex}.segment-button{width:27px;height:24px;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.segment-button{color:color-mix(in lab,var(--cmux-diff-fg) 62%,var(--cmux-diff-bg))}}.segment-button{padding:0}.segment-button:hover,.segment-button[aria-pressed=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.segment-button:hover,.segment-button[aria-pressed=true]{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.segment-button:hover,.segment-button[aria-pressed=true],.menu-item:disabled{color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.menu-item:disabled{color:color-mix(in lab,var(--cmux-diff-fg) 36%,var(--cmux-diff-bg))}}.menu-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu-check{justify-self:end}#content{--cmux-diff-files-width:252px;grid-template-columns:minmax(0,1fr) var(--cmux-diff-files-width);overscroll-behavior:contain;contain:strict;background:0 0;flex:auto;grid-template-rows:minmax(0,1fr);grid-template-areas:"viewer files";min-width:0;min-height:0;display:grid;position:relative;overflow:hidden}body[data-files-hidden=true] #content{grid-template-columns:minmax(0,1fr) 0}body[data-status-only=true] #content{grid-template-columns:minmax(0,1fr);grid-template-areas:"viewer"}#files-sidebar{border-left:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);contain:strict;opacity:1;flex-direction:column;grid-area:files;width:100%;min-width:0;height:100%;min-height:0;transition:opacity .1s,visibility linear;display:flex;position:relative;overflow:hidden}#files-resize-handle{z-index:3;appearance:none;cursor:col-resize;background:0 0;border:0;outline:none;width:8px;margin:0;padding:0;position:absolute;top:0;bottom:0;left:0}#files-resize-handle:after{content:"";background:0 0;width:1px;position:absolute;top:0;bottom:0;left:0}body[data-files-hidden=true] #files-sidebar{opacity:0;pointer-events:none;visibility:hidden;transition:opacity .1s,visibility 0s linear .1s}body[data-status-only=true] #files-sidebar{display:none}#files-header{z-index:1;border-bottom:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);min-height:30px;color:var(--cmux-diff-text-muted);justify-content:space-between;align-items:center;gap:8px;padding:0 7px 0 10px;display:flex;position:relative}#files-title{align-items:center;gap:6px;min-width:0;display:inline-flex}#files-header-actions{flex:none;align-items:center;gap:2px;display:inline-flex}#file-search-toggle{width:24px;height:24px;color:var(--cmux-diff-text-muted);background:0 0;border:0;border-radius:5px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}#file-search-toggle:hover,#file-search-toggle[aria-pressed=true]{background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}#file-search-toggle svg{fill:none;stroke:currentColor;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;width:15px;height:15px}#file-list{background:var(--cmux-diff-sidebar-bg);--trees-bg-override:var(--cmux-diff-sidebar-bg);--trees-fg-override:var(--cmux-diff-text-subtle);--trees-fg-muted-override:var(--cmux-diff-text-muted);--trees-bg-muted-override:var(--cmux-diff-hover-bg);--trees-selected-bg-override:var(--cmux-diff-fg);flex:auto;min-height:0;padding:6px 4px 6px 6px;overflow:hidden}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-selected-bg-override:color-mix(in lab, var(--cmux-diff-fg) 11%, transparent)}}#file-list{--trees-selected-fg-override:var(--cmux-diff-fg);--trees-selected-focused-border-color-override:transparent;--trees-border-color-override:var(--cmux-diff-border);--trees-focus-ring-color-override:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-focus-ring-color-override:color-mix(in lab, var(--cmux-diff-accent) 72%, transparent)}}#file-list{--trees-font-family-override:var(--cmux-diff-ui-font-family);--trees-font-size-override:var(--cmux-diff-ui-font-size);--trees-font-weight-semibold-override:500;--trees-density-override:.78;--trees-border-radius-override:5px;--trees-item-padding-x-override:7px;--trees-item-margin-x-override:0;--trees-padding-inline-override:8px;--trees-search-bg-override:var(--cmux-diff-bg)}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-search-bg-override:color-mix(in lab, var(--cmux-diff-bg) 92%, var(--cmux-diff-fg))}}#file-list{--trees-status-added-override:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark));--trees-status-modified-override:var(--cmux-diff-accent);--trees-status-renamed-override:light-dark(#a26300,#ffd166);--trees-status-deleted-override:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}body[data-loading=false] .diff-loading-placeholder,body[data-loading=false]:not([data-status-only=true]) #loading-layer{display:none}#file-list file-tree-container{width:100%;height:100%;min-height:0;display:block}.file-entry{width:100%;min-height:30px;color:inherit;font:inherit;text-align:left;background:0 0;border:0;border-radius:6px;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:8px;padding:3px 7px;display:grid}.file-entry:hover,.file-entry[aria-current=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.file-entry:hover,.file-entry[aria-current=true]{background:color-mix(in lab,var(--cmux-diff-fg) 9%,transparent)}}.file-status{width:17px;height:17px;color:var(--cmux-diff-text-muted);border:1px solid;border-radius:5px;justify-content:center;align-items:center;font-size:9px;line-height:1;display:inline-flex}.file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.file-stats{color:var(--cmux-diff-text-muted);gap:5px;display:inline-flex}.stat-add{color:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark))}.stat-del{color:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}#viewer{--diffs-font-family:var(--cmux-diff-code-font-family);--diffs-header-font-family:var(--cmux-diff-ui-font-family);--diffs-font-size:var(--cmux-diff-font-size);--diffs-line-height:var(--cmux-diff-line-height);--diffs-bg-selection-override:light-dark(var(--cmux-diff-selection-bg-light),var(--cmux-diff-selection-bg-dark));overscroll-behavior:contain;overflow-anchor:none;contain:strict;border-bottom:1px solid var(--cmux-diff-border);background:0 0;grid-area:viewer;width:100%;min-width:0;height:100%;min-height:0;position:relative;overflow:clip auto}.code-view-root{overscroll-behavior:contain;overflow-anchor:none;contain:strict;width:100%;min-width:0;height:100%;min-height:0;position:relative;overflow:clip auto}@media(max-width:520px){#content,body[data-files-hidden=true] #content{grid-template-columns:minmax(0,1fr);grid-template-areas:"viewer"}#files-sidebar{display:none}}@media(prefers-reduced-motion:reduce){#files-sidebar{transition:none}}#viewer diffs-container{--diffs-font-family:var(--cmux-diff-code-font-family);--diffs-header-font-family:var(--cmux-diff-ui-font-family);--diffs-font-size:var(--cmux-diff-font-size);--diffs-line-height:var(--cmux-diff-line-height);--diffs-bg-selection-override:light-dark(var(--cmux-diff-selection-bg-light),var(--cmux-diff-selection-bg-dark));contain:layout paint style;flex:auto;width:100%;min-height:30px;display:block;overflow:clip}#viewer diffs-container [data-diffs-header]{overflow-x:clip}#viewer diffs-container [data-diffs-header=default] [data-metadata]{flex-shrink:0}#loading-layer{z-index:4;pointer-events:none;contain:strict;background:0 0;grid-area:viewer;position:absolute;inset:0;overflow:hidden}body[data-status-only=true] #loading-layer{pointer-events:auto;justify-content:center;align-items:center;width:100%;height:100%;padding:32px;display:flex;position:static}#status{z-index:5;border:1px solid var(--cmux-diff-fg);align-items:center;gap:10px;max-width:calc(100% - 24px);min-height:32px;padding:8px 12px;display:flex;position:absolute;top:10px;left:12px}@supports (color:color-mix(in lab,red,red)){#status{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}#status{background:var(--cmux-diff-bg);font-family:var(--cmux-diff-ui-font-family);font-size:13px;line-height:var(--cmux-diff-ui-line-height);color:var(--cmux-diff-fg);border-radius:7px}@supports (color:color-mix(in lab,red,red)){#status{color:color-mix(in lab,var(--cmux-diff-fg) 70%,var(--cmux-diff-bg))}}body[data-status-only=true] #status{text-align:center;text-wrap:balance;width:auto;max-width:340px;min-height:0;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:14px;padding:0;font-size:14px;line-height:1.55;position:static}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status{color:color-mix(in lab,var(--cmux-diff-fg) 58%,var(--cmux-diff-bg))}}body[data-status-only=true] #status-text{letter-spacing:.005em;font-weight:500}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}#status-icon{display:none}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{background:var(--cmux-diff-fg);border-radius:16px;justify-content:center;align-items:center;width:56px;height:56px;display:flex}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{background:color-mix(in lab,var(--cmux-diff-fg) 5%,transparent)}}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{border:1px solid var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 8%,transparent)}}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon:before{content:"";opacity:.8;background-color:currentColor;width:26px;height:26px;display:block;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 2v6h6'/%3E%3Cpath d='M9 13h6'/%3E%3Cpath d='M9 17h4'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 2v6h6'/%3E%3Cpath d='M9 13h6'/%3E%3Cpath d='M9 17h4'/%3E%3C/svg%3E") 50%/contain no-repeat}#status[data-pending=true]:before,body[data-loading=true] #status:before{content:"";border:2px solid var(--cmux-diff-fg);flex:none;width:14px;height:14px}@supports (color:color-mix(in lab,red,red)){#status[data-pending=true]:before,body[data-loading=true] #status:before{border:2px solid color-mix(in lab,var(--cmux-diff-fg) 20%,transparent)}}#status[data-pending=true]:before,body[data-loading=true] #status:before{border-top-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#status[data-pending=true]:before,body[data-loading=true] #status:before{border-top-color:color-mix(in lab,var(--cmux-diff-fg) 70%,var(--cmux-diff-bg))}}#status[data-pending=true]:before,body[data-loading=true] #status:before{border-radius:50%;animation:.8s linear infinite cmuxDiffPendingSpin}#status[data-error=true]{color:light-dark(#b42318,#ff8a80)}@keyframes cmuxDiffPendingSpin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){#status[data-pending=true]:before,body[data-loading=true] #status:before{animation:none}}#comments-section{border-top:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);flex-direction:column;flex:none;min-height:0;max-height:40%;display:flex}#comments-header{min-height:30px;color:var(--cmux-diff-text-muted);font-size:var(--cmux-diff-ui-font-size);align-items:center;padding:0 10px;display:flex}#comments-list{flex-direction:column;gap:4px;min-height:0;padding:0 6px 6px;display:flex;overflow-y:auto}.comments-empty{color:var(--cmux-diff-text-muted);font-size:var(--cmux-diff-ui-font-size);padding:2px 7px 6px}.comment-entry{color:var(--cmux-diff-text-subtle);font:inherit;font-size:var(--cmux-diff-ui-font-size);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:5px;flex-direction:column;gap:2px;padding:5px 7px;display:flex}.comment-entry:hover{background:var(--cmux-diff-hover-bg)}.comment-entry-header{justify-content:space-between;align-items:center;gap:6px;display:flex}.comment-entry-location{color:var(--cmux-diff-fg);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.comment-entry-badge{background:var(--cmux-diff-muted-bg);color:var(--cmux-diff-text-muted);font-size:calc(var(--cmux-diff-ui-font-size) - 1px);border-radius:4px;flex:none;padding:0 5px}.comment-entry-message{text-overflow:ellipsis;white-space:nowrap;color:var(--cmux-diff-text-muted);overflow:hidden}.comment-composer,.comment-card{border:1px solid var(--cmux-diff-border);background:light-dark(var(--cmux-diff-bg),var(--cmux-diff-bg));border-radius:10px;flex-direction:column;gap:8px;max-width:680px;margin:8px 12px;padding:10px 12px;display:flex}@supports (color:color-mix(in lab,red,red)){.comment-composer,.comment-card{background:light-dark(color-mix(in lab,var(--cmux-diff-bg) 92%,#fff),color-mix(in lab,var(--cmux-diff-bg) 90%,#fff))}}.comment-composer,.comment-card{color:var(--cmux-diff-fg);font-family:var(--cmux-diff-ui-font-family);font-size:13px;line-height:1.45;box-shadow:0 1px 2px lab(0% none none/.1),0 2px 8px lab(0% none none/.06)}.comment-composer:focus-within{border-color:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-composer:focus-within{border-color:color-mix(in lab,var(--cmux-diff-accent) 60%,var(--cmux-diff-border))}}.comment-composer:focus-within{box-shadow:0 0 0 3px var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-composer:focus-within{box-shadow:0 0 0 3px color-mix(in lab,var(--cmux-diff-accent) 18%,transparent)}}.comment-composer-input{box-sizing:border-box;resize:none;width:100%;min-height:52px;color:var(--cmux-diff-fg);font:inherit;background:0 0;border:0;padding:0}.comment-composer-input::placeholder{color:var(--cmux-diff-text-muted)}.comment-composer-input:focus-visible{outline:none}.comment-composer-footer{justify-content:space-between;align-items:center;gap:8px;display:flex}.comment-composer-buttons{gap:6px;display:inline-flex}.comment-button{color:var(--cmux-diff-text-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 12px;font-weight:500}.comment-button:hover:not(:disabled){background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}.comment-button:disabled{opacity:.5;cursor:default}.comment-button-primary{background:var(--cmux-diff-accent);color:light-dark(#fff,#08233f)}.comment-button-primary:hover:not(:disabled){background:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-button-primary:hover:not(:disabled){background:color-mix(in lab,var(--cmux-diff-accent) 86%,var(--cmux-diff-fg))}}.comment-button-primary:hover:not(:disabled){color:light-dark(#fff,#08233f)}.comment-card-header{justify-content:space-between;align-items:center;gap:8px;min-height:20px;display:flex}.comment-card-location{font-weight:500;font-size:calc(var(--cmux-diff-ui-font-size) - 1px);color:var(--cmux-diff-text-muted)}.comment-card-actions{opacity:0;gap:2px;transition:opacity .1s;display:inline-flex}.comment-card:hover .comment-card-actions,.comment-card:focus-within .comment-card-actions{opacity:1}.comment-card-action{color:var(--cmux-diff-text-muted);font:inherit;font-size:calc(var(--cmux-diff-ui-font-size) - 1px);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:1px 6px}.comment-card-action:hover{background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}.comment-card-message{white-space:pre-wrap;overflow-wrap:anywhere}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}`;function mn(){const t=document.getElementById("cmux-diff-viewer-config");if(!t?.textContent)throw new Error("Missing cmux diff viewer config");return JSON.parse(t.textContent)}function bn(t){const e=mn();Ft("diff",pn),zt(_e(e.payload?.appearance)),typeof e.payload?.title=="string"&&e.payload.title.trim()!==""&&(document.title=e.payload.title);const r=pt(e.payload?.labels,{assertMissing:ut()}),i=Zr(e,r);document.body.dataset.filesHidden="false",ze(i);const n=_t(()=>s.jsx(di,{config:e,initialStatus:i}));wt.createRoot(t).render(s.jsx(vt,{router:n}))}export{bn as mountDiffSurface}; + `}function Qe(t,e){const r=t.palette??{},i=Dt(t.background),n=Jr(t),a=de(t.foreground,n,t.type==="light"?"#000000":"#ffffff"),o=(c,l=a)=>de(c,n,l);return{name:t.name,displayName:t.ghosttyName,type:t.type,colors:{"editor.background":i,"editor.foreground":a,"terminal.background":i,"terminal.foreground":a,"terminal.ansiBlack":o(r[0]),"terminal.ansiRed":o(r[1]),"terminal.ansiGreen":o(r[2]),"terminal.ansiYellow":o(r[3]),"terminal.ansiBlue":o(r[4]),"terminal.ansiMagenta":o(r[5]),"terminal.ansiCyan":o(r[6]),"terminal.ansiWhite":o(r[7]),"terminal.ansiBrightBlack":o(r[8]),"terminal.ansiBrightRed":o(r[9],o(r[1])),"terminal.ansiBrightGreen":o(r[10],o(r[2])),"terminal.ansiBrightYellow":o(r[11],o(r[3])),"terminal.ansiBrightBlue":o(r[12],o(r[4])),"terminal.ansiBrightMagenta":o(r[13],o(r[5])),"terminal.ansiBrightCyan":o(r[14],o(r[6])),"terminal.ansiBrightWhite":o(r[15]),"gitDecoration.addedResourceForeground":o(r[10],o(r[2],"#32d74b")),"gitDecoration.deletedResourceForeground":o(r[9],o(r[1],"#ff453a")),"gitDecoration.modifiedResourceForeground":o(r[12],o(r[4],"#0a84ff")),"editor.selectionBackground":t.selectionBackground,"editor.selectionForeground":t.selectionForeground},tokenColors:[{settings:{foreground:a,background:i}},{scope:["comment","punctuation.definition.comment"],settings:{foreground:o(r[8]),fontStyle:"italic"}},{scope:["string","constant.other.symbol"],settings:{foreground:o(r[2])}},{scope:["constant.numeric","constant.language","support.constant"],settings:{foreground:o(r[3])}},{scope:["keyword","storage","storage.type"],settings:{foreground:o(r[5])}},{scope:["entity.name.function","support.function"],settings:{foreground:o(r[4])}},{scope:["entity.name.type","entity.name.class","support.type"],settings:{foreground:o(r[6])}},{scope:["markup.heading","punctuation.definition.heading"],settings:{foreground:o(r[12],o(r[4])),fontStyle:"bold"}},{scope:["markup.bold","punctuation.definition.bold"],settings:{foreground:o(r[11],o(r[3])),fontStyle:"bold"}},{scope:["markup.italic","punctuation.definition.italic"],settings:{foreground:o(r[13],o(r[5])),fontStyle:"italic"}},{scope:["markup.inline.raw","markup.raw","markup.fenced_code","markup.raw.block"],settings:{foreground:o(r[10],o(r[2]))}},{scope:["markup.underline.link","string.other.link","markup.link"],settings:{foreground:o(r[14],o(r[6]))}},{scope:["markup.quote","punctuation.definition.quote"],settings:{foreground:o(r[8]),fontStyle:"italic"}},{scope:["markup.list","punctuation.definition.list","markup.table"],settings:{foreground:o(r[9],o(r[1]))}},{scope:["variable","meta.definition.variable"],settings:{foreground:a}},{scope:["invalid","message.error"],settings:{foreground:o(r[9],o(r[1]))}}]}}function Jr(t){return typeof t.background=="string"&&t.background.trim()!==""?t.background.trim():t.type==="light"?"#ffffff":"#000000"}function ne(t,e={}){const r=e.pending===!0;return{error:e.error===!0,loading:e.loading===!0||r,message:t,pending:r,statusOnly:e.statusOnly===!0}}function Zr(t,e){const r=t.payload;return r?.pendingReplacement===!0?ne(r.statusMessage??e("loadingDiff"),{loading:!0,pending:!0}):typeof r?.statusMessage=="string"&&r.statusMessage.length>0?ne(r.statusMessage,{error:r.statusIsError===!0,loading:!1,statusOnly:!0}):ne(e("loadingDiff"),{loading:!0})}function ze(t){document.body.dataset.loading=t.loading?"true":"false",document.body.dataset.statusOnly=t.statusOnly?"true":"false"}function Qr(t){const e=(Number.isFinite(t.available)?t.available:0)-t.reserved,r=[],i=[];let n=0,a=!1;for(const o of t.items){const c=n+Math.max(0,o.width);!a&&c<=e?(n=c,r.push(o.id)):(a=!0,i.push(o.id))}return{visible:r,overflow:i}}function ei(t){const e=_.c(3),[r,i]=I.useState(null),n=I.useRef(null);let a,o;return e[0]!==t?(a=()=>{const c=t.current;if(!c||typeof ResizeObserver>"u")return;const l=new ResizeObserver(p=>{for(const d of p){const u=d.contentBoxSize?.[0]?.inlineSize??d.contentRect.width,m=Math.round(u);m!==n.current&&(n.current=m,i(m))}});return l.observe(c),()=>l.disconnect()},o=[t],e[0]=t,e[1]=a,e[2]=o):(a=e[1],o=e[2]),I.useEffect(a,o),r}const ti=/\b(Android|iPhone|iPad|iPod|Mobile)\b/i;function ri(t){return ti.test(t??"")?1:3}function ii(){return ri(typeof navigator>"u"?void 0:navigator.userAgent)}function ni(t){return{poolSize:ii(),workerFactory:()=>new Worker(t,{type:"module"})}}const oi=["82%","64%","76%","58%","70%","46%"],ai=["58%","88%","72%","94%","64%","82%","52%","78%"],si="./assets/pierre-diffs-1.2.7-trees-1.0.0-beta.4/worker-pool/worker-portable.js",mt="cmux.diffViewer.layout";function li(t,e){const r=t.payload??{};return{activeItemId:"",activeTreePath:"",comments:[],copyFeedback:"",draft:null,fileSearchOpen:!1,fileSearchRequest:0,filesWidth:252,filesVisible:!0,items:[],languages:["text"],metrics:null,options:{collapsed:!1,diffIndicators:"bars",expandUnchanged:!1,layout:xi(r),lineNumbers:!0,showBackgrounds:!0,wordDiffs:!1,wordWrap:!1},optionsOpen:!1,status:e,treeSource:null}}function ci(t,e){switch(e.type){case"append-items":{const r=e.items.map(n=>{en(n);const a=kr(n,t.comments,t.draft);return t.options.collapsed?{...a,collapsed:!0}:a}),i=rn(t.languages,r.flatMap(tn));return{...t,activeItemId:t.activeItemId||r[0]?.id||"",items:[...t.items,...r],languages:i,status:t.status.loading?ne("",{loading:!1}):t.status}}case"remove-comment":{const r=t.comments.filter(i=>i.id!==e.id);return{...t,comments:r,items:be(t.items,r,t.draft)}}case"rename-item":return{...t,activeItemId:t.activeItemId===e.oldId?e.newId:t.activeItemId,draft:t.draft?.itemId===e.oldId?{...t.draft,itemId:e.newId}:t.draft,items:t.items.map(r=>r.id===e.oldId||r.id===e.newId?{...r,id:e.newId,version:(r.version??0)+1}:r)};case"set-active-item":return{...t,activeItemId:e.itemId,activeTreePath:e.treePath??t.activeTreePath};case"set-comments":return{...t,comments:e.comments,items:be(t.items,e.comments,t.draft)};case"set-copy-feedback":return{...t,copyFeedback:e.message};case"set-draft":return{...t,draft:e.draft,items:be(t.items,t.comments,e.draft)};case"set-file-search-open":return{...t,fileSearchOpen:e.open,filesVisible:e.open?!0:t.filesVisible};case"request-file-search":return{...t,fileSearchOpen:!0,fileSearchRequest:t.fileSearchRequest+1,filesVisible:!0};case"set-files-width":return{...t,filesWidth:e.width};case"set-files-visible":return{...t,filesVisible:e.visible};case"set-metrics":return{...t,metrics:e.metrics};case"set-option":return e.key==="collapsed"?{...t,options:{...t.options,collapsed:!!e.value},items:t.items.map(r=>({...r,collapsed:!!e.value,version:(r.version??0)+1}))}:{...t,options:{...t.options,[e.key]:e.value}};case"set-options-open":return{...t,optionsOpen:e.open};case"set-status":return{...t,status:e.status};case"set-tree-source":{const r=e.source,i=t.activeItemId?r.treePathByItemId.get(t.activeItemId)??t.activeTreePath:t.activeTreePath;return{...t,activeTreePath:i,treeSource:r}}case"upsert-comment":{const i=t.comments.some(n=>n.id===e.comment.id)?t.comments.map(n=>n.id===e.comment.id?e.comment:n):[...t.comments,e.comment];return{...t,comments:i,items:be(t.items,i,t.draft)}}}}function di({config:t,initialStatus:e}){const r=t.payload??{},i=pt(r.labels,{assertMissing:ut()}),n=_e(r.appearance),[a,o]=I.useReducer(ci,li(t,e)),c=gt(a),l=I.useRef(null),p=I.useRef(0),d=I.useRef(null),u=I.useRef(null),m=fi(t.assets?.workerModuleURL),h=ni(m),w=Kr(a.options,n,a.languages),f=typeof r.repoRoot=="string"&&r.repoRoot!==""?r.repoRoot:null,g=jr()&&f!=null,x=_r(r),b=ui({bridgeAvailable:g,dispatch:o,latestState:c,repoRoot:f}),v=qr(a.options,n);v.onGutterUtilityClick=b.onGutterUtilityClick,sn(a),on(r,i,o),Ji(t,i,o,c),Tr(g?f:null,b.onLoaded),cn(a.optionsOpen,o);const y=(C,F)=>{const P=C.metadata;return P.kind==="draft"?s.jsx(st,{labels:x,onCancel:()=>o({type:"set-draft",draft:null}),onSave:N=>b.saveDraft(F,N)}):s.jsx(Rr,{comment:P.comment,labels:x,onDelete:()=>b.remove(P.comment),onSaveMessage:N=>b.editMessage(P.comment,N,F.fileDiff)})},k=Number.isFinite(a.metrics?.completedAt)&&(a.metrics?.completedAt??0)>0,j=Sr(a.items,a.comments,k),M=C=>{C.itemId!=null&&(C.anchor.state==="outdated"?l.current?.scrollTo({type:"item",id:C.itemId,align:"start",behavior:"smooth-auto"}):l.current?.scrollTo({type:"line",id:C.itemId,lineNumber:C.anchor.line,side:C.comment.side,align:"center",behavior:"smooth-auto"}),o({type:"set-active-item",itemId:C.itemId,treePath:a.treeSource?.treePathByItemId.get(C.itemId)}))},R=a.treeSource?.treePathByItemId.get(a.activeItemId)??a.activeTreePath,S=I.useCallback(C=>{const F=c.current,P=dn(C,F.items);P&&(l.current?.scrollTo({type:"item",id:P,align:"start",behavior:"smooth-auto"}),o({type:"set-active-item",itemId:P,treePath:F.treeSource?.treePathByItemId.get(P)}))},[c]),T=I.useCallback(C=>{const F=c.current,P=un(F.items,p.current,E=>l.current?.getInstance()?.getTopForItem(E)),N=fn(P||F.activeItemId,F.items,C);N&&S(N)},[c,S]),B=I.useCallback(C=>{p.current=C},[]);ln(u,o,T);const O=C=>{ze(C),o({type:"set-status",status:C})},D=C=>{wi(C),o({type:"set-option",key:"layout",value:C})};return s.jsxs("div",{id:"app",children:[s.jsx(yi,{config:t,label:i,onCopyGitApply:async()=>{try{const C=await Bt(r.patchURL,i,d.current);o({type:"set-copy-feedback",message:C})}catch{o({type:"set-copy-feedback",message:i("copyFailedGitApplyCommand")})}},onJump:S,onNavigate:C=>{O(ne(i("loadingDiff"),{pending:!0})),window.location.href=Rt(C)},onReload:()=>window.location.reload(),onSetLayout:D,dispatch:o,state:a}),s.jsxs("section",{id:"content",style:{"--cmux-diff-files-width":`${a.filesWidth}px`},children:[s.jsx(Bi,{commentEntries:j,commentLabels:x,hasDraft:a.draft!=null,label:i,onSelectComment:M,onSelectItem:S,selectedPath:R,dispatch:o,state:a}),s.jsx("main",{id:"viewer","aria-label":i("diffViewer"),children:a.items.length>0?s.jsxs(yt,{poolOptions:h,highlighterOptions:w,children:[s.jsx(vi,{codeViewRef:l,highlighterOptions:w}),s.jsx(kt,{ref:l,className:"code-view-root",containerRef:u,items:a.items,onScroll:B,options:v,renderAnnotation:(C,F)=>y(C,F)})]}):null}),s.jsx($i,{label:i,status:a.status})]}),s.jsx("textarea",{ref:d,"aria-hidden":"true",readOnly:!0,tabIndex:-1,className:"copy-fallback-textarea"})]})}function fi(t){return new URL(t||si,window.location.href)}function ui(t){const e=_.c(23),{bridgeAvailable:r,dispatch:i,latestState:n,repoRoot:a}=t;let o;e[0]!==i?(o=x=>i({type:"set-comments",comments:x}),e[0]=i,e[1]=o):o=e[1];const c=o;let l;e[2]!==i?(l=(x,b)=>{const v=x.side==="deletions"?"deletions":"additions";i({type:"set-draft",draft:{itemId:b.item.id,side:v,startLine:Math.min(x.start,x.end),endLine:Math.max(x.start,x.end)}})},e[2]=i,e[3]=l):l=e[3];const p=l;let d;e[4]!==r||e[5]!==i||e[6]!==n||e[7]!==a?(d=(x,b)=>{const v=n.current.draft;if(v==null||v.itemId!==x.id||b.trim()==="")return;const y={filePath:ce(x.fileDiff,""),side:v.side,startLine:v.startLine,endLine:v.endLine,lineText:Te(x.fileDiff,v.side,v.endLine)??"",message:b},k={...y,submissionText:Ke(y,x.fileDiff)};(r&&a!=null?qe(a,k):Promise.resolve(gi(k))).then(M=>{i({type:"upsert-comment",comment:M}),i({type:"set-draft",draft:null})}).catch(hi)},e[4]=r,e[5]=i,e[6]=n,e[7]=a,e[8]=d):d=e[8];const u=d;let m;e[9]!==r||e[10]!==i||e[11]!==a?(m=(x,b,v)=>{if(b.trim()==="")return;const y={...x,message:b,updatedAt:new Date().toISOString()},k={...y,submissionText:Ke(y,v)};(r&&a!=null?qe(a,k):Promise.resolve(k)).then(M=>i({type:"upsert-comment",comment:M})).catch(mi)},e[9]=r,e[10]=i,e[11]=a,e[12]=m):m=e[12];const h=m;let w;e[13]!==r||e[14]!==i||e[15]!==a?(w=x=>{r&&a!=null&&Ir(a,x.id).catch(pi),i({type:"remove-comment",id:x.id})},e[13]=r,e[14]=i,e[15]=a,e[16]=w):w=e[16];const f=w;let g;return e[17]!==h||e[18]!==p||e[19]!==c||e[20]!==f||e[21]!==u?(g={editMessage:h,onGutterUtilityClick:p,onLoaded:c,remove:f,saveDraft:u},e[17]=h,e[18]=p,e[19]=c,e[20]=f,e[21]=u,e[22]=g):g=e[22],g}function pi(t){return console.warn("cmux diff comment delete failed",t)}function mi(t){return console.warn("cmux diff comment edit failed",t)}function hi(t){return console.warn("cmux diff comment save failed",t)}function gi(t){const e=new Date().toISOString();return{...t,id:crypto.randomUUID(),createdAt:e,updatedAt:e}}function xi(t){const e=ht(t.layout);return t.layoutSource==="explicit"&&e?e:bi()??e??"unified"}function bi(){try{return ht(window.localStorage.getItem(mt))}catch{return null}}function wi(t){try{window.localStorage.setItem(mt,t)}catch{}}function ht(t){return t==="split"||t==="unified"?t:null}function vi(t){const{codeViewRef:e,highlighterOptions:r}=t;return Wi(r,e),null}function yi(t){const e=_.c(63),{config:r,dispatch:i,label:n,onCopyGitApply:a,onJump:o,onNavigate:c,onReload:l,onSetLayout:p,state:d}=t;let u;e[0]!==r.payload?(u=r.payload??{},e[0]=r.payload,e[1]=u):u=e[1];const m=u,h=typeof m.externalURL=="string"&&m.externalURL.length>0?m.externalURL:null,w=I.useRef(null),f=ei(w);let g;if(e[2]!==h||e[3]!==m||e[4]!==f){const $=[{id:"files-toggle",width:Ie},{id:"layout-toggle",width:Ie},...h?[{id:"external-link",width:Ie}]:[]];g=f==null?new Set:new Set(Qr({available:f,reserved:ki+(ji(m)?Si:0),items:$}).overflow),e[2]=h,e[3]=m,e[4]=f,e[5]=g}else g=e[5];const x=g,b=!x.has("files-toggle"),v=!x.has("layout-toggle"),y=h!=null&&!x.has("external-link");let k;e[6]!==n||e[7]!==c||e[8]!==m?(k=s.jsx(Ci,{label:n,onNavigate:c,payload:m}),e[6]=n,e[7]=c,e[8]=m,e[9]=k):k=e[9];let j;e[10]!==n||e[11]!==o||e[12]!==d.activeItemId||e[13]!==d.items?(j=s.jsx("div",{className:"toolbar-middle flex min-w-0 flex-1 items-center justify-center gap-1.5",children:s.jsx(Ri,{items:d.items,label:n,onJump:o,selectedItemId:d.activeItemId})}),e[10]=n,e[11]=o,e[12]=d.activeItemId,e[13]=d.items,e[14]=j):j=e[14];let M;e[15]!==h||e[16]!==n||e[17]!==y?(M=y?s.jsx("a",{id:"external-link",className:"toolbar-icon",href:h??void 0,target:"_blank",rel:"noreferrer",title:n("openSourceURL"),"aria-label":n("openSourceURL"),children:s.jsx(Q,{name:"external"})}):null,e[15]=h,e[16]=n,e[17]=y,e[18]=M):M=e[18];let R;e[19]!==n||e[20]!==p||e[21]!==v||e[22]!==d.options?(R=v?s.jsx("button",{id:"layout-toggle",className:"toolbar-icon",type:"button",title:d.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),"aria-label":d.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),onClick:()=>p(d.options.layout==="split"?"unified":"split"),children:s.jsx(Q,{name:d.options.layout})}):null,e[19]=n,e[20]=p,e[21]=v,e[22]=d.options,e[23]=R):R=e[23];let S;e[24]!==n?(S=n("options"),e[24]=n,e[25]=S):S=e[25];let T;e[26]!==n?(T=n("options"),e[26]=n,e[27]=T):T=e[27];let B;e[28]!==i||e[29]!==d.optionsOpen?(B=()=>i({type:"set-options-open",open:!d.optionsOpen}),e[28]=i,e[29]=d.optionsOpen,e[30]=B):B=e[30];let O;e[31]===Symbol.for("react.memo_cache_sentinel")?(O=s.jsx(Q,{name:"dots"}),e[31]=O):O=e[31];let D;e[32]!==d.optionsOpen||e[33]!==S||e[34]!==T||e[35]!==B?(D=s.jsx("button",{id:"options-button",className:"toolbar-icon",type:"button",title:S,"aria-label":T,"aria-expanded":d.optionsOpen,"aria-controls":"options-menu",onClick:B,children:O}),e[32]=d.optionsOpen,e[33]=S,e[34]=T,e[35]=B,e[36]=D):D=e[36];let C;e[37]!==i||e[38]!==n||e[39]!==b||e[40]!==d.filesVisible?(C=b?s.jsx("button",{id:"files-toggle",className:"toolbar-icon",type:"button",title:d.filesVisible?n("hideFiles"):n("showFiles"),"aria-label":d.filesVisible?n("hideFiles"):n("showFiles"),"aria-pressed":d.filesVisible,onClick:()=>i({type:"set-files-visible",visible:!d.filesVisible}),children:s.jsx(Q,{name:"files"})}):null,e[37]=i,e[38]=n,e[39]=b,e[40]=d.filesVisible,e[41]=C):C=e[41];let F;e[42]!==d.copyFeedback?(F=s.jsx("span",{id:"copy-feedback",className:"visually-hidden","aria-live":"polite",children:d.copyFeedback}),e[42]=d.copyFeedback,e[43]=F):F=e[43];let P;e[44]!==D||e[45]!==C||e[46]!==F||e[47]!==M||e[48]!==R?(P=s.jsxs("div",{className:"toolbar-actions flex items-center gap-1.5",children:[M,R,D,C,F]}),e[44]=D,e[45]=C,e[46]=F,e[47]=M,e[48]=R,e[49]=P):P=e[49];let N;e[50]!==i||e[51]!==h||e[52]!==n||e[53]!==a||e[54]!==l||e[55]!==p||e[56]!==d?(N=d.optionsOpen?s.jsx(Ti,{dispatch:i,externalURL:h,label:n,onCopyGitApply:a,onReload:l,onSetLayout:p,state:d}):null,e[50]=i,e[51]=h,e[52]=n,e[53]=a,e[54]=l,e[55]=p,e[56]=d,e[57]=N):N=e[57];let E;return e[58]!==P||e[59]!==N||e[60]!==k||e[61]!==j?(E=s.jsxs("header",{id:"toolbar",ref:w,children:[k,j,P,N]}),e[58]=P,e[59]=N,e[60]=k,e[61]=j,e[62]=E):E=e[62],E}const Ie=28,ki=248,Si=60;function ji(t){return Array.isArray(t?.repoOptions)&&t.repoOptions.length>=2}function Ci(t){const e=_.c(21),{label:r,onNavigate:i,payload:n}=t;let a;e[0]!==r?(a=r("diffTarget"),e[0]=r,e[1]=a):a=e[1];let o;e[2]!==i||e[3]!==n.sourceOptions||e[4]!==a?(o=s.jsx(Le,{ariaLabel:a,fallbackValue:"",id:"source-select",options:n.sourceOptions,onNavigate:i}),e[2]=i,e[3]=n.sourceOptions,e[4]=a,e[5]=o):o=e[5];let c;e[6]!==r?(c=r("repoPath"),e[6]=r,e[7]=c):c=e[7];const l=n.repoRoot??"";let p;e[8]!==i||e[9]!==n.repoOptions||e[10]!==c||e[11]!==l?(p=s.jsx(Le,{ariaLabel:c,fallbackValue:l,id:"repo-select",options:n.repoOptions,onNavigate:i}),e[8]=i,e[9]=n.repoOptions,e[10]=c,e[11]=l,e[12]=p):p=e[12];let d;e[13]!==r||e[14]!==i||e[15]!==n?(d=s.jsx(Ii,{label:r,onNavigate:i,payload:n}),e[13]=r,e[14]=i,e[15]=n,e[16]=d):d=e[16];let u;return e[17]!==o||e[18]!==p||e[19]!==d?(u=s.jsxs("div",{className:"toolbar-left flex min-w-0 items-center gap-1.5",children:[o,p,d]}),e[17]=o,e[18]=p,e[19]=d,e[20]=u):u=e[20],u}function Ii(t){const e=_.c(13),{label:r,onNavigate:i,payload:n}=t;let a;e[0]!==n?(a=Pi(n),e[0]=n,e[1]=a):a=e[1];const o=a;if(o){let d;return e[2]!==r||e[3]!==i||e[4]!==o?(d=s.jsx(qt,{label:r,onNavigate:i,picker:o}),e[2]=r,e[3]=i,e[4]=o,e[5]=d):d=e[5],d}let c;e[6]!==r?(c=r("branchBase"),e[6]=r,e[7]=c):c=e[7];const l=n.branchBaseRef??"";let p;return e[8]!==i||e[9]!==n.baseOptions||e[10]!==c||e[11]!==l?(p=s.jsx(Le,{ariaLabel:c,fallbackValue:l,id:"base-select",options:n.baseOptions,onNavigate:i}),e[8]=i,e[9]=n.baseOptions,e[10]=c,e[11]=l,e[12]=p):p=e[12],p}function Pi(t){const e=t?.branchPicker;return Mi(e)?e:null}function Mi(t){return!!(t&&typeof t=="object"&&typeof t.refsURL=="string"&&t.refsURL!==""&&typeof t.regenerateURLTemplate=="string"&&t.regenerateURLTemplate!==""&&typeof t.currentRef=="string"&&typeof t.headRef=="string")}function Le(t){const e=_.c(15),{ariaLabel:r,fallbackValue:i,id:n,onNavigate:a,options:o}=t;if(!Array.isArray(o)||o.length<2)return null;let c;e[0]!==o?(c=o.find(_i)??o.find(Fi),e[0]=o,e[1]=c):c=e[1];const l=c,p=l?.value??i;let d;e[2]!==i||e[3]!==a||e[4]!==o||e[5]!==l?.value?(d=h=>{const w=o.find(f=>f.value===h.currentTarget.value);if(!w?.url){h.currentTarget.value=l?.value??i;return}a(w.url)},e[2]=i,e[3]=a,e[4]=o,e[5]=l?.value,e[6]=d):d=e[6];let u;e[7]!==o?(u=o.map(Li),e[7]=o,e[8]=u):u=e[8];let m;return e[9]!==r||e[10]!==n||e[11]!==p||e[12]!==d||e[13]!==u?(m=s.jsx("select",{id:n,"aria-label":r,defaultValue:p,title:r,onChange:d,children:u}),e[9]=r,e[10]=n,e[11]=p,e[12]=d,e[13]=u,e[14]=m):m=e[14],m}function Li(t){return s.jsx("option",{value:t.value,disabled:t.disabled||!t.url,title:t.message,children:t.label},t.value)}function Fi(t){return!t.disabled}function _i(t){return t.selected}function Ri(t){const e=_.c(19),{items:r,label:i,onJump:n,selectedItemId:a}=t;if(r.length===0)return null;let o;e[0]!==i?(o=i("jumpToFile"),e[0]=i,e[1]=o):o=e[1];let c;e[2]!==n?(c=m=>n(m.currentTarget.value),e[2]=n,e[3]=c):c=e[3];let l;e[4]!==i?(l=i("jumpToFile"),e[4]=i,e[5]=l):l=e[5];let p;e[6]!==l?(p=s.jsx("option",{value:"",children:l}),e[6]=l,e[7]=p):p=e[7];let d;if(e[8]!==r||e[9]!==i){let m;e[11]!==i?(m=h=>s.jsx("option",{value:h.id,children:ce(h.fileDiff,i("untitled"))},h.id),e[11]=i,e[12]=m):m=e[12],d=r.map(m),e[8]=r,e[9]=i,e[10]=d}else d=e[10];let u;return e[13]!==a||e[14]!==o||e[15]!==c||e[16]!==p||e[17]!==d?(u=s.jsxs("select",{id:"jump-select","aria-label":o,value:a,onChange:c,children:[p,d]}),e[13]=a,e[14]=o,e[15]=c,e[16]=p,e[17]=d,e[18]=u):u=e[18],u}function Ti(t){const e=_.c(137),{dispatch:r,externalURL:i,label:n,onCopyGitApply:a,onReload:o,onSetLayout:c,state:l}=t;let p;e[0]!==r||e[1]!==l.options?(p=le=>r({type:"set-option",key:le,value:!l.options[le]}),e[0]=r,e[1]=l.options,e[2]=p):p=e[2];const d=p;let u;e[3]!==n?(u=n("options"),e[3]=n,e[4]=u):u=e[4];let m;e[5]!==n?(m=n("refresh"),e[5]=n,e[6]=m):m=e[6];let h;e[7]!==o||e[8]!==m?(h=s.jsx(re,{icon:"refresh",label:m,onClick:o}),e[7]=o,e[8]=m,e[9]=h):h=e[9];let w;e[10]!==n||e[11]!==l.options.wordWrap?(w=l.options.wordWrap?n("disableWordWrap"):n("enableWordWrap"),e[10]=n,e[11]=l.options.wordWrap,e[12]=w):w=e[12];let f;e[13]!==d?(f=()=>d("wordWrap"),e[13]=d,e[14]=f):f=e[14];let g;e[15]!==l.options.wordWrap||e[16]!==w||e[17]!==f?(g=s.jsx(re,{checked:l.options.wordWrap,icon:"wrap",label:w,onClick:f}),e[15]=l.options.wordWrap,e[16]=w,e[17]=f,e[18]=g):g=e[18];const x=l.options.collapsed?"expand":"collapse";let b;e[19]!==n||e[20]!==l.options.collapsed?(b=l.options.collapsed?n("expandAllDiffs"):n("collapseAllDiffs"),e[19]=n,e[20]=l.options.collapsed,e[21]=b):b=e[21];let v;e[22]!==d?(v=()=>d("collapsed"),e[22]=d,e[23]=v):v=e[23];let y;e[24]!==l.options.collapsed||e[25]!==v||e[26]!==x||e[27]!==b?(y=s.jsx(re,{checked:l.options.collapsed,icon:x,label:b,onClick:v}),e[24]=l.options.collapsed,e[25]=v,e[26]=x,e[27]=b,e[28]=y):y=e[28];let k;e[29]===Symbol.for("react.memo_cache_sentinel")?(k=s.jsx("div",{className:"menu-separator"}),e[29]=k):k=e[29];let j;e[30]!==n||e[31]!==l.options.layout?(j=l.options.layout==="split"?n("switchToUnifiedDiff"):n("switchToSplitDiff"),e[30]=n,e[31]=l.options.layout,e[32]=j):j=e[32];let M;e[33]!==c||e[34]!==l.options.layout?(M=()=>c(l.options.layout==="split"?"unified":"split"),e[33]=c,e[34]=l.options.layout,e[35]=M):M=e[35];let R;e[36]!==l.options.layout||e[37]!==j||e[38]!==M?(R=s.jsx(re,{icon:l.options.layout,label:j,onClick:M}),e[36]=l.options.layout,e[37]=j,e[38]=M,e[39]=R):R=e[39];let S;e[40]!==i||e[41]!==n?(S=i?s.jsx(re,{icon:"external",label:n("openSourceURL"),onClick:()=>window.open(i,"_blank","noreferrer")}):null,e[40]=i,e[41]=n,e[42]=S):S=e[42];let T;e[43]!==n||e[44]!==l.filesVisible?(T=l.filesVisible?n("hideFiles"):n("showFiles"),e[43]=n,e[44]=l.filesVisible,e[45]=T):T=e[45];let B;e[46]!==r||e[47]!==l.filesVisible?(B=()=>r({type:"set-files-visible",visible:!l.filesVisible}),e[46]=r,e[47]=l.filesVisible,e[48]=B):B=e[48];let O;e[49]!==l.filesVisible||e[50]!==T||e[51]!==B?(O=s.jsx(re,{checked:l.filesVisible,icon:"files",label:T,onClick:B}),e[49]=l.filesVisible,e[50]=T,e[51]=B,e[52]=O):O=e[52];let D;e[53]!==n||e[54]!==l.options.expandUnchanged?(D=l.options.expandUnchanged?n("collapseUnchangedContext"):n("expandUnchangedContext"),e[53]=n,e[54]=l.options.expandUnchanged,e[55]=D):D=e[55];let C;e[56]!==d?(C=()=>d("expandUnchanged"),e[56]=d,e[57]=C):C=e[57];let F;e[58]!==l.options.expandUnchanged||e[59]!==D||e[60]!==C?(F=s.jsx(re,{checked:l.options.expandUnchanged,icon:"document",label:D,onClick:C}),e[58]=l.options.expandUnchanged,e[59]=D,e[60]=C,e[61]=F):F=e[61];let P;e[62]!==n||e[63]!==l.options.showBackgrounds?(P=l.options.showBackgrounds?n("hideBackgrounds"):n("showBackgrounds"),e[62]=n,e[63]=l.options.showBackgrounds,e[64]=P):P=e[64];let N;e[65]!==d?(N=()=>d("showBackgrounds"),e[65]=d,e[66]=N):N=e[66];let E;e[67]!==l.options.showBackgrounds||e[68]!==P||e[69]!==N?(E=s.jsx(re,{checked:l.options.showBackgrounds,icon:"background",label:P,onClick:N}),e[67]=l.options.showBackgrounds,e[68]=P,e[69]=N,e[70]=E):E=e[70];let $;e[71]!==n||e[72]!==l.options.lineNumbers?($=l.options.lineNumbers?n("hideLineNumbers"):n("showLineNumbers"),e[71]=n,e[72]=l.options.lineNumbers,e[73]=$):$=e[73];let W;e[74]!==d?(W=()=>d("lineNumbers"),e[74]=d,e[75]=W):W=e[75];let V;e[76]!==l.options.lineNumbers||e[77]!==$||e[78]!==W?(V=s.jsx(re,{checked:l.options.lineNumbers,icon:"numbers",label:$,onClick:W}),e[76]=l.options.lineNumbers,e[77]=$,e[78]=W,e[79]=V):V=e[79];let U;e[80]!==n||e[81]!==l.options.wordDiffs?(U=l.options.wordDiffs?n("disableWordDiffs"):n("enableWordDiffs"),e[80]=n,e[81]=l.options.wordDiffs,e[82]=U):U=e[82];let z;e[83]!==d?(z=()=>d("wordDiffs"),e[83]=d,e[84]=z):z=e[84];let G;e[85]!==l.options.wordDiffs||e[86]!==U||e[87]!==z?(G=s.jsx(re,{checked:l.options.wordDiffs,icon:"word",label:U,onClick:z}),e[85]=l.options.wordDiffs,e[86]=U,e[87]=z,e[88]=G):G=e[88];let ee;e[89]===Symbol.for("react.memo_cache_sentinel")?(ee=s.jsx(Q,{name:"bars"}),e[89]=ee):ee=e[89];let J;e[90]!==n?(J=n("indicatorStyle"),e[90]=n,e[91]=J):J=e[91];let Z;e[92]!==J?(Z=s.jsx("span",{className:"menu-label",children:J}),e[92]=J,e[93]=Z):Z=e[93];let H;e[94]!==n?(H=n("bars"),e[94]=n,e[95]=H):H=e[95];let oe;e[96]!==H?(oe={value:"bars",icon:"bars",label:H},e[96]=H,e[97]=oe):oe=e[97];let ae;e[98]!==n?(ae=n("classic"),e[98]=n,e[99]=ae):ae=e[99];let q;e[100]!==ae?(q={value:"classic",icon:"classic",label:ae},e[100]=ae,e[101]=q):q=e[101];let K;e[102]!==n?(K=n("none"),e[102]=n,e[103]=K):K=e[103];let X;e[104]!==K?(X={value:"none",icon:"eye",label:K},e[104]=K,e[105]=X):X=e[105];let Y;e[106]!==oe||e[107]!==q||e[108]!==X?(Y=[oe,q,X],e[106]=oe,e[107]=q,e[108]=X,e[109]=Y):Y=e[109];let te;e[110]!==r||e[111]!==l.options.diffIndicators||e[112]!==Y?(te=s.jsx("span",{className:"menu-segment-controls",children:Y.map(le=>s.jsx("button",{type:"button",className:"segment-button",title:le.label,"aria-label":le.label,"aria-pressed":l.options.diffIndicators===le.value,onClick:()=>r({type:"set-option",key:"diffIndicators",value:le.value}),children:s.jsx(Q,{name:le.icon})},le.value))}),e[110]=r,e[111]=l.options.diffIndicators,e[112]=Y,e[113]=te):te=e[113];let L;e[114]!==Z||e[115]!==te?(L=s.jsxs("div",{className:"menu-item menu-segment",children:[ee,Z,te]}),e[114]=Z,e[115]=te,e[116]=L):L=e[116];let A;e[117]===Symbol.for("react.memo_cache_sentinel")?(A=s.jsx("div",{className:"menu-separator"}),e[117]=A):A=e[117];let se;e[118]!==n?(se=n("copyGitApplyCommand"),e[118]=n,e[119]=se):se=e[119];let fe;e[120]!==a||e[121]!==se?(fe=s.jsx(re,{icon:"clipboard",label:se,onClick:a}),e[120]=a,e[121]=se,e[122]=fe):fe=e[122];let pe;return e[123]!==y||e[124]!==R||e[125]!==S||e[126]!==O||e[127]!==u||e[128]!==F||e[129]!==E||e[130]!==V||e[131]!==G||e[132]!==h||e[133]!==L||e[134]!==fe||e[135]!==g?(pe=s.jsxs("div",{id:"options-menu","aria-label":u,children:[h,g,y,k,R,S,O,F,E,V,G,L,A,fe]}),e[123]=y,e[124]=R,e[125]=S,e[126]=O,e[127]=u,e[128]=F,e[129]=E,e[130]=V,e[131]=G,e[132]=h,e[133]=L,e[134]=fe,e[135]=g,e[136]=pe):pe=e[136],pe}function re(t){const e=_.c(14),{checked:r,icon:i,label:n,onClick:a}=t,o=r??void 0;let c;e[0]!==i?(c=s.jsx(Q,{name:i}),e[0]=i,e[1]=c):c=e[1];let l;e[2]!==n?(l=s.jsx("span",{className:"menu-label",children:n}),e[2]=n,e[3]=l):l=e[3];let p;e[4]!==r?(p=r?s.jsx(Q,{name:"check"}):null,e[4]=r,e[5]=p):p=e[5];let d;e[6]!==p?(d=s.jsx("span",{className:"menu-check",children:p}),e[6]=p,e[7]=d):d=e[7];let u;return e[8]!==a||e[9]!==o||e[10]!==c||e[11]!==l||e[12]!==d?(u=s.jsxs("button",{type:"button",className:"menu-item","aria-pressed":o,onClick:a,children:[c,l,d]}),e[8]=a,e[9]=o,e[10]=c,e[11]=l,e[12]=d,e[13]=u):u=e[13],u}function Bi(t){const e=_.c(70),{commentEntries:r,commentLabels:i,dispatch:n,hasDraft:a,label:o,onSelectComment:c,onSelectItem:l,selectedPath:p,state:d}=t,u=I.useRef(null);let m;e[0]!==n?(m=z=>{const G=u.current;if(!G)return;const ee=document.documentElement.clientWidth||window.innerWidth,J=Math.max(220,Math.min(520,Math.floor(ee*.55))),Z=Math.max(180,Math.min(J,Math.round(G.startWidth-(z-G.startX))));n({type:"set-files-width",width:Z})},e[0]=n,e[1]=m):m=e[1];const h=m;let w;e[2]!==o?(w=o("changedFiles"),e[2]=o,e[3]=w):w=e[3];const f=!d.filesVisible,g=!d.filesVisible;let x;e[4]!==o?(x=o("files"),e[4]=o,e[5]=x):x=e[5];let b;e[6]!==d.filesWidth?(b=z=>{u.current={startWidth:d.filesWidth,startX:z.clientX},z.currentTarget.setPointerCapture(z.pointerId)},e[6]=d.filesWidth,e[7]=b):b=e[7];let v,y;e[8]!==h?(v=z=>h(z.clientX),y=z=>{h(z.clientX),u.current=null,z.currentTarget.releasePointerCapture(z.pointerId)},e[8]=h,e[9]=v,e[10]=y):(v=e[9],y=e[10]);let k;e[11]===Symbol.for("react.memo_cache_sentinel")?(k=()=>{u.current=null},e[11]=k):k=e[11];let j;e[12]!==n||e[13]!==d.filesWidth?(j=z=>{if(z.key!=="ArrowLeft"&&z.key!=="ArrowRight")return;z.preventDefault();const G=z.key==="ArrowLeft"?20:-20;n({type:"set-files-width",width:Math.max(180,Math.min(520,d.filesWidth+G))})},e[12]=n,e[13]=d.filesWidth,e[14]=j):j=e[14];let M;e[15]!==j||e[16]!==x||e[17]!==b||e[18]!==v||e[19]!==y?(M=s.jsx("button",{id:"files-resize-handle","aria-label":x,type:"button",tabIndex:0,onPointerDown:b,onPointerMove:v,onPointerUp:y,onPointerCancel:k,onKeyDown:j}),e[15]=j,e[16]=x,e[17]=b,e[18]=v,e[19]=y,e[20]=M):M=e[20];let R;e[21]!==o?(R=o("files"),e[21]=o,e[22]=R):R=e[22];let S;e[23]!==R?(S=s.jsx("span",{children:R}),e[23]=R,e[24]=S):S=e[24];const T=d.treeSource?.pathCount??0;let B;e[25]!==T?(B=s.jsx("span",{id:"files-count",children:T}),e[25]=T,e[26]=B):B=e[26];let O;e[27]!==S||e[28]!==B?(O=s.jsxs("span",{id:"files-title",children:[S,B]}),e[27]=S,e[28]=B,e[29]=O):O=e[29];let D;e[30]!==o||e[31]!==d.fileSearchOpen?(D=d.fileSearchOpen?o("hideFileSearch"):o("showFileSearch"),e[30]=o,e[31]=d.fileSearchOpen,e[32]=D):D=e[32];let C;e[33]!==o||e[34]!==d.fileSearchOpen?(C=d.fileSearchOpen?o("hideFileSearch"):o("showFileSearch"),e[33]=o,e[34]=d.fileSearchOpen,e[35]=C):C=e[35];const F=!d.treeSource;let P;e[36]!==n||e[37]!==d.fileSearchOpen?(P=()=>n({type:"set-file-search-open",open:!d.fileSearchOpen}),e[36]=n,e[37]=d.fileSearchOpen,e[38]=P):P=e[38];let N;e[39]===Symbol.for("react.memo_cache_sentinel")?(N=s.jsx(Q,{name:"search"}),e[39]=N):N=e[39];let E;e[40]!==d.fileSearchOpen||e[41]!==D||e[42]!==C||e[43]!==F||e[44]!==P?(E=s.jsx("span",{id:"files-header-actions",children:s.jsx("button",{id:"file-search-toggle",type:"button",title:D,"aria-label":C,"aria-pressed":d.fileSearchOpen,disabled:F,onClick:P,children:N})}),e[40]=d.fileSearchOpen,e[41]=D,e[42]=C,e[43]=F,e[44]=P,e[45]=E):E=e[45];let $;e[46]!==O||e[47]!==E?($=s.jsxs("div",{id:"files-header",children:[O,E]}),e[46]=O,e[47]=E,e[48]=$):$=e[48];let W;e[49]!==o||e[50]!==l||e[51]!==p||e[52]!==d.fileSearchOpen||e[53]!==d.fileSearchRequest||e[54]!==d.status||e[55]!==d.treeSource?(W=s.jsx("div",{id:"file-list",children:d.treeSource?s.jsx(Ni,{fileSearchOpen:d.fileSearchOpen,fileSearchRequest:d.fileSearchRequest,label:o,onSelectItem:l,selectedPath:p,source:d.treeSource}):d.status.loading||d.status.pending?s.jsx(Di,{}):s.jsx("div",{className:"visually-hidden",children:d.status.message})}),e[49]=o,e[50]=l,e[51]=p,e[52]=d.fileSearchOpen,e[53]=d.fileSearchRequest,e[54]=d.status,e[55]=d.treeSource,e[56]=W):W=e[56];let V;e[57]!==r||e[58]!==i||e[59]!==a||e[60]!==c?(V=s.jsx(Lr,{entries:r,hasDraft:a,labels:i,onSelect:c}),e[57]=r,e[58]=i,e[59]=a,e[60]=c,e[61]=V):V=e[61];let U;return e[62]!==M||e[63]!==w||e[64]!==$||e[65]!==W||e[66]!==V||e[67]!==f||e[68]!==g?(U=s.jsxs("aside",{id:"files-sidebar","aria-label":w,"aria-hidden":f,inert:g,children:[M,$,W,V]}),e[62]=M,e[63]=w,e[64]=$,e[65]=W,e[66]=V,e[67]=f,e[68]=g,e[69]=U):U=e[69],U}function Ni(t){const e=_.c(18),{fileSearchOpen:r,fileSearchRequest:i,label:n,onSelectItem:a,selectedPath:o,source:c}=t;let l;e[0]!==n||e[1]!==a||e[2]!==c?(l={label:n,onSelectItem:a,source:c},e[0]=n,e[1]=a,e[2]=c,e[3]=l):l=e[3];const p=gt(l);let d;e[4]!==c.paths?(d=()=>Pe(c.paths),e[4]=c.paths,e[5]=d):d=e[5];const[u]=I.useState(d);let m;e[6]!==o?(m=o?[o]:[],e[6]=o,e[7]=m):m=e[7];let h;e[8]===Symbol.for("react.memo_cache_sentinel")?(h=xt(),e[8]=h):h=e[8];const w=c.gitStatus;let f;e[9]===Symbol.for("react.memo_cache_sentinel")?(f=Yr(),e[9]=f):f=e[9];let g;e[10]!==u||e[11]!==p||e[12]!==m||e[13]!==w?(g={flattenEmptyDirectories:!1,id:"cmux-diff-file-tree",initialExpansion:"open",initialSelectedPaths:m,initialVisibleRowCount:h,itemHeight:24,overscan:12,preparedInput:u,search:!0,searchBlurBehavior:"retain",stickyFolders:!0,gitStatus:w,sort:zi,unsafeCSS:f,onSelectionChange(y){const k=y[y.length-1],j=p.current.source.pathToItemId.get(k);j&&p.current.onSelectItem(j)}},e[10]=u,e[11]=p,e[12]=m,e[13]=w,e[14]=g):g=e[14];const{model:x}=St(g);qi(x,c),Xi(x,r,i),Yi(x,o);let b;e[15]===Symbol.for("react.memo_cache_sentinel")?(b={height:"100%"},e[15]=b):b=e[15];let v;return e[16]!==x?(v=s.jsx(Ct,{model:x,style:b}),e[16]=x,e[17]=v):v=e[17],v}function zi(){return 0}function Di(){const t=_.c(1);let e;return t[0]===Symbol.for("react.memo_cache_sentinel")?(e=s.jsx("div",{className:"diff-loading-placeholder","aria-hidden":"true",children:oi.map(Ei)}),t[0]=e):e=t[0],e}function Ei(t,e){return s.jsxs("div",{className:"grid h-6 grid-cols-[16px_minmax(0,1fr)_44px] items-center gap-2 rounded-[5px] px-[7px]",children:[s.jsx("span",{className:"size-4 rounded-[5px] border border-[color-mix(in_lab,var(--cmux-diff-fg)_18%,transparent)]"}),s.jsx("span",{className:"h-[11px] rounded bg-[var(--cmux-diff-muted-bg)]",style:{width:t}}),s.jsx("span",{className:"h-[11px] justify-self-end rounded bg-[var(--cmux-diff-muted-bg)] opacity-70",style:{width:e%2===0?"34px":"24px"}})]},`${t}-${e}`)}function Ai(){const t=_.c(2);let e;t[0]===Symbol.for("react.memo_cache_sentinel")?(e=s.jsxs("div",{className:"mb-3 grid h-9 grid-cols-[72px_minmax(0,1fr)_96px] items-center gap-3 rounded-md bg-[color-mix(in_lab,var(--cmux-diff-fg)_5%,transparent)] px-3",children:[s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)]"}),s.jsx("span",{className:"h-3 w-2/5 rounded bg-[var(--cmux-diff-muted-bg)]"}),s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)] opacity-70"})]}),t[0]=e):e=t[0];let r;return t[1]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsxs("div",{className:"diff-loading-placeholder mx-3.5 mt-3.5 border-t border-[var(--cmux-diff-border)] pt-3","aria-hidden":"true",children:[e,s.jsx("div",{className:"space-y-[13px] px-3 py-1",children:ai.map(Oi)})]}),t[1]=r):r=t[1],r}function Oi(t,e){return s.jsxs("div",{className:"grid grid-cols-[42px_minmax(0,1fr)] items-center gap-4",children:[s.jsx("span",{className:"h-px bg-[color-mix(in_lab,var(--cmux-diff-fg)_10%,transparent)]"}),s.jsx("span",{className:"h-3 rounded bg-[var(--cmux-diff-muted-bg)]",style:{width:t}})]},`${t}-${e}`)}function $i(t){const e=_.c(16),{label:r,status:i}=t;if(!i.loading&&!i.pending&&!i.statusOnly&&!i.error)return null;const n=i.error?"true":"false",a=i.pending?"true":"false";let o;e[0]===Symbol.for("react.memo_cache_sentinel")?(o=s.jsx("span",{id:"status-icon","aria-hidden":"true"}),e[0]=o):o=e[0];let c;e[1]!==r||e[2]!==i.message?(c=i.message||r("loadingDiff"),e[1]=r,e[2]=i.message,e[3]=c):c=e[3];let l;e[4]!==c?(l=s.jsx("span",{id:"status-text",children:c}),e[4]=c,e[5]=l):l=e[5];let p;e[6]!==n||e[7]!==a||e[8]!==l?(p=s.jsxs("div",{id:"status","data-error":n,"data-pending":a,children:[o,l]}),e[6]=n,e[7]=a,e[8]=l,e[9]=p):p=e[9];let d;e[10]!==i.loading||e[11]!==i.pending?(d=i.loading||i.pending?s.jsx(Ai,{}):null,e[10]=i.loading,e[11]=i.pending,e[12]=d):d=e[12];let u;return e[13]!==p||e[14]!==d?(u=s.jsxs("div",{id:"loading-layer","aria-live":"polite",children:[p,d]}),e[13]=p,e[14]=d,e[15]=u):u=e[15],u}function gt(t){const e=_.c(3),r=I.useRef(t);let i,n;return e[0]!==t?(i=()=>{r.current=t},n=[t],e[0]=t,e[1]=i,e[2]=n):(i=e[1],n=e[2]),I.useEffect(i,n),r}function Wi(t,e){const r=_.c(5),i=jt(),n=I.useRef(null);let a,o;r[0]!==e||r[1]!==t||r[2]!==i?(a=()=>{if(!i||Gi(n.current,t))return;let c=!0;return n.current=t,i.setRenderOptions(t).then(()=>{c&&e.current?.getInstance()?.render(!0)}).catch(Vi),()=>{c=!1}},o=[e,t,i],r[0]=e,r[1]=t,r[2]=i,r[3]=a,r[4]=o):(a=r[3],o=r[4]),I.useEffect(a,o)}function Vi(t){return console.warn("cmux diff worker render options update failed",t)}function Gi(t,e){return t?.lineDiffType===e.lineDiffType&&Ui(t?.langs,e.langs)&&t?.maxLineDiffLength===e.maxLineDiffLength&&t?.preferredHighlighter===e.preferredHighlighter&&Hi(t?.theme,e.theme)&&t?.tokenizeMaxLineLength===e.tokenizeMaxLineLength&&t?.useTokenTransformer===e.useTokenTransformer}function Ui(t,e){return t===e?!0:t==null||e==null||t.length!==e.length?!1:t.every((r,i)=>r===e[i])}function Hi(t,e){return t===e?!0:typeof t!="object"||t==null||typeof e!="object"||e==null?!1:t.dark===e.dark&&t.light===e.light}function qi(t,e){const r=_.c(4),i=I.useRef(null);let n,a;r[0]!==t||r[1]!==e?(n=()=>{const o=i.current;i.current=e;const c=Wr(o,e,e.paths);let l=c.kind==="append"?c.requiresFullGitStatus:!1;if(c.kind==="append"){if(c.addedPaths.length>0)try{t.batch(c.addedPaths.map(Ki)),l=!c.sourceFollowsPrevious}catch{const p=Pe(e.paths);t.resetPaths(e.paths,{preparedInput:p}),l=!0}}else{const p=Pe(e.paths);t.resetPaths(e.paths,{preparedInput:p}),l=!0}Vr(t,e,l)},a=[t,e],r[0]=t,r[1]=e,r[2]=n,r[3]=a):(n=r[2],a=r[3]),I.useEffect(n,a)}function Ki(t){return{type:"add",path:t}}function Xi(t,e,r){const i=_.c(7);let n;i[0]!==e||i[1]!==t?(n=()=>{if(e){const o=t.isSearchOpen();if(t.openSearch(o?t.getSearchValue():""),o){const c=t.getFileTreeContainer();(c?.shadowRoot??c?.getRootNode())?.querySelector("[data-file-tree-search-input]")?.focus()}}else t.closeSearch()},i[0]=e,i[1]=t,i[2]=n):n=i[2];let a;i[3]!==e||i[4]!==r||i[5]!==t?(a=[e,r,t],i[3]=e,i[4]=r,i[5]=t,i[6]=a):a=i[6],I.useEffect(n,a)}function Yi(t,e){const r=_.c(4);let i,n;r[0]!==t||r[1]!==e?(i=()=>{Gr(t,e)},n=[t,e],r[0]=t,r[1]=e,r[2]=i,r[3]=n):(i=r[2],n=r[3]),I.useEffect(i,n)}function Ji(t,e,r,i){const n=_.c(6),a=I.useRef(!1);let o,c;n[0]!==t||n[1]!==r||n[2]!==e||n[3]!==i?(o=()=>{if(a.current||nn(t.payload))return;a.current=!0;const l=t.payload??{},p=_e(l.appearance);p.themes.light.name&&De(p.themes.light.name,()=>Promise.resolve(Qe(p.themes.light))),p.themes.dark.name&&De(p.themes.dark.name,()=>Promise.resolve(Qe(p.themes.dark)));const d=[];r({type:"set-status",status:ne(e("parsingDiff"),{loading:!0})}),or({getCollapsed:()=>i.current.options.collapsed,initialFileTreeRowCount:xt(),label:e,onBatch:u=>{d.push(...u),r({type:"append-items",items:u})},onComplete:u=>{r({type:"set-metrics",metrics:u});const m=d;if(m.length===0){r({type:"set-status",status:ne(e("noFileDiffs"),{error:!0,loading:!1,statusOnly:!0})});return}const h=Array.from(new Set([p.theme?.light,p.theme?.dark].filter(Boolean))),w=Array.from(new Set(m.flatMap(Qi)));Mt({themes:h,langs:w.length>0?w:["text"]}).catch(Zi)},onMetrics:u=>r({type:"set-metrics",metrics:u}),onRename:u=>r({type:"rename-item",oldId:u.oldId,newId:u.newId}),onTreeSource:u=>r({type:"set-tree-source",source:u}),parsePatchFiles:Pt,patchURL:l.patchURL,processFile:It}).catch(u=>{console.error("cmux diff viewer render failed",u),r({type:"set-status",status:ne(e("renderFailed"),{error:!0,loading:!1,statusOnly:!0})})})},c=[t,r,e,i],n[0]=t,n[1]=r,n[2]=e,n[3]=i,n[4]=o,n[5]=c):(o=n[4],c=n[5]),I.useEffect(o,c)}function Zi(t){return console.warn("cmux diff highlighter preload failed",t)}function Qi(t){const e=t.fileDiff??{};return ft(ce(e,""),e.lang,e,Fe)}function en(t){const e=t.fileDiff;if(e==null)return;const r=dt(ce(e,""),e.lang,Fe);e.lang=r}function tn(t){const e=t.fileDiff;return e==null?[]:ft(ce(e,""),e.lang,e,Fe)}function rn(t,e){const r=new Set(t);for(const i of e)i.trim().length>0&&r.add(i);return Array.from(r)}function nn(t){return t?.pendingReplacement===!0||typeof t?.statusMessage=="string"&&t.statusMessage.length>0}function on(t,e,r){const i=_.c(5),n=I.useRef(!1);let a,o;i[0]!==r||i[1]!==e||i[2]!==t?(a=()=>{if(!n.current){if(n.current=!0,t.pendingReplacement===!0){r({type:"set-status",status:ne(t.statusMessage??e("loadingDiff"),{loading:!0,pending:!0})}),fetch("/__cmux_diff_viewer_wait"+location.pathname,{cache:"no-store"}).then(an).catch(c=>{document.documentElement.dataset.cmuxDiffWait="failed",r({type:"set-status",status:ne(e("renderFailed"),{error:!0,loading:!1,statusOnly:!0})}),console.warn("cmux diff viewer deferred load failed",c)});return}typeof t.statusMessage=="string"&&t.statusMessage.length>0&&r({type:"set-status",status:ne(t.statusMessage,{error:t.statusIsError===!0,loading:!1,statusOnly:!0})})}},o=[r,e,t],i[0]=r,i[1]=e,i[2]=t,i[3]=a,i[4]=o):(a=i[3],o=i[4]),I.useEffect(a,o)}async function an(t){if(!t.ok)throw new Error("replacement failed");(await t.text()).includes('data-cmux-diff-pending="true"')||window.location.reload()}function sn(t){const e=_.c(10);let r;e[0]!==t.filesVisible||e[1]!==t.items||e[2]!==t.metrics||e[3]!==t.options.diffIndicators||e[4]!==t.options.layout||e[5]!==t.options.wordWrap||e[6]!==t.status?(r=()=>{document.body.dataset.filesHidden=t.filesVisible?"false":"true",document.body.dataset.loading=t.status.loading?"true":"false",document.documentElement.dataset.layout=t.options.layout,document.documentElement.dataset.wordWrap=String(t.options.wordWrap),document.documentElement.dataset.diffIndicators=t.options.diffIndicators,t.metrics&&(document.body.dataset.streamFileCount=String(t.metrics.fileCount??t.items.length),document.body.dataset.streamRenderableFileCount=String(t.metrics.renderableFileCount??t.items.length),document.body.dataset.streamFlushCount=String(t.metrics.flushCount??0),document.body.dataset.streamMaxBatchSize=String(t.metrics.maxBatchSize??0),document.body.dataset.streamTreeRefreshCount=String(t.metrics.treeRefreshCount??0),Number.isFinite(t.metrics.completedAt)&&t.metrics.completedAt>0&&(document.body.dataset.streamElapsedMs=String(Math.round(t.metrics.completedAt-t.metrics.startedAt)))),ze(t.status)},e[0]=t.filesVisible,e[1]=t.items,e[2]=t.metrics,e[3]=t.options.diffIndicators,e[4]=t.options.layout,e[5]=t.options.wordWrap,e[6]=t.status,e[7]=r):r=e[7];let i;e[8]!==t?(i=[t],e[8]=t,e[9]=i):i=e[9],I.useEffect(r,i)}function ln(t,e,r){const i=_.c(5);let n,a;i[0]!==e||i[1]!==r||i[2]!==t?(n=()=>{window.__cmuxPerformDiffViewerNavigationAction=c=>{const l=t.current;if(l&&CmuxViewerNavigation.performAction(c,l))return!0;switch(c){case"diffViewerOpenFileSearch":return e({type:"request-file-search"}),!0;case"diffViewerNextFile":return l&&CmuxViewerNavigation.resetSmoothTarget(l),r(1),!0;case"diffViewerPreviousFile":return l&&CmuxViewerNavigation.resetSmoothTarget(l),r(-1),!0}return!1},document.documentElement.dataset.cmuxViewerNavigationReady="true",document.dispatchEvent(new window.Event("cmux-diff-viewer-navigation-readiness-change"));const o=CmuxViewerNavigation.installManualInputReset({target:document,getScroller:()=>t.current});return()=>{delete window.__cmuxPerformDiffViewerNavigationAction,delete document.documentElement.dataset.cmuxViewerNavigationReady,document.dispatchEvent(new window.Event("cmux-diff-viewer-navigation-readiness-change")),o()}},a=[e,r,t],i[0]=e,i[1]=r,i[2]=t,i[3]=n,i[4]=a):(n=i[3],a=i[4]),I.useEffect(n,a)}function cn(t,e){const r=_.c(4);let i,n;r[0]!==e||r[1]!==t?(i=()=>{if(!t)return;const a=c=>{c.target instanceof Element&&c.target.closest("#toolbar")||e({type:"set-options-open",open:!1})},o=c=>{c.key==="Escape"&&e({type:"set-options-open",open:!1})};return document.addEventListener("click",a),document.addEventListener("keydown",o),()=>{document.removeEventListener("click",a),document.removeEventListener("keydown",o)}},n=[e,t],r[0]=e,r[1]=t,r[2]=i,r[3]=n):(i=r[2],n=r[3]),I.useEffect(i,n)}function dn(t,e){return e.some(r=>r.id===t)?t:e[0]?.id??""}function fn(t,e,r){if(e.length===0)return"";const i=e.findIndex(a=>a.id===t);if(i<0)return r>0?e[0].id:e[e.length-1].id;const n=i+r;return n>=0&&n0?0:-1;for(;i<=n;){const o=Math.floor((i+n)/2),c=r(t[o].id);c!=null&&c<=e+1?(a=o,i=o+1):n=o-1}return a>=0?t[a].id:""}function xt(){const t=window.visualViewport?.height??window.innerHeight;return!Number.isFinite(t)||t<=0?25:Math.min(96,Math.max(25,Math.ceil(t/24)))}const pn=`@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\\/2{top:50%}.right-2\\.5{right:calc(var(--spacing) * 2.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\\[calc\\(100\\%\\+6px\\)\\]{bottom:calc(100% + 6px)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-px{margin:1px}.mx-3\\.5{margin-inline:calc(var(--spacing) * 3.5)}.ms-1{margin-inline-start:calc(var(--spacing) * 1)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-3\\.5{margin-top:calc(var(--spacing) * 3.5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-\\[3px\\]{margin-right:3px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-px{margin-bottom:1px}.ml-1\\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.size-\\[22px\\]{width:22px;height:22px}.\\!h-auto{height:auto!important}.h-0{height:calc(var(--spacing) * 0)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-\\[1lh\\]{height:1lh}.h-\\[1px\\]{height:1px}.h-\\[11px\\]{height:11px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\\[25dvh\\]{max-height:25dvh}.max-h-\\[140px\\]{max-height:140px}.max-h-none{max-height:none}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\\[1\\.25rem\\]{min-height:1.25rem}.w-2\\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-7{width:calc(var(--spacing) * 7)}.w-52{width:calc(var(--spacing) * 52)}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-16{max-width:calc(var(--spacing) * 16)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-\\[60\\%\\]{max-width:60%}.max-w-\\[77\\%\\]{max-width:77%}.max-w-\\[320px\\]{max-width:320px}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-56{min-width:calc(var(--spacing) * 56)}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-\\[16px_minmax\\(0\\,1fr\\)_44px\\]{grid-template-columns:16px minmax(0,1fr) 44px}.grid-cols-\\[42px_minmax\\(0\\,1fr\\)\\]{grid-template-columns:42px minmax(0,1fr)}.grid-cols-\\[72px_minmax\\(0\\,1fr\\)_96px\\]{grid-template-columns:72px minmax(0,1fr) 96px}.grid-cols-\\[auto_minmax\\(0\\,1fr\\)_auto\\]{grid-template-columns:auto minmax(0,1fr) auto}.grid-cols-\\[minmax\\(0\\,auto\\)_auto_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,auto) auto minmax(0,1fr)}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\\[5px\\]{gap:5px}:where(.space-y-\\[13px\\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(13px * var(--tw-space-y-reverse));margin-block-end:calc(13px * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[5px\\]{border-radius:5px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_18\\%\\,transparent\\)\\]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.border-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_18\\%\\,transparent\\)\\]{border-color:color-mix(in lab,var(--cmux-diff-fg) 18%,transparent)}}.border-\\[color\\:var\\(--gray-0\\)\\]{border-color:var(--gray-0)}.border-\\[var\\(--cmux-diff-border\\)\\]{border-color:var(--cmux-diff-border)}.border-transparent{border-color:#0000}.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_5\\%\\,transparent\\)\\]{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_5\\%\\,transparent\\)\\]{background-color:color-mix(in lab,var(--cmux-diff-fg) 5%,transparent)}}.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_10\\%\\,transparent\\)\\]{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.bg-\\[color-mix\\(in_lab\\,var\\(--cmux-diff-fg\\)_10\\%\\,transparent\\)\\]{background-color:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}.bg-\\[color\\:var\\(--gray-0\\)\\]{background-color:var(--gray-0)}.bg-\\[var\\(--cmux-diff-muted-bg\\)\\]{background-color:var(--cmux-diff-muted-bg)}.\\[mask-image\\:linear-gradient\\(to_right\\,black_calc\\(100\\%_-_0\\.25rem\\)\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - .25rem),#0000)}.\\[mask-repeat\\:no-repeat\\]{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.object-cover{object-fit:cover}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.\\!px-0{padding-inline:calc(var(--spacing) * 0)!important}.px-0\\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-\\[7px\\]{padding-inline:7px}.px-\\[var\\(--padding-row-x\\)\\]{padding-inline:var(--padding-row-x)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-\\[var\\(--padding-row-y\\)\\]{padding-block:var(--padding-row-y)}.pt-0\\.5{padding-top:calc(var(--spacing) * .5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-0{padding-right:calc(var(--spacing) * 0)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-left{text-align:left}.align-bottom{vertical-align:bottom}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\\!leading-none{--tw-leading:1!important;line-height:1!important}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-\\[18px\\]{--tw-leading:18px;line-height:18px}.leading-\\[calc\\(var\\(--codex-chat-font-size\\)\\+8px\\)\\]{--tw-leading:calc(var(--codex-chat-font-size) + 8px);line-height:calc(var(--codex-chat-font-size) + 8px)}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.text-current{color:currentColor}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\\[0\\.5px\\]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(.5px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media(forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\\[--edge-fade-distance\\:2rem\\]{--edge-fade-distance:2rem}.group-focus-within\\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\\:bg-transparent:hover{background-color:#0000}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-40:disabled{opacity:.4}.data-\\[state\\=checked\\]\\:translate-x-\\[14px\\][data-state=checked]{--tw-translate-x:14px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[state\\=unchecked\\]\\:translate-x-\\[2px\\][data-state=unchecked]{--tw-translate-x:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}@container (min-width:500px){.\\@\\[500px\\]\\:inline{display:inline}}.\\[\\&_\\.ProseMirror\\]\\:\\!h-5 .ProseMirror{height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:h-auto .ProseMirror{height:auto}.\\[\\&_\\.ProseMirror\\]\\:\\!min-h-5 .ProseMirror{min-height:calc(var(--spacing) * 5)!important}.\\[\\&_\\.ProseMirror\\]\\:min-h-\\[2rem\\] .ProseMirror{min-height:2rem}.\\[\\&_\\.ProseMirror\\]\\:min-w-0 .ProseMirror{min-width:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror\\]\\:flex-1 .ProseMirror{flex:1}.\\[\\&_\\.ProseMirror\\]\\:resize-none .ProseMirror{resize:none}.\\[\\&_\\.ProseMirror\\]\\:overflow-hidden .ProseMirror{overflow:hidden}.\\[\\&_\\.ProseMirror\\]\\:leading-5 .ProseMirror{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.\\[\\&_\\.ProseMirror\\]\\:whitespace-nowrap .ProseMirror{white-space:nowrap}.\\[\\&_\\.ProseMirror\\]\\:focus-visible\\:outline-none .ProseMirror:focus-visible{--tw-outline-style:none;outline-style:none}.\\[\\&_\\.ProseMirror_p\\]\\:m-0 .ProseMirror p{margin:calc(var(--spacing) * 0)}.\\[\\&_\\.ProseMirror_p\\]\\:overflow-hidden .ProseMirror p{overflow:hidden}.\\[\\&_\\.ProseMirror_p\\]\\:text-ellipsis .ProseMirror p{text-overflow:ellipsis}.\\[\\&_\\.ProseMirror_p\\]\\:whitespace-nowrap .ProseMirror p{white-space:nowrap}.\\[\\&_\\.contain-inline-size\\]\\:\\[contain\\:initial\\] .contain-inline-size{contain:initial}.\\[\\&\\>\\*\\:last-child\\]\\:mb-0>:last-child{margin-bottom:calc(var(--spacing) * 0)}.\\[\\&\\>ol\\:first-child\\]\\:mt-0>ol:first-child,.\\[\\&\\>ul\\:first-child\\]\\:mt-0>ul:first-child{margin-top:calc(var(--spacing) * 0)}}:root{color-scheme:light dark;--cmux-diff-bg-light:#fff;--cmux-diff-bg-dark:#000;--cmux-diff-fg-light:#000;--cmux-diff-fg-dark:#fff;--cmux-diff-selection-bg-light:#abd8ff;--cmux-diff-selection-bg-dark:#3f638b;--cmux-diff-ui-font-family:system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Arial, sans-serif;--cmux-diff-ui-font-size:12px;--cmux-diff-ui-line-height:16px;--cmux-diff-code-font-family:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;--cmux-diff-font-size:10px;--cmux-diff-line-height:20px;--cmux-diff-bg:var(--cmux-diff-bg-light);--cmux-diff-fg:var(--cmux-diff-fg-light);--cmux-diff-border:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-border:color-mix(in lab, var(--cmux-diff-fg) 12%, transparent)}}:root{--cmux-diff-toolbar-bg:transparent;--cmux-diff-sidebar-bg:transparent;--cmux-diff-muted-bg:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-muted-bg:color-mix(in lab, var(--cmux-diff-fg) 8%, transparent)}}:root{--cmux-diff-hover-bg:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-hover-bg:color-mix(in lab, var(--cmux-diff-fg) 10%, transparent)}}:root{--cmux-diff-accent:light-dark(#0a84ff,#7ab7ff);--cmux-diff-text-muted:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-text-muted:color-mix(in lab, var(--cmux-diff-fg) 72%, var(--cmux-diff-bg))}}:root{--cmux-diff-text-subtle:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){:root{--cmux-diff-text-subtle:color-mix(in lab, var(--cmux-diff-fg) 84%, var(--cmux-diff-bg))}}:root{--cmux-diff-surface-fill-light:transparent;--cmux-diff-surface-fill-dark:transparent;--cmux-diff-surface-fill:var(--cmux-diff-surface-fill-light);background:var(--cmux-diff-surface-fill);color:var(--cmux-diff-fg)}@media(prefers-color-scheme:dark){:root{--cmux-diff-bg:var(--cmux-diff-bg-dark);--cmux-diff-fg:var(--cmux-diff-fg-dark);--cmux-diff-surface-fill:var(--cmux-diff-surface-fill-dark)}}*{box-sizing:border-box}html,body{background:var(--cmux-diff-surface-fill);height:100%;overflow:hidden}body{background:var(--cmux-diff-surface-fill);height:100vh;min-height:0;color:var(--cmux-diff-fg);font-family:var(--cmux-diff-ui-font-family);font-size:var(--cmux-diff-ui-font-size);line-height:var(--cmux-diff-ui-line-height);flex-direction:column;margin:0;display:flex;overflow:hidden}#root{background:0 0;height:100%;min-height:0}#app{overscroll-behavior:contain;contain:strict;height:100vh;min-height:0;color:inherit;background:0 0;grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr);display:grid;overflow:hidden}.copy-fallback-textarea{opacity:0;pointer-events:none;width:1px;height:1px;position:fixed;top:0;left:-9999px}#toolbar{border-bottom:1px solid var(--cmux-diff-border);background:var(--cmux-diff-toolbar-bg);min-height:32px;color:var(--cmux-diff-fg);flex:none;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr) minmax(0,auto);align-items:center;gap:7px;padding:3px 4px 3px 8px;display:grid;position:relative}@supports (color:color-mix(in lab,red,red)){#toolbar{color:color-mix(in lab,var(--cmux-diff-fg) 76%,var(--cmux-diff-bg))}}#toolbar{z-index:50}@media(min-width:521px){body[data-files-hidden=false] #toolbar{grid-template-columns:minmax(0,1fr) minmax(0,auto)}body[data-files-hidden=false] .toolbar-middle{display:none}}.toolbar-left,.toolbar-middle,.toolbar-actions{align-items:center;min-width:0;display:flex;overflow:clip visible}.toolbar-left,.toolbar-middle{gap:6px}.toolbar-left{justify-self:stretch;container:toolbar-left/inline-size}.toolbar-middle{justify-content:center}.toolbar-actions{justify-self:end;gap:4px}#source-select,#repo-select,#base-select,#jump-select{appearance:none;white-space:nowrap;text-overflow:ellipsis;background:linear-gradient(45deg,transparent 50%,currentcolor 50%) right 11px center / 4px 4px no-repeat,linear-gradient(135deg,currentcolor 50%,transparent 50%) right 7px center / 4px 4px no-repeat,var(--cmux-diff-fg);border:1px solid #0000;border-radius:6px;min-width:0;max-width:100%;height:24px;padding:0 24px 0 9px;overflow:hidden}@supports (color:color-mix(in lab,red,red)){#source-select,#repo-select,#base-select,#jump-select{background:linear-gradient(45deg,transparent 50%,currentcolor 50%) right 11px center / 4px 4px no-repeat,linear-gradient(135deg,currentcolor 50%,transparent 50%) right 7px center / 4px 4px no-repeat,color-mix(in lab,var(--cmux-diff-fg) 7%,transparent)}}#source-select,#repo-select,#base-select,#jump-select{color:inherit;font:inherit}#source-select{field-sizing:content;flex:0 3 auto;min-width:58px}#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{border-color:color-mix(in lab,var(--cmux-diff-fg) 24%,transparent)}}#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{background-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:hover,#repo-select:hover,#base-select:hover,#jump-select:hover{background-color:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}#source-select[hidden],#repo-select[hidden],#base-select[hidden],#jump-select[hidden]{display:none}#jump-select{field-sizing:content;min-width:64px}#repo-select{field-sizing:content;flex:0 5 auto;min-width:56px}#base-select{flex:0 120px}#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline:2px solid var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline:2px solid color-mix(in lab,var(--cmux-diff-fg) 36%,transparent)}}#source-select:focus,#repo-select:focus,#base-select:focus,#jump-select:focus,.base-picker-button:focus-visible,.base-picker-input:focus-visible,.toolbar-icon:focus-visible,.menu-item:focus-visible,.file-entry:focus-visible{outline-offset:1px}#base-picker{flex:0 auto;align-items:center;min-width:150px;display:flex;position:relative}.base-picker-button{border:1px solid var(--cmux-diff-fg);align-items:center;gap:5px;min-width:0;max-width:100%;height:24px;padding:0 7px 0 9px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.base-picker-button{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 18%,transparent)}}.base-picker-button{background:var(--cmux-diff-fg);border-radius:6px}@supports (color:color-mix(in lab,red,red)){.base-picker-button{background:color-mix(in lab,var(--cmux-diff-fg) 11%,transparent)}}.base-picker-button{color:var(--cmux-diff-fg);font:inherit;cursor:pointer;font-weight:600}.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{border-color:color-mix(in lab,var(--cmux-diff-fg) 30%,transparent)}}.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-button:hover:not(:disabled),.base-picker-button[aria-expanded=true]{background:color-mix(in lab,var(--cmux-diff-fg) 15%,transparent)}}.base-picker-button:disabled{cursor:default;opacity:.85}.base-picker-button svg{stroke:currentColor;fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.7;flex:none;width:12px;height:12px}.base-picker-label{align-items:center;gap:5px;min-width:0;display:inline-flex}.base-picker-prefix{color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-prefix{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.base-picker-head{text-overflow:ellipsis;white-space:nowrap;min-width:4ch;color:var(--cmux-diff-fg);flex:0 8 auto;font-weight:500;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.base-picker-head{color:color-mix(in lab,var(--cmux-diff-fg) 62%,var(--cmux-diff-bg))}}.base-picker-ref{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:6ch;overflow:hidden}.base-picker-meta{flex:0 1000 auto;align-items:center;gap:5px;min-width:0;display:inline-flex;overflow:hidden}.base-picker-reason{color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-reason{color:color-mix(in lab,var(--cmux-diff-fg) 64%,var(--cmux-diff-bg))}}.base-picker-reason{white-space:nowrap}.base-picker-reason-low{opacity:.6;font-style:italic}.base-picker-aheadbehind{font-variant-numeric:tabular-nums;color:var(--cmux-diff-fg);flex:none;font-weight:500}@supports (color:color-mix(in lab,red,red)){.base-picker-aheadbehind{color:color-mix(in lab,var(--cmux-diff-fg) 58%,var(--cmux-diff-bg))}}.base-picker-aheadbehind{white-space:nowrap}@container toolbar-left (max-width:380px){.base-picker-aheadbehind{display:none}}@container toolbar-left (max-width:312px){.base-picker-reason{display:none}}.base-picker-text{text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.base-picker-spinner{border:1.6px solid var(--cmux-diff-fg);border-radius:50%;flex:none;width:12px;height:12px}@supports (color:color-mix(in lab,red,red)){.base-picker-spinner{border:1.6px solid color-mix(in lab,var(--cmux-diff-fg) 26%,transparent)}}.base-picker-spinner{border-top-color:var(--cmux-diff-fg);animation:.7s linear infinite base-picker-spin}@keyframes base-picker-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.base-picker-spinner{animation-duration:1.6s}}.base-picker-popover{border:1px solid var(--cmux-diff-fg);flex-direction:column;width:320px;max-width:min(86vw,360px);display:flex;position:fixed}@supports (color:color-mix(in lab,red,red)){.base-picker-popover{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 13%,transparent)}}.base-picker-popover{background:var(--cmux-diff-bg);z-index:120;border-radius:8px;overflow:hidden;box-shadow:0 16px 34px lab(0% none none/.28)}.base-picker-search{border-bottom:1px solid var(--cmux-diff-fg);align-items:center;gap:6px;padding:7px 9px;display:flex}@supports (color:color-mix(in lab,red,red)){.base-picker-search{border-bottom:1px solid color-mix(in lab,var(--cmux-diff-fg) 11%,transparent)}}.base-picker-search svg{stroke:currentColor;fill:none;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;opacity:.55;flex:none;width:13px;height:13px}.base-picker-input{min-width:0;color:var(--cmux-diff-fg);font:inherit;background:0 0;border:0;outline:none;flex:auto}.base-picker-list{flex:auto;min-height:0;padding:4px;overflow-y:auto}.base-picker-status{color:var(--cmux-diff-fg);padding:12px 9px}@supports (color:color-mix(in lab,red,red)){.base-picker-status{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.base-picker-status{text-align:center}.base-picker-status-error{color:#ff5f56}@supports (color:color-mix(in lab,red,red)){.base-picker-status-error{color:color-mix(in lab,#ff5f56 70%,var(--cmux-diff-fg))}}.base-picker-group-header{letter-spacing:.06em;text-transform:uppercase;color:var(--cmux-diff-fg);padding:8px 8px 3px;font-size:10px;font-weight:600}@supports (color:color-mix(in lab,red,red)){.base-picker-group-header{color:color-mix(in lab,var(--cmux-diff-fg) 52%,var(--cmux-diff-bg))}}.base-picker-more{color:var(--cmux-diff-fg);padding:5px 8px 7px;font-size:11px}@supports (color:color-mix(in lab,red,red)){.base-picker-more{color:color-mix(in lab,var(--cmux-diff-fg) 48%,var(--cmux-diff-bg))}}.base-picker-more{cursor:default;-webkit-user-select:none;user-select:none}.base-picker-row{cursor:pointer;border-radius:6px;align-items:center;gap:8px;min-height:28px;padding:0 8px;display:flex}.base-picker-row-selected{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.base-picker-row-selected{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.base-picker-row-primary{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--cmux-diff-fg);flex:auto;overflow:hidden}.base-picker-row-primary strong{font-weight:700}.base-picker-row-secondary{text-overflow:ellipsis;white-space:nowrap;text-align:right;min-width:0;max-width:55%;color:var(--cmux-diff-fg);flex:0 auto;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.base-picker-row-secondary{color:color-mix(in lab,var(--cmux-diff-fg) 55%,var(--cmux-diff-bg))}}.base-picker-pill{text-transform:uppercase;letter-spacing:.04em;color:var(--cmux-diff-accent);background:var(--cmux-diff-accent);border-radius:999px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}@supports (color:color-mix(in lab,red,red)){.base-picker-pill{background:color-mix(in lab,var(--cmux-diff-accent) 16%,transparent)}}@media(max-width:760px){#toolbar{grid-template-columns:minmax(0,1fr) minmax(0,auto);grid-template-areas:"source actions""jump actions"}.toolbar-left{grid-area:source}.toolbar-middle{grid-area:jump;justify-content:stretch}.toolbar-actions{grid-area:actions}}.toolbar-icon{width:20px;height:20px;color:var(--cmux-diff-fg);background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.toolbar-icon{color:color-mix(in lab,var(--cmux-diff-fg) 60%,var(--cmux-diff-bg))}}.toolbar-icon{cursor:pointer;padding:0}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{border-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{border-color:color-mix(in lab,var(--cmux-diff-fg) 14%,transparent)}}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon:hover,.toolbar-icon[aria-expanded=true]{background:color-mix(in lab,var(--cmux-diff-fg) 9%,transparent)}}.toolbar-icon:hover,.toolbar-icon[aria-expanded=true],.toolbar-icon[aria-pressed=true]{color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.toolbar-icon[aria-pressed=true]{color:color-mix(in lab,var(--cmux-diff-fg) 78%,var(--cmux-diff-bg))}}.toolbar-icon[hidden]{display:none}.toolbar-icon svg,.menu-item svg{fill:none;stroke:currentColor;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px;display:block}#layout-toggle svg [data-diff-deletion],#layout-toggle svg [data-diff-addition]{stroke:none}#layout-toggle svg [data-diff-deletion]{fill:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}#layout-toggle svg [data-diff-addition]{fill:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark))}.toolbar-icon svg [data-precision-dot],.menu-item svg [data-precision-dot]{stroke-width:2px}#options-menu{border:1px solid var(--cmux-diff-fg);min-width:246px;padding:8px;position:absolute;top:calc(100% + 7px);right:10px}@supports (color:color-mix(in lab,red,red)){#options-menu{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 13%,transparent)}}#options-menu{background:var(--cmux-diff-bg);z-index:100;border-radius:8px;box-shadow:0 16px 34px lab(0% none none/.28)}#options-menu[hidden]{display:none}.menu-separator{background:var(--cmux-diff-fg);height:1px;margin:7px 6px}@supports (color:color-mix(in lab,red,red)){.menu-separator{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.menu-item{width:100%;min-height:31px;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:6px;grid-template-columns:22px minmax(0,1fr) 18px;align-items:center;gap:10px;display:grid}@supports (color:color-mix(in lab,red,red)){.menu-item{color:color-mix(in lab,var(--cmux-diff-fg) 86%,var(--cmux-diff-bg))}}.menu-item{font:inherit;text-align:left;padding:0 7px}.menu-item:hover:not(:disabled){background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.menu-item:hover:not(:disabled){background:color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}.menu-item:hover:not(:disabled){color:var(--cmux-diff-fg)}.menu-segment{cursor:default}.menu-segment:hover{background:0 0}.menu-segment-controls{background:0 0;border-radius:7px;justify-self:end;align-items:center;gap:2px;padding:2px;display:inline-flex}.segment-button{width:27px;height:24px;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.segment-button{color:color-mix(in lab,var(--cmux-diff-fg) 62%,var(--cmux-diff-bg))}}.segment-button{padding:0}.segment-button:hover,.segment-button[aria-pressed=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.segment-button:hover,.segment-button[aria-pressed=true]{background:color-mix(in lab,var(--cmux-diff-fg) 12%,transparent)}}.segment-button:hover,.segment-button[aria-pressed=true],.menu-item:disabled{color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.menu-item:disabled{color:color-mix(in lab,var(--cmux-diff-fg) 36%,var(--cmux-diff-bg))}}.menu-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu-check{justify-self:end}#content{--cmux-diff-files-width:252px;grid-template-columns:minmax(0,1fr) var(--cmux-diff-files-width);overscroll-behavior:contain;contain:strict;background:0 0;flex:auto;grid-template-rows:minmax(0,1fr);grid-template-areas:"viewer files";min-width:0;min-height:0;display:grid;position:relative;overflow:hidden}body[data-files-hidden=true] #content{grid-template-columns:minmax(0,1fr) 0}body[data-status-only=true] #content{grid-template-columns:minmax(0,1fr);grid-template-areas:"viewer"}#files-sidebar{border-left:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);contain:strict;opacity:1;flex-direction:column;grid-area:files;width:100%;min-width:0;height:100%;min-height:0;transition:opacity .1s,visibility linear;display:flex;position:relative;overflow:hidden}#files-resize-handle{z-index:3;appearance:none;cursor:col-resize;background:0 0;border:0;outline:none;width:8px;margin:0;padding:0;position:absolute;top:0;bottom:0;left:0}#files-resize-handle:after{content:"";background:0 0;width:1px;position:absolute;top:0;bottom:0;left:0}body[data-files-hidden=true] #files-sidebar{opacity:0;pointer-events:none;visibility:hidden;transition:opacity .1s,visibility 0s linear .1s}body[data-status-only=true] #files-sidebar{display:none}#files-header{z-index:1;border-bottom:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);min-height:30px;color:var(--cmux-diff-text-muted);justify-content:space-between;align-items:center;gap:8px;padding:0 7px 0 10px;display:flex;position:relative}#files-title{align-items:center;gap:6px;min-width:0;display:inline-flex}#files-header-actions{flex:none;align-items:center;gap:2px;display:inline-flex}#file-search-toggle{width:24px;height:24px;color:var(--cmux-diff-text-muted);background:0 0;border:0;border-radius:5px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}#file-search-toggle:hover,#file-search-toggle[aria-pressed=true]{background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}#file-search-toggle svg{fill:none;stroke:currentColor;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;width:15px;height:15px}#file-list{background:var(--cmux-diff-sidebar-bg);--trees-bg-override:var(--cmux-diff-sidebar-bg);--trees-fg-override:var(--cmux-diff-text-subtle);--trees-fg-muted-override:var(--cmux-diff-text-muted);--trees-bg-muted-override:var(--cmux-diff-hover-bg);--trees-selected-bg-override:var(--cmux-diff-fg);flex:auto;min-height:0;padding:6px 4px 6px 6px;overflow:hidden}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-selected-bg-override:color-mix(in lab, var(--cmux-diff-fg) 11%, transparent)}}#file-list{--trees-selected-fg-override:var(--cmux-diff-fg);--trees-selected-focused-border-color-override:transparent;--trees-border-color-override:var(--cmux-diff-border);--trees-focus-ring-color-override:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-focus-ring-color-override:color-mix(in lab, var(--cmux-diff-accent) 72%, transparent)}}#file-list{--trees-font-family-override:var(--cmux-diff-ui-font-family);--trees-font-size-override:var(--cmux-diff-ui-font-size);--trees-font-weight-semibold-override:500;--trees-density-override:.78;--trees-border-radius-override:5px;--trees-item-padding-x-override:7px;--trees-item-margin-x-override:0;--trees-padding-inline-override:8px;--trees-search-bg-override:var(--cmux-diff-bg)}@supports (color:color-mix(in lab,red,red)){#file-list{--trees-search-bg-override:color-mix(in lab, var(--cmux-diff-bg) 92%, var(--cmux-diff-fg))}}#file-list{--trees-status-added-override:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark));--trees-status-modified-override:var(--cmux-diff-accent);--trees-status-renamed-override:light-dark(#a26300,#ffd166);--trees-status-deleted-override:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}body[data-loading=false] .diff-loading-placeholder,body[data-loading=false]:not([data-status-only=true]) #loading-layer{display:none}#file-list file-tree-container{width:100%;height:100%;min-height:0;display:block}.file-entry{width:100%;min-height:30px;color:inherit;font:inherit;text-align:left;background:0 0;border:0;border-radius:6px;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:8px;padding:3px 7px;display:grid}.file-entry:hover,.file-entry[aria-current=true]{background:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){.file-entry:hover,.file-entry[aria-current=true]{background:color-mix(in lab,var(--cmux-diff-fg) 9%,transparent)}}.file-status{width:17px;height:17px;color:var(--cmux-diff-text-muted);border:1px solid;border-radius:5px;justify-content:center;align-items:center;font-size:9px;line-height:1;display:inline-flex}.file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.file-stats{color:var(--cmux-diff-text-muted);gap:5px;display:inline-flex}.stat-add{color:light-dark(var(--cmux-diff-addition-fg-light),var(--cmux-diff-addition-fg-dark))}.stat-del{color:light-dark(var(--cmux-diff-deletion-fg-light),var(--cmux-diff-deletion-fg-dark))}#viewer{--diffs-font-family:var(--cmux-diff-code-font-family);--diffs-header-font-family:var(--cmux-diff-ui-font-family);--diffs-font-size:var(--cmux-diff-font-size);--diffs-line-height:var(--cmux-diff-line-height);--diffs-bg-selection-override:light-dark(var(--cmux-diff-selection-bg-light),var(--cmux-diff-selection-bg-dark));overscroll-behavior:contain;overflow-anchor:none;contain:strict;border-bottom:1px solid var(--cmux-diff-border);background:0 0;grid-area:viewer;width:100%;min-width:0;height:100%;min-height:0;position:relative;overflow:clip auto}.code-view-root{overscroll-behavior:contain;overflow-anchor:none;contain:strict;width:100%;min-width:0;height:100%;min-height:0;position:relative;overflow:clip auto}@media(max-width:520px){#content,body[data-files-hidden=true] #content{grid-template-columns:minmax(0,1fr);grid-template-areas:"viewer"}#files-sidebar{display:none}}@media(prefers-reduced-motion:reduce){#files-sidebar{transition:none}}#viewer diffs-container{--diffs-font-family:var(--cmux-diff-code-font-family);--diffs-header-font-family:var(--cmux-diff-ui-font-family);--diffs-font-size:var(--cmux-diff-font-size);--diffs-line-height:var(--cmux-diff-line-height);--diffs-bg-selection-override:light-dark(var(--cmux-diff-selection-bg-light),var(--cmux-diff-selection-bg-dark));contain:layout paint style;flex:auto;width:100%;min-height:30px;display:block;overflow:clip}#viewer diffs-container [data-diffs-header]{overflow-x:clip}#viewer diffs-container [data-diffs-header=default] [data-metadata]{flex-shrink:0}#loading-layer{z-index:4;pointer-events:none;contain:strict;background:0 0;grid-area:viewer;position:absolute;inset:0;overflow:hidden}body[data-status-only=true] #loading-layer{pointer-events:auto;justify-content:center;align-items:center;width:100%;height:100%;padding:32px;display:flex;position:static}#status{z-index:5;border:1px solid var(--cmux-diff-fg);align-items:center;gap:10px;max-width:calc(100% - 24px);min-height:32px;padding:8px 12px;display:flex;position:absolute;top:10px;left:12px}@supports (color:color-mix(in lab,red,red)){#status{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 10%,transparent)}}#status{background:var(--cmux-diff-bg);font-family:var(--cmux-diff-ui-font-family);font-size:13px;line-height:var(--cmux-diff-ui-line-height);color:var(--cmux-diff-fg);border-radius:7px}@supports (color:color-mix(in lab,red,red)){#status{color:color-mix(in lab,var(--cmux-diff-fg) 70%,var(--cmux-diff-bg))}}body[data-status-only=true] #status{text-align:center;text-wrap:balance;width:auto;max-width:340px;min-height:0;color:var(--cmux-diff-fg);background:0 0;border:0;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:14px;padding:0;font-size:14px;line-height:1.55;position:static}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status{color:color-mix(in lab,var(--cmux-diff-fg) 58%,var(--cmux-diff-bg))}}body[data-status-only=true] #status-text{letter-spacing:.005em;font-weight:500}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}#status-icon{display:none}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{background:var(--cmux-diff-fg);border-radius:16px;justify-content:center;align-items:center;width:56px;height:56px;display:flex}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{background:color-mix(in lab,var(--cmux-diff-fg) 5%,transparent)}}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{border:1px solid var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon{border:1px solid color-mix(in lab,var(--cmux-diff-fg) 8%,transparent)}}body[data-status-only=true] #status:not([data-error=true]):not([data-pending=true]) #status-icon:before{content:"";opacity:.8;background-color:currentColor;width:26px;height:26px;display:block;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 2v6h6'/%3E%3Cpath d='M9 13h6'/%3E%3Cpath d='M9 17h4'/%3E%3C/svg%3E") 50%/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 2v6h6'/%3E%3Cpath d='M9 13h6'/%3E%3Cpath d='M9 17h4'/%3E%3C/svg%3E") 50%/contain no-repeat}#status[data-pending=true]:before,body[data-loading=true] #status:before{content:"";border:2px solid var(--cmux-diff-fg);flex:none;width:14px;height:14px}@supports (color:color-mix(in lab,red,red)){#status[data-pending=true]:before,body[data-loading=true] #status:before{border:2px solid color-mix(in lab,var(--cmux-diff-fg) 20%,transparent)}}#status[data-pending=true]:before,body[data-loading=true] #status:before{border-top-color:var(--cmux-diff-fg)}@supports (color:color-mix(in lab,red,red)){#status[data-pending=true]:before,body[data-loading=true] #status:before{border-top-color:color-mix(in lab,var(--cmux-diff-fg) 70%,var(--cmux-diff-bg))}}#status[data-pending=true]:before,body[data-loading=true] #status:before{border-radius:50%;animation:.8s linear infinite cmuxDiffPendingSpin}#status[data-error=true]{color:light-dark(#b42318,#ff8a80)}@keyframes cmuxDiffPendingSpin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){#status[data-pending=true]:before,body[data-loading=true] #status:before{animation:none}}#comments-section{border-top:1px solid var(--cmux-diff-border);background:var(--cmux-diff-sidebar-bg);flex-direction:column;flex:none;min-height:0;max-height:40%;display:flex}#comments-header{min-height:30px;color:var(--cmux-diff-text-muted);font-size:var(--cmux-diff-ui-font-size);align-items:center;padding:0 10px;display:flex}#comments-list{flex-direction:column;gap:4px;min-height:0;padding:0 6px 6px;display:flex;overflow-y:auto}.comments-empty{color:var(--cmux-diff-text-muted);font-size:var(--cmux-diff-ui-font-size);padding:2px 7px 6px}.comment-entry{color:var(--cmux-diff-text-subtle);font:inherit;font-size:var(--cmux-diff-ui-font-size);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:5px;flex-direction:column;gap:2px;padding:5px 7px;display:flex}.comment-entry:hover{background:var(--cmux-diff-hover-bg)}.comment-entry-header{justify-content:space-between;align-items:center;gap:6px;display:flex}.comment-entry-location{color:var(--cmux-diff-fg);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.comment-entry-badge{background:var(--cmux-diff-muted-bg);color:var(--cmux-diff-text-muted);font-size:calc(var(--cmux-diff-ui-font-size) - 1px);border-radius:4px;flex:none;padding:0 5px}.comment-entry-message{text-overflow:ellipsis;white-space:nowrap;color:var(--cmux-diff-text-muted);overflow:hidden}.comment-composer,.comment-card{border:1px solid var(--cmux-diff-border);background:light-dark(var(--cmux-diff-bg),var(--cmux-diff-bg));border-radius:10px;flex-direction:column;gap:8px;max-width:680px;margin:8px 12px;padding:10px 12px;display:flex}@supports (color:color-mix(in lab,red,red)){.comment-composer,.comment-card{background:light-dark(color-mix(in lab,var(--cmux-diff-bg) 92%,#fff),color-mix(in lab,var(--cmux-diff-bg) 90%,#fff))}}.comment-composer,.comment-card{color:var(--cmux-diff-fg);font-family:var(--cmux-diff-ui-font-family);font-size:13px;line-height:1.45;box-shadow:0 1px 2px lab(0% none none/.1),0 2px 8px lab(0% none none/.06)}.comment-composer:focus-within{border-color:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-composer:focus-within{border-color:color-mix(in lab,var(--cmux-diff-accent) 60%,var(--cmux-diff-border))}}.comment-composer:focus-within{box-shadow:0 0 0 3px var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-composer:focus-within{box-shadow:0 0 0 3px color-mix(in lab,var(--cmux-diff-accent) 18%,transparent)}}.comment-composer-input{box-sizing:border-box;resize:none;width:100%;min-height:52px;color:var(--cmux-diff-fg);font:inherit;background:0 0;border:0;padding:0}.comment-composer-input::placeholder{color:var(--cmux-diff-text-muted)}.comment-composer-input:focus-visible{outline:none}.comment-composer-footer{justify-content:space-between;align-items:center;gap:8px;display:flex}.comment-composer-buttons{gap:6px;display:inline-flex}.comment-button{color:var(--cmux-diff-text-muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 12px;font-weight:500}.comment-button:hover:not(:disabled){background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}.comment-button:disabled{opacity:.5;cursor:default}.comment-button-primary{background:var(--cmux-diff-accent);color:light-dark(#fff,#08233f)}.comment-button-primary:hover:not(:disabled){background:var(--cmux-diff-accent)}@supports (color:color-mix(in lab,red,red)){.comment-button-primary:hover:not(:disabled){background:color-mix(in lab,var(--cmux-diff-accent) 86%,var(--cmux-diff-fg))}}.comment-button-primary:hover:not(:disabled){color:light-dark(#fff,#08233f)}.comment-card-header{justify-content:space-between;align-items:center;gap:8px;min-height:20px;display:flex}.comment-card-location{font-weight:500;font-size:calc(var(--cmux-diff-ui-font-size) - 1px);color:var(--cmux-diff-text-muted)}.comment-card-actions{opacity:0;gap:2px;transition:opacity .1s;display:inline-flex}.comment-card:hover .comment-card-actions,.comment-card:focus-within .comment-card-actions{opacity:1}.comment-card-action{color:var(--cmux-diff-text-muted);font:inherit;font-size:calc(var(--cmux-diff-ui-font-size) - 1px);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:1px 6px}.comment-card-action:hover{background:var(--cmux-diff-hover-bg);color:var(--cmux-diff-fg)}.comment-card-message{white-space:pre-wrap;overflow-wrap:anywhere}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}`;function mn(){const t=document.getElementById("cmux-diff-viewer-config");if(!t?.textContent)throw new Error("Missing cmux diff viewer config");return JSON.parse(t.textContent)}function wn(t){const e=mn();Ft("diff",pn),zt(_e(e.payload?.appearance)),typeof e.payload?.title=="string"&&e.payload.title.trim()!==""&&(document.title=e.payload.title);const r=pt(e.payload?.labels,{assertMissing:ut()}),i=Zr(e,r);document.body.dataset.filesHidden="false",ze(i);const n=_t(()=>s.jsx(di,{config:e,initialStatus:i}));wt.createRoot(t).render(s.jsx(vt,{router:n}))}export{wn as mountDiffSurface}; diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs new file mode 100644 index 000000000000..aefa42b85d2e --- /dev/null +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -0,0 +1 @@ +import{b as A,i as F,j as n,c as L,a as B}from"./vendor.mjs";import{c as T}from"./router.mjs";let I=null;const E=new Set;let C=null;function R(t){I=t;for(const e of E)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&R(t.snapshot)}});async function $(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function U(){return C||(C=$("feed.subscribe").then(R).catch(t=>{throw C=null,t}),C)}const M={getSnapshot:()=>I,subscribe(t){return E.add(t),U(),()=>E.delete(t)}};function W(){const t=A.c(42),e=F.useSyncExternalStore(M.subscribe,M.getSnapshot,M.getSnapshot),[s,i]=F.useState("actionable"),[l,r]=F.useState(null);if(!e){let p;return t[0]===Symbol.for("react.memo_cache_sentinel")?(p=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=p):p=t[0],p}let c;t[1]!==s||t[2]!==e.items?(c=s==="actionable"?e.items.filter(K):e.items,t[1]=s,t[2]=e.items,t[3]=c):c=t[3];const o=c;let d;t[4]!==e.copy.requestFailed?(d=async(p,j)=>{r(null);try{await $(p,j)}catch{r(e.copy.requestFailed)}},t[4]=e.copy.requestFailed,t[5]=d):d=t[5];const a=d;let m;t[6]!==e.copy.feed?(m=n.jsx("h1",{children:e.copy.feed}),t[6]=e.copy.feed,t[7]=m):m=t[7];const u=s==="actionable";let f;t[8]===Symbol.for("react.memo_cache_sentinel")?(f=()=>i("actionable"),t[8]=f):f=t[8];let h;t[9]!==e.copy.actionable||t[10]!==u?(h=n.jsx("button",{"aria-selected":u,onClick:f,role:"tab",children:e.copy.actionable}),t[9]=e.copy.actionable,t[10]=u,t[11]=h):h=t[11];const w=s==="activity";let g;t[12]===Symbol.for("react.memo_cache_sentinel")?(g=()=>i("activity"),t[12]=g):g=t[12];let y;t[13]!==e.copy.activity||t[14]!==w?(y=n.jsx("button",{"aria-selected":w,onClick:g,role:"tab",children:e.copy.activity}),t[13]=e.copy.activity,t[14]=w,t[15]=y):y=t[15];let b;t[16]!==h||t[17]!==y?(b=n.jsxs("div",{className:"feed-filter",role:"tablist",children:[h,y]}),t[16]=h,t[17]=y,t[18]=b):b=t[18];let v;t[19]!==m||t[20]!==b?(v=n.jsxs("header",{className:"feed-header",children:[m,b]}),t[19]=m,t[20]=b,t[21]=v):v=t[21];let k;t[22]!==l?(k=l&&n.jsx("div",{className:"feed-error",role:"alert",children:l}),t[22]=l,t[23]=k):k=t[23];let N;t[24]!==s||t[25]!==o||t[26]!==a||t[27]!==e.copy?(N=o.length===0?n.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):o.map(p=>n.jsx(Q,{item:p,copy:e.copy,perform:a},p.id)),t[24]=s,t[25]=o,t[26]=a,t[27]=e.copy,t[28]=N):N=t[28];let S;t[29]!==a||t[30]!==e.copy.loadOlder||t[31]!==e.copy.loadingOlder||t[32]!==e.hasMore||t[33]!==e.isLoadingOlder?(S=e.hasMore&&n.jsx("button",{className:"feed-load-more",disabled:e.isLoadingOlder,onClick:()=>a("feed.loadOlder",{}),children:e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[29]=a,t[30]=e.copy.loadOlder,t[31]=e.copy.loadingOlder,t[32]=e.hasMore,t[33]=e.isLoadingOlder,t[34]=S):S=t[34];let _;t[35]!==N||t[36]!==S?(_=n.jsxs("section",{className:"feed-list",children:[N,S]}),t[35]=N,t[36]=S,t[37]=_):_=t[37];let x;return t[38]!==v||t[39]!==k||t[40]!==_?(x=n.jsxs("main",{className:"feed-shell",children:[v,k,_]}),t[38]=v,t[39]=k,t[40]=_,t[41]=x):x=t[41],x}function K(t){return t.status==="pending"}function Q(t){const e=A.c(32),{item:s,copy:i,perform:l}=t;let r;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(r=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=r):r=e[3];const c=r,o=`feed-card feed-card-${s.status}`;let d;e[4]!==s.source?(d=n.jsx("span",{className:"feed-source",children:s.source}),e[4]=s.source,e[5]=d):d=e[5];let a;e[6]!==c?(a=n.jsx("h2",{children:c}),e[6]=c,e[7]=a):a=e[7];let m;e[8]!==d||e[9]!==a?(m=n.jsxs("div",{children:[d,a]}),e[8]=d,e[9]=a,e[10]=m):m=e[10];let u;e[11]!==s.created_at?(u=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[11]=s.created_at,e[12]=u):u=e[12];let f;e[13]!==u?(f=n.jsx("time",{children:u}),e[13]=u,e[14]=f):f=e[14];let h;e[15]!==m||e[16]!==f?(h=n.jsxs("div",{className:"feed-card-heading",children:[m,f]}),e[15]=m,e[16]=f,e[17]=h):h=e[17];let w;e[18]!==s.cwd?(w=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[18]=s.cwd,e[19]=w):w=e[19];let g;e[20]!==s?(g=n.jsx(z,{item:s}),e[20]=s,e[21]=g):g=e[21];let y;e[22]!==i||e[23]!==s||e[24]!==l?(y=s.status==="pending"&&n.jsx(D,{item:s,copy:i,perform:l}),e[22]=i,e[23]=s,e[24]=l,e[25]=y):y=e[25];let b;return e[26]!==g||e[27]!==y||e[28]!==o||e[29]!==h||e[30]!==w?(b=n.jsxs("article",{className:o,children:[h,w,g,y]}),e[26]=g,e[27]=y,e[28]=o,e[29]=h,e[30]=w,e[31]=b):b=e[31],b}function z(t){const e=A.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function D(t){const e=A.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let r;e[0]!==s.allowed_permission_modes?(r=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=r):r=e[1];let c;e[2]!==r?(c=new Set(r),e[2]=r,e[3]=c):c=e[3];const o=c;let d;e[4]!==i||e[5]!==s.id||e[6]!==o||e[7]!==l?(d=o.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=o,e[7]=l,e[8]=d):d=e[8];let a;e[9]!==i||e[10]!==s.id||e[11]!==o||e[12]!==l?(a=o.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=o,e[12]=l,e[13]=a):a=e[13];let m;e[14]!==i||e[15]!==s.id||e[16]!==o||e[17]!==l?(m=o.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=o,e[17]=l,e[18]=m):m=e[18];let u;e[19]!==i||e[20]!==s.id||e[21]!==o||e[22]!==l?(u=o.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=o,e[22]=l,e[23]=u):u=e[23];let f;e[24]!==i||e[25]!==s.id||e[26]!==o||e[27]!==l?(f=o.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=o,e[27]=l,e[28]=f):f=e[28];let h;return e[29]!==d||e[30]!==a||e[31]!==m||e[32]!==u||e[33]!==f?(h=n.jsxs("div",{className:"feed-actions",children:[d,a,m,u,f]}),e[29]=d,e[30]=a,e[31]=m,e[32]=u,e[33]=f,e[34]=h):h=e[34],h}if(s.kind==="exitPlan"){let r;e[35]!==s.id||e[36]!==l?(r=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=r):r=e[37];let c;e[38]!==i.planManual||e[39]!==r?(c=n.jsx("button",{onClick:r,children:i.planManual}),e[38]=i.planManual,e[39]=r,e[40]=c):c=e[40];let o;e[41]!==s.id||e[42]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=o):o=e[43];let d;e[44]!==i.planAuto||e[45]!==o?(d=n.jsx("button",{onClick:o,children:i.planAuto}),e[44]=i.planAuto,e[45]=o,e[46]=d):d=e[46];let a;e[47]!==s.id||e[48]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=a):a=e[49];let m;e[50]!==i.planUltraplan||e[51]!==a?(m=n.jsx("button",{className:"primary",onClick:a,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=a,e[52]=m):m=e[52];let u;return e[53]!==c||e[54]!==d||e[55]!==m?(u=n.jsxs("div",{className:"feed-actions",children:[c,d,m]}),e[53]=c,e[54]=d,e[55]=m,e[56]=u):u=e[56],u}if(s.kind==="question"){let r;e[57]!==s.questions?(r=s.questions??[],e[57]=s.questions,e[58]=r):r=e[58];let c;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==r?(c=n.jsx(H,{item:s,questions:r,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=r,e[63]=c):c=e[63],c}return null}function H(t){const e=A.c(34),{item:s,questions:i,copy:l,perform:r}=t;let c;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(c=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=c):c=e[3];const o=c;let d;e[4]===Symbol.for("react.memo_cache_sentinel")?(d={},e[4]=d):d=e[4];const[a,m]=F.useState(d);let u;e[5]===Symbol.for("react.memo_cache_sentinel")?(u={},e[5]=u):u=e[5];const[f,h]=F.useState(u);let w;e[6]===Symbol.for("react.memo_cache_sentinel")?(w=(x,p)=>{m(j=>{const q=j[x.id]??[],O=x.multi_select?q.includes(p)?q.filter(P=>P!==p):[...q,p]:[p];return{...j,[x.id]:O}})},e[6]=w):w=e[6];const g=w;let y;if(e[7]!==f||e[8]!==o||e[9]!==a){let x;e[11]!==f||e[12]!==a?(x=p=>{const j=f[p.id]?.trim();if(j)return[j];const q=a[p.id]??[],O=p.options.filter(P=>q.includes(P.id)).map(G);return O.length>0?[O.join(", ")]:[]},e[11]=f,e[12]=a,e[13]=x):x=e[13],y=o.flatMap(x),e[7]=f,e[8]=o,e[9]=a,e[10]=y}else y=e[10];const b=y;let v;if(e[14]!==l.questionPlaceholder||e[15]!==f||e[16]!==o||e[17]!==a){let x;e[19]!==l.questionPlaceholder||e[20]!==f||e[21]!==a?(x=p=>n.jsxs("div",{className:"feed-question",children:[p.prompt&&n.jsx("div",{className:"feed-question-prompt",children:p.prompt}),n.jsx("div",{className:"feed-options",children:p.options.map(j=>n.jsxs("button",{"aria-pressed":(a[p.id]??[]).includes(j.id),onClick:()=>g(p,j.id),children:[n.jsx("strong",{children:j.label}),j.description&&n.jsx("span",{children:j.description})]},j.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:j=>h(q=>({...q,[p.id]:j.target.value})),placeholder:l.questionPlaceholder,value:f[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=f,e[21]=a,e[22]=x):x=e[22],v=o.map(x),e[14]=l.questionPlaceholder,e[15]=f,e[16]=o,e[17]=a,e[18]=v}else v=e[18];const k=b.length===0;let N;e[23]!==b||e[24]!==s.id||e[25]!==r?(N=()=>r("feed.question.reply",{itemId:s.id,selections:b}),e[23]=b,e[24]=s.id,e[25]=r,e[26]=N):N=e[26];let S;e[27]!==l.questionSubmit||e[28]!==k||e[29]!==N?(S=n.jsx("button",{className:"primary",disabled:k,onClick:N,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=k,e[29]=N,e[30]=S):S=e[30];let _;return e[31]!==v||e[32]!==S?(_=n.jsxs("div",{className:"feed-question-actions",children:[v,S]}),e[31]=v,e[32]=S,e[33]=_):_=e[33],_}function G(t){return t.label}function X(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=T(()=>n.jsx(W,{}));L.createRoot(t).render(n.jsx(B,{router:e}))}export{X as mountFeedSurface}; diff --git a/Resources/markdown-viewer/webviews-app/chunks/installWebviewStyles.mjs b/Resources/markdown-viewer/webviews-app/chunks/installWebviewStyles.mjs index 10955ad22a49..099323367f22 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/installWebviewStyles.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/installWebviewStyles.mjs @@ -1 +1 @@ -import{e as u,f as a,g as i,d,O as f}from"./vendor.mjs";function l(){const t=globalThis.crypto;if(typeof t?.randomUUID=="function")return t.randomUUID();const o=t?.getRandomValues?.bind(t);if(typeof o=="function"){const e=new Uint8Array(16);return o(e),e[6]=e[6]&15|64,e[8]=e[8]&63|128,[...e].map((r,s)=>{const n=r.toString(16).padStart(2,"0");return[4,6,8,10].includes(s)?`-${n}`:n}).join("")}return`cmux-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function p(t){const o=u({component:f,notFoundComponent:t}),e=a({getParentRoute:()=>o,path:"/",component:t}),r=a({getParentRoute:()=>o,path:"/diff",component:t}),s=a({getParentRoute:()=>o,path:"/cmux-diff-viewer",component:t}),n=a({getParentRoute:()=>o,path:"/agent-session",component:t}),c=o.addChildren([e,r,s,n]);return i({history:d(),routeTree:c})}function R(t,o){const e=document.createElement("style");e.dataset.cmuxWebviewStyle=t,e.textContent=o,document.head.append(e)}export{p as c,R as i,l as m}; +function i(){const n=globalThis.crypto;if(typeof n?.randomUUID=="function")return n.randomUUID();const e=n?.getRandomValues?.bind(n);if(typeof e=="function"){const t=new Uint8Array(16);return e(t),t[6]=t[6]&15|64,t[8]=t[8]&63|128,[...t].map((a,r)=>{const o=a.toString(16).padStart(2,"0");return[4,6,8,10].includes(r)?`-${o}`:o}).join("")}return`cmux-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function c(n,e){const t=document.createElement("style");t.dataset.cmuxWebviewStyle=n,t.textContent=e,document.head.append(t)}export{c as i,i as m}; diff --git a/Resources/markdown-viewer/webviews-app/chunks/router.mjs b/Resources/markdown-viewer/webviews-app/chunks/router.mjs new file mode 100644 index 000000000000..533d022cf890 --- /dev/null +++ b/Resources/markdown-viewer/webviews-app/chunks/router.mjs @@ -0,0 +1 @@ +import{e as R,f as o,g as f,d,O as g}from"./vendor.mjs";function p(t){const e=R({component:g,notFoundComponent:t}),n=o({getParentRoute:()=>e,path:"/",component:t}),a=o({getParentRoute:()=>e,path:"/diff",component:t}),r=o({getParentRoute:()=>e,path:"/cmux-diff-viewer",component:t}),s=o({getParentRoute:()=>e,path:"/agent-session",component:t}),c=o({getParentRoute:()=>e,path:"/feed",component:t}),u=e.addChildren([n,a,r,s,c]);return f({history:d(),routeTree:u})}export{p as c}; diff --git a/Resources/markdown-viewer/webviews-app/feed.html b/Resources/markdown-viewer/webviews-app/feed.html new file mode 100644 index 000000000000..3bcb00d4b852 --- /dev/null +++ b/Resources/markdown-viewer/webviews-app/feed.html @@ -0,0 +1,13 @@ + + + + + + cmux + + +
+ + + + diff --git a/Resources/markdown-viewer/webviews-app/main.mjs b/Resources/markdown-viewer/webviews-app/main.mjs index fd26b46d3a98..12ee3ce02db6 100644 --- a/Resources/markdown-viewer/webviews-app/main.mjs +++ b/Resources/markdown-viewer/webviews-app/main.mjs @@ -1 +1,2 @@ -import{_ as n}from"./chunks/vendor.mjs";function o(){return document.documentElement.dataset.cmuxWebviewKind==="agent-session"||document.body.dataset.cmuxWebviewKind==="agent-session"||document.getElementById("cmux-agent-session-config")?"agent-session":"diff"}const t=document.getElementById("root");if(!t)throw new Error("Missing cmux webview root");o()==="agent-session"?n(()=>import("./chunks/agentSessionSurface.mjs"),[]).then(e=>{e.mountAgentSessionSurface(t)}):n(()=>import("./chunks/diffSurface.mjs"),[]).then(e=>{e.mountDiffSurface(t)}); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/feedSurface.css"])))=>i.map(i=>d[i]); +import{_ as n}from"./chunks/vendor.mjs";function o(){return document.documentElement.dataset.cmuxWebviewKind==="agent-session"||document.body.dataset.cmuxWebviewKind==="agent-session"||document.getElementById("cmux-agent-session-config")?"agent-session":document.documentElement.dataset.cmuxWebviewKind==="feed"||document.body.dataset.cmuxWebviewKind==="feed"||document.getElementById("cmux-feed-config")?"feed":"diff"}const t=document.getElementById("root");if(!t)throw new Error("Missing cmux webview root");o()==="agent-session"?n(()=>import("./chunks/agentSessionSurface.mjs"),[]).then(e=>{e.mountAgentSessionSurface(t)}):o()==="feed"?n(()=>import("./chunks/feedSurface.mjs"),__vite__mapDeps([0])).then(e=>{e.mountFeedSurface(t)}):n(()=>import("./chunks/diffSurface.mjs"),[]).then(e=>{e.mountDiffSurface(t)}); diff --git a/Sources/AppDelegate+AgentChat.swift b/Sources/AppDelegate+AgentChat.swift index 1c57e48c250e..eec8820682c2 100644 --- a/Sources/AppDelegate+AgentChat.swift +++ b/Sources/AppDelegate+AgentChat.swift @@ -90,6 +90,50 @@ extension AppDelegate { ) } + @discardableResult + func performConfiguredFeedAction( + context: MainWindowContext, + onExecuted: (() -> Void)? + ) -> Bool { + guard BrowserAvailabilitySettings.isEnabled(), + let feedURL = FeedSurfaceBridge.feedURL() else { + NSSound.beep() + return false + } + let beforeIDs = Set(context.tabManager.tabs.map(\.id)) + let title = String(localized: "rightSidebar.mode.feed", defaultValue: "Feed") + let workspace = CmuxWorkspaceDefinition( + name: title, + layout: .pane(CmuxPaneDefinition(surfaces: [ + CmuxSurfaceDefinition( + type: .browser, + name: title, + command: nil, + cwd: nil, + env: nil, + url: feedURL.absoluteString, + focus: true + ), + ])) + ) + let command = CmuxCommandDefinition(name: title, workspace: workspace) + let baseCWD = context.tabManager.selectedWorkspace?.currentDirectory + ?? FileManager.default.homeDirectoryForCurrentUser.path + guard CmuxConfigExecutor.executeWorkspaceCommand( + command: command, + workspace: workspace, + tabManager: context.tabManager, + baseCwd: baseCWD + ) else { + return false + } + guard context.tabManager.tabs.contains(where: { !beforeIDs.contains($0.id) }) else { + return false + } + onExecuted?() + return true + } + @discardableResult func executeConfiguredCmuxAction( id actionID: String, diff --git a/Sources/AppDelegate+NewWorkspaceContextMenu.swift b/Sources/AppDelegate+NewWorkspaceContextMenu.swift index 05583dd61a62..35ce74355130 100644 --- a/Sources/AppDelegate+NewWorkspaceContextMenu.swift +++ b/Sources/AppDelegate+NewWorkspaceContextMenu.swift @@ -75,6 +75,7 @@ extension AppDelegate { let model = NewWorkspaceMenuModel.build( newWorkspaceContextMenuItems: cmuxConfigStore.newWorkspaceContextMenuItems, agentChatAction: resolvedBuiltInNewAgentChatAction(cmuxConfigStore: cmuxConfigStore), + feedAction: resolvedBuiltInFeedAction(cmuxConfigStore: cmuxConfigStore), cloudSectionEnabled: CmuxFeatureFlags.shared.isCloudVMUIEnabled, templateNames: savedLayoutNames(), loadedActions: cmuxConfigStore.loadedActions, @@ -116,6 +117,20 @@ extension AppDelegate { return action } + private func resolvedBuiltInFeedAction( + cmuxConfigStore: CmuxConfigStore + ) -> CmuxResolvedConfigAction? { + guard BrowserAvailabilitySettings.isEnabled() else { return nil } + let actionID = CmuxSurfaceTabBarBuiltInAction.feed.configID + let action = cmuxConfigStore.resolvedAction(id: actionID) ?? .builtIn(.feed) + guard action.newWorkspaceMenu != false else { return nil } + let configuredActionIDs = Set(cmuxConfigStore.newWorkspaceContextMenuItems.compactMap { item -> String? in + guard case .action(let menuAction) = item else { return nil } + return menuAction.action.id + }) + return configuredActionIDs.contains(actionID) ? nil : action + } + private func shouldAppendBuiltInNewAgentChatMenuItem( _ action: CmuxResolvedConfigAction, actionID: String, diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 82a2fc179dce..8cf47b2c4451 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -15419,6 +15419,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent onExecuted?() return true case .newAgentChat: return performConfiguredNewAgentChatAction(context: context, preferredWindow: preferredWindow, onExecuted: onExecuted) + case .feed: return performConfiguredFeedAction(context: context, onExecuted: onExecuted) case .cloudVM: let didStart = performCloudVMAction( tabManager: context.tabManager, diff --git a/Sources/CmuxConfig.swift b/Sources/CmuxConfig.swift index 104bb386a02d..d913c84e6035 100644 --- a/Sources/CmuxConfig.swift +++ b/Sources/CmuxConfig.swift @@ -1374,6 +1374,9 @@ struct CmuxResolvedConfigAction: Identifiable, Sendable, Hashable { case .newAgentChat: title = String(localized: "command.newAgentChat.title", defaultValue: "New agent chat") keywords = ["create", "new", "agent", "chat", "browser", "codex", "claude"] + case .feed: + title = String(localized: "rightSidebar.mode.feed", defaultValue: "Feed") + keywords = ["agent", "activity", "approvals", "feed", "questions"] case .cloudVM: title = String(localized: "command.cloudVM.title", defaultValue: "Open Base") keywords = ["base", "cloud", "vm", "virtual", "machine", "remote"] diff --git a/Sources/CmuxSurfaceTabBarBuiltInAction.swift b/Sources/CmuxSurfaceTabBarBuiltInAction.swift index 8c4f5013e021..79fb6dec1ea7 100644 --- a/Sources/CmuxSurfaceTabBarBuiltInAction.swift +++ b/Sources/CmuxSurfaceTabBarBuiltInAction.swift @@ -4,6 +4,7 @@ import Foundation enum CmuxSurfaceTabBarBuiltInAction: String, Codable, Sendable, CaseIterable, Hashable { case newWorkspace = "cmux.newWorkspace" case newAgentChat = "cmux.newAgentChat" + case feed = "cmux.feed" case cloudVM = "cmux.cloudvm" case mobileConnect = "cmux.mobileconnect" case newTerminal = "cmux.newTerminal" @@ -17,6 +18,8 @@ enum CmuxSurfaceTabBarBuiltInAction: String, Codable, Sendable, CaseIterable, Ha self = .newWorkspace case "cmux.newAgentChat", "cmux.agentChat", "newAgentChat", "new-agent-chat", "agentChat": self = .newAgentChat + case "cmux.feed", "feed", "openFeed", "open-feed": + self = .feed case "cmux.cloudvm", "cmux.cloudVM", "cloudVM", "cloudvm", "cmux.newCloudVM", "cmux.newCloudVm", "newCloudVM", "newCloudVm", "cmux.startCloudVM", "cmux.startCloudVm", "startCloudVM", "startCloudVm": @@ -47,6 +50,8 @@ enum CmuxSurfaceTabBarBuiltInAction: String, Codable, Sendable, CaseIterable, Ha return "plus.square" case .newAgentChat: return "message" + case .feed: + return "dot.radiowaves.left.and.right" case .cloudVM: return "cloud" case .mobileConnect: @@ -64,7 +69,7 @@ enum CmuxSurfaceTabBarBuiltInAction: String, Codable, Sendable, CaseIterable, Ha var bonsplitAction: BonsplitConfiguration.SplitActionButton.Action? { switch self { - case .newWorkspace, .newAgentChat, .cloudVM, .mobileConnect: + case .newWorkspace, .newAgentChat, .feed, .cloudVM, .mobileConnect: return nil case .newTerminal: return .newTerminal diff --git a/Sources/ContentView+AgentChatCommandPalette.swift b/Sources/ContentView+AgentChatCommandPalette.swift index 6fef1c02eef7..716eff86dbbf 100644 --- a/Sources/ContentView+AgentChatCommandPalette.swift +++ b/Sources/ContentView+AgentChatCommandPalette.swift @@ -10,6 +10,8 @@ extension ContentView { return CmuxSurfaceTabBarBuiltInAction.newBrowser.configID case "palette.newAgentChat": return CmuxSurfaceTabBarBuiltInAction.newAgentChat.configID + case "palette.feed": + return CmuxSurfaceTabBarBuiltInAction.feed.configID case "palette.terminalSplitRight": return CmuxSurfaceTabBarBuiltInAction.splitRight.configID case "palette.terminalSplitDown": @@ -30,6 +32,16 @@ extension ContentView { )] } + static func commandPaletteFeedContributions() -> [CommandPaletteCommandContribution] { + [CommandPaletteCommandContribution( + commandId: "palette.feed", + title: { _ in String(localized: "rightSidebar.mode.feed", defaultValue: "Feed") }, + subtitle: { _ in String(localized: "command.cmuxConfig.builtInSubtitle", defaultValue: "cmux") }, + keywords: ["agent", "activity", "approvals", "feed", "questions"], + when: { !$0.bool(CommandPaletteContextKeys.browserDisabled) } + )] + } + func registerAgentChatCommandPaletteHandler(_ registry: inout CommandPaletteHandlerRegistry) { registry.register(commandId: "palette.newAgentChat") { guard CmuxFeatureFlags.shared.isAgentChatUIEnabled else { @@ -49,4 +61,20 @@ extension ContentView { } } } + + func registerFeedCommandPaletteHandler(_ registry: inout CommandPaletteHandlerRegistry) { + registry.register(commandId: "palette.feed") { + guard let appDelegate = AppDelegate.shared else { + NSSound.beep() + return + } + if !appDelegate.executeConfiguredCmuxAction( + id: CmuxSurfaceTabBarBuiltInAction.feed.configID, + tabManager: tabManager, + preferredWindow: appDelegate.mainWindow(for: windowId) + ) { + NSSound.beep() + } + } + } } diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 8014baaf5ea0..efe5ba2d3da8 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -6283,6 +6283,7 @@ struct ContentView: View { ) ) contributions.append(contentsOf: Self.commandPaletteNewAgentChatContributions()) + contributions.append(contentsOf: Self.commandPaletteFeedContributions()) contributions.append( CommandPaletteCommandContribution( commandId: "palette.newWindow", @@ -7512,6 +7513,7 @@ struct ContentView: View { } } registerAgentChatCommandPaletteHandler(®istry) + registerFeedCommandPaletteHandler(®istry) registry.register(commandId: "palette.openFolder") { // Defer so the command palette dismisses before the modal sheet appears. DispatchQueue.main.async { diff --git a/Sources/Feed/FeedPanelView.swift b/Sources/Feed/FeedPanelView.swift index 08e839cd9102..2883f567fad5 100644 --- a/Sources/Feed/FeedPanelView.swift +++ b/Sources/Feed/FeedPanelView.swift @@ -73,7 +73,7 @@ struct FeedPanelView: View { } @State private var filter: Filter = .actionable - @StateObject private var viewModel = FeedPanelViewModel() + @State private var viewModel = FeedPanelViewModel() var body: some View { VStack(spacing: 0) { diff --git a/Sources/Feed/FeedPanelViewModel.swift b/Sources/Feed/FeedPanelViewModel.swift index 15e476e0072b..af3532485c76 100644 --- a/Sources/Feed/FeedPanelViewModel.swift +++ b/Sources/Feed/FeedPanelViewModel.swift @@ -4,15 +4,17 @@ import Foundation import Observation import SwiftUI -/// Bridges the `@Observable` WorkstreamStore to a Combine `@Published` -/// snapshot so SwiftUI reliably re-renders the Feed panel on every -/// mutation. +/// Projects the shared `WorkstreamStore` into immutable Feed snapshots for +/// SwiftUI. Observation owns rendering; the only task is a cancellable history +/// request whose lifetime is tied to this model. @MainActor -final class FeedPanelViewModel: ObservableObject { - @Published private(set) var items: [WorkstreamItem] = [] - @Published private(set) var hasMorePersistedItems = false - @Published private(set) var isLoadingOlderItems = false - private var storeInstalledObserver: NSObjectProtocol? +@Observable +final class FeedPanelViewModel { + private(set) var items: [WorkstreamItem] = [] + private(set) var hasMorePersistedItems = false + private(set) var isLoadingOlderItems = false + @ObservationIgnored private var storeInstalledObserver: NSObjectProtocol? + @ObservationIgnored private var loadOlderTask: Task? init() { storeInstalledObserver = NotificationCenter.default.addObserver( @@ -28,6 +30,7 @@ final class FeedPanelViewModel: ObservableObject { } deinit { + loadOlderTask?.cancel() if let storeInstalledObserver { NotificationCenter.default.removeObserver(storeInstalledObserver) } @@ -46,10 +49,13 @@ final class FeedPanelViewModel: ObservableObject { } } - nonisolated func loadOlderItems() { - Task { @MainActor [weak self] in - guard let self, !self.isLoadingOlderItems, self.hasMorePersistedItems else { return } - await FeedCoordinator.shared.store?.loadOlderItems() + func loadOlderItems() { + guard !isLoadingOlderItems, + hasMorePersistedItems, + let store = FeedCoordinator.shared.store else { return } + loadOlderTask?.cancel() + loadOlderTask = Task { @MainActor in + await store.loadOlderItems() } } } diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift new file mode 100644 index 000000000000..6732d8fea0f1 --- /dev/null +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -0,0 +1,282 @@ +import AppKit +import CMUXAgentLaunch +import Foundation +import Observation +import WebKit + +/// Typed native capability bridge shared by the React Feed surface and its +/// host. `WorkstreamStore` remains the only state owner; the bridge publishes +/// immutable snapshots and routes typed actions through `FeedCoordinator`. +@MainActor +final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { + static let handlerName = "cmuxFeed" + + private static var handlerInstalledKey: UInt8 = 0 + private static var subscriptionGenerationKey: UInt8 = 0 + + static func installIfNeeded(on userContentController: WKUserContentController) { + guard objc_getAssociatedObject(userContentController, &handlerInstalledKey) == nil else { + return + } + userContentController.addScriptMessageHandler( + FeedSurfaceBridge(), + contentWorld: .page, + name: handlerName + ) + objc_setAssociatedObject( + userContentController, + &handlerInstalledKey, + NSNumber(value: true), + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + } + + func userContentController( + _ userContentController: WKUserContentController, + didReceive message: WKScriptMessage, + replyHandler: @escaping (Any?, String?) -> Void + ) { + guard Self.isTrustedFeedFrame(message.frameInfo), + let body = message.body as? [String: Any], + let method = body["method"] as? String else { + replyHandler(Self.error(code: "not_allowed"), nil) + return + } + let params = body["params"] as? [String: Any] ?? [:] + Task { @MainActor in + do { + let value = try await self.handle(method: method, params: params, webView: message.webView) + replyHandler(["ok": true, "value": value], nil) + } catch { + replyHandler(Self.error(code: "invalid_request"), nil) + } + } + } + + static func isTrustedFeedFrame(_ frameInfo: WKFrameInfo) -> Bool { + frameInfo.isMainFrame && isTrustedFeedURL(frameInfo.request.url) + } + + static func isTrustedFeedURL(_ url: URL?, resourceURL: URL? = Bundle.main.resourceURL) -> Bool { + _ = resourceURL + guard let url, + let expected = CmuxDiffViewerURLSchemeHandler.diffViewerURL( + token: CmuxDiffViewerURLSchemeHandler.bundledFeedToken, + requestPath: "/feed.html" + ) else { return false } + return url == expected + } + + static func feedURL() -> URL? { + try? CmuxDiffViewerURLSchemeHandler.shared.registerBundledFeedAssets() + } + + private func handle( + method: String, + params: [String: Any], + webView: WKWebView? + ) async throws -> Any { + switch method { + case "feed.snapshot": + return snapshot() + case "feed.subscribe": + guard let webView else { throw FeedSurfaceBridgeError.invalidRequest } + beginSnapshotSubscription(for: webView) + return snapshot() + case "feed.loadOlder": + await FeedCoordinator.shared.store?.loadOlderItems() + return snapshot() + case "feed.permission.reply": + let item = try item(params) + guard let modeRaw = params["mode"] as? String, + let mode = WorkstreamPermissionMode(rawValue: modeRaw), + isAllowedPermissionMode(mode, for: item) else { + throw FeedSurfaceBridgeError.invalidRequest + } + FeedCoordinator.shared.deliverReply( + requestId: try requestID(item), + decision: .permission(mode) + ) + return ["accepted": true] + case "feed.exitPlan.reply": + let item = try item(params) + guard let modeRaw = params["mode"] as? String, + let mode = WorkstreamExitPlanMode(rawValue: modeRaw) else { + throw FeedSurfaceBridgeError.invalidRequest + } + let feedback = (params["feedback"] as? String)?.trimmingCharacters(in: .whitespacesAndNewlines) + FeedCoordinator.shared.deliverReply( + requestId: try requestID(item), + decision: .exitPlan(mode, feedback: feedback?.isEmpty == false ? feedback : nil) + ) + return ["accepted": true] + case "feed.question.reply": + let item = try item(params) + guard let selections = params["selections"] as? [String] else { + throw FeedSurfaceBridgeError.invalidRequest + } + FeedCoordinator.shared.deliverReply( + requestId: try requestID(item), + decision: .question(selections: selections) + ) + return ["accepted": true] + case "feed.jump": + guard let workstreamID = params["workstreamId"] as? String else { + throw FeedSurfaceBridgeError.invalidRequest + } + return ["matched": FeedCoordinator.shared.focusIfPossible(workstreamId: workstreamID)] + case "feed.sendText": + guard let workstreamID = params["workstreamId"] as? String, + let text = params["text"] as? String else { + throw FeedSurfaceBridgeError.invalidRequest + } + return ["sent": FeedCoordinator.shared.sendTextToWorkstream(workstreamId: workstreamID, text: text)] + default: + throw FeedSurfaceBridgeError.invalidRequest + } + } + + private func item(_ params: [String: Any]) throws -> WorkstreamItem { + guard let rawID = params["itemId"] as? String, + let id = UUID(uuidString: rawID), + let item = FeedCoordinator.shared.store?.items.first(where: { $0.id == id }), + item.status.isPending else { + throw FeedSurfaceBridgeError.invalidRequest + } + return item + } + + private func requestID(_ item: WorkstreamItem) throws -> String { + switch item.payload { + case .permissionRequest(let requestID, _, _, _), + .exitPlan(let requestID, _, _), + .question(let requestID, _): + return requestID + default: + throw FeedSurfaceBridgeError.invalidRequest + } + } + + private func snapshot() -> [String: Any] { + let store = FeedCoordinator.shared.store + return [ + "items": (store?.items ?? []).map(itemDictionary), + "hasMore": store?.hasMorePersistedItems ?? false, + "isLoadingOlder": store?.isLoadingOlderItems ?? false, + "copy": [ + "feed": String(localized: "rightSidebar.mode.feed", defaultValue: "Feed"), + "actionable": String(localized: "feed.filter.actionable", defaultValue: "Actionable"), + "activity": String(localized: "feed.filter.activity", defaultValue: "All Activity"), + "emptyActionable": String(localized: "feed.empty.actionable.title", defaultValue: "No pending decisions"), + "emptyActivity": String(localized: "feed.empty.activity.title", defaultValue: "No activity yet"), + "loadOlder": String(localized: "feed.history.loadOlder", defaultValue: "Load older activity"), + "loadingOlder": String(localized: "feed.history.loadingOlder", defaultValue: "Loading older activity..."), + "deny": String(localized: "feed.permission.deny", defaultValue: "Deny"), + "allowOnce": String(localized: "feed.permission.once", defaultValue: "Allow Once"), + "allowAlways": String(localized: "feed.permission.always", defaultValue: "Always Allow"), + "allowAll": String(localized: "feed.permission.all", defaultValue: "All tools"), + "allowBypass": String(localized: "feed.permission.bypass", defaultValue: "Bypass"), + "planManual": String(localized: "feed.exitplan.manual", defaultValue: "Manual"), + "planAuto": String(localized: "feed.exitplan.auto", defaultValue: "Auto"), + "planUltraplan": String(localized: "feed.exitplan.ultraplan", defaultValue: "Ultraplan"), + "questionSubmit": String(localized: "feed.question.submitAll", defaultValue: "Submit All Answers"), + "questionPlaceholder": String(localized: "feed.question.typeSomething", defaultValue: "Type something..."), + "requestFailed": String(localized: "agentSession.web.error.requestFailed", defaultValue: "Native bridge request failed."), + ], + ] + } + + private func itemDictionary(_ item: WorkstreamItem) -> [String: Any] { + var dictionary = FeedSocketEncoding.itemDict(item) + guard case .permissionRequest(_, _, let toolInputJSON, _) = item.payload else { + return dictionary + } + dictionary["allowed_permission_modes"] = WorkstreamPermissionMode.allCases + .filter { isAllowedPermissionMode($0, for: item, toolInputJSON: toolInputJSON) } + .map(\.rawValue) + return dictionary + } + + private func isAllowedPermissionMode( + _ mode: WorkstreamPermissionMode, + for item: WorkstreamItem, + toolInputJSON explicitToolInputJSON: String? = nil + ) -> Bool { + let toolInputJSON: String? + if let explicitToolInputJSON { + toolInputJSON = explicitToolInputJSON + } else if case .permissionRequest(_, _, let value, _) = item.payload { + toolInputJSON = value + } else { + return false + } + switch mode { + case .deny: + return true + case .once: + return FeedPermissionActionPolicy.supportsOncePermissionMode( + source: item.source, + toolInputJSON: toolInputJSON + ) + case .always: + return FeedPermissionActionPolicy.supportsAlwaysPermissionMode( + source: item.source, + toolInputJSON: toolInputJSON + ) + case .all: + return FeedPermissionActionPolicy.supportsAllPermissionMode( + source: item.source, + toolInputJSON: toolInputJSON + ) + case .bypass: + return FeedPermissionActionPolicy.supportsBypassPermissions(source: item.source) + } + } + + private func beginSnapshotSubscription(for webView: WKWebView) { + let generation = (objc_getAssociatedObject(webView, &Self.subscriptionGenerationKey) as? NSNumber)?.intValue ?? 0 + let nextGeneration = generation + 1 + objc_setAssociatedObject( + webView, + &Self.subscriptionGenerationKey, + NSNumber(value: nextGeneration), + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + armSnapshotSubscription(for: webView, generation: nextGeneration) + } + + private func armSnapshotSubscription(for webView: WKWebView, generation: Int) { + guard Self.subscriptionGeneration(for: webView) == generation else { return } + withObservationTracking { + _ = FeedCoordinator.shared.store?.items + _ = FeedCoordinator.shared.store?.hasMorePersistedItems + _ = FeedCoordinator.shared.store?.isLoadingOlderItems + } onChange: { [weak self, weak webView] in + Task { @MainActor in + guard let self, let webView, + Self.subscriptionGeneration(for: webView) == generation else { return } + self.publishSnapshot(to: webView) + self.armSnapshotSubscription(for: webView, generation: generation) + } + } + } + + private static func subscriptionGeneration(for webView: WKWebView) -> Int { + (objc_getAssociatedObject(webView, &subscriptionGenerationKey) as? NSNumber)?.intValue ?? 0 + } + + private func publishSnapshot(to webView: WKWebView) { + let event: [String: Any] = ["type": "feed.snapshot", "snapshot": snapshot()] + guard let data = try? JSONSerialization.data(withJSONObject: event), + let json = String(data: data, encoding: .utf8) else { return } + webView.evaluateJavaScript("window.cmuxFeedBridge?.receive(\(json));") + } + + private static func error(code: String) -> [String: Any] { + ["ok": false, "error": ["code": code]] + } +} + +private enum FeedSurfaceBridgeError: Error { + case invalidRequest +} diff --git a/Sources/NewWorkspaceMenuModel.swift b/Sources/NewWorkspaceMenuModel.swift index 6501aacc169e..13dc3f7cfa97 100644 --- a/Sources/NewWorkspaceMenuModel.swift +++ b/Sources/NewWorkspaceMenuModel.swift @@ -30,6 +30,7 @@ struct NewWorkspaceMenuModel: Equatable { static func build( newWorkspaceContextMenuItems: [CmuxResolvedConfigContextMenuItem], agentChatAction: CmuxResolvedConfigAction?, + feedAction: CmuxResolvedConfigAction? = nil, cloudSectionEnabled: Bool, templateNames: [String], loadedActions: [CmuxResolvedConfigAction], @@ -88,6 +89,20 @@ struct NewWorkspaceMenuModel: Equatable { isDefault: agentChatAction.id == newWorkspaceActionID )) } + if let feedAction { + createRows.append(.action( + CmuxResolvedConfigMenuAction( + id: feedAction.id, + title: feedAction.title, + icon: feedAction.icon, + iconSourcePath: feedAction.iconSourcePath, + tooltip: feedAction.tooltip, + action: feedAction + ), + deletable: deletable(feedAction), + isDefault: feedAction.id == newWorkspaceActionID + )) + } let defaultLayout = NewWorkspaceDefaultLayoutMenuModel.build( loadedActions: loadedActions, diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 6140db6976b1..ae81051d119b 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1854,6 +1854,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { static let scheme = "cmux-diff-viewer" static let shared = CmuxDiffViewerURLSchemeHandler() static let maxRegisteredFiles = 1024 + static let bundledFeedToken = "feed" struct RegisteredFile { let requestPath: String @@ -1917,7 +1918,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { let standardizedURL = file.fileURL.standardizedFileURL.resolvingSymlinksInPath() var isDirectory: ObjCBool = false - guard isTrustedDiffViewerFileURL(standardizedURL), + guard isTrustedRegisteredFileURL(standardizedURL, token: token), FileManager.default.fileExists(atPath: standardizedURL.path, isDirectory: &isDirectory), !isDirectory.boolValue, FileManager.default.isReadableFile(atPath: standardizedURL.path) else { @@ -1944,6 +1945,46 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { lock.unlock() } + func registerBundledFeedAssets(resourceURL: URL? = Bundle.main.resourceURL) throws -> URL { + guard let root = resourceURL? + .appendingPathComponent("markdown-viewer/webviews-app", isDirectory: true) + .standardizedFileURL + .resolvingSymlinksInPath(), + let enumerator = FileManager.default.enumerator( + at: root, + includingPropertiesForKeys: [.isRegularFileKey], + options: [.skipsHiddenFiles] + ) else { + throw NSError(domain: "CmuxDiffViewerURLSchemeHandler", code: 6) + } + let files = enumerator.compactMap { entry -> RegisteredFile? in + guard let fileURL = entry as? URL, + (try? fileURL.resourceValues(forKeys: [.isRegularFileKey]).isRegularFile) == true else { + return nil + } + var relativePath = String(fileURL.path.dropFirst(root.path.count)) + if relativePath.hasSuffix(".deflate") { + relativePath.removeLast(".deflate".count) + } + let mimeType: String + if relativePath.hasSuffix(".html") { + mimeType = "text/html" + } else if relativePath.hasSuffix(".mjs") || relativePath.hasSuffix(".js") { + mimeType = "text/javascript" + } else if relativePath.hasSuffix(".css") { + mimeType = "text/css" + } else { + return nil + } + return RegisteredFile(requestPath: relativePath, fileURL: fileURL, mimeType: mimeType) + } + try register(token: Self.bundledFeedToken, files: files) + guard let url = Self.diffViewerURL(token: Self.bundledFeedToken, requestPath: "/feed.html") else { + throw NSError(domain: "CmuxDiffViewerURLSchemeHandler", code: 7) + } + return url + } + /// Whether the token currently has a registered (or manifest-restorable) /// session. Used to trust-gate native bridge calls from diff viewer pages. func hasActiveSession(token: String, now: Date = Date()) -> Bool { @@ -2432,7 +2473,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { } private static func isAllowedMimeType(_ mimeType: String) -> Bool { - mimeType == "text/html" || mimeType == "text/javascript" || mimeType == "text/x-diff" + mimeType == "text/html" || mimeType == "text/javascript" || mimeType == "text/css" || mimeType == "text/x-diff" } private static func pathExtensionMatchesMimeType(path: String, mimeType: String) -> Bool { @@ -2442,6 +2483,9 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { if mimeType == "text/javascript" { return path.hasSuffix(".mjs") || path.hasSuffix(".js") } + if mimeType == "text/css" { + return path.hasSuffix(".css") + } if mimeType == "text/x-diff" { return path.hasSuffix(".patch") } @@ -2575,6 +2619,17 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { return url.isFileURL && url.path.hasPrefix(rootPath + "/") } + private func isTrustedRegisteredFileURL(_ url: URL, token: String) -> Bool { + if token == Self.bundledFeedToken, + let bundleRoot = Bundle.main.resourceURL? + .appendingPathComponent("markdown-viewer/webviews-app", isDirectory: true) + .standardizedFileURL + .resolvingSymlinksInPath() { + return url.isFileURL && url.path.hasPrefix(bundleRoot.path + "/") + } + return isTrustedDiffViewerFileURL(url) + } + private func pruneExpiredSessionsLocked(now: Date) { sessions = sessions.filter { _, session in now.timeIntervalSince(session.createdAt) <= maxSessionAge @@ -2592,7 +2647,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { headers["Content-Security-Policy"] = [ "default-src 'none'", "script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval'", - "style-src 'unsafe-inline'", + "style-src 'self' 'unsafe-inline'", "img-src 'self' data:", "connect-src 'self'", "font-src 'none'", @@ -3570,6 +3625,7 @@ final class BrowserPanel: Panel, ObservableObject { // The handler itself rejects every frame that is not a registered diff // viewer session, so installing it on all browser webviews is safe. DiffCommentsBridge.installIfNeeded(on: configuration.userContentController) + FeedSurfaceBridge.installIfNeeded(on: configuration.userContentController) // Enable developer extras (DevTools) configuration.preferences.setValue(true, forKey: "developerExtrasEnabled") diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 8ea7c348c28a..8d40bd89ef21 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -12602,6 +12602,14 @@ extension Workspace: BonsplitDelegate { case .newWorkspace: owningTabManager?.addWorkspace() case .newAgentChat: performSurfaceTabBarNewAgentChatAction(presentingWindow: presentingWindow) + case .feed: + if let owningTabManager { + _ = AppDelegate.shared?.executeConfiguredCmuxAction( + id: CmuxSurfaceTabBarBuiltInAction.feed.configID, + tabManager: owningTabManager, + preferredWindow: presentingWindow + ) + } case .cloudVM: _ = AppDelegate.shared?.performCloudVMAction(tabManager: owningTabManager, preferredWindow: presentingWindow, debugSource: "surfaceTabBar.cloudVM") case .mobileConnect: diff --git a/cmux.xcodeproj/project.pbxproj b/cmux.xcodeproj/project.pbxproj index 98752fadb914..8a8971ef4d1b 100644 --- a/cmux.xcodeproj/project.pbxproj +++ b/cmux.xcodeproj/project.pbxproj @@ -718,6 +718,7 @@ C0DE71B10000000000000001 /* AppDelegate+AgentChatNotifications.swift in Sources FEED0000000000000000F013 /* FeedPermissionActionPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEED0000000000000000F012 /* FeedPermissionActionPolicy.swift */; }; FEED0000000000000000F00B /* FeedPreviewWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEED0000000000000000F00A /* FeedPreviewWindowController.swift */; }; FEED0000000000000000F009 /* FeedSidebarUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEED0000000000000000F008 /* FeedSidebarUITests.swift */; }; + FEED0000000000000000F015 /* FeedSurfaceBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEED0000000000000000F014 /* FeedSurfaceBridge.swift */; }; FEED0000000000000000F00F /* FeedTextEditorDebugWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEED0000000000000000F00E /* FeedTextEditorDebugWindowController.swift */; }; D0B1001AA1B2C3D4E5F60001 /* FileDropHintBadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B1001BA1B2C3D4E5F60001 /* FileDropHintBadgeView.swift */; }; D0B10020A1B2C3D4E5F60001 /* FileDropOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B10021A1B2C3D4E5F60001 /* FileDropOverlayView.swift */; }; @@ -2521,6 +2522,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = FEED0000000000000000F012 /* FeedPermissionActionPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FeedPermissionActionPolicy.swift; sourceTree = ""; }; FEED0000000000000000F00A /* FeedPreviewWindowController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FeedPreviewWindowController.swift; sourceTree = ""; }; FEED0000000000000000F008 /* FeedSidebarUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedSidebarUITests.swift; sourceTree = ""; }; + FEED0000000000000000F014 /* FeedSurfaceBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FeedSurfaceBridge.swift; sourceTree = ""; }; FEED0000000000000000F00E /* FeedTextEditorDebugWindowController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FeedTextEditorDebugWindowController.swift; sourceTree = ""; }; D0B1001BA1B2C3D4E5F60001 /* FileDropHintBadgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileDropHintBadgeView.swift; sourceTree = ""; }; D0B10021A1B2C3D4E5F60001 /* FileDropOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileDropOverlayView.swift; sourceTree = ""; }; @@ -5498,6 +5500,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = FEED0000000000000000F004 /* FeedPanelView.swift */, FEED0000000000000000F012 /* FeedPermissionActionPolicy.swift */, FEED0000000000000000F010 /* FeedPanelViewModel.swift */, + FEED0000000000000000F014 /* FeedSurfaceBridge.swift */, FEED0000000000000000F00A /* FeedPreviewWindowController.swift */, FEED0000000000000000F00C /* FeedButtonStyleDebugWindowController.swift */, FEED0000000000000000F00E /* FeedTextEditorDebugWindowController.swift */, @@ -6293,6 +6296,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = FEED0000000000000000F011 /* FeedPanelViewModel.swift in Sources */, FEED0000000000000000F013 /* FeedPermissionActionPolicy.swift in Sources */, FEED0000000000000000F00B /* FeedPreviewWindowController.swift in Sources */, + FEED0000000000000000F015 /* FeedSurfaceBridge.swift in Sources */, FEED0000000000000000F00F /* FeedTextEditorDebugWindowController.swift in Sources */, D0B1001AA1B2C3D4E5F60001 /* FileDropHintBadgeView.swift in Sources */, D0B10020A1B2C3D4E5F60001 /* FileDropOverlayView.swift in Sources */, diff --git a/cmuxTests/FeedCoordinatorTests.swift b/cmuxTests/FeedCoordinatorTests.swift index c18dd8744133..ad8d7a9c52a8 100644 --- a/cmuxTests/FeedCoordinatorTests.swift +++ b/cmuxTests/FeedCoordinatorTests.swift @@ -10,6 +10,15 @@ import CMUXAgentLaunch @Suite("Feed coordinator", .serialized) struct FeedCoordinatorTests { + @Test func feedSurfaceTrustIsLimitedToTheBundledEntryPoint() throws { + let feedURL = try #require(CmuxDiffViewerURLSchemeHandler.diffViewerURL(token: "feed", requestPath: "/feed.html")) + + #expect(FeedSurfaceBridge.isTrustedFeedURL(feedURL)) + #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: feedURL.absoluteString + "#feed"))) + #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "cmux-diff-viewer://feed/index.html"))) + #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "https://example.com/feed.html"))) + } + @Test func codexTeamsResolvesExplicitWorkingDirectoryFlags() { let base = "/tmp/cmux-base" diff --git a/cmuxTests/NewWorkspaceMenuModelTests.swift b/cmuxTests/NewWorkspaceMenuModelTests.swift index 1111f006d5ed..276215ba59e7 100644 --- a/cmuxTests/NewWorkspaceMenuModelTests.swift +++ b/cmuxTests/NewWorkspaceMenuModelTests.swift @@ -12,6 +12,11 @@ import Testing /// always-present management tail. struct NewWorkspaceMenuModelTests { + @Test func feedCommandPaletteContributionUsesSharedBuiltInAction() { + let contributions = ContentView.commandPaletteFeedContributions() + #expect(contributions.map(\.commandId) == ["palette.feed"]) + } + @MainActor private func loadStore(globalJSON: String) throws -> (store: CmuxConfigStore, root: URL) { let root = FileManager.default.temporaryDirectory.appendingPathComponent( @@ -101,9 +106,11 @@ struct NewWorkspaceMenuModelTests { defer { try? FileManager.default.removeItem(at: root) } let agent = CmuxResolvedConfigAction.builtIn(.newAgentChat) + let feed = CmuxResolvedConfigAction.builtIn(.feed) let model = NewWorkspaceMenuModel.build( newWorkspaceContextMenuItems: store.newWorkspaceContextMenuItems, agentChatAction: agent, + feedAction: feed, cloudSectionEnabled: true, templateNames: ["Template A"], loadedActions: store.loadedActions, @@ -136,6 +143,7 @@ struct NewWorkspaceMenuModelTests { CmuxSurfaceTabBarBuiltInAction.newWorkspace.configID, "terminal-command", CmuxSurfaceTabBarBuiltInAction.newAgentChat.configID, + CmuxSurfaceTabBarBuiltInAction.feed.configID, ]) #expect(createRows.contains(.separator)) #expect(layoutRows.map { $0.menuAction.action.id } == ["review-layout"]) @@ -156,6 +164,7 @@ struct NewWorkspaceMenuModelTests { let cloudFirstModel = NewWorkspaceMenuModel.build( newWorkspaceContextMenuItems: store.newWorkspaceContextMenuItems, agentChatAction: agent, + feedAction: feed, cloudSectionEnabled: true, templateNames: ["Template A"], loadedActions: store.loadedActions, diff --git a/scripts/build-webviews-app.sh b/scripts/build-webviews-app.sh index bdc76ff310e9..255ebf41d877 100755 --- a/scripts/build-webviews-app.sh +++ b/scripts/build-webviews-app.sh @@ -31,13 +31,32 @@ write_agent_session_html() { } > "$out_dir/agent-session.html" } +write_feed_html() { + out_dir="$1" + { + printf '\n' + printf '\n' + printf ' \n' + printf ' \n' + printf ' \n' + printf ' cmux\n' + printf ' \n' + printf ' \n' + printf '
\n' + printf ' \n' + printf ' \n' + printf ' \n' + printf '\n' + } > "$out_dir/feed.html" +} + strip_trailing_line_whitespace() { /usr/bin/perl -0pi -e 's/[ \t]+(?=\r?\n)//g; s/[ \t]+\z//' "$@" } normalize_webviews_output() { out_dir="$1" - strip_trailing_line_whitespace "$out_dir/main.mjs" "$out_dir/agent-session.html" + strip_trailing_line_whitespace "$out_dir/main.mjs" "$out_dir/agent-session.html" "$out_dir/feed.html" } if [ "${1:-}" = "--check" ]; then @@ -48,6 +67,7 @@ if [ "${1:-}" = "--check" ]; then bun install --frozen-lockfile CMUX_WEBVIEWS_OUT_DIR="$tmp_dir" bun run build write_agent_session_html "$tmp_dir" + write_feed_html "$tmp_dir" normalize_webviews_output "$tmp_dir" ) diff_output="$(mktemp)" @@ -75,4 +95,5 @@ fi bun run build ) write_agent_session_html "$OUT_DIR" +write_feed_html "$OUT_DIR" normalize_webviews_output "$OUT_DIR" diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx new file mode 100644 index 000000000000..857776497f89 --- /dev/null +++ b/webviews/src/feed/App.tsx @@ -0,0 +1,174 @@ +import { useState, useSyncExternalStore } from "react"; +import { callFeedNative, feedSnapshotStore } from "./bridge"; +import type { FeedItem, FeedQuestion } from "./types"; +import "./styles.css"; + +type Filter = "actionable" | "activity"; + +export function FeedApp() { + const snapshot = useSyncExternalStore( + feedSnapshotStore.subscribe, + feedSnapshotStore.getSnapshot, + feedSnapshotStore.getSnapshot, + ); + const [filter, setFilter] = useState("actionable"); + const [error, setError] = useState(null); + + if (!snapshot) return
; + const items = filter === "actionable" + ? snapshot.items.filter((item) => item.status === "pending") + : snapshot.items; + + const perform = async (method: string, params: Record) => { + setError(null); + try { + await callFeedNative(method, params); + } catch { + setError(snapshot.copy.requestFailed); + } + }; + + return ( +
+
+

{snapshot.copy.feed}

+
+ + +
+
+ {error &&
{error}
} +
+ {items.length === 0 ? ( +
+ {filter === "actionable" ? snapshot.copy.emptyActionable : snapshot.copy.emptyActivity} +
+ ) : items.map((item) => ( + + ))} + {snapshot.hasMore && ( + + )} +
+
+ ); +} + +function FeedCard({ item, copy, perform }: { + item: FeedItem; + copy: NonNullable>["copy"]; + perform: (method: string, params: Record) => Promise; +}) { + const title = item.title || item.tool_name || item.kind.replaceAll("_", " "); + return ( +
+
+
+ {item.source} +

{title}

+
+ +
+ {item.cwd &&
{item.cwd}
} + + {item.status === "pending" && ( + + )} +
+ ); +} + +function FeedBody({ item }: { item: FeedItem }) { + const text = item.plan || item.question_prompt || item.tool_input || item.tool_result || item.text; + if (!text) return null; + return
{text}
; +} + +function FeedActions({ item, copy, perform }: { + item: FeedItem; + copy: NonNullable>["copy"]; + perform: (method: string, params: Record) => Promise; +}) { + if (item.kind === "permissionRequest") { + const modes = new Set(item.allowed_permission_modes ?? ["deny"]); + return
+ {modes.has("deny") && } + {modes.has("once") && } + {modes.has("always") && } + {modes.has("all") && } + {modes.has("bypass") && } +
; + } + if (item.kind === "exitPlan") { + return
+ + + +
; + } + if (item.kind === "question") { + return ; + } + return null; +} + +function QuestionActions({ item, questions, copy, perform }: { + item: FeedItem; + questions: FeedQuestion[]; + copy: NonNullable>["copy"]; + perform: (method: string, params: Record) => Promise; +}) { + const normalizedQuestions = questions.length > 0 ? questions : [{ + id: "question", multi_select: false, options: item.question_options ?? [], prompt: item.question_prompt ?? "", + }]; + const [selected, setSelected] = useState>({}); + const [freeText, setFreeText] = useState>({}); + const toggle = (question: FeedQuestion, id: string) => { + setSelected((current) => { + const values = current[question.id] ?? []; + const next = question.multi_select + ? (values.includes(id) ? values.filter((value) => value !== id) : [...values, id]) + : [id]; + return { ...current, [question.id]: next }; + }); + }; + const answers = normalizedQuestions.flatMap((question) => { + const custom = freeText[question.id]?.trim(); + if (custom) return [custom]; + const values = selected[question.id] ?? []; + const labels = question.options.filter((option) => values.includes(option.id)).map((option) => option.label); + return labels.length > 0 ? [labels.join(", ")] : []; + }); + return
+ {normalizedQuestions.map((question) =>
+ {question.prompt &&
{question.prompt}
} +
+ {question.options.map((option) => ( + + ))} +
+ setFreeText((current) => ({ ...current, [question.id]: event.target.value }))} + placeholder={copy.questionPlaceholder} + value={freeText[question.id] ?? ""} + /> +
)} + +
; +} diff --git a/webviews/src/feed/bridge.ts b/webviews/src/feed/bridge.ts new file mode 100644 index 000000000000..85bbb50ea064 --- /dev/null +++ b/webviews/src/feed/bridge.ts @@ -0,0 +1,64 @@ +import type { FeedNativeEvent, FeedSnapshot } from "./types"; + +type NativeReply = + | { ok: true; value: T } + | { ok: false; error?: { code?: string; userMessage?: string } }; + +declare global { + interface Window { + cmuxFeedBridge?: { receive(event: FeedNativeEvent): void }; + } +} + +type FeedBridgeWindow = Window & { + webkit?: { + messageHandlers?: { + cmuxFeed?: { postMessage(message: unknown): Promise> }; + }; + }; +}; + +let currentSnapshot: FeedSnapshot | null = null; +const listeners = new Set<() => void>(); +let subscriptionPromise: Promise | null = null; + +function publish(snapshot: FeedSnapshot) { + currentSnapshot = snapshot; + for (const listener of listeners) listener(); +} + +if (typeof window !== "undefined") { + window.cmuxFeedBridge = { + receive(event) { + if (event.type === "feed.snapshot") publish(event.snapshot); + }, + }; +} + +export async function callFeedNative(method: string, params: Record = {}): Promise { + const handler = (window as FeedBridgeWindow).webkit?.messageHandlers?.cmuxFeed; + if (!handler?.postMessage) throw new Error("Native Feed bridge is unavailable."); + const reply = (await handler.postMessage({ method, params })) as NativeReply; + if (!reply.ok) throw new Error(reply.error?.userMessage || "Feed request failed."); + return reply.value; +} + +async function ensureSubscribed() { + if (subscriptionPromise) return subscriptionPromise; + subscriptionPromise = callFeedNative("feed.subscribe") + .then(publish) + .catch((error) => { + subscriptionPromise = null; + throw error; + }); + return subscriptionPromise; +} + +export const feedSnapshotStore = { + getSnapshot: () => currentSnapshot, + subscribe(listener: () => void) { + listeners.add(listener); + void ensureSubscribed(); + return () => listeners.delete(listener); + }, +}; diff --git a/webviews/src/feed/styles.css b/webviews/src/feed/styles.css new file mode 100644 index 000000000000..736fd76b39c4 --- /dev/null +++ b/webviews/src/feed/styles.css @@ -0,0 +1,40 @@ +:root { color-scheme: light dark; font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", sans-serif; } +* { box-sizing: border-box; } +html, body, #root { width: 100%; min-height: 100%; margin: 0; } +body { background: transparent; color: CanvasText; } +button { font: inherit; } +.feed-shell { min-height: 100vh; padding: 20px clamp(14px, 4vw, 42px) 40px; } +.feed-loading { opacity: .5; } +.feed-header { align-items: center; display: flex; justify-content: space-between; margin: 0 auto 18px; max-width: 880px; } +.feed-header h1 { font-size: 20px; margin: 0; } +.feed-filter { background: color-mix(in srgb, CanvasText 7%, transparent); border-radius: 9px; display: flex; gap: 2px; padding: 3px; } +.feed-filter button { background: transparent; border: 0; border-radius: 7px; color: color-mix(in srgb, CanvasText 68%, transparent); padding: 5px 10px; } +.feed-filter button[aria-selected="true"] { background: color-mix(in srgb, Canvas 86%, CanvasText 14%); color: CanvasText; box-shadow: 0 1px 3px #0002; } +.feed-list { display: grid; gap: 10px; margin: 0 auto; max-width: 880px; } +.feed-card { background: color-mix(in srgb, Canvas 93%, CanvasText 7%); border: 1px solid color-mix(in srgb, CanvasText 10%, transparent); border-radius: 12px; padding: 14px; } +.feed-card-pending { border-color: color-mix(in srgb, #4c8dff 45%, transparent); box-shadow: 0 5px 20px #0000000c; } +.feed-card-heading { align-items: flex-start; display: flex; gap: 12px; justify-content: space-between; } +.feed-card-heading h2 { font-size: 14px; margin: 3px 0 0; } +.feed-card-heading time, .feed-source, .feed-cwd { color: color-mix(in srgb, CanvasText 52%, transparent); font-size: 11px; } +.feed-source { font-weight: 600; text-transform: capitalize; } +.feed-cwd { font-family: ui-monospace, monospace; margin-top: 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.feed-body { background: color-mix(in srgb, CanvasText 6%, transparent); border-radius: 8px; font: 12px/1.5 ui-monospace, monospace; margin: 12px 0 0; max-height: 280px; overflow: auto; padding: 10px; white-space: pre-wrap; word-break: break-word; } +.feed-actions { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 12px; } +.feed-actions button, .feed-question-actions > button, .feed-options button, .feed-load-more { background: color-mix(in srgb, CanvasText 8%, transparent); border: 1px solid color-mix(in srgb, CanvasText 12%, transparent); border-radius: 7px; color: CanvasText; cursor: pointer; padding: 6px 10px; } +.feed-actions .primary, .feed-question-actions .primary { background: #2678ed; border-color: #2678ed; color: white; } +.feed-actions .danger { color: #e05252; } +.feed-question-actions { display: grid; gap: 8px; margin-top: 12px; } +.feed-question { display: grid; gap: 7px; } +.feed-question-prompt { font-size: 12px; font-weight: 600; } +.feed-question input { background: color-mix(in srgb, CanvasText 6%, transparent); border: 1px solid color-mix(in srgb, CanvasText 12%, transparent); border-radius: 7px; color: CanvasText; font: inherit; padding: 7px 9px; width: 100%; } +.feed-options { display: grid; gap: 6px; } +.feed-options button { display: grid; gap: 2px; text-align: left; } +.feed-options button[aria-pressed="true"] { border-color: #4c8dff; background: color-mix(in srgb, #4c8dff 16%, transparent); } +.feed-options span { color: color-mix(in srgb, CanvasText 60%, transparent); font-size: 11px; } +.feed-empty { color: color-mix(in srgb, CanvasText 55%, transparent); padding: 80px 20px; text-align: center; } +.feed-error { background: #e0525220; border: 1px solid #e0525260; border-radius: 8px; margin: 0 auto 10px; max-width: 880px; padding: 8px 10px; } +.feed-load-more { justify-self: center; margin-top: 4px; } +button:disabled { cursor: default; opacity: .45; } +button:focus-visible { outline: 2px solid #4c8dff; outline-offset: 2px; } +.feed-question input:focus-visible { outline: 2px solid #4c8dff; outline-offset: 2px; } +@media (max-width: 540px) { .feed-header { align-items: stretch; flex-direction: column; gap: 12px; } .feed-filter { align-self: flex-start; } } diff --git a/webviews/src/feed/types.ts b/webviews/src/feed/types.ts new file mode 100644 index 000000000000..c56db58a27ff --- /dev/null +++ b/webviews/src/feed/types.ts @@ -0,0 +1,68 @@ +export type FeedQuestionOption = { + description?: string; + id: string; + label: string; +}; + +export type FeedQuestion = { + header?: string; + id: string; + multi_select: boolean; + options: FeedQuestionOption[]; + prompt: string; +}; + +export type FeedItem = { + allowed_permission_modes?: Array<"all" | "always" | "bypass" | "deny" | "once">; + created_at: string; + cwd?: string; + default_mode?: string; + id: string; + kind: string; + plan?: string; + question_options?: FeedQuestionOption[]; + question_prompt?: string; + questions?: FeedQuestion[]; + request_id?: string; + source: string; + status: "expired" | "pending" | "resolved" | "telemetry"; + text?: string; + title?: string; + tool_input?: string; + tool_name?: string; + tool_result?: string; + workstream_id: string; +}; + +export type FeedCopy = { + actionable: string; + activity: string; + allowAlways: string; + allowAll: string; + allowBypass: string; + allowOnce: string; + deny: string; + emptyActionable: string; + emptyActivity: string; + feed: string; + loadOlder: string; + loadingOlder: string; + planAuto: string; + planManual: string; + planUltraplan: string; + questionSubmit: string; + questionPlaceholder: string; + requestFailed: string; +}; + +export type FeedSnapshot = { + copy: FeedCopy; + hasMore: boolean; + isLoadingOlder: boolean; + items: FeedItem[]; +}; + +export type FeedNativeEvent = { + snapshot: FeedSnapshot; + type: "feed.snapshot"; +}; diff --git a/webviews/src/main.tsx b/webviews/src/main.tsx index 29cfc5836967..445de28c4991 100644 --- a/webviews/src/main.tsx +++ b/webviews/src/main.tsx @@ -1,4 +1,4 @@ -type WebviewKind = "agent-session" | "diff"; +type WebviewKind = "agent-session" | "diff" | "feed"; function resolveWebviewKind(): WebviewKind { if ( @@ -8,6 +8,13 @@ function resolveWebviewKind(): WebviewKind { ) { return "agent-session"; } + if ( + document.documentElement.dataset.cmuxWebviewKind === "feed" || + document.body.dataset.cmuxWebviewKind === "feed" || + document.getElementById("cmux-feed-config") + ) { + return "feed"; + } return "diff"; } @@ -18,12 +25,16 @@ if (!rootElement) { // Load only the active surface so each one ships as its own chunk: the diff // viewer pulls in `@pierre/diffs`, the agent session pulls in its editor UI, -// and neither pays for the other. Shared vendor code (React, the router) is -// hoisted by Rollup into chunks both surfaces reuse. +// without paying for the others. Shared vendor code (React, the router) is +// hoisted by Rollup into chunks all surfaces reuse. if (resolveWebviewKind() === "agent-session") { void import("./surfaces/agentSessionSurface").then((surface) => { surface.mountAgentSessionSurface(rootElement); }); +} else if (resolveWebviewKind() === "feed") { + void import("./surfaces/feedSurface").then((surface) => { + surface.mountFeedSurface(rootElement); + }); } else { void import("./surfaces/diffSurface").then((surface) => { surface.mountDiffSurface(rootElement); diff --git a/webviews/src/router.tsx b/webviews/src/router.tsx index 18d915f2ef19..0759f17cb6f1 100644 --- a/webviews/src/router.tsx +++ b/webviews/src/router.tsx @@ -34,11 +34,17 @@ export function createWebviewsRouter(WebviewComponent: WebviewRouteComponent) { path: "/agent-session", component: WebviewComponent, }); + const feedRoute = createRoute({ + getParentRoute: () => rootRoute, + path: "/feed", + component: WebviewComponent, + }); const routeTree = rootRoute.addChildren([ indexRoute, diffRoute, generatedDiffRoute, agentSessionRoute, + feedRoute, ]); return createRouter({ history: createHashHistory(), diff --git a/webviews/src/surfaces/feedSurface.tsx b/webviews/src/surfaces/feedSurface.tsx new file mode 100644 index 000000000000..992407dfac68 --- /dev/null +++ b/webviews/src/surfaces/feedSurface.tsx @@ -0,0 +1,11 @@ +import { RouterProvider } from "@tanstack/react-router"; +import { createRoot } from "react-dom/client"; +import { FeedApp } from "../feed/App"; +import { createWebviewsRouter } from "../router"; + +export function mountFeedSurface(rootElement: HTMLElement): void { + document.documentElement.dataset.cmuxWebviewKind = "feed"; + document.body.dataset.cmuxWebviewKind = "feed"; + const router = createWebviewsRouter(() => ); + createRoot(rootElement).render(); +} diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx new file mode 100644 index 000000000000..de67904f025e --- /dev/null +++ b/webviews/test/feed.test.tsx @@ -0,0 +1,75 @@ +import { afterEach, expect, test } from "bun:test"; +import { JSDOM } from "jsdom"; +import { flushSync } from "react-dom"; +import { createRoot, type Root } from "react-dom/client"; +import { FeedApp } from "../src/feed/App"; + +let root: Root | null = null; +let dom: JSDOM | null = null; +const originalGlobals = new Map(); +for (const key of ["window", "document", "navigator", "Element", "Node", "HTMLElement"]) { + originalGlobals.set(key, (globalThis as any)[key]); +} + +afterEach(async () => { + if (root) flushSync(() => root?.unmount()); + root = null; + await new Promise((resolve) => setTimeout(resolve, 0)); + dom?.window.close(); + dom = null; + for (const [key, value] of originalGlobals) { + if (value === undefined) delete (globalThis as any)[key]; + else (globalThis as any)[key] = value; + } +}); + +test("Feed React surface invokes the typed permission primitive", async () => { + dom = new JSDOM("
", { url: "file:///feed.html" }); + for (const key of ["window", "document", "navigator", "Element", "Node", "HTMLElement"]) { + (globalThis as any)[key] = (dom.window as any)[key] ?? dom.window; + } + const calls: unknown[] = []; + (window as any).webkit = { messageHandlers: { cmuxFeed: { postMessage: async (message: any) => { + calls.push(message); + if (message.method === "feed.subscribe") { + return { ok: true, value: { + copy: { + actionable: "Actionable", activity: "All Activity", allowAll: "All tools", + allowAlways: "Always Allow", allowBypass: "Bypass", + allowOnce: "Allow Once", deny: "Deny", emptyActionable: "No pending decisions", + emptyActivity: "No activity yet", feed: "Feed", loadOlder: "Load older activity", + loadingOlder: "Loading older activity...", planAuto: "Auto", planManual: "Manual", + planUltraplan: "Ultraplan", questionPlaceholder: "Type something...", + questionSubmit: "Submit All Answers", requestFailed: "Native bridge request failed.", + }, + hasMore: false, + isLoadingOlder: false, + items: [{ + created_at: "2026-07-13T12:00:00Z", id: "item-1", kind: "permissionRequest", + request_id: "request-1", source: "claude", status: "pending", tool_name: "Bash", + tool_input: "echo ok", workstream_id: "claude-session", + allowed_permission_modes: ["deny", "once", "always", "all"], + }], + } }; + } + return { ok: true, value: { accepted: true } }; + } } } }; + + const container = document.getElementById("root")!; + root = createRoot(container); + flushSync(() => root?.render()); + await waitFor(() => container.textContent?.includes("Bash") === true); + const allowOnce = [...container.querySelectorAll("button")].find((button) => button.textContent === "Allow Once")!; + allowOnce.click(); + await waitFor(() => calls.some((call: any) => call.method === "feed.permission.reply")); + expect(calls).toContainEqual({ method: "feed.permission.reply", params: { itemId: "item-1", mode: "once" } }); +}); + +async function waitFor(predicate: () => boolean, timeout = 1_000) { + const deadline = Date.now() + timeout; + while (Date.now() < deadline) { + if (predicate()) return; + await new Promise((resolve) => setTimeout(resolve, 5)); + } + throw new Error("condition not met"); +} From b4066c6b1850948ee95ce8f182c37f0383b39783 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:19:38 -0700 Subject: [PATCH 02/23] Fix bundled Feed resource registration --- Sources/Feed/FeedSurfaceBridge.swift | 7 ++++++- Sources/Panels/BrowserPanel.swift | 2 +- cmuxTests/FeedCoordinatorTests.swift | 6 ++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index 6732d8fea0f1..974d63c6c32b 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -68,7 +68,12 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { } static func feedURL() -> URL? { - try? CmuxDiffViewerURLSchemeHandler.shared.registerBundledFeedAssets() + do { + return try CmuxDiffViewerURLSchemeHandler.shared.registerBundledFeedAssets() + } catch { + NSLog("feed.surface.register.failed error=%@", String(describing: error)) + return nil + } } private func handle( diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 1734bcb44794..1cbd5f3225cc 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1845,7 +1845,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { static let scheme = "cmux-diff-viewer" static let shared = CmuxDiffViewerURLSchemeHandler() static let maxRegisteredFiles = 1024 - static let bundledFeedToken = "feed" + static let bundledFeedToken = "bundled-feed-surface" struct RegisteredFile { let requestPath: String diff --git a/cmuxTests/FeedCoordinatorTests.swift b/cmuxTests/FeedCoordinatorTests.swift index ad8d7a9c52a8..250bd2c7b070 100644 --- a/cmuxTests/FeedCoordinatorTests.swift +++ b/cmuxTests/FeedCoordinatorTests.swift @@ -11,11 +11,13 @@ import CMUXAgentLaunch @Suite("Feed coordinator", .serialized) struct FeedCoordinatorTests { @Test func feedSurfaceTrustIsLimitedToTheBundledEntryPoint() throws { - let feedURL = try #require(CmuxDiffViewerURLSchemeHandler.diffViewerURL(token: "feed", requestPath: "/feed.html")) + let token = CmuxDiffViewerURLSchemeHandler.bundledFeedToken + #expect(CmuxDiffViewerURLSchemeHandler.isValidToken(token)) + let feedURL = try #require(CmuxDiffViewerURLSchemeHandler.diffViewerURL(token: token, requestPath: "/feed.html")) #expect(FeedSurfaceBridge.isTrustedFeedURL(feedURL)) #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: feedURL.absoluteString + "#feed"))) - #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "cmux-diff-viewer://feed/index.html"))) + #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "cmux-diff-viewer://\(token)/index.html"))) #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "https://example.com/feed.html"))) } From 878436d8673f9a7fb07a487a26d3925f72b5cf24 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 03:45:17 -0700 Subject: [PATCH 03/23] Decode bundled webview assets in scheme handler --- Sources/Panels/BrowserPanel.swift | 94 +++++++++++++++++++++++----- cmuxTests/FeedCoordinatorTests.swift | 12 ++++ 2 files changed, 92 insertions(+), 14 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 1cbd5f3225cc..4952eb46a404 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -14,6 +14,7 @@ import CFNetwork import SQLite3 import CryptoKit import Darwin +import zlib import CmuxTerminal #if canImport(CommonCrypto) import CommonCrypto @@ -1869,6 +1870,11 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { private var sessions: [String: Session] = [:] private var activeSchemeTasks: [ObjectIdentifier: SchemeTaskState] = [:] private let streamQueue = DispatchQueue(label: "com.manaflow.cmux.diff-viewer-stream", qos: .userInitiated) + private let bundledAssetQueue = DispatchQueue( + label: "com.manaflow.cmux.bundled-webview-assets", + qos: .userInitiated, + attributes: .concurrent + ) // Branch picker routes shell out to the bundled CLI (git). Run them on a // dedicated concurrent queue, NOT the serial file-serving streamQueue, so a // slow/hung git invocation cannot stall restored diff-viewer file serving. @@ -2494,9 +2500,15 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { activeSchemeTasks[taskID] = state lock.unlock() - streamQueue.async { [weak self] in + let queue = file.fileURL.lastPathComponent.hasSuffix(".deflate") + ? bundledAssetQueue + : streamQueue + queue.async { [weak self] in guard let self else { return } do { + let inflatedData = file.fileURL.lastPathComponent.hasSuffix(".deflate") + ? try Self.inflateZlibFile(file.fileURL) + : nil let response = HTTPURLResponse( url: requestURL, statusCode: 200, @@ -2505,7 +2517,7 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { ) ?? URLResponse( url: requestURL, mimeType: file.mimeType, - expectedContentLength: Self.fileSize(for: file.fileURL), + expectedContentLength: inflatedData?.count ?? Self.fileSize(for: file.fileURL), textEncodingName: "utf-8" ) @@ -2513,19 +2525,31 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { urlSchemeTask.didReceive(response) }) else { return } - let handle = try FileHandle(forReadingFrom: file.fileURL) - defer { - try? handle.close() - } + if let inflatedData { + var offset = 0 + while offset < inflatedData.count, self.isSchemeTaskActive(taskID) { + let end = min(offset + 64 * 1024, inflatedData.count) + let data = inflatedData.subdata(in: offset.. Data { + let compressed = try Data(contentsOf: url, options: .mappedIfSafe) + return try inflateZlibData(compressed) + } + + static func inflateZlibData(_ compressed: Data) throws -> Data { + let maximumSize = 128 * 1024 * 1024 + var capacity = max(64 * 1024, compressed.count * 4) + + while capacity <= maximumSize { + var output = Data(count: capacity) + var decodedCount = uLongf(capacity) + let status = output.withUnsafeMutableBytes { destinationBuffer in + compressed.withUnsafeBytes { sourceBuffer in + guard let destination = destinationBuffer.bindMemory(to: UInt8.self).baseAddress, + let source = sourceBuffer.bindMemory(to: UInt8.self).baseAddress else { + return Z_DATA_ERROR + } + return uncompress( + destination, + &decodedCount, + source, + uLong(compressed.count) + ) + } + } + if status == Z_OK { + output.count = Int(decodedCount) + return output + } + guard status == Z_BUF_ERROR else { + throw NSError(domain: "CmuxDiffViewerURLSchemeHandler", code: 8, userInfo: [ + NSLocalizedDescriptionKey: "Bundled webview asset has invalid zlib data" + ]) + } + capacity *= 2 + } + + throw NSError(domain: "CmuxDiffViewerURLSchemeHandler", code: 8, userInfo: [ + NSLocalizedDescriptionKey: "Bundled webview asset could not be decompressed" + ]) + } + private func isTrustedDiffViewerFileURL(_ url: URL) -> Bool { let rootPath = trustedRootURL.path return url.isFileURL && url.path.hasPrefix(rootPath + "/") @@ -2633,7 +2700,6 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { "X-Content-Type-Options": "nosniff", "Cross-Origin-Resource-Policy": "same-origin" ] - if file.fileURL.lastPathComponent.hasSuffix(".deflate") { headers["Content-Encoding"] = "deflate" } if file.mimeType == "text/html" { headers["Content-Security-Policy"] = [ "default-src 'none'", diff --git a/cmuxTests/FeedCoordinatorTests.swift b/cmuxTests/FeedCoordinatorTests.swift index 250bd2c7b070..c0ffcabf7b24 100644 --- a/cmuxTests/FeedCoordinatorTests.swift +++ b/cmuxTests/FeedCoordinatorTests.swift @@ -21,6 +21,18 @@ struct FeedCoordinatorTests { #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "https://example.com/feed.html"))) } + @Test func bundledFeedAssetsUseZlibDecompression() throws { + let compressed = Data([ + 0x78, 0xda, 0x4b, 0xce, 0xcf, 0x2b, 0xce, 0xcf, 0x49, + 0xd5, 0xcb, 0xc9, 0x4f, 0xd7, 0x50, 0x4f, 0x4b, 0x4d, + 0x4d, 0x51, 0xd7, 0x04, 0x00, 0x47, 0xe8, 0x06, 0x97, + ]) + + let decoded = try CmuxDiffViewerURLSchemeHandler.inflateZlibData(compressed) + + #expect(String(decoding: decoded, as: UTF8.self) == "console.log('feed')") + } + @Test func codexTeamsResolvesExplicitWorkingDirectoryFlags() { let base = "/tmp/cmux-base" From d0ac6a9aa41f32ed57578b5841c4455f5adcc15d Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:31:23 -0700 Subject: [PATCH 04/23] Add Feed chrome regression coverage --- cmuxTests/CmuxConfigTests.swift | 13 +++++++++++++ cmuxTests/FeedCoordinatorTests.swift | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/cmuxTests/CmuxConfigTests.swift b/cmuxTests/CmuxConfigTests.swift index 56f92a3fd118..325ce04befc4 100644 --- a/cmuxTests/CmuxConfigTests.swift +++ b/cmuxTests/CmuxConfigTests.swift @@ -2103,6 +2103,19 @@ final class CmuxLayoutEncodingTests: XCTestCase { } } + func testBrowserSurfaceOmnibarVisibilityRoundTrips() throws { + let original = CmuxSurfaceDefinition( + type: .browser, + url: "https://example.com", + omnibarVisible: false + ) + + let data = try JSONEncoder().encode(original) + let decoded = try JSONDecoder().decode(CmuxSurfaceDefinition.self, from: data) + + XCTAssertEqual(decoded.omnibarVisible, false) + } + func testSplitNodeRoundTrips() throws { let original = CmuxLayoutNode.split(CmuxSplitDefinition( direction: .vertical, diff --git a/cmuxTests/FeedCoordinatorTests.swift b/cmuxTests/FeedCoordinatorTests.swift index c0ffcabf7b24..fe7742ff5d23 100644 --- a/cmuxTests/FeedCoordinatorTests.swift +++ b/cmuxTests/FeedCoordinatorTests.swift @@ -21,6 +21,16 @@ struct FeedCoordinatorTests { #expect(!FeedSurfaceBridge.isTrustedFeedURL(URL(string: "https://example.com/feed.html"))) } + @Test func legacyPackagedFeedURLIsRecognizedForSessionMigration() throws { + let legacyURL = try #require(URL(string: + "file:///Applications/cmux.app/Contents/Resources/markdown-viewer/webviews-app/feed.html" + )) + + #expect(FeedSurfaceBridge.isLegacyPackagedFeedURL(legacyURL)) + #expect(!FeedSurfaceBridge.isLegacyPackagedFeedURL(URL(string: "file:///tmp/feed.html"))) + #expect(!FeedSurfaceBridge.isLegacyPackagedFeedURL(URL(string: "https://example.com/feed.html"))) + } + @Test func bundledFeedAssetsUseZlibDecompression() throws { let compressed = Data([ 0x78, 0xda, 0x4b, 0xce, 0xcf, 0x2b, 0xce, 0xcf, 0x49, From 639f82fd8b3ed21a04083d235188fa931a65cc0c Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:31:47 -0700 Subject: [PATCH 05/23] Hide chrome and migrate restored Feed surfaces --- Sources/AppDelegate+AgentChat.swift | 3 ++- Sources/CmuxConfig.swift | 1 + Sources/Feed/FeedSurfaceBridge.swift | 7 +++++++ Sources/Panels/BrowserPanel.swift | 14 +++++++++++--- Sources/Workspace+CustomLayout.swift | 6 ++++-- Sources/WorkspaceConfigActionCapture.swift | 1 + 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Sources/AppDelegate+AgentChat.swift b/Sources/AppDelegate+AgentChat.swift index 5f248a7f06f5..0b7deef146ce 100644 --- a/Sources/AppDelegate+AgentChat.swift +++ b/Sources/AppDelegate+AgentChat.swift @@ -112,7 +112,8 @@ extension AppDelegate { cwd: nil, env: nil, url: feedURL.absoluteString, - focus: true + focus: true, + omnibarVisible: false ), ])) ) diff --git a/Sources/CmuxConfig.swift b/Sources/CmuxConfig.swift index 9d7de3d52fea..6dc4f2997e0e 100644 --- a/Sources/CmuxConfig.swift +++ b/Sources/CmuxConfig.swift @@ -1644,6 +1644,7 @@ struct CmuxSurfaceDefinition: Codable, Sendable, Hashable { var env: [String: String]? var url: String? var focus: Bool? + var omnibarVisible: Bool? = nil } enum CmuxSurfaceType: String, Codable, Sendable { diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index 974d63c6c32b..e71a0ed605f6 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -67,6 +67,13 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { return url == expected } + static func isLegacyPackagedFeedURL(_ url: URL?) -> Bool { + guard let url, url.isFileURL else { return false } + return url.standardizedFileURL.path.hasSuffix( + "/Contents/Resources/markdown-viewer/webviews-app/feed.html" + ) + } + static func feedURL() -> URL? { do { return try CmuxDiffViewerURLSchemeHandler.shared.registerBundledFeedAssets() diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 4952eb46a404..b2a18cfd38e5 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -4865,7 +4865,11 @@ final class BrowserPanel: Panel, ObservableObject { let diffURL = CmuxDiffViewerURLSchemeHandler.diffViewerURL(token: token, requestPath: requestPath) { hiddenWebViewDiscardManager.updateRestoredSessionRenderIntent(snapshot.shouldRenderWebView) setMuted(snapshot.isMuted) - setOmnibarVisible(snapshot.omnibarVisible ?? false) + setOmnibarVisible( + token == CmuxDiffViewerURLSchemeHandler.bundledFeedToken + ? false + : snapshot.omnibarVisible ?? false + ) currentURL = diffURL let shouldRenderRestoredWebView = snapshot.shouldRenderWebView && BrowserAvailabilitySettings.isEnabled() guard shouldRenderRestoredWebView else { @@ -4877,11 +4881,15 @@ final class BrowserPanel: Panel, ObservableObject { return } - let restoredURL = Self.remappedAppPricingSessionRestoreURL(Self.sanitizedSessionHistoryURL(snapshot.urlString)) + let sanitizedURL = Self.sanitizedSessionHistoryURL(snapshot.urlString) + let isLegacyPackagedFeed = FeedSurfaceBridge.isLegacyPackagedFeedURL(sanitizedURL) + let restoredURL = isLegacyPackagedFeed + ? FeedSurfaceBridge.feedURL() + : Self.remappedAppPricingSessionRestoreURL(sanitizedURL) let shouldRenderRestoredWebView = snapshot.shouldRenderWebView && BrowserAvailabilitySettings.isEnabled() hiddenWebViewDiscardManager.updateRestoredSessionRenderIntent(snapshot.shouldRenderWebView) setMuted(snapshot.isMuted) - setOmnibarVisible(snapshot.omnibarVisible ?? true) + setOmnibarVisible(isLegacyPackagedFeed ? false : snapshot.omnibarVisible ?? true) restoreSessionNavigationHistory( backHistoryURLStrings: snapshot.backHistoryURLStrings ?? [], diff --git a/Sources/Workspace+CustomLayout.swift b/Sources/Workspace+CustomLayout.swift index 3db593176a46..e652aa6decab 100644 --- a/Sources/Workspace+CustomLayout.swift +++ b/Sources/Workspace+CustomLayout.swift @@ -191,7 +191,8 @@ extension Workspace { inPane: paneId, url: url, focus: false, - creationPolicy: .restoration + creationPolicy: .restoration, + omnibarVisible: surface.omnibarVisible ?? true ) { _ = closePanel(panelId, force: true) if let name = surface.name { setPanelCustomTitle(panelId: panel.id, title: name) } @@ -240,7 +241,8 @@ extension Workspace { inPane: paneId, url: url, focus: false, - creationPolicy: .restoration + creationPolicy: .restoration, + omnibarVisible: surface.omnibarVisible ?? true ) { if let name = surface.name { setPanelCustomTitle(panelId: panel.id, title: name) } if surface.focus == true { focusPanelId = panel.id } diff --git a/Sources/WorkspaceConfigActionCapture.swift b/Sources/WorkspaceConfigActionCapture.swift index 2b9cf8450df3..549a641c9063 100644 --- a/Sources/WorkspaceConfigActionCapture.swift +++ b/Sources/WorkspaceConfigActionCapture.swift @@ -204,6 +204,7 @@ extension Workspace { surface.name = customName surface.url = browser.currentURL?.absoluteString surface.focus = focus + surface.omnibarVisible = browser.isOmnibarVisible return surface case let project as ProjectPanel: var surface = CmuxSurfaceDefinition(type: .project) From 63fdae2f44e12eafef5022ebaba6f30d45dffc2b Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 15:51:54 -0700 Subject: [PATCH 06/23] Refine React Feed visual system --- .../webviews-app/assets/feedSurface.css | 2 +- .../webviews-app/chunks/feedSurface.mjs | 2 +- Sources/Feed/FeedSurfaceBridge.swift | 20 ++ webviews/src/feed/App.tsx | 39 ++- webviews/src/feed/styles.css | 268 +++++++++++++++--- webviews/src/feed/types.ts | 1 + webviews/test/feed.test.tsx | 16 ++ 7 files changed, 305 insertions(+), 43 deletions(-) diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css index 321c6e3ede21..8f21c112aba2 100644 --- a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -1 +1 @@ -:root{color-scheme:light dark;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif}*{box-sizing:border-box}html,body,#root{width:100%;min-height:100%;margin:0}body{background:transparent;color:CanvasText}button{font:inherit}.feed-shell{min-height:100vh;padding:20px clamp(14px,4vw,42px) 40px}.feed-loading{opacity:.5}.feed-header{align-items:center;display:flex;justify-content:space-between;margin:0 auto 18px;max-width:880px}.feed-header h1{font-size:20px;margin:0}.feed-filter{background:color-mix(in srgb,CanvasText 7%,transparent);border-radius:9px;display:flex;gap:2px;padding:3px}.feed-filter button{background:transparent;border:0;border-radius:7px;color:color-mix(in srgb,CanvasText 68%,transparent);padding:5px 10px}.feed-filter button[aria-selected=true]{background:color-mix(in srgb,Canvas 86%,CanvasText 14%);color:CanvasText;box-shadow:0 1px 3px #0002}.feed-list{display:grid;gap:10px;margin:0 auto;max-width:880px}.feed-card{background:color-mix(in srgb,Canvas 93%,CanvasText 7%);border:1px solid color-mix(in srgb,CanvasText 10%,transparent);border-radius:12px;padding:14px}.feed-card-pending{border-color:color-mix(in srgb,#4c8dff 45%,transparent);box-shadow:0 5px 20px #0000000c}.feed-card-heading{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.feed-card-heading h2{font-size:14px;margin:3px 0 0}.feed-card-heading time,.feed-source,.feed-cwd{color:color-mix(in srgb,CanvasText 52%,transparent);font-size:11px}.feed-source{font-weight:600;text-transform:capitalize}.feed-cwd{font-family:ui-monospace,monospace;margin-top:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:color-mix(in srgb,CanvasText 6%,transparent);border-radius:8px;font:12px/1.5 ui-monospace,monospace;margin:12px 0 0;max-height:280px;overflow:auto;padding:10px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:color-mix(in srgb,CanvasText 8%,transparent);border:1px solid color-mix(in srgb,CanvasText 12%,transparent);border-radius:7px;color:CanvasText;cursor:pointer;padding:6px 10px}.feed-actions .primary,.feed-question-actions .primary{background:#2678ed;border-color:#2678ed;color:#fff}.feed-actions .danger{color:#e05252}.feed-question-actions{display:grid;gap:8px;margin-top:12px}.feed-question{display:grid;gap:7px}.feed-question-prompt{font-size:12px;font-weight:600}.feed-question input{background:color-mix(in srgb,CanvasText 6%,transparent);border:1px solid color-mix(in srgb,CanvasText 12%,transparent);border-radius:7px;color:CanvasText;font:inherit;padding:7px 9px;width:100%}.feed-options{display:grid;gap:6px}.feed-options button{display:grid;gap:2px;text-align:left}.feed-options button[aria-pressed=true]{border-color:#4c8dff;background:color-mix(in srgb,#4c8dff 16%,transparent)}.feed-options span{color:color-mix(in srgb,CanvasText 60%,transparent);font-size:11px}.feed-empty{color:color-mix(in srgb,CanvasText 55%,transparent);padding:80px 20px;text-align:center}.feed-error{background:#e0525220;border:1px solid #e0525260;border-radius:8px;margin:0 auto 10px;max-width:880px;padding:8px 10px}.feed-load-more{justify-self:center;margin-top:4px}button:disabled{cursor:default;opacity:.45}button:focus-visible{outline:2px solid #4c8dff;outline-offset:2px}.feed-question input:focus-visible{outline:2px solid #4c8dff;outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:12px}.feed-filter{align-self:flex-start}} +:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-border: color-mix(in srgb, CanvasText 14%, transparent);--feed-border-strong: color-mix(in srgb, CanvasText 38%, transparent);--feed-fill: color-mix(in srgb, CanvasText 5%, transparent);--feed-fill-hover: color-mix(in srgb, CanvasText 9%, transparent);--feed-muted: color-mix(in srgb, CanvasText 56%, transparent)}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:CanvasText}button,input{font:inherit}.feed-shell{min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);border-radius:4px;display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;border-radius:2px;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:CanvasText;color:Canvas}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,Canvas 96%,CanvasText 4%);border:1px solid var(--feed-border);border-radius:4px;padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);border-radius:3px;font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);border-radius:3px;color:CanvasText;cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:CanvasText;border-color:CanvasText;color:Canvas}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);border-radius:3px;color:CanvasText;padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:CanvasText;color:Canvas}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,Canvas 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);border-radius:3px;margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid CanvasText;outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index aefa42b85d2e..6565f6d1d995 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as A,i as F,j as n,c as L,a as B}from"./vendor.mjs";import{c as T}from"./router.mjs";let I=null;const E=new Set;let C=null;function R(t){I=t;for(const e of E)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&R(t.snapshot)}});async function $(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function U(){return C||(C=$("feed.subscribe").then(R).catch(t=>{throw C=null,t}),C)}const M={getSnapshot:()=>I,subscribe(t){return E.add(t),U(),()=>E.delete(t)}};function W(){const t=A.c(42),e=F.useSyncExternalStore(M.subscribe,M.getSnapshot,M.getSnapshot),[s,i]=F.useState("actionable"),[l,r]=F.useState(null);if(!e){let p;return t[0]===Symbol.for("react.memo_cache_sentinel")?(p=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=p):p=t[0],p}let c;t[1]!==s||t[2]!==e.items?(c=s==="actionable"?e.items.filter(K):e.items,t[1]=s,t[2]=e.items,t[3]=c):c=t[3];const o=c;let d;t[4]!==e.copy.requestFailed?(d=async(p,j)=>{r(null);try{await $(p,j)}catch{r(e.copy.requestFailed)}},t[4]=e.copy.requestFailed,t[5]=d):d=t[5];const a=d;let m;t[6]!==e.copy.feed?(m=n.jsx("h1",{children:e.copy.feed}),t[6]=e.copy.feed,t[7]=m):m=t[7];const u=s==="actionable";let f;t[8]===Symbol.for("react.memo_cache_sentinel")?(f=()=>i("actionable"),t[8]=f):f=t[8];let h;t[9]!==e.copy.actionable||t[10]!==u?(h=n.jsx("button",{"aria-selected":u,onClick:f,role:"tab",children:e.copy.actionable}),t[9]=e.copy.actionable,t[10]=u,t[11]=h):h=t[11];const w=s==="activity";let g;t[12]===Symbol.for("react.memo_cache_sentinel")?(g=()=>i("activity"),t[12]=g):g=t[12];let y;t[13]!==e.copy.activity||t[14]!==w?(y=n.jsx("button",{"aria-selected":w,onClick:g,role:"tab",children:e.copy.activity}),t[13]=e.copy.activity,t[14]=w,t[15]=y):y=t[15];let b;t[16]!==h||t[17]!==y?(b=n.jsxs("div",{className:"feed-filter",role:"tablist",children:[h,y]}),t[16]=h,t[17]=y,t[18]=b):b=t[18];let v;t[19]!==m||t[20]!==b?(v=n.jsxs("header",{className:"feed-header",children:[m,b]}),t[19]=m,t[20]=b,t[21]=v):v=t[21];let k;t[22]!==l?(k=l&&n.jsx("div",{className:"feed-error",role:"alert",children:l}),t[22]=l,t[23]=k):k=t[23];let N;t[24]!==s||t[25]!==o||t[26]!==a||t[27]!==e.copy?(N=o.length===0?n.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):o.map(p=>n.jsx(Q,{item:p,copy:e.copy,perform:a},p.id)),t[24]=s,t[25]=o,t[26]=a,t[27]=e.copy,t[28]=N):N=t[28];let S;t[29]!==a||t[30]!==e.copy.loadOlder||t[31]!==e.copy.loadingOlder||t[32]!==e.hasMore||t[33]!==e.isLoadingOlder?(S=e.hasMore&&n.jsx("button",{className:"feed-load-more",disabled:e.isLoadingOlder,onClick:()=>a("feed.loadOlder",{}),children:e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[29]=a,t[30]=e.copy.loadOlder,t[31]=e.copy.loadingOlder,t[32]=e.hasMore,t[33]=e.isLoadingOlder,t[34]=S):S=t[34];let _;t[35]!==N||t[36]!==S?(_=n.jsxs("section",{className:"feed-list",children:[N,S]}),t[35]=N,t[36]=S,t[37]=_):_=t[37];let x;return t[38]!==v||t[39]!==k||t[40]!==_?(x=n.jsxs("main",{className:"feed-shell",children:[v,k,_]}),t[38]=v,t[39]=k,t[40]=_,t[41]=x):x=t[41],x}function K(t){return t.status==="pending"}function Q(t){const e=A.c(32),{item:s,copy:i,perform:l}=t;let r;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(r=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=r):r=e[3];const c=r,o=`feed-card feed-card-${s.status}`;let d;e[4]!==s.source?(d=n.jsx("span",{className:"feed-source",children:s.source}),e[4]=s.source,e[5]=d):d=e[5];let a;e[6]!==c?(a=n.jsx("h2",{children:c}),e[6]=c,e[7]=a):a=e[7];let m;e[8]!==d||e[9]!==a?(m=n.jsxs("div",{children:[d,a]}),e[8]=d,e[9]=a,e[10]=m):m=e[10];let u;e[11]!==s.created_at?(u=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[11]=s.created_at,e[12]=u):u=e[12];let f;e[13]!==u?(f=n.jsx("time",{children:u}),e[13]=u,e[14]=f):f=e[14];let h;e[15]!==m||e[16]!==f?(h=n.jsxs("div",{className:"feed-card-heading",children:[m,f]}),e[15]=m,e[16]=f,e[17]=h):h=e[17];let w;e[18]!==s.cwd?(w=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[18]=s.cwd,e[19]=w):w=e[19];let g;e[20]!==s?(g=n.jsx(z,{item:s}),e[20]=s,e[21]=g):g=e[21];let y;e[22]!==i||e[23]!==s||e[24]!==l?(y=s.status==="pending"&&n.jsx(D,{item:s,copy:i,perform:l}),e[22]=i,e[23]=s,e[24]=l,e[25]=y):y=e[25];let b;return e[26]!==g||e[27]!==y||e[28]!==o||e[29]!==h||e[30]!==w?(b=n.jsxs("article",{className:o,children:[h,w,g,y]}),e[26]=g,e[27]=y,e[28]=o,e[29]=h,e[30]=w,e[31]=b):b=e[31],b}function z(t){const e=A.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function D(t){const e=A.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let r;e[0]!==s.allowed_permission_modes?(r=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=r):r=e[1];let c;e[2]!==r?(c=new Set(r),e[2]=r,e[3]=c):c=e[3];const o=c;let d;e[4]!==i||e[5]!==s.id||e[6]!==o||e[7]!==l?(d=o.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=o,e[7]=l,e[8]=d):d=e[8];let a;e[9]!==i||e[10]!==s.id||e[11]!==o||e[12]!==l?(a=o.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=o,e[12]=l,e[13]=a):a=e[13];let m;e[14]!==i||e[15]!==s.id||e[16]!==o||e[17]!==l?(m=o.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=o,e[17]=l,e[18]=m):m=e[18];let u;e[19]!==i||e[20]!==s.id||e[21]!==o||e[22]!==l?(u=o.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=o,e[22]=l,e[23]=u):u=e[23];let f;e[24]!==i||e[25]!==s.id||e[26]!==o||e[27]!==l?(f=o.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=o,e[27]=l,e[28]=f):f=e[28];let h;return e[29]!==d||e[30]!==a||e[31]!==m||e[32]!==u||e[33]!==f?(h=n.jsxs("div",{className:"feed-actions",children:[d,a,m,u,f]}),e[29]=d,e[30]=a,e[31]=m,e[32]=u,e[33]=f,e[34]=h):h=e[34],h}if(s.kind==="exitPlan"){let r;e[35]!==s.id||e[36]!==l?(r=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=r):r=e[37];let c;e[38]!==i.planManual||e[39]!==r?(c=n.jsx("button",{onClick:r,children:i.planManual}),e[38]=i.planManual,e[39]=r,e[40]=c):c=e[40];let o;e[41]!==s.id||e[42]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=o):o=e[43];let d;e[44]!==i.planAuto||e[45]!==o?(d=n.jsx("button",{onClick:o,children:i.planAuto}),e[44]=i.planAuto,e[45]=o,e[46]=d):d=e[46];let a;e[47]!==s.id||e[48]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=a):a=e[49];let m;e[50]!==i.planUltraplan||e[51]!==a?(m=n.jsx("button",{className:"primary",onClick:a,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=a,e[52]=m):m=e[52];let u;return e[53]!==c||e[54]!==d||e[55]!==m?(u=n.jsxs("div",{className:"feed-actions",children:[c,d,m]}),e[53]=c,e[54]=d,e[55]=m,e[56]=u):u=e[56],u}if(s.kind==="question"){let r;e[57]!==s.questions?(r=s.questions??[],e[57]=s.questions,e[58]=r):r=e[58];let c;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==r?(c=n.jsx(H,{item:s,questions:r,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=r,e[63]=c):c=e[63],c}return null}function H(t){const e=A.c(34),{item:s,questions:i,copy:l,perform:r}=t;let c;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(c=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=c):c=e[3];const o=c;let d;e[4]===Symbol.for("react.memo_cache_sentinel")?(d={},e[4]=d):d=e[4];const[a,m]=F.useState(d);let u;e[5]===Symbol.for("react.memo_cache_sentinel")?(u={},e[5]=u):u=e[5];const[f,h]=F.useState(u);let w;e[6]===Symbol.for("react.memo_cache_sentinel")?(w=(x,p)=>{m(j=>{const q=j[x.id]??[],O=x.multi_select?q.includes(p)?q.filter(P=>P!==p):[...q,p]:[p];return{...j,[x.id]:O}})},e[6]=w):w=e[6];const g=w;let y;if(e[7]!==f||e[8]!==o||e[9]!==a){let x;e[11]!==f||e[12]!==a?(x=p=>{const j=f[p.id]?.trim();if(j)return[j];const q=a[p.id]??[],O=p.options.filter(P=>q.includes(P.id)).map(G);return O.length>0?[O.join(", ")]:[]},e[11]=f,e[12]=a,e[13]=x):x=e[13],y=o.flatMap(x),e[7]=f,e[8]=o,e[9]=a,e[10]=y}else y=e[10];const b=y;let v;if(e[14]!==l.questionPlaceholder||e[15]!==f||e[16]!==o||e[17]!==a){let x;e[19]!==l.questionPlaceholder||e[20]!==f||e[21]!==a?(x=p=>n.jsxs("div",{className:"feed-question",children:[p.prompt&&n.jsx("div",{className:"feed-question-prompt",children:p.prompt}),n.jsx("div",{className:"feed-options",children:p.options.map(j=>n.jsxs("button",{"aria-pressed":(a[p.id]??[]).includes(j.id),onClick:()=>g(p,j.id),children:[n.jsx("strong",{children:j.label}),j.description&&n.jsx("span",{children:j.description})]},j.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:j=>h(q=>({...q,[p.id]:j.target.value})),placeholder:l.questionPlaceholder,value:f[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=f,e[21]=a,e[22]=x):x=e[22],v=o.map(x),e[14]=l.questionPlaceholder,e[15]=f,e[16]=o,e[17]=a,e[18]=v}else v=e[18];const k=b.length===0;let N;e[23]!==b||e[24]!==s.id||e[25]!==r?(N=()=>r("feed.question.reply",{itemId:s.id,selections:b}),e[23]=b,e[24]=s.id,e[25]=r,e[26]=N):N=e[26];let S;e[27]!==l.questionSubmit||e[28]!==k||e[29]!==N?(S=n.jsx("button",{className:"primary",disabled:k,onClick:N,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=k,e[29]=N,e[30]=S):S=e[30];let _;return e[31]!==v||e[32]!==S?(_=n.jsxs("div",{className:"feed-question-actions",children:[v,S]}),e[31]=v,e[32]=S,e[33]=_):_=e[33],_}function G(t){return t.label}function X(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=T(()=>n.jsx(W,{}));L.createRoot(t).render(n.jsx(B,{router:e}))}export{X as mountFeedSurface}; +import{b as C,i as I,j as n,c as R,a as U}from"./vendor.mjs";import{c as B}from"./router.mjs";let E=null;const M=new Set;let F=null;function $(t){E=t;for(const e of M)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&$(t.snapshot)}});async function L(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function T(){return F||(F=L("feed.subscribe").then($).catch(t=>{throw F=null,t}),F)}const A={getSnapshot:()=>E,subscribe(t){return M.add(t),T(),()=>M.delete(t)}};function W(){const t=C.c(43),e=I.useSyncExternalStore(A.subscribe,A.getSnapshot,A.getSnapshot),[s,i]=I.useState("actionable"),[l,c]=I.useState(null);if(!e){let p;return t[0]===Symbol.for("react.memo_cache_sentinel")?(p=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=p):p=t[0],p}let d;t[1]!==s||t[2]!==e.items?(d=s==="actionable"?e.items.filter(H):e.items,t[1]=s,t[2]=e.items,t[3]=d):d=t[3];const a=d;let u;t[4]!==e.copy.requestFailed?(u=async(p,g)=>{c(null);try{await L(p,g)}catch{c(e.copy.requestFailed)}},t[4]=e.copy.requestFailed,t[5]=u):u=t[5];const o=u;let r;t[6]!==e.copy.feed?(r=n.jsx("h1",{children:e.copy.feed}),t[6]=e.copy.feed,t[7]=r):r=t[7];const f=s==="actionable";let m;t[8]===Symbol.for("react.memo_cache_sentinel")?(m=()=>i("actionable"),t[8]=m):m=t[8];let h;t[9]!==e.copy.actionable||t[10]!==f?(h=n.jsx("button",{"aria-selected":f,onClick:m,role:"tab",children:e.copy.actionable}),t[9]=e.copy.actionable,t[10]=f,t[11]=h):h=t[11];const w=s==="activity";let v;t[12]===Symbol.for("react.memo_cache_sentinel")?(v=()=>i("activity"),t[12]=v):v=t[12];let y;t[13]!==e.copy.activity||t[14]!==w?(y=n.jsx("button",{"aria-selected":w,onClick:v,role:"tab",children:e.copy.activity}),t[13]=e.copy.activity,t[14]=w,t[15]=y):y=t[15];let x;t[16]!==h||t[17]!==y?(x=n.jsxs("div",{className:"feed-filter",role:"tablist",children:[h,y]}),t[16]=h,t[17]=y,t[18]=x):x=t[18];let b;t[19]!==r||t[20]!==x?(b=n.jsxs("header",{className:"feed-header",children:[r,x]}),t[19]=r,t[20]=x,t[21]=b):b=t[21];let k;t[22]!==l?(k=l&&n.jsx("div",{className:"feed-error",role:"alert",children:l}),t[22]=l,t[23]=k):k=t[23];let N;t[24]!==s||t[25]!==a||t[26]!==o||t[27]!==e.copy||t[28]!==e.sourceIcons?(N=a.length===0?n.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):a.map(p=>n.jsx(K,{item:p,copy:e.copy,perform:o,sourceIcon:e.sourceIcons[p.source]},p.id)),t[24]=s,t[25]=a,t[26]=o,t[27]=e.copy,t[28]=e.sourceIcons,t[29]=N):N=t[29];let S;t[30]!==o||t[31]!==e.copy.loadOlder||t[32]!==e.copy.loadingOlder||t[33]!==e.hasMore||t[34]!==e.isLoadingOlder?(S=e.hasMore&&n.jsx("button",{className:"feed-load-more",disabled:e.isLoadingOlder,onClick:()=>o("feed.loadOlder",{}),children:e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[30]=o,t[31]=e.copy.loadOlder,t[32]=e.copy.loadingOlder,t[33]=e.hasMore,t[34]=e.isLoadingOlder,t[35]=S):S=t[35];let _;t[36]!==N||t[37]!==S?(_=n.jsxs("section",{className:"feed-list",children:[N,S]}),t[36]=N,t[37]=S,t[38]=_):_=t[38];let j;return t[39]!==b||t[40]!==k||t[41]!==_?(j=n.jsxs("main",{className:"feed-shell",children:[b,k,_]}),t[39]=b,t[40]=k,t[41]=_,t[42]=j):j=t[42],j}function H(t){return t.status==="pending"}function K(t){const e=C.c(33),{item:s,copy:i,perform:l,sourceIcon:c}=t;let d;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(d=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=d):d=e[3];const a=d,u=`feed-card feed-card-${s.status}`;let o;e[4]!==s.source||e[5]!==c?(o=n.jsx(z,{icon:c,source:s.source}),e[4]=s.source,e[5]=c,e[6]=o):o=e[6];let r;e[7]!==a?(r=n.jsx("h2",{children:a}),e[7]=a,e[8]=r):r=e[8];let f;e[9]!==o||e[10]!==r?(f=n.jsxs("div",{className:"feed-card-title",children:[o,r]}),e[9]=o,e[10]=r,e[11]=f):f=e[11];let m;e[12]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[12]=s.created_at,e[13]=m):m=e[13];let h;e[14]!==m?(h=n.jsx("time",{children:m}),e[14]=m,e[15]=h):h=e[15];let w;e[16]!==f||e[17]!==h?(w=n.jsxs("div",{className:"feed-card-heading",children:[f,h]}),e[16]=f,e[17]=h,e[18]=w):w=e[18];let v;e[19]!==s.cwd?(v=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[19]=s.cwd,e[20]=v):v=e[20];let y;e[21]!==s?(y=n.jsx(D,{item:s}),e[21]=s,e[22]=y):y=e[22];let x;e[23]!==i||e[24]!==s||e[25]!==l?(x=s.status==="pending"&&n.jsx(J,{item:s,copy:i,perform:l}),e[23]=i,e[24]=s,e[25]=l,e[26]=x):x=e[26];let b;return e[27]!==y||e[28]!==x||e[29]!==u||e[30]!==w||e[31]!==v?(b=n.jsxs("article",{className:u,children:[w,v,y,x]}),e[27]=y,e[28]=x,e[29]=u,e[30]=w,e[31]=v,e[32]=b):b=e[32],b}const Q={claude:"Claude",codex:"Codex","hermes-agent":"Hermes",opencode:"OpenCode",pi:"Pi"};function z(t){const e=C.c(15),{icon:s,source:i}=t,l=Q[i]??i;let c;e[0]!==s?(c=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=c):c=e[1];const d=c,a=s?void 0:"";let u;e[2]!==s||e[3]!==l?(u=!s&&l.slice(0,1).toUpperCase(),e[2]=s,e[3]=l,e[4]=u):u=e[4];let o;e[5]!==d||e[6]!==a||e[7]!==u?(o=n.jsx("span",{className:"feed-source-logo","data-fallback":a,style:d,"aria-hidden":"true",children:u}),e[5]=d,e[6]=a,e[7]=u,e[8]=o):o=e[8];let r;e[9]!==l?(r=n.jsx("span",{children:l}),e[9]=l,e[10]=r):r=e[10];let f;return e[11]!==i||e[12]!==o||e[13]!==r?(f=n.jsxs("span",{className:"feed-source","data-feed-source":i,children:[o,r]}),e[11]=i,e[12]=o,e[13]=r,e[14]=f):f=e[14],f}function D(t){const e=C.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function J(t){const e=C.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let c;e[0]!==s.allowed_permission_modes?(c=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=c):c=e[1];let d;e[2]!==c?(d=new Set(c),e[2]=c,e[3]=d):d=e[3];const a=d;let u;e[4]!==i||e[5]!==s.id||e[6]!==a||e[7]!==l?(u=a.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=a,e[7]=l,e[8]=u):u=e[8];let o;e[9]!==i||e[10]!==s.id||e[11]!==a||e[12]!==l?(o=a.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=a,e[12]=l,e[13]=o):o=e[13];let r;e[14]!==i||e[15]!==s.id||e[16]!==a||e[17]!==l?(r=a.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=a,e[17]=l,e[18]=r):r=e[18];let f;e[19]!==i||e[20]!==s.id||e[21]!==a||e[22]!==l?(f=a.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=a,e[22]=l,e[23]=f):f=e[23];let m;e[24]!==i||e[25]!==s.id||e[26]!==a||e[27]!==l?(m=a.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=a,e[27]=l,e[28]=m):m=e[28];let h;return e[29]!==u||e[30]!==o||e[31]!==r||e[32]!==f||e[33]!==m?(h=n.jsxs("div",{className:"feed-actions",children:[u,o,r,f,m]}),e[29]=u,e[30]=o,e[31]=r,e[32]=f,e[33]=m,e[34]=h):h=e[34],h}if(s.kind==="exitPlan"){let c;e[35]!==s.id||e[36]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=c):c=e[37];let d;e[38]!==i.planManual||e[39]!==c?(d=n.jsx("button",{onClick:c,children:i.planManual}),e[38]=i.planManual,e[39]=c,e[40]=d):d=e[40];let a;e[41]!==s.id||e[42]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=a):a=e[43];let u;e[44]!==i.planAuto||e[45]!==a?(u=n.jsx("button",{onClick:a,children:i.planAuto}),e[44]=i.planAuto,e[45]=a,e[46]=u):u=e[46];let o;e[47]!==s.id||e[48]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=o):o=e[49];let r;e[50]!==i.planUltraplan||e[51]!==o?(r=n.jsx("button",{className:"primary",onClick:o,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=o,e[52]=r):r=e[52];let f;return e[53]!==d||e[54]!==u||e[55]!==r?(f=n.jsxs("div",{className:"feed-actions",children:[d,u,r]}),e[53]=d,e[54]=u,e[55]=r,e[56]=f):f=e[56],f}if(s.kind==="question"){let c;e[57]!==s.questions?(c=s.questions??[],e[57]=s.questions,e[58]=c):c=e[58];let d;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==c?(d=n.jsx(G,{item:s,questions:c,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=c,e[63]=d):d=e[63],d}return null}function G(t){const e=C.c(34),{item:s,questions:i,copy:l,perform:c}=t;let d;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(d=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=d):d=e[3];const a=d;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[o,r]=I.useState(u);let f;e[5]===Symbol.for("react.memo_cache_sentinel")?(f={},e[5]=f):f=e[5];const[m,h]=I.useState(f);let w;e[6]===Symbol.for("react.memo_cache_sentinel")?(w=(j,p)=>{r(g=>{const q=g[j.id]??[],O=j.multi_select?q.includes(p)?q.filter(P=>P!==p):[...q,p]:[p];return{...g,[j.id]:O}})},e[6]=w):w=e[6];const v=w;let y;if(e[7]!==m||e[8]!==a||e[9]!==o){let j;e[11]!==m||e[12]!==o?(j=p=>{const g=m[p.id]?.trim();if(g)return[g];const q=o[p.id]??[],O=p.options.filter(P=>q.includes(P.id)).map(V);return O.length>0?[O.join(", ")]:[]},e[11]=m,e[12]=o,e[13]=j):j=e[13],y=a.flatMap(j),e[7]=m,e[8]=a,e[9]=o,e[10]=y}else y=e[10];const x=y;let b;if(e[14]!==l.questionPlaceholder||e[15]!==m||e[16]!==a||e[17]!==o){let j;e[19]!==l.questionPlaceholder||e[20]!==m||e[21]!==o?(j=p=>n.jsxs("div",{className:"feed-question",children:[p.prompt&&n.jsx("div",{className:"feed-question-prompt",children:p.prompt}),n.jsx("div",{className:"feed-options",children:p.options.map(g=>n.jsxs("button",{"aria-pressed":(o[p.id]??[]).includes(g.id),onClick:()=>v(p,g.id),children:[n.jsx("strong",{children:g.label}),g.description&&n.jsx("span",{children:g.description})]},g.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:g=>h(q=>({...q,[p.id]:g.target.value})),placeholder:l.questionPlaceholder,value:m[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=m,e[21]=o,e[22]=j):j=e[22],b=a.map(j),e[14]=l.questionPlaceholder,e[15]=m,e[16]=a,e[17]=o,e[18]=b}else b=e[18];const k=x.length===0;let N;e[23]!==x||e[24]!==s.id||e[25]!==c?(N=()=>c("feed.question.reply",{itemId:s.id,selections:x}),e[23]=x,e[24]=s.id,e[25]=c,e[26]=N):N=e[26];let S;e[27]!==l.questionSubmit||e[28]!==k||e[29]!==N?(S=n.jsx("button",{className:"primary",disabled:k,onClick:N,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=k,e[29]=N,e[30]=S):S=e[30];let _;return e[31]!==b||e[32]!==S?(_=n.jsxs("div",{className:"feed-question-actions",children:[b,S]}),e[31]=b,e[32]=S,e[33]=_):_=e[33],_}function V(t){return t.label}function Z(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=B(()=>n.jsx(W,{}));R.createRoot(t).render(n.jsx(U,{router:e}))}export{Z as mountFeedSurface}; diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index e71a0ed605f6..506fe3ad0deb 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -173,6 +173,7 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { let store = FeedCoordinator.shared.store return [ "items": (store?.items ?? []).map(itemDictionary), + "sourceIcons": Self.sourceIconDataURLs, "hasMore": store?.hasMorePersistedItems ?? false, "isLoadingOlder": store?.isLoadingOlderItems ?? false, "copy": [ @@ -198,6 +199,25 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { ] } + private static let sourceIconDataURLs: [String: String] = { + let assetNames: [WorkstreamSource: String] = [ + .claude: "AgentIcons/Claude", + .codex: "AgentIcons/Codex", + .opencode: "AgentIcons/OpenCode", + .pi: "AgentIcons/Pi", + .hermesAgent: "AgentIcons/HermesAgent", + ] + return assetNames.reduce(into: [:]) { result, entry in + guard let image = NSImage(named: NSImage.Name(entry.value)), + let tiffData = image.tiffRepresentation, + let bitmap = NSBitmapImageRep(data: tiffData), + let pngData = bitmap.representation(using: .png, properties: [:]) else { + return + } + result[entry.key.rawValue] = "data:image/png;base64,\(pngData.base64EncodedString())" + } + }() + private func itemDictionary(_ item: WorkstreamItem) -> [String: Any] { var dictionary = FeedSocketEncoding.itemDict(item) guard case .permissionRequest(_, _, let toolInputJSON, _) = item.payload else { diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index 857776497f89..3a05457dbf4b 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -1,5 +1,6 @@ import { useState, useSyncExternalStore } from "react"; import { callFeedNative, feedSnapshotStore } from "./bridge"; +import type { CSSProperties } from "react"; import type { FeedItem, FeedQuestion } from "./types"; import "./styles.css"; @@ -48,7 +49,13 @@ export function FeedApp() { {filter === "actionable" ? snapshot.copy.emptyActionable : snapshot.copy.emptyActivity} ) : items.map((item) => ( - + ))} {snapshot.hasMore && ( )} diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index 381a5e9b832d..d046829626f5 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -2,7 +2,7 @@ import { afterEach, expect, test } from "bun:test"; import { JSDOM } from "jsdom"; import { flushSync } from "react-dom"; import { createRoot, type Root } from "react-dom/client"; -import { FeedApp } from "../src/feed/App"; +import { FeedApp, feedActivityPageSize } from "../src/feed/App"; let root: Root | null = null; let dom: JSDOM | null = null; @@ -60,7 +60,10 @@ test("Feed React surface invokes the typed permission primitive", async () => { }, { created_at: "2026-07-13T12:02:00Z", id: "item-3", kind: "toolUse", source: "opencode", status: "telemetry", title: "Run tests", workstream_id: "opencode-session", - }], + }, ...Array.from({ length: 45 }, (_, index) => ({ + created_at: "2026-07-13T12:03:00Z", id: `history-${index}`, kind: "toolUse", + source: "codex", status: "telemetry" as const, title: `History ${index}`, workstream_id: "codex-history", + }))], } }; } return { ok: true, value: { accepted: true } }; @@ -75,6 +78,10 @@ test("Feed React surface invokes the typed permission primitive", async () => { flushSync(() => [...container.querySelectorAll("button")].find((button) => button.textContent === "All Activity")?.click()); expect(container.querySelector('[data-feed-source="codex"]')?.textContent).toContain("Codex"); expect(container.querySelector('[data-feed-source="opencode"]')?.textContent).toContain("OpenCode"); + expect(feedActivityPageSize).toBe(40); + expect(container.querySelectorAll(".feed-card")).toHaveLength(feedActivityPageSize); + flushSync(() => [...container.querySelectorAll("button")].find((button) => button.textContent === "Load older activity")?.click()); + expect(container.querySelectorAll(".feed-card")).toHaveLength(48); const allowOnce = [...container.querySelectorAll("button")].find((button) => button.textContent === "Allow Once")!; allowOnce.click(); await waitFor(() => calls.some((call: any) => call.method === "feed.permission.reply")); From faa1cd86f6f96edbdcc5f24041f53ef876c7bec6 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 16:10:47 -0700 Subject: [PATCH 10/23] Preserve Feed capability across session restore --- Sources/Panels/BrowserPanel.swift | 9 +++++++ Sources/Workspace.swift | 9 ++++--- cmuxTests/FeedCoordinatorTests.swift | 36 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 1855fdbd5d3c..41a51a424389 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1844,6 +1844,15 @@ enum BrowserInsecureHTTPNavigationResolution { enum BrowserNativeCapability: Hashable, Sendable { case feed + + static func restored(from snapshot: SessionBrowserPanelSnapshot?) -> Set { + guard let snapshot else { return [] } + if snapshot.diffViewerToken == CmuxDiffViewerURLSchemeHandler.bundledFeedToken { + return [.feed] + } + let restoredURL = snapshot.urlString.flatMap(URL.init(string:)) + return FeedSurfaceBridge.isLegacyPackagedFeedURL(restoredURL) ? [.feed] : [] + } } final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { diff --git a/Sources/Workspace.swift b/Sources/Workspace.swift index 3ffaa507d7dc..b72b0bd9254e 100644 --- a/Sources/Workspace.swift +++ b/Sources/Workspace.swift @@ -1599,7 +1599,8 @@ extension Workspace { focus: false, preferredProfileID: snapshot.browser?.profileID, creationPolicy: .restoration, - transparentBackground: snapshot.browser?.transparentBackground ?? false + transparentBackground: snapshot.browser?.transparentBackground ?? false, + nativeCapabilities: BrowserNativeCapability.restored(from: snapshot.browser) ) else { return nil } @@ -7999,7 +8000,8 @@ final class Workspace: Identifiable, ObservableObject { creationPolicy: BrowserPanelCreationPolicy = .userInitiated, omnibarVisible: Bool = true, transparentBackground: Bool = false, - bypassRemoteProxy: Bool = false + bypassRemoteProxy: Bool = false, + nativeCapabilities: Set? = nil ) -> BrowserPanel? { // A remote tmux mirror workspace is a 1:1 view of a tmux session (which // has no browser concept). A local browser tab here would be an orphan @@ -8035,7 +8037,8 @@ final class Workspace: Identifiable, ObservableObject { proxyEndpoint: remoteProxyEndpoint, bypassRemoteProxy: bypassRemoteProxy, isRemoteWorkspace: isRemoteWorkspace, - remoteWebsiteDataStoreIdentifier: isRemoteWorkspace && !bypassRemoteProxy ? id : nil + remoteWebsiteDataStoreIdentifier: isRemoteWorkspace && !bypassRemoteProxy ? id : nil, + nativeCapabilities: nativeCapabilities ) configureBrowserPanel(browserPanel) panels[browserPanel.id] = browserPanel diff --git a/cmuxTests/FeedCoordinatorTests.swift b/cmuxTests/FeedCoordinatorTests.swift index fe7742ff5d23..8de02214bb68 100644 --- a/cmuxTests/FeedCoordinatorTests.swift +++ b/cmuxTests/FeedCoordinatorTests.swift @@ -31,6 +31,42 @@ struct FeedCoordinatorTests { #expect(!FeedSurfaceBridge.isLegacyPackagedFeedURL(URL(string: "https://example.com/feed.html"))) } + @Test func restoredFeedSnapshotsRetainTheirNativeCapability() { + let feedSnapshot = SessionBrowserPanelSnapshot( + urlString: "cmux-diff-viewer://bundled-feed-surface/feed.html", + profileID: nil, + shouldRenderWebView: true, + pageZoom: 1, + developerToolsVisible: false, + backHistoryURLStrings: nil, + forwardHistoryURLStrings: nil, + diffViewerToken: CmuxDiffViewerURLSchemeHandler.bundledFeedToken, + diffViewerRequestPath: "/feed.html" + ) + let normalSnapshot = SessionBrowserPanelSnapshot( + urlString: "https://example.com", + profileID: nil, + shouldRenderWebView: true, + pageZoom: 1, + developerToolsVisible: false, + backHistoryURLStrings: nil, + forwardHistoryURLStrings: nil + ) + let legacySnapshot = SessionBrowserPanelSnapshot( + urlString: "file:///Applications/cmux.app/Contents/Resources/markdown-viewer/webviews-app/feed.html", + profileID: nil, + shouldRenderWebView: true, + pageZoom: 1, + developerToolsVisible: false, + backHistoryURLStrings: nil, + forwardHistoryURLStrings: nil + ) + + #expect(BrowserNativeCapability.restored(from: feedSnapshot) == [.feed]) + #expect(BrowserNativeCapability.restored(from: legacySnapshot) == [.feed]) + #expect(BrowserNativeCapability.restored(from: normalSnapshot).isEmpty) + } + @Test func bundledFeedAssetsUseZlibDecompression() throws { let compressed = Data([ 0x78, 0xda, 0x4b, 0xce, 0xcf, 0x2b, 0xce, 0xcf, 0x49, From 3bb629dc73d2d797478c3637188523dd243b1898 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 16:26:40 -0700 Subject: [PATCH 11/23] Match React Feed to terminal theme --- .../webviews-app/assets/feedSurface.css | 2 +- .../webviews-app/chunks/feedSurface.mjs | 2 +- Sources/Feed/FeedSurfaceBridge.swift | 38 +++++++++++++++- webviews/src/feed/App.tsx | 7 ++- webviews/src/feed/styles.css | 43 +++++++++---------- webviews/src/feed/types.ts | 5 +++ webviews/test/feed.test.tsx | 2 + 7 files changed, 72 insertions(+), 27 deletions(-) diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css index 8f21c112aba2..7870a1891cc5 100644 --- a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -1 +1 @@ -:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-border: color-mix(in srgb, CanvasText 14%, transparent);--feed-border-strong: color-mix(in srgb, CanvasText 38%, transparent);--feed-fill: color-mix(in srgb, CanvasText 5%, transparent);--feed-fill-hover: color-mix(in srgb, CanvasText 9%, transparent);--feed-muted: color-mix(in srgb, CanvasText 56%, transparent)}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:CanvasText}button,input{font:inherit}.feed-shell{min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);border-radius:4px;display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;border-radius:2px;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:CanvasText;color:Canvas}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,Canvas 96%,CanvasText 4%);border:1px solid var(--feed-border);border-radius:4px;padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);border-radius:3px;font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);border-radius:3px;color:CanvasText;cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:CanvasText;border-color:CanvasText;color:Canvas}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);border-radius:3px;color:CanvasText;padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:CanvasText;color:Canvas}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,Canvas 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);border-radius:3px;margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid CanvasText;outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} +:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index f3e8141a2427..57b8c277c338 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as O,i as F,j as n,c as T,a as W}from"./vendor.mjs";import{c as z}from"./router.mjs";let L=null;const E=new Set;let P=null;function $(t){L=t;for(const e of E)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&$(t.snapshot)}});async function R(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function H(){return P||(P=R("feed.subscribe").then($).catch(t=>{throw P=null,t}),P)}const M={getSnapshot:()=>L,subscribe(t){return E.add(t),H(),()=>E.delete(t)}},B=40;function K(){const t=O.c(48),e=F.useSyncExternalStore(M.subscribe,M.getSnapshot,M.getSnapshot),[s,i]=F.useState("actionable"),[l,a]=F.useState(B),[r,c]=F.useState(null);if(!e){let C;return t[0]===Symbol.for("react.memo_cache_sentinel")?(C=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=C):C=t[0],C}let d;t[1]!==s||t[2]!==e.items?(d=s==="actionable"?e.items.filter(D):e.items,t[1]=s,t[2]=e.items,t[3]=d):d=t[3];const o=d;let u;t[4]!==l||t[5]!==s||t[6]!==o?(u=s==="activity"?o.slice(0,l):o,t[4]=l,t[5]=s,t[6]=o,t[7]=u):u=t[7];const f=u,m=s==="activity"&&f.length{c(null);try{await R(C,U)}catch{c(e.copy.requestFailed)}},t[8]=e.copy.requestFailed,t[9]=x):x=t[9];const b=x;let g;t[10]!==e.copy.feed?(g=n.jsx("h1",{children:e.copy.feed}),t[10]=e.copy.feed,t[11]=g):g=t[11];const w=s==="actionable";let v;t[12]===Symbol.for("react.memo_cache_sentinel")?(v=()=>i("actionable"),t[12]=v):v=t[12];let j;t[13]!==e.copy.actionable||t[14]!==w?(j=n.jsx("button",{"aria-selected":w,onClick:v,role:"tab",children:e.copy.actionable}),t[13]=e.copy.actionable,t[14]=w,t[15]=j):j=t[15];const A=s==="activity";let _;t[16]===Symbol.for("react.memo_cache_sentinel")?(_=()=>i("activity"),t[16]=_):_=t[16];let N;t[17]!==e.copy.activity||t[18]!==A?(N=n.jsx("button",{"aria-selected":A,onClick:_,role:"tab",children:e.copy.activity}),t[17]=e.copy.activity,t[18]=A,t[19]=N):N=t[19];let k;t[20]!==j||t[21]!==N?(k=n.jsxs("div",{className:"feed-filter",role:"tablist",children:[j,N]}),t[20]=j,t[21]=N,t[22]=k):k=t[22];let y;t[23]!==k||t[24]!==g?(y=n.jsxs("header",{className:"feed-header",children:[g,k]}),t[23]=k,t[24]=g,t[25]=y):y=t[25];let p;t[26]!==r?(p=r&&n.jsx("div",{className:"feed-error",role:"alert",children:r}),t[26]=r,t[27]=p):p=t[27];let h;t[28]!==s||t[29]!==b||t[30]!==e.copy||t[31]!==e.sourceIcons||t[32]!==f?(h=f.length===0?n.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):f.map(C=>n.jsx(J,{item:C,copy:e.copy,perform:b,sourceIcon:e.sourceIcons[C.source]},C.id)),t[28]=s,t[29]=b,t[30]=e.copy,t[31]=e.sourceIcons,t[32]=f,t[33]=h):h=t[33];let S;t[34]!==m||t[35]!==b||t[36]!==e.copy.loadOlder||t[37]!==e.copy.loadingOlder||t[38]!==e.hasMore||t[39]!==e.isLoadingOlder?(S=(m||e.hasMore)&&n.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?a(Q):b("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[34]=m,t[35]=b,t[36]=e.copy.loadOlder,t[37]=e.copy.loadingOlder,t[38]=e.hasMore,t[39]=e.isLoadingOlder,t[40]=S):S=t[40];let q;t[41]!==h||t[42]!==S?(q=n.jsxs("section",{className:"feed-list",children:[h,S]}),t[41]=h,t[42]=S,t[43]=q):q=t[43];let I;return t[44]!==y||t[45]!==p||t[46]!==q?(I=n.jsxs("main",{className:"feed-shell",children:[y,p,q]}),t[44]=y,t[45]=p,t[46]=q,t[47]=I):I=t[47],I}function Q(t){return t+B}function D(t){return t.status==="pending"}function J(t){const e=O.c(33),{item:s,copy:i,perform:l,sourceIcon:a}=t;let r;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(r=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=r):r=e[3];const c=r,d=`feed-card feed-card-${s.status}`;let o;e[4]!==s.source||e[5]!==a?(o=n.jsx(V,{icon:a,source:s.source}),e[4]=s.source,e[5]=a,e[6]=o):o=e[6];let u;e[7]!==c?(u=n.jsx("h2",{children:c}),e[7]=c,e[8]=u):u=e[8];let f;e[9]!==o||e[10]!==u?(f=n.jsxs("div",{className:"feed-card-title",children:[o,u]}),e[9]=o,e[10]=u,e[11]=f):f=e[11];let m;e[12]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[12]=s.created_at,e[13]=m):m=e[13];let x;e[14]!==m?(x=n.jsx("time",{children:m}),e[14]=m,e[15]=x):x=e[15];let b;e[16]!==f||e[17]!==x?(b=n.jsxs("div",{className:"feed-card-heading",children:[f,x]}),e[16]=f,e[17]=x,e[18]=b):b=e[18];let g;e[19]!==s.cwd?(g=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[19]=s.cwd,e[20]=g):g=e[20];let w;e[21]!==s?(w=n.jsx(X,{item:s}),e[21]=s,e[22]=w):w=e[22];let v;e[23]!==i||e[24]!==s||e[25]!==l?(v=s.status==="pending"&&n.jsx(Y,{item:s,copy:i,perform:l}),e[23]=i,e[24]=s,e[25]=l,e[26]=v):v=e[26];let j;return e[27]!==w||e[28]!==v||e[29]!==d||e[30]!==b||e[31]!==g?(j=n.jsxs("article",{className:d,children:[b,g,w,v]}),e[27]=w,e[28]=v,e[29]=d,e[30]=b,e[31]=g,e[32]=j):j=e[32],j}const G={claude:"Claude",codex:"Codex","hermes-agent":"Hermes",opencode:"OpenCode",pi:"Pi"};function V(t){const e=O.c(15),{icon:s,source:i}=t,l=G[i]??i;let a;e[0]!==s?(a=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=a):a=e[1];const r=a,c=s?void 0:"";let d;e[2]!==s||e[3]!==l?(d=!s&&l.slice(0,1).toUpperCase(),e[2]=s,e[3]=l,e[4]=d):d=e[4];let o;e[5]!==r||e[6]!==c||e[7]!==d?(o=n.jsx("span",{className:"feed-source-logo","data-fallback":c,style:r,"aria-hidden":"true",children:d}),e[5]=r,e[6]=c,e[7]=d,e[8]=o):o=e[8];let u;e[9]!==l?(u=n.jsx("span",{children:l}),e[9]=l,e[10]=u):u=e[10];let f;return e[11]!==i||e[12]!==o||e[13]!==u?(f=n.jsxs("span",{className:"feed-source","data-feed-source":i,children:[o,u]}),e[11]=i,e[12]=o,e[13]=u,e[14]=f):f=e[14],f}function X(t){const e=O.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function Y(t){const e=O.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let a;e[0]!==s.allowed_permission_modes?(a=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=a):a=e[1];let r;e[2]!==a?(r=new Set(a),e[2]=a,e[3]=r):r=e[3];const c=r;let d;e[4]!==i||e[5]!==s.id||e[6]!==c||e[7]!==l?(d=c.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=c,e[7]=l,e[8]=d):d=e[8];let o;e[9]!==i||e[10]!==s.id||e[11]!==c||e[12]!==l?(o=c.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=c,e[12]=l,e[13]=o):o=e[13];let u;e[14]!==i||e[15]!==s.id||e[16]!==c||e[17]!==l?(u=c.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=c,e[17]=l,e[18]=u):u=e[18];let f;e[19]!==i||e[20]!==s.id||e[21]!==c||e[22]!==l?(f=c.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=c,e[22]=l,e[23]=f):f=e[23];let m;e[24]!==i||e[25]!==s.id||e[26]!==c||e[27]!==l?(m=c.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=c,e[27]=l,e[28]=m):m=e[28];let x;return e[29]!==d||e[30]!==o||e[31]!==u||e[32]!==f||e[33]!==m?(x=n.jsxs("div",{className:"feed-actions",children:[d,o,u,f,m]}),e[29]=d,e[30]=o,e[31]=u,e[32]=f,e[33]=m,e[34]=x):x=e[34],x}if(s.kind==="exitPlan"){let a;e[35]!==s.id||e[36]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=a):a=e[37];let r;e[38]!==i.planManual||e[39]!==a?(r=n.jsx("button",{onClick:a,children:i.planManual}),e[38]=i.planManual,e[39]=a,e[40]=r):r=e[40];let c;e[41]!==s.id||e[42]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=c):c=e[43];let d;e[44]!==i.planAuto||e[45]!==c?(d=n.jsx("button",{onClick:c,children:i.planAuto}),e[44]=i.planAuto,e[45]=c,e[46]=d):d=e[46];let o;e[47]!==s.id||e[48]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=o):o=e[49];let u;e[50]!==i.planUltraplan||e[51]!==o?(u=n.jsx("button",{className:"primary",onClick:o,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=o,e[52]=u):u=e[52];let f;return e[53]!==r||e[54]!==d||e[55]!==u?(f=n.jsxs("div",{className:"feed-actions",children:[r,d,u]}),e[53]=r,e[54]=d,e[55]=u,e[56]=f):f=e[56],f}if(s.kind==="question"){let a;e[57]!==s.questions?(a=s.questions??[],e[57]=s.questions,e[58]=a):a=e[58];let r;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==a?(r=n.jsx(Z,{item:s,questions:a,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=a,e[63]=r):r=e[63],r}return null}function Z(t){const e=O.c(34),{item:s,questions:i,copy:l,perform:a}=t;let r;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(r=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=r):r=e[3];const c=r;let d;e[4]===Symbol.for("react.memo_cache_sentinel")?(d={},e[4]=d):d=e[4];const[o,u]=F.useState(d);let f;e[5]===Symbol.for("react.memo_cache_sentinel")?(f={},e[5]=f):f=e[5];const[m,x]=F.useState(f);let b;e[6]===Symbol.for("react.memo_cache_sentinel")?(b=(y,p)=>{u(h=>{const S=h[y.id]??[],q=y.multi_select?S.includes(p)?S.filter(I=>I!==p):[...S,p]:[p];return{...h,[y.id]:q}})},e[6]=b):b=e[6];const g=b;let w;if(e[7]!==m||e[8]!==c||e[9]!==o){let y;e[11]!==m||e[12]!==o?(y=p=>{const h=m[p.id]?.trim();if(h)return[h];const S=o[p.id]??[],q=p.options.filter(I=>S.includes(I.id)).map(ee);return q.length>0?[q.join(", ")]:[]},e[11]=m,e[12]=o,e[13]=y):y=e[13],w=c.flatMap(y),e[7]=m,e[8]=c,e[9]=o,e[10]=w}else w=e[10];const v=w;let j;if(e[14]!==l.questionPlaceholder||e[15]!==m||e[16]!==c||e[17]!==o){let y;e[19]!==l.questionPlaceholder||e[20]!==m||e[21]!==o?(y=p=>n.jsxs("div",{className:"feed-question",children:[p.prompt&&n.jsx("div",{className:"feed-question-prompt",children:p.prompt}),n.jsx("div",{className:"feed-options",children:p.options.map(h=>n.jsxs("button",{"aria-pressed":(o[p.id]??[]).includes(h.id),onClick:()=>g(p,h.id),children:[n.jsx("strong",{children:h.label}),h.description&&n.jsx("span",{children:h.description})]},h.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:h=>x(S=>({...S,[p.id]:h.target.value})),placeholder:l.questionPlaceholder,value:m[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=m,e[21]=o,e[22]=y):y=e[22],j=c.map(y),e[14]=l.questionPlaceholder,e[15]=m,e[16]=c,e[17]=o,e[18]=j}else j=e[18];const A=v.length===0;let _;e[23]!==v||e[24]!==s.id||e[25]!==a?(_=()=>a("feed.question.reply",{itemId:s.id,selections:v}),e[23]=v,e[24]=s.id,e[25]=a,e[26]=_):_=e[26];let N;e[27]!==l.questionSubmit||e[28]!==A||e[29]!==_?(N=n.jsx("button",{className:"primary",disabled:A,onClick:_,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=A,e[29]=_,e[30]=N):N=e[30];let k;return e[31]!==j||e[32]!==N?(k=n.jsxs("div",{className:"feed-question-actions",children:[j,N]}),e[31]=j,e[32]=N,e[33]=k):k=e[33],k}function ee(t){return t.label}function le(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=z(()=>n.jsx(K,{}));T.createRoot(t).render(n.jsx(W,{router:e}))}export{le as mountFeedSurface}; +import{b as M,i as P,j as o,c as H,a as K}from"./vendor.mjs";import{c as Q}from"./router.mjs";let B=null;const R=new Set;let E=null;function U(t){B=t;for(const e of R)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&U(t.snapshot)}});async function T(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function D(){return E||(E=T("feed.subscribe").then(U).catch(t=>{throw E=null,t}),E)}const $={getSnapshot:()=>B,subscribe(t){return R.add(t),D(),()=>R.delete(t)}},W=40;function J(){const t=M.c(53),e=P.useSyncExternalStore($.subscribe,$.getSnapshot,$.getSnapshot),[s,i]=P.useState("actionable"),[l,a]=P.useState(W),[r,c]=P.useState(null);if(!e){let C;return t[0]===Symbol.for("react.memo_cache_sentinel")?(C=o.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=C):C=t[0],C}let d;t[1]!==s||t[2]!==e.items?(d=s==="actionable"?e.items.filter(V):e.items,t[1]=s,t[2]=e.items,t[3]=d):d=t[3];const n=d;let u;t[4]!==l||t[5]!==s||t[6]!==n?(u=s==="activity"?n.slice(0,l):n,t[4]=l,t[5]=s,t[6]=n,t[7]=u):u=t[7];const f=u,m=s==="activity"&&f.length{c(null);try{await T(C,z)}catch{c(e.copy.requestFailed)}},t[12]=e.copy.requestFailed,t[13]=v):v=t[13];const y=v;let b;t[14]!==e.copy.feed?(b=o.jsx("h1",{children:e.copy.feed}),t[14]=e.copy.feed,t[15]=b):b=t[15];const A=s==="actionable";let k;t[16]===Symbol.for("react.memo_cache_sentinel")?(k=()=>i("actionable"),t[16]=k):k=t[16];let S;t[17]!==e.copy.actionable||t[18]!==A?(S=o.jsx("button",{"aria-selected":A,onClick:k,role:"tab",children:e.copy.actionable}),t[17]=e.copy.actionable,t[18]=A,t[19]=S):S=t[19];const I=s==="activity";let x;t[20]===Symbol.for("react.memo_cache_sentinel")?(x=()=>i("activity"),t[20]=x):x=t[20];let p;t[21]!==e.copy.activity||t[22]!==I?(p=o.jsx("button",{"aria-selected":I,onClick:x,role:"tab",children:e.copy.activity}),t[21]=e.copy.activity,t[22]=I,t[23]=p):p=t[23];let h;t[24]!==p||t[25]!==S?(h=o.jsxs("div",{className:"feed-filter",role:"tablist",children:[S,p]}),t[24]=p,t[25]=S,t[26]=h):h=t[26];let w;t[27]!==h||t[28]!==b?(w=o.jsxs("header",{className:"feed-header",children:[b,h]}),t[27]=h,t[28]=b,t[29]=w):w=t[29];let _;t[30]!==r?(_=r&&o.jsx("div",{className:"feed-error",role:"alert",children:r}),t[30]=r,t[31]=_):_=t[31];let q;t[32]!==s||t[33]!==y||t[34]!==e.copy||t[35]!==e.sourceIcons||t[36]!==f?(q=f.length===0?o.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):f.map(C=>o.jsx(X,{item:C,copy:e.copy,perform:y,sourceIcon:e.sourceIcons[C.source]},C.id)),t[32]=s,t[33]=y,t[34]=e.copy,t[35]=e.sourceIcons,t[36]=f,t[37]=q):q=t[37];let F;t[38]!==m||t[39]!==y||t[40]!==e.copy.loadOlder||t[41]!==e.copy.loadingOlder||t[42]!==e.hasMore||t[43]!==e.isLoadingOlder?(F=(m||e.hasMore)&&o.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?a(G):y("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[38]=m,t[39]=y,t[40]=e.copy.loadOlder,t[41]=e.copy.loadingOlder,t[42]=e.hasMore,t[43]=e.isLoadingOlder,t[44]=F):F=t[44];let O;t[45]!==q||t[46]!==F?(O=o.jsxs("section",{className:"feed-list",children:[q,F]}),t[45]=q,t[46]=F,t[47]=O):O=t[47];let L;return t[48]!==w||t[49]!==_||t[50]!==O||t[51]!==N?(L=o.jsxs("main",{className:"feed-shell",style:N,children:[w,_,O]}),t[48]=w,t[49]=_,t[50]=O,t[51]=N,t[52]=L):L=t[52],L}function G(t){return t+W}function V(t){return t.status==="pending"}function X(t){const e=M.c(33),{item:s,copy:i,perform:l,sourceIcon:a}=t;let r;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(r=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=r):r=e[3];const c=r,d=`feed-card feed-card-${s.status}`;let n;e[4]!==s.source||e[5]!==a?(n=o.jsx(Z,{icon:a,source:s.source}),e[4]=s.source,e[5]=a,e[6]=n):n=e[6];let u;e[7]!==c?(u=o.jsx("h2",{children:c}),e[7]=c,e[8]=u):u=e[8];let f;e[9]!==n||e[10]!==u?(f=o.jsxs("div",{className:"feed-card-title",children:[n,u]}),e[9]=n,e[10]=u,e[11]=f):f=e[11];let m;e[12]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[12]=s.created_at,e[13]=m):m=e[13];let j;e[14]!==m?(j=o.jsx("time",{children:m}),e[14]=m,e[15]=j):j=e[15];let g;e[16]!==f||e[17]!==j?(g=o.jsxs("div",{className:"feed-card-heading",children:[f,j]}),e[16]=f,e[17]=j,e[18]=g):g=e[18];let N;e[19]!==s.cwd?(N=s.cwd&&o.jsx("div",{className:"feed-cwd",children:s.cwd}),e[19]=s.cwd,e[20]=N):N=e[20];let v;e[21]!==s?(v=o.jsx(ee,{item:s}),e[21]=s,e[22]=v):v=e[22];let y;e[23]!==i||e[24]!==s||e[25]!==l?(y=s.status==="pending"&&o.jsx(te,{item:s,copy:i,perform:l}),e[23]=i,e[24]=s,e[25]=l,e[26]=y):y=e[26];let b;return e[27]!==v||e[28]!==y||e[29]!==d||e[30]!==g||e[31]!==N?(b=o.jsxs("article",{className:d,children:[g,N,v,y]}),e[27]=v,e[28]=y,e[29]=d,e[30]=g,e[31]=N,e[32]=b):b=e[32],b}const Y={claude:"Claude",codex:"Codex","hermes-agent":"Hermes",opencode:"OpenCode",pi:"Pi"};function Z(t){const e=M.c(15),{icon:s,source:i}=t,l=Y[i]??i;let a;e[0]!==s?(a=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=a):a=e[1];const r=a,c=s?void 0:"";let d;e[2]!==s||e[3]!==l?(d=!s&&l.slice(0,1).toUpperCase(),e[2]=s,e[3]=l,e[4]=d):d=e[4];let n;e[5]!==r||e[6]!==c||e[7]!==d?(n=o.jsx("span",{className:"feed-source-logo","data-fallback":c,style:r,"aria-hidden":"true",children:d}),e[5]=r,e[6]=c,e[7]=d,e[8]=n):n=e[8];let u;e[9]!==l?(u=o.jsx("span",{children:l}),e[9]=l,e[10]=u):u=e[10];let f;return e[11]!==i||e[12]!==n||e[13]!==u?(f=o.jsxs("span",{className:"feed-source","data-feed-source":i,children:[n,u]}),e[11]=i,e[12]=n,e[13]=u,e[14]=f):f=e[14],f}function ee(t){const e=M.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=o.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function te(t){const e=M.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let a;e[0]!==s.allowed_permission_modes?(a=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=a):a=e[1];let r;e[2]!==a?(r=new Set(a),e[2]=a,e[3]=r):r=e[3];const c=r;let d;e[4]!==i||e[5]!==s.id||e[6]!==c||e[7]!==l?(d=c.has("deny")&&o.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=c,e[7]=l,e[8]=d):d=e[8];let n;e[9]!==i||e[10]!==s.id||e[11]!==c||e[12]!==l?(n=c.has("once")&&o.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=c,e[12]=l,e[13]=n):n=e[13];let u;e[14]!==i||e[15]!==s.id||e[16]!==c||e[17]!==l?(u=c.has("always")&&o.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=c,e[17]=l,e[18]=u):u=e[18];let f;e[19]!==i||e[20]!==s.id||e[21]!==c||e[22]!==l?(f=c.has("all")&&o.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=c,e[22]=l,e[23]=f):f=e[23];let m;e[24]!==i||e[25]!==s.id||e[26]!==c||e[27]!==l?(m=c.has("bypass")&&o.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=c,e[27]=l,e[28]=m):m=e[28];let j;return e[29]!==d||e[30]!==n||e[31]!==u||e[32]!==f||e[33]!==m?(j=o.jsxs("div",{className:"feed-actions",children:[d,n,u,f,m]}),e[29]=d,e[30]=n,e[31]=u,e[32]=f,e[33]=m,e[34]=j):j=e[34],j}if(s.kind==="exitPlan"){let a;e[35]!==s.id||e[36]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=a):a=e[37];let r;e[38]!==i.planManual||e[39]!==a?(r=o.jsx("button",{onClick:a,children:i.planManual}),e[38]=i.planManual,e[39]=a,e[40]=r):r=e[40];let c;e[41]!==s.id||e[42]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=c):c=e[43];let d;e[44]!==i.planAuto||e[45]!==c?(d=o.jsx("button",{onClick:c,children:i.planAuto}),e[44]=i.planAuto,e[45]=c,e[46]=d):d=e[46];let n;e[47]!==s.id||e[48]!==l?(n=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=n):n=e[49];let u;e[50]!==i.planUltraplan||e[51]!==n?(u=o.jsx("button",{className:"primary",onClick:n,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=n,e[52]=u):u=e[52];let f;return e[53]!==r||e[54]!==d||e[55]!==u?(f=o.jsxs("div",{className:"feed-actions",children:[r,d,u]}),e[53]=r,e[54]=d,e[55]=u,e[56]=f):f=e[56],f}if(s.kind==="question"){let a;e[57]!==s.questions?(a=s.questions??[],e[57]=s.questions,e[58]=a):a=e[58];let r;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==a?(r=o.jsx(se,{item:s,questions:a,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=a,e[63]=r):r=e[63],r}return null}function se(t){const e=M.c(34),{item:s,questions:i,copy:l,perform:a}=t;let r;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(r=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=r):r=e[3];const c=r;let d;e[4]===Symbol.for("react.memo_cache_sentinel")?(d={},e[4]=d):d=e[4];const[n,u]=P.useState(d);let f;e[5]===Symbol.for("react.memo_cache_sentinel")?(f={},e[5]=f):f=e[5];const[m,j]=P.useState(f);let g;e[6]===Symbol.for("react.memo_cache_sentinel")?(g=(x,p)=>{u(h=>{const w=h[x.id]??[],_=x.multi_select?w.includes(p)?w.filter(q=>q!==p):[...w,p]:[p];return{...h,[x.id]:_}})},e[6]=g):g=e[6];const N=g;let v;if(e[7]!==m||e[8]!==c||e[9]!==n){let x;e[11]!==m||e[12]!==n?(x=p=>{const h=m[p.id]?.trim();if(h)return[h];const w=n[p.id]??[],_=p.options.filter(q=>w.includes(q.id)).map(le);return _.length>0?[_.join(", ")]:[]},e[11]=m,e[12]=n,e[13]=x):x=e[13],v=c.flatMap(x),e[7]=m,e[8]=c,e[9]=n,e[10]=v}else v=e[10];const y=v;let b;if(e[14]!==l.questionPlaceholder||e[15]!==m||e[16]!==c||e[17]!==n){let x;e[19]!==l.questionPlaceholder||e[20]!==m||e[21]!==n?(x=p=>o.jsxs("div",{className:"feed-question",children:[p.prompt&&o.jsx("div",{className:"feed-question-prompt",children:p.prompt}),o.jsx("div",{className:"feed-options",children:p.options.map(h=>o.jsxs("button",{"aria-pressed":(n[p.id]??[]).includes(h.id),onClick:()=>N(p,h.id),children:[o.jsx("strong",{children:h.label}),h.description&&o.jsx("span",{children:h.description})]},h.id))}),o.jsx("input",{"aria-label":l.questionPlaceholder,onChange:h=>j(w=>({...w,[p.id]:h.target.value})),placeholder:l.questionPlaceholder,value:m[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=m,e[21]=n,e[22]=x):x=e[22],b=c.map(x),e[14]=l.questionPlaceholder,e[15]=m,e[16]=c,e[17]=n,e[18]=b}else b=e[18];const A=y.length===0;let k;e[23]!==y||e[24]!==s.id||e[25]!==a?(k=()=>a("feed.question.reply",{itemId:s.id,selections:y}),e[23]=y,e[24]=s.id,e[25]=a,e[26]=k):k=e[26];let S;e[27]!==l.questionSubmit||e[28]!==A||e[29]!==k?(S=o.jsx("button",{className:"primary",disabled:A,onClick:k,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=A,e[29]=k,e[30]=S):S=e[30];let I;return e[31]!==b||e[32]!==S?(I=o.jsxs("div",{className:"feed-question-actions",children:[b,S]}),e[31]=b,e[32]=S,e[33]=I):I=e[33],I}function le(t){return t.label}function ne(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=Q(()=>o.jsx(J,{}));H.createRoot(t).render(o.jsx(K,{router:e}))}export{ne as mountFeedSurface}; diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index 506fe3ad0deb..8efb9982cad2 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -1,5 +1,6 @@ import AppKit import CMUXAgentLaunch +import CmuxFoundation import Foundation import Observation import WebKit @@ -13,6 +14,27 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { private static var handlerInstalledKey: UInt8 = 0 private static var subscriptionGenerationKey: UInt8 = 0 + private let subscribedWebViews = NSHashTable.weakObjects() + private var themeObserver: NSObjectProtocol? + + override init() { + super.init() + themeObserver = NotificationCenter.default.addObserver( + forName: .ghosttyDefaultBackgroundDidChange, + object: nil, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.publishSnapshotToSubscribers() + } + } + } + + deinit { + if let themeObserver { + NotificationCenter.default.removeObserver(themeObserver) + } + } static func installIfNeeded(on userContentController: WKUserContentController) { guard objc_getAssociatedObject(userContentController, &handlerInstalledKey) == nil else { @@ -67,7 +89,7 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { return url == expected } - static func isLegacyPackagedFeedURL(_ url: URL?) -> Bool { + nonisolated static func isLegacyPackagedFeedURL(_ url: URL?) -> Bool { guard let url, url.isFileURL else { return false } return url.standardizedFileURL.path.hasSuffix( "/Contents/Resources/markdown-viewer/webviews-app/feed.html" @@ -171,9 +193,16 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { private func snapshot() -> [String: Any] { let store = FeedCoordinator.shared.store + let background = GhosttyApp.shared.defaultBackgroundColor + let foreground = GhosttyApp.shared.defaultForegroundColor return [ "items": (store?.items ?? []).map(itemDictionary), "sourceIcons": Self.sourceIconDataURLs, + "theme": [ + "background": background.hexString(), + "foreground": foreground.hexString(), + "isLight": cmuxReadableColorScheme(for: background) == .light, + ], "hasMore": store?.hasMorePersistedItems ?? false, "isLoadingOlder": store?.isLoadingOlderItems ?? false, "copy": [ @@ -266,6 +295,7 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { } private func beginSnapshotSubscription(for webView: WKWebView) { + subscribedWebViews.add(webView) let generation = (objc_getAssociatedObject(webView, &Self.subscriptionGenerationKey) as? NSNumber)?.intValue ?? 0 let nextGeneration = generation + 1 objc_setAssociatedObject( @@ -304,6 +334,12 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { webView.evaluateJavaScript("window.cmuxFeedBridge?.receive(\(json));") } + private func publishSnapshotToSubscribers() { + for webView in subscribedWebViews.allObjects { + publishSnapshot(to: webView) + } + } + private static func error(code: String) -> [String: Any] { ["ok": false, "error": ["code": code]] } diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index a154ca5c81b4..9d1aea85c68d 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -23,6 +23,11 @@ export function FeedApp() { : snapshot.items; const visibleItems = filter === "activity" ? items.slice(0, activityLimit) : items; const hasBufferedActivity = filter === "activity" && visibleItems.length < items.length; + const themeStyle = { + "--feed-background": snapshot.theme.background, + "--feed-foreground": snapshot.theme.foreground, + colorScheme: snapshot.theme.isLight ? "light" : "dark", + } as CSSProperties; const perform = async (method: string, params: Record) => { setError(null); @@ -34,7 +39,7 @@ export function FeedApp() { }; return ( -
+

{snapshot.copy.feed}

diff --git a/webviews/src/feed/styles.css b/webviews/src/feed/styles.css index 016740235403..99f6f8f90598 100644 --- a/webviews/src/feed/styles.css +++ b/webviews/src/feed/styles.css @@ -1,19 +1,23 @@ :root { color-scheme: light dark; font: 12px/1.4 -apple-system, BlinkMacSystemFont, "SF Pro Text", sans-serif; - --feed-border: color-mix(in srgb, CanvasText 14%, transparent); - --feed-border-strong: color-mix(in srgb, CanvasText 38%, transparent); - --feed-fill: color-mix(in srgb, CanvasText 5%, transparent); - --feed-fill-hover: color-mix(in srgb, CanvasText 9%, transparent); - --feed-muted: color-mix(in srgb, CanvasText 56%, transparent); + --feed-background: transparent; + --feed-foreground: CanvasText; + --feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent); + --feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent); + --feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent); + --feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent); + --feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent); } * { box-sizing: border-box; } html, body, #root { margin: 0; min-height: 100%; width: 100%; } -body { background: transparent; color: CanvasText; } +body { background: transparent; color: var(--feed-foreground); } button, input { font: inherit; } .feed-shell { + background: var(--feed-background); + color: var(--feed-foreground); min-height: 100vh; padding: 14px clamp(12px, 3vw, 28px) 28px; } @@ -40,7 +44,6 @@ button, input { font: inherit; } .feed-filter { border: 1px solid var(--feed-border); - border-radius: 4px; display: flex; gap: 1px; padding: 2px; @@ -49,14 +52,13 @@ button, input { font: inherit; } .feed-filter button { background: transparent; border: 0; - border-radius: 2px; color: var(--feed-muted); cursor: pointer; padding: 3px 7px; } .feed-filter button:hover { background: var(--feed-fill); } -.feed-filter button[aria-selected="true"] { background: CanvasText; color: Canvas; } +.feed-filter button[aria-selected="true"] { background: var(--feed-foreground); color: var(--feed-background); } .feed-list { display: grid; @@ -66,9 +68,8 @@ button, input { font: inherit; } } .feed-card { - background: color-mix(in srgb, Canvas 96%, CanvasText 4%); + background: color-mix(in srgb, var(--feed-background) 96%, var(--feed-foreground) 4%); border: 1px solid var(--feed-border); - border-radius: 4px; padding: 10px; } @@ -138,7 +139,6 @@ button, input { font: inherit; } .feed-body { background: var(--feed-fill); border: 1px solid var(--feed-border); - border-radius: 3px; font: inherit; font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; margin: 8px 0 0; @@ -162,8 +162,7 @@ button, input { font: inherit; } .feed-load-more { background: transparent; border: 1px solid var(--feed-border-strong); - border-radius: 3px; - color: CanvasText; + color: var(--feed-foreground); cursor: pointer; padding: 4px 7px; } @@ -175,9 +174,9 @@ button, input { font: inherit; } .feed-actions .primary, .feed-question-actions .primary { - background: CanvasText; - border-color: CanvasText; - color: Canvas; + background: var(--feed-foreground); + border-color: var(--feed-foreground); + color: var(--feed-background); } .feed-actions .primary:hover, @@ -196,17 +195,16 @@ button, input { font: inherit; } .feed-question input { background: var(--feed-fill); border: 1px solid var(--feed-border-strong); - border-radius: 3px; - color: CanvasText; + color: var(--feed-foreground); padding: 5px 7px; width: 100%; } .feed-options { display: grid; gap: 4px; } .feed-options button { display: grid; gap: 1px; text-align: left; } -.feed-options button[aria-pressed="true"] { background: CanvasText; color: Canvas; } +.feed-options button[aria-pressed="true"] { background: var(--feed-foreground); color: var(--feed-background); } .feed-options span { color: var(--feed-muted); } -.feed-options button[aria-pressed="true"] span { color: color-mix(in srgb, Canvas 70%, transparent); } +.feed-options button[aria-pressed="true"] span { color: color-mix(in srgb, var(--feed-background) 70%, transparent); } .feed-empty { color: var(--feed-muted); @@ -216,7 +214,6 @@ button, input { font: inherit; } .feed-error { border: 1px solid var(--feed-border-strong); - border-radius: 3px; margin: 0 auto 6px; max-width: 760px; padding: 6px 8px; @@ -225,7 +222,7 @@ button, input { font: inherit; } .feed-load-more { justify-self: center; margin-top: 2px; } button:disabled { cursor: default; opacity: .4; } button:focus-visible, -.feed-question input:focus-visible { outline: 1px solid CanvasText; outline-offset: 2px; } +.feed-question input:focus-visible { outline: 1px solid var(--feed-foreground); outline-offset: 2px; } @media (max-width: 540px) { .feed-header { align-items: stretch; flex-direction: column; gap: 8px; } diff --git a/webviews/src/feed/types.ts b/webviews/src/feed/types.ts index 40dc8d80ae60..ba895a224e45 100644 --- a/webviews/src/feed/types.ts +++ b/webviews/src/feed/types.ts @@ -61,6 +61,11 @@ export type FeedSnapshot = { isLoadingOlder: boolean; items: FeedItem[]; sourceIcons: Record; + theme: { + background: string; + foreground: string; + isLight: boolean; + }; }; export type FeedNativeEvent = { diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index d046829626f5..8f34a09fd709 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -49,6 +49,7 @@ test("Feed React surface invokes the typed permission primitive", async () => { codex: "data:image/png;base64,Y29kZXg=", opencode: "data:image/png;base64,b3BlbmNvZGU=", }, + theme: { background: "#272822", foreground: "#f8f8f2", isLight: false }, items: [{ created_at: "2026-07-13T12:00:00Z", id: "item-1", kind: "permissionRequest", request_id: "request-1", source: "claude", status: "pending", tool_name: "Bash", @@ -73,6 +74,7 @@ test("Feed React surface invokes the typed permission primitive", async () => { root = createRoot(container); flushSync(() => root?.render()); await waitFor(() => container.textContent?.includes("Bash") === true); + expect(container.querySelector("main")?.getAttribute("style") ?? "").toContain("--feed-background: #272822"); expect(container.querySelector('[data-feed-source="claude"] .feed-source-logo')).toBeTruthy(); expect(container.querySelector('[data-feed-source="claude"]')?.textContent).toContain("Claude"); flushSync(() => [...container.querySelectorAll("button")].find((button) => button.textContent === "All Activity")?.click()); From 53aa3ab1abd3ffaa3ae98931b206d7930a4bf816 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 20:39:54 -0700 Subject: [PATCH 12/23] Stabilize Feed scrollbar layout --- Resources/markdown-viewer/webviews-app/assets/feedSurface.css | 2 +- webviews/src/feed/styles.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css index 7870a1891cc5..e7a4dc03aa97 100644 --- a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -1 +1 @@ -:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} +:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html{scrollbar-gutter:stable}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} diff --git a/webviews/src/feed/styles.css b/webviews/src/feed/styles.css index 99f6f8f90598..4746081336b4 100644 --- a/webviews/src/feed/styles.css +++ b/webviews/src/feed/styles.css @@ -11,6 +11,10 @@ } * { box-sizing: border-box; } +html { + scrollbar-gutter: stable; +} + html, body, #root { margin: 0; min-height: 100%; width: 100%; } body { background: transparent; color: var(--feed-foreground); } button, input { font: inherit; } From aa76be6722531a8eb9994b478f58283e754b48ad Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:17:31 -0700 Subject: [PATCH 13/23] Make Feed empty state and keyboard navigation shippable --- Resources/Localizable.xcstrings | 133 +++++++++++ .../webviews-app/assets/feedSurface.css | 2 +- .../webviews-app/chunks/feedSurface.mjs | 2 +- Sources/Feed/FeedSurfaceBridge.swift | 206 ++++++++++++++++++ webviews/src/feed/App.tsx | 180 ++++++++++++--- webviews/src/feed/bridge.ts | 10 +- webviews/src/feed/styles.css | 77 ++++++- webviews/src/feed/types.ts | 16 ++ webviews/test/feed.test.tsx | 64 +++++- 9 files changed, 653 insertions(+), 37 deletions(-) diff --git a/Resources/Localizable.xcstrings b/Resources/Localizable.xcstrings index 87bca74b1e56..d845cea09ba2 100644 --- a/Resources/Localizable.xcstrings +++ b/Resources/Localizable.xcstrings @@ -102384,6 +102384,55 @@ } } }, + "feed.integrations.hint": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Claude Code and Codex use Settings. Other agents need `cmux hooks setup`." } }, + "ja": { "stringUnit": { "state": "translated", "value": "Claude Code と Codex は設定を使用します。その他のエージェントでは `cmux hooks setup` が必要です。" } } + } + }, + "feed.integrations.status.checking": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Checking..." } }, + "ja": { "stringUnit": { "state": "translated", "value": "確認中..." } } + } + }, + "feed.integrations.status.disabled": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Disabled in Settings" } }, + "ja": { "stringUnit": { "state": "translated", "value": "設定で無効" } } + } + }, + "feed.integrations.status.needsSetup": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Setup needed" } }, + "ja": { "stringUnit": { "state": "translated", "value": "セットアップが必要" } } + } + }, + "feed.integrations.status.ready": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Ready" } }, + "ja": { "stringUnit": { "state": "translated", "value": "準備完了" } } + } + }, + "feed.integrations.title": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Agent integrations" } }, + "ja": { "stringUnit": { "state": "translated", "value": "エージェント連携" } } + } + }, + "feed.keyboard.help": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Navigate with ↑/↓, J/K, or Control-N/Control-P. Press Tab to reach actions." } }, + "ja": { "stringUnit": { "state": "translated", "value": "↑/↓、J/K、または Control-N/Control-P で移動します。Tab で操作ボタンに移動します。" } } + } + }, "feed.kind.exitPlan": { "extractionState": "manual", "localizations": { @@ -103450,6 +103499,90 @@ } } }, + "feed.source.amp": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Amp" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Amp" } } + } + }, + "feed.source.claude": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Claude Code" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Claude Code" } } + } + }, + "feed.source.codebuddy": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "CodeBuddy" } }, + "ja": { "stringUnit": { "state": "translated", "value": "CodeBuddy" } } + } + }, + "feed.source.codex": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Codex" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Codex" } } + } + }, + "feed.source.copilot": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Copilot" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Copilot" } } + } + }, + "feed.source.cursor": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Cursor" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Cursor" } } + } + }, + "feed.source.factory": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Factory" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Factory" } } + } + }, + "feed.source.gemini": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Gemini" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Gemini" } } + } + }, + "feed.source.hermes": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Hermes Agent" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Hermes Agent" } } + } + }, + "feed.source.opencode": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "OpenCode" } }, + "ja": { "stringUnit": { "state": "translated", "value": "OpenCode" } } + } + }, + "feed.source.pi": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Pi" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Pi" } } + } + }, + "feed.source.qoder": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Qoder" } }, + "ja": { "stringUnit": { "state": "translated", "value": "Qoder" } } + } + }, "feed.status.expired": { "extractionState": "manual", "localizations": { diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css index e7a4dc03aa97..6ff38f518bd4 100644 --- a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -1 +1 @@ -:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html{scrollbar-gutter:stable}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);padding:44px 12px;text-align:center}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}} +:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html{scrollbar-gutter:stable}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card:focus-visible{border-color:var(--feed-foreground);outline:1px solid var(--feed-foreground);outline-offset:2px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);display:grid;gap:6px;padding:36px 0}.feed-empty>h2{color:var(--feed-foreground);font-size:14px;margin:0;text-align:center}.feed-empty>p{margin:0 auto;max-width:520px;text-align:center}.feed-integrations{border:1px solid var(--feed-border);margin-top:16px;padding:12px}.feed-integrations h3{color:var(--feed-foreground);font-size:inherit;margin:0 0 8px}.feed-integration-grid{display:grid;gap:1px 16px;grid-template-columns:repeat(2,minmax(0,1fr))}.feed-integration{align-items:center;border-top:1px solid var(--feed-border);display:flex;gap:8px;justify-content:space-between;min-width:0;padding:7px 0}.feed-integration-status{flex:none;font-size:11px}.feed-integration[data-status=ready] .feed-integration-status{color:var(--feed-foreground)}.feed-integration[data-status=disabled] .feed-integration-status,.feed-integration[data-status=needsSetup] .feed-integration-status{color:color-mix(in srgb,#ff9f0a 80%,var(--feed-foreground))}.feed-integration-hint{border-top:1px solid var(--feed-border);margin:1px 0 0;padding-top:9px}.feed-empty>.feed-keyboard-help{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;margin-top:10px}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}.feed-integration-grid{grid-template-columns:1fr}} diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index 57b8c277c338..7f4df294e1a2 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as M,i as P,j as o,c as H,a as K}from"./vendor.mjs";import{c as Q}from"./router.mjs";let B=null;const R=new Set;let E=null;function U(t){B=t;for(const e of R)e()}typeof window<"u"&&(window.cmuxFeedBridge={receive(t){t.type==="feed.snapshot"&&U(t.snapshot)}});async function T(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function D(){return E||(E=T("feed.subscribe").then(U).catch(t=>{throw E=null,t}),E)}const $={getSnapshot:()=>B,subscribe(t){return R.add(t),D(),()=>R.delete(t)}},W=40;function J(){const t=M.c(53),e=P.useSyncExternalStore($.subscribe,$.getSnapshot,$.getSnapshot),[s,i]=P.useState("actionable"),[l,a]=P.useState(W),[r,c]=P.useState(null);if(!e){let C;return t[0]===Symbol.for("react.memo_cache_sentinel")?(C=o.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[0]=C):C=t[0],C}let d;t[1]!==s||t[2]!==e.items?(d=s==="actionable"?e.items.filter(V):e.items,t[1]=s,t[2]=e.items,t[3]=d):d=t[3];const n=d;let u;t[4]!==l||t[5]!==s||t[6]!==n?(u=s==="activity"?n.slice(0,l):n,t[4]=l,t[5]=s,t[6]=n,t[7]=u):u=t[7];const f=u,m=s==="activity"&&f.length{c(null);try{await T(C,z)}catch{c(e.copy.requestFailed)}},t[12]=e.copy.requestFailed,t[13]=v):v=t[13];const y=v;let b;t[14]!==e.copy.feed?(b=o.jsx("h1",{children:e.copy.feed}),t[14]=e.copy.feed,t[15]=b):b=t[15];const A=s==="actionable";let k;t[16]===Symbol.for("react.memo_cache_sentinel")?(k=()=>i("actionable"),t[16]=k):k=t[16];let S;t[17]!==e.copy.actionable||t[18]!==A?(S=o.jsx("button",{"aria-selected":A,onClick:k,role:"tab",children:e.copy.actionable}),t[17]=e.copy.actionable,t[18]=A,t[19]=S):S=t[19];const I=s==="activity";let x;t[20]===Symbol.for("react.memo_cache_sentinel")?(x=()=>i("activity"),t[20]=x):x=t[20];let p;t[21]!==e.copy.activity||t[22]!==I?(p=o.jsx("button",{"aria-selected":I,onClick:x,role:"tab",children:e.copy.activity}),t[21]=e.copy.activity,t[22]=I,t[23]=p):p=t[23];let h;t[24]!==p||t[25]!==S?(h=o.jsxs("div",{className:"feed-filter",role:"tablist",children:[S,p]}),t[24]=p,t[25]=S,t[26]=h):h=t[26];let w;t[27]!==h||t[28]!==b?(w=o.jsxs("header",{className:"feed-header",children:[b,h]}),t[27]=h,t[28]=b,t[29]=w):w=t[29];let _;t[30]!==r?(_=r&&o.jsx("div",{className:"feed-error",role:"alert",children:r}),t[30]=r,t[31]=_):_=t[31];let q;t[32]!==s||t[33]!==y||t[34]!==e.copy||t[35]!==e.sourceIcons||t[36]!==f?(q=f.length===0?o.jsx("div",{className:"feed-empty",children:s==="actionable"?e.copy.emptyActionable:e.copy.emptyActivity}):f.map(C=>o.jsx(X,{item:C,copy:e.copy,perform:y,sourceIcon:e.sourceIcons[C.source]},C.id)),t[32]=s,t[33]=y,t[34]=e.copy,t[35]=e.sourceIcons,t[36]=f,t[37]=q):q=t[37];let F;t[38]!==m||t[39]!==y||t[40]!==e.copy.loadOlder||t[41]!==e.copy.loadingOlder||t[42]!==e.hasMore||t[43]!==e.isLoadingOlder?(F=(m||e.hasMore)&&o.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?a(G):y("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[38]=m,t[39]=y,t[40]=e.copy.loadOlder,t[41]=e.copy.loadingOlder,t[42]=e.hasMore,t[43]=e.isLoadingOlder,t[44]=F):F=t[44];let O;t[45]!==q||t[46]!==F?(O=o.jsxs("section",{className:"feed-list",children:[q,F]}),t[45]=q,t[46]=F,t[47]=O):O=t[47];let L;return t[48]!==w||t[49]!==_||t[50]!==O||t[51]!==N?(L=o.jsxs("main",{className:"feed-shell",style:N,children:[w,_,O]}),t[48]=w,t[49]=_,t[50]=O,t[51]=N,t[52]=L):L=t[52],L}function G(t){return t+W}function V(t){return t.status==="pending"}function X(t){const e=M.c(33),{item:s,copy:i,perform:l,sourceIcon:a}=t;let r;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(r=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=r):r=e[3];const c=r,d=`feed-card feed-card-${s.status}`;let n;e[4]!==s.source||e[5]!==a?(n=o.jsx(Z,{icon:a,source:s.source}),e[4]=s.source,e[5]=a,e[6]=n):n=e[6];let u;e[7]!==c?(u=o.jsx("h2",{children:c}),e[7]=c,e[8]=u):u=e[8];let f;e[9]!==n||e[10]!==u?(f=o.jsxs("div",{className:"feed-card-title",children:[n,u]}),e[9]=n,e[10]=u,e[11]=f):f=e[11];let m;e[12]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[12]=s.created_at,e[13]=m):m=e[13];let j;e[14]!==m?(j=o.jsx("time",{children:m}),e[14]=m,e[15]=j):j=e[15];let g;e[16]!==f||e[17]!==j?(g=o.jsxs("div",{className:"feed-card-heading",children:[f,j]}),e[16]=f,e[17]=j,e[18]=g):g=e[18];let N;e[19]!==s.cwd?(N=s.cwd&&o.jsx("div",{className:"feed-cwd",children:s.cwd}),e[19]=s.cwd,e[20]=N):N=e[20];let v;e[21]!==s?(v=o.jsx(ee,{item:s}),e[21]=s,e[22]=v):v=e[22];let y;e[23]!==i||e[24]!==s||e[25]!==l?(y=s.status==="pending"&&o.jsx(te,{item:s,copy:i,perform:l}),e[23]=i,e[24]=s,e[25]=l,e[26]=y):y=e[26];let b;return e[27]!==v||e[28]!==y||e[29]!==d||e[30]!==g||e[31]!==N?(b=o.jsxs("article",{className:d,children:[g,N,v,y]}),e[27]=v,e[28]=y,e[29]=d,e[30]=g,e[31]=N,e[32]=b):b=e[32],b}const Y={claude:"Claude",codex:"Codex","hermes-agent":"Hermes",opencode:"OpenCode",pi:"Pi"};function Z(t){const e=M.c(15),{icon:s,source:i}=t,l=Y[i]??i;let a;e[0]!==s?(a=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=a):a=e[1];const r=a,c=s?void 0:"";let d;e[2]!==s||e[3]!==l?(d=!s&&l.slice(0,1).toUpperCase(),e[2]=s,e[3]=l,e[4]=d):d=e[4];let n;e[5]!==r||e[6]!==c||e[7]!==d?(n=o.jsx("span",{className:"feed-source-logo","data-fallback":c,style:r,"aria-hidden":"true",children:d}),e[5]=r,e[6]=c,e[7]=d,e[8]=n):n=e[8];let u;e[9]!==l?(u=o.jsx("span",{children:l}),e[9]=l,e[10]=u):u=e[10];let f;return e[11]!==i||e[12]!==n||e[13]!==u?(f=o.jsxs("span",{className:"feed-source","data-feed-source":i,children:[n,u]}),e[11]=i,e[12]=n,e[13]=u,e[14]=f):f=e[14],f}function ee(t){const e=M.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=o.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function te(t){const e=M.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let a;e[0]!==s.allowed_permission_modes?(a=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=a):a=e[1];let r;e[2]!==a?(r=new Set(a),e[2]=a,e[3]=r):r=e[3];const c=r;let d;e[4]!==i||e[5]!==s.id||e[6]!==c||e[7]!==l?(d=c.has("deny")&&o.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=c,e[7]=l,e[8]=d):d=e[8];let n;e[9]!==i||e[10]!==s.id||e[11]!==c||e[12]!==l?(n=c.has("once")&&o.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=c,e[12]=l,e[13]=n):n=e[13];let u;e[14]!==i||e[15]!==s.id||e[16]!==c||e[17]!==l?(u=c.has("always")&&o.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=c,e[17]=l,e[18]=u):u=e[18];let f;e[19]!==i||e[20]!==s.id||e[21]!==c||e[22]!==l?(f=c.has("all")&&o.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=c,e[22]=l,e[23]=f):f=e[23];let m;e[24]!==i||e[25]!==s.id||e[26]!==c||e[27]!==l?(m=c.has("bypass")&&o.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=c,e[27]=l,e[28]=m):m=e[28];let j;return e[29]!==d||e[30]!==n||e[31]!==u||e[32]!==f||e[33]!==m?(j=o.jsxs("div",{className:"feed-actions",children:[d,n,u,f,m]}),e[29]=d,e[30]=n,e[31]=u,e[32]=f,e[33]=m,e[34]=j):j=e[34],j}if(s.kind==="exitPlan"){let a;e[35]!==s.id||e[36]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=a):a=e[37];let r;e[38]!==i.planManual||e[39]!==a?(r=o.jsx("button",{onClick:a,children:i.planManual}),e[38]=i.planManual,e[39]=a,e[40]=r):r=e[40];let c;e[41]!==s.id||e[42]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=c):c=e[43];let d;e[44]!==i.planAuto||e[45]!==c?(d=o.jsx("button",{onClick:c,children:i.planAuto}),e[44]=i.planAuto,e[45]=c,e[46]=d):d=e[46];let n;e[47]!==s.id||e[48]!==l?(n=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=n):n=e[49];let u;e[50]!==i.planUltraplan||e[51]!==n?(u=o.jsx("button",{className:"primary",onClick:n,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=n,e[52]=u):u=e[52];let f;return e[53]!==r||e[54]!==d||e[55]!==u?(f=o.jsxs("div",{className:"feed-actions",children:[r,d,u]}),e[53]=r,e[54]=d,e[55]=u,e[56]=f):f=e[56],f}if(s.kind==="question"){let a;e[57]!==s.questions?(a=s.questions??[],e[57]=s.questions,e[58]=a):a=e[58];let r;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==a?(r=o.jsx(se,{item:s,questions:a,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=a,e[63]=r):r=e[63],r}return null}function se(t){const e=M.c(34),{item:s,questions:i,copy:l,perform:a}=t;let r;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(r=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=r):r=e[3];const c=r;let d;e[4]===Symbol.for("react.memo_cache_sentinel")?(d={},e[4]=d):d=e[4];const[n,u]=P.useState(d);let f;e[5]===Symbol.for("react.memo_cache_sentinel")?(f={},e[5]=f):f=e[5];const[m,j]=P.useState(f);let g;e[6]===Symbol.for("react.memo_cache_sentinel")?(g=(x,p)=>{u(h=>{const w=h[x.id]??[],_=x.multi_select?w.includes(p)?w.filter(q=>q!==p):[...w,p]:[p];return{...h,[x.id]:_}})},e[6]=g):g=e[6];const N=g;let v;if(e[7]!==m||e[8]!==c||e[9]!==n){let x;e[11]!==m||e[12]!==n?(x=p=>{const h=m[p.id]?.trim();if(h)return[h];const w=n[p.id]??[],_=p.options.filter(q=>w.includes(q.id)).map(le);return _.length>0?[_.join(", ")]:[]},e[11]=m,e[12]=n,e[13]=x):x=e[13],v=c.flatMap(x),e[7]=m,e[8]=c,e[9]=n,e[10]=v}else v=e[10];const y=v;let b;if(e[14]!==l.questionPlaceholder||e[15]!==m||e[16]!==c||e[17]!==n){let x;e[19]!==l.questionPlaceholder||e[20]!==m||e[21]!==n?(x=p=>o.jsxs("div",{className:"feed-question",children:[p.prompt&&o.jsx("div",{className:"feed-question-prompt",children:p.prompt}),o.jsx("div",{className:"feed-options",children:p.options.map(h=>o.jsxs("button",{"aria-pressed":(n[p.id]??[]).includes(h.id),onClick:()=>N(p,h.id),children:[o.jsx("strong",{children:h.label}),h.description&&o.jsx("span",{children:h.description})]},h.id))}),o.jsx("input",{"aria-label":l.questionPlaceholder,onChange:h=>j(w=>({...w,[p.id]:h.target.value})),placeholder:l.questionPlaceholder,value:m[p.id]??""})]},p.id),e[19]=l.questionPlaceholder,e[20]=m,e[21]=n,e[22]=x):x=e[22],b=c.map(x),e[14]=l.questionPlaceholder,e[15]=m,e[16]=c,e[17]=n,e[18]=b}else b=e[18];const A=y.length===0;let k;e[23]!==y||e[24]!==s.id||e[25]!==a?(k=()=>a("feed.question.reply",{itemId:s.id,selections:y}),e[23]=y,e[24]=s.id,e[25]=a,e[26]=k):k=e[26];let S;e[27]!==l.questionSubmit||e[28]!==A||e[29]!==k?(S=o.jsx("button",{className:"primary",disabled:A,onClick:k,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=A,e[29]=k,e[30]=S):S=e[30];let I;return e[31]!==b||e[32]!==S?(I=o.jsxs("div",{className:"feed-question-actions",children:[b,S]}),e[31]=b,e[32]=S,e[33]=I):I=e[33],I}function le(t){return t.label}function ne(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=Q(()=>o.jsx(J,{}));H.createRoot(t).render(o.jsx(K,{router:e}))}export{ne as mountFeedSurface}; +import{b as _,i as L,j as n,c as Y,a as Z}from"./vendor.mjs";import{c as ee}from"./router.mjs";let z=null;const W=new Set;let H=null;function Q(t){z=t;for(const e of W)e()}function te(t){t.type==="feed.snapshot"&&Q(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:te});async function J(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function se(){return H||(H=J("feed.subscribe").then(Q).catch(t=>{throw H=null,t}),H)}const U={getSnapshot:()=>z,subscribe(t){return W.add(t),se(),()=>W.delete(t)}},V=40;function ie(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function le(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const o=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(r=>r!==e&&r.tabIndex>=0);if(o.length===0)return;const f=o.indexOf(document.activeElement),d=f<0?t.shiftKey?o.length-1:0:(f+(t.shiftKey?-1:1)+o.length)%o.length;t.preventDefault(),o[d]?.focus();return}if(ie(t.target)||t.altKey||t.metaKey)return;const s=t.key.toLowerCase(),i=!t.ctrlKey&&(s==="j"||s==="arrowdown")?1:!t.ctrlKey&&(s==="k"||s==="arrowup")?-1:t.ctrlKey&&s==="n"?1:t.ctrlKey&&s==="p"?-1:0,l=!t.ctrlKey&&(s==="home"||s==="end");if(i===0&&!l)return;const a=[...e.querySelectorAll(".feed-card")];if(a.length===0)return;const u=document.activeElement?.closest(".feed-card"),c=u?a.indexOf(u):-1,p=s==="home"?0:s==="end"?a.length-1:c<0?i>0?0:a.length-1:Math.max(0,Math.min(a.length-1,c+i));t.preventDefault(),a[p]?.focus({preventScroll:!0}),a[p]?.scrollIntoView?.({block:"nearest"})}function ne(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],s=e.indexOf(document.activeElement);if(s<0)return;const i=t.key,l=i==="Home"?0:i==="End"?e.length-1:i==="ArrowLeft"?(s-1+e.length)%e.length:i==="ArrowRight"?(s+1)%e.length:-1;l<0||(t.preventDefault(),t.stopPropagation(),e[l]?.focus(),e[l]?.click())}function oe(){const t=_.c(58),e=L.useSyncExternalStore(U.subscribe,U.getSnapshot,U.getSnapshot),[s,i]=L.useState("actionable"),[l,a]=L.useState(V),[u,c]=L.useState(null),p=L.useRef(de);let o;t[0]===Symbol.for("react.memo_cache_sentinel")?(o=v=>{if(p.current(),p.current=re,!v)return;const B=G=>le(G,v);v.addEventListener("keydown",B),p.current=()=>v.removeEventListener("keydown",B),(!document.activeElement||document.activeElement===document.body)&&v.focus()},t[0]=o):o=t[0];const f=o;if(!e){let v;return t[1]===Symbol.for("react.memo_cache_sentinel")?(v=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[1]=v):v=t[1],v}let d;t[2]!==s||t[3]!==e.items?(d=s==="actionable"?e.items.filter(ae):e.items,t[2]=s,t[3]=e.items,t[4]=d):d=t[4];const r=d;let m;t[5]!==l||t[6]!==s||t[7]!==r?(m=s==="activity"?r.slice(0,l):r,t[5]=l,t[6]=s,t[7]=r,t[8]=m):m=t[8];const y=m,x=s==="activity"&&y.length{c(null);try{await J(v,B)}catch{c(e.copy.requestFailed)}},t[13]=e.copy.requestFailed,t[14]=N):N=t[14];const S=N;let I;t[15]!==e.copy.feed?(I=n.jsx("h1",{children:e.copy.feed}),t[15]=e.copy.feed,t[16]=I):I=t[16];const A=s==="actionable";let w;t[17]===Symbol.for("react.memo_cache_sentinel")?(w=()=>i("actionable"),t[17]=w):w=t[17];const g=s==="actionable"?0:-1;let j;t[18]!==e.copy.actionable||t[19]!==A||t[20]!==g?(j=n.jsx("button",{"aria-selected":A,onClick:w,role:"tab",tabIndex:g,children:e.copy.actionable}),t[18]=e.copy.actionable,t[19]=A,t[20]=g,t[21]=j):j=t[21];const E=s==="activity";let q;t[22]===Symbol.for("react.memo_cache_sentinel")?(q=()=>i("activity"),t[22]=q):q=t[22];const C=s==="activity"?0:-1;let F;t[23]!==e.copy.activity||t[24]!==E||t[25]!==C?(F=n.jsx("button",{"aria-selected":E,onClick:q,role:"tab",tabIndex:C,children:e.copy.activity}),t[23]=e.copy.activity,t[24]=E,t[25]=C,t[26]=F):F=t[26];let K;t[27]!==j||t[28]!==F?(K=n.jsxs("div",{className:"feed-filter",onKeyDown:ne,role:"tablist",tabIndex:-1,children:[j,F]}),t[27]=j,t[28]=F,t[29]=K):K=t[29];let O;t[30]!==K||t[31]!==I?(O=n.jsxs("header",{className:"feed-header",children:[I,K]}),t[30]=K,t[31]=I,t[32]=O):O=t[32];let P;t[33]!==u?(P=u&&n.jsx("div",{className:"feed-error",role:"alert",children:u}),t[33]=u,t[34]=P):P=t[34];let T;t[35]!==s||t[36]!==S||t[37]!==e||t[38]!==y?(T=y.length===0?n.jsx(ue,{filter:s,snapshot:e}):y.map(v=>n.jsx(fe,{item:v,copy:e.copy,perform:S,sourceIcon:e.sourceIcons[v.source],sourceLabel:e.sourceLabels[v.source]},v.id)),t[35]=s,t[36]=S,t[37]=e,t[38]=y,t[39]=T):T=t[39];let M;t[40]!==x||t[41]!==S||t[42]!==e.copy.loadOlder||t[43]!==e.copy.loadingOlder||t[44]!==e.hasMore||t[45]!==e.isLoadingOlder?(M=(x||e.hasMore)&&n.jsx("button",{className:"feed-load-more",disabled:!x&&e.isLoadingOlder,onClick:()=>{x?a(ce):S("feed.loadOlder",{})},children:!x&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[40]=x,t[41]=S,t[42]=e.copy.loadOlder,t[43]=e.copy.loadingOlder,t[44]=e.hasMore,t[45]=e.isLoadingOlder,t[46]=M):M=t[46];let R;t[47]!==T||t[48]!==M?(R=n.jsxs("section",{className:"feed-list",children:[T,M]}),t[47]=T,t[48]=M,t[49]=R):R=t[49];let D;t[50]!==e.copy.feed||t[51]!==O||t[52]!==P||t[53]!==R?(D=n.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:f,tabIndex:-1,children:[O,P,R]}),t[50]=e.copy.feed,t[51]=O,t[52]=P,t[53]=R,t[54]=D):D=t[54];let $;return t[55]!==D||t[56]!==h?($=n.jsx("main",{className:"feed-shell",style:h,children:D}),t[55]=D,t[56]=h,t[57]=$):$=t[57],$}function ce(t){return t+V}function ae(t){return t.status==="pending"}function re(){}function de(){}function ue(t){const e=_.c(35),{filter:s,snapshot:i}=t,l=s==="actionable"?i.copy.emptyActionable:i.copy.emptyActivity,a=s==="actionable"?i.copy.emptyActionableDescription:i.copy.emptyActivityDescription;let u;e[0]!==i.copy.integrationChecking||e[1]!==i.copy.integrationDisabled||e[2]!==i.copy.integrationNeedsSetup||e[3]!==i.copy.integrationReady?(u=b=>({checking:i.copy.integrationChecking,disabled:i.copy.integrationDisabled,needsSetup:i.copy.integrationNeedsSetup,ready:i.copy.integrationReady})[b.status],e[0]=i.copy.integrationChecking,e[1]=i.copy.integrationDisabled,e[2]=i.copy.integrationNeedsSetup,e[3]=i.copy.integrationReady,e[4]=u):u=e[4];const c=u;let p;e[5]!==l?(p=n.jsx("h2",{children:l}),e[5]=l,e[6]=p):p=e[6];let o;e[7]!==a?(o=n.jsx("p",{children:a}),e[7]=a,e[8]=o):o=e[8];let f;e[9]!==i.copy.integrationsTitle?(f=n.jsx("h3",{id:"feed-integrations-title",children:i.copy.integrationsTitle}),e[9]=i.copy.integrationsTitle,e[10]=f):f=e[10];let d;if(e[11]!==i.integrations||e[12]!==i.sourceIcons||e[13]!==i.sourceLabels||e[14]!==c){let b;e[16]!==i.sourceIcons||e[17]!==i.sourceLabels||e[18]!==c?(b=h=>n.jsxs("div",{className:"feed-integration","data-status":h.status,children:[n.jsx(X,{icon:i.sourceIcons[h.source],label:i.sourceLabels[h.source],source:h.source}),n.jsx("span",{className:"feed-integration-status",children:c(h)})]},h.source),e[16]=i.sourceIcons,e[17]=i.sourceLabels,e[18]=c,e[19]=b):b=e[19],d=i.integrations.map(b),e[11]=i.integrations,e[12]=i.sourceIcons,e[13]=i.sourceLabels,e[14]=c,e[15]=d}else d=e[15];let r;e[20]!==d?(r=n.jsx("div",{className:"feed-integration-grid",children:d}),e[20]=d,e[21]=r):r=e[21];let m;e[22]!==i.copy.integrationHint?(m=n.jsx("p",{className:"feed-integration-hint",children:i.copy.integrationHint}),e[22]=i.copy.integrationHint,e[23]=m):m=e[23];let y;e[24]!==f||e[25]!==r||e[26]!==m?(y=n.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[f,r,m]}),e[24]=f,e[25]=r,e[26]=m,e[27]=y):y=e[27];let x;e[28]!==i.copy.keyboardHelp?(x=n.jsx("p",{className:"feed-keyboard-help",children:i.copy.keyboardHelp}),e[28]=i.copy.keyboardHelp,e[29]=x):x=e[29];let k;return e[30]!==p||e[31]!==o||e[32]!==y||e[33]!==x?(k=n.jsxs("div",{className:"feed-empty",children:[p,o,y,x]}),e[30]=p,e[31]=o,e[32]=y,e[33]=x,e[34]=k):k=e[34],k}function fe(t){const e=_.c(34),{item:s,copy:i,perform:l,sourceIcon:a,sourceLabel:u}=t;let c;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(c=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=c):c=e[3];const p=c,o=`feed-card feed-card-${s.status}`;let f;e[4]!==s.source||e[5]!==a||e[6]!==u?(f=n.jsx(X,{icon:a,label:u,source:s.source}),e[4]=s.source,e[5]=a,e[6]=u,e[7]=f):f=e[7];let d;e[8]!==p?(d=n.jsx("h2",{children:p}),e[8]=p,e[9]=d):d=e[9];let r;e[10]!==f||e[11]!==d?(r=n.jsxs("div",{className:"feed-card-title",children:[f,d]}),e[10]=f,e[11]=d,e[12]=r):r=e[12];let m;e[13]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=s.created_at,e[14]=m):m=e[14];let y;e[15]!==m?(y=n.jsx("time",{children:m}),e[15]=m,e[16]=y):y=e[16];let x;e[17]!==r||e[18]!==y?(x=n.jsxs("div",{className:"feed-card-heading",children:[r,y]}),e[17]=r,e[18]=y,e[19]=x):x=e[19];let k;e[20]!==s.cwd?(k=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[20]=s.cwd,e[21]=k):k=e[21];let b;e[22]!==s?(b=n.jsx(pe,{item:s}),e[22]=s,e[23]=b):b=e[23];let h;e[24]!==i||e[25]!==s||e[26]!==l?(h=s.status==="pending"&&n.jsx(me,{item:s,copy:i,perform:l}),e[24]=i,e[25]=s,e[26]=l,e[27]=h):h=e[27];let N;return e[28]!==b||e[29]!==h||e[30]!==o||e[31]!==x||e[32]!==k?(N=n.jsxs("article",{className:o,tabIndex:-1,children:[x,k,b,h]}),e[28]=b,e[29]=h,e[30]=o,e[31]=x,e[32]=k,e[33]=N):N=e[33],N}function X(t){const e=_.c(15),{icon:s,label:i,source:l}=t,a=i??l;let u;e[0]!==s?(u=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=u):u=e[1];const c=u,p=s?void 0:"";let o;e[2]!==a||e[3]!==s?(o=!s&&a.slice(0,1).toUpperCase(),e[2]=a,e[3]=s,e[4]=o):o=e[4];let f;e[5]!==c||e[6]!==p||e[7]!==o?(f=n.jsx("span",{className:"feed-source-logo","data-fallback":p,style:c,"aria-hidden":"true",children:o}),e[5]=c,e[6]=p,e[7]=o,e[8]=f):f=e[8];let d;e[9]!==a?(d=n.jsx("span",{children:a}),e[9]=a,e[10]=d):d=e[10];let r;return e[11]!==l||e[12]!==f||e[13]!==d?(r=n.jsxs("span",{className:"feed-source","data-feed-source":l,children:[f,d]}),e[11]=l,e[12]=f,e[13]=d,e[14]=r):r=e[14],r}function pe(t){const e=_.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function me(t){const e=_.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let a;e[0]!==s.allowed_permission_modes?(a=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=a):a=e[1];let u;e[2]!==a?(u=new Set(a),e[2]=a,e[3]=u):u=e[3];const c=u;let p;e[4]!==i||e[5]!==s.id||e[6]!==c||e[7]!==l?(p=c.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=c,e[7]=l,e[8]=p):p=e[8];let o;e[9]!==i||e[10]!==s.id||e[11]!==c||e[12]!==l?(o=c.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=c,e[12]=l,e[13]=o):o=e[13];let f;e[14]!==i||e[15]!==s.id||e[16]!==c||e[17]!==l?(f=c.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=c,e[17]=l,e[18]=f):f=e[18];let d;e[19]!==i||e[20]!==s.id||e[21]!==c||e[22]!==l?(d=c.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=c,e[22]=l,e[23]=d):d=e[23];let r;e[24]!==i||e[25]!==s.id||e[26]!==c||e[27]!==l?(r=c.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=c,e[27]=l,e[28]=r):r=e[28];let m;return e[29]!==p||e[30]!==o||e[31]!==f||e[32]!==d||e[33]!==r?(m=n.jsxs("div",{className:"feed-actions",children:[p,o,f,d,r]}),e[29]=p,e[30]=o,e[31]=f,e[32]=d,e[33]=r,e[34]=m):m=e[34],m}if(s.kind==="exitPlan"){let a;e[35]!==s.id||e[36]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=a):a=e[37];let u;e[38]!==i.planManual||e[39]!==a?(u=n.jsx("button",{onClick:a,children:i.planManual}),e[38]=i.planManual,e[39]=a,e[40]=u):u=e[40];let c;e[41]!==s.id||e[42]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=c):c=e[43];let p;e[44]!==i.planAuto||e[45]!==c?(p=n.jsx("button",{onClick:c,children:i.planAuto}),e[44]=i.planAuto,e[45]=c,e[46]=p):p=e[46];let o;e[47]!==s.id||e[48]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=o):o=e[49];let f;e[50]!==i.planUltraplan||e[51]!==o?(f=n.jsx("button",{className:"primary",onClick:o,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=o,e[52]=f):f=e[52];let d;return e[53]!==u||e[54]!==p||e[55]!==f?(d=n.jsxs("div",{className:"feed-actions",children:[u,p,f]}),e[53]=u,e[54]=p,e[55]=f,e[56]=d):d=e[56],d}if(s.kind==="question"){let a;e[57]!==s.questions?(a=s.questions??[],e[57]=s.questions,e[58]=a):a=e[58];let u;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==a?(u=n.jsx(ye,{item:s,questions:a,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=a,e[63]=u):u=e[63],u}return null}function ye(t){const e=_.c(34),{item:s,questions:i,copy:l,perform:a}=t;let u;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(u=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=u):u=e[3];const c=u;let p;e[4]===Symbol.for("react.memo_cache_sentinel")?(p={},e[4]=p):p=e[4];const[o,f]=L.useState(p);let d;e[5]===Symbol.for("react.memo_cache_sentinel")?(d={},e[5]=d):d=e[5];const[r,m]=L.useState(d);let y;e[6]===Symbol.for("react.memo_cache_sentinel")?(y=(w,g)=>{f(j=>{const E=j[w.id]??[],q=w.multi_select?E.includes(g)?E.filter(C=>C!==g):[...E,g]:[g];return{...j,[w.id]:q}})},e[6]=y):y=e[6];const x=y;let k;if(e[7]!==r||e[8]!==c||e[9]!==o){let w;e[11]!==r||e[12]!==o?(w=g=>{const j=r[g.id]?.trim();if(j)return[j];const E=o[g.id]??[],q=g.options.filter(C=>E.includes(C.id)).map(he);return q.length>0?[q.join(", ")]:[]},e[11]=r,e[12]=o,e[13]=w):w=e[13],k=c.flatMap(w),e[7]=r,e[8]=c,e[9]=o,e[10]=k}else k=e[10];const b=k;let h;if(e[14]!==l.questionPlaceholder||e[15]!==r||e[16]!==c||e[17]!==o){let w;e[19]!==l.questionPlaceholder||e[20]!==r||e[21]!==o?(w=g=>n.jsxs("div",{className:"feed-question",children:[g.prompt&&n.jsx("div",{className:"feed-question-prompt",children:g.prompt}),n.jsx("div",{className:"feed-options",children:g.options.map(j=>n.jsxs("button",{"aria-pressed":(o[g.id]??[]).includes(j.id),onClick:()=>x(g,j.id),children:[n.jsx("strong",{children:j.label}),j.description&&n.jsx("span",{children:j.description})]},j.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:j=>m(E=>({...E,[g.id]:j.target.value})),placeholder:l.questionPlaceholder,value:r[g.id]??""})]},g.id),e[19]=l.questionPlaceholder,e[20]=r,e[21]=o,e[22]=w):w=e[22],h=c.map(w),e[14]=l.questionPlaceholder,e[15]=r,e[16]=c,e[17]=o,e[18]=h}else h=e[18];const N=b.length===0;let S;e[23]!==b||e[24]!==s.id||e[25]!==a?(S=()=>a("feed.question.reply",{itemId:s.id,selections:b}),e[23]=b,e[24]=s.id,e[25]=a,e[26]=S):S=e[26];let I;e[27]!==l.questionSubmit||e[28]!==N||e[29]!==S?(I=n.jsx("button",{className:"primary",disabled:N,onClick:S,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=N,e[29]=S,e[30]=I):I=e[30];let A;return e[31]!==h||e[32]!==I?(A=n.jsxs("div",{className:"feed-question-actions",children:[h,I]}),e[31]=h,e[32]=I,e[33]=A):A=e[33],A}function he(t){return t.label}function ge(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ee(()=>n.jsx(oe,{}));Y.createRoot(t).render(n.jsx(Z,{router:e}))}export{ge as mountFeedSurface}; diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index 8efb9982cad2..a353651e357a 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -1,6 +1,7 @@ import AppKit import CMUXAgentLaunch import CmuxFoundation +import CmuxSettings import Foundation import Observation import WebKit @@ -15,10 +16,14 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { private static var handlerInstalledKey: UInt8 = 0 private static var subscriptionGenerationKey: UInt8 = 0 private let subscribedWebViews = NSHashTable.weakObjects() + private var integrationReadiness: [FeedIntegrationReadiness] = [] + private var integrationScanTask: Task? + private var settingsObserver: NSObjectProtocol? private var themeObserver: NSObjectProtocol? override init() { super.init() + integrationReadiness = Self.integrationReadiness(installedSources: nil) themeObserver = NotificationCenter.default.addObserver( forName: .ghosttyDefaultBackgroundDidChange, object: nil, @@ -28,9 +33,23 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { self?.publishSnapshotToSubscribers() } } + settingsObserver = NotificationCenter.default.addObserver( + forName: UserDefaults.didChangeNotification, + object: nil, + queue: .main + ) { [weak self] _ in + MainActor.assumeIsolated { + self?.refreshIntegrationReadiness() + } + } + refreshIntegrationReadiness() } deinit { + integrationScanTask?.cancel() + if let settingsObserver { + NotificationCenter.default.removeObserver(settingsObserver) + } if let themeObserver { NotificationCenter.default.removeObserver(themeObserver) } @@ -197,7 +216,9 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { let foreground = GhosttyApp.shared.defaultForegroundColor return [ "items": (store?.items ?? []).map(itemDictionary), + "integrations": integrationReadiness.map(\.dictionary), "sourceIcons": Self.sourceIconDataURLs, + "sourceLabels": Self.sourceLabels, "theme": [ "background": background.hexString(), "foreground": foreground.hexString(), @@ -210,7 +231,16 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { "actionable": String(localized: "feed.filter.actionable", defaultValue: "Actionable"), "activity": String(localized: "feed.filter.activity", defaultValue: "All Activity"), "emptyActionable": String(localized: "feed.empty.actionable.title", defaultValue: "No pending decisions"), + "emptyActionableDescription": String(localized: "feed.empty.actionable.subtitle", defaultValue: "Permission, plan, and question requests from AI agents will appear here."), "emptyActivity": String(localized: "feed.empty.activity.title", defaultValue: "No activity yet"), + "emptyActivityDescription": String(localized: "feed.empty.all.subtitle", defaultValue: "Tool use, messages, and session events will appear here."), + "integrationsTitle": String(localized: "feed.integrations.title", defaultValue: "Agent integrations"), + "integrationReady": String(localized: "feed.integrations.status.ready", defaultValue: "Ready"), + "integrationDisabled": String(localized: "feed.integrations.status.disabled", defaultValue: "Disabled in Settings"), + "integrationNeedsSetup": String(localized: "feed.integrations.status.needsSetup", defaultValue: "Setup needed"), + "integrationChecking": String(localized: "feed.integrations.status.checking", defaultValue: "Checking..."), + "integrationHint": String(localized: "feed.integrations.hint", defaultValue: "Claude Code and Codex use Settings. Other agents need `cmux hooks setup`."), + "keyboardHelp": String(localized: "feed.keyboard.help", defaultValue: "Navigate with ↑/↓, J/K, or Control-N/Control-P. Press Tab to reach actions."), "loadOlder": String(localized: "feed.history.loadOlder", defaultValue: "Load older activity"), "loadingOlder": String(localized: "feed.history.loadingOlder", defaultValue: "Loading older activity..."), "deny": String(localized: "feed.permission.deny", defaultValue: "Deny"), @@ -247,6 +277,160 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { } }() + private static let sourceLabels: [String: String] = [ + WorkstreamSource.claude.rawValue: String(localized: "feed.source.claude", defaultValue: "Claude Code"), + WorkstreamSource.codex.rawValue: String(localized: "feed.source.codex", defaultValue: "Codex"), + WorkstreamSource.pi.rawValue: String(localized: "feed.source.pi", defaultValue: "Pi"), + WorkstreamSource.amp.rawValue: String(localized: "feed.source.amp", defaultValue: "Amp"), + WorkstreamSource.cursor.rawValue: String(localized: "feed.source.cursor", defaultValue: "Cursor"), + WorkstreamSource.opencode.rawValue: String(localized: "feed.source.opencode", defaultValue: "OpenCode"), + WorkstreamSource.gemini.rawValue: String(localized: "feed.source.gemini", defaultValue: "Gemini"), + WorkstreamSource.hermesAgent.rawValue: String(localized: "feed.source.hermes", defaultValue: "Hermes Agent"), + WorkstreamSource.copilot.rawValue: String(localized: "feed.source.copilot", defaultValue: "Copilot"), + WorkstreamSource.codebuddy.rawValue: String(localized: "feed.source.codebuddy", defaultValue: "CodeBuddy"), + WorkstreamSource.factory.rawValue: String(localized: "feed.source.factory", defaultValue: "Factory"), + WorkstreamSource.qoder.rawValue: String(localized: "feed.source.qoder", defaultValue: "Qoder"), + ] + + private static let integrationSources: [WorkstreamSource] = [ + .claude, + .codex, + .cursor, + .gemini, + .opencode, + .pi, + .hermesAgent, + .copilot, + .codebuddy, + .factory, + .qoder, + ] + + private static func integrationReadiness(installedSources: Set?) -> [FeedIntegrationReadiness] { + let settings = AgentIntegrationSettingsStore(defaults: .standard) + return integrationSources.map { source in + let status: FeedIntegrationStatus + switch source { + case .claude: + status = settings.claudeCodeHooksEnabled ? .ready : .disabled + case .codex: + status = settings.codexHooksEnabled ? .ready : .disabled + case .cursor: + status = integrationStatus( + settingEnabled: settings.cursorHooksEnabled, + isInstalled: installedSources?.contains(source.rawValue) + ) + case .gemini: + status = integrationStatus( + settingEnabled: settings.geminiHooksEnabled, + isInstalled: installedSources?.contains(source.rawValue) + ) + default: + status = installedSources.map { $0.contains(source.rawValue) ? .ready : .needsSetup } ?? .checking + } + return FeedIntegrationReadiness(source: source.rawValue, status: status) + } + } + + private static func integrationStatus(settingEnabled: Bool, isInstalled: Bool?) -> FeedIntegrationStatus { + guard settingEnabled else { return .disabled } + return isInstalled.map { $0 ? .ready : .needsSetup } ?? .checking + } + + private func refreshIntegrationReadiness() { + integrationScanTask?.cancel() + integrationReadiness = Self.integrationReadiness(installedSources: nil) + publishSnapshotToSubscribers() + integrationScanTask = Task { @MainActor [weak self] in + let installedSources = await Task.detached(priority: .utility) { + Self.installedFeedHookSources() + }.value + guard !Task.isCancelled, let self else { return } + self.integrationReadiness = Self.integrationReadiness(installedSources: installedSources) + self.publishSnapshotToSubscribers() + } + } + + nonisolated private static func installedFeedHookSources() -> Set { + let probes = [ + FeedHookProbe( + source: WorkstreamSource.cursor.rawValue, + url: configURL(directory: ".cursor", file: "hooks.json"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.gemini.rawValue, + url: configURL(directory: ".gemini", file: "settings.json"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.opencode.rawValue, + url: configURL( + directory: ".config/opencode", + file: "plugins/cmux-feed.js", + environmentOverride: "OPENCODE_CONFIG_DIR" + ), + marker: "cmux-feed-plugin-marker" + ), + FeedHookProbe( + source: WorkstreamSource.pi.rawValue, + url: configURL( + directory: ".pi/agent", + file: "extensions/cmux-session.ts", + environmentOverride: "PI_CODING_AGENT_DIR" + ), + marker: "cmux-pi-session-extension-marker v2" + ), + FeedHookProbe( + source: WorkstreamSource.hermesAgent.rawValue, + url: configURL(directory: ".hermes", file: "config.yaml", environmentOverride: "HERMES_HOME"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.copilot.rawValue, + url: configURL(directory: ".copilot", file: "config.json", environmentOverride: "COPILOT_HOME"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.codebuddy.rawValue, + url: configURL(directory: ".codebuddy", file: "settings.json", environmentOverride: "CODEBUDDY_CONFIG_DIR"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.factory.rawValue, + url: configURL(directory: ".factory", file: "settings.json"), + marker: "cmux hooks feed --source" + ), + FeedHookProbe( + source: WorkstreamSource.qoder.rawValue, + url: configURL(directory: ".qoder", file: "settings.json", environmentOverride: "QODER_CONFIG_DIR"), + marker: "cmux hooks feed --source" + ), + ] + return Set(probes.compactMap { probe in + guard let contents = try? String(contentsOf: probe.url, encoding: .utf8), + contents.contains(probe.marker) else { return nil } + return probe.source + }) + } + + nonisolated private static func configURL( + directory: String, + file: String, + environmentOverride: String? = nil + ) -> URL { + if let environmentOverride, + let value = ProcessInfo.processInfo.environment[environmentOverride]? + .trimmingCharacters(in: .whitespacesAndNewlines), + !value.isEmpty { + return URL(fileURLWithPath: NSString(string: value).expandingTildeInPath, isDirectory: true) + .appendingPathComponent(file, isDirectory: false) + } + return FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent(directory, isDirectory: true) + .appendingPathComponent(file, isDirectory: false) + } + private func itemDictionary(_ item: WorkstreamItem) -> [String: Any] { var dictionary = FeedSocketEncoding.itemDict(item) guard case .permissionRequest(_, _, let toolInputJSON, _) = item.payload else { @@ -348,3 +532,25 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { private enum FeedSurfaceBridgeError: Error { case invalidRequest } + +private enum FeedIntegrationStatus: String, Sendable { + case checking + case disabled + case needsSetup + case ready +} + +private struct FeedIntegrationReadiness: Sendable { + let source: String + let status: FeedIntegrationStatus + + var dictionary: [String: String] { + ["source": source, "status": status.rawValue] + } +} + +private struct FeedHookProbe: Sendable { + let source: String + let url: URL + let marker: String +} diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index 9d1aea85c68d..f687dac50a33 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -1,12 +1,81 @@ -import { useState, useSyncExternalStore } from "react"; +import { useCallback, useRef, useState, useSyncExternalStore } from "react"; import { callFeedNative, feedSnapshotStore } from "./bridge"; -import type { CSSProperties } from "react"; -import type { FeedItem, FeedQuestion } from "./types"; +import type { CSSProperties, KeyboardEvent as ReactKeyboardEvent } from "react"; +import type { FeedIntegration, FeedItem, FeedQuestion } from "./types"; import "./styles.css"; type Filter = "actionable" | "activity"; export const feedActivityPageSize = 40; +function isEditable(target: EventTarget | null) { + return target instanceof HTMLElement + && (target.isContentEditable || ["INPUT", "SELECT", "TEXTAREA"].includes(target.tagName)); +} + +export function handleFeedNavigation(event: KeyboardEvent, root: HTMLElement) { + if (event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey) { + const controls = [...root.querySelectorAll( + 'button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]', + )].filter((control) => control !== root && control.tabIndex >= 0); + if (controls.length === 0) return; + const activeIndex = controls.indexOf(document.activeElement as HTMLElement); + const nextIndex = activeIndex < 0 + ? (event.shiftKey ? controls.length - 1 : 0) + : (activeIndex + (event.shiftKey ? -1 : 1) + controls.length) % controls.length; + event.preventDefault(); + controls[nextIndex]?.focus(); + return; + } + if (isEditable(event.target) || event.altKey || event.metaKey) return; + const key = event.key.toLowerCase(); + const direction = !event.ctrlKey && (key === "j" || key === "arrowdown") + ? 1 + : !event.ctrlKey && (key === "k" || key === "arrowup") + ? -1 + : event.ctrlKey && key === "n" + ? 1 + : event.ctrlKey && key === "p" + ? -1 + : 0; + const isBoundaryKey = !event.ctrlKey && (key === "home" || key === "end"); + if (direction === 0 && !isBoundaryKey) return; + const cards = [...root.querySelectorAll(".feed-card")]; + if (cards.length === 0) return; + const activeCard = document.activeElement?.closest(".feed-card"); + const activeIndex = activeCard ? cards.indexOf(activeCard) : -1; + const nextIndex = key === "home" + ? 0 + : key === "end" + ? cards.length - 1 + : activeIndex < 0 + ? (direction > 0 ? 0 : cards.length - 1) + : Math.max(0, Math.min(cards.length - 1, activeIndex + direction)); + event.preventDefault(); + cards[nextIndex]?.focus({ preventScroll: true }); + cards[nextIndex]?.scrollIntoView?.({ block: "nearest" }); +} + +function handleTabNavigation(event: ReactKeyboardEvent) { + const tabs = [...event.currentTarget.querySelectorAll('[role="tab"]')]; + const currentIndex = tabs.indexOf(document.activeElement as HTMLButtonElement); + if (currentIndex < 0) return; + const key = event.key; + const nextIndex = key === "Home" + ? 0 + : key === "End" + ? tabs.length - 1 + : key === "ArrowLeft" + ? (currentIndex - 1 + tabs.length) % tabs.length + : key === "ArrowRight" + ? (currentIndex + 1) % tabs.length + : -1; + if (nextIndex < 0) return; + event.preventDefault(); + event.stopPropagation(); + tabs[nextIndex]?.focus(); + tabs[nextIndex]?.click(); +} + export function FeedApp() { const snapshot = useSyncExternalStore( feedSnapshotStore.subscribe, @@ -16,6 +85,16 @@ export function FeedApp() { const [filter, setFilter] = useState("actionable"); const [activityLimit, setActivityLimit] = useState(feedActivityPageSize); const [error, setError] = useState(null); + const keyboardCleanup = useRef<() => void>(() => {}); + const bindKeyboardRoot = useCallback((node: HTMLElement | null) => { + keyboardCleanup.current(); + keyboardCleanup.current = () => {}; + if (!node) return; + const onKeyDown = (event: KeyboardEvent) => handleFeedNavigation(event, node); + node.addEventListener("keydown", onKeyDown); + keyboardCleanup.current = () => node.removeEventListener("keydown", onKeyDown); + if (!document.activeElement || document.activeElement === document.body) node.focus(); + }, []); if (!snapshot) return
; const items = filter === "actionable" @@ -39,14 +118,33 @@ export function FeedApp() { }; return ( -
+
+

{snapshot.copy.feed}

-
- -
@@ -54,9 +152,7 @@ export function FeedApp() { {error &&
{error}
}
{visibleItems.length === 0 ? ( -
- {filter === "actionable" ? snapshot.copy.emptyActionable : snapshot.copy.emptyActivity} -
+ ) : visibleItems.map((item) => ( ))} {(hasBufferedActivity || snapshot.hasMore) && ( @@ -82,22 +179,63 @@ export function FeedApp() { )}
+
); } -function FeedCard({ item, copy, perform, sourceIcon }: { +function FeedEmptyState({ filter, snapshot }: { + filter: Filter; + snapshot: NonNullable>; +}) { + const title = filter === "actionable" ? snapshot.copy.emptyActionable : snapshot.copy.emptyActivity; + const description = filter === "actionable" + ? snapshot.copy.emptyActionableDescription + : snapshot.copy.emptyActivityDescription; + const statusLabel = (integration: FeedIntegration) => ({ + checking: snapshot.copy.integrationChecking, + disabled: snapshot.copy.integrationDisabled, + needsSetup: snapshot.copy.integrationNeedsSetup, + ready: snapshot.copy.integrationReady, + })[integration.status]; + return ( +
+

{title}

+

{description}

+
+

{snapshot.copy.integrationsTitle}

+
+ {snapshot.integrations.map((integration) => ( +
+ + {statusLabel(integration)} +
+ ))} +
+

{snapshot.copy.integrationHint}

+
+

{snapshot.copy.keyboardHelp}

+
+ ); +} + +function FeedCard({ item, copy, perform, sourceIcon, sourceLabel }: { item: FeedItem; copy: NonNullable>["copy"]; perform: (method: string, params: Record) => Promise; sourceIcon?: string; + sourceLabel?: string; }) { const title = item.title || item.tool_name || item.kind.replaceAll("_", " "); return ( -
+
- +

{title}

@@ -111,25 +249,17 @@ function FeedCard({ item, copy, perform, sourceIcon }: { ); } -const sourceLabels: Record = { - claude: "Claude", - codex: "Codex", - "hermes-agent": "Hermes", - opencode: "OpenCode", - pi: "Pi", -}; - -function SourceIdentity({ icon, source }: { icon?: string; source: string }) { - const label = sourceLabels[source] ?? source; +function SourceIdentity({ icon, label, source }: { icon?: string; label?: string; source: string }) { + const displayLabel = label ?? source; const style = icon ? ({ "--feed-source-icon": `url(${JSON.stringify(icon)})` } as CSSProperties) : undefined; return ( - {label} + {displayLabel} ); } diff --git a/webviews/src/feed/bridge.ts b/webviews/src/feed/bridge.ts index 85bbb50ea064..82423f001b13 100644 --- a/webviews/src/feed/bridge.ts +++ b/webviews/src/feed/bridge.ts @@ -27,12 +27,12 @@ function publish(snapshot: FeedSnapshot) { for (const listener of listeners) listener(); } +export function receiveFeedNativeEvent(event: FeedNativeEvent) { + if (event.type === "feed.snapshot") publish(event.snapshot); +} + if (typeof window !== "undefined") { - window.cmuxFeedBridge = { - receive(event) { - if (event.type === "feed.snapshot") publish(event.snapshot); - }, - }; + window.cmuxFeedBridge = { receive: receiveFeedNativeEvent }; } export async function callFeedNative(method: string, params: Record = {}): Promise { diff --git a/webviews/src/feed/styles.css b/webviews/src/feed/styles.css index 4746081336b4..05bcc3952eee 100644 --- a/webviews/src/feed/styles.css +++ b/webviews/src/feed/styles.css @@ -77,6 +77,12 @@ button, input { font: inherit; } padding: 10px; } +.feed-card:focus-visible { + border-color: var(--feed-foreground); + outline: 1px solid var(--feed-foreground); + outline-offset: 2px; +} + .feed-card-pending { border-color: var(--feed-border-strong); } .feed-card-heading { @@ -212,10 +218,78 @@ button, input { font: inherit; } .feed-empty { color: var(--feed-muted); - padding: 44px 12px; + display: grid; + gap: 6px; + padding: 36px 0; +} + +.feed-empty > h2 { + color: var(--feed-foreground); + font-size: 14px; + margin: 0; + text-align: center; +} + +.feed-empty > p { + margin: 0 auto; + max-width: 520px; text-align: center; } +.feed-integrations { + border: 1px solid var(--feed-border); + margin-top: 16px; + padding: 12px; +} + +.feed-integrations h3 { + color: var(--feed-foreground); + font-size: inherit; + margin: 0 0 8px; +} + +.feed-integration-grid { + display: grid; + gap: 1px 16px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.feed-integration { + align-items: center; + border-top: 1px solid var(--feed-border); + display: flex; + gap: 8px; + justify-content: space-between; + min-width: 0; + padding: 7px 0; +} + +.feed-integration-status { + flex: none; + font-size: 11px; +} + +.feed-integration[data-status="ready"] .feed-integration-status { + color: var(--feed-foreground); +} + +.feed-integration[data-status="disabled"] .feed-integration-status, +.feed-integration[data-status="needsSetup"] .feed-integration-status { + color: color-mix(in srgb, #ff9f0a 80%, var(--feed-foreground)); +} + +.feed-integration-hint { + border-top: 1px solid var(--feed-border); + margin: 1px 0 0; + padding-top: 9px; +} + +.feed-empty > .feed-keyboard-help { + font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; + font-size: 11px; + margin-top: 10px; +} + .feed-error { border: 1px solid var(--feed-border-strong); margin: 0 auto 6px; @@ -232,4 +306,5 @@ button:focus-visible, .feed-header { align-items: stretch; flex-direction: column; gap: 8px; } .feed-filter { align-self: flex-start; } .feed-card-title { align-items: flex-start; flex-direction: column; gap: 3px; } + .feed-integration-grid { grid-template-columns: 1fr; } } diff --git a/webviews/src/feed/types.ts b/webviews/src/feed/types.ts index ba895a224e45..5d546548c891 100644 --- a/webviews/src/feed/types.ts +++ b/webviews/src/feed/types.ts @@ -43,8 +43,17 @@ export type FeedCopy = { allowOnce: string; deny: string; emptyActionable: string; + emptyActionableDescription: string; emptyActivity: string; + emptyActivityDescription: string; feed: string; + integrationChecking: string; + integrationDisabled: string; + integrationHint: string; + integrationNeedsSetup: string; + integrationReady: string; + integrationsTitle: string; + keyboardHelp: string; loadOlder: string; loadingOlder: string; planAuto: string; @@ -55,12 +64,19 @@ export type FeedCopy = { requestFailed: string; }; +export type FeedIntegration = { + source: string; + status: "checking" | "disabled" | "needsSetup" | "ready"; +}; + export type FeedSnapshot = { copy: FeedCopy; hasMore: boolean; isLoadingOlder: boolean; + integrations: FeedIntegration[]; items: FeedItem[]; sourceIcons: Record; + sourceLabels: Record; theme: { background: string; foreground: string; diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index 8f34a09fd709..15d21694003d 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -3,6 +3,7 @@ import { JSDOM } from "jsdom"; import { flushSync } from "react-dom"; import { createRoot, type Root } from "react-dom/client"; import { FeedApp, feedActivityPageSize } from "../src/feed/App"; +import { receiveFeedNativeEvent } from "../src/feed/bridge"; let root: Root | null = null; let dom: JSDOM | null = null; @@ -29,26 +30,39 @@ test("Feed React surface invokes the typed permission primitive", async () => { (globalThis as any)[key] = (dom.window as any)[key] ?? dom.window; } const calls: unknown[] = []; + let subscribedSnapshot: any; (window as any).webkit = { messageHandlers: { cmuxFeed: { postMessage: async (message: any) => { calls.push(message); if (message.method === "feed.subscribe") { - return { ok: true, value: { + subscribedSnapshot = { copy: { actionable: "Actionable", activity: "All Activity", allowAll: "All tools", allowAlways: "Always Allow", allowBypass: "Bypass", allowOnce: "Allow Once", deny: "Deny", emptyActionable: "No pending decisions", - emptyActivity: "No activity yet", feed: "Feed", loadOlder: "Load older activity", + emptyActionableDescription: "Requests from agents appear here.", + emptyActivity: "No activity yet", emptyActivityDescription: "Agent activity appears here.", + feed: "Feed", integrationChecking: "Checking...", integrationDisabled: "Disabled in Settings", + integrationHint: "Claude and Codex use Settings. Other agents need hooks setup.", + integrationNeedsSetup: "Setup needed", integrationReady: "Ready", + integrationsTitle: "Agent integrations", keyboardHelp: "Use J/K to navigate.", + loadOlder: "Load older activity", loadingOlder: "Loading older activity...", planAuto: "Auto", planManual: "Manual", planUltraplan: "Ultraplan", questionPlaceholder: "Type something...", questionSubmit: "Submit All Answers", requestFailed: "Native bridge request failed.", }, hasMore: false, isLoadingOlder: false, + integrations: [ + { source: "claude", status: "ready" }, + { source: "codex", status: "disabled" }, + { source: "opencode", status: "needsSetup" }, + ], sourceIcons: { claude: "data:image/png;base64,Y2xhdWRl", codex: "data:image/png;base64,Y29kZXg=", opencode: "data:image/png;base64,b3BlbmNvZGU=", }, + sourceLabels: { claude: "Claude Code", codex: "Codex", opencode: "OpenCode" }, theme: { background: "#272822", foreground: "#f8f8f2", isLight: false }, items: [{ created_at: "2026-07-13T12:00:00Z", id: "item-1", kind: "permissionRequest", @@ -65,7 +79,8 @@ test("Feed React surface invokes the typed permission primitive", async () => { created_at: "2026-07-13T12:03:00Z", id: `history-${index}`, kind: "toolUse", source: "codex", status: "telemetry" as const, title: `History ${index}`, workstream_id: "codex-history", }))], - } }; + }; + return { ok: true, value: subscribedSnapshot }; } return { ok: true, value: { accepted: true } }; } } } }; @@ -77,17 +92,58 @@ test("Feed React surface invokes the typed permission primitive", async () => { expect(container.querySelector("main")?.getAttribute("style") ?? "").toContain("--feed-background: #272822"); expect(container.querySelector('[data-feed-source="claude"] .feed-source-logo')).toBeTruthy(); expect(container.querySelector('[data-feed-source="claude"]')?.textContent).toContain("Claude"); - flushSync(() => [...container.querySelectorAll("button")].find((button) => button.textContent === "All Activity")?.click()); + const actionableTab = [...container.querySelectorAll("button")] + .find((button) => button.textContent === "Actionable")!; + actionableTab.focus(); + flushSync(() => actionableTab.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "ArrowRight" }))); + expect(document.activeElement?.textContent).toBe("All Activity"); + expect(document.activeElement?.getAttribute("aria-selected")).toBe("true"); + document.activeElement?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab" })); + expect(document.activeElement?.textContent).toBe("Deny"); + document.activeElement?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab", shiftKey: true })); + expect(document.activeElement?.textContent).toBe("All Activity"); + const loadOlder = [...container.querySelectorAll("button")] + .find((button) => button.textContent === "Load older activity")!; + loadOlder.focus(); + loadOlder.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab" })); + expect(document.activeElement?.textContent).toBe("All Activity"); expect(container.querySelector('[data-feed-source="codex"]')?.textContent).toContain("Codex"); expect(container.querySelector('[data-feed-source="opencode"]')?.textContent).toContain("OpenCode"); expect(feedActivityPageSize).toBe(40); expect(container.querySelectorAll(".feed-card")).toHaveLength(feedActivityPageSize); + const cards = [...container.querySelectorAll(".feed-card")]; + const keyboardRoot = container.querySelector(".feed-keyboard-root")!; + keyboardRoot.focus(); + keyboardRoot.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "j" })); + expect(document.activeElement).toBe(cards[0]); + cards[0]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, ctrlKey: true, key: "n" })); + expect(document.activeElement).toBe(cards[1]); + cards[1]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "ArrowUp" })); + expect(document.activeElement).toBe(cards[0]); + cards[0]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "End" })); + expect(document.activeElement).toBe(cards[cards.length - 1]!); + const input = document.createElement("input"); + keyboardRoot.append(input); + input.focus(); + input.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "ArrowDown" })); + expect(document.activeElement).toBe(input); + input.remove(); flushSync(() => [...container.querySelectorAll("button")].find((button) => button.textContent === "Load older activity")?.click()); expect(container.querySelectorAll(".feed-card")).toHaveLength(48); const allowOnce = [...container.querySelectorAll("button")].find((button) => button.textContent === "Allow Once")!; allowOnce.click(); await waitFor(() => calls.some((call: any) => call.method === "feed.permission.reply")); expect(calls).toContainEqual({ method: "feed.permission.reply", params: { itemId: "item-1", mode: "once" } }); + flushSync(() => receiveFeedNativeEvent({ + snapshot: { ...subscribedSnapshot, items: [] }, + type: "feed.snapshot", + })); + expect(container.textContent).toContain("No activity yet"); + expect(container.textContent).toContain("Agent integrations"); + expect(container.textContent).toContain("Claude CodeReady"); + expect(container.textContent).toContain("CodexDisabled in Settings"); + expect(container.textContent).toContain("OpenCodeSetup needed"); + expect(container.textContent).toContain("Use J/K to navigate."); }); async function waitFor(predicate: () => boolean, timeout = 1_000) { From 01663e609ccea87317505db7e4f258f5a70cae05 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:36:47 -0700 Subject: [PATCH 14/23] Add regression coverage for deferred browser focus --- Sources/Panels/BrowserPanel.swift | 1 + cmuxTests/BrowserPanelTests.swift | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 41a51a424389..1ab089c982d4 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -2891,6 +2891,7 @@ final class BrowserPanel: Panel, ObservableObject { /// Used to keep omnibar text-field focus from being immediately stolen by panel focus. private var suppressWebViewFocusUntil: Date? private var suppressWebViewFocusForAddressBar: Bool = false + private(set) var hasDeferredWebViewFocus = false private let blankURLString = "about:blank" /// Owns the address-bar page-focus capture/restore subsystem. diff --git a/cmuxTests/BrowserPanelTests.swift b/cmuxTests/BrowserPanelTests.swift index 8bbdf05b18fc..77c6e44b448e 100644 --- a/cmuxTests/BrowserPanelTests.swift +++ b/cmuxTests/BrowserPanelTests.swift @@ -1006,6 +1006,21 @@ final class BrowserPanelAddressBarFocusRequestTests: XCTestCase { @MainActor final class BrowserPanelReactGrabBridgeTests: XCTestCase { + func testFocusDefersUntilWebViewCanAttachAndUnfocusCancelsIt() { + let panel = BrowserPanel( + workspaceId: UUID(), + initialURL: URL(string: "https://example.com")!, + isRemoteWorkspace: false + ) + defer { panel.close() } + + panel.focus() + XCTAssertTrue(panel.hasDeferredWebViewFocus) + + panel.unfocus() + XCTAssertFalse(panel.hasDeferredWebViewFocus) + } + @MainActor func testExplicitWebViewFocusDoesNotSuppressOmnibarAutofocusWhenFocusFails() { let panel = BrowserPanel(workspaceId: UUID()) From 3cd99670c34f8981f4ac216b72320e03773c50ed Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:44:14 -0700 Subject: [PATCH 15/23] Fulfill deferred browser focus on attachment --- Sources/Panels/BrowserPanel.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index 1ab089c982d4..7f79f62c5aa6 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -3327,6 +3327,9 @@ final class BrowserPanel: Panel, ObservableObject { allowBlankShellHeal: changed || isFirstVisibilityRecord ) drainPendingInteractiveBrowserPromptsIfPossible(reason: "visible.\(reason)") + if hasDeferredWebViewFocus { + focus() + } } else if changed || isFirstVisibilityRecord || !hiddenWebViewDiscardManager.hasScheduledDiscard { scheduleHiddenWebViewDiscardIfNeeded(reason: reason, now: now) } @@ -5387,19 +5390,25 @@ final class BrowserPanel: Panel, ObservableObject { func focus() { if shouldSuppressWebViewFocus() { + hasDeferredWebViewFocus = false return } - guard let window = webView.window, !webView.isHiddenOrHasHiddenAncestor else { return } + guard let window = webView.window, !webView.isHiddenOrHasHiddenAncestor else { + hasDeferredWebViewFocus = true + return + } // If nothing meaningful is loaded yet, prefer letting the omnibar take focus. if !webView.isLoading { let urlString = Self.remoteProxyDisplayURL(for: webView.url)?.absoluteString ?? currentURL?.absoluteString if urlString == nil || urlString == "about:blank" { + hasDeferredWebViewFocus = false return } } + hasDeferredWebViewFocus = false if Self.responderChainContains(window.firstResponder, target: webView) { noteWebViewFocused() return @@ -5445,6 +5454,7 @@ final class BrowserPanel: Panel, ObservableObject { } func unfocus() { + hasDeferredWebViewFocus = false clearBrowserFocusMode(reason: "panelUnfocus") invalidateSearchFocusRequests(reason: "panelUnfocus") guard let window = webView.window else { return } From 89732bf9e3301f2a26f176ce95c59cdd7b994262 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:08:55 -0700 Subject: [PATCH 16/23] Polish Feed onboarding and examples --- Resources/Localizable.xcstrings | 63 ++++++++++++ .../webviews-app/assets/feedSurface.css | 2 +- .../webviews-app/chunks/feedSurface.mjs | 2 +- Sources/Feed/FeedSurfaceBridge.swift | 9 ++ webviews/src/feed/App.tsx | 97 +++++++++++++++++-- webviews/src/feed/sourceIcons.ts | 25 +++++ webviews/src/feed/styles.css | 23 +++-- webviews/src/feed/types.ts | 9 ++ webviews/test/feed.test.tsx | 23 +++++ 9 files changed, 235 insertions(+), 18 deletions(-) create mode 100644 webviews/src/feed/sourceIcons.ts diff --git a/Resources/Localizable.xcstrings b/Resources/Localizable.xcstrings index d845cea09ba2..5f1684575982 100644 --- a/Resources/Localizable.xcstrings +++ b/Resources/Localizable.xcstrings @@ -102044,6 +102044,69 @@ } } }, + "feed.examples.load": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Load examples" } }, + "ja": { "stringUnit": { "state": "translated", "value": "例を読み込む" } } + } + }, + "feed.examples.permission.body": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "bun run db:migrate" } }, + "ja": { "stringUnit": { "state": "translated", "value": "bun run db:migrate" } } + } + }, + "feed.examples.permission.title": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Run database migration" } }, + "ja": { "stringUnit": { "state": "translated", "value": "データベース移行を実行" } } + } + }, + "feed.examples.plan.body": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Update the bridge, add focused tests, then build the tagged app." } }, + "ja": { "stringUnit": { "state": "translated", "value": "ブリッジを更新し、対象テストを追加して、タグ付きアプリをビルドします。" } } + } + }, + "feed.examples.plan.title": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Plan ready for review" } }, + "ja": { "stringUnit": { "state": "translated", "value": "レビュー待ちの計画" } } + } + }, + "feed.examples.question.focused": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Focused tests" } }, + "ja": { "stringUnit": { "state": "translated", "value": "対象テスト" } } + } + }, + "feed.examples.question.full": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Full test suite" } }, + "ja": { "stringUnit": { "state": "translated", "value": "全テストスイート" } } + } + }, + "feed.examples.question.prompt": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Which verification should run?" } }, + "ja": { "stringUnit": { "state": "translated", "value": "どの検証を実行しますか?" } } + } + }, + "feed.examples.question.title": { + "extractionState": "manual", + "localizations": { + "en": { "stringUnit": { "state": "translated", "value": "Verification scope" } }, + "ja": { "stringUnit": { "state": "translated", "value": "検証範囲" } } + } + }, "feed.exitplan.allowedPrompts": { "extractionState": "manual", "localizations": { diff --git a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css index 6ff38f518bd4..5eee0bb1f276 100644 --- a/Resources/markdown-viewer/webviews-app/assets/feedSurface.css +++ b/Resources/markdown-viewer/webviews-app/assets/feedSurface.css @@ -1 +1 @@ -:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html{scrollbar-gutter:stable}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card:focus-visible{border-color:var(--feed-foreground);outline:1px solid var(--feed-foreground);outline-offset:2px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{background:currentColor;display:inline-grid;height:13px;line-height:13px;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;place-items:center;width:13px}.feed-source-logo[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);display:grid;gap:6px;padding:36px 0}.feed-empty>h2{color:var(--feed-foreground);font-size:14px;margin:0;text-align:center}.feed-empty>p{margin:0 auto;max-width:520px;text-align:center}.feed-integrations{border:1px solid var(--feed-border);margin-top:16px;padding:12px}.feed-integrations h3{color:var(--feed-foreground);font-size:inherit;margin:0 0 8px}.feed-integration-grid{display:grid;gap:1px 16px;grid-template-columns:repeat(2,minmax(0,1fr))}.feed-integration{align-items:center;border-top:1px solid var(--feed-border);display:flex;gap:8px;justify-content:space-between;min-width:0;padding:7px 0}.feed-integration-status{flex:none;font-size:11px}.feed-integration[data-status=ready] .feed-integration-status{color:var(--feed-foreground)}.feed-integration[data-status=disabled] .feed-integration-status,.feed-integration[data-status=needsSetup] .feed-integration-status{color:color-mix(in srgb,#ff9f0a 80%,var(--feed-foreground))}.feed-integration-hint{border-top:1px solid var(--feed-border);margin:1px 0 0;padding-top:9px}.feed-empty>.feed-keyboard-help{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;margin-top:10px}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}.feed-integration-grid{grid-template-columns:1fr}} +:root{color-scheme:light dark;font:12px/1.4 -apple-system,BlinkMacSystemFont,SF Pro Text,sans-serif;--feed-background: transparent;--feed-foreground: CanvasText;--feed-border: color-mix(in srgb, var(--feed-foreground) 14%, transparent);--feed-border-strong: color-mix(in srgb, var(--feed-foreground) 38%, transparent);--feed-fill: color-mix(in srgb, var(--feed-foreground) 5%, transparent);--feed-fill-hover: color-mix(in srgb, var(--feed-foreground) 9%, transparent);--feed-muted: color-mix(in srgb, var(--feed-foreground) 56%, transparent)}*{box-sizing:border-box}html{scrollbar-gutter:stable}html,body,#root{margin:0;min-height:100%;width:100%}body{background:transparent;color:var(--feed-foreground)}button,input{font:inherit}.feed-shell{background:var(--feed-background);color:var(--feed-foreground);min-height:100vh;padding:14px clamp(12px,3vw,28px) 28px}.feed-loading{opacity:.5}.feed-header{align-items:center;border-bottom:1px solid var(--feed-border);display:flex;justify-content:space-between;margin:0 auto 8px;max-width:760px;padding-bottom:10px}.feed-header h1,.feed-card-heading h2,.feed-question-prompt{font-size:inherit;font-weight:600;margin:0}.feed-filter{border:1px solid var(--feed-border);display:flex;gap:1px;padding:2px}.feed-filter button{background:transparent;border:0;color:var(--feed-muted);cursor:pointer;padding:3px 7px}.feed-filter button:hover{background:var(--feed-fill)}.feed-filter button[aria-selected=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-list{display:grid;gap:6px;margin:0 auto;max-width:760px}.feed-card{background:color-mix(in srgb,var(--feed-background) 96%,var(--feed-foreground) 4%);border:1px solid var(--feed-border);padding:10px}.feed-card:focus-visible{border-color:var(--feed-foreground);outline:1px solid var(--feed-foreground);outline-offset:2px}.feed-card-pending{border-color:var(--feed-border-strong)}.feed-card-heading{align-items:center;display:flex;gap:10px;justify-content:space-between}.feed-card-title{align-items:center;display:flex;gap:8px;min-width:0}.feed-card-heading h2{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-source{align-items:center;color:var(--feed-muted);display:inline-flex;flex:none;gap:5px}.feed-source-logo{display:inline-grid;height:15px;line-height:15px;object-fit:contain;place-items:center;width:15px}.feed-source-logo-mask{background:currentColor;-webkit-mask-image:var(--feed-source-icon);mask-image:var(--feed-source-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}.feed-source-logo-mask[data-fallback]{background:transparent;border:1px solid currentColor;-webkit-mask-image:none;mask-image:none}.feed-card-heading time,.feed-cwd{color:var(--feed-muted);flex:none}.feed-cwd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.feed-body{background:var(--feed-fill);border:1px solid var(--feed-border);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin:8px 0 0;max-height:240px;overflow:auto;padding:7px 8px;white-space:pre-wrap;word-break:break-word}.feed-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}.feed-actions button,.feed-question-actions>button,.feed-options button,.feed-load-examples,.feed-load-more{background:transparent;border:1px solid var(--feed-border-strong);color:var(--feed-foreground);cursor:pointer;padding:4px 7px}.feed-actions button:hover,.feed-question-actions>button:hover,.feed-options button:hover,.feed-load-examples:hover,.feed-load-more:hover{background:var(--feed-fill-hover)}.feed-actions .primary,.feed-question-actions .primary{background:var(--feed-foreground);border-color:var(--feed-foreground);color:var(--feed-background)}.feed-actions .primary:hover,.feed-question-actions .primary:hover{opacity:.82}.feed-actions .danger{border-style:dashed}.feed-question-actions{display:grid;gap:7px;margin-top:8px}.feed-question{display:grid;gap:6px}.feed-question input{background:var(--feed-fill);border:1px solid var(--feed-border-strong);color:var(--feed-foreground);padding:5px 7px;width:100%}.feed-options{display:grid;gap:4px}.feed-options button{display:grid;gap:1px;text-align:left}.feed-options button[aria-pressed=true]{background:var(--feed-foreground);color:var(--feed-background)}.feed-options span{color:var(--feed-muted)}.feed-options button[aria-pressed=true] span{color:color-mix(in srgb,var(--feed-background) 70%,transparent)}.feed-empty{color:var(--feed-muted);display:grid;gap:6px;padding:36px 0}.feed-empty>h2{color:var(--feed-foreground);font-size:14px;margin:0;text-align:center}.feed-empty>p{margin:0 auto;max-width:520px;text-align:center}.feed-load-examples{justify-self:center;margin-top:6px}.feed-integrations{border:1px solid var(--feed-border);margin-top:16px;padding:12px}.feed-integrations h3{color:var(--feed-foreground);font-size:inherit;margin:0 0 8px}.feed-integration-grid{display:grid;gap:1px 16px;grid-template-columns:repeat(2,minmax(0,1fr))}.feed-integration{align-items:center;border-top:1px solid var(--feed-border);display:flex;gap:8px;justify-content:space-between;min-width:0;padding:7px 0}.feed-integration-status{flex:none;font-size:11px}.feed-integration[data-status=ready] .feed-integration-status{color:var(--feed-foreground)}.feed-integration[data-status=disabled] .feed-integration-status,.feed-integration[data-status=needsSetup] .feed-integration-status{color:color-mix(in srgb,#ff9f0a 80%,var(--feed-foreground))}.feed-integration-hint{border-top:1px solid var(--feed-border);margin:1px 0 0;padding-top:9px}.feed-empty>.feed-keyboard-help{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;margin-top:10px}.feed-error{border:1px solid var(--feed-border-strong);margin:0 auto 6px;max-width:760px;padding:6px 8px}.feed-load-more{justify-self:center;margin-top:2px}button:disabled{cursor:default;opacity:.4}button:focus-visible,.feed-question input:focus-visible{outline:1px solid var(--feed-foreground);outline-offset:2px}@media(max-width:540px){.feed-header{align-items:stretch;flex-direction:column;gap:8px}.feed-filter{align-self:flex-start}.feed-card-title{align-items:flex-start;flex-direction:column;gap:3px}.feed-integration-grid{grid-template-columns:1fr}} diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index 7f4df294e1a2..da2019f16645 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as _,i as L,j as n,c as Y,a as Z}from"./vendor.mjs";import{c as ee}from"./router.mjs";let z=null;const W=new Set;let H=null;function Q(t){z=t;for(const e of W)e()}function te(t){t.type==="feed.snapshot"&&Q(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:te});async function J(t,e={}){const s=window.webkit?.messageHandlers?.cmuxFeed;if(!s?.postMessage)throw new Error("Native Feed bridge is unavailable.");const i=await s.postMessage({method:t,params:e});if(!i.ok)throw new Error(i.error?.userMessage||"Feed request failed.");return i.value}async function se(){return H||(H=J("feed.subscribe").then(Q).catch(t=>{throw H=null,t}),H)}const U={getSnapshot:()=>z,subscribe(t){return W.add(t),se(),()=>W.delete(t)}},V=40;function ie(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function le(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const o=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(r=>r!==e&&r.tabIndex>=0);if(o.length===0)return;const f=o.indexOf(document.activeElement),d=f<0?t.shiftKey?o.length-1:0:(f+(t.shiftKey?-1:1)+o.length)%o.length;t.preventDefault(),o[d]?.focus();return}if(ie(t.target)||t.altKey||t.metaKey)return;const s=t.key.toLowerCase(),i=!t.ctrlKey&&(s==="j"||s==="arrowdown")?1:!t.ctrlKey&&(s==="k"||s==="arrowup")?-1:t.ctrlKey&&s==="n"?1:t.ctrlKey&&s==="p"?-1:0,l=!t.ctrlKey&&(s==="home"||s==="end");if(i===0&&!l)return;const a=[...e.querySelectorAll(".feed-card")];if(a.length===0)return;const u=document.activeElement?.closest(".feed-card"),c=u?a.indexOf(u):-1,p=s==="home"?0:s==="end"?a.length-1:c<0?i>0?0:a.length-1:Math.max(0,Math.min(a.length-1,c+i));t.preventDefault(),a[p]?.focus({preventScroll:!0}),a[p]?.scrollIntoView?.({block:"nearest"})}function ne(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],s=e.indexOf(document.activeElement);if(s<0)return;const i=t.key,l=i==="Home"?0:i==="End"?e.length-1:i==="ArrowLeft"?(s-1+e.length)%e.length:i==="ArrowRight"?(s+1)%e.length:-1;l<0||(t.preventDefault(),t.stopPropagation(),e[l]?.focus(),e[l]?.click())}function oe(){const t=_.c(58),e=L.useSyncExternalStore(U.subscribe,U.getSnapshot,U.getSnapshot),[s,i]=L.useState("actionable"),[l,a]=L.useState(V),[u,c]=L.useState(null),p=L.useRef(de);let o;t[0]===Symbol.for("react.memo_cache_sentinel")?(o=v=>{if(p.current(),p.current=re,!v)return;const B=G=>le(G,v);v.addEventListener("keydown",B),p.current=()=>v.removeEventListener("keydown",B),(!document.activeElement||document.activeElement===document.body)&&v.focus()},t[0]=o):o=t[0];const f=o;if(!e){let v;return t[1]===Symbol.for("react.memo_cache_sentinel")?(v=n.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[1]=v):v=t[1],v}let d;t[2]!==s||t[3]!==e.items?(d=s==="actionable"?e.items.filter(ae):e.items,t[2]=s,t[3]=e.items,t[4]=d):d=t[4];const r=d;let m;t[5]!==l||t[6]!==s||t[7]!==r?(m=s==="activity"?r.slice(0,l):r,t[5]=l,t[6]=s,t[7]=r,t[8]=m):m=t[8];const y=m,x=s==="activity"&&y.length{c(null);try{await J(v,B)}catch{c(e.copy.requestFailed)}},t[13]=e.copy.requestFailed,t[14]=N):N=t[14];const S=N;let I;t[15]!==e.copy.feed?(I=n.jsx("h1",{children:e.copy.feed}),t[15]=e.copy.feed,t[16]=I):I=t[16];const A=s==="actionable";let w;t[17]===Symbol.for("react.memo_cache_sentinel")?(w=()=>i("actionable"),t[17]=w):w=t[17];const g=s==="actionable"?0:-1;let j;t[18]!==e.copy.actionable||t[19]!==A||t[20]!==g?(j=n.jsx("button",{"aria-selected":A,onClick:w,role:"tab",tabIndex:g,children:e.copy.actionable}),t[18]=e.copy.actionable,t[19]=A,t[20]=g,t[21]=j):j=t[21];const E=s==="activity";let q;t[22]===Symbol.for("react.memo_cache_sentinel")?(q=()=>i("activity"),t[22]=q):q=t[22];const C=s==="activity"?0:-1;let F;t[23]!==e.copy.activity||t[24]!==E||t[25]!==C?(F=n.jsx("button",{"aria-selected":E,onClick:q,role:"tab",tabIndex:C,children:e.copy.activity}),t[23]=e.copy.activity,t[24]=E,t[25]=C,t[26]=F):F=t[26];let K;t[27]!==j||t[28]!==F?(K=n.jsxs("div",{className:"feed-filter",onKeyDown:ne,role:"tablist",tabIndex:-1,children:[j,F]}),t[27]=j,t[28]=F,t[29]=K):K=t[29];let O;t[30]!==K||t[31]!==I?(O=n.jsxs("header",{className:"feed-header",children:[I,K]}),t[30]=K,t[31]=I,t[32]=O):O=t[32];let P;t[33]!==u?(P=u&&n.jsx("div",{className:"feed-error",role:"alert",children:u}),t[33]=u,t[34]=P):P=t[34];let T;t[35]!==s||t[36]!==S||t[37]!==e||t[38]!==y?(T=y.length===0?n.jsx(ue,{filter:s,snapshot:e}):y.map(v=>n.jsx(fe,{item:v,copy:e.copy,perform:S,sourceIcon:e.sourceIcons[v.source],sourceLabel:e.sourceLabels[v.source]},v.id)),t[35]=s,t[36]=S,t[37]=e,t[38]=y,t[39]=T):T=t[39];let M;t[40]!==x||t[41]!==S||t[42]!==e.copy.loadOlder||t[43]!==e.copy.loadingOlder||t[44]!==e.hasMore||t[45]!==e.isLoadingOlder?(M=(x||e.hasMore)&&n.jsx("button",{className:"feed-load-more",disabled:!x&&e.isLoadingOlder,onClick:()=>{x?a(ce):S("feed.loadOlder",{})},children:!x&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[40]=x,t[41]=S,t[42]=e.copy.loadOlder,t[43]=e.copy.loadingOlder,t[44]=e.hasMore,t[45]=e.isLoadingOlder,t[46]=M):M=t[46];let R;t[47]!==T||t[48]!==M?(R=n.jsxs("section",{className:"feed-list",children:[T,M]}),t[47]=T,t[48]=M,t[49]=R):R=t[49];let D;t[50]!==e.copy.feed||t[51]!==O||t[52]!==P||t[53]!==R?(D=n.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:f,tabIndex:-1,children:[O,P,R]}),t[50]=e.copy.feed,t[51]=O,t[52]=P,t[53]=R,t[54]=D):D=t[54];let $;return t[55]!==D||t[56]!==h?($=n.jsx("main",{className:"feed-shell",style:h,children:D}),t[55]=D,t[56]=h,t[57]=$):$=t[57],$}function ce(t){return t+V}function ae(t){return t.status==="pending"}function re(){}function de(){}function ue(t){const e=_.c(35),{filter:s,snapshot:i}=t,l=s==="actionable"?i.copy.emptyActionable:i.copy.emptyActivity,a=s==="actionable"?i.copy.emptyActionableDescription:i.copy.emptyActivityDescription;let u;e[0]!==i.copy.integrationChecking||e[1]!==i.copy.integrationDisabled||e[2]!==i.copy.integrationNeedsSetup||e[3]!==i.copy.integrationReady?(u=b=>({checking:i.copy.integrationChecking,disabled:i.copy.integrationDisabled,needsSetup:i.copy.integrationNeedsSetup,ready:i.copy.integrationReady})[b.status],e[0]=i.copy.integrationChecking,e[1]=i.copy.integrationDisabled,e[2]=i.copy.integrationNeedsSetup,e[3]=i.copy.integrationReady,e[4]=u):u=e[4];const c=u;let p;e[5]!==l?(p=n.jsx("h2",{children:l}),e[5]=l,e[6]=p):p=e[6];let o;e[7]!==a?(o=n.jsx("p",{children:a}),e[7]=a,e[8]=o):o=e[8];let f;e[9]!==i.copy.integrationsTitle?(f=n.jsx("h3",{id:"feed-integrations-title",children:i.copy.integrationsTitle}),e[9]=i.copy.integrationsTitle,e[10]=f):f=e[10];let d;if(e[11]!==i.integrations||e[12]!==i.sourceIcons||e[13]!==i.sourceLabels||e[14]!==c){let b;e[16]!==i.sourceIcons||e[17]!==i.sourceLabels||e[18]!==c?(b=h=>n.jsxs("div",{className:"feed-integration","data-status":h.status,children:[n.jsx(X,{icon:i.sourceIcons[h.source],label:i.sourceLabels[h.source],source:h.source}),n.jsx("span",{className:"feed-integration-status",children:c(h)})]},h.source),e[16]=i.sourceIcons,e[17]=i.sourceLabels,e[18]=c,e[19]=b):b=e[19],d=i.integrations.map(b),e[11]=i.integrations,e[12]=i.sourceIcons,e[13]=i.sourceLabels,e[14]=c,e[15]=d}else d=e[15];let r;e[20]!==d?(r=n.jsx("div",{className:"feed-integration-grid",children:d}),e[20]=d,e[21]=r):r=e[21];let m;e[22]!==i.copy.integrationHint?(m=n.jsx("p",{className:"feed-integration-hint",children:i.copy.integrationHint}),e[22]=i.copy.integrationHint,e[23]=m):m=e[23];let y;e[24]!==f||e[25]!==r||e[26]!==m?(y=n.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[f,r,m]}),e[24]=f,e[25]=r,e[26]=m,e[27]=y):y=e[27];let x;e[28]!==i.copy.keyboardHelp?(x=n.jsx("p",{className:"feed-keyboard-help",children:i.copy.keyboardHelp}),e[28]=i.copy.keyboardHelp,e[29]=x):x=e[29];let k;return e[30]!==p||e[31]!==o||e[32]!==y||e[33]!==x?(k=n.jsxs("div",{className:"feed-empty",children:[p,o,y,x]}),e[30]=p,e[31]=o,e[32]=y,e[33]=x,e[34]=k):k=e[34],k}function fe(t){const e=_.c(34),{item:s,copy:i,perform:l,sourceIcon:a,sourceLabel:u}=t;let c;e[0]!==s.kind||e[1]!==s.title||e[2]!==s.tool_name?(c=s.title||s.tool_name||s.kind.replaceAll("_"," "),e[0]=s.kind,e[1]=s.title,e[2]=s.tool_name,e[3]=c):c=e[3];const p=c,o=`feed-card feed-card-${s.status}`;let f;e[4]!==s.source||e[5]!==a||e[6]!==u?(f=n.jsx(X,{icon:a,label:u,source:s.source}),e[4]=s.source,e[5]=a,e[6]=u,e[7]=f):f=e[7];let d;e[8]!==p?(d=n.jsx("h2",{children:p}),e[8]=p,e[9]=d):d=e[9];let r;e[10]!==f||e[11]!==d?(r=n.jsxs("div",{className:"feed-card-title",children:[f,d]}),e[10]=f,e[11]=d,e[12]=r):r=e[12];let m;e[13]!==s.created_at?(m=new Date(s.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=s.created_at,e[14]=m):m=e[14];let y;e[15]!==m?(y=n.jsx("time",{children:m}),e[15]=m,e[16]=y):y=e[16];let x;e[17]!==r||e[18]!==y?(x=n.jsxs("div",{className:"feed-card-heading",children:[r,y]}),e[17]=r,e[18]=y,e[19]=x):x=e[19];let k;e[20]!==s.cwd?(k=s.cwd&&n.jsx("div",{className:"feed-cwd",children:s.cwd}),e[20]=s.cwd,e[21]=k):k=e[21];let b;e[22]!==s?(b=n.jsx(pe,{item:s}),e[22]=s,e[23]=b):b=e[23];let h;e[24]!==i||e[25]!==s||e[26]!==l?(h=s.status==="pending"&&n.jsx(me,{item:s,copy:i,perform:l}),e[24]=i,e[25]=s,e[26]=l,e[27]=h):h=e[27];let N;return e[28]!==b||e[29]!==h||e[30]!==o||e[31]!==x||e[32]!==k?(N=n.jsxs("article",{className:o,tabIndex:-1,children:[x,k,b,h]}),e[28]=b,e[29]=h,e[30]=o,e[31]=x,e[32]=k,e[33]=N):N=e[33],N}function X(t){const e=_.c(15),{icon:s,label:i,source:l}=t,a=i??l;let u;e[0]!==s?(u=s?{"--feed-source-icon":`url(${JSON.stringify(s)})`}:void 0,e[0]=s,e[1]=u):u=e[1];const c=u,p=s?void 0:"";let o;e[2]!==a||e[3]!==s?(o=!s&&a.slice(0,1).toUpperCase(),e[2]=a,e[3]=s,e[4]=o):o=e[4];let f;e[5]!==c||e[6]!==p||e[7]!==o?(f=n.jsx("span",{className:"feed-source-logo","data-fallback":p,style:c,"aria-hidden":"true",children:o}),e[5]=c,e[6]=p,e[7]=o,e[8]=f):f=e[8];let d;e[9]!==a?(d=n.jsx("span",{children:a}),e[9]=a,e[10]=d):d=e[10];let r;return e[11]!==l||e[12]!==f||e[13]!==d?(r=n.jsxs("span",{className:"feed-source","data-feed-source":l,children:[f,d]}),e[11]=l,e[12]=f,e[13]=d,e[14]=r):r=e[14],r}function pe(t){const e=_.c(2),{item:s}=t,i=s.plan||s.question_prompt||s.tool_input||s.tool_result||s.text;if(!i)return null;let l;return e[0]!==i?(l=n.jsx("pre",{className:"feed-body",children:i}),e[0]=i,e[1]=l):l=e[1],l}function me(t){const e=_.c(64),{item:s,copy:i,perform:l}=t;if(s.kind==="permissionRequest"){let a;e[0]!==s.allowed_permission_modes?(a=s.allowed_permission_modes??["deny"],e[0]=s.allowed_permission_modes,e[1]=a):a=e[1];let u;e[2]!==a?(u=new Set(a),e[2]=a,e[3]=u):u=e[3];const c=u;let p;e[4]!==i||e[5]!==s.id||e[6]!==c||e[7]!==l?(p=c.has("deny")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"deny"}),children:i.deny}),e[4]=i,e[5]=s.id,e[6]=c,e[7]=l,e[8]=p):p=e[8];let o;e[9]!==i||e[10]!==s.id||e[11]!==c||e[12]!==l?(o=c.has("once")&&n.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"once"}),children:i.allowOnce}),e[9]=i,e[10]=s.id,e[11]=c,e[12]=l,e[13]=o):o=e[13];let f;e[14]!==i||e[15]!==s.id||e[16]!==c||e[17]!==l?(f=c.has("always")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"always"}),children:i.allowAlways}),e[14]=i,e[15]=s.id,e[16]=c,e[17]=l,e[18]=f):f=e[18];let d;e[19]!==i||e[20]!==s.id||e[21]!==c||e[22]!==l?(d=c.has("all")&&n.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"all"}),children:i.allowAll}),e[19]=i,e[20]=s.id,e[21]=c,e[22]=l,e[23]=d):d=e[23];let r;e[24]!==i||e[25]!==s.id||e[26]!==c||e[27]!==l?(r=c.has("bypass")&&n.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:s.id,mode:"bypass"}),children:i.allowBypass}),e[24]=i,e[25]=s.id,e[26]=c,e[27]=l,e[28]=r):r=e[28];let m;return e[29]!==p||e[30]!==o||e[31]!==f||e[32]!==d||e[33]!==r?(m=n.jsxs("div",{className:"feed-actions",children:[p,o,f,d,r]}),e[29]=p,e[30]=o,e[31]=f,e[32]=d,e[33]=r,e[34]=m):m=e[34],m}if(s.kind==="exitPlan"){let a;e[35]!==s.id||e[36]!==l?(a=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"manual"}),e[35]=s.id,e[36]=l,e[37]=a):a=e[37];let u;e[38]!==i.planManual||e[39]!==a?(u=n.jsx("button",{onClick:a,children:i.planManual}),e[38]=i.planManual,e[39]=a,e[40]=u):u=e[40];let c;e[41]!==s.id||e[42]!==l?(c=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"autoAccept"}),e[41]=s.id,e[42]=l,e[43]=c):c=e[43];let p;e[44]!==i.planAuto||e[45]!==c?(p=n.jsx("button",{onClick:c,children:i.planAuto}),e[44]=i.planAuto,e[45]=c,e[46]=p):p=e[46];let o;e[47]!==s.id||e[48]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:s.id,mode:"ultraplan"}),e[47]=s.id,e[48]=l,e[49]=o):o=e[49];let f;e[50]!==i.planUltraplan||e[51]!==o?(f=n.jsx("button",{className:"primary",onClick:o,children:i.planUltraplan}),e[50]=i.planUltraplan,e[51]=o,e[52]=f):f=e[52];let d;return e[53]!==u||e[54]!==p||e[55]!==f?(d=n.jsxs("div",{className:"feed-actions",children:[u,p,f]}),e[53]=u,e[54]=p,e[55]=f,e[56]=d):d=e[56],d}if(s.kind==="question"){let a;e[57]!==s.questions?(a=s.questions??[],e[57]=s.questions,e[58]=a):a=e[58];let u;return e[59]!==i||e[60]!==s||e[61]!==l||e[62]!==a?(u=n.jsx(ye,{item:s,questions:a,copy:i,perform:l}),e[59]=i,e[60]=s,e[61]=l,e[62]=a,e[63]=u):u=e[63],u}return null}function ye(t){const e=_.c(34),{item:s,questions:i,copy:l,perform:a}=t;let u;e[0]!==s.question_options||e[1]!==s.question_prompt||e[2]!==i?(u=i.length>0?i:[{id:"question",multi_select:!1,options:s.question_options??[],prompt:s.question_prompt??""}],e[0]=s.question_options,e[1]=s.question_prompt,e[2]=i,e[3]=u):u=e[3];const c=u;let p;e[4]===Symbol.for("react.memo_cache_sentinel")?(p={},e[4]=p):p=e[4];const[o,f]=L.useState(p);let d;e[5]===Symbol.for("react.memo_cache_sentinel")?(d={},e[5]=d):d=e[5];const[r,m]=L.useState(d);let y;e[6]===Symbol.for("react.memo_cache_sentinel")?(y=(w,g)=>{f(j=>{const E=j[w.id]??[],q=w.multi_select?E.includes(g)?E.filter(C=>C!==g):[...E,g]:[g];return{...j,[w.id]:q}})},e[6]=y):y=e[6];const x=y;let k;if(e[7]!==r||e[8]!==c||e[9]!==o){let w;e[11]!==r||e[12]!==o?(w=g=>{const j=r[g.id]?.trim();if(j)return[j];const E=o[g.id]??[],q=g.options.filter(C=>E.includes(C.id)).map(he);return q.length>0?[q.join(", ")]:[]},e[11]=r,e[12]=o,e[13]=w):w=e[13],k=c.flatMap(w),e[7]=r,e[8]=c,e[9]=o,e[10]=k}else k=e[10];const b=k;let h;if(e[14]!==l.questionPlaceholder||e[15]!==r||e[16]!==c||e[17]!==o){let w;e[19]!==l.questionPlaceholder||e[20]!==r||e[21]!==o?(w=g=>n.jsxs("div",{className:"feed-question",children:[g.prompt&&n.jsx("div",{className:"feed-question-prompt",children:g.prompt}),n.jsx("div",{className:"feed-options",children:g.options.map(j=>n.jsxs("button",{"aria-pressed":(o[g.id]??[]).includes(j.id),onClick:()=>x(g,j.id),children:[n.jsx("strong",{children:j.label}),j.description&&n.jsx("span",{children:j.description})]},j.id))}),n.jsx("input",{"aria-label":l.questionPlaceholder,onChange:j=>m(E=>({...E,[g.id]:j.target.value})),placeholder:l.questionPlaceholder,value:r[g.id]??""})]},g.id),e[19]=l.questionPlaceholder,e[20]=r,e[21]=o,e[22]=w):w=e[22],h=c.map(w),e[14]=l.questionPlaceholder,e[15]=r,e[16]=c,e[17]=o,e[18]=h}else h=e[18];const N=b.length===0;let S;e[23]!==b||e[24]!==s.id||e[25]!==a?(S=()=>a("feed.question.reply",{itemId:s.id,selections:b}),e[23]=b,e[24]=s.id,e[25]=a,e[26]=S):S=e[26];let I;e[27]!==l.questionSubmit||e[28]!==N||e[29]!==S?(I=n.jsx("button",{className:"primary",disabled:N,onClick:S,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=N,e[29]=S,e[30]=I):I=e[30];let A;return e[31]!==h||e[32]!==I?(A=n.jsxs("div",{className:"feed-question-actions",children:[h,I]}),e[31]=h,e[32]=I,e[33]=A):A=e[33],A}function he(t){return t.label}function ge(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ee(()=>n.jsx(oe,{}));Y.createRoot(t).render(n.jsx(Z,{router:e}))}export{ge as mountFeedSurface}; +import{b as O,i as b,j as M,c as Me,a as oe}from"./vendor.mjs";import{c as ne}from"./router.mjs";let ee=null;const $=new Set;let V=null;function te(t){ee=t;for(const e of $)e()}function ae(t){t.type==="feed.snapshot"&&te(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:ae});async function ie(t,e={}){const i=window.webkit?.messageHandlers?.cmuxFeed;if(!i?.postMessage)throw new Error("Native Feed bridge is unavailable.");const c=await i.postMessage({method:t,params:e});if(!c.ok)throw new Error(c.error?.userMessage||"Feed request failed.");return c.value}async function de(){return V||(V=ie("feed.subscribe").then(te).catch(t=>{throw V=null,t}),V)}const K={getSnapshot:()=>ee,subscribe(t){return $.add(t),de(),()=>$.delete(t)}},q=t=>({presentation:"mask",url:`data:image/svg+xml;base64,${t}`}),_=(t,e)=>({presentation:"image",url:`data:${t};base64,${e}`}),re={cursor:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="),gemini:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="),copilot:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="),codebuddy:_("image/svg+xml","PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="),factory:_("image/x-icon","AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"),qoder:_("image/png","iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg==")},le=40;function je(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function ue(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const o=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(j=>j!==e&&j.tabIndex>=0);if(o.length===0)return;const d=o.indexOf(document.activeElement),r=d<0?t.shiftKey?o.length-1:0:(d+(t.shiftKey?-1:1)+o.length)%o.length;t.preventDefault(),o[r]?.focus();return}if(je(t.target)||t.altKey||t.metaKey)return;const i=t.key.toLowerCase(),c=!t.ctrlKey&&(i==="j"||i==="arrowdown")?1:!t.ctrlKey&&(i==="k"||i==="arrowup")?-1:t.ctrlKey&&i==="n"?1:t.ctrlKey&&i==="p"?-1:0,s=!t.ctrlKey&&(i==="home"||i==="end");if(c===0&&!s)return;const l=[...e.querySelectorAll(".feed-card")];if(l.length===0)return;const n=document.activeElement?.closest(".feed-card"),a=n?l.indexOf(n):-1,u=i==="home"?0:i==="end"?l.length-1:a<0?c>0?0:l.length-1:Math.max(0,Math.min(l.length-1,a+c));t.preventDefault(),l[u]?.focus({preventScroll:!0}),l[u]?.scrollIntoView?.({block:"nearest"})}function Ie(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],i=e.indexOf(document.activeElement);if(i<0)return;const c=t.key,s=c==="Home"?0:c==="End"?e.length-1:c==="ArrowLeft"?(i-1+e.length)%e.length:c==="ArrowRight"?(i+1)%e.length:-1;s<0||(t.preventDefault(),t.stopPropagation(),e[s]?.focus(),e[s]?.click())}function Ne(t){const e=new Date().toISOString();return[{allowed_permission_modes:["deny","once","always"],created_at:e,id:"feed-demo-permission",kind:"permissionRequest",source:"claude",status:"pending",tool_input:t.demoPermissionBody,tool_name:t.demoPermissionTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-plan",kind:"exitPlan",plan:t.demoPlanBody,source:"codex",status:"pending",title:t.demoPlanTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-question",kind:"question",question_prompt:t.demoQuestionPrompt,questions:[{id:"verification",multi_select:!1,options:[{id:"focused",label:t.demoQuestionOptionFocused},{id:"full",label:t.demoQuestionOptionFull}],prompt:t.demoQuestionPrompt}],source:"gemini",status:"pending",title:t.demoQuestionTitle,workstream_id:"feed-demo"}]}function Ae(){const t=O.c(59),e=b.useSyncExternalStore(K.subscribe,K.getSnapshot,K.getSnapshot),[i,c]=b.useState("actionable"),[s,l]=b.useState(le);let n;t[0]===Symbol.for("react.memo_cache_sentinel")?(n=[],t[0]=n):n=t[0];const[a,u]=b.useState(n),[o,d]=b.useState(null),r=b.useRef(Le);let j;t[1]===Symbol.for("react.memo_cache_sentinel")?(j=p=>{if(r.current(),r.current=De,!p)return;const G=X=>ue(X,p);p.addEventListener("keydown",G),r.current=()=>p.removeEventListener("keydown",G),(!document.activeElement||document.activeElement===document.body)&&p.focus()},t[1]=j):j=t[1];const D=j;if(!e){let p;return t[2]===Symbol.for("react.memo_cache_sentinel")?(p=M.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[2]=p):p=t[2],p}const g=e.items.length>0?e.items:a;let x;t[3]!==i||t[4]!==g?(x=i==="actionable"?g.filter(ye):g,t[3]=i,t[4]=g,t[5]=x):x=t[5];const N=x;let y;t[6]!==s||t[7]!==i||t[8]!==N?(y=i==="activity"?N.slice(0,s):N,t[6]=s,t[7]=i,t[8]=N,t[9]=y):y=t[9];const I=y,z=i==="activity"&&I.length{d(null);const X=typeof G.itemId=="string"?G.itemId:"";if(X.startsWith("feed-demo-")){u(ce=>ce.map(H=>H.id===X?{...H,status:"resolved"}:H));return}try{await ie(p,G)}catch{d(e.copy.requestFailed)}},t[14]=e.copy.requestFailed,t[15]=T):T=t[15];const A=T;let L;t[16]!==e.copy.feed?(L=M.jsx("h1",{children:e.copy.feed}),t[16]=e.copy.feed,t[17]=L):L=t[17];const f=i==="actionable";let E;t[18]===Symbol.for("react.memo_cache_sentinel")?(E=()=>c("actionable"),t[18]=E):E=t[18];const h=i==="actionable"?0:-1;let Q;t[19]!==e.copy.actionable||t[20]!==h||t[21]!==f?(Q=M.jsx("button",{"aria-selected":f,onClick:E,role:"tab",tabIndex:h,children:e.copy.actionable}),t[19]=e.copy.actionable,t[20]=h,t[21]=f,t[22]=Q):Q=t[22];const J=i==="activity";let W;t[23]===Symbol.for("react.memo_cache_sentinel")?(W=()=>c("activity"),t[23]=W):W=t[23];const F=i==="activity"?0:-1;let C;t[24]!==e.copy.activity||t[25]!==J||t[26]!==F?(C=M.jsx("button",{"aria-selected":J,onClick:W,role:"tab",tabIndex:F,children:e.copy.activity}),t[24]=e.copy.activity,t[25]=J,t[26]=F,t[27]=C):C=t[27];let k;t[28]!==Q||t[29]!==C?(k=M.jsxs("div",{className:"feed-filter",onKeyDown:Ie,role:"tablist",tabIndex:-1,children:[Q,C]}),t[28]=Q,t[29]=C,t[30]=k):k=t[30];let U;t[31]!==k||t[32]!==L?(U=M.jsxs("header",{className:"feed-header",children:[L,k]}),t[31]=k,t[32]=L,t[33]=U):U=t[33];let Y;t[34]!==o?(Y=o&&M.jsx("div",{className:"feed-error",role:"alert",children:o}),t[34]=o,t[35]=Y):Y=t[35];let P;t[36]!==i||t[37]!==A||t[38]!==e||t[39]!==I?(P=I.length===0?M.jsx(xe,{canLoadExamples:e.items.length===0,filter:i,onLoadExamples:()=>{u(Ne(e.copy)),c("actionable")},snapshot:e}):I.map(p=>M.jsx(ze,{item:p,copy:e.copy,perform:A,sourceIcon:e.sourceIcons[p.source],sourceLabel:e.sourceLabels[p.source]},p.id)),t[36]=i,t[37]=A,t[38]=e,t[39]=I,t[40]=P):P=t[40];let R;t[41]!==z||t[42]!==A||t[43]!==e.copy.loadOlder||t[44]!==e.copy.loadingOlder||t[45]!==e.hasMore||t[46]!==e.isLoadingOlder?(R=(z||e.hasMore)&&M.jsx("button",{className:"feed-load-more",disabled:!z&&e.isLoadingOlder,onClick:()=>{z?l(ge):A("feed.loadOlder",{})},children:!z&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[41]=z,t[42]=A,t[43]=e.copy.loadOlder,t[44]=e.copy.loadingOlder,t[45]=e.hasMore,t[46]=e.isLoadingOlder,t[47]=R):R=t[47];let v;t[48]!==P||t[49]!==R?(v=M.jsxs("section",{className:"feed-list",children:[P,R]}),t[48]=P,t[49]=R,t[50]=v):v=t[50];let Z;t[51]!==e.copy.feed||t[52]!==U||t[53]!==Y||t[54]!==v?(Z=M.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:D,tabIndex:-1,children:[U,Y,v]}),t[51]=e.copy.feed,t[52]=U,t[53]=Y,t[54]=v,t[55]=Z):Z=t[55];let B;return t[56]!==Z||t[57]!==w?(B=M.jsx("main",{className:"feed-shell",style:w,children:Z}),t[56]=Z,t[57]=w,t[58]=B):B=t[58],B}function ge(t){return t+le}function ye(t){return t.status==="pending"}function De(){}function Le(){}function xe(t){const e=O.c(40),{canLoadExamples:i,filter:c,onLoadExamples:s,snapshot:l}=t,n=c==="actionable"?l.copy.emptyActionable:l.copy.emptyActivity,a=c==="actionable"?l.copy.emptyActionableDescription:l.copy.emptyActivityDescription;let u;e[0]!==l.copy.integrationChecking||e[1]!==l.copy.integrationDisabled||e[2]!==l.copy.integrationNeedsSetup||e[3]!==l.copy.integrationReady?(u=S=>({checking:l.copy.integrationChecking,disabled:l.copy.integrationDisabled,needsSetup:l.copy.integrationNeedsSetup,ready:l.copy.integrationReady})[S.status],e[0]=l.copy.integrationChecking,e[1]=l.copy.integrationDisabled,e[2]=l.copy.integrationNeedsSetup,e[3]=l.copy.integrationReady,e[4]=u):u=e[4];const o=u;let d;e[5]!==n?(d=M.jsx("h2",{children:n}),e[5]=n,e[6]=d):d=e[6];let r;e[7]!==a?(r=M.jsx("p",{children:a}),e[7]=a,e[8]=r):r=e[8];let j;e[9]!==i||e[10]!==s||e[11]!==l.copy.loadExamples?(j=i&&M.jsx("button",{className:"feed-load-examples",onClick:s,children:l.copy.loadExamples}),e[9]=i,e[10]=s,e[11]=l.copy.loadExamples,e[12]=j):j=e[12];let D;e[13]!==l.copy.integrationsTitle?(D=M.jsx("h3",{id:"feed-integrations-title",children:l.copy.integrationsTitle}),e[13]=l.copy.integrationsTitle,e[14]=D):D=e[14];let g;if(e[15]!==l.integrations||e[16]!==l.sourceIcons||e[17]!==l.sourceLabels||e[18]!==o){let S;e[20]!==l.sourceIcons||e[21]!==l.sourceLabels||e[22]!==o?(S=m=>M.jsxs("div",{className:"feed-integration","data-status":m.status,children:[M.jsx(se,{icon:l.sourceIcons[m.source],label:l.sourceLabels[m.source],source:m.source}),M.jsx("span",{className:"feed-integration-status",children:o(m)})]},m.source),e[20]=l.sourceIcons,e[21]=l.sourceLabels,e[22]=o,e[23]=S):S=e[23],g=l.integrations.map(S),e[15]=l.integrations,e[16]=l.sourceIcons,e[17]=l.sourceLabels,e[18]=o,e[19]=g}else g=e[19];let x;e[24]!==g?(x=M.jsx("div",{className:"feed-integration-grid",children:g}),e[24]=g,e[25]=x):x=e[25];let N;e[26]!==l.copy.integrationHint?(N=M.jsx("p",{className:"feed-integration-hint",children:l.copy.integrationHint}),e[26]=l.copy.integrationHint,e[27]=N):N=e[27];let y;e[28]!==D||e[29]!==x||e[30]!==N?(y=M.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[D,x,N]}),e[28]=D,e[29]=x,e[30]=N,e[31]=y):y=e[31];let I;e[32]!==l.copy.keyboardHelp?(I=M.jsx("p",{className:"feed-keyboard-help",children:l.copy.keyboardHelp}),e[32]=l.copy.keyboardHelp,e[33]=I):I=e[33];let z;return e[34]!==I||e[35]!==d||e[36]!==r||e[37]!==j||e[38]!==y?(z=M.jsxs("div",{className:"feed-empty",children:[d,r,j,y,I]}),e[34]=I,e[35]=d,e[36]=r,e[37]=j,e[38]=y,e[39]=z):z=e[39],z}function ze(t){const e=O.c(34),{item:i,copy:c,perform:s,sourceIcon:l,sourceLabel:n}=t;let a;e[0]!==i.kind||e[1]!==i.title||e[2]!==i.tool_name?(a=i.title||i.tool_name||i.kind.replaceAll("_"," "),e[0]=i.kind,e[1]=i.title,e[2]=i.tool_name,e[3]=a):a=e[3];const u=a,o=`feed-card feed-card-${i.status}`;let d;e[4]!==i.source||e[5]!==l||e[6]!==n?(d=M.jsx(se,{icon:l,label:n,source:i.source}),e[4]=i.source,e[5]=l,e[6]=n,e[7]=d):d=e[7];let r;e[8]!==u?(r=M.jsx("h2",{children:u}),e[8]=u,e[9]=r):r=e[9];let j;e[10]!==d||e[11]!==r?(j=M.jsxs("div",{className:"feed-card-title",children:[d,r]}),e[10]=d,e[11]=r,e[12]=j):j=e[12];let D;e[13]!==i.created_at?(D=new Date(i.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=i.created_at,e[14]=D):D=e[14];let g;e[15]!==D?(g=M.jsx("time",{children:D}),e[15]=D,e[16]=g):g=e[16];let x;e[17]!==j||e[18]!==g?(x=M.jsxs("div",{className:"feed-card-heading",children:[j,g]}),e[17]=j,e[18]=g,e[19]=x):x=e[19];let N;e[20]!==i.cwd?(N=i.cwd&&M.jsx("div",{className:"feed-cwd",children:i.cwd}),e[20]=i.cwd,e[21]=N):N=e[21];let y;e[22]!==i?(y=M.jsx(me,{item:i}),e[22]=i,e[23]=y):y=e[23];let I;e[24]!==c||e[25]!==i||e[26]!==s?(I=i.status==="pending"&&M.jsx(Te,{item:i,copy:c,perform:s}),e[24]=c,e[25]=i,e[26]=s,e[27]=I):I=e[27];let z;return e[28]!==y||e[29]!==I||e[30]!==o||e[31]!==x||e[32]!==N?(z=M.jsxs("article",{className:o,tabIndex:-1,children:[x,N,y,I]}),e[28]=y,e[29]=I,e[30]=o,e[31]=x,e[32]=N,e[33]=z):z=e[33],z}function se(t){const e=O.c(14),{icon:i,label:c,source:s}=t,l=c??s;let n,a;e[0]!==i||e[1]!==s?(n=i?{presentation:"image",url:i}:re[s],a=n?.presentation==="mask"?{"--feed-source-icon":`url(${JSON.stringify(n.url)})`}:void 0,e[0]=i,e[1]=s,e[2]=n,e[3]=a):(n=e[2],a=e[3]);const u=a;let o;e[4]!==l||e[5]!==n||e[6]!==u?(o=n?.presentation==="image"?M.jsx("img",{alt:"","aria-hidden":"true",className:"feed-source-logo feed-source-logo-image",src:n.url}):M.jsx("span",{className:"feed-source-logo feed-source-logo-mask","data-fallback":n?void 0:"",style:u,"aria-hidden":"true",children:!n&&l.slice(0,1).toUpperCase()}),e[4]=l,e[5]=n,e[6]=u,e[7]=o):o=e[7];let d;e[8]!==l?(d=M.jsx("span",{children:l}),e[8]=l,e[9]=d):d=e[9];let r;return e[10]!==s||e[11]!==o||e[12]!==d?(r=M.jsxs("span",{className:"feed-source","data-feed-source":s,children:[o,d]}),e[10]=s,e[11]=o,e[12]=d,e[13]=r):r=e[13],r}function me(t){const e=O.c(2),{item:i}=t,c=i.plan||i.question_prompt||i.tool_input||i.tool_result||i.text;if(!c)return null;let s;return e[0]!==c?(s=M.jsx("pre",{className:"feed-body",children:c}),e[0]=c,e[1]=s):s=e[1],s}function Te(t){const e=O.c(64),{item:i,copy:c,perform:s}=t;if(i.kind==="permissionRequest"){let l;e[0]!==i.allowed_permission_modes?(l=i.allowed_permission_modes??["deny"],e[0]=i.allowed_permission_modes,e[1]=l):l=e[1];let n;e[2]!==l?(n=new Set(l),e[2]=l,e[3]=n):n=e[3];const a=n;let u;e[4]!==c||e[5]!==i.id||e[6]!==a||e[7]!==s?(u=a.has("deny")&&M.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"deny"}),children:c.deny}),e[4]=c,e[5]=i.id,e[6]=a,e[7]=s,e[8]=u):u=e[8];let o;e[9]!==c||e[10]!==i.id||e[11]!==a||e[12]!==s?(o=a.has("once")&&M.jsx("button",{onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"once"}),children:c.allowOnce}),e[9]=c,e[10]=i.id,e[11]=a,e[12]=s,e[13]=o):o=e[13];let d;e[14]!==c||e[15]!==i.id||e[16]!==a||e[17]!==s?(d=a.has("always")&&M.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"always"}),children:c.allowAlways}),e[14]=c,e[15]=i.id,e[16]=a,e[17]=s,e[18]=d):d=e[18];let r;e[19]!==c||e[20]!==i.id||e[21]!==a||e[22]!==s?(r=a.has("all")&&M.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"all"}),children:c.allowAll}),e[19]=c,e[20]=i.id,e[21]=a,e[22]=s,e[23]=r):r=e[23];let j;e[24]!==c||e[25]!==i.id||e[26]!==a||e[27]!==s?(j=a.has("bypass")&&M.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"bypass"}),children:c.allowBypass}),e[24]=c,e[25]=i.id,e[26]=a,e[27]=s,e[28]=j):j=e[28];let D;return e[29]!==u||e[30]!==o||e[31]!==d||e[32]!==r||e[33]!==j?(D=M.jsxs("div",{className:"feed-actions",children:[u,o,d,r,j]}),e[29]=u,e[30]=o,e[31]=d,e[32]=r,e[33]=j,e[34]=D):D=e[34],D}if(i.kind==="exitPlan"){let l;e[35]!==i.id||e[36]!==s?(l=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"manual"}),e[35]=i.id,e[36]=s,e[37]=l):l=e[37];let n;e[38]!==c.planManual||e[39]!==l?(n=M.jsx("button",{onClick:l,children:c.planManual}),e[38]=c.planManual,e[39]=l,e[40]=n):n=e[40];let a;e[41]!==i.id||e[42]!==s?(a=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"autoAccept"}),e[41]=i.id,e[42]=s,e[43]=a):a=e[43];let u;e[44]!==c.planAuto||e[45]!==a?(u=M.jsx("button",{onClick:a,children:c.planAuto}),e[44]=c.planAuto,e[45]=a,e[46]=u):u=e[46];let o;e[47]!==i.id||e[48]!==s?(o=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"ultraplan"}),e[47]=i.id,e[48]=s,e[49]=o):o=e[49];let d;e[50]!==c.planUltraplan||e[51]!==o?(d=M.jsx("button",{className:"primary",onClick:o,children:c.planUltraplan}),e[50]=c.planUltraplan,e[51]=o,e[52]=d):d=e[52];let r;return e[53]!==n||e[54]!==u||e[55]!==d?(r=M.jsxs("div",{className:"feed-actions",children:[n,u,d]}),e[53]=n,e[54]=u,e[55]=d,e[56]=r):r=e[56],r}if(i.kind==="question"){let l;e[57]!==i.questions?(l=i.questions??[],e[57]=i.questions,e[58]=l):l=e[58];let n;return e[59]!==c||e[60]!==i||e[61]!==s||e[62]!==l?(n=M.jsx(Se,{item:i,questions:l,copy:c,perform:s}),e[59]=c,e[60]=i,e[61]=s,e[62]=l,e[63]=n):n=e[63],n}return null}function Se(t){const e=O.c(34),{item:i,questions:c,copy:s,perform:l}=t;let n;e[0]!==i.question_options||e[1]!==i.question_prompt||e[2]!==c?(n=c.length>0?c:[{id:"question",multi_select:!1,options:i.question_options??[],prompt:i.question_prompt??""}],e[0]=i.question_options,e[1]=i.question_prompt,e[2]=c,e[3]=n):n=e[3];const a=n;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[o,d]=b.useState(u);let r;e[5]===Symbol.for("react.memo_cache_sentinel")?(r={},e[5]=r):r=e[5];const[j,D]=b.useState(r);let g;e[6]===Symbol.for("react.memo_cache_sentinel")?(g=(T,A)=>{d(L=>{const f=L[T.id]??[],E=T.multi_select?f.includes(A)?f.filter(h=>h!==A):[...f,A]:[A];return{...L,[T.id]:E}})},e[6]=g):g=e[6];const x=g;let N;if(e[7]!==j||e[8]!==a||e[9]!==o){let T;e[11]!==j||e[12]!==o?(T=A=>{const L=j[A.id]?.trim();if(L)return[L];const f=o[A.id]??[],E=A.options.filter(h=>f.includes(h.id)).map(pe);return E.length>0?[E.join(", ")]:[]},e[11]=j,e[12]=o,e[13]=T):T=e[13],N=a.flatMap(T),e[7]=j,e[8]=a,e[9]=o,e[10]=N}else N=e[10];const y=N;let I;if(e[14]!==s.questionPlaceholder||e[15]!==j||e[16]!==a||e[17]!==o){let T;e[19]!==s.questionPlaceholder||e[20]!==j||e[21]!==o?(T=A=>M.jsxs("div",{className:"feed-question",children:[A.prompt&&M.jsx("div",{className:"feed-question-prompt",children:A.prompt}),M.jsx("div",{className:"feed-options",children:A.options.map(L=>M.jsxs("button",{"aria-pressed":(o[A.id]??[]).includes(L.id),onClick:()=>x(A,L.id),children:[M.jsx("strong",{children:L.label}),L.description&&M.jsx("span",{children:L.description})]},L.id))}),M.jsx("input",{"aria-label":s.questionPlaceholder,onChange:L=>D(f=>({...f,[A.id]:L.target.value})),placeholder:s.questionPlaceholder,value:j[A.id]??""})]},A.id),e[19]=s.questionPlaceholder,e[20]=j,e[21]=o,e[22]=T):T=e[22],I=a.map(T),e[14]=s.questionPlaceholder,e[15]=j,e[16]=a,e[17]=o,e[18]=I}else I=e[18];const z=y.length===0;let S;e[23]!==y||e[24]!==i.id||e[25]!==l?(S=()=>l("feed.question.reply",{itemId:i.id,selections:y}),e[23]=y,e[24]=i.id,e[25]=l,e[26]=S):S=e[26];let m;e[27]!==s.questionSubmit||e[28]!==z||e[29]!==S?(m=M.jsx("button",{className:"primary",disabled:z,onClick:S,children:s.questionSubmit}),e[27]=s.questionSubmit,e[28]=z,e[29]=S,e[30]=m):m=e[30];let w;return e[31]!==I||e[32]!==m?(w=M.jsxs("div",{className:"feed-question-actions",children:[I,m]}),e[31]=I,e[32]=m,e[33]=w):w=e[33],w}function pe(t){return t.label}function we(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ne(()=>M.jsx(Ae,{}));Me.createRoot(t).render(M.jsx(oe,{router:e}))}export{we as mountFeedSurface}; diff --git a/Sources/Feed/FeedSurfaceBridge.swift b/Sources/Feed/FeedSurfaceBridge.swift index a353651e357a..789e93bf3477 100644 --- a/Sources/Feed/FeedSurfaceBridge.swift +++ b/Sources/Feed/FeedSurfaceBridge.swift @@ -241,6 +241,15 @@ final class FeedSurfaceBridge: NSObject, WKScriptMessageHandlerWithReply { "integrationChecking": String(localized: "feed.integrations.status.checking", defaultValue: "Checking..."), "integrationHint": String(localized: "feed.integrations.hint", defaultValue: "Claude Code and Codex use Settings. Other agents need `cmux hooks setup`."), "keyboardHelp": String(localized: "feed.keyboard.help", defaultValue: "Navigate with ↑/↓, J/K, or Control-N/Control-P. Press Tab to reach actions."), + "loadExamples": String(localized: "feed.examples.load", defaultValue: "Load examples"), + "demoPermissionTitle": String(localized: "feed.examples.permission.title", defaultValue: "Run database migration"), + "demoPermissionBody": String(localized: "feed.examples.permission.body", defaultValue: "bun run db:migrate"), + "demoPlanTitle": String(localized: "feed.examples.plan.title", defaultValue: "Plan ready for review"), + "demoPlanBody": String(localized: "feed.examples.plan.body", defaultValue: "Update the bridge, add focused tests, then build the tagged app."), + "demoQuestionTitle": String(localized: "feed.examples.question.title", defaultValue: "Verification scope"), + "demoQuestionPrompt": String(localized: "feed.examples.question.prompt", defaultValue: "Which verification should run?"), + "demoQuestionOptionFocused": String(localized: "feed.examples.question.focused", defaultValue: "Focused tests"), + "demoQuestionOptionFull": String(localized: "feed.examples.question.full", defaultValue: "Full test suite"), "loadOlder": String(localized: "feed.history.loadOlder", defaultValue: "Load older activity"), "loadingOlder": String(localized: "feed.history.loadingOlder", defaultValue: "Loading older activity..."), "deny": String(localized: "feed.permission.deny", defaultValue: "Deny"), diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index f687dac50a33..65505ce432ce 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -1,7 +1,8 @@ import { useCallback, useRef, useState, useSyncExternalStore } from "react"; import { callFeedNative, feedSnapshotStore } from "./bridge"; +import { feedSourceIcons } from "./sourceIcons"; import type { CSSProperties, KeyboardEvent as ReactKeyboardEvent } from "react"; -import type { FeedIntegration, FeedItem, FeedQuestion } from "./types"; +import type { FeedCopy, FeedIntegration, FeedItem, FeedQuestion } from "./types"; import "./styles.css"; type Filter = "actionable" | "activity"; @@ -76,6 +77,48 @@ function handleTabNavigation(event: ReactKeyboardEvent) { tabs[nextIndex]?.click(); } +export function createDemoFeedItems(copy: FeedCopy): FeedItem[] { + const createdAt = new Date().toISOString(); + return [{ + allowed_permission_modes: ["deny", "once", "always"], + created_at: createdAt, + id: "feed-demo-permission", + kind: "permissionRequest", + source: "claude", + status: "pending", + tool_input: copy.demoPermissionBody, + tool_name: copy.demoPermissionTitle, + workstream_id: "feed-demo", + }, { + created_at: createdAt, + id: "feed-demo-plan", + kind: "exitPlan", + plan: copy.demoPlanBody, + source: "codex", + status: "pending", + title: copy.demoPlanTitle, + workstream_id: "feed-demo", + }, { + created_at: createdAt, + id: "feed-demo-question", + kind: "question", + question_prompt: copy.demoQuestionPrompt, + questions: [{ + id: "verification", + multi_select: false, + options: [ + { id: "focused", label: copy.demoQuestionOptionFocused }, + { id: "full", label: copy.demoQuestionOptionFull }, + ], + prompt: copy.demoQuestionPrompt, + }], + source: "gemini", + status: "pending", + title: copy.demoQuestionTitle, + workstream_id: "feed-demo", + }]; +} + export function FeedApp() { const snapshot = useSyncExternalStore( feedSnapshotStore.subscribe, @@ -84,6 +127,7 @@ export function FeedApp() { ); const [filter, setFilter] = useState("actionable"); const [activityLimit, setActivityLimit] = useState(feedActivityPageSize); + const [demoItems, setDemoItems] = useState([]); const [error, setError] = useState(null); const keyboardCleanup = useRef<() => void>(() => {}); const bindKeyboardRoot = useCallback((node: HTMLElement | null) => { @@ -97,9 +141,10 @@ export function FeedApp() { }, []); if (!snapshot) return
; + const sourceItems = snapshot.items.length > 0 ? snapshot.items : demoItems; const items = filter === "actionable" - ? snapshot.items.filter((item) => item.status === "pending") - : snapshot.items; + ? sourceItems.filter((item) => item.status === "pending") + : sourceItems; const visibleItems = filter === "activity" ? items.slice(0, activityLimit) : items; const hasBufferedActivity = filter === "activity" && visibleItems.length < items.length; const themeStyle = { @@ -110,6 +155,13 @@ export function FeedApp() { const perform = async (method: string, params: Record) => { setError(null); + const itemId = typeof params.itemId === "string" ? params.itemId : ""; + if (itemId.startsWith("feed-demo-")) { + setDemoItems((current) => current.map((item) => ( + item.id === itemId ? { ...item, status: "resolved" } : item + ))); + return; + } try { await callFeedNative(method, params); } catch { @@ -152,7 +204,15 @@ export function FeedApp() { {error &&
{error}
}
{visibleItems.length === 0 ? ( - + { + setDemoItems(createDemoFeedItems(snapshot.copy)); + setFilter("actionable"); + }} + snapshot={snapshot} + /> ) : visibleItems.map((item) => ( void; snapshot: NonNullable>; }) { const title = filter === "actionable" ? snapshot.copy.emptyActionable : snapshot.copy.emptyActivity; @@ -202,6 +264,9 @@ function FeedEmptyState({ filter, snapshot }: {

{title}

{description}

+ {canLoadExamples && ( + + )}

{snapshot.copy.integrationsTitle}

@@ -251,14 +316,26 @@ function FeedCard({ item, copy, perform, sourceIcon, sourceLabel }: { function SourceIdentity({ icon, label, source }: { icon?: string; label?: string; source: string }) { const displayLabel = label ?? source; - const style = icon - ? ({ "--feed-source-icon": `url(${JSON.stringify(icon)})` } as CSSProperties) + const resolvedIcon = icon + ? { presentation: "image" as const, url: icon } + : feedSourceIcons[source]; + const style = resolvedIcon?.presentation === "mask" + ? ({ "--feed-source-icon": `url(${JSON.stringify(resolvedIcon.url)})` } as CSSProperties) : undefined; return ( - + {resolvedIcon?.presentation === "image" ? ( + + ) : ( + + )} {displayLabel} ); diff --git a/webviews/src/feed/sourceIcons.ts b/webviews/src/feed/sourceIcons.ts new file mode 100644 index 000000000000..d4124ce0a2c9 --- /dev/null +++ b/webviews/src/feed/sourceIcons.ts @@ -0,0 +1,25 @@ +export type FeedSourceIcon = { + presentation: "image" | "mask"; + url: string; +}; + +const svg = (base64: string): FeedSourceIcon => ({ + presentation: "mask", + url: `data:image/svg+xml;base64,${base64}`, +}); + +const image = (mime: string, base64: string): FeedSourceIcon => ({ + presentation: "image", + url: `data:${mime};base64,${base64}`, +}); + +// Monochrome marks come from Simple Icons. Full-color marks use each +// integration's official favicon so Feed stays recognizable in either theme. +export const feedSourceIcons: Record = { + cursor: svg("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="), + gemini: svg("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="), + copilot: svg("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="), + codebuddy: image("image/svg+xml", "PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="), + factory: image("image/x-icon", "AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"), + qoder: image("image/png", "iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg=="), +}; diff --git a/webviews/src/feed/styles.css b/webviews/src/feed/styles.css index 05bcc3952eee..47008946ac29 100644 --- a/webviews/src/feed/styles.css +++ b/webviews/src/feed/styles.css @@ -114,19 +114,23 @@ button, input { font: inherit; } } .feed-source-logo { - background: currentColor; display: inline-grid; - height: 13px; - line-height: 13px; + height: 15px; + line-height: 15px; + object-fit: contain; + place-items: center; + width: 15px; +} + +.feed-source-logo-mask { + background: currentColor; mask-image: var(--feed-source-icon); mask-position: center; mask-repeat: no-repeat; mask-size: contain; - place-items: center; - width: 13px; } -.feed-source-logo[data-fallback] { +.feed-source-logo-mask[data-fallback] { background: transparent; border: 1px solid currentColor; mask-image: none; @@ -169,6 +173,7 @@ button, input { font: inherit; } .feed-actions button, .feed-question-actions > button, .feed-options button, +.feed-load-examples, .feed-load-more { background: transparent; border: 1px solid var(--feed-border-strong); @@ -180,6 +185,7 @@ button, input { font: inherit; } .feed-actions button:hover, .feed-question-actions > button:hover, .feed-options button:hover, +.feed-load-examples:hover, .feed-load-more:hover { background: var(--feed-fill-hover); } .feed-actions .primary, @@ -236,6 +242,11 @@ button, input { font: inherit; } text-align: center; } +.feed-load-examples { + justify-self: center; + margin-top: 6px; +} + .feed-integrations { border: 1px solid var(--feed-border); margin-top: 16px; diff --git a/webviews/src/feed/types.ts b/webviews/src/feed/types.ts index 5d546548c891..3d41c50d7ac9 100644 --- a/webviews/src/feed/types.ts +++ b/webviews/src/feed/types.ts @@ -42,6 +42,14 @@ export type FeedCopy = { allowBypass: string; allowOnce: string; deny: string; + demoPermissionBody: string; + demoPermissionTitle: string; + demoPlanBody: string; + demoPlanTitle: string; + demoQuestionOptionFocused: string; + demoQuestionOptionFull: string; + demoQuestionPrompt: string; + demoQuestionTitle: string; emptyActionable: string; emptyActionableDescription: string; emptyActivity: string; @@ -54,6 +62,7 @@ export type FeedCopy = { integrationReady: string; integrationsTitle: string; keyboardHelp: string; + loadExamples: string; loadOlder: string; loadingOlder: string; planAuto: string; diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index 15d21694003d..c07e25df4695 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -4,6 +4,7 @@ import { flushSync } from "react-dom"; import { createRoot, type Root } from "react-dom/client"; import { FeedApp, feedActivityPageSize } from "../src/feed/App"; import { receiveFeedNativeEvent } from "../src/feed/bridge"; +import { feedSourceIcons } from "../src/feed/sourceIcons"; let root: Root | null = null; let dom: JSDOM | null = null; @@ -39,12 +40,17 @@ test("Feed React surface invokes the typed permission primitive", async () => { actionable: "Actionable", activity: "All Activity", allowAll: "All tools", allowAlways: "Always Allow", allowBypass: "Bypass", allowOnce: "Allow Once", deny: "Deny", emptyActionable: "No pending decisions", + demoPermissionBody: "bun run db:migrate", demoPermissionTitle: "Run database migration", + demoPlanBody: "Update the bridge, add tests, then build.", demoPlanTitle: "Plan ready for review", + demoQuestionOptionFocused: "Focused tests", demoQuestionOptionFull: "Full test suite", + demoQuestionPrompt: "Which verification should run?", demoQuestionTitle: "Verification scope", emptyActionableDescription: "Requests from agents appear here.", emptyActivity: "No activity yet", emptyActivityDescription: "Agent activity appears here.", feed: "Feed", integrationChecking: "Checking...", integrationDisabled: "Disabled in Settings", integrationHint: "Claude and Codex use Settings. Other agents need hooks setup.", integrationNeedsSetup: "Setup needed", integrationReady: "Ready", integrationsTitle: "Agent integrations", keyboardHelp: "Use J/K to navigate.", + loadExamples: "Load examples", loadOlder: "Load older activity", loadingOlder: "Loading older activity...", planAuto: "Auto", planManual: "Manual", planUltraplan: "Ultraplan", questionPlaceholder: "Type something...", @@ -144,6 +150,23 @@ test("Feed React surface invokes the typed permission primitive", async () => { expect(container.textContent).toContain("CodexDisabled in Settings"); expect(container.textContent).toContain("OpenCodeSetup needed"); expect(container.textContent).toContain("Use J/K to navigate."); + const loadExamples = [...container.querySelectorAll("button")] + .find((button) => button.textContent === "Load examples")!; + flushSync(() => loadExamples.click()); + expect(container.querySelectorAll(".feed-card")).toHaveLength(3); + expect(container.textContent).toContain("Run database migration"); + expect(container.textContent).toContain("Plan ready for review"); + expect(container.textContent).toContain("Verification scope"); + const demoAllowOnce = [...container.querySelectorAll("button")] + .find((button) => button.textContent === "Allow Once")!; + flushSync(() => demoAllowOnce.click()); + expect(container.querySelectorAll(".feed-card")).toHaveLength(2); + expect(calls.some((call: any) => call.params?.itemId === "feed-demo-permission")).toBe(false); + expect(Object.keys(feedSourceIcons).sort()).toEqual([ + "codebuddy", "copilot", "cursor", "factory", "gemini", "qoder", + ]); + expect(feedSourceIcons.cursor?.presentation).toBe("mask"); + expect(feedSourceIcons.codebuddy?.presentation).toBe("image"); }); async function waitFor(predicate: () => boolean, timeout = 1_000) { From b03868e40f77374b7fbc65fe04258b3898fd3dc6 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:20:30 -0700 Subject: [PATCH 17/23] Keep Feed examples available with history --- .../webviews-app/chunks/feedSurface.mjs | 2 +- webviews/src/feed/App.tsx | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index da2019f16645..25d40e75e320 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as O,i as b,j as M,c as Me,a as oe}from"./vendor.mjs";import{c as ne}from"./router.mjs";let ee=null;const $=new Set;let V=null;function te(t){ee=t;for(const e of $)e()}function ae(t){t.type==="feed.snapshot"&&te(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:ae});async function ie(t,e={}){const i=window.webkit?.messageHandlers?.cmuxFeed;if(!i?.postMessage)throw new Error("Native Feed bridge is unavailable.");const c=await i.postMessage({method:t,params:e});if(!c.ok)throw new Error(c.error?.userMessage||"Feed request failed.");return c.value}async function de(){return V||(V=ie("feed.subscribe").then(te).catch(t=>{throw V=null,t}),V)}const K={getSnapshot:()=>ee,subscribe(t){return $.add(t),de(),()=>$.delete(t)}},q=t=>({presentation:"mask",url:`data:image/svg+xml;base64,${t}`}),_=(t,e)=>({presentation:"image",url:`data:${t};base64,${e}`}),re={cursor:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="),gemini:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="),copilot:q("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="),codebuddy:_("image/svg+xml","PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="),factory:_("image/x-icon","AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"),qoder:_("image/png","iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg==")},le=40;function je(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function ue(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const o=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(j=>j!==e&&j.tabIndex>=0);if(o.length===0)return;const d=o.indexOf(document.activeElement),r=d<0?t.shiftKey?o.length-1:0:(d+(t.shiftKey?-1:1)+o.length)%o.length;t.preventDefault(),o[r]?.focus();return}if(je(t.target)||t.altKey||t.metaKey)return;const i=t.key.toLowerCase(),c=!t.ctrlKey&&(i==="j"||i==="arrowdown")?1:!t.ctrlKey&&(i==="k"||i==="arrowup")?-1:t.ctrlKey&&i==="n"?1:t.ctrlKey&&i==="p"?-1:0,s=!t.ctrlKey&&(i==="home"||i==="end");if(c===0&&!s)return;const l=[...e.querySelectorAll(".feed-card")];if(l.length===0)return;const n=document.activeElement?.closest(".feed-card"),a=n?l.indexOf(n):-1,u=i==="home"?0:i==="end"?l.length-1:a<0?c>0?0:l.length-1:Math.max(0,Math.min(l.length-1,a+c));t.preventDefault(),l[u]?.focus({preventScroll:!0}),l[u]?.scrollIntoView?.({block:"nearest"})}function Ie(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],i=e.indexOf(document.activeElement);if(i<0)return;const c=t.key,s=c==="Home"?0:c==="End"?e.length-1:c==="ArrowLeft"?(i-1+e.length)%e.length:c==="ArrowRight"?(i+1)%e.length:-1;s<0||(t.preventDefault(),t.stopPropagation(),e[s]?.focus(),e[s]?.click())}function Ne(t){const e=new Date().toISOString();return[{allowed_permission_modes:["deny","once","always"],created_at:e,id:"feed-demo-permission",kind:"permissionRequest",source:"claude",status:"pending",tool_input:t.demoPermissionBody,tool_name:t.demoPermissionTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-plan",kind:"exitPlan",plan:t.demoPlanBody,source:"codex",status:"pending",title:t.demoPlanTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-question",kind:"question",question_prompt:t.demoQuestionPrompt,questions:[{id:"verification",multi_select:!1,options:[{id:"focused",label:t.demoQuestionOptionFocused},{id:"full",label:t.demoQuestionOptionFull}],prompt:t.demoQuestionPrompt}],source:"gemini",status:"pending",title:t.demoQuestionTitle,workstream_id:"feed-demo"}]}function Ae(){const t=O.c(59),e=b.useSyncExternalStore(K.subscribe,K.getSnapshot,K.getSnapshot),[i,c]=b.useState("actionable"),[s,l]=b.useState(le);let n;t[0]===Symbol.for("react.memo_cache_sentinel")?(n=[],t[0]=n):n=t[0];const[a,u]=b.useState(n),[o,d]=b.useState(null),r=b.useRef(Le);let j;t[1]===Symbol.for("react.memo_cache_sentinel")?(j=p=>{if(r.current(),r.current=De,!p)return;const G=X=>ue(X,p);p.addEventListener("keydown",G),r.current=()=>p.removeEventListener("keydown",G),(!document.activeElement||document.activeElement===document.body)&&p.focus()},t[1]=j):j=t[1];const D=j;if(!e){let p;return t[2]===Symbol.for("react.memo_cache_sentinel")?(p=M.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[2]=p):p=t[2],p}const g=e.items.length>0?e.items:a;let x;t[3]!==i||t[4]!==g?(x=i==="actionable"?g.filter(ye):g,t[3]=i,t[4]=g,t[5]=x):x=t[5];const N=x;let y;t[6]!==s||t[7]!==i||t[8]!==N?(y=i==="activity"?N.slice(0,s):N,t[6]=s,t[7]=i,t[8]=N,t[9]=y):y=t[9];const I=y,z=i==="activity"&&I.length{d(null);const X=typeof G.itemId=="string"?G.itemId:"";if(X.startsWith("feed-demo-")){u(ce=>ce.map(H=>H.id===X?{...H,status:"resolved"}:H));return}try{await ie(p,G)}catch{d(e.copy.requestFailed)}},t[14]=e.copy.requestFailed,t[15]=T):T=t[15];const A=T;let L;t[16]!==e.copy.feed?(L=M.jsx("h1",{children:e.copy.feed}),t[16]=e.copy.feed,t[17]=L):L=t[17];const f=i==="actionable";let E;t[18]===Symbol.for("react.memo_cache_sentinel")?(E=()=>c("actionable"),t[18]=E):E=t[18];const h=i==="actionable"?0:-1;let Q;t[19]!==e.copy.actionable||t[20]!==h||t[21]!==f?(Q=M.jsx("button",{"aria-selected":f,onClick:E,role:"tab",tabIndex:h,children:e.copy.actionable}),t[19]=e.copy.actionable,t[20]=h,t[21]=f,t[22]=Q):Q=t[22];const J=i==="activity";let W;t[23]===Symbol.for("react.memo_cache_sentinel")?(W=()=>c("activity"),t[23]=W):W=t[23];const F=i==="activity"?0:-1;let C;t[24]!==e.copy.activity||t[25]!==J||t[26]!==F?(C=M.jsx("button",{"aria-selected":J,onClick:W,role:"tab",tabIndex:F,children:e.copy.activity}),t[24]=e.copy.activity,t[25]=J,t[26]=F,t[27]=C):C=t[27];let k;t[28]!==Q||t[29]!==C?(k=M.jsxs("div",{className:"feed-filter",onKeyDown:Ie,role:"tablist",tabIndex:-1,children:[Q,C]}),t[28]=Q,t[29]=C,t[30]=k):k=t[30];let U;t[31]!==k||t[32]!==L?(U=M.jsxs("header",{className:"feed-header",children:[L,k]}),t[31]=k,t[32]=L,t[33]=U):U=t[33];let Y;t[34]!==o?(Y=o&&M.jsx("div",{className:"feed-error",role:"alert",children:o}),t[34]=o,t[35]=Y):Y=t[35];let P;t[36]!==i||t[37]!==A||t[38]!==e||t[39]!==I?(P=I.length===0?M.jsx(xe,{canLoadExamples:e.items.length===0,filter:i,onLoadExamples:()=>{u(Ne(e.copy)),c("actionable")},snapshot:e}):I.map(p=>M.jsx(ze,{item:p,copy:e.copy,perform:A,sourceIcon:e.sourceIcons[p.source],sourceLabel:e.sourceLabels[p.source]},p.id)),t[36]=i,t[37]=A,t[38]=e,t[39]=I,t[40]=P):P=t[40];let R;t[41]!==z||t[42]!==A||t[43]!==e.copy.loadOlder||t[44]!==e.copy.loadingOlder||t[45]!==e.hasMore||t[46]!==e.isLoadingOlder?(R=(z||e.hasMore)&&M.jsx("button",{className:"feed-load-more",disabled:!z&&e.isLoadingOlder,onClick:()=>{z?l(ge):A("feed.loadOlder",{})},children:!z&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[41]=z,t[42]=A,t[43]=e.copy.loadOlder,t[44]=e.copy.loadingOlder,t[45]=e.hasMore,t[46]=e.isLoadingOlder,t[47]=R):R=t[47];let v;t[48]!==P||t[49]!==R?(v=M.jsxs("section",{className:"feed-list",children:[P,R]}),t[48]=P,t[49]=R,t[50]=v):v=t[50];let Z;t[51]!==e.copy.feed||t[52]!==U||t[53]!==Y||t[54]!==v?(Z=M.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:D,tabIndex:-1,children:[U,Y,v]}),t[51]=e.copy.feed,t[52]=U,t[53]=Y,t[54]=v,t[55]=Z):Z=t[55];let B;return t[56]!==Z||t[57]!==w?(B=M.jsx("main",{className:"feed-shell",style:w,children:Z}),t[56]=Z,t[57]=w,t[58]=B):B=t[58],B}function ge(t){return t+le}function ye(t){return t.status==="pending"}function De(){}function Le(){}function xe(t){const e=O.c(40),{canLoadExamples:i,filter:c,onLoadExamples:s,snapshot:l}=t,n=c==="actionable"?l.copy.emptyActionable:l.copy.emptyActivity,a=c==="actionable"?l.copy.emptyActionableDescription:l.copy.emptyActivityDescription;let u;e[0]!==l.copy.integrationChecking||e[1]!==l.copy.integrationDisabled||e[2]!==l.copy.integrationNeedsSetup||e[3]!==l.copy.integrationReady?(u=S=>({checking:l.copy.integrationChecking,disabled:l.copy.integrationDisabled,needsSetup:l.copy.integrationNeedsSetup,ready:l.copy.integrationReady})[S.status],e[0]=l.copy.integrationChecking,e[1]=l.copy.integrationDisabled,e[2]=l.copy.integrationNeedsSetup,e[3]=l.copy.integrationReady,e[4]=u):u=e[4];const o=u;let d;e[5]!==n?(d=M.jsx("h2",{children:n}),e[5]=n,e[6]=d):d=e[6];let r;e[7]!==a?(r=M.jsx("p",{children:a}),e[7]=a,e[8]=r):r=e[8];let j;e[9]!==i||e[10]!==s||e[11]!==l.copy.loadExamples?(j=i&&M.jsx("button",{className:"feed-load-examples",onClick:s,children:l.copy.loadExamples}),e[9]=i,e[10]=s,e[11]=l.copy.loadExamples,e[12]=j):j=e[12];let D;e[13]!==l.copy.integrationsTitle?(D=M.jsx("h3",{id:"feed-integrations-title",children:l.copy.integrationsTitle}),e[13]=l.copy.integrationsTitle,e[14]=D):D=e[14];let g;if(e[15]!==l.integrations||e[16]!==l.sourceIcons||e[17]!==l.sourceLabels||e[18]!==o){let S;e[20]!==l.sourceIcons||e[21]!==l.sourceLabels||e[22]!==o?(S=m=>M.jsxs("div",{className:"feed-integration","data-status":m.status,children:[M.jsx(se,{icon:l.sourceIcons[m.source],label:l.sourceLabels[m.source],source:m.source}),M.jsx("span",{className:"feed-integration-status",children:o(m)})]},m.source),e[20]=l.sourceIcons,e[21]=l.sourceLabels,e[22]=o,e[23]=S):S=e[23],g=l.integrations.map(S),e[15]=l.integrations,e[16]=l.sourceIcons,e[17]=l.sourceLabels,e[18]=o,e[19]=g}else g=e[19];let x;e[24]!==g?(x=M.jsx("div",{className:"feed-integration-grid",children:g}),e[24]=g,e[25]=x):x=e[25];let N;e[26]!==l.copy.integrationHint?(N=M.jsx("p",{className:"feed-integration-hint",children:l.copy.integrationHint}),e[26]=l.copy.integrationHint,e[27]=N):N=e[27];let y;e[28]!==D||e[29]!==x||e[30]!==N?(y=M.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[D,x,N]}),e[28]=D,e[29]=x,e[30]=N,e[31]=y):y=e[31];let I;e[32]!==l.copy.keyboardHelp?(I=M.jsx("p",{className:"feed-keyboard-help",children:l.copy.keyboardHelp}),e[32]=l.copy.keyboardHelp,e[33]=I):I=e[33];let z;return e[34]!==I||e[35]!==d||e[36]!==r||e[37]!==j||e[38]!==y?(z=M.jsxs("div",{className:"feed-empty",children:[d,r,j,y,I]}),e[34]=I,e[35]=d,e[36]=r,e[37]=j,e[38]=y,e[39]=z):z=e[39],z}function ze(t){const e=O.c(34),{item:i,copy:c,perform:s,sourceIcon:l,sourceLabel:n}=t;let a;e[0]!==i.kind||e[1]!==i.title||e[2]!==i.tool_name?(a=i.title||i.tool_name||i.kind.replaceAll("_"," "),e[0]=i.kind,e[1]=i.title,e[2]=i.tool_name,e[3]=a):a=e[3];const u=a,o=`feed-card feed-card-${i.status}`;let d;e[4]!==i.source||e[5]!==l||e[6]!==n?(d=M.jsx(se,{icon:l,label:n,source:i.source}),e[4]=i.source,e[5]=l,e[6]=n,e[7]=d):d=e[7];let r;e[8]!==u?(r=M.jsx("h2",{children:u}),e[8]=u,e[9]=r):r=e[9];let j;e[10]!==d||e[11]!==r?(j=M.jsxs("div",{className:"feed-card-title",children:[d,r]}),e[10]=d,e[11]=r,e[12]=j):j=e[12];let D;e[13]!==i.created_at?(D=new Date(i.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=i.created_at,e[14]=D):D=e[14];let g;e[15]!==D?(g=M.jsx("time",{children:D}),e[15]=D,e[16]=g):g=e[16];let x;e[17]!==j||e[18]!==g?(x=M.jsxs("div",{className:"feed-card-heading",children:[j,g]}),e[17]=j,e[18]=g,e[19]=x):x=e[19];let N;e[20]!==i.cwd?(N=i.cwd&&M.jsx("div",{className:"feed-cwd",children:i.cwd}),e[20]=i.cwd,e[21]=N):N=e[21];let y;e[22]!==i?(y=M.jsx(me,{item:i}),e[22]=i,e[23]=y):y=e[23];let I;e[24]!==c||e[25]!==i||e[26]!==s?(I=i.status==="pending"&&M.jsx(Te,{item:i,copy:c,perform:s}),e[24]=c,e[25]=i,e[26]=s,e[27]=I):I=e[27];let z;return e[28]!==y||e[29]!==I||e[30]!==o||e[31]!==x||e[32]!==N?(z=M.jsxs("article",{className:o,tabIndex:-1,children:[x,N,y,I]}),e[28]=y,e[29]=I,e[30]=o,e[31]=x,e[32]=N,e[33]=z):z=e[33],z}function se(t){const e=O.c(14),{icon:i,label:c,source:s}=t,l=c??s;let n,a;e[0]!==i||e[1]!==s?(n=i?{presentation:"image",url:i}:re[s],a=n?.presentation==="mask"?{"--feed-source-icon":`url(${JSON.stringify(n.url)})`}:void 0,e[0]=i,e[1]=s,e[2]=n,e[3]=a):(n=e[2],a=e[3]);const u=a;let o;e[4]!==l||e[5]!==n||e[6]!==u?(o=n?.presentation==="image"?M.jsx("img",{alt:"","aria-hidden":"true",className:"feed-source-logo feed-source-logo-image",src:n.url}):M.jsx("span",{className:"feed-source-logo feed-source-logo-mask","data-fallback":n?void 0:"",style:u,"aria-hidden":"true",children:!n&&l.slice(0,1).toUpperCase()}),e[4]=l,e[5]=n,e[6]=u,e[7]=o):o=e[7];let d;e[8]!==l?(d=M.jsx("span",{children:l}),e[8]=l,e[9]=d):d=e[9];let r;return e[10]!==s||e[11]!==o||e[12]!==d?(r=M.jsxs("span",{className:"feed-source","data-feed-source":s,children:[o,d]}),e[10]=s,e[11]=o,e[12]=d,e[13]=r):r=e[13],r}function me(t){const e=O.c(2),{item:i}=t,c=i.plan||i.question_prompt||i.tool_input||i.tool_result||i.text;if(!c)return null;let s;return e[0]!==c?(s=M.jsx("pre",{className:"feed-body",children:c}),e[0]=c,e[1]=s):s=e[1],s}function Te(t){const e=O.c(64),{item:i,copy:c,perform:s}=t;if(i.kind==="permissionRequest"){let l;e[0]!==i.allowed_permission_modes?(l=i.allowed_permission_modes??["deny"],e[0]=i.allowed_permission_modes,e[1]=l):l=e[1];let n;e[2]!==l?(n=new Set(l),e[2]=l,e[3]=n):n=e[3];const a=n;let u;e[4]!==c||e[5]!==i.id||e[6]!==a||e[7]!==s?(u=a.has("deny")&&M.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"deny"}),children:c.deny}),e[4]=c,e[5]=i.id,e[6]=a,e[7]=s,e[8]=u):u=e[8];let o;e[9]!==c||e[10]!==i.id||e[11]!==a||e[12]!==s?(o=a.has("once")&&M.jsx("button",{onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"once"}),children:c.allowOnce}),e[9]=c,e[10]=i.id,e[11]=a,e[12]=s,e[13]=o):o=e[13];let d;e[14]!==c||e[15]!==i.id||e[16]!==a||e[17]!==s?(d=a.has("always")&&M.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"always"}),children:c.allowAlways}),e[14]=c,e[15]=i.id,e[16]=a,e[17]=s,e[18]=d):d=e[18];let r;e[19]!==c||e[20]!==i.id||e[21]!==a||e[22]!==s?(r=a.has("all")&&M.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"all"}),children:c.allowAll}),e[19]=c,e[20]=i.id,e[21]=a,e[22]=s,e[23]=r):r=e[23];let j;e[24]!==c||e[25]!==i.id||e[26]!==a||e[27]!==s?(j=a.has("bypass")&&M.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"bypass"}),children:c.allowBypass}),e[24]=c,e[25]=i.id,e[26]=a,e[27]=s,e[28]=j):j=e[28];let D;return e[29]!==u||e[30]!==o||e[31]!==d||e[32]!==r||e[33]!==j?(D=M.jsxs("div",{className:"feed-actions",children:[u,o,d,r,j]}),e[29]=u,e[30]=o,e[31]=d,e[32]=r,e[33]=j,e[34]=D):D=e[34],D}if(i.kind==="exitPlan"){let l;e[35]!==i.id||e[36]!==s?(l=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"manual"}),e[35]=i.id,e[36]=s,e[37]=l):l=e[37];let n;e[38]!==c.planManual||e[39]!==l?(n=M.jsx("button",{onClick:l,children:c.planManual}),e[38]=c.planManual,e[39]=l,e[40]=n):n=e[40];let a;e[41]!==i.id||e[42]!==s?(a=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"autoAccept"}),e[41]=i.id,e[42]=s,e[43]=a):a=e[43];let u;e[44]!==c.planAuto||e[45]!==a?(u=M.jsx("button",{onClick:a,children:c.planAuto}),e[44]=c.planAuto,e[45]=a,e[46]=u):u=e[46];let o;e[47]!==i.id||e[48]!==s?(o=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"ultraplan"}),e[47]=i.id,e[48]=s,e[49]=o):o=e[49];let d;e[50]!==c.planUltraplan||e[51]!==o?(d=M.jsx("button",{className:"primary",onClick:o,children:c.planUltraplan}),e[50]=c.planUltraplan,e[51]=o,e[52]=d):d=e[52];let r;return e[53]!==n||e[54]!==u||e[55]!==d?(r=M.jsxs("div",{className:"feed-actions",children:[n,u,d]}),e[53]=n,e[54]=u,e[55]=d,e[56]=r):r=e[56],r}if(i.kind==="question"){let l;e[57]!==i.questions?(l=i.questions??[],e[57]=i.questions,e[58]=l):l=e[58];let n;return e[59]!==c||e[60]!==i||e[61]!==s||e[62]!==l?(n=M.jsx(Se,{item:i,questions:l,copy:c,perform:s}),e[59]=c,e[60]=i,e[61]=s,e[62]=l,e[63]=n):n=e[63],n}return null}function Se(t){const e=O.c(34),{item:i,questions:c,copy:s,perform:l}=t;let n;e[0]!==i.question_options||e[1]!==i.question_prompt||e[2]!==c?(n=c.length>0?c:[{id:"question",multi_select:!1,options:i.question_options??[],prompt:i.question_prompt??""}],e[0]=i.question_options,e[1]=i.question_prompt,e[2]=c,e[3]=n):n=e[3];const a=n;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[o,d]=b.useState(u);let r;e[5]===Symbol.for("react.memo_cache_sentinel")?(r={},e[5]=r):r=e[5];const[j,D]=b.useState(r);let g;e[6]===Symbol.for("react.memo_cache_sentinel")?(g=(T,A)=>{d(L=>{const f=L[T.id]??[],E=T.multi_select?f.includes(A)?f.filter(h=>h!==A):[...f,A]:[A];return{...L,[T.id]:E}})},e[6]=g):g=e[6];const x=g;let N;if(e[7]!==j||e[8]!==a||e[9]!==o){let T;e[11]!==j||e[12]!==o?(T=A=>{const L=j[A.id]?.trim();if(L)return[L];const f=o[A.id]??[],E=A.options.filter(h=>f.includes(h.id)).map(pe);return E.length>0?[E.join(", ")]:[]},e[11]=j,e[12]=o,e[13]=T):T=e[13],N=a.flatMap(T),e[7]=j,e[8]=a,e[9]=o,e[10]=N}else N=e[10];const y=N;let I;if(e[14]!==s.questionPlaceholder||e[15]!==j||e[16]!==a||e[17]!==o){let T;e[19]!==s.questionPlaceholder||e[20]!==j||e[21]!==o?(T=A=>M.jsxs("div",{className:"feed-question",children:[A.prompt&&M.jsx("div",{className:"feed-question-prompt",children:A.prompt}),M.jsx("div",{className:"feed-options",children:A.options.map(L=>M.jsxs("button",{"aria-pressed":(o[A.id]??[]).includes(L.id),onClick:()=>x(A,L.id),children:[M.jsx("strong",{children:L.label}),L.description&&M.jsx("span",{children:L.description})]},L.id))}),M.jsx("input",{"aria-label":s.questionPlaceholder,onChange:L=>D(f=>({...f,[A.id]:L.target.value})),placeholder:s.questionPlaceholder,value:j[A.id]??""})]},A.id),e[19]=s.questionPlaceholder,e[20]=j,e[21]=o,e[22]=T):T=e[22],I=a.map(T),e[14]=s.questionPlaceholder,e[15]=j,e[16]=a,e[17]=o,e[18]=I}else I=e[18];const z=y.length===0;let S;e[23]!==y||e[24]!==i.id||e[25]!==l?(S=()=>l("feed.question.reply",{itemId:i.id,selections:y}),e[23]=y,e[24]=i.id,e[25]=l,e[26]=S):S=e[26];let m;e[27]!==s.questionSubmit||e[28]!==z||e[29]!==S?(m=M.jsx("button",{className:"primary",disabled:z,onClick:S,children:s.questionSubmit}),e[27]=s.questionSubmit,e[28]=z,e[29]=S,e[30]=m):m=e[30];let w;return e[31]!==I||e[32]!==m?(w=M.jsxs("div",{className:"feed-question-actions",children:[I,m]}),e[31]=I,e[32]=m,e[33]=w):w=e[33],w}function pe(t){return t.label}function we(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ne(()=>M.jsx(Ae,{}));Me.createRoot(t).render(M.jsx(oe,{router:e}))}export{we as mountFeedSurface}; +import{b as h,i as O,j as c,c as oe,a as ne}from"./vendor.mjs";import{c as ae}from"./router.mjs";let te=null;const ee=new Set;let V=null;function ie(t){te=t;for(const e of ee)e()}function de(t){t.type==="feed.snapshot"&&ie(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:de});async function se(t,e={}){const i=window.webkit?.messageHandlers?.cmuxFeed;if(!i?.postMessage)throw new Error("Native Feed bridge is unavailable.");const l=await i.postMessage({method:t,params:e});if(!l.ok)throw new Error(l.error?.userMessage||"Feed request failed.");return l.value}async function re(){return V||(V=se("feed.subscribe").then(ie).catch(t=>{throw V=null,t}),V)}const q={getSnapshot:()=>te,subscribe(t){return ee.add(t),re(),()=>ee.delete(t)}},_=t=>({presentation:"mask",url:`data:image/svg+xml;base64,${t}`}),$=(t,e)=>({presentation:"image",url:`data:${t};base64,${e}`}),je={cursor:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="),gemini:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="),copilot:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="),codebuddy:$("image/svg+xml","PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="),factory:$("image/x-icon","AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"),qoder:$("image/png","iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg==")},le=40;function ue(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function Ie(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const M=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(j=>j!==e&&j.tabIndex>=0);if(M.length===0)return;const d=M.indexOf(document.activeElement),r=d<0?t.shiftKey?M.length-1:0:(d+(t.shiftKey?-1:1)+M.length)%M.length;t.preventDefault(),M[r]?.focus();return}if(ue(t.target)||t.altKey||t.metaKey)return;const i=t.key.toLowerCase(),l=!t.ctrlKey&&(i==="j"||i==="arrowdown")?1:!t.ctrlKey&&(i==="k"||i==="arrowup")?-1:t.ctrlKey&&i==="n"?1:t.ctrlKey&&i==="p"?-1:0,s=!t.ctrlKey&&(i==="home"||i==="end");if(l===0&&!s)return;const n=[...e.querySelectorAll(".feed-card")];if(n.length===0)return;const a=document.activeElement?.closest(".feed-card"),o=a?n.indexOf(a):-1,u=i==="home"?0:i==="end"?n.length-1:o<0?l>0?0:n.length-1:Math.max(0,Math.min(n.length-1,o+l));t.preventDefault(),n[u]?.focus({preventScroll:!0}),n[u]?.scrollIntoView?.({block:"nearest"})}function Ne(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],i=e.indexOf(document.activeElement);if(i<0)return;const l=t.key,s=l==="Home"?0:l==="End"?e.length-1:l==="ArrowLeft"?(i-1+e.length)%e.length:l==="ArrowRight"?(i+1)%e.length:-1;s<0||(t.preventDefault(),t.stopPropagation(),e[s]?.focus(),e[s]?.click())}function Ae(t){const e=new Date().toISOString();return[{allowed_permission_modes:["deny","once","always"],created_at:e,id:"feed-demo-permission",kind:"permissionRequest",source:"claude",status:"pending",tool_input:t.demoPermissionBody,tool_name:t.demoPermissionTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-plan",kind:"exitPlan",plan:t.demoPlanBody,source:"codex",status:"pending",title:t.demoPlanTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-question",kind:"question",question_prompt:t.demoQuestionPrompt,questions:[{id:"verification",multi_select:!1,options:[{id:"focused",label:t.demoQuestionOptionFocused},{id:"full",label:t.demoQuestionOptionFull}],prompt:t.demoQuestionPrompt}],source:"gemini",status:"pending",title:t.demoQuestionTitle,workstream_id:"feed-demo"}]}function ge(){const t=h.c(62),e=O.useSyncExternalStore(q.subscribe,q.getSnapshot,q.getSnapshot),[i,l]=O.useState("actionable"),[s,n]=O.useState(le);let a;t[0]===Symbol.for("react.memo_cache_sentinel")?(a=[],t[0]=a):a=t[0];const[o,u]=O.useState(a),[M,d]=O.useState(null),r=O.useRef(Le);let j;t[1]===Symbol.for("react.memo_cache_sentinel")?(j=S=>{if(r.current(),r.current=ze,!S)return;const G=X=>Ie(X,S);S.addEventListener("keydown",G),r.current=()=>S.removeEventListener("keydown",G),(!document.activeElement||document.activeElement===document.body)&&S.focus()},t[1]=j):j=t[1];const y=j;if(!e){let S;return t[2]===Symbol.for("react.memo_cache_sentinel")?(S=c.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[2]=S):S=t[2],S}let N;t[3]!==o||t[4]!==e.items?(N=o.length>0?[...o,...e.items]:e.items,t[3]=o,t[4]=e.items,t[5]=N):N=t[5];const x=N;let A;t[6]!==i||t[7]!==x?(A=i==="actionable"?x.filter(De):x,t[6]=i,t[7]=x,t[8]=A):A=t[8];const I=A;let g;t[9]!==s||t[10]!==i||t[11]!==I?(g=i==="activity"?I.slice(0,s):I,t[9]=s,t[10]=i,t[11]=I,t[12]=g):g=t[12];const z=g,m=i==="activity"&&z.length{d(null);const X=typeof G.itemId=="string"?G.itemId:"";if(X.startsWith("feed-demo-")){u(Me=>Me.map(K=>K.id===X?{...K,status:"resolved"}:K));return}try{await se(S,G)}catch{d(e.copy.requestFailed)}},t[17]=e.copy.requestFailed,t[18]=D):D=t[18];const L=D;let p;t[19]!==e.copy.feed?(p=c.jsx("h1",{children:e.copy.feed}),t[19]=e.copy.feed,t[20]=p):p=t[20];const w=i==="actionable";let b;t[21]===Symbol.for("react.memo_cache_sentinel")?(b=()=>l("actionable"),t[21]=b):b=t[21];const J=i==="actionable"?0:-1;let Q;t[22]!==e.copy.actionable||t[23]!==J||t[24]!==w?(Q=c.jsx("button",{"aria-selected":w,onClick:b,role:"tab",tabIndex:J,children:e.copy.actionable}),t[22]=e.copy.actionable,t[23]=J,t[24]=w,t[25]=Q):Q=t[25];const F=i==="activity";let W;t[26]===Symbol.for("react.memo_cache_sentinel")?(W=()=>l("activity"),t[26]=W):W=t[26];const H=i==="activity"?0:-1;let C;t[27]!==e.copy.activity||t[28]!==F||t[29]!==H?(C=c.jsx("button",{"aria-selected":F,onClick:W,role:"tab",tabIndex:H,children:e.copy.activity}),t[27]=e.copy.activity,t[28]=F,t[29]=H,t[30]=C):C=t[30];let k;t[31]!==Q||t[32]!==C?(k=c.jsxs("div",{className:"feed-filter",onKeyDown:Ne,role:"tablist",tabIndex:-1,children:[Q,C]}),t[31]=Q,t[32]=C,t[33]=k):k=t[33];let U;t[34]!==k||t[35]!==p?(U=c.jsxs("header",{className:"feed-header",children:[p,k]}),t[34]=k,t[35]=p,t[36]=U):U=t[36];let Y;t[37]!==M?(Y=M&&c.jsx("div",{className:"feed-error",role:"alert",children:M}),t[37]=M,t[38]=Y):Y=t[38];let P;t[39]!==i||t[40]!==L||t[41]!==e||t[42]!==z?(P=z.length===0?c.jsx(xe,{filter:i,onLoadExamples:()=>{u(Ae(e.copy)),l("actionable")},snapshot:e}):z.map(S=>c.jsx(me,{item:S,copy:e.copy,perform:L,sourceIcon:e.sourceIcons[S.source],sourceLabel:e.sourceLabels[S.source]},S.id)),t[39]=i,t[40]=L,t[41]=e,t[42]=z,t[43]=P):P=t[43];let R;t[44]!==m||t[45]!==L||t[46]!==e.copy.loadOlder||t[47]!==e.copy.loadingOlder||t[48]!==e.hasMore||t[49]!==e.isLoadingOlder?(R=(m||e.hasMore)&&c.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?n(ye):L("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[44]=m,t[45]=L,t[46]=e.copy.loadOlder,t[47]=e.copy.loadingOlder,t[48]=e.hasMore,t[49]=e.isLoadingOlder,t[50]=R):R=t[50];let v;t[51]!==P||t[52]!==R?(v=c.jsxs("section",{className:"feed-list",children:[P,R]}),t[51]=P,t[52]=R,t[53]=v):v=t[53];let Z;t[54]!==e.copy.feed||t[55]!==U||t[56]!==Y||t[57]!==v?(Z=c.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:y,tabIndex:-1,children:[U,Y,v]}),t[54]=e.copy.feed,t[55]=U,t[56]=Y,t[57]=v,t[58]=Z):Z=t[58];let B;return t[59]!==Z||t[60]!==T?(B=c.jsx("main",{className:"feed-shell",style:T,children:Z}),t[59]=Z,t[60]=T,t[61]=B):B=t[61],B}function ye(t){return t+le}function De(t){return t.status==="pending"}function ze(){}function Le(){}function xe(t){const e=h.c(39),{filter:i,onLoadExamples:l,snapshot:s}=t,n=i==="actionable"?s.copy.emptyActionable:s.copy.emptyActivity,a=i==="actionable"?s.copy.emptyActionableDescription:s.copy.emptyActivityDescription;let o;e[0]!==s.copy.integrationChecking||e[1]!==s.copy.integrationDisabled||e[2]!==s.copy.integrationNeedsSetup||e[3]!==s.copy.integrationReady?(o=z=>({checking:s.copy.integrationChecking,disabled:s.copy.integrationDisabled,needsSetup:s.copy.integrationNeedsSetup,ready:s.copy.integrationReady})[z.status],e[0]=s.copy.integrationChecking,e[1]=s.copy.integrationDisabled,e[2]=s.copy.integrationNeedsSetup,e[3]=s.copy.integrationReady,e[4]=o):o=e[4];const u=o;let M;e[5]!==n?(M=c.jsx("h2",{children:n}),e[5]=n,e[6]=M):M=e[6];let d;e[7]!==a?(d=c.jsx("p",{children:a}),e[7]=a,e[8]=d):d=e[8];let r;e[9]!==l||e[10]!==s.copy.loadExamples?(r=c.jsx("button",{className:"feed-load-examples",onClick:l,children:s.copy.loadExamples}),e[9]=l,e[10]=s.copy.loadExamples,e[11]=r):r=e[11];let j;e[12]!==s.copy.integrationsTitle?(j=c.jsx("h3",{id:"feed-integrations-title",children:s.copy.integrationsTitle}),e[12]=s.copy.integrationsTitle,e[13]=j):j=e[13];let y;if(e[14]!==s.integrations||e[15]!==s.sourceIcons||e[16]!==s.sourceLabels||e[17]!==u){let z;e[19]!==s.sourceIcons||e[20]!==s.sourceLabels||e[21]!==u?(z=m=>c.jsxs("div",{className:"feed-integration","data-status":m.status,children:[c.jsx(ce,{icon:s.sourceIcons[m.source],label:s.sourceLabels[m.source],source:m.source}),c.jsx("span",{className:"feed-integration-status",children:u(m)})]},m.source),e[19]=s.sourceIcons,e[20]=s.sourceLabels,e[21]=u,e[22]=z):z=e[22],y=s.integrations.map(z),e[14]=s.integrations,e[15]=s.sourceIcons,e[16]=s.sourceLabels,e[17]=u,e[18]=y}else y=e[18];let N;e[23]!==y?(N=c.jsx("div",{className:"feed-integration-grid",children:y}),e[23]=y,e[24]=N):N=e[24];let x;e[25]!==s.copy.integrationHint?(x=c.jsx("p",{className:"feed-integration-hint",children:s.copy.integrationHint}),e[25]=s.copy.integrationHint,e[26]=x):x=e[26];let A;e[27]!==j||e[28]!==N||e[29]!==x?(A=c.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[j,N,x]}),e[27]=j,e[28]=N,e[29]=x,e[30]=A):A=e[30];let I;e[31]!==s.copy.keyboardHelp?(I=c.jsx("p",{className:"feed-keyboard-help",children:s.copy.keyboardHelp}),e[31]=s.copy.keyboardHelp,e[32]=I):I=e[32];let g;return e[33]!==I||e[34]!==M||e[35]!==d||e[36]!==r||e[37]!==A?(g=c.jsxs("div",{className:"feed-empty",children:[M,d,r,A,I]}),e[33]=I,e[34]=M,e[35]=d,e[36]=r,e[37]=A,e[38]=g):g=e[38],g}function me(t){const e=h.c(34),{item:i,copy:l,perform:s,sourceIcon:n,sourceLabel:a}=t;let o;e[0]!==i.kind||e[1]!==i.title||e[2]!==i.tool_name?(o=i.title||i.tool_name||i.kind.replaceAll("_"," "),e[0]=i.kind,e[1]=i.title,e[2]=i.tool_name,e[3]=o):o=e[3];const u=o,M=`feed-card feed-card-${i.status}`;let d;e[4]!==i.source||e[5]!==n||e[6]!==a?(d=c.jsx(ce,{icon:n,label:a,source:i.source}),e[4]=i.source,e[5]=n,e[6]=a,e[7]=d):d=e[7];let r;e[8]!==u?(r=c.jsx("h2",{children:u}),e[8]=u,e[9]=r):r=e[9];let j;e[10]!==d||e[11]!==r?(j=c.jsxs("div",{className:"feed-card-title",children:[d,r]}),e[10]=d,e[11]=r,e[12]=j):j=e[12];let y;e[13]!==i.created_at?(y=new Date(i.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=i.created_at,e[14]=y):y=e[14];let N;e[15]!==y?(N=c.jsx("time",{children:y}),e[15]=y,e[16]=N):N=e[16];let x;e[17]!==j||e[18]!==N?(x=c.jsxs("div",{className:"feed-card-heading",children:[j,N]}),e[17]=j,e[18]=N,e[19]=x):x=e[19];let A;e[20]!==i.cwd?(A=i.cwd&&c.jsx("div",{className:"feed-cwd",children:i.cwd}),e[20]=i.cwd,e[21]=A):A=e[21];let I;e[22]!==i?(I=c.jsx(Te,{item:i}),e[22]=i,e[23]=I):I=e[23];let g;e[24]!==l||e[25]!==i||e[26]!==s?(g=i.status==="pending"&&c.jsx(Se,{item:i,copy:l,perform:s}),e[24]=l,e[25]=i,e[26]=s,e[27]=g):g=e[27];let z;return e[28]!==I||e[29]!==g||e[30]!==M||e[31]!==x||e[32]!==A?(z=c.jsxs("article",{className:M,tabIndex:-1,children:[x,A,I,g]}),e[28]=I,e[29]=g,e[30]=M,e[31]=x,e[32]=A,e[33]=z):z=e[33],z}function ce(t){const e=h.c(14),{icon:i,label:l,source:s}=t,n=l??s;let a,o;e[0]!==i||e[1]!==s?(a=i?{presentation:"image",url:i}:je[s],o=a?.presentation==="mask"?{"--feed-source-icon":`url(${JSON.stringify(a.url)})`}:void 0,e[0]=i,e[1]=s,e[2]=a,e[3]=o):(a=e[2],o=e[3]);const u=o;let M;e[4]!==n||e[5]!==a||e[6]!==u?(M=a?.presentation==="image"?c.jsx("img",{alt:"","aria-hidden":"true",className:"feed-source-logo feed-source-logo-image",src:a.url}):c.jsx("span",{className:"feed-source-logo feed-source-logo-mask","data-fallback":a?void 0:"",style:u,"aria-hidden":"true",children:!a&&n.slice(0,1).toUpperCase()}),e[4]=n,e[5]=a,e[6]=u,e[7]=M):M=e[7];let d;e[8]!==n?(d=c.jsx("span",{children:n}),e[8]=n,e[9]=d):d=e[9];let r;return e[10]!==s||e[11]!==M||e[12]!==d?(r=c.jsxs("span",{className:"feed-source","data-feed-source":s,children:[M,d]}),e[10]=s,e[11]=M,e[12]=d,e[13]=r):r=e[13],r}function Te(t){const e=h.c(2),{item:i}=t,l=i.plan||i.question_prompt||i.tool_input||i.tool_result||i.text;if(!l)return null;let s;return e[0]!==l?(s=c.jsx("pre",{className:"feed-body",children:l}),e[0]=l,e[1]=s):s=e[1],s}function Se(t){const e=h.c(64),{item:i,copy:l,perform:s}=t;if(i.kind==="permissionRequest"){let n;e[0]!==i.allowed_permission_modes?(n=i.allowed_permission_modes??["deny"],e[0]=i.allowed_permission_modes,e[1]=n):n=e[1];let a;e[2]!==n?(a=new Set(n),e[2]=n,e[3]=a):a=e[3];const o=a;let u;e[4]!==l||e[5]!==i.id||e[6]!==o||e[7]!==s?(u=o.has("deny")&&c.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"deny"}),children:l.deny}),e[4]=l,e[5]=i.id,e[6]=o,e[7]=s,e[8]=u):u=e[8];let M;e[9]!==l||e[10]!==i.id||e[11]!==o||e[12]!==s?(M=o.has("once")&&c.jsx("button",{onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"once"}),children:l.allowOnce}),e[9]=l,e[10]=i.id,e[11]=o,e[12]=s,e[13]=M):M=e[13];let d;e[14]!==l||e[15]!==i.id||e[16]!==o||e[17]!==s?(d=o.has("always")&&c.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"always"}),children:l.allowAlways}),e[14]=l,e[15]=i.id,e[16]=o,e[17]=s,e[18]=d):d=e[18];let r;e[19]!==l||e[20]!==i.id||e[21]!==o||e[22]!==s?(r=o.has("all")&&c.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"all"}),children:l.allowAll}),e[19]=l,e[20]=i.id,e[21]=o,e[22]=s,e[23]=r):r=e[23];let j;e[24]!==l||e[25]!==i.id||e[26]!==o||e[27]!==s?(j=o.has("bypass")&&c.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"bypass"}),children:l.allowBypass}),e[24]=l,e[25]=i.id,e[26]=o,e[27]=s,e[28]=j):j=e[28];let y;return e[29]!==u||e[30]!==M||e[31]!==d||e[32]!==r||e[33]!==j?(y=c.jsxs("div",{className:"feed-actions",children:[u,M,d,r,j]}),e[29]=u,e[30]=M,e[31]=d,e[32]=r,e[33]=j,e[34]=y):y=e[34],y}if(i.kind==="exitPlan"){let n;e[35]!==i.id||e[36]!==s?(n=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"manual"}),e[35]=i.id,e[36]=s,e[37]=n):n=e[37];let a;e[38]!==l.planManual||e[39]!==n?(a=c.jsx("button",{onClick:n,children:l.planManual}),e[38]=l.planManual,e[39]=n,e[40]=a):a=e[40];let o;e[41]!==i.id||e[42]!==s?(o=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"autoAccept"}),e[41]=i.id,e[42]=s,e[43]=o):o=e[43];let u;e[44]!==l.planAuto||e[45]!==o?(u=c.jsx("button",{onClick:o,children:l.planAuto}),e[44]=l.planAuto,e[45]=o,e[46]=u):u=e[46];let M;e[47]!==i.id||e[48]!==s?(M=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"ultraplan"}),e[47]=i.id,e[48]=s,e[49]=M):M=e[49];let d;e[50]!==l.planUltraplan||e[51]!==M?(d=c.jsx("button",{className:"primary",onClick:M,children:l.planUltraplan}),e[50]=l.planUltraplan,e[51]=M,e[52]=d):d=e[52];let r;return e[53]!==a||e[54]!==u||e[55]!==d?(r=c.jsxs("div",{className:"feed-actions",children:[a,u,d]}),e[53]=a,e[54]=u,e[55]=d,e[56]=r):r=e[56],r}if(i.kind==="question"){let n;e[57]!==i.questions?(n=i.questions??[],e[57]=i.questions,e[58]=n):n=e[58];let a;return e[59]!==l||e[60]!==i||e[61]!==s||e[62]!==n?(a=c.jsx(pe,{item:i,questions:n,copy:l,perform:s}),e[59]=l,e[60]=i,e[61]=s,e[62]=n,e[63]=a):a=e[63],a}return null}function pe(t){const e=h.c(34),{item:i,questions:l,copy:s,perform:n}=t;let a;e[0]!==i.question_options||e[1]!==i.question_prompt||e[2]!==l?(a=l.length>0?l:[{id:"question",multi_select:!1,options:i.question_options??[],prompt:i.question_prompt??""}],e[0]=i.question_options,e[1]=i.question_prompt,e[2]=l,e[3]=a):a=e[3];const o=a;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[M,d]=O.useState(u);let r;e[5]===Symbol.for("react.memo_cache_sentinel")?(r={},e[5]=r):r=e[5];const[j,y]=O.useState(r);let N;e[6]===Symbol.for("react.memo_cache_sentinel")?(N=(T,D)=>{d(L=>{const p=L[T.id]??[],w=T.multi_select?p.includes(D)?p.filter(b=>b!==D):[...p,D]:[D];return{...L,[T.id]:w}})},e[6]=N):N=e[6];const x=N;let A;if(e[7]!==j||e[8]!==o||e[9]!==M){let T;e[11]!==j||e[12]!==M?(T=D=>{const L=j[D.id]?.trim();if(L)return[L];const p=M[D.id]??[],w=D.options.filter(b=>p.includes(b.id)).map(fe);return w.length>0?[w.join(", ")]:[]},e[11]=j,e[12]=M,e[13]=T):T=e[13],A=o.flatMap(T),e[7]=j,e[8]=o,e[9]=M,e[10]=A}else A=e[10];const I=A;let g;if(e[14]!==s.questionPlaceholder||e[15]!==j||e[16]!==o||e[17]!==M){let T;e[19]!==s.questionPlaceholder||e[20]!==j||e[21]!==M?(T=D=>c.jsxs("div",{className:"feed-question",children:[D.prompt&&c.jsx("div",{className:"feed-question-prompt",children:D.prompt}),c.jsx("div",{className:"feed-options",children:D.options.map(L=>c.jsxs("button",{"aria-pressed":(M[D.id]??[]).includes(L.id),onClick:()=>x(D,L.id),children:[c.jsx("strong",{children:L.label}),L.description&&c.jsx("span",{children:L.description})]},L.id))}),c.jsx("input",{"aria-label":s.questionPlaceholder,onChange:L=>y(p=>({...p,[D.id]:L.target.value})),placeholder:s.questionPlaceholder,value:j[D.id]??""})]},D.id),e[19]=s.questionPlaceholder,e[20]=j,e[21]=M,e[22]=T):T=e[22],g=o.map(T),e[14]=s.questionPlaceholder,e[15]=j,e[16]=o,e[17]=M,e[18]=g}else g=e[18];const z=I.length===0;let m;e[23]!==I||e[24]!==i.id||e[25]!==n?(m=()=>n("feed.question.reply",{itemId:i.id,selections:I}),e[23]=I,e[24]=i.id,e[25]=n,e[26]=m):m=e[26];let f;e[27]!==s.questionSubmit||e[28]!==z||e[29]!==m?(f=c.jsx("button",{className:"primary",disabled:z,onClick:m,children:s.questionSubmit}),e[27]=s.questionSubmit,e[28]=z,e[29]=m,e[30]=f):f=e[30];let E;return e[31]!==g||e[32]!==f?(E=c.jsxs("div",{className:"feed-question-actions",children:[g,f]}),e[31]=g,e[32]=f,e[33]=E):E=e[33],E}function fe(t){return t.label}function be(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ae(()=>c.jsx(ge,{}));oe.createRoot(t).render(c.jsx(ne,{router:e}))}export{be as mountFeedSurface}; diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index 65505ce432ce..ee3b7c0bdce9 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -141,7 +141,7 @@ export function FeedApp() { }, []); if (!snapshot) return
; - const sourceItems = snapshot.items.length > 0 ? snapshot.items : demoItems; + const sourceItems = demoItems.length > 0 ? [...demoItems, ...snapshot.items] : snapshot.items; const items = filter === "actionable" ? sourceItems.filter((item) => item.status === "pending") : sourceItems; @@ -205,7 +205,6 @@ export function FeedApp() {
{visibleItems.length === 0 ? ( { setDemoItems(createDemoFeedItems(snapshot.copy)); @@ -244,8 +243,7 @@ export function FeedApp() { ); } -function FeedEmptyState({ canLoadExamples, filter, onLoadExamples, snapshot }: { - canLoadExamples: boolean; +function FeedEmptyState({ filter, onLoadExamples, snapshot }: { filter: Filter; onLoadExamples: () => void; snapshot: NonNullable>; @@ -264,9 +262,7 @@ function FeedEmptyState({ canLoadExamples, filter, onLoadExamples, snapshot }: {

{title}

{description}

- {canLoadExamples && ( - - )} +

{snapshot.copy.integrationsTitle}

From 4b78a44a61d33ca610d43c16bf15aa92176db7c3 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:48:45 -0700 Subject: [PATCH 18/23] test: cover coalesced async publisher demand --- .../WorkspaceSidebarObservationTests.swift | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/cmuxTests/WorkspaceSidebarObservationTests.swift b/cmuxTests/WorkspaceSidebarObservationTests.swift index 49c96cecc666..6f1130d5bffa 100644 --- a/cmuxTests/WorkspaceSidebarObservationTests.swift +++ b/cmuxTests/WorkspaceSidebarObservationTests.swift @@ -196,6 +196,26 @@ struct WorkspaceSidebarObservationTests { #expect(received == [1, 2, 5, 6]) } + @Test func coalesceLatestRespectsAsyncPublisherDemand() async { + let subject = PassthroughSubject() + let publisher = subject + .coalesceLatest(for: .milliseconds(50), scheduler: RunLoop.main) + var iterator = publisher.values.makeAsyncIterator() + + let producer = Task { @MainActor in + await Task.yield() + subject.send(1) + subject.send(2) + } + + let first = await iterator.next() + let second = await iterator.next() + await producer.value + + #expect(first == 1) + #expect(second == 2) + } + @Test func coalesceLatestDropsStalePendingValueWhenLeadingSupersedesOverdueTrailing() { let scheduler = VirtualCoalesceScheduler() let subject = PassthroughSubject() From 1dc14373312ca5b1803f629693a33a52adc66784 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:53:06 -0700 Subject: [PATCH 19/23] fix: respect downstream demand in sidebar coalescing --- Sources/CoalesceLatestPublisher.swift | 50 ++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/Sources/CoalesceLatestPublisher.swift b/Sources/CoalesceLatestPublisher.swift index 5299ef4fb719..0d2ee99b5063 100644 --- a/Sources/CoalesceLatestPublisher.swift +++ b/Sources/CoalesceLatestPublisher.swift @@ -31,7 +31,8 @@ extension Publisher where Failure == Never { /// next window. /// /// Not thread-safe: intended for main-thread streams with `RunLoop.main`. - /// Downstream demand is ignored (sink-style subscribers only). + /// Downstream demand is honored, including one-at-a-time demand from + /// `AsyncPublisher` iterators. func coalesceLatest( for interval: Context.SchedulerTimeType.Stride, scheduler: Context @@ -71,6 +72,9 @@ private final class CoalesceLatestInner? + private var downstreamDemand: Subscribers.Demand = .none private var trailingScheduled = false private var isCancelled = false @@ -90,7 +94,7 @@ private final class CoalesceLatestInner .none else { return } + downstreamDemand += demand + guard let value = pendingDemandValue else { return } + pendingDemandValue = nil + forward(value) + + if pendingDemandValue == nil, let completion = pendingCompletion { + pendingCompletion = nil + isCancelled = true + downstream.receive(completion: completion) + } } func cancel() { isCancelled = true pendingValue = nil + pendingDemandValue = nil + pendingCompletion = nil upstreamSubscription?.cancel() upstreamSubscription = nil } + + private func forward(_ value: Input) { + guard downstreamDemand > .none else { + // Coalescing promises the latest value, so replacing an + // undeliverable value preserves the operator's contract while + // applying backpressure. + pendingDemandValue = value + return + } + if downstreamDemand != .unlimited { + downstreamDemand -= 1 + } + downstreamDemand += downstream.receive(value) + } } From cf919c4923008411e73aff530da40519f0c639bf Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:09:17 -0700 Subject: [PATCH 20/23] test: cover card action keyboard handoff --- webviews/test/feed.test.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index c07e25df4695..d56112303af5 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -122,6 +122,14 @@ test("Feed React surface invokes the typed permission primitive", async () => { keyboardRoot.focus(); keyboardRoot.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "j" })); expect(document.activeElement).toBe(cards[0]); + cards[0]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab" })); + expect(document.activeElement?.textContent).toBe("Deny"); + document.activeElement?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { + bubbles: true, + key: "Tab", + shiftKey: true, + })); + expect(document.activeElement).toBe(cards[0]); cards[0]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, ctrlKey: true, key: "n" })); expect(document.activeElement).toBe(cards[1]); cards[1]?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "ArrowUp" })); From 7a01a172e415780478a64b997e7e7a5425665f77 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:10:24 -0700 Subject: [PATCH 21/23] fix: move card focus directly to its actions --- .../webviews-app/chunks/feedSurface.mjs | 2 +- webviews/src/feed/App.tsx | 17 +++++++++++++++++ webviews/test/feed.test.tsx | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs index 25d40e75e320..b3af879a31c9 100644 --- a/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs +++ b/Resources/markdown-viewer/webviews-app/chunks/feedSurface.mjs @@ -1 +1 @@ -import{b as h,i as O,j as c,c as oe,a as ne}from"./vendor.mjs";import{c as ae}from"./router.mjs";let te=null;const ee=new Set;let V=null;function ie(t){te=t;for(const e of ee)e()}function de(t){t.type==="feed.snapshot"&&ie(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:de});async function se(t,e={}){const i=window.webkit?.messageHandlers?.cmuxFeed;if(!i?.postMessage)throw new Error("Native Feed bridge is unavailable.");const l=await i.postMessage({method:t,params:e});if(!l.ok)throw new Error(l.error?.userMessage||"Feed request failed.");return l.value}async function re(){return V||(V=se("feed.subscribe").then(ie).catch(t=>{throw V=null,t}),V)}const q={getSnapshot:()=>te,subscribe(t){return ee.add(t),re(),()=>ee.delete(t)}},_=t=>({presentation:"mask",url:`data:image/svg+xml;base64,${t}`}),$=(t,e)=>({presentation:"image",url:`data:${t};base64,${e}`}),je={cursor:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="),gemini:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="),copilot:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="),codebuddy:$("image/svg+xml","PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="),factory:$("image/x-icon","AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"),qoder:$("image/png","iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg==")},le=40;function ue(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function Ie(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const M=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(j=>j!==e&&j.tabIndex>=0);if(M.length===0)return;const d=M.indexOf(document.activeElement),r=d<0?t.shiftKey?M.length-1:0:(d+(t.shiftKey?-1:1)+M.length)%M.length;t.preventDefault(),M[r]?.focus();return}if(ue(t.target)||t.altKey||t.metaKey)return;const i=t.key.toLowerCase(),l=!t.ctrlKey&&(i==="j"||i==="arrowdown")?1:!t.ctrlKey&&(i==="k"||i==="arrowup")?-1:t.ctrlKey&&i==="n"?1:t.ctrlKey&&i==="p"?-1:0,s=!t.ctrlKey&&(i==="home"||i==="end");if(l===0&&!s)return;const n=[...e.querySelectorAll(".feed-card")];if(n.length===0)return;const a=document.activeElement?.closest(".feed-card"),o=a?n.indexOf(a):-1,u=i==="home"?0:i==="end"?n.length-1:o<0?l>0?0:n.length-1:Math.max(0,Math.min(n.length-1,o+l));t.preventDefault(),n[u]?.focus({preventScroll:!0}),n[u]?.scrollIntoView?.({block:"nearest"})}function Ne(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],i=e.indexOf(document.activeElement);if(i<0)return;const l=t.key,s=l==="Home"?0:l==="End"?e.length-1:l==="ArrowLeft"?(i-1+e.length)%e.length:l==="ArrowRight"?(i+1)%e.length:-1;s<0||(t.preventDefault(),t.stopPropagation(),e[s]?.focus(),e[s]?.click())}function Ae(t){const e=new Date().toISOString();return[{allowed_permission_modes:["deny","once","always"],created_at:e,id:"feed-demo-permission",kind:"permissionRequest",source:"claude",status:"pending",tool_input:t.demoPermissionBody,tool_name:t.demoPermissionTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-plan",kind:"exitPlan",plan:t.demoPlanBody,source:"codex",status:"pending",title:t.demoPlanTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-question",kind:"question",question_prompt:t.demoQuestionPrompt,questions:[{id:"verification",multi_select:!1,options:[{id:"focused",label:t.demoQuestionOptionFocused},{id:"full",label:t.demoQuestionOptionFull}],prompt:t.demoQuestionPrompt}],source:"gemini",status:"pending",title:t.demoQuestionTitle,workstream_id:"feed-demo"}]}function ge(){const t=h.c(62),e=O.useSyncExternalStore(q.subscribe,q.getSnapshot,q.getSnapshot),[i,l]=O.useState("actionable"),[s,n]=O.useState(le);let a;t[0]===Symbol.for("react.memo_cache_sentinel")?(a=[],t[0]=a):a=t[0];const[o,u]=O.useState(a),[M,d]=O.useState(null),r=O.useRef(Le);let j;t[1]===Symbol.for("react.memo_cache_sentinel")?(j=S=>{if(r.current(),r.current=ze,!S)return;const G=X=>Ie(X,S);S.addEventListener("keydown",G),r.current=()=>S.removeEventListener("keydown",G),(!document.activeElement||document.activeElement===document.body)&&S.focus()},t[1]=j):j=t[1];const y=j;if(!e){let S;return t[2]===Symbol.for("react.memo_cache_sentinel")?(S=c.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[2]=S):S=t[2],S}let N;t[3]!==o||t[4]!==e.items?(N=o.length>0?[...o,...e.items]:e.items,t[3]=o,t[4]=e.items,t[5]=N):N=t[5];const x=N;let A;t[6]!==i||t[7]!==x?(A=i==="actionable"?x.filter(De):x,t[6]=i,t[7]=x,t[8]=A):A=t[8];const I=A;let g;t[9]!==s||t[10]!==i||t[11]!==I?(g=i==="activity"?I.slice(0,s):I,t[9]=s,t[10]=i,t[11]=I,t[12]=g):g=t[12];const z=g,m=i==="activity"&&z.length{d(null);const X=typeof G.itemId=="string"?G.itemId:"";if(X.startsWith("feed-demo-")){u(Me=>Me.map(K=>K.id===X?{...K,status:"resolved"}:K));return}try{await se(S,G)}catch{d(e.copy.requestFailed)}},t[17]=e.copy.requestFailed,t[18]=D):D=t[18];const L=D;let p;t[19]!==e.copy.feed?(p=c.jsx("h1",{children:e.copy.feed}),t[19]=e.copy.feed,t[20]=p):p=t[20];const w=i==="actionable";let b;t[21]===Symbol.for("react.memo_cache_sentinel")?(b=()=>l("actionable"),t[21]=b):b=t[21];const J=i==="actionable"?0:-1;let Q;t[22]!==e.copy.actionable||t[23]!==J||t[24]!==w?(Q=c.jsx("button",{"aria-selected":w,onClick:b,role:"tab",tabIndex:J,children:e.copy.actionable}),t[22]=e.copy.actionable,t[23]=J,t[24]=w,t[25]=Q):Q=t[25];const F=i==="activity";let W;t[26]===Symbol.for("react.memo_cache_sentinel")?(W=()=>l("activity"),t[26]=W):W=t[26];const H=i==="activity"?0:-1;let C;t[27]!==e.copy.activity||t[28]!==F||t[29]!==H?(C=c.jsx("button",{"aria-selected":F,onClick:W,role:"tab",tabIndex:H,children:e.copy.activity}),t[27]=e.copy.activity,t[28]=F,t[29]=H,t[30]=C):C=t[30];let k;t[31]!==Q||t[32]!==C?(k=c.jsxs("div",{className:"feed-filter",onKeyDown:Ne,role:"tablist",tabIndex:-1,children:[Q,C]}),t[31]=Q,t[32]=C,t[33]=k):k=t[33];let U;t[34]!==k||t[35]!==p?(U=c.jsxs("header",{className:"feed-header",children:[p,k]}),t[34]=k,t[35]=p,t[36]=U):U=t[36];let Y;t[37]!==M?(Y=M&&c.jsx("div",{className:"feed-error",role:"alert",children:M}),t[37]=M,t[38]=Y):Y=t[38];let P;t[39]!==i||t[40]!==L||t[41]!==e||t[42]!==z?(P=z.length===0?c.jsx(xe,{filter:i,onLoadExamples:()=>{u(Ae(e.copy)),l("actionable")},snapshot:e}):z.map(S=>c.jsx(me,{item:S,copy:e.copy,perform:L,sourceIcon:e.sourceIcons[S.source],sourceLabel:e.sourceLabels[S.source]},S.id)),t[39]=i,t[40]=L,t[41]=e,t[42]=z,t[43]=P):P=t[43];let R;t[44]!==m||t[45]!==L||t[46]!==e.copy.loadOlder||t[47]!==e.copy.loadingOlder||t[48]!==e.hasMore||t[49]!==e.isLoadingOlder?(R=(m||e.hasMore)&&c.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?n(ye):L("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[44]=m,t[45]=L,t[46]=e.copy.loadOlder,t[47]=e.copy.loadingOlder,t[48]=e.hasMore,t[49]=e.isLoadingOlder,t[50]=R):R=t[50];let v;t[51]!==P||t[52]!==R?(v=c.jsxs("section",{className:"feed-list",children:[P,R]}),t[51]=P,t[52]=R,t[53]=v):v=t[53];let Z;t[54]!==e.copy.feed||t[55]!==U||t[56]!==Y||t[57]!==v?(Z=c.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:y,tabIndex:-1,children:[U,Y,v]}),t[54]=e.copy.feed,t[55]=U,t[56]=Y,t[57]=v,t[58]=Z):Z=t[58];let B;return t[59]!==Z||t[60]!==T?(B=c.jsx("main",{className:"feed-shell",style:T,children:Z}),t[59]=Z,t[60]=T,t[61]=B):B=t[61],B}function ye(t){return t+le}function De(t){return t.status==="pending"}function ze(){}function Le(){}function xe(t){const e=h.c(39),{filter:i,onLoadExamples:l,snapshot:s}=t,n=i==="actionable"?s.copy.emptyActionable:s.copy.emptyActivity,a=i==="actionable"?s.copy.emptyActionableDescription:s.copy.emptyActivityDescription;let o;e[0]!==s.copy.integrationChecking||e[1]!==s.copy.integrationDisabled||e[2]!==s.copy.integrationNeedsSetup||e[3]!==s.copy.integrationReady?(o=z=>({checking:s.copy.integrationChecking,disabled:s.copy.integrationDisabled,needsSetup:s.copy.integrationNeedsSetup,ready:s.copy.integrationReady})[z.status],e[0]=s.copy.integrationChecking,e[1]=s.copy.integrationDisabled,e[2]=s.copy.integrationNeedsSetup,e[3]=s.copy.integrationReady,e[4]=o):o=e[4];const u=o;let M;e[5]!==n?(M=c.jsx("h2",{children:n}),e[5]=n,e[6]=M):M=e[6];let d;e[7]!==a?(d=c.jsx("p",{children:a}),e[7]=a,e[8]=d):d=e[8];let r;e[9]!==l||e[10]!==s.copy.loadExamples?(r=c.jsx("button",{className:"feed-load-examples",onClick:l,children:s.copy.loadExamples}),e[9]=l,e[10]=s.copy.loadExamples,e[11]=r):r=e[11];let j;e[12]!==s.copy.integrationsTitle?(j=c.jsx("h3",{id:"feed-integrations-title",children:s.copy.integrationsTitle}),e[12]=s.copy.integrationsTitle,e[13]=j):j=e[13];let y;if(e[14]!==s.integrations||e[15]!==s.sourceIcons||e[16]!==s.sourceLabels||e[17]!==u){let z;e[19]!==s.sourceIcons||e[20]!==s.sourceLabels||e[21]!==u?(z=m=>c.jsxs("div",{className:"feed-integration","data-status":m.status,children:[c.jsx(ce,{icon:s.sourceIcons[m.source],label:s.sourceLabels[m.source],source:m.source}),c.jsx("span",{className:"feed-integration-status",children:u(m)})]},m.source),e[19]=s.sourceIcons,e[20]=s.sourceLabels,e[21]=u,e[22]=z):z=e[22],y=s.integrations.map(z),e[14]=s.integrations,e[15]=s.sourceIcons,e[16]=s.sourceLabels,e[17]=u,e[18]=y}else y=e[18];let N;e[23]!==y?(N=c.jsx("div",{className:"feed-integration-grid",children:y}),e[23]=y,e[24]=N):N=e[24];let x;e[25]!==s.copy.integrationHint?(x=c.jsx("p",{className:"feed-integration-hint",children:s.copy.integrationHint}),e[25]=s.copy.integrationHint,e[26]=x):x=e[26];let A;e[27]!==j||e[28]!==N||e[29]!==x?(A=c.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[j,N,x]}),e[27]=j,e[28]=N,e[29]=x,e[30]=A):A=e[30];let I;e[31]!==s.copy.keyboardHelp?(I=c.jsx("p",{className:"feed-keyboard-help",children:s.copy.keyboardHelp}),e[31]=s.copy.keyboardHelp,e[32]=I):I=e[32];let g;return e[33]!==I||e[34]!==M||e[35]!==d||e[36]!==r||e[37]!==A?(g=c.jsxs("div",{className:"feed-empty",children:[M,d,r,A,I]}),e[33]=I,e[34]=M,e[35]=d,e[36]=r,e[37]=A,e[38]=g):g=e[38],g}function me(t){const e=h.c(34),{item:i,copy:l,perform:s,sourceIcon:n,sourceLabel:a}=t;let o;e[0]!==i.kind||e[1]!==i.title||e[2]!==i.tool_name?(o=i.title||i.tool_name||i.kind.replaceAll("_"," "),e[0]=i.kind,e[1]=i.title,e[2]=i.tool_name,e[3]=o):o=e[3];const u=o,M=`feed-card feed-card-${i.status}`;let d;e[4]!==i.source||e[5]!==n||e[6]!==a?(d=c.jsx(ce,{icon:n,label:a,source:i.source}),e[4]=i.source,e[5]=n,e[6]=a,e[7]=d):d=e[7];let r;e[8]!==u?(r=c.jsx("h2",{children:u}),e[8]=u,e[9]=r):r=e[9];let j;e[10]!==d||e[11]!==r?(j=c.jsxs("div",{className:"feed-card-title",children:[d,r]}),e[10]=d,e[11]=r,e[12]=j):j=e[12];let y;e[13]!==i.created_at?(y=new Date(i.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=i.created_at,e[14]=y):y=e[14];let N;e[15]!==y?(N=c.jsx("time",{children:y}),e[15]=y,e[16]=N):N=e[16];let x;e[17]!==j||e[18]!==N?(x=c.jsxs("div",{className:"feed-card-heading",children:[j,N]}),e[17]=j,e[18]=N,e[19]=x):x=e[19];let A;e[20]!==i.cwd?(A=i.cwd&&c.jsx("div",{className:"feed-cwd",children:i.cwd}),e[20]=i.cwd,e[21]=A):A=e[21];let I;e[22]!==i?(I=c.jsx(Te,{item:i}),e[22]=i,e[23]=I):I=e[23];let g;e[24]!==l||e[25]!==i||e[26]!==s?(g=i.status==="pending"&&c.jsx(Se,{item:i,copy:l,perform:s}),e[24]=l,e[25]=i,e[26]=s,e[27]=g):g=e[27];let z;return e[28]!==I||e[29]!==g||e[30]!==M||e[31]!==x||e[32]!==A?(z=c.jsxs("article",{className:M,tabIndex:-1,children:[x,A,I,g]}),e[28]=I,e[29]=g,e[30]=M,e[31]=x,e[32]=A,e[33]=z):z=e[33],z}function ce(t){const e=h.c(14),{icon:i,label:l,source:s}=t,n=l??s;let a,o;e[0]!==i||e[1]!==s?(a=i?{presentation:"image",url:i}:je[s],o=a?.presentation==="mask"?{"--feed-source-icon":`url(${JSON.stringify(a.url)})`}:void 0,e[0]=i,e[1]=s,e[2]=a,e[3]=o):(a=e[2],o=e[3]);const u=o;let M;e[4]!==n||e[5]!==a||e[6]!==u?(M=a?.presentation==="image"?c.jsx("img",{alt:"","aria-hidden":"true",className:"feed-source-logo feed-source-logo-image",src:a.url}):c.jsx("span",{className:"feed-source-logo feed-source-logo-mask","data-fallback":a?void 0:"",style:u,"aria-hidden":"true",children:!a&&n.slice(0,1).toUpperCase()}),e[4]=n,e[5]=a,e[6]=u,e[7]=M):M=e[7];let d;e[8]!==n?(d=c.jsx("span",{children:n}),e[8]=n,e[9]=d):d=e[9];let r;return e[10]!==s||e[11]!==M||e[12]!==d?(r=c.jsxs("span",{className:"feed-source","data-feed-source":s,children:[M,d]}),e[10]=s,e[11]=M,e[12]=d,e[13]=r):r=e[13],r}function Te(t){const e=h.c(2),{item:i}=t,l=i.plan||i.question_prompt||i.tool_input||i.tool_result||i.text;if(!l)return null;let s;return e[0]!==l?(s=c.jsx("pre",{className:"feed-body",children:l}),e[0]=l,e[1]=s):s=e[1],s}function Se(t){const e=h.c(64),{item:i,copy:l,perform:s}=t;if(i.kind==="permissionRequest"){let n;e[0]!==i.allowed_permission_modes?(n=i.allowed_permission_modes??["deny"],e[0]=i.allowed_permission_modes,e[1]=n):n=e[1];let a;e[2]!==n?(a=new Set(n),e[2]=n,e[3]=a):a=e[3];const o=a;let u;e[4]!==l||e[5]!==i.id||e[6]!==o||e[7]!==s?(u=o.has("deny")&&c.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"deny"}),children:l.deny}),e[4]=l,e[5]=i.id,e[6]=o,e[7]=s,e[8]=u):u=e[8];let M;e[9]!==l||e[10]!==i.id||e[11]!==o||e[12]!==s?(M=o.has("once")&&c.jsx("button",{onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"once"}),children:l.allowOnce}),e[9]=l,e[10]=i.id,e[11]=o,e[12]=s,e[13]=M):M=e[13];let d;e[14]!==l||e[15]!==i.id||e[16]!==o||e[17]!==s?(d=o.has("always")&&c.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"always"}),children:l.allowAlways}),e[14]=l,e[15]=i.id,e[16]=o,e[17]=s,e[18]=d):d=e[18];let r;e[19]!==l||e[20]!==i.id||e[21]!==o||e[22]!==s?(r=o.has("all")&&c.jsx("button",{className:"primary",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"all"}),children:l.allowAll}),e[19]=l,e[20]=i.id,e[21]=o,e[22]=s,e[23]=r):r=e[23];let j;e[24]!==l||e[25]!==i.id||e[26]!==o||e[27]!==s?(j=o.has("bypass")&&c.jsx("button",{className:"danger",onClick:()=>s("feed.permission.reply",{itemId:i.id,mode:"bypass"}),children:l.allowBypass}),e[24]=l,e[25]=i.id,e[26]=o,e[27]=s,e[28]=j):j=e[28];let y;return e[29]!==u||e[30]!==M||e[31]!==d||e[32]!==r||e[33]!==j?(y=c.jsxs("div",{className:"feed-actions",children:[u,M,d,r,j]}),e[29]=u,e[30]=M,e[31]=d,e[32]=r,e[33]=j,e[34]=y):y=e[34],y}if(i.kind==="exitPlan"){let n;e[35]!==i.id||e[36]!==s?(n=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"manual"}),e[35]=i.id,e[36]=s,e[37]=n):n=e[37];let a;e[38]!==l.planManual||e[39]!==n?(a=c.jsx("button",{onClick:n,children:l.planManual}),e[38]=l.planManual,e[39]=n,e[40]=a):a=e[40];let o;e[41]!==i.id||e[42]!==s?(o=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"autoAccept"}),e[41]=i.id,e[42]=s,e[43]=o):o=e[43];let u;e[44]!==l.planAuto||e[45]!==o?(u=c.jsx("button",{onClick:o,children:l.planAuto}),e[44]=l.planAuto,e[45]=o,e[46]=u):u=e[46];let M;e[47]!==i.id||e[48]!==s?(M=()=>s("feed.exitPlan.reply",{itemId:i.id,mode:"ultraplan"}),e[47]=i.id,e[48]=s,e[49]=M):M=e[49];let d;e[50]!==l.planUltraplan||e[51]!==M?(d=c.jsx("button",{className:"primary",onClick:M,children:l.planUltraplan}),e[50]=l.planUltraplan,e[51]=M,e[52]=d):d=e[52];let r;return e[53]!==a||e[54]!==u||e[55]!==d?(r=c.jsxs("div",{className:"feed-actions",children:[a,u,d]}),e[53]=a,e[54]=u,e[55]=d,e[56]=r):r=e[56],r}if(i.kind==="question"){let n;e[57]!==i.questions?(n=i.questions??[],e[57]=i.questions,e[58]=n):n=e[58];let a;return e[59]!==l||e[60]!==i||e[61]!==s||e[62]!==n?(a=c.jsx(pe,{item:i,questions:n,copy:l,perform:s}),e[59]=l,e[60]=i,e[61]=s,e[62]=n,e[63]=a):a=e[63],a}return null}function pe(t){const e=h.c(34),{item:i,questions:l,copy:s,perform:n}=t;let a;e[0]!==i.question_options||e[1]!==i.question_prompt||e[2]!==l?(a=l.length>0?l:[{id:"question",multi_select:!1,options:i.question_options??[],prompt:i.question_prompt??""}],e[0]=i.question_options,e[1]=i.question_prompt,e[2]=l,e[3]=a):a=e[3];const o=a;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[M,d]=O.useState(u);let r;e[5]===Symbol.for("react.memo_cache_sentinel")?(r={},e[5]=r):r=e[5];const[j,y]=O.useState(r);let N;e[6]===Symbol.for("react.memo_cache_sentinel")?(N=(T,D)=>{d(L=>{const p=L[T.id]??[],w=T.multi_select?p.includes(D)?p.filter(b=>b!==D):[...p,D]:[D];return{...L,[T.id]:w}})},e[6]=N):N=e[6];const x=N;let A;if(e[7]!==j||e[8]!==o||e[9]!==M){let T;e[11]!==j||e[12]!==M?(T=D=>{const L=j[D.id]?.trim();if(L)return[L];const p=M[D.id]??[],w=D.options.filter(b=>p.includes(b.id)).map(fe);return w.length>0?[w.join(", ")]:[]},e[11]=j,e[12]=M,e[13]=T):T=e[13],A=o.flatMap(T),e[7]=j,e[8]=o,e[9]=M,e[10]=A}else A=e[10];const I=A;let g;if(e[14]!==s.questionPlaceholder||e[15]!==j||e[16]!==o||e[17]!==M){let T;e[19]!==s.questionPlaceholder||e[20]!==j||e[21]!==M?(T=D=>c.jsxs("div",{className:"feed-question",children:[D.prompt&&c.jsx("div",{className:"feed-question-prompt",children:D.prompt}),c.jsx("div",{className:"feed-options",children:D.options.map(L=>c.jsxs("button",{"aria-pressed":(M[D.id]??[]).includes(L.id),onClick:()=>x(D,L.id),children:[c.jsx("strong",{children:L.label}),L.description&&c.jsx("span",{children:L.description})]},L.id))}),c.jsx("input",{"aria-label":s.questionPlaceholder,onChange:L=>y(p=>({...p,[D.id]:L.target.value})),placeholder:s.questionPlaceholder,value:j[D.id]??""})]},D.id),e[19]=s.questionPlaceholder,e[20]=j,e[21]=M,e[22]=T):T=e[22],g=o.map(T),e[14]=s.questionPlaceholder,e[15]=j,e[16]=o,e[17]=M,e[18]=g}else g=e[18];const z=I.length===0;let m;e[23]!==I||e[24]!==i.id||e[25]!==n?(m=()=>n("feed.question.reply",{itemId:i.id,selections:I}),e[23]=I,e[24]=i.id,e[25]=n,e[26]=m):m=e[26];let f;e[27]!==s.questionSubmit||e[28]!==z||e[29]!==m?(f=c.jsx("button",{className:"primary",disabled:z,onClick:m,children:s.questionSubmit}),e[27]=s.questionSubmit,e[28]=z,e[29]=m,e[30]=f):f=e[30];let E;return e[31]!==g||e[32]!==f?(E=c.jsxs("div",{className:"feed-question-actions",children:[g,f]}),e[31]=g,e[32]=f,e[33]=E):E=e[33],E}function fe(t){return t.label}function be(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ae(()=>c.jsx(ge,{}));oe.createRoot(t).render(c.jsx(ne,{router:e}))}export{be as mountFeedSurface}; +import{b as O,i as h,j as c,c as Me,a as ne}from"./vendor.mjs";import{c as ae}from"./router.mjs";let te=null;const ee=new Set;let V=null;function ie(t){te=t;for(const e of ee)e()}function de(t){t.type==="feed.snapshot"&&ie(t.snapshot)}typeof window<"u"&&(window.cmuxFeedBridge={receive:de});async function le(t,e={}){const i=window.webkit?.messageHandlers?.cmuxFeed;if(!i?.postMessage)throw new Error("Native Feed bridge is unavailable.");const s=await i.postMessage({method:t,params:e});if(!s.ok)throw new Error(s.error?.userMessage||"Feed request failed.");return s.value}async function re(){return V||(V=le("feed.subscribe").then(ie).catch(t=>{throw V=null,t}),V)}const q={getSnapshot:()=>te,subscribe(t){return ee.add(t),re(),()=>ee.delete(t)}},_=t=>({presentation:"mask",url:`data:image/svg+xml;base64,${t}`}),$=(t,e)=>({presentation:"image",url:`data:${t};base64,${e}`}),je={cursor:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjUwMy4xMzFMMS44OTEgNS42NzhhLjg0Ljg0IDAgMCAwLS40Mi43MjZ2MTEuMTg4YzAgLjMuMTYyLjU3NS40Mi43MjRsOS42MDkgNS41NWExIDEgMCAwIDAgLjk5OCAwbDkuNjEtNS41NWEuODQuODQgMCAwIDAgLjQyLS43MjRWNi40MDRhLjg0Ljg0IDAgMCAwLS40Mi0uNzI2TDEyLjQ5Ny4xMzFhMS4wMSAxLjAxIDAgMCAwLS45OTYgME0yLjY1NyA2LjMzOGgxOC41NWMuMjYzIDAgLjQzLjI4Ny4yOTcuNTE1TDEyLjIzIDIyLjkxOGMtLjA2Mi4xMDctLjIyOS4wNjQtLjIyOS0uMDZWMTIuMzM1YS41OS41OSAwIDAgMC0uMjk1LS41MWwtOS4xMS01LjI1N2MtLjEwOS0uMDYzLS4wNjQtLjIzLjA2MS0uMjMiLz48L3N2Zz4="),gemini:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTExLjA0IDE5LjMyUTEyIDIxLjUxIDEyIDI0cTAtMi40OS45My00LjY4cS45Ni0yLjE5IDIuNTgtMy44MXQzLjgxLTIuNTVRMjEuNTEgMTIgMjQgMTJxLTIuNDkgMC00LjY4LS45M2ExMi4zIDEyLjMgMCAwIDEtMy44MS0yLjU4YTEyLjMgMTIuMyAwIDAgMS0yLjU4LTMuODFRMTIgMi40OSAxMiAwcTAgMi40OS0uOTYgNC42OHEtLjkzIDIuMTktMi41NSAzLjgxYTEyLjMgMTIuMyAwIDAgMS0zLjgxIDIuNThRMi40OSAxMiAwIDEycTIuNDkgMCA0LjY4Ljk2cTIuMTkuOTMgMy44MSAyLjU1dDIuNTUgMy44MSIvPjwvc3ZnPg=="),copilot:_("PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTIzLjkyMiAxNi45OTdDMjMuMDYxIDE4LjQ5MiAxOC4wNjMgMjIuMDIgMTIgMjIuMDJTLjkzOSAxOC40OTIuMDc4IDE2Ljk5N0EuNi42IDAgMCAxIDAgMTYuNzQxdi0yLjg2OWExIDEgMCAwIDEgLjA1My0uMjJjLjM3Mi0uOTM1IDEuMzQ3LTIuMjkyIDIuNjA1LTIuNjU2Yy4xNjctLjQyOS40MTQtMS4wNTUuNjQ0LTEuNTE3YTEwIDEwIDAgMCAxLS4wNTItMS4wODZjMC0xLjMzMS4yODItMi40OTkgMS4xMzItMy4zNjhjLjM5Ny0uNDA2Ljg5LS43MTcgMS40NzQtLjk1MkM3LjI1NSAyLjkzNyA5LjI0OCAxLjk4IDExLjk3OCAxLjk4czQuNzY3Ljk1NyA2LjE2NiAyLjA5M2MuNTg0LjIzNSAxLjA3Ny41NDYgMS40NzQuOTUyYy44NS44NjkgMS4xMzIgMi4wMzcgMS4xMzIgMy4zNjhjMCAuMzY4LS4wMTQuNzMzLS4wNTIgMS4wODZjLjIzLjQ2Mi40NzcgMS4wODguNjQ0IDEuNTE3YzEuMjU4LjM2NCAyLjIzMyAxLjcyMSAyLjYwNSAyLjY1NmEuOC44IDAgMCAxIC4wNTMuMjJ2Mi44NjlhLjYuNiAwIDAgMS0uMDc4LjI1Nm0tMTEuNzUtNS45OTJoLS4zNDRhNCA0IDAgMCAxLS4zNTUuNTA4Yy0uNzcuOTQ3LTEuOTE4IDEuNDkyLTMuNTA4IDEuNDkyYy0xLjcyNSAwLTIuOTg5LS4zNTktMy43ODItMS4yNTlhMiAyIDAgMCAxLS4wODUtLjEwNEw0IDExLjc0NnY2LjU4NWMxLjQzNS43NzkgNC41MTQgMi4xNzkgOCAyLjE3OXM2LjU2NS0xLjQgOC0yLjE3OXYtNi41ODVsLS4wOTgtLjEwNHMtLjAzMy4wNDUtLjA4NS4xMDRjLS43OTMuOS0yLjA1NyAxLjI1OS0zLjc4MiAxLjI1OWMtMS41OSAwLTIuNzM4LS41NDUtMy41MDgtMS40OTJhNCA0IDAgMCAxLS4zNTUtLjUwOG0yLjMyOCAzLjI1Yy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0tNSAwYy41NDkgMCAxIC40NTEgMSAxdjJjMCAuNTQ5LS40NTEgMS0xIDFzLTEtLjQ1MS0xLTF2LTJjMC0uNTQ5LjQ1MS0xIDEtMW0zLjMxMy02LjE4NWMuMTM2IDEuMDU3LjQwMyAxLjkxMy44NzggMi40OTdjLjQ0Mi41NDQgMS4xMzQuOTM4IDIuMzQ0LjkzOGMxLjU3MyAwIDIuMjkyLS4zMzcgMi42NTctLjc1MWMuMzg0LS40MzUuNTU4LTEuMTUuNTU4LTIuMzYxYzAtMS4xNC0uMjQzLTEuODQ3LS43MDUtMi4zMTljLS40NzctLjQ4OC0xLjMxOS0uODYyLTIuODI0LTEuMDI1Yy0xLjQ4Ny0uMTYxLTIuMTkyLjEzOC0yLjUzMy41MjljLS4yNjkuMzA3LS40MzcuODA4LS40MzggMS41Nzh2LjAyMXEwIC4zOTcuMDYzLjg5M20tMS42MjYgMHEuMDYzLS40OTYuMDYzLS44OTR2LS4wMmMtLjAwMS0uNzctLjE2OS0xLjI3MS0uNDM4LTEuNTc4Yy0uMzQxLS4zOTEtMS4wNDYtLjY5LTIuNTMzLS41MjljLTEuNTA1LjE2My0yLjM0Ny41MzctMi44MjQgMS4wMjVjLS40NjIuNDcyLS43MDUgMS4xNzktLjcwNSAyLjMxOWMwIDEuMjExLjE3NSAxLjkyNi41NTggMi4zNjFjLjM2NS40MTQgMS4wODQuNzUxIDIuNjU3Ljc1MWMxLjIxIDAgMS45MDItLjM5NCAyLjM0NC0uOTM4Yy40NzUtLjU4NC43NDItMS40NC44NzgtMi40OTciLz48L3N2Zz4="),codebuddy:$("image/svg+xml","PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzUxMTBfMTQ3NzEpIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMTIuNjA3MSIgY3k9IjM0Ljk3OTQiIHI9IjE0LjA4MSIgZmlsbD0iIzMyRTZCOSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPC9nPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzUxMTBfMTQ3NzEpIj4KPGNpcmNsZSBjeD0iMzMuMzQwNCIgY3k9IjQzLjYxODUiIHI9IjEyLjg3MDQiIGZpbGw9IiMzMkU2QjkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuNjg5NyAzLjM0MjZDMjguMDU3IDMuMDEzMjIgMjguMDc5NSAyLjk5OTgzIDI4LjM0ODUgMi45ODM2NkMyOC43ODUxIDIuOTUxNzcgMjkuMTg1OCAzLjE2MTA3IDI5Ljg2NjQgMy43ODA3MkMzMS40NTY2IDUuMjI1NzQgMzMuNjcwMyA4LjE5NzI0IDM1LjA0NyAxMC43MzQzTDM1LjU3OTYgMTEuNzE5MUwzNi4zMzA5IDEyLjA5MjdDMzcuMDU2MiAxMi40NTkzIDM4LjI0NTkgMTMuMjExMSAzOC43NDI4IDEzLjYxNEMzOC45NjczIDEzLjc5OTcgMzguOTk5MiAxMy44MDMyIDM5LjIzMjYgMTMuNzEyNEM0MC4yODcyIDEzLjMwMTcgNDEuNzk4MiAxMy44NDYgNDMuMTMwNyAxNS4xMjQ0QzQ0LjMzMDIgMTYuMjc0IDQ1LjQ3OSAxOC4yMzg0IDQ1LjkxOTEgMTkuODc3OEM0NS45ODMzIDIwLjE0MTcgNDYuMDY4MyAyMC43MDkgNDYuMDk5NCAyMS4xMzE0QzQ2LjE5OTcgMjIuNjE0NCA0NS43MjQzIDIzLjc5ODYgNDQuODA4NSAyNC4zMzQ5QzQ0LjYyMTMgMjQuNDQzIDQ0LjYwODUgMjQuNDcyNSA0NC42MTM3IDI0LjkzOUM0NC42NTU5IDI3LjE2MDQgNDQuMDU3MSAyOS4zNzc3IDQyLjg1NDMgMzEuNTRDNDEuNDk2NSAzMy45Njc4IDM5LjA3OTQgMzYuNDc5OCAzNS44MDczIDM4Ljg0NkMzNC4wNTAyIDQwLjEyNDcgMjkuODkxOCA0Mi41NDY5IDI4LjAxMjIgNDMuMzk3M0MyMy41MDk2IDQ1LjQyNDQgMTkuODk5OSA0Ni4yMDIyIDE2Ljc2NDUgNDUuODE4MUMxNC44OTQzIDQ1LjU5MTUgMTIuNzc3MSA0NC44NjExIDExLjUyNDYgNDQuMDEzN0MxMS4xOTUxIDQzLjc4NiAxMS4xNDI4IDQzLjc3MTkgMTAuODkwOSA0My44NDM5QzkuNTUwMTcgNDQuMjI4OSA3Ljc5NDQyIDQzLjQzNzQgNi4zMDI3MiA0MS43ODE3QzUuNzA3NzEgNDEuMTE5NyA0Ljc0NzA5IDM5LjQ5MzkgNC40MzU3NSAzOC42MjQxQzMuNzE1NjkgMzYuNTg4NyAzLjg1ODU5IDM0Ljc1MiA0LjgxNzgzIDMzLjY1NTFDNS4wNjU3IDMzLjM3MjUgNS4wNzM4NyAzMy4zNjA3IDUuMDE5NzIgMzIuODg1NkM0LjkzMDMzIDMyLjEwNzkgNC44ODk4MiAzMC45NTY2IDQuOTMwNjYgMzAuMjEzOEw0Ljk2MzQzIDI5LjUyMDVMMy45MjA5MSAyNy42Nzc3QzIuMzA3OCAyNC44MDc0IDEuMjgzMjYgMjIuMzk2OCAwLjg4Nzk4MiAyMC41NTU0QzAuNjc5NDAyIDE5LjU0NiAwLjY5Mjc4MSAxOS4wOTgxIDAuOTQ5MDYxIDE4Ljc2NjdDMS4xMDUyOSAxOC41NjY2IDEuNjE2MjIgMTguMzU5NCAyLjIzMjUyIDE4LjI0NTVDMy43ODUxOCAxNy45NzI5IDcuMTcyMDMgMTguMjE5OCAxMC45Mzk0IDE4Ljg4NUwxMS4zMzAzIDE4Ljk1MjVMMTIuMTkwMyAxOC4xOTIxQzEzLjYxNzkgMTYuOTI3NSAxNC41NjY1IDE2LjIxNzYgMTYuMzE1IDE1LjEyNzRDMTguMTM3MyAxMy45ODcyIDIwLjE5NDMgMTMuMDQ5OCAyMi41MTAzIDEyLjMwNzFMMjMuMjUzMyAxMi4wNjg3TDIzLjY2MTUgMTAuOTk2NEMyNS4xMjM5IDcuMTM1ODcgMjYuNjIxOCA0LjI4OTY5IDI3LjY4OTcgMy4zNDI2Wk0xNS40MzkzIDIzLjEyNjFDMTMuNzg2NCAyNC4wODA0IDEyLjk2MDIgMjQuNTU4MiAxMi4zNTI5IDI1LjA5M0M5Ljg5MzY0IDI3LjI1ODUgOC45NzM4IDMwLjY4ODggMTAuMDIwOCAzMy43OTM4QzEwLjI3OTQgMzQuNTYwNiAxMC43NTY4IDM1LjM4NyAxMS43MTExIDM3LjAzOThDMTIuNjY1MyAzOC42OTI2IDEzLjE0MjQgMzkuNTE5NCAxMy42NzcxIDQwLjEyNjdDMTUuODQyNiA0Mi41ODU5IDE5LjI3MzIgNDMuNTA0NSAyMi4zNzgzIDQyLjQ1NzRDMjMuMTQ1IDQyLjE5ODkgMjMuOTcyIDQxLjcyMjMgMjUuNjI0OCA0MC43NjhMMzUuMTMzMyAzNS4yNzgzQzM2Ljc4NjIgMzQuMzI0IDM3LjYxMjQgMzMuODQ2MiAzOC4yMTk2IDMzLjMxMTRDNDAuNjc4OSAzMS4xNDU5IDQxLjU5ODggMjcuNzE1NiA0MC41NTE4IDI0LjYxMDVDNDAuMjkzMiAyMy44NDM4IDM5LjgxNTcgMjMuMDE3NCAzOC44NjE1IDIxLjM2NDZDMzcuOTA3MiAxOS43MTE3IDM3LjQzMDIgMTguODg1IDM2Ljg5NTUgMTguMjc3N0MzNC43Mjk5IDE1LjgxODUgMzEuMjk5MyAxNC44OTk5IDI4LjE5NDMgMTUuOTQ3QzI3LjQyNzUgMTYuMjA1NSAyNi42MDA2IDE2LjY4MjEgMjQuOTQ3OCAxNy42MzY0TDE1LjQzOTMgMjMuMTI2MVoiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl81MTEwXzE0NzcxKSIvPgo8cmVjdCB4PSIxNS44ODE2IiB5PSIzMC4wMjczIiB3aWR0aD0iNC4wMDkwNCIgaGVpZ2h0PSI4LjMyNjQ2IiByeD0iMi4wMDQ1MiIgdHJhbnNmb3JtPSJyb3RhdGUoLTMwIDE1Ljg4MTYgMzAuMDI3MykiIGZpbGw9IndoaXRlIi8+CjxyZWN0IHg9IjI2LjY5NzgiIHk9IjIzLjc4MTIiIHdpZHRoPSI0LjAwOTA0IiBoZWlnaHQ9IjguMzI2NDYiIHJ4PSIyLjAwNDUyIiB0cmFuc2Zvcm09InJvdGF0ZSgtMzAgMjYuNjk3OCAyMy43ODEyKSIgZmlsbD0id2hpdGUiLz4KPC9nPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9mXzUxMTBfMTQ3NzEiIHg9Ii0xNC45MTYzIiB5PSI3LjQ1NTk5IiB3aWR0aD0iNTUuMDQ2OCIgaGVpZ2h0PSI1NS4wNDciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNi43MjEyMyIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl81MTEwXzE0NzcxIiB4PSI5LjQ2OTU5IiB5PSIxOS43NDc3IiB3aWR0aD0iNDcuNzQxNyIgaGVpZ2h0PSI0Ny43NDEiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNS41MDAxOSIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzUxMTBfMTQ3NzEiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81MTEwXzE0NzcxIiB4MT0iMjAiIHkxPSIwIiB4Mj0iMjAiIHkyPSI0MCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNkM0REZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzU4M0VEMyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfNTExMF8xNDc3MSIgeDE9IjE0LjYzOSIgeTE9IjEwLjc5MTciIHgyPSIzMi4xNzEyIiB5Mj0iNDEuMTU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjgiLz4KPHN0b3Agb2Zmc2V0PSIwLjQzNzY4OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF81MTEwXzE0NzcxIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=="),factory:$("image/x-icon","AAABAAMAEBAAAAAAIACnAQAANgAAACAgAAAAACAA7gMAAN0BAAAwMAAAAAAgAEEGAADLBQAAiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABbklEQVR4nNVTsYrCUBCcvJxoIUrQwjr+goKljSip/ABjKUKKlIKlhYhgYaNoLETQ0i5YCnYh+QDxAyxMF6OChXvkcScWCoJccQtbPNidNzuzKzDGCB8E+6T57wAqlQpGoxFisRgajQYsy0I2m30PQBAE5PN5yLIMXdcxmUzAGEMoFHoK8PX4UBQF4XAYs9kMnuehVCohHo/Dtm1IkgTDMLBarbBcLp8z6Ha7qNfrqFar8H0fyWQSqqqi1WrBdV2k02kUCoXXDObzOYbDIURR5I1B8el0QjQaxX6/x2azQa/Xew0wHo/RbrdxvV5xuVxwPB5xPp85G9M0+ViapqHT6TyoyBgFKYoiOY5DhmFQIpGgXC5HtVqN+v0+pVIpGgwGtNvtyLZtXn9P/AQRccuCX8rlMprNJhaLxV0Lx3FQLBa5xS9HWK/XPAMbI5EIMpkMdyXQZbvdYjqdvrdIt9sNh8OBi/e7SIE+z0L4/8f0Da2inUv6aSJrAAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADtUlEQVR4nO1WWyh0URTejjEjJDPNg1uYvAgZT6Mk9yJjIsmIt+Ft8KB4mpQJSS4PJJoklzIhiSFCxgu555okDMklIXItLe3Vf07/eDpnUvMyp3bn7L323uvb3/rW2seNYRggTnwYZzp3AXAxIJgBnU5HrFYrCQgIsBtXqVTEaDQSi8VCcnNzBaqQYYBPUygU8Pz8DF9fX9DT04NjmZmZsLS0BC8vL5ytvb2d135sI3wndnd3w97eHqyvr8P7+ztYrVaYnp4GtVoNEokEKisrEYBGo/l7AN7e3nBzcwORkZEQGhqKJ25tbbWbMzIyggBqampAqVTyB0F4PGlpaWR5eZkcHR2Ry8tL0t/fTxISEji7TCYjGRkZpKmpiTw+PhKTyUT29/eJwWAgUqnUMQ00NzfjqUpLS2FoaAipZm1RUVHw+fkJYWFh2K+uroaTkxPw8vLi5qSmpoLNZoPb21vIz88XHgKbzYaUsq2jowP8/f05+/z8PJSVlWH8z87OoLi42G59eHg47Ozs4FoqVMEABgcHUXRU6fX19XB8fAwPDw9gNBpBJpOBVquF2dlZfK+uroJIJMJ1KpUKs+T19RXe3t7AZDJBUFCQcADZ2dl4MrZPHWRlZcHk5CRcX18jEOrk9PQUioqKkI3NzU10urCwAG1tbTA1NeV4Fri7u+OGNJa/bdHR0cgIG567uzsYGBiAwsJCkMvl3DxKfUpKiuNpqFarYWJiAr8DAwNBp9PB6OgoCuvw8JADsLW1hUITi8V26/Py8mBxcdFxAFKpFCne2NhA1R8cHEBVVRWC6erqgrGxMRQrDRctUOfn52AwGLiY+/j4YNGKj48XDkCv12PxoSekFY9SScPChuD+/h7p3t3dhfT0dNRIQUEBgqRO5+bmoKWlBT4+PqCxsVEYAIlEAk9PT+icium3fXx8HNOSfjc0NMDw8DBno2GgY1SMbIgsFotwBhITE5FWetLy8nLw8/PD8eTkZDxVREQE9im9NBv+T7XOzk6Mf0xMDFRUVEBcXJxjGhD9S72+vj6MdW9vL2xvb8PMzIzdnIuLC6wVtO/r6wtXV1ccYIfTkPnVPDw8uBuPZgM7HhwcjEzRIhUSEgK1tbVYwvnuK+L73/D9/U0UCgV+i8ViotFoiFarJUqlkpjNZrx4VlZWiFwuJzk5OX//Q8IwDKytrXHComovKSkBT09PtJnNZhyn5VnInkTI5KSkJBRkbGwsl5JsoxdVXV0d1gghe7ohCic+jDOduwC4GKAU/ADJJ9DJ7wBVHQAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAAAwAAAAMAgGAAAAVwL5hwAABghJREFUeJzVWGlIVU8Un65pakhZGi6tTwsXgiANDYqoVCLDlLRPIqX4waUPFSmRYpLYohHRHm1fog0NCtQUUcNQoSDDsrDVNLcW08reh078Dt3hXt8r/P/vk8c9MPDuzJmZ85s553fOvCmKopAwsSjC5KIIk4siTC6KMLkowuSiCJOLIkwuijC5KI5YJCUlRdTU1IiYmJi/6ri6uorY2FhRXFwsTp48KeLi4hyxtRDIxEba2rVraWxsjKxWK338+JH8/Px043PmzKHCwkJ6//4966itp6fH0L5qMwRg6tSp9OTJE51hx44d4zFfX18qKyujz58/c39/fz99+PBB6mGe4mwAmzdvZmNgZHd3N/8eHR2lw4cPs8FdXV18+iEhIaw/f/58CaC0tNT5ACorK+n79++0cuVKNm5wcJCN6+3tpbS0NJo2bZpOf/369RIA5ijOBADfxmkfOXJE9uG0Ydzjx4/tzjl9+rQE0NjYSHl5eRQREeEcAOnp6QwgMDBQ9s2aNYsGBgbYwNDQUJ2+u7u7jIH8/Hzav3+/jJ/nz59TcXExhYWFTQ4ABKvFYiEPDw/Zd+PGDbp69aqNLvwfRu3du1fXn5qayv3Nzc3k4uKiY7Gqqioe+/nzJ92+fdsGvGEAMFalyWvXrlFGRgYNDQ1RQkKCje6SJUvYkNbWVl1/W1sbrwGD7e2xbds2Scdfv36luLg4xwF49eqVjiq1TDJjxgwb/erqagYxb948/l6zZg3r46T/tofFYqFPnz7Jte/du+c4ALW1tbwoGKe9vZ2+ffsmNwLj7Nmzh7y8vKR+UlISj2VmZvJ3RUUF/fjxg5YtW2aztp+fH5WUlOiMx+8NGzY4DsDu3bt54evXr/P37NmzmSbv3r0rrx2ZNicnh4PVzc2N3r59yzQbHBzMOmfPntWtGRUVxX3Dw8PScPwGq43P5oYBgGlGRkbo/v37NmNBQUF06NAh6uvrYyM6Oztp69atdPToUTaorq6OYycgIIB8fHxox44d9OjRI2n02NgYPXjwgHVAqxM1/D8BQDt16hSDgBH2xqdPn86BiOAdHysvXrxgxsJ8fH/58oXZJj09nfz9/Xk+3BC3Zi+mHAIAQQbfz83N/ace3OvOnTs2IHAzqI1iY2PJ09PTZp6XlxfniQMHDkwOALTjx4+zIdoSAZy+YsUKKigooKamJg5We4yFLIxy41/rl5WVsSuhEJwUAHAfnNLOnTv5JE+cOEFv3ryRRuI3Murq1at1xoM+we1gsZs3b9K6det0yUz50yIjI1m/qKhocgDAjbQBiAa3unXrFm3cuJFcXV1ZDwEMY7ds2cI68PUFCxbQhQsXJGuBjrOysrj8UNfHzQIoCEGb9Q0DAIOcOXPGhv/37dsng1BtKJ2hp5YZz549o5aWFjm+dOlSzgtIdFarlQMbAb19+3Y+BABH/6ZNmxwDAKcCI1TDsSGKMW3i0jYYA73o6Gh5G/hGnGj1li9fLnXttYMHDzoOgPY5iNP7m67q+whmtS8mJob7zp07Z3dOSUkJB772drUvO4e4EE5LvQVcPXKCt7e3jV5DQwPrJCcnyz5kZpTY4H6tv2vLlPLycl4vJSWFLl68yBl8oqX1hIMY3J2dnU0dHR1sJF5fSPvh4eE8Hh8fz/0vX77kUkI799KlSzyGLKztX7RoEQc1bmmidvxvAOPpDnU/coLKKOqb2B4FIiAx9vr1ax27lJeX80HYS2yTCmB8LXTlyhXpu/auHolJHcctom/x4sXsVufPnze0v2EAaJcvX5blwviyYteuXVzjqAAQD3A3UKvVauW3gpG9pzAKA+Lm5ibevXsnZs6cKfr6+kROTo4IDAwUq1atEvHx8WJ0dFSUlpaKhw8fivr6ehyYnPv06VMREREhfv365bx/5sDv9ngc1It3sZat1GBWW2JiouHbNwwAJYL67xsYBVSKlxjK6/G6CxculO8GgFEc4L6GXQji6+sr5s6dK7q6usTIyMg/dS0WiwgNDRVVVVXGXOePOASAM0URJhdFmFwUYXJRhMlFESYXRZhcFGFyUZxtgFH5DTKA7j8bLK6dAAAAAElFTkSuQmCC"),qoder:$("image/png","iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAMAAAAKE/YAAAAAyVBMVEURERMq21z///8hj0Hh4eGmpqYgICLw8PAkqEqIiInDw8QnwlMvLzFNTU4UKhx5eXopzlgedjg+Pj8THhgbXS9qamyXl5jk+uoXRCWv8cIWNyEfgzx66JlbW121tbXy/fUZUCoUKxwkqUpF33DX+OAcaTMYRCZra2wcajPS0tOlpaZS4ns33WZcXF0mtU9f5IRt5o/J9taU7a0aXS4ySDpEcFIltU5Q1XYnwVMfgjy89Myi77giLSYukUt7hn+T4KlF33F8koPI6dKlvz6KAAAD3ElEQVR42u3c13biMBCAYUkIjAsYMB1CSUjfTdvey/s/1BI2ARIEyJLwjM+Z/zIXPl8UWTLGDmMURVEURVEURVEURVEURVGU+xpH7VFwKWUwaseVUh7AceCJ9bwgxu0+KkqhyPPRsiO1GDO7EoidIWRHe8gI2VFRaOW18JhbUugm3+ZrmJ8KKhjWZSlSBs+OhUHAbF+YVYzgzG1hXBtq/bsSFgEt21ZmIHZbWJc52xcukplukufCUTK79S/yhLOyWrZLUrgsG3ZbOC5oHP6KX7jv0Juk48nx3GHXP7eTYzy77z02Gx9y2W64A8++3V3zZb+Hv34eih04GuGvwxO+0acPiM/C3i3fUjjBOdAd1RivKlfxDXRnyPdUu0A20NIv8/3V3a7R9nuIDpoX8FyRLq5EtdBOx9rq6u5ysVXroR2qrU5D//8xNNG8i2EHj1k6dJiAzw5veRtPF82/OPrAYm5eXTBro7mbTSZ2YE6BdrPuFU3R6x9M9NFuhtr06v+cmaEvALdDnxmiQ7jL/ytmiuZ9B98Tmu3dJXP0KdDi4b2+O5AGXQa6WoqZBboGs4kHzAbNpyDLdGSHPoNA+8wO3QRAe4r7GDdp0HUAdKw4SogcLZktupA9WjXQrIYbrZrRLOG40b7qIH3kaOUt0CZudKA8yAA3Wv0d4TFqtKe+QV5DjR4pj9HlqNHKRZrVcaMjB1M6a7RyC0+5tWSOHrmYHVmj1VP6Bjf6yMHakTk6cnAaZo5WbS1VjhytOkABAN22XPHSD7QDtG+JPoZAx3boLodAH9mhQxB0xQpd5yDokg26z2HQ7NIcnXyEQhfN0QMOhW4Zo99xMHRkiu7X4NBsZIauhhwQ3TJCm5vdfGkrDdAWZjfoVnq0jdnR1+MyLdrK7AjdSom2M7t6AKuYCn1R4xjQkUyBHnCOAq35PoC0nxpOn89reHroOud40OxcQy2bIUeF1nkLscM5MrTGm8AI0fMPuV4O0azke/lD72GPkaJ3v8qMFr3rjLzGi97+XxDuMKO3sR9wo9Xse+xo1T9EGONHK3ab2xygN5btXh7Qr9mdfKAf2WvqYU7QLzbJTm7Q84vtwOFQZ4VeLdudPKGX7IdcoefsxW5zYouus2x73CQ7tupmxujFsj17o/1QuvKHCWMA7J6mulDtluFnxzP7r446XDyRvsEOEwZT6c/ezzDhcuZW6+uzJOwzsL7/2P1ayIuTLVmxwyqD7P3W9wDCwoYsOS3XNn4XkLoDxepQPt32959OGYqS7uDz2lpWHkwSlouS/qQ5b3I2ZRRFURRFURRFURRFURRFURT11D+KvFuepijo0gAAAABJRU5ErkJggg==")},se=40;function ue(t){return t instanceof HTMLElement&&(t.isContentEditable||["INPUT","SELECT","TEXTAREA"].includes(t.tagName))}function Ie(t,e){if(t.key==="Tab"&&!t.altKey&&!t.ctrlKey&&!t.metaKey){const M=document.activeElement,r=M?.closest(".feed-card");if(r){const I=[...r.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(D=>D.tabIndex>=0);if(M===r&&I.length>0){t.preventDefault(),I[t.shiftKey?I.length-1:0]?.focus();return}if(t.shiftKey&&M===I[0]){t.preventDefault(),r.focus({preventScroll:!0});return}}const d=[...e.querySelectorAll('button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]')].filter(I=>I!==e&&I.tabIndex>=0);if(d.length===0)return;const j=d.indexOf(document.activeElement),N=j<0?t.shiftKey?d.length-1:0:(j+(t.shiftKey?-1:1)+d.length)%d.length;t.preventDefault(),d[N]?.focus();return}if(ue(t.target)||t.altKey||t.metaKey)return;const i=t.key.toLowerCase(),s=!t.ctrlKey&&(i==="j"||i==="arrowdown")?1:!t.ctrlKey&&(i==="k"||i==="arrowup")?-1:t.ctrlKey&&i==="n"?1:t.ctrlKey&&i==="p"?-1:0,l=!t.ctrlKey&&(i==="home"||i==="end");if(s===0&&!l)return;const n=[...e.querySelectorAll(".feed-card")];if(n.length===0)return;const a=document.activeElement?.closest(".feed-card"),o=a?n.indexOf(a):-1,u=i==="home"?0:i==="end"?n.length-1:o<0?s>0?0:n.length-1:Math.max(0,Math.min(n.length-1,o+s));t.preventDefault(),n[u]?.focus({preventScroll:!0}),n[u]?.scrollIntoView?.({block:"nearest"})}function Ne(t){const e=[...t.currentTarget.querySelectorAll('[role="tab"]')],i=e.indexOf(document.activeElement);if(i<0)return;const s=t.key,l=s==="Home"?0:s==="End"?e.length-1:s==="ArrowLeft"?(i-1+e.length)%e.length:s==="ArrowRight"?(i+1)%e.length:-1;l<0||(t.preventDefault(),t.stopPropagation(),e[l]?.focus(),e[l]?.click())}function Ae(t){const e=new Date().toISOString();return[{allowed_permission_modes:["deny","once","always"],created_at:e,id:"feed-demo-permission",kind:"permissionRequest",source:"claude",status:"pending",tool_input:t.demoPermissionBody,tool_name:t.demoPermissionTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-plan",kind:"exitPlan",plan:t.demoPlanBody,source:"codex",status:"pending",title:t.demoPlanTitle,workstream_id:"feed-demo"},{created_at:e,id:"feed-demo-question",kind:"question",question_prompt:t.demoQuestionPrompt,questions:[{id:"verification",multi_select:!1,options:[{id:"focused",label:t.demoQuestionOptionFocused},{id:"full",label:t.demoQuestionOptionFull}],prompt:t.demoQuestionPrompt}],source:"gemini",status:"pending",title:t.demoQuestionTitle,workstream_id:"feed-demo"}]}function ge(){const t=O.c(62),e=h.useSyncExternalStore(q.subscribe,q.getSnapshot,q.getSnapshot),[i,s]=h.useState("actionable"),[l,n]=h.useState(se);let a;t[0]===Symbol.for("react.memo_cache_sentinel")?(a=[],t[0]=a):a=t[0];const[o,u]=h.useState(a),[M,r]=h.useState(null),d=h.useRef(ze);let j;t[1]===Symbol.for("react.memo_cache_sentinel")?(j=S=>{if(d.current(),d.current=xe,!S)return;const G=X=>Ie(X,S);S.addEventListener("keydown",G),d.current=()=>S.removeEventListener("keydown",G),(!document.activeElement||document.activeElement===document.body)&&S.focus()},t[1]=j):j=t[1];const N=j;if(!e){let S;return t[2]===Symbol.for("react.memo_cache_sentinel")?(S=c.jsx("main",{className:"feed-shell feed-loading","aria-busy":"true"}),t[2]=S):S=t[2],S}let I;t[3]!==o||t[4]!==e.items?(I=o.length>0?[...o,...e.items]:e.items,t[3]=o,t[4]=e.items,t[5]=I):I=t[5];const D=I;let g;t[6]!==i||t[7]!==D?(g=i==="actionable"?D.filter(De):D,t[6]=i,t[7]=D,t[8]=g):g=t[8];const A=g;let y;t[9]!==l||t[10]!==i||t[11]!==A?(y=i==="activity"?A.slice(0,l):A,t[9]=l,t[10]=i,t[11]=A,t[12]=y):y=t[12];const z=y,m=i==="activity"&&z.length{r(null);const X=typeof G.itemId=="string"?G.itemId:"";if(X.startsWith("feed-demo-")){u(oe=>oe.map(K=>K.id===X?{...K,status:"resolved"}:K));return}try{await le(S,G)}catch{r(e.copy.requestFailed)}},t[17]=e.copy.requestFailed,t[18]=x):x=t[18];const L=x;let p;t[19]!==e.copy.feed?(p=c.jsx("h1",{children:e.copy.feed}),t[19]=e.copy.feed,t[20]=p):p=t[20];const b=i==="actionable";let w;t[21]===Symbol.for("react.memo_cache_sentinel")?(w=()=>s("actionable"),t[21]=w):w=t[21];const J=i==="actionable"?0:-1;let Q;t[22]!==e.copy.actionable||t[23]!==J||t[24]!==b?(Q=c.jsx("button",{"aria-selected":b,onClick:w,role:"tab",tabIndex:J,children:e.copy.actionable}),t[22]=e.copy.actionable,t[23]=J,t[24]=b,t[25]=Q):Q=t[25];const F=i==="activity";let W;t[26]===Symbol.for("react.memo_cache_sentinel")?(W=()=>s("activity"),t[26]=W):W=t[26];const H=i==="activity"?0:-1;let C;t[27]!==e.copy.activity||t[28]!==F||t[29]!==H?(C=c.jsx("button",{"aria-selected":F,onClick:W,role:"tab",tabIndex:H,children:e.copy.activity}),t[27]=e.copy.activity,t[28]=F,t[29]=H,t[30]=C):C=t[30];let k;t[31]!==Q||t[32]!==C?(k=c.jsxs("div",{className:"feed-filter",onKeyDown:Ne,role:"tablist",tabIndex:-1,children:[Q,C]}),t[31]=Q,t[32]=C,t[33]=k):k=t[33];let U;t[34]!==k||t[35]!==p?(U=c.jsxs("header",{className:"feed-header",children:[p,k]}),t[34]=k,t[35]=p,t[36]=U):U=t[36];let Y;t[37]!==M?(Y=M&&c.jsx("div",{className:"feed-error",role:"alert",children:M}),t[37]=M,t[38]=Y):Y=t[38];let P;t[39]!==i||t[40]!==L||t[41]!==e||t[42]!==z?(P=z.length===0?c.jsx(Le,{filter:i,onLoadExamples:()=>{u(Ae(e.copy)),s("actionable")},snapshot:e}):z.map(S=>c.jsx(me,{item:S,copy:e.copy,perform:L,sourceIcon:e.sourceIcons[S.source],sourceLabel:e.sourceLabels[S.source]},S.id)),t[39]=i,t[40]=L,t[41]=e,t[42]=z,t[43]=P):P=t[43];let v;t[44]!==m||t[45]!==L||t[46]!==e.copy.loadOlder||t[47]!==e.copy.loadingOlder||t[48]!==e.hasMore||t[49]!==e.isLoadingOlder?(v=(m||e.hasMore)&&c.jsx("button",{className:"feed-load-more",disabled:!m&&e.isLoadingOlder,onClick:()=>{m?n(ye):L("feed.loadOlder",{})},children:!m&&e.isLoadingOlder?e.copy.loadingOlder:e.copy.loadOlder}),t[44]=m,t[45]=L,t[46]=e.copy.loadOlder,t[47]=e.copy.loadingOlder,t[48]=e.hasMore,t[49]=e.isLoadingOlder,t[50]=v):v=t[50];let R;t[51]!==P||t[52]!==v?(R=c.jsxs("section",{className:"feed-list",children:[P,v]}),t[51]=P,t[52]=v,t[53]=R):R=t[53];let Z;t[54]!==e.copy.feed||t[55]!==U||t[56]!==Y||t[57]!==R?(Z=c.jsxs("div",{"aria-label":e.copy.feed,className:"feed-keyboard-root",ref:N,tabIndex:-1,children:[U,Y,R]}),t[54]=e.copy.feed,t[55]=U,t[56]=Y,t[57]=R,t[58]=Z):Z=t[58];let B;return t[59]!==Z||t[60]!==T?(B=c.jsx("main",{className:"feed-shell",style:T,children:Z}),t[59]=Z,t[60]=T,t[61]=B):B=t[61],B}function ye(t){return t+se}function De(t){return t.status==="pending"}function xe(){}function ze(){}function Le(t){const e=O.c(39),{filter:i,onLoadExamples:s,snapshot:l}=t,n=i==="actionable"?l.copy.emptyActionable:l.copy.emptyActivity,a=i==="actionable"?l.copy.emptyActionableDescription:l.copy.emptyActivityDescription;let o;e[0]!==l.copy.integrationChecking||e[1]!==l.copy.integrationDisabled||e[2]!==l.copy.integrationNeedsSetup||e[3]!==l.copy.integrationReady?(o=z=>({checking:l.copy.integrationChecking,disabled:l.copy.integrationDisabled,needsSetup:l.copy.integrationNeedsSetup,ready:l.copy.integrationReady})[z.status],e[0]=l.copy.integrationChecking,e[1]=l.copy.integrationDisabled,e[2]=l.copy.integrationNeedsSetup,e[3]=l.copy.integrationReady,e[4]=o):o=e[4];const u=o;let M;e[5]!==n?(M=c.jsx("h2",{children:n}),e[5]=n,e[6]=M):M=e[6];let r;e[7]!==a?(r=c.jsx("p",{children:a}),e[7]=a,e[8]=r):r=e[8];let d;e[9]!==s||e[10]!==l.copy.loadExamples?(d=c.jsx("button",{className:"feed-load-examples",onClick:s,children:l.copy.loadExamples}),e[9]=s,e[10]=l.copy.loadExamples,e[11]=d):d=e[11];let j;e[12]!==l.copy.integrationsTitle?(j=c.jsx("h3",{id:"feed-integrations-title",children:l.copy.integrationsTitle}),e[12]=l.copy.integrationsTitle,e[13]=j):j=e[13];let N;if(e[14]!==l.integrations||e[15]!==l.sourceIcons||e[16]!==l.sourceLabels||e[17]!==u){let z;e[19]!==l.sourceIcons||e[20]!==l.sourceLabels||e[21]!==u?(z=m=>c.jsxs("div",{className:"feed-integration","data-status":m.status,children:[c.jsx(ce,{icon:l.sourceIcons[m.source],label:l.sourceLabels[m.source],source:m.source}),c.jsx("span",{className:"feed-integration-status",children:u(m)})]},m.source),e[19]=l.sourceIcons,e[20]=l.sourceLabels,e[21]=u,e[22]=z):z=e[22],N=l.integrations.map(z),e[14]=l.integrations,e[15]=l.sourceIcons,e[16]=l.sourceLabels,e[17]=u,e[18]=N}else N=e[18];let I;e[23]!==N?(I=c.jsx("div",{className:"feed-integration-grid",children:N}),e[23]=N,e[24]=I):I=e[24];let D;e[25]!==l.copy.integrationHint?(D=c.jsx("p",{className:"feed-integration-hint",children:l.copy.integrationHint}),e[25]=l.copy.integrationHint,e[26]=D):D=e[26];let g;e[27]!==j||e[28]!==I||e[29]!==D?(g=c.jsxs("section",{"aria-labelledby":"feed-integrations-title",className:"feed-integrations",children:[j,I,D]}),e[27]=j,e[28]=I,e[29]=D,e[30]=g):g=e[30];let A;e[31]!==l.copy.keyboardHelp?(A=c.jsx("p",{className:"feed-keyboard-help",children:l.copy.keyboardHelp}),e[31]=l.copy.keyboardHelp,e[32]=A):A=e[32];let y;return e[33]!==A||e[34]!==M||e[35]!==r||e[36]!==d||e[37]!==g?(y=c.jsxs("div",{className:"feed-empty",children:[M,r,d,g,A]}),e[33]=A,e[34]=M,e[35]=r,e[36]=d,e[37]=g,e[38]=y):y=e[38],y}function me(t){const e=O.c(34),{item:i,copy:s,perform:l,sourceIcon:n,sourceLabel:a}=t;let o;e[0]!==i.kind||e[1]!==i.title||e[2]!==i.tool_name?(o=i.title||i.tool_name||i.kind.replaceAll("_"," "),e[0]=i.kind,e[1]=i.title,e[2]=i.tool_name,e[3]=o):o=e[3];const u=o,M=`feed-card feed-card-${i.status}`;let r;e[4]!==i.source||e[5]!==n||e[6]!==a?(r=c.jsx(ce,{icon:n,label:a,source:i.source}),e[4]=i.source,e[5]=n,e[6]=a,e[7]=r):r=e[7];let d;e[8]!==u?(d=c.jsx("h2",{children:u}),e[8]=u,e[9]=d):d=e[9];let j;e[10]!==r||e[11]!==d?(j=c.jsxs("div",{className:"feed-card-title",children:[r,d]}),e[10]=r,e[11]=d,e[12]=j):j=e[12];let N;e[13]!==i.created_at?(N=new Date(i.created_at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),e[13]=i.created_at,e[14]=N):N=e[14];let I;e[15]!==N?(I=c.jsx("time",{children:N}),e[15]=N,e[16]=I):I=e[16];let D;e[17]!==j||e[18]!==I?(D=c.jsxs("div",{className:"feed-card-heading",children:[j,I]}),e[17]=j,e[18]=I,e[19]=D):D=e[19];let g;e[20]!==i.cwd?(g=i.cwd&&c.jsx("div",{className:"feed-cwd",children:i.cwd}),e[20]=i.cwd,e[21]=g):g=e[21];let A;e[22]!==i?(A=c.jsx(Te,{item:i}),e[22]=i,e[23]=A):A=e[23];let y;e[24]!==s||e[25]!==i||e[26]!==l?(y=i.status==="pending"&&c.jsx(Se,{item:i,copy:s,perform:l}),e[24]=s,e[25]=i,e[26]=l,e[27]=y):y=e[27];let z;return e[28]!==A||e[29]!==y||e[30]!==M||e[31]!==D||e[32]!==g?(z=c.jsxs("article",{className:M,tabIndex:-1,children:[D,g,A,y]}),e[28]=A,e[29]=y,e[30]=M,e[31]=D,e[32]=g,e[33]=z):z=e[33],z}function ce(t){const e=O.c(14),{icon:i,label:s,source:l}=t,n=s??l;let a,o;e[0]!==i||e[1]!==l?(a=i?{presentation:"image",url:i}:je[l],o=a?.presentation==="mask"?{"--feed-source-icon":`url(${JSON.stringify(a.url)})`}:void 0,e[0]=i,e[1]=l,e[2]=a,e[3]=o):(a=e[2],o=e[3]);const u=o;let M;e[4]!==n||e[5]!==a||e[6]!==u?(M=a?.presentation==="image"?c.jsx("img",{alt:"","aria-hidden":"true",className:"feed-source-logo feed-source-logo-image",src:a.url}):c.jsx("span",{className:"feed-source-logo feed-source-logo-mask","data-fallback":a?void 0:"",style:u,"aria-hidden":"true",children:!a&&n.slice(0,1).toUpperCase()}),e[4]=n,e[5]=a,e[6]=u,e[7]=M):M=e[7];let r;e[8]!==n?(r=c.jsx("span",{children:n}),e[8]=n,e[9]=r):r=e[9];let d;return e[10]!==l||e[11]!==M||e[12]!==r?(d=c.jsxs("span",{className:"feed-source","data-feed-source":l,children:[M,r]}),e[10]=l,e[11]=M,e[12]=r,e[13]=d):d=e[13],d}function Te(t){const e=O.c(2),{item:i}=t,s=i.plan||i.question_prompt||i.tool_input||i.tool_result||i.text;if(!s)return null;let l;return e[0]!==s?(l=c.jsx("pre",{className:"feed-body",children:s}),e[0]=s,e[1]=l):l=e[1],l}function Se(t){const e=O.c(64),{item:i,copy:s,perform:l}=t;if(i.kind==="permissionRequest"){let n;e[0]!==i.allowed_permission_modes?(n=i.allowed_permission_modes??["deny"],e[0]=i.allowed_permission_modes,e[1]=n):n=e[1];let a;e[2]!==n?(a=new Set(n),e[2]=n,e[3]=a):a=e[3];const o=a;let u;e[4]!==s||e[5]!==i.id||e[6]!==o||e[7]!==l?(u=o.has("deny")&&c.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:i.id,mode:"deny"}),children:s.deny}),e[4]=s,e[5]=i.id,e[6]=o,e[7]=l,e[8]=u):u=e[8];let M;e[9]!==s||e[10]!==i.id||e[11]!==o||e[12]!==l?(M=o.has("once")&&c.jsx("button",{onClick:()=>l("feed.permission.reply",{itemId:i.id,mode:"once"}),children:s.allowOnce}),e[9]=s,e[10]=i.id,e[11]=o,e[12]=l,e[13]=M):M=e[13];let r;e[14]!==s||e[15]!==i.id||e[16]!==o||e[17]!==l?(r=o.has("always")&&c.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:i.id,mode:"always"}),children:s.allowAlways}),e[14]=s,e[15]=i.id,e[16]=o,e[17]=l,e[18]=r):r=e[18];let d;e[19]!==s||e[20]!==i.id||e[21]!==o||e[22]!==l?(d=o.has("all")&&c.jsx("button",{className:"primary",onClick:()=>l("feed.permission.reply",{itemId:i.id,mode:"all"}),children:s.allowAll}),e[19]=s,e[20]=i.id,e[21]=o,e[22]=l,e[23]=d):d=e[23];let j;e[24]!==s||e[25]!==i.id||e[26]!==o||e[27]!==l?(j=o.has("bypass")&&c.jsx("button",{className:"danger",onClick:()=>l("feed.permission.reply",{itemId:i.id,mode:"bypass"}),children:s.allowBypass}),e[24]=s,e[25]=i.id,e[26]=o,e[27]=l,e[28]=j):j=e[28];let N;return e[29]!==u||e[30]!==M||e[31]!==r||e[32]!==d||e[33]!==j?(N=c.jsxs("div",{className:"feed-actions",children:[u,M,r,d,j]}),e[29]=u,e[30]=M,e[31]=r,e[32]=d,e[33]=j,e[34]=N):N=e[34],N}if(i.kind==="exitPlan"){let n;e[35]!==i.id||e[36]!==l?(n=()=>l("feed.exitPlan.reply",{itemId:i.id,mode:"manual"}),e[35]=i.id,e[36]=l,e[37]=n):n=e[37];let a;e[38]!==s.planManual||e[39]!==n?(a=c.jsx("button",{onClick:n,children:s.planManual}),e[38]=s.planManual,e[39]=n,e[40]=a):a=e[40];let o;e[41]!==i.id||e[42]!==l?(o=()=>l("feed.exitPlan.reply",{itemId:i.id,mode:"autoAccept"}),e[41]=i.id,e[42]=l,e[43]=o):o=e[43];let u;e[44]!==s.planAuto||e[45]!==o?(u=c.jsx("button",{onClick:o,children:s.planAuto}),e[44]=s.planAuto,e[45]=o,e[46]=u):u=e[46];let M;e[47]!==i.id||e[48]!==l?(M=()=>l("feed.exitPlan.reply",{itemId:i.id,mode:"ultraplan"}),e[47]=i.id,e[48]=l,e[49]=M):M=e[49];let r;e[50]!==s.planUltraplan||e[51]!==M?(r=c.jsx("button",{className:"primary",onClick:M,children:s.planUltraplan}),e[50]=s.planUltraplan,e[51]=M,e[52]=r):r=e[52];let d;return e[53]!==a||e[54]!==u||e[55]!==r?(d=c.jsxs("div",{className:"feed-actions",children:[a,u,r]}),e[53]=a,e[54]=u,e[55]=r,e[56]=d):d=e[56],d}if(i.kind==="question"){let n;e[57]!==i.questions?(n=i.questions??[],e[57]=i.questions,e[58]=n):n=e[58];let a;return e[59]!==s||e[60]!==i||e[61]!==l||e[62]!==n?(a=c.jsx(pe,{item:i,questions:n,copy:s,perform:l}),e[59]=s,e[60]=i,e[61]=l,e[62]=n,e[63]=a):a=e[63],a}return null}function pe(t){const e=O.c(34),{item:i,questions:s,copy:l,perform:n}=t;let a;e[0]!==i.question_options||e[1]!==i.question_prompt||e[2]!==s?(a=s.length>0?s:[{id:"question",multi_select:!1,options:i.question_options??[],prompt:i.question_prompt??""}],e[0]=i.question_options,e[1]=i.question_prompt,e[2]=s,e[3]=a):a=e[3];const o=a;let u;e[4]===Symbol.for("react.memo_cache_sentinel")?(u={},e[4]=u):u=e[4];const[M,r]=h.useState(u);let d;e[5]===Symbol.for("react.memo_cache_sentinel")?(d={},e[5]=d):d=e[5];const[j,N]=h.useState(d);let I;e[6]===Symbol.for("react.memo_cache_sentinel")?(I=(T,x)=>{r(L=>{const p=L[T.id]??[],b=T.multi_select?p.includes(x)?p.filter(w=>w!==x):[...p,x]:[x];return{...L,[T.id]:b}})},e[6]=I):I=e[6];const D=I;let g;if(e[7]!==j||e[8]!==o||e[9]!==M){let T;e[11]!==j||e[12]!==M?(T=x=>{const L=j[x.id]?.trim();if(L)return[L];const p=M[x.id]??[],b=x.options.filter(w=>p.includes(w.id)).map(fe);return b.length>0?[b.join(", ")]:[]},e[11]=j,e[12]=M,e[13]=T):T=e[13],g=o.flatMap(T),e[7]=j,e[8]=o,e[9]=M,e[10]=g}else g=e[10];const A=g;let y;if(e[14]!==l.questionPlaceholder||e[15]!==j||e[16]!==o||e[17]!==M){let T;e[19]!==l.questionPlaceholder||e[20]!==j||e[21]!==M?(T=x=>c.jsxs("div",{className:"feed-question",children:[x.prompt&&c.jsx("div",{className:"feed-question-prompt",children:x.prompt}),c.jsx("div",{className:"feed-options",children:x.options.map(L=>c.jsxs("button",{"aria-pressed":(M[x.id]??[]).includes(L.id),onClick:()=>D(x,L.id),children:[c.jsx("strong",{children:L.label}),L.description&&c.jsx("span",{children:L.description})]},L.id))}),c.jsx("input",{"aria-label":l.questionPlaceholder,onChange:L=>N(p=>({...p,[x.id]:L.target.value})),placeholder:l.questionPlaceholder,value:j[x.id]??""})]},x.id),e[19]=l.questionPlaceholder,e[20]=j,e[21]=M,e[22]=T):T=e[22],y=o.map(T),e[14]=l.questionPlaceholder,e[15]=j,e[16]=o,e[17]=M,e[18]=y}else y=e[18];const z=A.length===0;let m;e[23]!==A||e[24]!==i.id||e[25]!==n?(m=()=>n("feed.question.reply",{itemId:i.id,selections:A}),e[23]=A,e[24]=i.id,e[25]=n,e[26]=m):m=e[26];let f;e[27]!==l.questionSubmit||e[28]!==z||e[29]!==m?(f=c.jsx("button",{className:"primary",disabled:z,onClick:m,children:l.questionSubmit}),e[27]=l.questionSubmit,e[28]=z,e[29]=m,e[30]=f):f=e[30];let E;return e[31]!==y||e[32]!==f?(E=c.jsxs("div",{className:"feed-question-actions",children:[y,f]}),e[31]=y,e[32]=f,e[33]=E):E=e[33],E}function fe(t){return t.label}function we(t){document.documentElement.dataset.cmuxWebviewKind="feed",document.body.dataset.cmuxWebviewKind="feed";const e=ae(()=>c.jsx(ge,{}));Me.createRoot(t).render(c.jsx(ne,{router:e}))}export{we as mountFeedSurface}; diff --git a/webviews/src/feed/App.tsx b/webviews/src/feed/App.tsx index ee3b7c0bdce9..14d1c4876fa0 100644 --- a/webviews/src/feed/App.tsx +++ b/webviews/src/feed/App.tsx @@ -15,6 +15,23 @@ function isEditable(target: EventTarget | null) { export function handleFeedNavigation(event: KeyboardEvent, root: HTMLElement) { if (event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey) { + const activeElement = document.activeElement as HTMLElement | null; + const activeCard = activeElement?.closest(".feed-card"); + if (activeCard) { + const cardControls = [...activeCard.querySelectorAll( + 'button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]', + )].filter((control) => control.tabIndex >= 0); + if (activeElement === activeCard && cardControls.length > 0) { + event.preventDefault(); + cardControls[event.shiftKey ? cardControls.length - 1 : 0]?.focus(); + return; + } + if (event.shiftKey && activeElement === cardControls[0]) { + event.preventDefault(); + activeCard.focus({ preventScroll: true }); + return; + } + } const controls = [...root.querySelectorAll( 'button:not(:disabled), input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex="0"]', )].filter((control) => control !== root && control.tabIndex >= 0); diff --git a/webviews/test/feed.test.tsx b/webviews/test/feed.test.tsx index d56112303af5..aadd6cfefce7 100644 --- a/webviews/test/feed.test.tsx +++ b/webviews/test/feed.test.tsx @@ -107,7 +107,7 @@ test("Feed React surface invokes the typed permission primitive", async () => { document.activeElement?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab" })); expect(document.activeElement?.textContent).toBe("Deny"); document.activeElement?.dispatchEvent(new dom!.window.KeyboardEvent("keydown", { bubbles: true, key: "Tab", shiftKey: true })); - expect(document.activeElement?.textContent).toBe("All Activity"); + expect(document.activeElement?.classList.contains("feed-card")).toBe(true); const loadOlder = [...container.querySelectorAll("button")] .find((button) => button.textContent === "Load older activity")!; loadOlder.focus(); From edcbd800471e658dace69e4699de0ea06a2dd9e3 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Thu, 16 Jul 2026 15:44:07 -0700 Subject: [PATCH 22/23] test: cover Feed session persistence --- cmuxTests/BrowserPanelTests.swift | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/cmuxTests/BrowserPanelTests.swift b/cmuxTests/BrowserPanelTests.swift index 3e4d639e1e95..1646b242f5d1 100644 --- a/cmuxTests/BrowserPanelTests.swift +++ b/cmuxTests/BrowserPanelTests.swift @@ -655,6 +655,48 @@ final class BrowserPanelInitialNavigationTests: XCTestCase { XCTAssertTrue(normalLocalhostPanel.shouldPersistSessionSnapshot()) } + func testBundledFeedURLIsPersistedForSessionRestore() throws { + let feedURL = try XCTUnwrap(CmuxDiffViewerURLSchemeHandler.diffViewerURL( + token: CmuxDiffViewerURLSchemeHandler.bundledFeedToken, + requestPath: "/feed.html" + )) + let panel = BrowserPanel( + workspaceId: UUID(), + initialURL: feedURL, + renderInitialNavigation: false + ) + + XCTAssertEqual(panel.nativeCapabilities, [.feed]) + XCTAssertTrue( + panel.shouldPersistSessionSnapshot(), + "The bundled Feed panel must survive session restore instead of leaving an empty workspace that becomes a terminal." + ) + + let snapshot = SessionBrowserPanelSnapshot( + urlString: nil, + profileID: nil, + shouldRenderWebView: false, + pageZoom: 1, + developerToolsVisible: false, + omnibarVisible: true, + backHistoryURLStrings: nil, + forwardHistoryURLStrings: nil, + diffViewerToken: CmuxDiffViewerURLSchemeHandler.bundledFeedToken, + diffViewerRequestPath: "/feed.html" + ) + let restoredPanel = BrowserPanel( + workspaceId: UUID(), + renderInitialNavigation: false, + omnibarVisible: true, + nativeCapabilities: BrowserNativeCapability.restored(from: snapshot) + ) + + restoredPanel.restoreSessionSnapshot(snapshot) + + XCTAssertEqual(restoredPanel.currentURL, feedURL) + XCTAssertFalse(restoredPanel.isOmnibarVisible) + } + func testDiffViewerURLIsNotRecordedInBrowserHistory() throws { let fileURL = FileManager.default.temporaryDirectory .appendingPathComponent("cmux-browser-history-\(UUID().uuidString).json") From f817b57b3cf727b20a0767c34b4b034fab9d7e85 Mon Sep 17 00:00:00 2001 From: lawrencecchen <54008264+lawrencecchen@users.noreply.github.com> Date: Thu, 16 Jul 2026 15:45:24 -0700 Subject: [PATCH 23/23] fix: restore Feed workspaces as browser surfaces --- Sources/Panels/BrowserPanel.swift | 43 ++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/Sources/Panels/BrowserPanel.swift b/Sources/Panels/BrowserPanel.swift index ae4dc3d2d48d..924baa544fa6 100644 --- a/Sources/Panels/BrowserPanel.swift +++ b/Sources/Panels/BrowserPanel.swift @@ -1861,6 +1861,10 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { static let maxRegisteredFiles = 1024 static let bundledFeedToken = "bundled-feed-surface" + static func isBundledFeedSurface(token: String, requestPath: String) -> Bool { + token == bundledFeedToken && requestPath == "/feed.html" + } + struct RegisteredFile { let requestPath: String let fileURL: URL @@ -2015,6 +2019,25 @@ final class CmuxDiffViewerURLSchemeHandler: NSObject, WKURLSchemeHandler { return url } + /// Resolves a persisted internal browser surface and restores the backing + /// asset registration that was process-local before the app relaunched. + func sessionRestoreURL(token: String, requestPath: String) -> URL? { + if Self.isBundledFeedSurface(token: token, requestPath: requestPath) { + return try? registerBundledFeedAssets() + } + guard registerFromManifest(token: token) else { return nil } + return Self.diffViewerURL(token: token, requestPath: requestPath) + } + + /// Bundled surfaces are restorable from the app resources in every process. + /// Dynamic diff surfaces remain restorable only when their manifest is local. + func sessionRestorable(token: String, requestPath: String) -> Bool { + if Self.isBundledFeedSurface(token: token, requestPath: requestPath) { + return true + } + return diffViewerRestorable(token: token, requestPath: requestPath) + } + /// Whether the token currently has a registered (or manifest-restorable) /// session. Used to trust-gate native bridge calls from diff viewer pages. func hasActiveSession(token: String, now: Date = Date()) -> Bool { @@ -4905,13 +4928,14 @@ final class BrowserPanel: Panel, ObservableObject { } func restoreSessionSnapshot(_ snapshot: SessionBrowserPanelSnapshot) { - // Diff viewer surfaces re-register their token from the on-disk manifest - // and navigate via the app-owned custom scheme, so they restore even - // though the local HTTP server that originally served them is gone. + // Internal surfaces restore their backing registration, from bundled + // resources for Feed or an on-disk manifest for dynamic diff viewers. if let token = snapshot.diffViewerToken, let requestPath = snapshot.diffViewerRequestPath, - CmuxDiffViewerURLSchemeHandler.shared.registerFromManifest(token: token), - let diffURL = CmuxDiffViewerURLSchemeHandler.diffViewerURL(token: token, requestPath: requestPath) { + let diffURL = CmuxDiffViewerURLSchemeHandler.shared.sessionRestoreURL( + token: token, + requestPath: requestPath + ) { hiddenWebViewDiscardManager.updateRestoredSessionRenderIntent(snapshot.shouldRenderWebView) setMuted(snapshot.isMuted) setOmnibarVisible( @@ -4976,12 +5000,11 @@ final class BrowserPanel: Panel, ObservableObject { } func shouldPersistSessionSnapshot() -> Bool { - // Diff viewer surfaces are otherwise treated as temporary. Persist them - // only when they can actually be restored via the custom scheme (a - // local-only, non-pending manifest); otherwise persisting would leave a - // blank panel on restart with no URL to fall back to. + // Internal surfaces are otherwise treated as temporary. Persist them + // only when their bundled resources or local, non-pending manifest can + // restore the custom-scheme URL after relaunch. if let components = diffViewerSessionComponents() { - return CmuxDiffViewerURLSchemeHandler.shared.diffViewerRestorable( + return CmuxDiffViewerURLSchemeHandler.shared.sessionRestorable( token: components.token, requestPath: components.requestPath )