jupyterlab-codex-sidebar 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/.github/workflows/unit-tests.yml +27 -0
- package/AGENTS.md +42 -0
- package/README.md +67 -9
- package/docs/images/codex-sidebar-screenshot.png +0 -0
- package/jupyterlab_codex/handlers.py +938 -297
- package/jupyterlab_codex/labextension/package.json +13 -3
- package/jupyterlab_codex/labextension/static/525.224526d045c727069de6.js +2 -0
- package/jupyterlab_codex/labextension/static/855.d20f6158cd81bb4c9056.js +1 -0
- package/jupyterlab_codex/labextension/static/{remoteEntry.b2fdc03a1c4582e79156.js → remoteEntry.c1e865f207776f7f24ff.js} +1 -1
- package/jupyterlab_codex/protocol.py +297 -0
- package/jupyterlab_codex/runner.py +137 -31
- package/jupyterlab_codex/sessions.py +582 -97
- package/lib/codexChat.d.ts +13 -0
- package/lib/codexChat.js +2410 -0
- package/lib/codexChat.js.map +1 -0
- package/lib/codexChatAttachmentDedup.d.ts +10 -0
- package/lib/codexChatAttachmentDedup.js +35 -0
- package/lib/codexChatAttachmentDedup.js.map +1 -0
- package/lib/codexChatAttachmentLimit.d.ts +8 -0
- package/lib/codexChatAttachmentLimit.js +61 -0
- package/lib/codexChatAttachmentLimit.js.map +1 -0
- package/lib/codexChatDocumentUtils.d.ts +68 -0
- package/lib/codexChatDocumentUtils.js +480 -0
- package/lib/codexChatDocumentUtils.js.map +1 -0
- package/lib/codexChatFormatting.d.ts +11 -0
- package/lib/codexChatFormatting.js +83 -0
- package/lib/codexChatFormatting.js.map +1 -0
- package/lib/codexChatNotice.d.ts +3 -0
- package/lib/codexChatNotice.js +74 -0
- package/lib/codexChatNotice.js.map +1 -0
- package/lib/codexChatPersistence.d.ts +35 -0
- package/lib/codexChatPersistence.js +158 -0
- package/lib/codexChatPersistence.js.map +1 -0
- package/lib/codexChatPrimitives.d.ts +41 -0
- package/lib/codexChatPrimitives.js +152 -0
- package/lib/codexChatPrimitives.js.map +1 -0
- package/lib/codexChatRender.d.ts +24 -0
- package/lib/codexChatRender.js +293 -0
- package/lib/codexChatRender.js.map +1 -0
- package/lib/codexChatSessionFactory.d.ts +15 -0
- package/lib/codexChatSessionFactory.js +45 -0
- package/lib/codexChatSessionFactory.js.map +1 -0
- package/lib/codexChatSessionKey.d.ts +3 -0
- package/lib/codexChatSessionKey.js +14 -0
- package/lib/codexChatSessionKey.js.map +1 -0
- package/lib/codexChatStorage.d.ts +4 -0
- package/lib/codexChatStorage.js +37 -0
- package/lib/codexChatStorage.js.map +1 -0
- package/lib/codexSessionResolver.d.ts +12 -0
- package/lib/codexSessionResolver.js +38 -0
- package/lib/codexSessionResolver.js.map +1 -0
- package/lib/handlers/activitySummarizer.d.ts +15 -0
- package/lib/handlers/activitySummarizer.js +327 -0
- package/lib/handlers/activitySummarizer.js.map +1 -0
- package/lib/handlers/codexMessageTypes.d.ts +30 -0
- package/lib/handlers/codexMessageTypes.js +2 -0
- package/lib/handlers/codexMessageTypes.js.map +1 -0
- package/lib/handlers/codexMessageUtils.d.ts +46 -0
- package/lib/handlers/codexMessageUtils.js +144 -0
- package/lib/handlers/codexMessageUtils.js.map +1 -0
- package/lib/handlers/handleCodexSocketMessage.d.ts +107 -0
- package/lib/handlers/handleCodexSocketMessage.js +78 -0
- package/lib/handlers/handleCodexSocketMessage.js.map +1 -0
- package/lib/handlers/sessionSyncHandler.d.ts +34 -0
- package/lib/handlers/sessionSyncHandler.js +181 -0
- package/lib/handlers/sessionSyncHandler.js.map +1 -0
- package/lib/hooks/useCodexSocket.d.ts +15 -0
- package/lib/hooks/useCodexSocket.js +84 -0
- package/lib/hooks/useCodexSocket.js.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/panel.d.ts +1 -11
- package/lib/panel.js +1 -2768
- package/lib/panel.js.map +1 -1
- package/lib/protocol.d.ts +235 -0
- package/lib/protocol.js +278 -0
- package/lib/protocol.js.map +1 -0
- package/package.json +13 -3
- package/playwright.config.cjs +24 -0
- package/playwright.unit.config.cjs +19 -0
- package/pyproject.toml +1 -1
- package/release.sh +243 -0
- package/scripts/run_playwright_e2e.sh +96 -0
- package/scripts/run_playwright_freeze_repro.sh +58 -0
- package/scripts/run_playwright_queue_repro.sh +60 -0
- package/scripts/run_playwright_repro.sh +55 -0
- package/src/codexChat.tsx +3755 -0
- package/src/codexChatAttachmentDedup.ts +47 -0
- package/src/codexChatAttachmentLimit.ts +82 -0
- package/src/codexChatDocumentUtils.ts +612 -0
- package/src/codexChatFormatting.ts +94 -0
- package/src/codexChatNotice.ts +95 -0
- package/src/codexChatPersistence.ts +191 -0
- package/src/codexChatPrimitives.tsx +422 -0
- package/src/codexChatRender.tsx +376 -0
- package/src/codexChatSessionFactory.ts +79 -0
- package/src/codexChatSessionKey.ts +16 -0
- package/src/codexChatStorage.ts +36 -0
- package/src/codexSessionResolver.ts +56 -0
- package/src/handlers/activitySummarizer.ts +369 -0
- package/src/handlers/codexMessageTypes.ts +34 -0
- package/src/handlers/codexMessageUtils.ts +217 -0
- package/src/handlers/handleCodexSocketMessage.ts +204 -0
- package/src/handlers/sessionSyncHandler.ts +308 -0
- package/src/hooks/useCodexSocket.ts +109 -0
- package/src/index.ts +1 -1
- package/src/panel.tsx +1 -4131
- package/src/protocol.ts +582 -0
- package/style/index.css +424 -11
- package/tests/e2e/fixtures/notebooks/tab1.ipynb +322 -0
- package/tests/e2e/fixtures/notebooks/tab1.py +272 -0
- package/tests/e2e/fixtures/notebooks/tab2.ipynb +252 -0
- package/tests/e2e/fixtures/notebooks/tab2.py +231 -0
- package/tests/e2e/fixtures/notebooks/tab3.ipynb +403 -0
- package/tests/e2e/fixtures/notebooks/tab3.py +331 -0
- package/tests/e2e/fixtures/notebooks/tab4.py +339 -0
- package/tests/e2e/freeze-notebook-tabs-repro.spec.js +295 -0
- package/tests/e2e/mock-codex-cli-flood.py +127 -0
- package/tests/e2e/mock-codex-cli.py +95 -0
- package/tests/e2e/queue-multitab-repro.spec.js +189 -0
- package/tests/test_handlers.py +116 -0
- package/tests/test_protocol.py +169 -0
- package/tests/test_session_store_limits.py +50 -0
- package/tests/unit/codexChatAttachmentDedup.spec.ts +56 -0
- package/tests/unit/codexChatAttachmentLimit.spec.ts +42 -0
- package/tests/unit/codexChatLimit.spec.ts +18 -0
- package/tests/unit/codexChatNotice.spec.ts +45 -0
- package/tests/unit/codexChatPersistence.spec.ts +199 -0
- package/tests/unit/codexChatSessionFactory.spec.ts +94 -0
- package/tests/unit/codexChatSessionKey.spec.ts +18 -0
- package/tests/unit/codexMessageUtils.spec.ts +89 -0
- package/tests/unit/codexSessionResolver.spec.ts +92 -0
- package/tests/unit/handleCodexSocketMessage.spec.ts +476 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/webpack.config.js +6 -0
- package/jupyterlab_codex/labextension/static/504.335f3447c84ba3d74517.js +0 -2
- package/jupyterlab_codex/labextension/static/972.d43137b7438a053eeb72.js +0 -1
- /package/jupyterlab_codex/labextension/static/{504.335f3447c84ba3d74517.js.LICENSE.txt → 525.224526d045c727069de6.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkjupyterlab_codex_sidebar=self.webpackChunkjupyterlab_codex_sidebar||[]).push([[972],{8972(e,n,t){t.r(n),t.d(n,{default:()=>Ye});var o=t(5285),r=t(2931),a=t(4848),i=t(3345),s=t(7628),d=t(1125),c=t(4526),l=t(4281),p=t(405),x=t(2707),u=t(520);function f(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M12 5v14M5 12h14",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})}function m(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M12 19V5m0 0l-7 7m7-7l7 7",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function g(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M12 5v14m0 0l-7-7m7 7l7-7",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function h(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("rect",{x:"7",y:"7",width:"10",height:"10",rx:"2.2",stroke:"currentColor",strokeWidth:"2"})})}function b(e){return(0,a.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:[(0,a.jsx)("rect",{x:"3",y:"5",width:"18",height:"14",rx:"2.2",stroke:"currentColor",strokeWidth:"2"}),(0,a.jsx)("circle",{cx:"8.5",cy:"10",r:"1.5",fill:"currentColor"}),(0,a.jsx)("path",{d:"M21 16l-5.2-5.2a1 1 0 0 0-1.4 0L8.2 17 6 14.8a1 1 0 0 0-1.4 0L3 16.4",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}function v(e){return(0,a.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:[(0,a.jsx)("path",{d:"M12 15.2a3.2 3.2 0 1 0 0-6.4 3.2 3.2 0 0 0 0 6.4Z",stroke:"currentColor",strokeWidth:"2"}),(0,a.jsx)("path",{d:"M19.4 12a7.5 7.5 0 0 0-.1-1l2-1.6-1.9-3.2-2.4 1a8 8 0 0 0-1.8-1l-.4-2.5H9.2l-.4 2.5a8 8 0 0 0-1.8 1l-2.4-1-1.9 3.2 2 1.6a7.5 7.5 0 0 0 0 2l-2 1.6 1.9 3.2 2.4-1a8 8 0 0 0 1.8 1l.4 2.5h5.6l.4-2.5a8 8 0 0 0 1.8-1l2.4 1 1.9-3.2-2-1.6c.1-.3.1-.7.1-1Z",stroke:"currentColor",strokeWidth:"2",strokeLinejoin:"round"})]})}function j(e){return(0,a.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:[(0,a.jsx)("path",{d:"M5 16a7 7 0 1 1 14 0",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,a.jsx)("path",{d:"M12 13l3.5-3.5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,a.jsx)("path",{d:"M5 16h14",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})}function C(e){const{effort:n,effortOptions:t=[],...o}=e;if("__config__"===n)return(0,a.jsx)(j,{...o});const r=function(e,n){if(!e||"__config__"===e)return 0;if(n.length<=0)return 0;const t=n.findIndex(n=>n.value===e);if(t<0)return 0;if(1===n.length)return 1;return Math.max(1,Math.min(4,Math.floor(3*t/(n.length-1))+1))}(n,t);return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...o,children:[{x:6,top:14},{x:10,top:10},{x:14,top:6},{x:18,top:2}].map((e,n)=>(0,a.jsx)("path",{d:`M${e.x} 20V${e.top}`,stroke:"currentColor",strokeWidth:"2.6",strokeLinecap:"round",opacity:n<r?1:.25},n))})}function y(e){const{level:n,...t}=e,o="number"==typeof n&&Number.isFinite(n)?Math.min(1,Math.max(0,n)):null,r=null==o?0:Math.max(0,Math.round(14*o)),i=null==o;return(0,a.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...t,children:[(0,a.jsx)("rect",{x:"2",y:"7",width:"18",height:"10",rx:"2.5",stroke:"currentColor",strokeWidth:"2",strokeDasharray:i?"4 2":void 0}),(0,a.jsx)("rect",{x:"21",y:"10",width:"2",height:"4",rx:"1",fill:"currentColor",opacity:.85}),r>0&&(0,a.jsx)("rect",{x:"4",y:"9",width:r,height:"6",rx:"1.4",fill:"currentColor",opacity:.9})]})}function w(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M12 2.8 19 5.9v6.2c0 5-3 9.2-7 9.9-4-.7-7-4.9-7-9.9V5.9l7-3.1Z",stroke:"currentColor",strokeWidth:"2",strokeLinejoin:"round"})})}function k(e){const{open:n,anchorRef:t,popoverRef:o,className:r,role:d="dialog",align:c="left",ariaLabel:l,onMouseEnter:p,onMouseLeave:x,children:u}=e,[f,m]=(0,i.useState)(()=>({left:0,top:0,visibility:"hidden"}));return(0,i.useLayoutEffect)(()=>{if(!n)return;const e=()=>{const e=t.current,n=o.current;if(!e||!n)return;const r=window.innerWidth,a=window.innerHeight,i=e.getBoundingClientRect(),s=n.getBoundingClientRect();let d="right"===c?i.right-s.width:i.left;d=ge(d,8,Math.max(8,r-s.width-8));let l=i.top-10-s.height;const p=i.bottom+10;l<8&&p+s.height+8<=a&&(l=p),l=ge(l,8,Math.max(8,a-s.height-8)),m({left:Math.round(d),top:Math.round(l),visibility:"visible"})},r=window.requestAnimationFrame(e),a=()=>e(),i=()=>e();return window.addEventListener("resize",a),window.addEventListener("scroll",i,!0),()=>{window.cancelAnimationFrame(r),window.removeEventListener("resize",a),window.removeEventListener("scroll",i,!0)}},[n,t,o]),n?(0,s.createPortal)((0,a.jsx)("div",{ref:o,className:"jp-CodexMenu jp-CodexMenuPortal"+(r?` ${r}`:""),role:d,"aria-label":l,style:f,onMouseEnter:p,onMouseLeave:x,children:u}),document.body):null}function S(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M20 6 9 17l-5-5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function N(e){return(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",focusable:"false",...e,children:(0,a.jsx)("path",{d:"M18 6 6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}l.marked.use((0,p.default)({throwOnError:!1}));class M extends o.ReactWidget{constructor(e){super(),this._notebooks=e,this.addClass("jp-CodexPanel")}render(){return(0,a.jsx)($e,{notebooks:this._notebooks})}onAfterAttach(e){super.onAfterAttach(e),this.focusComposer()}onActivateRequest(e){super.onActivateRequest(e),this.focusComposer()}focusComposer(){window.setTimeout(()=>{const e=this.node.querySelector(".jp-CodexComposer textarea");if(!e||e.disabled)return;e.focus({preventScroll:!0});const n=e.value.length;e.setSelectionRange(n,n)},0)}}const B=[],$=[{label:"Default permission",value:"workspace-write"},{label:"Full access",value:"danger-full-access"}],_="jupyterlab-codex:auto-save-before-send",R="jupyterlab-codex:model",P="jupyterlab-codex:command-path",A="jupyterlab-codex:reasoning-effort",z="jupyterlab-codex:sandbox-mode",I="jupyterlab-codex:settings-open",U="jupyterlab-codex:notify-on-done",L="jupyterlab-codex:notify-on-done-min-seconds",E="jupyterlab-codex:include-active-cell",O="jupyterlab-codex:include-active-cell-output",D="jupyterlab-codex:session-threads",F="jupyterlab-codex:session-threads:event",W="jupyterlab-codex:delete-all-pending";function T(e,n){const t=n.find(n=>n.value===e);return t?t.label:ue(e,32)}function J(e){return"string"==typeof e?e.trim().toLowerCase():""}function K(e){return"string"==typeof e?e.trim():""}function H(e){return"string"==typeof e?K(e):e&&"object"==typeof e&&"reasoningEffort"in e?K(e.reasoningEffort):""}function q(e){if(!Array.isArray(e))return[];const n=new Set,t=[];for(const o of e){if(!o||"object"!=typeof o)continue;const e=o.model,r=o.displayName,a=o.defaultReasoningEffort,i=o.reasoningEfforts??o.supportedReasoningEfforts;if("string"!=typeof e)continue;const s=e.trim();if(!s||n.has(s))continue;n.add(s);const d="string"==typeof r&&r.trim()?r.trim():s,c=H(a),l=Array.isArray(i)?i.reduce((e,n)=>{const t=H(n);return!t||e.includes(t)||e.push(t),e},[]):[];t.push({model:s,displayName:d,...l.length>0?{reasoningEfforts:l}:{},...c?{defaultReasoningEffort:c}:{}})}return t}function Y(e,n){const t=n.find(n=>n.value===e);if(t)return t.label;return K(e)||"Reasoning"}function V(e){return(e||"").trim()||""}function Z(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.floor(4294967296*Math.random()).toString(16)}`}function G(e){if(!e)return{path:""};const n=e.indexOf("\0");return n<0?{path:e}:{path:e.slice(0,n)}}function Q(){const e=te(D);if(!e)return{};try{const n=JSON.parse(e);if(!n||"object"!=typeof n)return{};const t={};for(const[e,o]of Object.entries(n)){if(!e||"string"!=typeof o)continue;const n=o.trim();n&&(t[e]=n)}return t}catch{return{}}}function X(){const e=Q(),n=new Set;for(const t of Object.keys(e)){const{path:e}=G(t);e&&n.add(e)}return n.size}function ee(e,n,t){const o=ie("system",n||"Session started"),r=(t?.threadId||"").trim(),a=!1===t?.reuseStoredThread?"":function(e,n){const t=e.trim(),o=n||"";if(!o)return"";const r=Q(),a=r[o];if(a)return a;if(!t)return"";for(const[e,n]of Object.entries(r))if(n&&G(e).path===t)return n;return""}(e,t?.sessionKey||"");return{threadId:r||a||crypto.randomUUID(),runState:"ready",activeRunId:null,runStartedAt:null,progress:"",progressKind:"",messages:[{kind:"text",id:crypto.randomUUID(),role:"system",text:o}],pairedOk:null,pairedPath:"",pairedOsPath:"",pairedMessage:""}}function ne(e,n,t){return ee(e,`Session started (${(new Date).toLocaleTimeString()})`,{threadId:t,reuseStoredThread:!1,sessionKey:n})}function te(e){if("undefined"==typeof window)return null;try{return window.localStorage.getItem(e)}catch{return null}}function oe(e){const n=e.trim();if(!n.endsWith(")"))return{rest:n,value:null};const t=n.lastIndexOf("(");if(t<0)return{rest:n,value:null};const o=n.slice(t+1,-1).trim();return o?{rest:n.slice(0,t).trimEnd(),value:o}:{rest:n,value:null}}function re(e,n){return`${e}${n?` (${n})`:""}`}function ae(e){const n=e.trim();if(n.startsWith("세션 시작")){const{rest:e,value:t}=oe(n);if(e.startsWith("세션 시작"))return re("Session started",t)}if(n.toLowerCase().startsWith("session started")){const{rest:e,value:t}=oe(n);if(e.toLowerCase().startsWith("session started"))return re("Session started",t)}return null}function ie(e,n){return"system"!==e?n:ae(n)??n}function se(e){if(null!==ae(e))return!0;const n=e.trimStart();if(n.startsWith("새 스레드 시작:"))return!0;const t=n.toLowerCase();return t.startsWith("session start:")||t.startsWith("new thread started:")||t.startsWith("new thread started")}function de(e,n){if("undefined"!=typeof window)try{window.localStorage.setItem(e,n)}catch{}}function ce(e){if("undefined"!=typeof window)try{window.localStorage.removeItem(e)}catch{}}function le(){de(W,"1")}function pe(){return"1"===te(W)}function xe(){return"undefined"==typeof window||void 0===window.Notification?"unsupported":window.Notification.permission}function ue(e,n){if(e.length<=n)return e;if(n<=3)return e.slice(0,n);const t=Math.max(0,Math.floor(.6*(n-3))),o=Math.max(0,n-t-3);return`${e.slice(0,t)}...${e.slice(e.length-o)}`}function fe(e,n=220){if(null==e)return"";if("string"==typeof e)return ue(e,n);if("number"==typeof e||"boolean"==typeof e)return String(e);try{return ue(JSON.stringify(e),n)}catch{return""}}function me(e){return e&&"object"==typeof e?{usedPercent:"number"==typeof e.usedPercent&&Number.isFinite(e.usedPercent)?e.usedPercent:null,windowMinutes:"number"==typeof e.windowMinutes&&Number.isFinite(e.windowMinutes)?Math.round(e.windowMinutes):null,resetsAt:"number"==typeof e.resetsAt&&Number.isFinite(e.resetsAt)?Math.round(e.resetsAt):null}:null}function ge(e,n,t){return Math.min(t,Math.max(n,e))}function he(e){return"number"==typeof e&&Number.isFinite(e)?Math.round(ge(100-e,0,100)):null}function be(e){if(!Number.isFinite(e))return"0m";const n=Math.max(0,Math.floor(e/6e4)),t=Math.floor(n/1440),o=Math.floor(n%1440/60),r=n%60;return t>0?`${t}d ${o}h`:o>0?`${o}h ${r}m`:`${r}m`}function ve(e){if(!Number.isFinite(e))return"0s";const n=Math.max(0,Math.round(e/1e3)),t=Math.floor(n/60),o=n%60;return t>0?`${t}m ${o}s`:`${o}s`}function je(e,n){if("number"!=typeof e||!Number.isFinite(e))return"Unknown";const t=1e3*e-n;return t<=0?"Overdue":be(t)}function Ce(e,n){return e.length<=n?e:n<=3?e.slice(0,n):`${e.slice(0,n-3)}...`}function ye(e,n=6e3){try{const t=JSON.stringify(e,null,2);return t.length<=n?t:`${t.slice(0,Math.max(0,n-40))}\n... (truncated)`}catch{return""}}function we(e){const n=(e||"").trim();return n?n.split(/[_-]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" "):""}async function ke(e){return await new Promise((n,t)=>{const o=new FileReader;o.onload=()=>n(String(o.result||"")),o.onerror=()=>t(o.error||new Error("Failed to read blob")),o.readAsDataURL(e)})}function Se(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""").replace(/'/g,"'")}function Ne(e){const n="disconnected"===e.status?"Disconnected":"running"===e.status?"Running":"Ready";return(0,a.jsx)("span",{className:`jp-CodexStatusPill jp-CodexStatusPill-${e.status}`,role:"img","aria-label":n,title:n,children:(0,a.jsx)("span",{className:"jp-CodexStatusPill-dot","aria-hidden":"true"})})}function Me(e){const[n,t]=(0,i.useState)(!1),o=(0,i.useMemo)(()=>function(e,n){const t=Se(e);let o=t;try{const t=function(e){const n=e.trim().toLowerCase();return n?{js:"javascript",jsx:"javascript",mjs:"javascript",cjs:"javascript",ts:"typescript",tsx:"typescript",py:"python",sh:"bash",shell:"bash",zsh:"bash",yml:"yaml","c++":"cpp","c#":"csharp","objective-c":"objectivec",objc:"objectivec"}[n]??n:""}(n);o=t&&u.A.getLanguage(t)?u.A.highlight(e,{language:t,ignoreIllegals:!0}).value:u.A.highlightAuto(e).value}catch{o=t}try{return x.default.sanitize(o,{USE_PROFILES:{html:!0}})}catch{return o}}(e.code,e.lang),[e.code,e.lang]);return(0,a.jsxs)("div",{className:"jp-CodexCodeBlockWrap",children:[(0,a.jsxs)("div",{className:"jp-CodexCodeBlockBar",children:[(0,a.jsx)("span",{className:"jp-CodexCodeBlockMeta",children:e.lang?(0,a.jsx)("span",{className:"jp-CodexCodeBlockLang",children:e.lang}):(0,a.jsx)("span",{})}),e.canCopy&&(0,a.jsx)("button",{className:"jp-CodexBtn jp-CodexBtn-ghost jp-CodexBtn-xs jp-CodexCodeBlockCopyBtn",onClick:()=>{!async function(){await async function(e){if(!e)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{try{const n=document.createElement("textarea");n.value=e,n.setAttribute("readonly","true"),n.style.position="fixed",n.style.left="-9999px",document.body.appendChild(n),n.select();const t=document.execCommand("copy");return document.body.removeChild(n),t}catch{return!1}}}(e.code)&&(t(!0),window.setTimeout(()=>t(!1),900))}()},children:n?"Copied":"Copy"})]}),(0,a.jsx)("pre",{className:"jp-CodexCodeBlock",children:(0,a.jsx)("code",{className:"hljs",dangerouslySetInnerHTML:{__html:o}})})]})}function Be(e){const n=function(e){const n=[];let t=e;for(;t.length>0;){const e=t.indexOf("```");if(-1===e){n.push({kind:"text",text:t});break}e>0&&n.push({kind:"text",text:t.slice(0,e)});const o=t.slice(e+3),r=o.indexOf("```");if(-1===r){n.push({kind:"text",text:t.slice(e)});break}const a=o.slice(0,r);t=o.slice(r+3);let i="",s=a;const d=a.indexOf("\n");if(-1!==d){const e=a.slice(0,d).trim();e.length>0&&e.length<=20&&/^[A-Za-z0-9+#_.-]+$/.test(e)&&(i=e,s=a.slice(d+1))}n.push({kind:"code",lang:i,code:s.replace(/\n$/,"")})}return n.filter(e=>"text"!==e.kind||e.text.length>0)}(e.text);return(0,a.jsx)("div",{className:"jp-CodexChat-text",children:n.map((n,t)=>{if("code"===n.kind)return(0,a.jsx)(Me,{lang:n.lang,code:n.code,canCopy:Boolean(e.canCopyCode)},t);const o=function(e){if(!e)return"";const n=function(e){return e.replace(/(^|[^\\])\\\[([\s\S]*?)\\\]/g,(e,n,t)=>`${n}\n$$\n${t}\n$$\n`).replace(/(^|[^\\])\\\((.+?)\\\)/g,(e,n,t)=>`${n}$${t}$`).replace(/(^|\n)[ \t]*\[\s*\n([\s\S]*?)\n[ \t]*\](?=\n|$)/g,(e,n,t)=>{const o=t.trim();return(r=o)&&(/\\[A-Za-z]+/.test(r)||/[_^{}]/.test(r))?`${n}\n$$\n${o}\n$$\n`:`${n}[\n${t}\n]`;var r})}(e);let t="";try{t=l.marked.parse(n,{gfm:!0,breaks:!0})}catch{return Se(e).replace(/\n/g,"<br />")}try{return x.default.sanitize(t,{USE_PROFILES:{html:!0}})}catch{return t}}(n.text);return(0,a.jsx)("div",{className:"jp-CodexMarkdown",dangerouslySetInnerHTML:{__html:o}},t)})})}function $e(e){const[n,t]=(0,i.useState)(new Map),r=(0,i.useRef)(new Map),[s,l]=(0,i.useState)(""),p=(0,i.useRef)(""),[x,u]=(0,i.useState)(""),j=(0,i.useRef)(""),[M,K]=(0,i.useState)({model:null,reasoningEffort:null}),[Q,oe]=(0,i.useState)(()=>B),[re,ae]=(0,i.useState)(()=>{const e=te(R)??"";return e&&"__config__"!==e&&"__custom__"!==e?e:"__config__"}),[ge,Se]=(0,i.useState)(()=>function(){try{const e=te(A)??"";return"__config__"===e?"__config__":e.trim()||"__config__"}catch{return"__config__"}}()),[Me,$e]=(0,i.useState)(()=>function(){const e=te(z)??"";return n=e,$.some(e=>e.value===n)?e:$[0].value;var n}()),[Re,Pe]=(0,i.useState)(()=>te(P)??""),[ze,Ie]=(0,i.useState)(()=>"false"!==(te(_)??"true")),[Ue,Le]=(0,i.useState)(()=>"false"!==(te(E)??"true")),[Ee,Oe]=(0,i.useState)(()=>"false"!==(te(O)??"true")),[De,Fe]=(0,i.useState)(()=>"true"===(te(U)??"true")),[We,Te]=(0,i.useState)(()=>function(){const e=te(L);if(null==e)return 30;const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):0}()),[Je,Ke]=(0,i.useState)(()=>"true"===(te(I)??"false")),[He,qe]=(0,i.useState)(""),[Ye,Ve]=(0,i.useState)([]),Ze=(0,i.useRef)([]),[Ge,Qe]=(0,i.useState)(!1),[Xe,en]=(0,i.useState)(!1),[nn,tn]=(0,i.useState)(0),[on,rn]=(0,i.useState)(!0),[an,sn]=(0,i.useState)(!1),[dn,cn]=(0,i.useState)(!1),[ln,pn]=(0,i.useState)(!1),[xn,un]=(0,i.useState)(!1),[fn,mn]=(0,i.useState)(null),gn=(0,i.useRef)(null),hn=(0,i.useRef)(new Map),bn=(0,i.useRef)(new Map),vn=(0,i.useRef)(Z()),jn=(0,i.useRef)(0),Cn=(0,i.useRef)(new Set),yn=(0,i.useRef)(De),wn=(0,i.useRef)(We),kn=(0,i.useRef)(null),Sn=(0,i.useRef)(null),Nn=(0,i.useRef)(null),Mn=(0,i.useRef)(null),Bn=(0,i.useRef)(null),$n=(0,i.useRef)(null),_n=(0,i.useRef)(null),Rn=(0,i.useRef)(null),Pn=(0,i.useRef)(null),An=(0,i.useRef)(null),zn=(0,i.useRef)(null),In=(0,i.useRef)(null),Un=(0,i.useRef)(null),Ln=(0,i.useRef)(null),En=(0,i.useRef)(null),[On,Dn]=(0,i.useState)(!1),Fn=(0,i.useRef)(null),Wn=(0,i.useMemo)(()=>X(),[n]),Tn="__config__"===re?"":re,Jn="__config__"===ge?"":ge,Kn=M.model,Hn=M.reasoningEffort,qn="__config__"===re?Kn||"":re,Yn=(0,i.useMemo)(()=>function(e,n){const t=q(e),o=n.trim(),r=t.find(e=>e.model===o),a=r?.reasoningEfforts&&r.reasoningEfforts.length>0?r.reasoningEfforts:r?.defaultReasoningEffort?[r.defaultReasoningEffort]:t.flatMap(e=>e.reasoningEfforts??[]),i=new Map;for(const e of a){const n=H(e),t=J(n);t&&!i.has(t)&&i.set(t,{value:t,label:n||t})}return Array.from(i.values())}(M.availableModels,qn),[M.availableModels,qn]);function Vn(e){r.current=e,t(e)}function Zn(e){t(n=>{const t=e(n);return r.current=t,t})}function Gn(e){return V(e||"")}function Qn(e){return Gn(e)}function Xn(e,n){const t=e||"",o=n||Qn(t),a=r.current.get(o);if(a)return a;const i=ee(t,"Session started",{sessionKey:o}),s=new Map(r.current);return s.set(o,i),bn.current.set(t,o),Vn(s),i}function et(e,n,t,o){const r=gn.current;r&&r.readyState===WebSocket.OPEN&&r.send(JSON.stringify({type:"start_session",sessionId:e.threadId,notebookPath:n,sessionContextKey:t,forceNewThread:!0===o?.forceNewThread}))}function nt(){const e=gn.current;if(!e||e.readyState!==WebSocket.OPEN)return!1;try{return e.send(JSON.stringify({type:"delete_all_sessions"})),!0}catch{return!1}}function tt(e,n,t){if(!e)return;const o=Date.now();Zn(r=>{const a=new Map(r),i=a.get(e)??ee("","Session started",{sessionKey:e}),s=a.get(e)??i;let d=s.messages,c=s.runStartedAt;if("running"===n&&"running"!==s.runState&&(c=o),"ready"===n&&"running"===s.runState){const e=c;if("number"==typeof e&&Number.isFinite(e)){const n=Math.max(0,o-e);d=[...d,{kind:"run-divider",id:crypto.randomUUID(),elapsedMs:n}]}c=null}const l=s.runState===n?s.progress:"",p=s.runState===n?s.progressKind:"";return a.set(e,{...s,messages:d,runState:n,activeRunId:t,runStartedAt:c,progress:l,progressKind:p}),a})}function ot(e,n,t=""){const o=e||j.current||"";if(!o)return;const r=n?ue(n,260):"",a=r?t:"";Zn(e=>{const n=new Map(e),t=n.get(o)??ee("","Session started",{sessionKey:o});return t.progress===r&&t.progressKind===a?e:(n.set(o,{...t,progress:r,progressKind:a}),n)})}function rt(e,n){const t=e||j.current||"";t&&Zn(e=>{const o=new Map(e),r=o.get(t)??ee("","Session started",{sessionKey:t});return o.set(t,{...r,...n}),o})}function at(e,n,t){if(!t)return;const o=e||j.current||"";if(!o)return;const r=ie(n,t);Zn(e=>{const t=new Map(e),a=t.get(o)??ee("","Session started",{sessionKey:o}),i=[...a.messages,{kind:"text",id:crypto.randomUUID(),role:n,text:r}];return t.set(o,{...a,messages:i}),t})}function it(){Sn.current?.scrollIntoView({block:"end"})}function st(e){const n=hn.current,t=new Map(n);for(const[o,r]of n)r===e&&t.delete(o);hn.current=t}async function dt(n){const{path:t}=G(n);if(!t)return;const r=e.notebooks.currentWidget;if(!r||r.context.path!==t)return void Cn.current.add(n);const a=r.context;if(!a.model.dirty||(await(0,o.showDialog)({title:"Notebook has unsaved changes",body:"Codex updated the paired file. Reload notebook now? (Unsaved changes will be lost.)",buttons:[o.Dialog.cancelButton(),o.Dialog.okButton({label:"Reload"})]})).button.accept)try{await a.revert(),at(n,"system","Notebook was refreshed after Codex file updates."),Cn.current.delete(n)}catch(e){at(n,"system",`Failed to refresh notebook: ${String(e)}`),Cn.current.add(n)}else Cn.current.add(n)}function ct(e){const n=e??Fn.current;if(!n)return;n.style.height="auto";const t=window.getComputedStyle(n);let o=Number.parseFloat(t.minHeight||""),r=Number.parseFloat(t.maxHeight||"");if(!Number.isFinite(o)||o<=0){const e=Number.parseFloat(t.fontSize||"13");let n=Number.parseFloat(t.lineHeight||"");Number.isFinite(n)||(n=1.35*e),o=n}if(!Number.isFinite(r)||r<=0){const e=Number.parseFloat(t.fontSize||"13");let n=Number.parseFloat(t.lineHeight||"");Number.isFinite(n)||(n=1.35*e),r=3*n}const a=n.scrollHeight,i=0===n.value.length?o:a,s=Math.ceil(Math.min(Math.max(i,o),r));n.style.height=`${s}px`,n.style.overflowY=a>r+1?"auto":"hidden"}function lt(){for(const e of Ze.current)URL.revokeObjectURL(e.previewUrl);Ze.current=[],Ve([])}async function pt(){const n=gn.current,t=p.current||"",o=j.current||"";if(!t)return;if(!o)return;if(!n||n.readyState!==WebSocket.OPEN)return void at(o,"system","WebSocket is not connected.");const a=o?r.current.get(o):null;if(!1===a?.pairedOk)return void at(o,"system",a.pairedMessage||`Jupytext paired file not found. Expected: ${a.pairedOsPath||a.pairedPath||"<notebook>.py"}`);const i=He.trim(),s=Ze.current.length>0;if(!i&&!s)return;const d=o?r.current.get(o):null;if("running"===d?.runState)return;const c=e.notebooks.currentWidget;if(ze&&c&&c.context.model.dirty)try{await c.context.save()}catch(e){return void at(o,"system",`Auto-save failed: ${String(e)}`)}const l=Ue?function(e){const n=e.currentWidget;if(!n)return"";const t=n.content.activeCell;return t?t.model.sharedModel.getSource():""}(e.notebooks):"",x=Ue&&Ee?function(e){const n=e.currentWidget;if(!n)return"";const t=n.content.activeCell;if(!t)return"";try{const e=t.model,n="string"==typeof e?.type?e.type:"";if(n&&"code"!==n)return"";const o="function"==typeof e?.toJSON?e.toJSON():null;return function(e){if(!Array.isArray(e)||0===e.length)return"";let n="",t=0,o=!1;for(const r of e){if(t>=24){o=!0;break}const e=Ae(r);if(!e)continue;t+=1;const a=n?"\n\n":"",i=6e3-n.length-a.length;if(i<=0){o=!0;break}const s=e.length>i?e.slice(0,i):e;if(n+=a+s,s.length!==e.length){o=!0;break}}return n=n.replace(/\s+$/,""),n?(o&&(n+="\n\n... (truncated)"),n):""}(o&&Array.isArray(o.outputs)?o.outputs:[])}catch{return""}}(e.notebooks):"",u=Xn(t,o),f=i||(s?"Please analyze the attached image(s).":"");let m;if(s)try{m=[];for(const e of Ze.current){const n=await ke(e.file);m.push({name:e.file.name||"clipboard-image",dataUrl:n})}}catch(e){return void at(o,"system",`Failed to attach image(s): ${String(e)}`)}n.send(JSON.stringify({type:"send",sessionId:u.threadId,sessionContextKey:o,content:f,selection:l,cellOutput:x,notebookPath:t,commandPath:Re.trim()||void 0,model:Tn||void 0,reasoningEffort:Jn||void 0,sandbox:Me,images:m}));const g=Ze.current.length;Zn(e=>{const n=new Map(e),t=n.get(o)??ee("","Session started",{sessionKey:o}),r=[...t.messages,{kind:"text",id:crypto.randomUUID(),role:"user",text:f,attachments:g>0?{images:g}:void 0}];return n.set(o,{...t,messages:r,runState:"running",activeRunId:null,runStartedAt:Date.now(),progress:"",progressKind:""}),n}),qe(""),lt()}(0,i.useEffect)(()=>{const e=q(M.availableModels).map(e=>({label:e.displayName,value:e.model}));oe(e)},[M.availableModels]),(0,i.useEffect)(()=>{"__config__"!==ge&&(Yn.some(e=>e.value===ge)||Se("__config__"))},[ge,Yn]),(0,i.useEffect)(()=>{"__config__"!==re&&(Q.some(e=>e.value===re)||ae("__config__"))},[re,Q]),(0,i.useEffect)(()=>{r.current=n,j.current=x},[n]),(0,i.useEffect)(()=>{j.current=x,function(e){const n={};for(const[t,o]of e)t&&o?.threadId&&(n[t]=o.threadId);try{de(D,JSON.stringify(n))}catch{}}(n)},[n,x]),(0,i.useEffect)(()=>{Ze.current=Ye},[Ye]),(0,i.useEffect)(()=>()=>{for(const e of Ze.current)URL.revokeObjectURL(e.previewUrl)},[]),(0,i.useEffect)(()=>{de(R,Tn)},[Tn]),(0,i.useEffect)(()=>{de(_,ze?"true":"false")},[ze]),(0,i.useEffect)(()=>{de(E,Ue?"true":"false")},[Ue]),(0,i.useEffect)(()=>{Ue&&!Ee&&null===te(O)&&Oe(!0)},[Ue,Ee]),(0,i.useEffect)(()=>{de(O,Ee?"true":"false")},[Ee]),(0,i.useEffect)(()=>{!function(e){de(P,e)}(Re)},[Re]),(0,i.useEffect)(()=>{de(A,ge)},[ge]),(0,i.useEffect)(()=>{de(z,Me)},[Me]),(0,i.useEffect)(()=>{de(I,Je?"true":"false")},[Je]),(0,i.useEffect)(()=>{yn.current=De,de(U,De?"true":"false")},[De]),(0,i.useEffect)(()=>{const e=Number.isFinite(We)?Math.max(0,Math.floor(We)):0;var n;wn.current=e,n=e,de(L,String(Math.max(0,Math.trunc(n))))},[We]),(0,i.useEffect)(()=>{if(!(an||dn||ln||xn))return;const e=e=>{const n=e.target;if(!n)return;const t=Nn.current?.contains(n)??!1,o=Mn.current?.contains(n)??!1,r=Bn.current?.contains(n)??!1,a=$n.current?.contains(n)??!1,i=Rn.current?.contains(n)??!1,s=An.current?.contains(n)??!1,d=In.current?.contains(n)??!1,c=Ln.current?.contains(n)??!1;t||o||r||a||i||s||d||c||(sn(!1),cn(!1),pn(!1),un(!1))},n=e=>{"Escape"===e.key&&(e.preventDefault(),sn(!1),cn(!1),pn(!1),un(!1))};return window.addEventListener("pointerdown",e,!0),window.addEventListener("keydown",n),()=>{window.removeEventListener("pointerdown",e,!0),window.removeEventListener("keydown",n)}},[an,dn,ln,xn]),(0,i.useEffect)(()=>{const n=()=>{const n=_e(e.notebooks),t=Gn(n),o=j.current;if(t&&t===o)return;if(p.current=n,l(n),u(t),j.current=t,qe(""),lt(),rn(!0),!n)return;const r=Xn(n,t);bn.current.set(n,t),et(r,n,t),Cn.current.has(t)&&dt(t)};return n(),e.notebooks.currentChanged.connect(n),()=>{e.notebooks.currentChanged.disconnect(n)}},[e.notebooks]),(0,i.useEffect)(()=>{const e=e=>{if(e.key!==F||!e.newValue)return;const n=function(e){if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}if(!n||"object"!=typeof n)return null;const t=n,o="string"==typeof t.sessionKey?t.sessionKey.trim():"",r="string"==typeof t.notebookPath?t.notebookPath.trim():"",a="string"==typeof t.threadId?t.threadId.trim():"",i="string"==typeof t.source?t.source.trim():"",s="string"==typeof t.id?t.id.trim():"";return o&&r&&a&&s&&"new-thread"===t.kind?{kind:"new-thread",sessionKey:o,notebookPath:r,threadId:a,source:i,id:s,issuedAt:"number"==typeof t.issuedAt&&Number.isFinite(t.issuedAt)?t.issuedAt:Date.now()}:null}(e.newValue);if(!n)return;if(n.source===vn.current)return;const t=n.notebookPath,o=n.sessionKey,r=n.threadId;if(!t||!o||!r)return;const a=Gn(t);if(!a||a!==o)return;const i=ne(t,o,r),s=p.current;Zn(e=>{const n=new Map(e),t=n.get(o);return t&&t.threadId===r?e:(n.set(o,i),n)}),bn.current.set(t,o),st(o),s===t&&j.current!==o&&u(o),s===t&&(qe(""),lt()),et(i,t,o)};return window.addEventListener("storage",e),()=>{window.removeEventListener("storage",e)}},[]),(0,i.useEffect)(()=>{en(!0);const n=d.ServerConnection.makeSettings(),t=c.URLExt.join(n.wsUrl,"codex","ws");let o;try{o=new WebSocket(t)}catch{return Qe(!1),void en(!1)}return gn.current=o,o.onopen=()=>{Qe(!0),en(!1),pe()&&nt();const n=p.current||_e(e.notebooks);if(!n)return;const t=Qn(n);et(Xn(n,t),n,t)},o.onclose=()=>{Qe(!1),en(!1),hn.current=new Map},o.onerror=()=>{Qe(!1),en(!1)},o.onmessage=e=>{let n;try{n=JSON.parse(e.data)}catch(n){return void at(j.current||"","system",`Invalid message: ${String(e.data)}`)}const t="string"==typeof n.runId?n.runId:"",o=function(e){const n="string"==typeof e.notebookPath?e.notebookPath:"",t="string"==typeof e.sessionContextKey?e.sessionContextKey:"";if(t)return t;const o="string"==typeof e.runId?e.runId:"";if(o){const e=hn.current.get(o);if(e)return e}if(n){if(o){const e=bn.current.get(n);if(e)return hn.current.set(o,e),e}return bn.current.get(n)||V(n)}if(o){const e=hn.current.get(o);if(e)return e}return j.current||""}(n);if("cli_defaults"===n.type){const e=Object.prototype.hasOwnProperty.call(n,"model"),t=Object.prototype.hasOwnProperty.call(n,"reasoningEffort"),o=Object.prototype.hasOwnProperty.call(n,"availableModels"),r=e&&"string"==typeof n.model&&n.model.trim()?n.model.trim():null,a=t?J("string"==typeof n.reasoningEffort?n.reasoningEffort:""):null,i=Array.isArray(n.availableModels)?n.availableModels:void 0,s=i?q(i):void 0;return void K(n=>({model:e?r:n.model,reasoningEffort:t?a:n.reasoningEffort,availableModels:o?s:n.availableModels}))}if("rate_limits"!==n.type){var a;if("delete_all_sessions"===n.type){const e=!0===n.ok;e&&ce(W);const t=Number.isFinite(Number(n.deletedCount))?Number(n.deletedCount):0,o=Number.isFinite(Number(n.failedCount))?Number(n.failedCount):0,r=1===t?"Deleted 1 conversation":`Deleted ${t} conversations`,a=j.current,i=e?`${r} from the server.`:`${r} from the server. Failed to delete ${o} conversations. ${"string"==typeof n.message?n.message:"Server error"}. Retry after reconnect.`;return a&&at(a,"system",i),void(e||pe()||le())}if("status"===n.type){const e="string"==typeof n.sessionId&&n.sessionId.trim()?n.sessionId.trim():"",r=function(e){if(!Array.isArray(e))return[];const n=[];for(const t of e){if(!t||"object"!=typeof t)continue;const e=t.role,o=t.content;"user"!==e&&"assistant"!==e&&"system"!==e||"string"!=typeof o||n.push({role:e,content:o})}return n}(n.history);if(o&&(e||r.length>0)&&Zn(n=>{const t=new Map(n),a=t.get(o)??ee("","Session started",{sessionKey:o}),i=e||a.threadId;let s=a.messages;return!a.messages.some(e=>"text"===e.kind&&("user"===e.role||"assistant"===e.role))&&r.length>0&&(s=[a.messages.find(e=>"text"===e.kind&&"system"===e.role&&se(e.text))??{kind:"text",id:crypto.randomUUID(),role:"system",text:ie("system","Session started")},...r.map(e=>({kind:"text",id:crypto.randomUUID(),role:e.role,text:ie(e.role,e.content)}))]),i===a.threadId&&s===a.messages?n:(t.set(o,{...a,threadId:i,messages:s}),t)}),o){const e="boolean"==typeof n.pairedOk?n.pairedOk:null,t="string"==typeof n.pairedPath?n.pairedPath:"",r="string"==typeof n.pairedOsPath?n.pairedOsPath:"",a="string"==typeof n.pairedMessage?n.pairedMessage:"";(null!==e||t||r||a)&&rt(o,{pairedOk:e,pairedPath:t,pairedOsPath:r,pairedMessage:a})}return void("running"===n.state&&o?(tt(o,"running",t||null),ot(o,"","")):"ready"===n.state&&o&&t&&(tt(o,"ready",null),ot(o,"",""),hn.current.delete(t)))}if("output"!==n.type){if("event"===n.type){const e=n.payload;if(function(e){if(!e||"object"!=typeof e)return!1;const n="string"==typeof e.type&&e.type||"string"==typeof e.event&&e.event||"";return"thread.started"===n||"turn.started"===n||"turn.completed"===n}(e))return;const t=function(e){if(!e||"object"!=typeof e)return{progress:"Event",progressKind:"",activity:{category:"event",phase:"",title:"Event",detail:"",raw:ye(e)}};const n="string"==typeof e.type&&e.type||"string"==typeof e.event&&e.event||"event",t=ye(e);if(("item.completed"===n||"item.started"===n)&&e.item&&"object"==typeof e.item){const o=e.item,r="string"==typeof o.type?o.type:"",a="string"==typeof o.tool_name&&o.tool_name||"string"==typeof o.tool&&o.tool||"string"==typeof o.name&&o.name||"",i="string"==typeof o.path&&o.path||"string"==typeof o.filename&&o.filename||"",s="item.started"===n?"started":"item.completed"===n?"completed":"";let d="event",c="";"reasoning"===r?(d="reasoning",c="reasoning"):"command_execution"===r?d="command":"file_change"===r?d="file":a&&(d="tool");let l="",p="";if("command_execution"===r){const e=o.command??o.cmd??o.shell_command??o.argv??o.args??o.commandLine??o.command_line;let n="";n="string"==typeof e?e:Array.isArray(e)&&e.length>0&&e.every(e=>"string"==typeof e)?e.join(" "):fe(e);const t="number"==typeof o.exit_code?o.exit_code:"number"==typeof o.exitCode?o.exitCode:null;l="started"===s?"Running command":"completed"===s?"Command finished":"Command",p=n||"",null!=t&&(p=p?`${p}\n(exit ${t})`:`(exit ${t})`)}else if("file_change"===r)l="started"===s?"Update file":"completed"===s?"File updated":"File change",p=i||"";else if("reasoning"===r)l="started"===s?"Reasoning":"completed"===s?"Reasoning step":"Reasoning",p=a?`(${a})`:"";else{const e=we(r)||we(n)||"Event";l="started"===s?`${e} started`:"completed"===s?`${e} completed`:e;const t=[];a&&t.push(`tool: ${a}`),i&&t.push(`path: ${i}`),p=t.join("\n")}l||(l=we(r)||"Event"),p=Ce(p,1400);const x=[];if(l&&x.push(l),p){const e=p.replace(/\s+/g," ").trim();x.push(ue(e,200))}return{progress:x.join(": ")||we(n)||"Event",progressKind:c,activity:{category:d,phase:s,title:l,detail:p,raw:t}}}const o="string"==typeof e.name&&e.name||"string"==typeof e.label&&e.label||"string"==typeof e.tool_name&&e.tool_name||"string"==typeof e.tool&&e.tool||"";if(o&&o!==n)return{progress:`${we(n)||n}: ${ue(o,120)}`,progressKind:"",activity:{category:"event",phase:"",title:we(n)||n,detail:o,raw:t}};const r=fe(e.command);if(r)return{progress:`${we(n)||n}: ${r}`,progressKind:"",activity:{category:"event",phase:"",title:we(n)||n,detail:r,raw:t}};const a=fe(e.path);return a?{progress:`${we(n)||n}: ${a}`,progressKind:"",activity:{category:"event",phase:"",title:we(n)||n,detail:a,raw:t}}:{progress:we(n)||n,progressKind:"",activity:{category:"event",phase:"",title:we(n)||n,detail:"",raw:t}}}(e);return"reasoning"!==t.activity.category&&function(e,n){const t=e||j.current||"";t&&Zn(e=>{const o=new Map(e),r=o.get(t)??ee("","Session started",{sessionKey:t}),a={id:crypto.randomUUID(),ts:Date.now(),...n},i=e=>{const n=(e||"").trim();return n?n.split("\n")[0].trim():""},s=(e,n)=>{const t=(e=>{const n=(e||"").trim();return n?n.replace(/\s+(started|completed)\s*$/i,"").trim():""})(e);return`${t}::${(n||"").trim().split("\n")[0].trim()}`},d=r.messages;if("reasoning"===a.category){const n=d[d.length-1];if(n&&"activity"===n.kind){const t=n.item;if(t.category===a.category&&t.phase===a.phase&&t.title===a.title&&t.detail===a.detail)return e}}if("command"===a.category&&"completed"===a.phase){const e=i(a.detail);if(e)for(let n=d.length-1;n>=0;n-=1){const s=d[n];if("activity"!==s.kind)continue;const c=s.item;if("command"!==c.category||"started"!==c.phase)continue;if(i(c.detail)!==e)continue;const l={...c,phase:"completed",title:a.title,detail:a.detail,raw:a.raw},p=[...d.slice(0,n),{...s,item:l},...d.slice(n+1)];return o.set(t,{...r,messages:p}),o}}if("completed"===a.phase){const e=s(a.title,a.detail);if(e)for(let n=d.length-1;n>=0;n-=1){const i=d[n];if("activity"!==i.kind)continue;const c=i.item;if("started"!==c.phase)continue;if(s(c.title,c.detail)!==e)continue;const l={...c,phase:"completed",title:a.title,detail:a.detail,raw:a.raw},p=[...d.slice(0,n),{...i,item:l},...d.slice(n+1)];return o.set(t,{...r,messages:p}),o}}const c=[...d,{kind:"activity",id:a.id,item:a}];return o.set(t,{...r,messages:c}),o})}(o,t.activity),void ot(o,t.progress,t.progressKind)}if("error"===n.type){const e="string"==typeof n.suggestedCommandPath?n.suggestedCommandPath.trim():"";if(e&&!Re&&(Pe(e),at(o,"system",`Suggested command path has been saved to settings: ${e}`)),at(o,"system",n.message||"Unknown error"),o){const e="boolean"==typeof n.pairedOk?n.pairedOk:null,t="string"==typeof n.pairedPath?n.pairedPath:"",r="string"==typeof n.pairedOsPath?n.pairedOsPath:"",a="string"==typeof n.pairedMessage?n.pairedMessage:"";(null!==e||t||r||a)&&rt(o,{pairedOk:e,pairedPath:t,pairedOsPath:r,pairedMessage:a})}return o&&(tt(o,"ready",null),ot(o,"","")),void(t&&hn.current.delete(t))}if("done"===n.type){if(o){const e="boolean"==typeof n.pairedOk?n.pairedOk:null,t="string"==typeof n.pairedPath?n.pairedPath:"",r="string"==typeof n.pairedOsPath?n.pairedOsPath:"",a="string"==typeof n.pairedMessage?n.pairedMessage:"";(null!==e||t||r||a)&&rt(o,{pairedOk:e,pairedPath:t,pairedOsPath:r,pairedMessage:a})}const e="number"==typeof n.exitCode?n.exitCode:null,a=Boolean(n.cancelled);if(Boolean(n.fileChanged)&&o&&dt(o),!a&&null!==e&&0!==e){const t="string"==typeof n.error&&n.error.trim()||"string"==typeof n.message&&n.message.trim()||"",r=t?Ce(t,600):"";at(o,"system",r?`Codex run failed (exit ${e}): ${r}`:`Codex run failed (exit ${e}). Check the logs above for the underlying error.`)}(function(e,n,t,o){if(!yn.current)return;if("granted"!==xe()||"undefined"==typeof window||void 0===window.Notification)return;const a=function(e){if(!e)return null;const n=r.current.get(e);return n&&"number"==typeof n.runStartedAt&&Number.isFinite(n.runStartedAt)?Math.max(0,Date.now()-n.runStartedAt):null}(e),i=1e3*wn.current;if(i>0&&(null===a||a<i))return;const s=ue(G(e).path||n||p.current||"current notebook",120),d=null===a?"":` (${function(e){const n=Math.round(Math.max(0,e)/1e3),t=Math.floor(n/60);return 0===t?`${n}s`:`${t}m ${n%60}s`}(a)} elapsed)`,c=t?`Run cancelled in ${s}${d}`:null===o||0===o?`Run completed in ${s}${d}`:`Run failed (exit ${o}) in ${s}${d}`;try{const n=new window.Notification("Codex run finished",{body:c,tag:e?`codex-done-${e}`:void 0});window.setTimeout(()=>n.close(),12e3)}catch{}})(o,"string"==typeof n.notebookPath?n.notebookPath:"",a,e),o&&(tt(o,"ready",null),ot(o,"","")),t&&hn.current.delete(t)}}else at(o,"assistant",n.text||"")}else mn((a=n.snapshot)&&"object"==typeof a?{updatedAt:"string"==typeof a.updatedAt&&a.updatedAt.trim()?a.updatedAt:null,primary:me(a.primary),secondary:me(a.secondary)}:null)},()=>{o.close(),gn.current=null,hn.current=new Map}},[e.notebooks,nn]),(0,i.useEffect)(()=>{if(!on)return;const e=window.requestAnimationFrame(()=>it());return()=>window.cancelAnimationFrame(e)},[on,n,s,Ge]),(0,i.useEffect)(()=>{const e=window.requestAnimationFrame(()=>ct());return()=>window.cancelAnimationFrame(e)},[He]),(0,i.useEffect)(()=>{const e=()=>ct();return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);const xt=x?n.get(x):null,ut=xt?.messages??[],ft=xt?.progressKind??"",mt=Ge?xt?.runState??"ready":"disconnected",gt=s?s.split("/").pop()||"Untitled":"No notebook",ht="ready"===mt&&s.length>0&&!1!==xt?.pairedOk,bt=Kn?T(Kn,Q):"Auto",vt="__config__"===re?bt:T(re,Q),jt=Hn?Y(Hn,Yn):"Auto",Ct="__config__"===ge?jt:Y(ge,Yn),yt=$.find(e=>e.value===Me)?.label??"Permission",wt=xe(),kt="unsupported"===wt,St="unsupported"===wt?"Browser notifications are not available in this environment.":"denied"===wt?"Notifications are blocked for this site. Allow them in browser settings.":"default"===wt?"Permission will be requested when enabling this option.":`Shows a browser notification for ${0===We?"All completed runs":`Runs taking at least ${We} second${1===We?"":"s"}`}.`,Nt="running"===mt&&Boolean(xt?.activeRunId),Mt=Date.now(),Bt=function(e){if(!e)return null;const n=Date.parse(e);return Number.isFinite(n)?n:null}(fn?.updatedAt??null),$t=null==Bt?null:Mt-Bt,_t=null==$t||$t>6e5,Rt=he(fn?.primary?.usedPercent??null),Pt=he(fn?.secondary?.usedPercent??null),At=null==Bt&&null==Rt&&null==Pt,zt=je(fn?.primary?.resetsAt??null,Mt),It=je(fn?.secondary?.resetsAt??null,Mt),Ut="Overdue"===zt||"Overdue"===It||null!=$t&&$t>36e5,Lt=null==Rt?null:Rt/100,Et=null==$t?"Unknown":`${be($t)} ago`,Ot=fn?.primary?.windowMinutes??null,Dt=fn?.secondary?.windowMinutes??null,Ft=null==Ot?"":`Window: ${Math.round(Ot/60)}h`,Wt=null==Dt?"":`Window: ${Math.round(Dt/1440)}d`;return(0,i.useLayoutEffect)(()=>{const e=En.current;if(!e)return void Dn(!1);const n=()=>{const n=e.scrollWidth-e.clientWidth>1;Dn(e=>e===n?e:n)};if(n(),"undefined"==typeof ResizeObserver)return window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)};const t=new ResizeObserver(()=>{n()});return t.observe(e),e.parentElement&&t.observe(e.parentElement),window.addEventListener("resize",n),()=>{t.disconnect(),window.removeEventListener("resize",n)}},[s]),(0,a.jsxs)("div",{className:"jp-CodexChat",children:[(0,a.jsxs)("div",{className:"jp-CodexChat-header",children:[(0,a.jsxs)("div",{className:"jp-CodexChat-header-top",children:[(0,a.jsxs)("div",{className:"jp-CodexChat-header-left",children:[(0,a.jsx)(Ne,{status:mt}),(0,a.jsx)("span",{className:"jp-CodexChat-notebookWrap","data-full-name":On?gt:void 0,children:(0,a.jsx)("span",{className:"jp-CodexChat-notebook",ref:En,title:On?gt:void 0,children:gt})})]}),(0,a.jsxs)("div",{className:"jp-CodexChat-header-actions",children:[(0,a.jsx)("button",{type:"button",onClick:()=>{!async function(){const e=p.current||"",n=j.current||"";if(!e)return;if(!n)return;const t=r.current.get(n);if(t?.messages.some(e=>"text"===e.kind&&("user"===e.role||"assistant"===e.role))&&!(await(0,o.showDialog)({title:"Start a new thread?",body:"Starting a new thread will reset the current conversation, and you will not be able to view the previous conversation in this panel.\nContinue?",buttons:[o.Dialog.cancelButton(),o.Dialog.okButton({label:"New thread"})]})).button.accept)return;const a=ne(e,n,Z());Zn(e=>{const t=new Map(e);return t.set(n,a),t}),st(n),qe(""),lt(),et(a,e,n,{forceNewThread:!0}),function(e,n,t){const o={kind:"new-thread",sessionKey:e,notebookPath:n,threadId:t,source:vn.current,id:Z(),issuedAt:Date.now()};try{window.localStorage.setItem(F,JSON.stringify(o))}catch{}}(n,e,a.threadId)}()},className:"jp-CodexHeaderBtn",disabled:!s||"running"===mt,"aria-label":"New thread",title:"New thread",children:(0,a.jsx)(f,{width:16,height:16})}),(0,a.jsx)("div",{className:"jp-CodexMenuWrap",ref:Bn,children:(0,a.jsx)("button",{type:"button",className:`jp-CodexHeaderBtn jp-CodexHeaderBtn-icon jp-CodexUsageBtn${ln?" is-active is-open":""}${_t?" is-stale":""}${Ut?" is-overdue":""}`,ref:zn,onClick:()=>(pn(e=>{const n=!e;return n&&function(e=!1){const n=gn.current;if(!n||n.readyState!==WebSocket.OPEN)return;const t=Date.now();!e&&t-jn.current<15e3||(jn.current=t,n.send(JSON.stringify({type:"refresh_rate_limits"})))}(),n}),sn(!1),cn(!1),void un(!1)),"aria-label":null==Rt?"Codex usage":`Codex usage: ${Rt}% left`,"aria-haspopup":"dialog","aria-expanded":ln,title:null==Rt?"Codex usage: unknown":`Codex usage: ${Rt}% left (resets in ${zt})`,children:(0,a.jsx)(y,{level:Lt,width:16,height:16})})}),(0,a.jsxs)(k,{open:ln,anchorRef:zn,popoverRef:In,className:"jp-CodexUsagePopover",ariaLabel:"Codex usage",role:"dialog",align:"right",children:[(Ut||_t)&&(0,a.jsxs)("div",{className:"jp-CodexUsageNotice"+(Ut?" is-overdue":_t?" is-stale":""),children:[(0,a.jsx)("div",{className:"jp-CodexUsageNoticeTitle",children:At?"Usage unavailable":Ut?"Overdue usage snapshot":"Stale usage snapshot"}),(0,a.jsx)("div",{className:"jp-CodexUsageNoticeBody",children:At?"Run Codex once to fetch usage limits.":"Run Codex again to refresh these numbers."})]}),(0,a.jsxs)("div",{className:"jp-CodexUsageSection",children:[(0,a.jsxs)("div",{className:"jp-CodexUsageSectionTop",children:[(0,a.jsx)("div",{className:"jp-CodexUsageSectionTitle",children:"Session"}),(0,a.jsxs)("div",{className:"jp-CodexUsageSectionReset",children:["Resets in ",zt]})]}),(0,a.jsx)("div",{className:"jp-CodexUsageBar",children:(0,a.jsx)("div",{className:"jp-CodexUsageBarFill"+(_t?" is-stale":""),style:{width:`${Rt??0}%`}})}),(0,a.jsxs)("div",{className:"jp-CodexUsageMeta",children:[(0,a.jsx)("div",{className:"jp-CodexUsageMetaLeft",children:null==Rt?"--% left":`${Rt}% left`}),(0,a.jsx)("div",{className:"jp-CodexUsageMetaRight",children:Ft})]})]}),(0,a.jsx)("div",{className:"jp-CodexMenuDivider",role:"separator"}),(0,a.jsxs)("div",{className:"jp-CodexUsageSection",children:[(0,a.jsxs)("div",{className:"jp-CodexUsageSectionTop",children:[(0,a.jsx)("div",{className:"jp-CodexUsageSectionTitle",children:"Weekly"}),(0,a.jsxs)("div",{className:"jp-CodexUsageSectionReset",children:["Resets in ",It]})]}),(0,a.jsx)("div",{className:"jp-CodexUsageBar",children:(0,a.jsx)("div",{className:"jp-CodexUsageBarFill"+(_t?" is-stale":""),style:{width:`${Pt??0}%`}})}),(0,a.jsxs)("div",{className:"jp-CodexUsageMeta",children:[(0,a.jsx)("div",{className:"jp-CodexUsageMetaLeft",children:null==Pt?"--% left":`${Pt}% left`}),(0,a.jsx)("div",{className:"jp-CodexUsageMetaRight",children:Wt})]})]}),(0,a.jsxs)("div",{className:"jp-CodexUsageFooter",children:["Last updated: ",Et]})]}),(0,a.jsx)("button",{type:"button",onClick:()=>{Ke(e=>!e),sn(!1),cn(!1),pn(!1),un(!1)},className:"jp-CodexHeaderBtn jp-CodexHeaderBtn-icon"+(Je?" is-active":""),"aria-label":"Settings","aria-expanded":Je,title:"Settings",children:(0,a.jsx)(v,{width:16,height:16})})]})]}),!1===xt?.pairedOk&&(0,a.jsxs)("div",{className:"jp-CodexPairingNotice",role:"status","aria-live":"polite",children:[(0,a.jsx)("div",{className:"jp-CodexPairingNotice-title",children:"Jupytext pairing required"}),(0,a.jsx)("div",{className:"jp-CodexPairingNotice-body",children:xt.pairedMessage||"This notebook must be paired (.ipynb ↔ .py) via Jupytext to enable running."})]})]}),(0,a.jsx)("div",{className:"jp-CodexChat-body",children:(0,a.jsxs)("div",{className:"jp-CodexChat-messages",ref:kn,onScroll:function(){const e=kn.current;if(!e)return;const n=e.scrollHeight-(e.scrollTop+e.clientHeight)<80;rn(n)},children:["disconnected"===mt&&(0,a.jsxs)("div",{className:"jp-CodexChat-message jp-CodexChat-system jp-CodexChat-reconnectNotice",children:[(0,a.jsx)("div",{className:"jp-CodexChat-role",children:"system"}),(0,a.jsx)("div",{className:"jp-CodexChat-text",children:"Codex connection was lost. Reconnect to continue."}),(0,a.jsx)("button",{type:"button",className:"jp-CodexReconnectBtn",onClick:()=>{Xe||tn(e=>e+1)},disabled:Xe,"aria-label":Xe?"Codex reconnecting":"Reconnect to Codex",title:Xe?"Attempting to reconnect...":"Reconnect to Codex",children:Xe?"Connecting...":"Reconnect"})]}),0===ut.length&&(0,a.jsxs)("div",{className:"jp-CodexChat-message jp-CodexChat-system",children:[(0,a.jsx)("div",{className:"jp-CodexChat-role",children:"system"}),(0,a.jsx)("div",{className:"jp-CodexChat-text",children:"Select a notebook, then start a conversation."})]}),ut.map(e=>{if("text"===e.kind){const n="system"===e.role&&se(e.text)?" is-success":"",t=e.attachments?.images??0;return(0,a.jsxs)("div",{className:`jp-CodexChat-message jp-CodexChat-${e.role}${n}`,children:[(0,a.jsx)("div",{className:"jp-CodexChat-role",children:e.role}),(0,a.jsx)(Be,{text:e.text,canCopyCode:"assistant"===e.role}),t>0&&(0,a.jsx)("div",{className:"jp-CodexChat-attachments","aria-label":`${t} image attachment(s)`,title:`${t} image attachment(s)`,children:(0,a.jsxs)("span",{className:"jp-CodexChat-attachmentPill",children:[(0,a.jsx)(b,{width:14,height:14}),(0,a.jsx)("span",{className:"jp-CodexChat-attachmentCount",children:t})]})})]},e.id)}if("run-divider"===e.kind)return(0,a.jsx)("div",{className:"jp-CodexRunDivider",role:"separator","aria-label":"Run duration",children:(0,a.jsxs)("span",{className:"jp-CodexRunDividerLabel",children:["Worked for ",ve(e.elapsedMs)]})},e.id);const n=e.item,t=(n.detail||"").trim(),o=Boolean(t),r=`jp-CodexChat-message jp-CodexChat-activity${o?" is-expandable":""} is-${n.category}${n.phase?` is-${n.phase}`:""}`,i="completed"===n.phase?(0,a.jsx)(S,{width:14,height:14}):"started"===n.phase?(0,a.jsx)("span",{className:"jp-CodexActivityDot"}):(0,a.jsx)("span",{className:"jp-CodexActivityDot is-idle"}),s=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"jp-CodexActivityLineIcon","aria-hidden":"true",children:i}),(0,a.jsx)("span",{className:"jp-CodexActivityLineText",children:(0,a.jsx)("span",{className:"jp-CodexActivityLineTitle",children:n.title})})]});return o?(0,a.jsxs)("details",{className:r,role:"status","aria-live":"polite",children:[(0,a.jsx)("summary",{className:"jp-CodexActivitySummary",children:s}),(0,a.jsx)("div",{className:"jp-CodexActivityBody",children:(0,a.jsx)("pre",{className:"jp-CodexActivityCode",children:(0,a.jsx)("code",{children:t})})})]},e.id):(0,a.jsx)("div",{className:r,role:"status","aria-live":"polite",children:(0,a.jsx)("div",{className:"jp-CodexActivitySummary jp-CodexActivitySummaryStatic",children:s})},e.id)}),"running"===mt&&(0,a.jsx)("div",{className:"jp-CodexChat-loading"+("reasoning"===ft?" is-reasoning":""),"aria-label":"reasoning"===ft?"Reasoning":"Running",children:(0,a.jsxs)("div",{className:"jp-CodexChat-loading-dots",children:[(0,a.jsx)("span",{}),(0,a.jsx)("span",{}),(0,a.jsx)("span",{})]})}),(0,a.jsx)("div",{ref:Sn})]})}),(0,a.jsxs)("div",{className:"jp-CodexChat-input",children:[(0,a.jsx)("div",{className:"jp-CodexJumpBar"+(on?"":" is-visible"),children:(0,a.jsx)("button",{type:"button",className:"jp-CodexJumpToLatestBtn",onClick:it,"aria-label":"Jump to latest","aria-hidden":on,tabIndex:on?-1:0,title:"Jump to latest",children:(0,a.jsx)(g,{width:20,height:20})})}),(0,a.jsxs)("div",{className:"jp-CodexComposer",children:[(0,a.jsx)("textarea",{ref:Fn,value:He,onChange:e=>{qe(e.currentTarget.value),window.requestAnimationFrame(()=>ct(e.currentTarget))},onPaste:function(e){const n=e.clipboardData?.items;if(!n||0===n.length)return;const t=[];for(let e=0;e<n.length;e+=1){const o=n[e];if(!o||"file"!==o.kind||!o.type.startsWith("image/"))continue;const r=o.getAsFile();r&&t.push(r)}if(0===t.length)return;const o=Ze.current.length;if(o>=4)return void at(j.current||"","system","Too many images attached (max 4).");const r=4-o,a=[];let i=0,s=0,d=Ze.current.reduce((e,n)=>e+n.file.size,0);for(const e of t.slice(0,r))e.size>4194304?i+=1:d+e.size>6291456?s+=1:(a.push({id:crypto.randomUUID(),file:e,previewUrl:URL.createObjectURL(e)}),d+=e.size);i>0&&at(j.current||"","system",`Skipped ${i} image(s): each must be <= ${Math.round(4)}MB.`),s>0&&at(j.current||"","system",`Skipped ${s} image(s): total attachments must be <= ${Math.round(6)}MB.`),0!==a.length&&Ve(e=>{const n=[...e,...a];return Ze.current=n,n})},placeholder:!1===xt?.pairedOk?"Disabled: missing Jupytext paired file (.py)":s?"Ask Codex...":"Select a notebook first",rows:1,onKeyDown:e=>{const n=e.nativeEvent;n.isComposing||229===n.keyCode||"Enter"===e.key&&!e.shiftKey&&ht&&(He.trim()||Ye.length>0)&&(e.preventDefault(),pt())}}),Ye.length>0&&(0,a.jsx)("div",{className:"jp-CodexComposer-attachments",role:"group","aria-label":"Attachments",children:Ye.map(e=>(0,a.jsxs)("div",{className:"jp-CodexComposer-attachment",children:[(0,a.jsx)("img",{src:e.previewUrl,alt:e.file.name||"Pasted image"}),(0,a.jsx)("button",{type:"button",className:"jp-CodexComposer-attachmentRemove",onClick:()=>{return n=e.id,void Ve(e=>{const t=e.find(e=>e.id===n);t&&URL.revokeObjectURL(t.previewUrl);const o=e.filter(e=>e.id!==n);return Ze.current=o,o});var n},"aria-label":"Remove image",title:"Remove image",children:(0,a.jsx)(N,{width:14,height:14})})]},e.id))}),(0,a.jsxs)("div",{className:"jp-CodexComposer-toolbar",children:[(0,a.jsxs)("div",{className:"jp-CodexComposer-toolbarLeft",children:[(0,a.jsx)("div",{className:"jp-CodexMenuWrap jp-CodexModelWrap",ref:Nn,children:(0,a.jsx)("button",{type:"button",ref:_n,className:"jp-CodexModelBtn "+(an?"is-open":""),onClick:()=>{sn(e=>!e),cn(!1),pn(!1),un(!1)},disabled:"running"===mt,"aria-label":`Model: ${vt}`,"aria-haspopup":"menu","aria-expanded":an,title:`Model: ${vt}`,children:(0,a.jsx)("span",{className:"jp-CodexModelBtn-label",children:vt})})}),(0,a.jsxs)(k,{open:an,anchorRef:_n,popoverRef:Rn,role:"menu",ariaLabel:"Model",align:"left",children:[0===Q.length&&(0,a.jsx)("div",{className:"jp-CodexMenuItem",children:"No models available"}),Q.map(e=>{const n="__config__"===re&&Kn&&Q.some(e=>e.value===Kn)?Kn:re,t=n===e.value;return(0,a.jsxs)("button",{type:"button",className:"jp-CodexMenuItem "+(t?"is-active":""),onClick:()=>{ae(e.value),sn(!1)},children:[(0,a.jsx)("span",{className:"jp-CodexMenuItemLabel",children:e.label}),t&&(0,a.jsx)(S,{className:"jp-CodexMenuCheck",width:16,height:16})]},e.value)})]}),(0,a.jsx)("div",{className:"jp-CodexMenuWrap",ref:Mn,children:(0,a.jsx)("button",{type:"button",ref:Pn,className:"jp-CodexIconBtn "+(dn?"is-open":""),onClick:()=>{cn(e=>!e),sn(!1),pn(!1),un(!1)},disabled:"running"===mt,"aria-label":`Reasoning: ${Ct}`,"aria-haspopup":"menu","aria-expanded":dn,title:`Reasoning: ${Ct}`,children:(0,a.jsx)(C,{effort:"__config__"===ge&&Hn?Hn:ge,effortOptions:Yn,width:18,height:18})})}),(0,a.jsxs)(k,{open:dn,anchorRef:Pn,popoverRef:An,role:"menu",ariaLabel:"Reasoning",align:"left",children:[0===Yn.length&&(0,a.jsx)("div",{className:"jp-CodexMenuItem",children:"No reasoning options"}),Yn.map(e=>{const n=("__config__"===ge&&Hn?Hn:ge)===e.value;return(0,a.jsxs)("button",{type:"button",className:"jp-CodexMenuItem "+(n?"is-active":""),onClick:()=>{Se(e.value),cn(!1)},children:[(0,a.jsx)("span",{className:"jp-CodexMenuItemLabel",children:e.label}),n&&(0,a.jsx)(S,{className:"jp-CodexMenuCheck",width:16,height:16})]},e.value)})]}),(0,a.jsx)("div",{className:"jp-CodexMenuWrap",ref:$n,children:(0,a.jsx)("button",{type:"button",className:`jp-CodexIconBtn jp-CodexPermissionBtn${xn?" is-open":""}${"danger-full-access"===Me?" is-danger":""}`,ref:Un,onClick:()=>{un(e=>!e),sn(!1),cn(!1),pn(!1)},disabled:"running"===mt,"aria-label":`Permission: ${yt}`,"aria-haspopup":"menu","aria-expanded":xn,title:`Permission: ${yt}`,children:(0,a.jsx)(w,{width:18,height:18})})}),(0,a.jsx)(k,{open:xn,anchorRef:Un,popoverRef:Ln,role:"menu",ariaLabel:"Permissions",align:"right",children:$.map(e=>(0,a.jsxs)("button",{type:"button",className:"jp-CodexMenuItem "+(Me===e.value?"is-active":""),onClick:()=>{$e(e.value),un(!1)},children:[(0,a.jsx)("span",{className:"jp-CodexMenuItemLabel",children:e.label}),Me===e.value&&(0,a.jsx)(S,{className:"jp-CodexMenuCheck",width:16,height:16})]},e.value))})]}),(0,a.jsx)("div",{className:"jp-CodexComposer-toolbarRight",children:(0,a.jsx)("button",{type:"button",className:"jp-CodexSendBtn"+("running"===mt?" is-stop":""),onClick:()=>{"running"!==mt?pt():function(){const e=gn.current,n=j.current||"";if(!n)return;const t=n?r.current.get(n):null,o=t?.activeRunId??null;e&&e.readyState===WebSocket.OPEN?o?(ot(n,"Cancelling..."),e.send(JSON.stringify({type:"cancel",runId:o}))):at(n,"system","Cancel not available yet (waiting for run id)."):at(n,"system","Cancel failed: WebSocket is not connected.")}()},disabled:"running"===mt?!Nt:!ht||!He.trim()&&0===Ye.length,"aria-label":"running"===mt?"Stop run":"Send",title:"running"===mt?xt?.activeRunId?`runId: ${xt.activeRunId}`:"Waiting for run id...":"disconnected"===mt?"Connecting...":"Send",children:"running"===mt?(0,a.jsx)(h,{width:18,height:18}):(0,a.jsx)(m,{width:18,height:18})})})]})]})]}),Je&&(0,a.jsxs)("div",{className:"jp-CodexSettingsOverlay",role:"dialog","aria-modal":"true","aria-label":"Settings",children:[(0,a.jsx)("button",{type:"button",className:"jp-CodexSettingsBackdrop",onClick:()=>Ke(!1),"aria-label":"Dismiss settings",title:"Dismiss settings"}),(0,a.jsxs)("div",{className:"jp-CodexSettingsPanel",onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:"jp-CodexSettingsPanel-top",children:[(0,a.jsx)("div",{className:"jp-CodexSettingsPanel-title",children:"Settings"}),(0,a.jsx)("button",{type:"button",className:"jp-CodexHeaderBtn jp-CodexHeaderBtn-icon",onClick:()=>Ke(!1),"aria-label":"Close settings",title:"Close",children:(0,a.jsx)(N,{width:16,height:16})})]}),(0,a.jsxs)("div",{className:"jp-CodexSettingsPanel-sections",children:[(0,a.jsxs)("section",{className:"jp-CodexSettingsSection","aria-label":"General settings",children:[(0,a.jsx)("div",{className:"jp-CodexSettingsSection-title",children:"General"}),(0,a.jsxs)("label",{className:"jp-CodexSettingsField",children:[(0,a.jsx)("span",{className:"jp-CodexSettingsField-label",children:"Codex command path"}),(0,a.jsx)("input",{type:"text",className:"jp-CodexChat-model-input",placeholder:"codex",value:Re,disabled:"running"===mt,onChange:e=>Pe(e.currentTarget.value.trimStart()),title:"Leave empty to use PATH lookup."}),(0,a.jsx)("span",{className:"jp-CodexSettingsField-help",children:"Leave empty to use PATH lookup."})]})]}),(0,a.jsxs)("section",{className:"jp-CodexSettingsSection","aria-label":"Message options",children:[(0,a.jsx)("div",{className:"jp-CodexSettingsSection-title",children:"Message Options"}),(0,a.jsxs)("div",{className:"jp-CodexSettingsOptions",children:[(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:ze,onChange:e=>Ie(e.currentTarget.checked),disabled:"running"===mt}),"Auto-save before send"]}),(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:Ue,onChange:e=>Le(e.currentTarget.checked),disabled:"running"===mt}),"Include active cell"]}),(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:Ee,onChange:e=>Oe(e.currentTarget.checked),disabled:"running"===mt||!Ue}),"Include active cell output"]})]})]}),(0,a.jsxs)("section",{className:"jp-CodexSettingsSection","aria-label":"Notification options",children:[(0,a.jsx)("div",{className:"jp-CodexSettingsSection-title",children:"NOTIFICATION"}),(0,a.jsxs)("div",{className:"jp-CodexSettingsOptions",children:[(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:De,onChange:e=>{!async function(e){if(!e)return void Fe(!1);const n=xe(),t=j.current||"";if("unsupported"===n)return at(t,"system","Browser notifications are not supported in this environment."),void Fe(!1);if("granted"!==n){if("denied"===n)return at(t,"system","Browser notifications are blocked for this site. Allow notifications in browser settings to enable this option."),void Fe(!1);try{const e=await window.Notification.requestPermission();if("granted"===e)return void Fe(!0);"denied"===e&&at(t,"system","Browser notification permission was denied. Allow notifications in browser settings to enable this option."),Fe(!1)}catch{at(t,"system","Failed to request browser notification permission."),Fe(!1)}}else Fe(!0)}(e.currentTarget.checked)},disabled:"running"===mt||kt}),"Notify when run finishes"]}),(0,a.jsxs)("label",{className:"jp-CodexSettingsField",children:[(0,a.jsx)("span",{className:"jp-CodexSettingsField-label",children:"Minimum runtime (seconds)"}),(0,a.jsx)("input",{type:"number",min:"0",step:"1",className:"jp-CodexChat-model-input",value:We,onChange:e=>Te(Number.isFinite(Number(e.currentTarget.value))?Math.max(0,Math.floor(Number(e.currentTarget.value))):0),disabled:kt}),(0,a.jsx)("span",{className:"jp-CodexSettingsField-help",children:"0 means notify for every finished run. Enter only when you want delayed notifications."})]}),(0,a.jsx)("span",{className:"jp-CodexSettingsField-help",children:St})]})]}),(0,a.jsxs)("section",{className:"jp-CodexSettingsSection jp-CodexSettingsSection-danger","aria-label":"Danger zone",children:[(0,a.jsx)("div",{className:"jp-CodexSettingsSection-title jp-CodexSettingsSection-title-danger",children:"Danger Zone"}),(0,a.jsx)("div",{className:"jp-CodexSettingsPanel-stats",children:(0,a.jsxs)("span",{className:"jp-CodexSettingsPanel-stat",children:["Saved conversations: ",Wn]})}),(0,a.jsx)("div",{className:"jp-CodexSettingsDanger",children:(0,a.jsx)("button",{type:"button",className:"jp-CodexBtn jp-CodexBtn-xs jp-CodexBtn-danger",onClick:()=>{!async function(){const e=X();if(!e&&0===n.size)return;if(!(await(0,o.showDialog)({title:"Delete all conversations",body:`This will delete ${e} saved conversation(s) and all in-memory messages in this panel.`,buttons:[o.Dialog.cancelButton(),o.Dialog.okButton({label:"Delete"})]})).button.accept)return;const t=j.current||"";t&&st(t),le(),!nt()&&t&&at(t,"system","Delete request could not be sent now. It will be retried when you reconnect."),hn.current=new Map,bn.current=new Map,ce(D),Vn(new Map),qe(""),lt()}()},disabled:"running"===mt||0===Wn&&0===n.size,title:"running"===mt?"Cannot delete while a run is in progress.":"Delete all saved conversations",children:"Delete all"})})]})]})]})]})]})}function _e(e){return e.currentWidget?e.currentWidget.context.path:""}function Re(e){return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"")}function Pe(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join(""):""}function Ae(e){if(!e||"object"!=typeof e)return"";const n="string"==typeof e.output_type?e.output_type:"";if(!n)return"";if("stream"===n){const n=Pe(e.text);if(!n)return"";const t="string"==typeof e.name?e.name:"",o=Re(n).replace(/\s+$/,"");return o?"stderr"===t?`[stderr]\n${o}`:o:""}if("error"===n){const n=Re((Array.isArray(e.traceback)?e.traceback.filter(e=>"string"==typeof e):[]).join("\n")).replace(/\s+$/,"");return n||["string"==typeof e.ename?e.ename:"","string"==typeof e.evalue?e.evalue:""].filter(Boolean).join(": ").trim()}if("execute_result"===n||"display_data"===n||"update_display_data"===n){const t=e.data&&"object"==typeof e.data?e.data:null;if(!t)return"";const o=Pe(t["text/plain"]);if(o){const t=Re(o).replace(/\s+$/,"");return t?"execute_result"===n&&"number"==typeof e.execution_count?`Out[${e.execution_count}]:\n${t}`:t:""}const r=Object.keys(t).filter(e=>e&&"text/plain"!==e);return r.length>0?`[non-text output omitted: ${r.slice(0,6).join(", ")}${r.length>6?", ...":""}]`:""}return""}var ze=t(5072),Ie=t.n(ze),Ue=t(7825),Le=t.n(Ue),Ee=t(7659),Oe=t.n(Ee),De=t(5056),Fe=t.n(De),We=t(540),Te=t.n(We),Je=t(1113),Ke=t.n(Je),He=t(2646),qe={};qe.styleTagTransform=Ke(),qe.setAttributes=Fe(),qe.insert=Oe().bind(null,"head"),qe.domAPI=Le(),qe.insertStyleElement=Te(),Ie()(He.A,qe),He.A&&He.A.locals&&He.A.locals;const Ye={id:"jupyterlab-codex:plugin",autoStart:!0,requires:[o.ICommandPalette,r.INotebookTracker],activate:(e,n,t)=>{const o=new M(t);o.id="jupyterlab-codex-sidebar",o.title.caption="Codex",o.title.label="Codex",e.shell.add(o,"right"),n.addItem({command:"jupyterlab-codex:activate",category:"Codex"}),e.commands.addCommand("jupyterlab-codex:activate",{label:"Focus Codex Sidebar",execute:()=>{e.shell.activateById(o.id)}})}}},2646(e,n,t){t.d(n,{A:()=>u});var o=t(1601),r=t.n(o),a=t(6314),i=t.n(a),s=t(2479),d=t(4417),c=t.n(d),l=new URL(t(3915),t.b),p=i()(r());p.i(s.A);var x=c()(l);p.push([e.id,`.jp-CodexPanel {\n height: 100%;\n display: flex;\n flex-direction: column;\n container-type: inline-size;\n\n --cdx-bg: var(--jp-layout-color1, #ffffff);\n --cdx-surface: var(--jp-layout-color0, #ffffff);\n --cdx-surface-2: var(--jp-layout-color2, #f3f4f6);\n --cdx-border: var(--jp-border-color2, rgba(148, 163, 184, 0.35));\n --cdx-text: var(--jp-ui-font-color0, #0f172a);\n --cdx-muted: var(--jp-ui-font-color2, #64748b);\n --cdx-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",\n "Courier New", monospace;\n\n --cdx-accent: var(--jupyterlab-codex-accent, #6E80FF);\n --cdx-good: var(--jp-success-color1, #22c55e);\n --cdx-warn: var(--jp-warn-color1, #f97316);\n --cdx-bad: var(--jp-error-color1, #ef4444);\n --cdx-code-text: var(--cdx-text);\n --cdx-code-comment: #6b7280;\n --cdx-code-keyword: #7c3aed;\n --cdx-code-string: #0f766e;\n --cdx-code-number: #b45309;\n --cdx-code-function: #0f766e;\n --cdx-code-variable: #1d4ed8;\n --cdx-code-operator: #334155;\n --cdx-code-title: #0f172a;\n\n --cdx-radius: 14px;\n --cdx-radius-sm: 10px;\n\n font-family: var(\n --jp-ui-font-family,\n system-ui,\n -apple-system,\n Segoe UI,\n Roboto,\n Helvetica,\n Arial,\n sans-serif\n );\n color: var(--cdx-text);\n background: var(--cdx-bg);\n}\n\n.jp-mod-theme-light .jp-CodexPanel {\n --cdx-code-text: #0f172a;\n --cdx-code-comment: #6b7280;\n --cdx-code-keyword: #7c3aed;\n --cdx-code-string: #0f766e;\n --cdx-code-number: #b45309;\n --cdx-code-function: #0f766e;\n --cdx-code-variable: #1d4ed8;\n --cdx-code-operator: #334155;\n --cdx-code-title: #0f172a;\n}\n\n.jp-mod-theme-dark .jp-CodexPanel {\n --cdx-code-text: #e2e8f0;\n --cdx-code-comment: #94a3b8;\n --cdx-code-keyword: #c084fc;\n --cdx-code-string: #5eead4;\n --cdx-code-number: #fbbf24;\n --cdx-code-function: #4ade80;\n --cdx-code-variable: #93c5fd;\n --cdx-code-operator: #cbd5e1;\n --cdx-code-title: #f8fafc;\n}\n\n.jp-CodexChat {\n position: relative;\n display: flex;\n flex-direction: column;\n height: 100%;\n\n /* Space reserved for the input's top fade overlay so the last message isn't washed out. */\n --cdx-chat-bottom-fade: 28px;\n}\n\n.jp-CodexChat-header {\n position: sticky;\n top: 0;\n z-index: 2;\n padding: 10px 10px 8px;\n border-bottom: none;\n background: var(--cdx-bg);\n container-type: inline-size;\n}\n\n.jp-CodexChat-header::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -24px;\n height: 24px;\n background: linear-gradient(\n to bottom,\n var(--cdx-bg),\n color-mix(in srgb, var(--cdx-bg) 0%, transparent)\n );\n pointer-events: none;\n}\n\n.jp-CodexChat-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.jp-CodexChat-header-left {\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.jp-CodexChat-header-actions {\n justify-self: end;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n@container (max-width: 420px) {\n .jp-CodexHeaderBtn-label {\n display: none;\n }\n}\n\n@container (max-width: 380px) {\n .jp-CodexChat-header {\n padding: 8px 8px 8px;\n }\n\n .jp-CodexChat-header-top {\n gap: 8px;\n }\n\n .jp-CodexChat-header-actions {\n gap: 6px;\n }\n\n .jp-CodexChat-notebook {\n min-width: 0;\n }\n}\n\n.jp-CodexChat-subtitle {\n margin-top: 8px;\n padding: 6px 10px;\n border-radius: 12px;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface);\n font-family: var(--cdx-mono);\n font-size: 12px;\n color: var(--cdx-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jp-CodexPairingNotice {\n margin-top: 8px;\n padding: 10px 10px;\n border-radius: 12px;\n border: 1px solid color-mix(in srgb, var(--cdx-warn) 40%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-warn) 10%, var(--cdx-surface));\n}\n\n.jp-CodexPairingNotice-title {\n font-size: 12px;\n font-weight: 750;\n color: color-mix(in srgb, var(--cdx-warn) 70%, var(--cdx-text));\n}\n\n.jp-CodexPairingNotice-body {\n margin-top: 4px;\n font-size: 12px;\n color: color-mix(in srgb, var(--cdx-warn) 55%, var(--cdx-text));\n white-space: pre-wrap;\n}\n\n.jp-CodexChat-notebook {\n flex: 0 1 auto;\n min-width: 0;\n height: auto;\n display: inline-flex;\n align-items: center;\n padding: 0;\n border-radius: 0;\n border: none;\n background: transparent;\n font-size: 13px;\n font-weight: 650;\n color: var(--cdx-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jp-CodexChat-notebookWrap {\n position: relative;\n flex: 0 1 auto;\n min-width: 0;\n display: inline-flex;\n}\n\n.jp-CodexChat-notebookWrap::after {\n content: attr(data-full-name);\n position: absolute;\n left: 0;\n top: calc(100% + 6px);\n z-index: 35;\n display: none;\n max-width: min(480px, calc(100vw - 40px));\n padding: 6px 8px;\n border-radius: 8px;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface);\n color: var(--cdx-text);\n font-size: 12px;\n font-weight: 550;\n line-height: 1.3;\n white-space: normal;\n overflow-wrap: anywhere;\n box-shadow: 0 8px 24px rgba(2, 6, 23, 0.16);\n pointer-events: none;\n}\n\n.jp-CodexChat-notebookWrap[data-full-name]:not([data-full-name='']):hover::after,\n.jp-CodexChat-notebookWrap[data-full-name]:not([data-full-name='']):focus-within::after {\n display: block;\n}\n\n.jp-CodexHeaderBtn {\n appearance: none;\n height: 32px;\n padding: 0 10px;\n border-radius: 10px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--cdx-muted);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 650;\n transition: background 120ms ease, border-color 120ms ease, color 120ms ease;\n}\n\n.jp-CodexHeaderBtn svg {\n opacity: 0.9;\n}\n\n.jp-CodexHeaderBtn:hover:not(:disabled) {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n}\n\n.jp-CodexHeaderBtn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.jp-CodexHeaderBtn-icon {\n width: 32px;\n padding: 0;\n}\n\n.jp-CodexHeaderBtn-icon.is-active {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n}\n\n.jp-CodexHeaderBtn-danger {\n color: color-mix(in srgb, var(--cdx-bad) 78%, var(--cdx-muted));\n}\n\n.jp-CodexHeaderBtn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--cdx-bad) 8%, var(--cdx-surface));\n border-color: color-mix(in srgb, var(--cdx-bad) 35%, var(--cdx-border));\n color: color-mix(in srgb, var(--cdx-bad) 85%, var(--cdx-text));\n}\n\n.jp-CodexSettingsOverlay {\n position: absolute;\n inset: 0;\n z-index: 40;\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding: 54px 10px 10px;\n}\n\n.jp-CodexSettingsBackdrop {\n position: absolute;\n inset: 0;\n appearance: none;\n margin: 0;\n padding: 0;\n border: 0;\n background: color-mix(in srgb, var(--cdx-bg) 58%, transparent);\n -webkit-backdrop-filter: blur(5px);\n backdrop-filter: blur(5px);\n cursor: pointer;\n}\n\n.jp-CodexSettingsPanel {\n position: relative;\n z-index: 1;\n width: min(100%, 680px);\n max-height: calc(100% - 54px);\n overflow: auto;\n border-radius: var(--cdx-radius);\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface);\n padding: 14px;\n}\n\n.jp-CodexSettingsPanel-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.jp-CodexSettingsPanel-sections {\n margin-top: 12px;\n padding-top: 14px;\n border-top: 1px solid var(--cdx-border);\n display: grid;\n gap: 18px;\n}\n\n.jp-CodexSettingsSection {\n display: grid;\n gap: 10px;\n}\n\n.jp-CodexSettingsSection-title {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--cdx-muted);\n}\n\n.jp-CodexSettingsSection-title-danger {\n color: color-mix(in srgb, var(--cdx-bad) 72%, var(--cdx-muted));\n}\n\n.jp-CodexSettingsField {\n display: grid;\n gap: 6px;\n}\n\n.jp-CodexSettingsField-label {\n font-size: 12px;\n color: var(--cdx-text);\n}\n\n.jp-CodexSettingsField .jp-CodexChat-model-input {\n width: 100%;\n max-width: 100%;\n min-width: 0;\n display: block;\n box-sizing: border-box;\n}\n\n.jp-CodexSettingsField-help {\n font-size: 11px;\n color: var(--cdx-muted);\n}\n\n.jp-CodexSettingsOptions {\n display: grid;\n gap: 8px;\n}\n\n.jp-CodexSettingsPanel .jp-CodexChat-toggle {\n width: 100%;\n justify-content: flex-start;\n border: 1px solid transparent;\n background: transparent;\n padding: 4px 0;\n border-radius: 8px;\n}\n\n.jp-CodexSettingsPanel .jp-CodexChat-toggle:hover {\n background: transparent;\n border-color: transparent;\n color: inherit;\n}\n\n.jp-CodexSettingsPanel-stats {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n\n.jp-CodexSettingsPanel-stat {\n font-size: 12px;\n color: var(--cdx-muted);\n}\n\n.jp-CodexSettingsDanger {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n.jp-CodexSettingsSection-danger {\n padding-top: 14px;\n border-top: 1px solid color-mix(in srgb, var(--cdx-bad) 18%, var(--cdx-border));\n}\n\n.jp-CodexSettingsPanel-title {\n font-size: 12px;\n font-weight: 700;\n color: var(--cdx-muted);\n}\n\n.jp-CodexChat-settings {\n margin-top: 8px;\n}\n\n.jp-CodexChat-settingsSummary {\n cursor: pointer;\n user-select: none;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 12px;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface-2);\n color: var(--cdx-text);\n font-size: 12px;\n font-weight: 650;\n}\n\n.jp-CodexChat-settingsSummary::-webkit-details-marker {\n display: none;\n}\n\n.jp-CodexChat-controls {\n margin-top: 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n}\n\n.jp-CodexChat-model {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--cdx-muted);\n}\n\n.jp-CodexChat-model select,\n.jp-CodexChat-model-input {\n border: 1px solid var(--cdx-border);\n border-radius: 10px;\n background: var(--cdx-surface);\n color: var(--cdx-text);\n font-size: 12px;\n padding: 6px 10px;\n outline: none;\n}\n\n.jp-CodexChat-model select:focus,\n.jp-CodexChat-model-input:focus {\n border-color: color-mix(in srgb, var(--cdx-accent) 65%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);\n}\n\n.jp-CodexChat-model-input {\n width: 170px;\n}\n\n.jp-CodexChat-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--cdx-muted);\n padding: 6px 10px;\n border-radius: 12px;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface-2);\n}\n\n.jp-CodexChat-toggle input[type="checkbox"] {\n accent-color: var(--cdx-accent);\n}\n\n.jp-CodexStatusPill {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border-radius: 999px;\n border: none;\n background: transparent;\n}\n\n.jp-CodexStatusPill-dot {\n position: relative;\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--cdx-muted);\n box-shadow: none;\n}\n\n.jp-CodexStatusPill-ready {\n color: color-mix(in srgb, var(--cdx-good) 70%, var(--cdx-text));\n}\n\n.jp-CodexStatusPill-ready .jp-CodexStatusPill-dot {\n background: var(--cdx-good);\n box-shadow: none;\n}\n\n.jp-CodexStatusPill-running {\n color: color-mix(in srgb, var(--cdx-warn) 75%, var(--cdx-text));\n}\n\n.jp-CodexStatusPill-running .jp-CodexStatusPill-dot {\n background: var(--cdx-warn);\n animation: cdx-status-dot 900ms ease-in-out infinite;\n}\n\n.jp-CodexStatusPill-running .jp-CodexStatusPill-dot::after {\n content: '';\n position: absolute;\n inset: -6px;\n border-radius: 999px;\n border: 2px solid color-mix(in srgb, var(--cdx-warn) 70%, transparent);\n opacity: 0;\n transform: scale(0.6);\n animation: cdx-status-ring 900ms ease-out infinite;\n pointer-events: none;\n}\n\n.jp-CodexStatusPill-disconnected {\n color: color-mix(in srgb, var(--cdx-bad) 75%, var(--cdx-text));\n}\n\n.jp-CodexStatusPill-disconnected .jp-CodexStatusPill-dot {\n background: var(--cdx-bad);\n box-shadow: none;\n}\n\n.jp-CodexChat-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.jp-CodexChat-activity {\n align-self: stretch;\n border: none;\n background: transparent;\n padding: 0;\n}\n\n.jp-CodexActivitySummary {\n display: flex;\n gap: 6px;\n align-items: flex-start;\n font-family: var(--cdx-mono);\n font-size: 12px;\n line-height: 1.15;\n color: var(--cdx-text);\n padding: 0;\n border-radius: 0;\n background: transparent;\n cursor: pointer;\n user-select: none;\n outline: none;\n}\n\n.jp-CodexActivitySummary::-webkit-details-marker {\n display: none;\n}\n\n.jp-CodexActivitySummary::marker {\n content: '';\n}\n\n.jp-CodexActivitySummaryStatic {\n cursor: default;\n user-select: text;\n}\n\n.jp-CodexChat-activity.is-expandable .jp-CodexActivitySummary:hover {\n background: transparent;\n}\n\n.jp-CodexChat-activity.is-expandable .jp-CodexActivitySummary {\n padding: 2px 0;\n border-radius: 0;\n opacity: 0.72;\n transition: opacity 120ms ease;\n}\n\n.jp-CodexChat-activity.is-expandable .jp-CodexActivitySummary:active {\n opacity: 0.92;\n}\n\n.jp-CodexChat-activity.is-expandable .jp-CodexActivitySummary:hover,\n.jp-CodexChat-activity.is-expandable[open] .jp-CodexActivitySummary {\n opacity: 1;\n}\n\n.jp-CodexActivityLineIcon {\n flex: 0 0 auto;\n width: 14px;\n height: 14px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: color-mix(in srgb, var(--cdx-muted) 80%, var(--cdx-text));\n}\n\n.jp-CodexActivityDot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--cdx-accent) 70%, var(--cdx-border));\n}\n\n.jp-CodexActivityLineIcon svg {\n display: block;\n}\n\n.jp-CodexActivityDot.is-idle {\n background: color-mix(in srgb, var(--cdx-muted) 55%, var(--cdx-border));\n}\n\n.jp-CodexActivityLineText {\n min-width: 0;\n word-break: break-word;\n}\n\n.jp-CodexActivityLineTitle {\n font-weight: 400;\n color: var(--cdx-muted);\n}\n\n.jp-CodexActivityLineDetail {\n color: var(--cdx-muted);\n white-space: pre-wrap;\n}\n\n.jp-CodexActivityBody {\n padding: 4px 0 0 20px;\n}\n\n.jp-CodexActivityCode {\n margin: 0;\n padding: 6px 8px;\n border-radius: calc(var(--cdx-radius) - 2px);\n background: color-mix(in srgb, var(--cdx-surface) 88%, var(--cdx-surface-2));\n border: 1px solid color-mix(in srgb, var(--cdx-border) 60%, transparent);\n font-family: var(--jp-code-font-family, var(--cdx-mono)) !important;\n font-size: 10px !important;\n line-height: 1.2 !important;\n white-space: pre-wrap;\n overflow-x: auto;\n}\n\n.jp-CodexActivityCode code {\n font-family: var(--jp-code-font-family, var(--cdx-mono)) !important;\n font-size: inherit !important;\n line-height: inherit !important;\n}\n\n.jp-CodexChat-messages {\n flex: 1;\n min-height: 0;\n overflow: auto;\n /* Extra bottom padding keeps the last message out from under the input's fade overlay. */\n padding: 12px 12px calc(12px + var(--cdx-chat-bottom-fade) + env(safe-area-inset-bottom, 0px));\n display: flex;\n flex-direction: column;\n /* Use a tight baseline gap; expand only for full chat bubbles below. */\n gap: 6px;\n overscroll-behavior: contain;\n scrollbar-gutter: stable both-edges;\n scroll-padding-bottom: calc(12px + var(--cdx-chat-bottom-fade) + env(safe-area-inset-bottom, 0px));\n}\n\n.jp-CodexRunDivider {\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 6px 2px 2px;\n color: var(--cdx-muted);\n font-size: 11px;\n line-height: 1.2;\n user-select: none;\n animation: cdx-fade-up 160ms ease-out both;\n}\n\n.jp-CodexRunDivider::before,\n.jp-CodexRunDivider::after {\n content: '';\n flex: 1 1 auto;\n height: 1px;\n background: color-mix(in srgb, var(--cdx-border) 80%, transparent);\n}\n\n.jp-CodexRunDividerLabel {\n white-space: nowrap;\n color: color-mix(in srgb, var(--cdx-muted) 88%, var(--cdx-text));\n}\n\n.jp-CodexChat-user,\n.jp-CodexChat-assistant {\n /* Restore a roomier rhythm for the main chat bubbles without affecting activity lines. */\n margin-top: 6px;\n}\n\n.jp-CodexChat-message {\n position: relative;\n box-sizing: border-box;\n min-width: 0;\n padding: 10px 12px;\n border-radius: var(--cdx-radius);\n border: 1px solid color-mix(in srgb, var(--cdx-border) 70%, transparent);\n background: var(--cdx-surface);\n box-shadow: none;\n max-width: 100%;\n animation: cdx-fade-up 160ms ease-out both;\n}\n\n.jp-CodexChat-message.jp-CodexChat-activity {\n border: 0;\n background: transparent;\n padding: 0;\n border-radius: 0;\n box-shadow: none;\n}\n\n.jp-CodexChat-user {\n align-self: flex-end;\n background: color-mix(in srgb, var(--cdx-accent) 8%, var(--cdx-surface));\n border: 0;\n /* Indent user bubbles from the left so they remain visually distinct even when wide. */\n margin-left: clamp(24px, 8vw, 96px);\n}\n\n.jp-CodexChat-assistant {\n align-self: flex-start;\n border: 0;\n padding-left: 0;\n padding-right: 0;\n}\n\n/* If assistant output is a single fenced code block, remove outer bubble fill/padding. */\n.jp-CodexChat-assistant:has(> .jp-CodexChat-text > .jp-CodexCodeBlockWrap:only-child) {\n background: transparent;\n padding-top: 0;\n padding-bottom: 0;\n}\n\n.jp-CodexChat-assistant:has(> .jp-CodexChat-text > .jp-CodexCodeBlockWrap:only-child)\n > .jp-CodexChat-text\n > .jp-CodexCodeBlockWrap {\n margin-top: 0;\n}\n\n.jp-CodexChat-system {\n align-self: center;\n box-shadow: none;\n border: 0;\n border-color: transparent;\n background: transparent;\n color: var(--cdx-muted);\n text-align: center;\n padding: 2px 0;\n border-radius: 0;\n}\n\n.jp-CodexChat-reconnectNotice {\n align-self: stretch;\n border: 1px solid color-mix(in srgb, var(--cdx-warn) 35%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-warn) 10%, var(--cdx-surface));\n color: color-mix(in srgb, var(--cdx-warn) 62%, var(--cdx-text));\n text-align: left;\n padding: 10px 12px;\n border-radius: var(--cdx-radius-sm);\n}\n\n.jp-CodexChat-system .jp-CodexChat-text {\n /* System notices should read like status text, not a "message bubble". */\n font-size: 12px;\n line-height: 1.4;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n}\n\n.jp-CodexChat-reconnectNotice .jp-CodexChat-text {\n justify-content: flex-start;\n}\n\n.jp-CodexChat-system .jp-CodexChat-text::before {\n content: '';\n width: 14px;\n height: 14px;\n flex: 0 0 14px;\n background-repeat: no-repeat;\n background-size: 14px 14px;\n /* Inline SVG (data URI) so we don't depend on theme icon packs. */\n background-image: url(${x});\n}\n\n.jp-CodexChat-system.is-success .jp-CodexChat-text::before {\n content: none;\n display: none;\n background-image: none;\n}\n\n.jp-CodexChat-system.is-success .jp-CodexChat-text {\n gap: 0;\n}\n\n.jp-CodexReconnectBtn {\n appearance: none;\n margin-top: 8px;\n padding: 6px 10px;\n border: 1px solid color-mix(in srgb, var(--cdx-warn) 45%, var(--cdx-border));\n border-radius: 8px;\n background: var(--cdx-surface);\n color: color-mix(in srgb, var(--cdx-warn) 78%, var(--cdx-text));\n font-size: 12px;\n font-weight: 700;\n line-height: 1.3;\n text-decoration: none;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease, color 120ms ease;\n}\n\n.jp-CodexReconnectBtn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--cdx-warn) 10%, var(--cdx-surface));\n border-color: color-mix(in srgb, var(--cdx-warn) 60%, var(--cdx-border));\n color: color-mix(in srgb, var(--cdx-warn) 88%, var(--cdx-text));\n}\n\n.jp-CodexReconnectBtn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.jp-CodexChat-role {\n display: none;\n font-family: var(--cdx-mono);\n font-size: 11px;\n letter-spacing: 0.02em;\n color: var(--cdx-muted);\n margin-bottom: 6px;\n}\n\n.jp-CodexChat {\n --jp-code-font-size: 13px;\n}\n\n.jp-CodexChat-text {\n font-size: var(--jp-code-font-size);\n line-height: 1.55;\n color: inherit;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n.jp-CodexChat-text code,\n.jp-CodexChat-text pre,\n.jp-CodexChat-text pre code {\n font-size: var(--jp-code-font-size);\n}\n\n.jp-CodexChat-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 8px;\n}\n\n.jp-CodexChat-attachmentPill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 8px;\n border-radius: 999px;\n border: 1px solid color-mix(in srgb, var(--cdx-border) 70%, transparent);\n background: color-mix(in srgb, var(--cdx-surface-2) 80%, transparent);\n color: var(--cdx-muted);\n font-family: var(--cdx-mono);\n font-size: 11px;\n line-height: 1;\n}\n\n.jp-CodexChat-attachmentCount {\n color: var(--cdx-text);\n}\n\n.jp-CodexMarkdown {\n white-space: normal;\n}\n\n.jp-CodexMarkdown > :first-child {\n margin-top: 0;\n}\n\n.jp-CodexMarkdown > :last-child {\n margin-bottom: 0;\n}\n\n.jp-CodexMarkdown p {\n margin: 0 0 10px;\n}\n\n.jp-CodexMarkdown ul,\n.jp-CodexMarkdown ol {\n margin: 8px 0 8px 18px;\n padding: 0;\n}\n\n.jp-CodexMarkdown li {\n margin: 4px 0;\n}\n\n.jp-CodexMarkdown a {\n color: var(--cdx-accent);\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.jp-CodexMarkdown code {\n font-family: var(--cdx-mono);\n font-size: 11px;\n color: var(--cdx-code-text);\n padding: 2px 7px;\n border-radius: 10px;\n border: 0;\n background: color-mix(in srgb, var(--cdx-surface-2) 78%, transparent);\n line-height: 1.45;\n -webkit-box-decoration-break: clone;\n box-decoration-break: clone;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n\n.jp-CodexMarkdown pre {\n margin: 10px 0 0;\n padding: 10px;\n border-radius: var(--cdx-radius-sm);\n border: 1px solid var(--cdx-border);\n background: color-mix(in srgb, var(--cdx-surface-2) 88%, transparent);\n overflow: auto;\n font-family: var(--cdx-mono);\n font-size: 12px;\n line-height: 1.5;\n}\n\n.jp-CodexMarkdown pre code {\n font-size: inherit;\n line-height: inherit;\n padding: 0;\n border: 0;\n background: transparent;\n white-space: pre;\n}\n\n.jp-CodexMarkdown blockquote {\n margin: 10px 0;\n padding-left: 10px;\n border-left: 3px solid var(--cdx-border);\n color: var(--cdx-muted);\n}\n\n.jp-CodexMarkdown hr {\n border: 0;\n border-top: 1px solid var(--cdx-border);\n margin: 12px 0;\n}\n\n.jp-CodexCodeBlockWrap {\n margin: 10px 0 0;\n border-radius: var(--cdx-radius-sm);\n border: 1px solid var(--cdx-border);\n background: color-mix(in srgb, var(--cdx-surface-2) 88%, transparent);\n overflow: hidden;\n}\n\n.jp-CodexCodeBlockBar {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-bottom: 1px solid var(--cdx-border);\n background: color-mix(in srgb, var(--cdx-surface) 75%, transparent);\n}\n\n.jp-CodexCodeBlockMeta {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.jp-CodexCodeBlockLang {\n font-family: var(--cdx-mono);\n font-size: 11px;\n color: var(--cdx-muted);\n}\n\n.jp-CodexCodeBlock {\n margin: 0;\n padding: 10px;\n overflow: auto;\n font-family: var(--cdx-mono);\n font-size: 12px;\n line-height: 1.5;\n color: var(--cdx-code-text);\n}\n\n.jp-CodexCodeBlock code.hljs {\n display: block;\n padding: 0;\n margin: 0;\n border: 0;\n background: transparent;\n color: var(--cdx-code-text);\n font-family: inherit;\n white-space: pre;\n}\n\n.jp-CodexCodeBlock .hljs-comment,\n.jp-CodexCodeBlock .hljs-quote {\n color: var(--cdx-code-comment);\n font-style: italic;\n}\n\n.jp-CodexCodeBlock .hljs-keyword,\n.jp-CodexCodeBlock .hljs-selector-tag,\n.jp-CodexCodeBlock .hljs-literal,\n.jp-CodexCodeBlock .hljs-operator {\n color: var(--cdx-code-keyword);\n}\n\n.jp-CodexCodeBlock .hljs-string,\n.jp-CodexCodeBlock .hljs-symbol,\n.jp-CodexCodeBlock .hljs-regexp,\n.jp-CodexCodeBlock .hljs-template-tag,\n.jp-CodexCodeBlock .hljs-template-variable {\n color: var(--cdx-code-string);\n}\n\n.jp-CodexCodeBlock .hljs-number,\n.jp-CodexCodeBlock .hljs-literal {\n color: var(--cdx-code-number);\n}\n\n.jp-CodexCodeBlock .hljs-title,\n.jp-CodexCodeBlock .hljs-title.class_,\n.jp-CodexCodeBlock .hljs-title.class_.inherited__,\n.jp-CodexCodeBlock .hljs-section {\n color: var(--cdx-code-title);\n}\n\n.jp-CodexCodeBlock .hljs-function .hljs-title,\n.jp-CodexCodeBlock .hljs-title.function_,\n.jp-CodexCodeBlock .hljs-built_in,\n.jp-CodexCodeBlock .hljs-builtin-name {\n color: var(--cdx-code-function);\n}\n\n.jp-CodexCodeBlock .hljs-variable,\n.jp-CodexCodeBlock .hljs-attr,\n.jp-CodexCodeBlock .hljs-attribute,\n.jp-CodexCodeBlock .hljs-params {\n color: var(--cdx-code-variable);\n}\n\n.jp-CodexCodeBlock .hljs-meta,\n.jp-CodexCodeBlock .hljs-punctuation {\n color: var(--cdx-code-operator);\n}\n\n.jp-CodexCodeBlockCopyBtn {\n opacity: 0;\n pointer-events: none;\n transition: opacity 140ms ease;\n}\n\n.jp-CodexCodeBlockWrap:hover .jp-CodexCodeBlockCopyBtn,\n.jp-CodexCodeBlockWrap:focus-within .jp-CodexCodeBlockCopyBtn {\n opacity: 1;\n pointer-events: auto;\n}\n\n.jp-CodexChat-input {\n position: relative;\n z-index: 1;\n border-top: none;\n padding: 10px;\n background: var(--cdx-bg);\n}\n\n.jp-CodexChat-input::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: calc(-1 * var(--cdx-chat-bottom-fade));\n height: var(--cdx-chat-bottom-fade);\n background: linear-gradient(\n to bottom,\n color-mix(in srgb, var(--cdx-bg) 0%, transparent),\n var(--cdx-bg)\n );\n pointer-events: none;\n}\n\n.jp-CodexComposer {\n /* Keep composer controls a touch smaller than the header toolbar. */\n --cdx-composer-btn-size: 30px;\n --cdx-composer-btn-radius: 9px;\n --cdx-composer-btn-pad-x: 9px;\n\n border: 1px solid var(--cdx-border);\n border-radius: 16px;\n padding: 10px;\n background: var(--cdx-surface);\n box-shadow: none;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.jp-CodexComposer:focus-within {\n border-color: color-mix(in srgb, var(--cdx-accent) 65%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);\n}\n\n.jp-CodexComposer textarea {\n width: 100%;\n box-sizing: border-box;\n resize: none;\n min-height: calc(1.55em + 12px);\n max-height: calc(1.55em * 3 + 12px);\n border: 0;\n border-radius: 14px;\n padding: 6px 10px;\n font-size: 13px;\n line-height: 1.55;\n background: transparent;\n color: var(--cdx-text);\n outline: none;\n overflow-y: hidden;\n}\n\n.jp-CodexComposer textarea::placeholder {\n color: color-mix(in srgb, var(--cdx-muted) 70%, transparent);\n}\n\n.jp-CodexComposer textarea:disabled {\n opacity: 0.7;\n}\n\n.jp-CodexComposer-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 0 4px;\n}\n\n.jp-CodexComposer-attachment {\n position: relative;\n width: 64px;\n height: 64px;\n border-radius: 14px;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface-2);\n overflow: hidden;\n}\n\n.jp-CodexComposer-attachment img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.jp-CodexComposer-attachmentRemove {\n appearance: none;\n position: absolute;\n top: 6px;\n right: 6px;\n width: 26px;\n height: 26px;\n border-radius: 10px;\n border: 1px solid color-mix(in srgb, var(--cdx-border) 85%, transparent);\n background: color-mix(in srgb, var(--cdx-surface) 70%, transparent);\n color: var(--cdx-text);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.jp-CodexComposer-attachmentRemove:hover:not(:disabled) {\n background: var(--cdx-surface);\n border-color: color-mix(in srgb, var(--cdx-accent) 25%, var(--cdx-border));\n}\n\n.jp-CodexComposer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding-top: 8px;\n}\n\n.jp-CodexComposer-toolbarLeft {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-wrap: wrap;\n min-width: 0;\n flex: 1;\n}\n\n.jp-CodexComposer-toolbarRight {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n}\n\n.jp-CodexComposer-hint {\n font-size: 11px;\n color: var(--cdx-muted);\n white-space: nowrap;\n}\n\n@container (max-width: 420px) {\n .jp-CodexComposer-hint {\n display: none;\n }\n}\n\n@media (max-width: 520px) {\n .jp-CodexComposer-hint {\n display: none;\n }\n}\n\n.jp-CodexIconBtn {\n appearance: none;\n width: var(--cdx-composer-btn-size, 30px);\n height: var(--cdx-composer-btn-size, 30px);\n border-radius: var(--cdx-composer-btn-radius, 9px);\n border: 1px solid transparent;\n background: transparent;\n color: var(--cdx-muted);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease, color 120ms ease;\n}\n\n.jp-CodexIconBtn:hover:not(:disabled) {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n}\n\n.jp-CodexIconBtn:active:not(:disabled) {\n background: var(--cdx-surface-2);\n}\n\n.jp-CodexIconBtn:focus-visible {\n outline: none;\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n box-shadow: none;\n}\n\n.jp-CodexIconBtn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.jp-CodexIconBtn.is-active {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n}\n\n.jp-CodexIconBtn.is-open {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n color: var(--cdx-text);\n}\n\n.jp-CodexMenuWrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n overflow: visible;\n}\n\n.jp-CodexModelWrap {\n flex: 0 1 auto;\n min-width: 0;\n}\n\n.jp-CodexModelBtn {\n appearance: none;\n height: var(--cdx-composer-btn-size, 30px);\n width: auto;\n max-width: 240px;\n min-width: 0;\n padding: 0 var(--cdx-composer-btn-pad-x, 9px);\n border-radius: var(--cdx-composer-btn-radius, 9px);\n border: 1px solid transparent;\n background: transparent;\n color: var(--cdx-text);\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n font-size: 12px;\n font-weight: 400;\n transition: background 120ms ease, border-color 120ms ease, color 120ms ease;\n}\n\n.jp-CodexModelBtn:hover:not(:disabled) {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n}\n\n.jp-CodexModelBtn:active:not(:disabled) {\n background: var(--cdx-surface-2);\n}\n\n.jp-CodexModelBtn:focus-visible {\n outline: none;\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n box-shadow: none;\n}\n\n.jp-CodexModelBtn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.jp-CodexModelBtn.is-open {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n}\n\n.jp-CodexModelBtn-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jp-CodexMenuWrap-right {\n justify-content: flex-end;\n}\n\n.jp-CodexMenu {\n position: absolute;\n left: 0;\n bottom: calc(100% + 10px);\n z-index: 20;\n min-width: 240px;\n max-width: min(320px, calc(100vw - 24px));\n transform-origin: bottom left;\n border-radius: 14px;\n border: 1px solid color-mix(in srgb, var(--cdx-border) 85%, transparent);\n background: color-mix(in srgb, var(--cdx-surface) 92%, transparent);\n box-shadow: 0 14px 36px rgba(2, 6, 23, 0.16);\n padding: 6px;\n backdrop-filter: blur(10px);\n animation: cdx-menu-in 120ms ease-out both;\n}\n\n@supports (width: 1cqw) {\n .jp-CodexMenu {\n max-width: min(320px, calc(100cqw - 24px));\n }\n}\n\n.jp-CodexMenu--right {\n left: auto;\n right: 0;\n transform-origin: bottom right;\n}\n\n.jp-CodexMenuItem {\n appearance: none;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 9px 10px;\n border-radius: 12px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--cdx-text);\n cursor: pointer;\n text-align: left;\n font-size: 12px;\n font-weight: 400;\n transition: background 120ms ease, border-color 120ms ease, color 120ms ease;\n}\n\n.jp-CodexMenuItem:hover {\n background: var(--cdx-surface-2);\n border-color: color-mix(in srgb, var(--cdx-border) 85%, transparent);\n}\n\n.jp-CodexMenuItem:focus-visible {\n outline: none;\n border-color: color-mix(in srgb, var(--cdx-accent) 45%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 18%, transparent);\n}\n\n.jp-CodexMenuItem.is-active {\n background: color-mix(in srgb, var(--cdx-accent) 10%, var(--cdx-surface));\n border-color: color-mix(in srgb, var(--cdx-accent) 28%, var(--cdx-border));\n}\n\n.jp-CodexMenuItemLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jp-CodexMenuCheck {\n flex: 0 0 auto;\n color: color-mix(in srgb, var(--cdx-accent) 80%, var(--cdx-text));\n}\n\n.jp-CodexMenuDivider {\n height: 1px;\n margin: 6px;\n background: color-mix(in srgb, var(--cdx-border) 85%, transparent);\n}\n\n.jp-CodexMenuCustom {\n padding: 6px;\n display: grid;\n gap: 6px;\n}\n\n.jp-CodexMenuCustomLabel {\n font-size: 11px;\n font-weight: 700;\n color: var(--cdx-muted);\n}\n\n.jp-CodexMenuInput {\n width: 100%;\n border: 1px solid var(--cdx-border);\n border-radius: 12px;\n background: var(--cdx-surface);\n color: var(--cdx-text);\n font-size: 12px;\n padding: 9px 10px;\n outline: none;\n}\n\n.jp-CodexMenuInput:focus {\n border-color: color-mix(in srgb, var(--cdx-accent) 65%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 18%, transparent);\n}\n\n.jp-CodexMenuPortal {\n position: fixed;\n bottom: auto;\n right: auto;\n z-index: 10000;\n max-width: min(360px, calc(100vw - 24px));\n\n /* Portal menus live outside \`.jp-CodexPanel\`, so they must re-declare these CSS vars. */\n --cdx-bg: var(--jp-layout-color1, #ffffff);\n --cdx-surface: var(--jp-layout-color0, #ffffff);\n --cdx-surface-2: var(--jp-layout-color2, #f3f4f6);\n --cdx-border: var(--jp-border-color2, rgba(148, 163, 184, 0.35));\n --cdx-text: var(--jp-ui-font-color0, #0f172a);\n --cdx-muted: var(--jp-ui-font-color2, #64748b);\n --cdx-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",\n "Courier New", monospace;\n\n --cdx-accent: var(--jupyterlab-codex-accent, #6E80FF);\n --cdx-good: var(--jp-success-color1, #22c55e);\n --cdx-warn: var(--jp-warn-color1, #f97316);\n --cdx-bad: var(--jp-error-color1, #ef4444);\n\n --cdx-radius: 14px;\n --cdx-radius-sm: 10px;\n\n font-family: var(\n --jp-ui-font-family,\n system-ui,\n -apple-system,\n Segoe UI,\n Roboto,\n Helvetica,\n Arial,\n sans-serif\n );\n color: var(--cdx-text);\n}\n\n.jp-CodexUsageBtn {\n position: relative;\n}\n\n.jp-CodexPermissionBtn.is-danger:not(:disabled) {\n border-color: transparent;\n background: transparent;\n color: color-mix(in srgb, var(--cdx-bad) 70%, var(--cdx-text));\n}\n\n.jp-CodexPermissionBtn.is-danger:hover:not(:disabled),\n.jp-CodexPermissionBtn.is-danger.is-open:not(:disabled) {\n border-color: color-mix(in srgb, var(--cdx-bad) 55%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-bad) 10%, var(--cdx-surface));\n color: color-mix(in srgb, var(--cdx-bad) 85%, var(--cdx-text));\n}\n\n.jp-CodexUsageBtn.is-stale:not(:disabled),\n.jp-CodexUsageBtn.is-stale:hover:not(:disabled),\n.jp-CodexUsageBtn.is-stale.is-open:not(:disabled) {\n opacity: 0.72;\n color: color-mix(in srgb, var(--cdx-muted) 85%, var(--cdx-border));\n}\n\n.jp-CodexUsageBtn.is-overdue:not(:disabled),\n.jp-CodexUsageBtn.is-overdue:hover:not(:disabled),\n.jp-CodexUsageBtn.is-overdue.is-open:not(:disabled) {\n border-color: color-mix(in srgb, var(--cdx-warn) 40%, var(--cdx-border));\n}\n\n.jp-CodexUsagePopover {\n min-width: 0;\n width: min(300px, calc(100vw - 24px));\n max-width: min(320px, calc(100vw - 24px));\n padding: 8px;\n}\n\n.jp-CodexUsageNotice {\n margin: 2px;\n padding: 8px 10px;\n border-radius: 12px;\n border: 1px solid color-mix(in srgb, var(--cdx-border) 85%, transparent);\n background: color-mix(in srgb, var(--cdx-surface-2) 85%, transparent);\n color: var(--cdx-muted);\n font-size: 11px;\n line-height: 1.25;\n}\n\n.jp-CodexUsageNotice.is-stale {\n border-color: color-mix(in srgb, var(--cdx-warn) 25%, var(--cdx-border));\n}\n\n.jp-CodexUsageNotice.is-overdue {\n border-color: color-mix(in srgb, var(--cdx-warn) 55%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-warn) 10%, var(--cdx-surface));\n color: color-mix(in srgb, var(--cdx-warn) 75%, var(--cdx-text));\n}\n\n.jp-CodexUsageNoticeTitle {\n font-weight: 800;\n color: var(--cdx-text);\n}\n\n.jp-CodexUsageNotice.is-overdue .jp-CodexUsageNoticeTitle {\n color: color-mix(in srgb, var(--cdx-warn) 85%, var(--cdx-text));\n}\n\n.jp-CodexUsageNoticeBody {\n margin-top: 2px;\n}\n\n.jp-CodexUsageSection {\n padding: 6px;\n display: grid;\n gap: 6px;\n}\n\n.jp-CodexUsageSectionTop {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 10px;\n}\n\n.jp-CodexUsageSectionTitle {\n font-size: 12px;\n font-weight: 750;\n color: var(--cdx-text);\n}\n\n.jp-CodexUsageSectionReset {\n font-size: 11px;\n color: var(--cdx-muted);\n white-space: nowrap;\n}\n\n.jp-CodexUsageBar {\n height: 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--cdx-border) 80%, transparent);\n overflow: hidden;\n}\n\n.jp-CodexUsageBarFill {\n height: 100%;\n width: 0%;\n border-radius: 999px;\n background: color-mix(in srgb, var(--cdx-accent) 70%, var(--cdx-good));\n transition: width 160ms ease;\n}\n\n.jp-CodexUsageBarFill.is-stale {\n background: color-mix(in srgb, var(--cdx-muted) 65%, var(--cdx-border));\n}\n\n.jp-CodexUsageMeta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n color: var(--cdx-muted);\n font-size: 11px;\n}\n\n.jp-CodexUsageMetaLeft {\n font-weight: 750;\n}\n\n.jp-CodexUsageMetaRight {\n opacity: 0.9;\n white-space: nowrap;\n}\n\n.jp-CodexUsageFooter {\n padding: 4px 10px 2px;\n font-size: 11px;\n color: var(--cdx-muted);\n}\n\n.jp-CodexComposerSelectWrap {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.jp-CodexComposerSelectWrap::after {\n content: '';\n position: absolute;\n right: 10px;\n width: 7px;\n height: 7px;\n border-right: 2px solid var(--cdx-muted);\n border-bottom: 2px solid var(--cdx-muted);\n transform: rotate(45deg);\n pointer-events: none;\n}\n\n.jp-CodexComposerSelect {\n appearance: none;\n border: 1px solid var(--cdx-border);\n border-radius: 10px;\n background: var(--cdx-surface-2);\n color: var(--cdx-text);\n font-size: 12px;\n font-weight: 650;\n padding: 7px 26px 7px 10px;\n outline: none;\n max-width: 220px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.jp-CodexComposerSelect:hover {\n background: var(--cdx-surface);\n}\n\n.jp-CodexComposerSelect:focus {\n border-color: color-mix(in srgb, var(--cdx-accent) 65%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);\n background: var(--cdx-surface);\n}\n\n.jp-CodexComposerModelInput {\n border: 1px solid var(--cdx-border);\n border-radius: 999px;\n background: var(--cdx-surface);\n color: var(--cdx-text);\n font-size: 12px;\n padding: 7px 10px;\n width: 190px;\n max-width: 100%;\n outline: none;\n}\n\n.jp-CodexComposerModelInput:focus {\n border-color: color-mix(in srgb, var(--cdx-accent) 65%, var(--cdx-border));\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);\n}\n\n.jp-CodexSendBtn {\n appearance: none;\n padding: 0;\n width: var(--cdx-composer-btn-size, 30px);\n height: var(--cdx-composer-btn-size, 30px);\n min-width: var(--cdx-composer-btn-size, 30px);\n min-height: var(--cdx-composer-btn-size, 30px);\n max-width: var(--cdx-composer-btn-size, 30px);\n max-height: var(--cdx-composer-btn-size, 30px);\n flex: 0 0 var(--cdx-composer-btn-size, 30px);\n border-radius: 9999px !important;\n overflow: hidden;\n border: 1px solid var(--cdx-border);\n background: var(--cdx-surface-2);\n color: var(--cdx-muted);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease, box-shadow 120ms ease, color 120ms ease;\n}\n\n.jp-CodexSendBtn:not(:disabled) {\n border-color: color-mix(in srgb, #000000 80%, var(--cdx-border));\n background: #000000;\n color: #ffffff;\n}\n\n.jp-CodexSendBtn:hover:not(:disabled) {\n border-color: color-mix(in srgb, #000000 92%, var(--cdx-border));\n background: color-mix(in srgb, #000000 92%, #222222);\n}\n\n.jp-CodexSendBtn:active:not(:disabled) {\n background: color-mix(in srgb, #000000 88%, #222222);\n}\n\n.jp-CodexSendBtn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--cdx-accent) 22%, transparent);\n}\n\n.jp-CodexSendBtn:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.jp-CodexSendBtn.is-stop:not(:disabled) {\n border-color: color-mix(in srgb, #000000 80%, var(--cdx-border));\n background: #000000;\n color: #ffffff;\n}\n\n.jp-CodexSendBtn.is-stop:hover:not(:disabled) {\n border-color: color-mix(in srgb, #000000 92%, var(--cdx-border));\n background: color-mix(in srgb, #000000 92%, #222222);\n}\n\n.jp-CodexSendBtn.is-stop:active:not(:disabled) {\n background: color-mix(in srgb, #000000 88%, #222222);\n}\n\n.jp-CodexBtn {\n appearance: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--cdx-border);\n border-radius: 10px;\n padding: 6px 10px;\n min-height: 28px;\n background: var(--cdx-surface);\n color: var(--cdx-text);\n font-size: 12px;\n font-weight: 650;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease, box-shadow 120ms ease, color 120ms ease;\n}\n\n.jp-CodexBtn:hover:not(:disabled) {\n background: var(--cdx-surface-2);\n border-color: color-mix(in srgb, var(--cdx-accent) 20%, var(--cdx-border));\n}\n\n.jp-CodexBtn:active:not(:disabled) {\n background: var(--cdx-surface);\n}\n\n.jp-CodexBtn:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n box-shadow: none;\n}\n\n.jp-CodexBtn-xs {\n padding: 6px 10px;\n font-size: 11px;\n min-height: 26px;\n}\n\n.jp-CodexBtn-ghost {\n background: transparent;\n border-color: transparent;\n}\n\n.jp-CodexBtn-ghost:hover:not(:disabled) {\n background: var(--cdx-surface-2);\n border-color: var(--cdx-border);\n}\n\n.jp-CodexBtn-primary {\n border-color: color-mix(in srgb, var(--cdx-accent) 80%, var(--cdx-border));\n background: var(--cdx-accent);\n color: #ffffff;\n}\n\n.jp-CodexBtn-primary:hover {\n border-color: color-mix(in srgb, var(--cdx-accent) 92%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-accent) 92%, #000000);\n}\n\n.jp-CodexBtn-danger {\n border-color: color-mix(in srgb, var(--cdx-bad) 55%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-bad) 10%, var(--cdx-surface));\n}\n\n.jp-CodexBtn-danger:hover {\n border-color: color-mix(in srgb, var(--cdx-bad) 70%, var(--cdx-border));\n background: color-mix(in srgb, var(--cdx-bad) 14%, var(--cdx-surface));\n}\n\n.jp-CodexJumpBar {\n position: absolute;\n left: 0;\n right: 0;\n top: -52px;\n display: flex;\n justify-content: center;\n pointer-events: none;\n z-index: 2;\n opacity: 0;\n transform: translateY(6px);\n visibility: hidden;\n transition:\n opacity 140ms ease,\n transform 180ms cubic-bezier(0.2, 0.9, 0.2, 1),\n visibility 0s linear 180ms;\n}\n\n.jp-CodexJumpBar.is-visible {\n opacity: 1;\n transform: translateY(0);\n visibility: visible;\n transition:\n opacity 160ms ease,\n transform 200ms cubic-bezier(0.2, 0.9, 0.2, 1),\n visibility 0s linear 0s;\n}\n\n.jp-CodexJumpBar > * {\n pointer-events: auto;\n}\n\n.jp-CodexJumpBar:not(.is-visible) > * {\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .jp-CodexJumpBar {\n transition: none;\n transform: none;\n }\n}\n\n.jp-CodexJumpBar .jp-CodexJumpToLatestBtn {\n appearance: none;\n -webkit-appearance: none;\n box-sizing: border-box;\n width: 32px !important;\n height: 32px !important;\n min-width: 32px !important;\n min-height: 32px !important;\n max-width: 32px !important;\n max-height: 32px !important;\n border-radius: 50% !important;\n overflow: hidden;\n border: 1px solid color-mix(in srgb, var(--cdx-border) 55%, transparent) !important;\n background: var(--cdx-surface) !important;\n color: color-mix(in srgb, var(--cdx-fg) 92%, var(--cdx-muted));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 !important;\n cursor: pointer;\n line-height: 0;\n transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;\n}\n\n.jp-CodexJumpBar .jp-CodexJumpToLatestBtn svg {\n display: block;\n}\n\n.jp-CodexJumpBar .jp-CodexJumpToLatestBtn:hover {\n background: color-mix(in srgb, var(--cdx-surface) 88%, #ffffff);\n border-color: color-mix(in srgb, var(--cdx-border) 75%, transparent);\n transform: translateY(-1px);\n}\n\n.jp-CodexJumpBar .jp-CodexJumpToLatestBtn:active {\n transform: translateY(0);\n}\n\n.jp-CodexJumpBar .jp-CodexJumpToLatestBtn:focus-visible {\n outline: 2px solid color-mix(in srgb, var(--cdx-accent) 55%, transparent);\n outline-offset: 3px;\n}\n\n.jp-CodexChat-loading {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n color: var(--cdx-muted);\n align-self: flex-start;\n border-radius: var(--cdx-radius);\n border: 1px solid color-mix(in srgb, var(--cdx-border) 70%, transparent);\n background: var(--cdx-surface);\n max-width: 100%;\n}\n\n.jp-CodexChat-loading.is-reasoning {\n background: color-mix(in srgb, var(--cdx-accent) 6%, var(--cdx-surface-2));\n border-style: dashed;\n border-color: color-mix(in srgb, var(--cdx-accent) 24%, var(--cdx-border));\n color: color-mix(in srgb, var(--cdx-accent) 30%, var(--cdx-muted));\n}\n\n.jp-CodexChat-loading.is-reasoning .jp-CodexChat-loading-dots span {\n background: color-mix(in srgb, var(--cdx-accent) 55%, var(--cdx-muted));\n}\n\n.jp-CodexChat-loading.is-reasoning .jp-CodexChat-loadingText {\n color: color-mix(in srgb, var(--cdx-accent) 35%, var(--cdx-muted));\n}\n\n.jp-CodexChat-loading-dots {\n display: flex;\n gap: 8px;\n}\n\n.jp-CodexChat-loading-dots span {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--cdx-accent);\n animation: cdx-bounce 1.4s infinite ease-in-out both;\n}\n\n.jp-CodexChat-loading-dots span:nth-child(1) {\n animation-delay: -0.32s;\n}\n\n.jp-CodexChat-loading-dots span:nth-child(2) {\n animation-delay: -0.16s;\n}\n\n@keyframes cdx-bounce {\n 0%,\n 80%,\n 100% {\n transform: scale(0);\n opacity: 0.55;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n@keyframes cdx-fade-up {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes cdx-pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.08);\n opacity: 0.8;\n }\n}\n\n@keyframes cdx-status-dot {\n 0%,\n 100% {\n transform: scale(1);\n filter: brightness(1);\n }\n 50% {\n transform: scale(1.22);\n filter: brightness(1.15);\n }\n}\n\n@keyframes cdx-status-ring {\n 0% {\n opacity: 0;\n transform: scale(0.55);\n }\n 20% {\n opacity: 0.75;\n }\n 100% {\n opacity: 0;\n transform: scale(1.15);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .jp-CodexStatusPill-running .jp-CodexStatusPill-dot,\n .jp-CodexStatusPill-running .jp-CodexStatusPill-dot::after {\n animation: none;\n }\n}\n\n@keyframes cdx-menu-in {\n from {\n opacity: 0;\n transform: translateY(6px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n`,""]);const u=p},3915(e){e.exports="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%20viewBox%3D%270%200%2024%2024%27%3E%3Cpath%20fill%3D%27%23f5b301%27%20d%3D%27M1%2021h22L12%202%201%2021z%27/%3E%3Cpath%20fill%3D%27%235a4b00%27%20d%3D%27M13%2016h-2v-6h2v6zm0%204h-2v-2h2v2z%27/%3E%3C/svg%3E"}}]);
|