jupyterlab-codex-sidebar 0.1.3 → 0.1.4

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/AGENTS.md CHANGED
@@ -46,3 +46,45 @@
46
46
 
47
47
  - User-facing UI labels, buttons, notices, dialogs, and system messages must always be displayed in English.
48
48
  - Do not introduce Korean (or other non-English) UI strings in code changes.
49
+
50
+ ## 배포 프로세스 (이 레포지토리 전용)
51
+
52
+ 이 프로젝트(`jupyterlab-codex-sidebar`)는 Python 패키지(PyPI)와 JupyterLab 확장 패키지(NPM) 모두 배포해야 JupyterLab Discovery에 안정적으로 노출되고 서버 확장이 함께 동작합니다.
53
+
54
+ 1) 사전 점검
55
+ - `npm`, `node`, `jlpm`, `jupyter`, `twine`, `python`(또는 `python3`)이 설치돼 있어야 함
56
+ - PyPI/NPM 계정 토큰 준비
57
+ - 현재 변경사항은 커밋/브랜치 정리 후 진행
58
+
59
+ 2) 릴리스 버전 규칙
60
+ - `package.json`과 `pyproject.toml`의 버전은 항상 동일해야 함
61
+ - 동일 버전으로 재업로드 시도 불가(Python dist는 파일명 재사용 불가로 400 에러 발생)
62
+ - `x.y.z` 형식(SemVer)으로 bump
63
+
64
+ 3) 권장 릴리스 명령(전체 배포)
65
+ - `./release.sh <new_version>`
66
+ - 예) `./release.sh 0.1.4`
67
+
68
+ 4) 릴리스 스크립트 동작
69
+ - 버전 동기화 (`package.json`, `pyproject.toml`)
70
+ - `jlpm install`
71
+ - `jlpm run build`
72
+ - 이전 `dist/` 정리
73
+ - `python -m build` 실행 (`dist/*.tar.gz`, `dist/*.whl` 생성)
74
+ - `twine`로 PyPI 업로드
75
+ - `npm publish --access public` 실행
76
+
77
+ 5) 선택 업로드
78
+ - PyPI만: `./release.sh 0.1.4 --skip-npm`
79
+ - npm만: `./release.sh 0.1.4 --skip-pypi`
80
+ - 테스트 업로드: `./release.sh 0.1.4 --repository testpypi`
81
+
82
+ 6) 배포 후 확인
83
+ - PyPI: `pip index versions jupyterlab-codex-sidebar`
84
+ - npm: `npm view jupyterlab-codex-sidebar`
85
+ - 사용자 설치 확인(예): `pip install jupyterlab-codex-sidebar==<버전>`
86
+ - JupyterLab Extension Manager에서 `jupyterlab-codex-sidebar` 검색/표시 확인
87
+
88
+ 7) 기존 실수 방지 규칙
89
+ - `release.sh` 실행 전 `dist/`에 남은 이전 버전 파일을 지워도 되지만, 가장 중요하게 `release.sh`는 새 버전으로만 실행해야 함
90
+ - 400 에러(duplicate file)는 대개 버전 미갱신 또는 dist 재생성 누락 때문에 발생
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jupyterlab-codex-sidebar",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "author": "ILHO AHN",
5
5
  "description": "Codex sidebar for JupyterLab",
6
6
  "license": "BSD-3-Clause",
@@ -54,7 +54,7 @@
54
54
  "extension": true,
55
55
  "outputDir": "jupyterlab_codex/labextension",
56
56
  "_build": {
57
- "load": "static/remoteEntry.b2fdc03a1c4582e79156.js",
57
+ "load": "static/remoteEntry.a2982f776a1f0f515640.js",
58
58
  "extension": "./extension"
59
59
  }
60
60
  }
@@ -0,0 +1 @@
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",E="jupyterlab-codex:notify-on-done-min-seconds",L="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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/'/g,"&#39;")}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,Ee]=(0,i.useState)(()=>"false"!==(te(L)??"true")),[Le,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(E);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=(0,i.useRef)(""),Qe=(0,i.useRef)(new Map),[Xe,en]=(0,i.useState)(!1),[nn,tn]=(0,i.useState)(!1),[on,rn]=(0,i.useState)(0),[an,sn]=(0,i.useState)(!0),[dn,cn]=(0,i.useState)(!1),[ln,pn]=(0,i.useState)(!1),[xn,un]=(0,i.useState)(!1),[fn,mn]=(0,i.useState)(!1),[gn,hn]=(0,i.useState)(null),bn=(0,i.useRef)(null),vn=(0,i.useRef)(new Map),jn=(0,i.useRef)(new Map),Cn=(0,i.useRef)(Z()),yn=(0,i.useRef)(0),wn=(0,i.useRef)(new Set),kn=(0,i.useRef)(De),Sn=(0,i.useRef)(We),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),En=(0,i.useRef)(null),Ln=(0,i.useRef)(null),On=(0,i.useRef)(null),Dn=(0,i.useRef)(null),[Fn,Wn]=(0,i.useState)(!1),Tn=(0,i.useRef)(null),Jn=(0,i.useMemo)(()=>X(),[n]),Kn="__config__"===re?"":re,Hn="__config__"===ge?"":ge,qn=M.model,Yn=M.reasoningEffort,Vn="__config__"===re?qn||"":re,Zn=(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,Vn),[M.availableModels,Vn]);function Gn(e){const n=j.current||"";if(!n)return;const t=new Map(Qe.current);e?t.set(n,e):t.delete(n),Qe.current=t}function Qn(){if(!j.current)return qe(""),void(Ge.current="");Gn(""),qe(""),Ge.current=""}function Xn(e){r.current=e,t(e)}function et(e){t(n=>{const t=e(n);return r.current=t,t})}function nt(e){return V(e||"")}function tt(e){return nt(e)}function ot(e,n){const t=e||"",o=n||tt(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),jn.current.set(t,o),Xn(s),i}function rt(e,n,t,o){const r=bn.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 at(){const e=bn.current;if(!e||e.readyState!==WebSocket.OPEN)return!1;try{return e.send(JSON.stringify({type:"delete_all_sessions"})),!0}catch{return!1}}function it(e,n,t){if(!e)return;const o=Date.now();et(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 st(e,n,t=""){const o=e||j.current||"";if(!o)return;const r=n?ue(n,260):"",a=r?t:"";et(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 dt(e,n){const t=e||j.current||"";t&&et(e=>{const o=new Map(e),r=o.get(t)??ee("","Session started",{sessionKey:t});return o.set(t,{...r,...n}),o})}function ct(e,n,t){if(!t)return;const o=e||j.current||"";if(!o)return;const r=ie(n,t);et(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 lt(){Mn.current?.scrollIntoView({block:"end"})}function pt(e){const n=vn.current,t=new Map(n);for(const[o,r]of n)r===e&&t.delete(o);vn.current=t}async function xt(n){const{path:t}=G(n);if(!t)return;const r=e.notebooks.currentWidget;if(!r||r.context.path!==t)return void wn.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(),ct(n,"system","Notebook was refreshed after Codex file updates."),wn.current.delete(n)}catch(e){ct(n,"system",`Failed to refresh notebook: ${String(e)}`),wn.current.add(n)}else wn.current.add(n)}function ut(e){const n=e??Tn.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 ft(){for(const e of Ze.current)URL.revokeObjectURL(e.previewUrl);Ze.current=[],Ve([])}async function mt(){const n=bn.current,t=p.current||"",o=j.current||"";if(!t)return;if(!o)return;if(!n||n.readyState!==WebSocket.OPEN)return void ct(o,"system","WebSocket is not connected.");const a=o?r.current.get(o):null;if(!1===a?.pairedOk)return void ct(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 ct(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&&Le?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=ot(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 ct(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:Kn||void 0,reasoningEffort:Hn||void 0,sandbox:Me,images:m}));const g=Ze.current.length;et(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}),Qn(),ft()}(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&&(Zn.some(e=>e.value===ge)||Se("__config__"))},[ge,Zn]),(0,i.useEffect)(()=>{"__config__"!==re&&(Q.some(e=>e.value===re)||ae("__config__"))},[re,Q]),(0,i.useEffect)(()=>{Ge.current=He},[He]),(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,Kn)},[Kn]),(0,i.useEffect)(()=>{de(_,ze?"true":"false")},[ze]),(0,i.useEffect)(()=>{de(L,Ue?"true":"false")},[Ue]),(0,i.useEffect)(()=>{Ue&&!Le&&null===te(O)&&Oe(!0)},[Ue,Le]),(0,i.useEffect)(()=>{de(O,Le?"true":"false")},[Le]),(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)(()=>{kn.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;Sn.current=e,n=e,de(E,String(Math.max(0,Math.trunc(n))))},[We]),(0,i.useEffect)(()=>{if(!(dn||ln||xn||fn))return;const e=e=>{const n=e.target;if(!n)return;const t=Bn.current?.contains(n)??!1,o=$n.current?.contains(n)??!1,r=_n.current?.contains(n)??!1,a=Rn.current?.contains(n)??!1,i=An.current?.contains(n)??!1,s=In.current?.contains(n)??!1,d=En.current?.contains(n)??!1,c=On.current?.contains(n)??!1;t||o||r||a||i||s||d||c||(cn(!1),pn(!1),un(!1),mn(!1))},n=e=>{"Escape"===e.key&&(e.preventDefault(),cn(!1),pn(!1),un(!1),mn(!1))};return window.addEventListener("pointerdown",e,!0),window.addEventListener("keydown",n),()=>{window.removeEventListener("pointerdown",e,!0),window.removeEventListener("keydown",n)}},[dn,ln,xn,fn]),(0,i.useEffect)(()=>{const n=()=>{const n=_e(e.notebooks),t=nt(n),o=j.current;if(t&&t===o)return;if(o&&Gn(Ge.current),p.current=n,l(n),u(t),j.current=t,!t)return void Qn();if(function(e){const n=e&&Qe.current.get(e)||"";Ge.current=n,qe(n)}(t),ft(),sn(!0),!n)return;const r=ot(n,t);jn.current.set(n,t),rt(r,n,t),wn.current.has(t)&&xt(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===Cn.current)return;const t=n.notebookPath,o=n.sessionKey,r=n.threadId;if(!t||!o||!r)return;const a=nt(t);if(!a||a!==o)return;const i=ne(t,o,r),s=p.current;et(e=>{const n=new Map(e),t=n.get(o);return t&&t.threadId===r?e:(n.set(o,i),n)}),jn.current.set(t,o),pt(o),s===t&&j.current!==o&&u(o),s===t&&(Qn(),ft()),rt(i,t,o)};return window.addEventListener("storage",e),()=>{window.removeEventListener("storage",e)}},[]),(0,i.useEffect)(()=>{tn(!0);const n=d.ServerConnection.makeSettings(),t=c.URLExt.join(n.wsUrl,"codex","ws");let o;try{o=new WebSocket(t)}catch{return en(!1),void tn(!1)}return bn.current=o,o.onopen=()=>{en(!0),tn(!1),pe()&&at();const n=p.current||_e(e.notebooks);if(!n)return;const t=tt(n);rt(ot(n,t),n,t)},o.onclose=()=>{en(!1),tn(!1),vn.current=new Map},o.onerror=()=>{en(!1),tn(!1)},o.onmessage=e=>{let n;try{n=JSON.parse(e.data)}catch(n){return void ct(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=vn.current.get(o);if(e)return e}if(n){if(o){const e=jn.current.get(n);if(e)return vn.current.set(o,e),e}return jn.current.get(n)||V(n)}if(o){const e=vn.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&&ct(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)&&et(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)&&dt(o,{pairedOk:e,pairedPath:t,pairedOsPath:r,pairedMessage:a})}return void("running"===n.state&&o?(it(o,"running",t||null),st(o,"","")):"ready"===n.state&&o&&t&&(it(o,"ready",null),st(o,"",""),vn.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&&et(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 st(o,t.progress,t.progressKind)}if("error"===n.type){const e="string"==typeof n.suggestedCommandPath?n.suggestedCommandPath.trim():"";if(e&&!Re&&(Pe(e),ct(o,"system",`Suggested command path has been saved to settings: ${e}`)),ct(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)&&dt(o,{pairedOk:e,pairedPath:t,pairedOsPath:r,pairedMessage:a})}return o&&(it(o,"ready",null),st(o,"","")),void(t&&vn.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)&&dt(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&&xt(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):"";ct(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(!kn.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*Sn.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&&(it(o,"ready",null),st(o,"","")),t&&vn.current.delete(t)}}else ct(o,"assistant",n.text||"")}else hn((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(),bn.current=null,vn.current=new Map}},[e.notebooks,on]),(0,i.useEffect)(()=>{if(!an)return;const e=window.requestAnimationFrame(()=>lt());return()=>window.cancelAnimationFrame(e)},[an,n,s,Xe]),(0,i.useEffect)(()=>{const e=window.requestAnimationFrame(()=>ut());return()=>window.cancelAnimationFrame(e)},[He]),(0,i.useEffect)(()=>{const e=()=>ut();return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);const gt=x?n.get(x):null,ht=gt?.messages??[],bt=gt?.progressKind??"",vt=Xe?gt?.runState??"ready":"disconnected",jt=s?s.split("/").pop()||"Untitled":"No notebook",Ct="ready"===vt&&s.length>0&&!1!==gt?.pairedOk,yt=qn?T(qn,Q):"Auto",wt="__config__"===re?yt:T(re,Q),kt=Yn?Y(Yn,Zn):"Auto",St="__config__"===ge?kt:Y(ge,Zn),Nt=$.find(e=>e.value===Me)?.label??"Permission",Mt=xe(),Bt="unsupported"===Mt,$t="unsupported"===Mt?"Browser notifications are not available in this environment.":"denied"===Mt?"Notifications are blocked for this site. Allow them in browser settings.":"default"===Mt?"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"}`}.`,_t="running"===vt&&Boolean(gt?.activeRunId),Rt=Date.now(),Pt=function(e){if(!e)return null;const n=Date.parse(e);return Number.isFinite(n)?n:null}(gn?.updatedAt??null),At=null==Pt?null:Rt-Pt,zt=null==At||At>6e5,It=he(gn?.primary?.usedPercent??null),Ut=he(gn?.secondary?.usedPercent??null),Et=null==Pt&&null==It&&null==Ut,Lt=je(gn?.primary?.resetsAt??null,Rt),Ot=je(gn?.secondary?.resetsAt??null,Rt),Dt="Overdue"===Lt||"Overdue"===Ot||null!=At&&At>36e5,Ft=null==It?null:It/100,Wt=null==At?"Unknown":`${be(At)} ago`,Tt=gn?.primary?.windowMinutes??null,Jt=gn?.secondary?.windowMinutes??null,Kt=null==Tt?"":`Window: ${Math.round(Tt/60)}h`,Ht=null==Jt?"":`Window: ${Math.round(Jt/1440)}d`;return(0,i.useLayoutEffect)(()=>{const e=Dn.current;if(!e)return void Wn(!1);const n=()=>{const n=e.scrollWidth-e.clientWidth>1;Wn(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:vt}),(0,a.jsx)("span",{className:"jp-CodexChat-notebookWrap","data-full-name":Fn?jt:void 0,children:(0,a.jsx)("span",{className:"jp-CodexChat-notebook",ref:Dn,title:Fn?jt:void 0,children:jt})})]}),(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());et(e=>{const t=new Map(e);return t.set(n,a),t}),pt(n),Qn(),ft(),rt(a,e,n,{forceNewThread:!0}),function(e,n,t){const o={kind:"new-thread",sessionKey:e,notebookPath:n,threadId:t,source:Cn.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"===vt,"aria-label":"New thread",title:"New thread",children:(0,a.jsx)(f,{width:16,height:16})}),(0,a.jsx)("div",{className:"jp-CodexMenuWrap",ref:_n,children:(0,a.jsx)("button",{type:"button",className:`jp-CodexHeaderBtn jp-CodexHeaderBtn-icon jp-CodexUsageBtn${xn?" is-active is-open":""}${zt?" is-stale":""}${Dt?" is-overdue":""}`,ref:Un,onClick:()=>(un(e=>{const n=!e;return n&&function(e=!1){const n=bn.current;if(!n||n.readyState!==WebSocket.OPEN)return;const t=Date.now();!e&&t-yn.current<15e3||(yn.current=t,n.send(JSON.stringify({type:"refresh_rate_limits"})))}(),n}),cn(!1),pn(!1),void mn(!1)),"aria-label":null==It?"Codex usage":`Codex usage: ${It}% left`,"aria-haspopup":"dialog","aria-expanded":xn,title:null==It?"Codex usage: unknown":`Codex usage: ${It}% left (resets in ${Lt})`,children:(0,a.jsx)(y,{level:Ft,width:16,height:16})})}),(0,a.jsxs)(k,{open:xn,anchorRef:Un,popoverRef:En,className:"jp-CodexUsagePopover",ariaLabel:"Codex usage",role:"dialog",align:"right",children:[(Dt||zt)&&(0,a.jsxs)("div",{className:"jp-CodexUsageNotice"+(Dt?" is-overdue":zt?" is-stale":""),children:[(0,a.jsx)("div",{className:"jp-CodexUsageNoticeTitle",children:Et?"Usage unavailable":Dt?"Overdue usage snapshot":"Stale usage snapshot"}),(0,a.jsx)("div",{className:"jp-CodexUsageNoticeBody",children:Et?"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 ",Lt]})]}),(0,a.jsx)("div",{className:"jp-CodexUsageBar",children:(0,a.jsx)("div",{className:"jp-CodexUsageBarFill"+(zt?" is-stale":""),style:{width:`${It??0}%`}})}),(0,a.jsxs)("div",{className:"jp-CodexUsageMeta",children:[(0,a.jsx)("div",{className:"jp-CodexUsageMetaLeft",children:null==It?"--% left":`${It}% left`}),(0,a.jsx)("div",{className:"jp-CodexUsageMetaRight",children:Kt})]})]}),(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 ",Ot]})]}),(0,a.jsx)("div",{className:"jp-CodexUsageBar",children:(0,a.jsx)("div",{className:"jp-CodexUsageBarFill"+(zt?" is-stale":""),style:{width:`${Ut??0}%`}})}),(0,a.jsxs)("div",{className:"jp-CodexUsageMeta",children:[(0,a.jsx)("div",{className:"jp-CodexUsageMetaLeft",children:null==Ut?"--% left":`${Ut}% left`}),(0,a.jsx)("div",{className:"jp-CodexUsageMetaRight",children:Ht})]})]}),(0,a.jsxs)("div",{className:"jp-CodexUsageFooter",children:["Last updated: ",Wt]})]}),(0,a.jsx)("button",{type:"button",onClick:()=>{Ke(e=>!e),cn(!1),pn(!1),un(!1),mn(!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===gt?.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:gt.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:Nn,onScroll:function(){const e=Nn.current;if(!e)return;const n=e.scrollHeight-(e.scrollTop+e.clientHeight)<80;sn(n)},children:["disconnected"===vt&&(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:()=>{nn||rn(e=>e+1)},disabled:nn,"aria-label":nn?"Codex reconnecting":"Reconnect to Codex",title:nn?"Attempting to reconnect...":"Reconnect to Codex",children:nn?"Connecting...":"Reconnect"})]}),0===ht.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."})]}),ht.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"===vt&&(0,a.jsx)("div",{className:"jp-CodexChat-loading"+("reasoning"===bt?" is-reasoning":""),"aria-label":"reasoning"===bt?"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:Mn})]})}),(0,a.jsxs)("div",{className:"jp-CodexChat-input",children:[(0,a.jsx)("div",{className:"jp-CodexJumpBar"+(an?"":" is-visible"),children:(0,a.jsx)("button",{type:"button",className:"jp-CodexJumpToLatestBtn",onClick:lt,"aria-label":"Jump to latest","aria-hidden":an,tabIndex:an?-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:Tn,value:He,onChange:e=>{var n;Gn(n=e.currentTarget.value),qe(n),Ge.current=n,window.requestAnimationFrame(()=>ut(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 ct(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&&ct(j.current||"","system",`Skipped ${i} image(s): each must be <= ${Math.round(4)}MB.`),s>0&&ct(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===gt?.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&&Ct&&(He.trim()||Ye.length>0)&&(e.preventDefault(),mt())}}),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:Bn,children:(0,a.jsx)("button",{type:"button",ref:Pn,className:"jp-CodexModelBtn "+(dn?"is-open":""),onClick:()=>{cn(e=>!e),pn(!1),un(!1),mn(!1)},disabled:"running"===vt,"aria-label":`Model: ${wt}`,"aria-haspopup":"menu","aria-expanded":dn,title:`Model: ${wt}`,children:(0,a.jsx)("span",{className:"jp-CodexModelBtn-label",children:wt})})}),(0,a.jsxs)(k,{open:dn,anchorRef:Pn,popoverRef:An,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&&qn&&Q.some(e=>e.value===qn)?qn:re,t=n===e.value;return(0,a.jsxs)("button",{type:"button",className:"jp-CodexMenuItem "+(t?"is-active":""),onClick:()=>{ae(e.value),cn(!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:$n,children:(0,a.jsx)("button",{type:"button",ref:zn,className:"jp-CodexIconBtn "+(ln?"is-open":""),onClick:()=>{pn(e=>!e),cn(!1),un(!1),mn(!1)},disabled:"running"===vt,"aria-label":`Reasoning: ${St}`,"aria-haspopup":"menu","aria-expanded":ln,title:`Reasoning: ${St}`,children:(0,a.jsx)(C,{effort:"__config__"===ge&&Yn?Yn:ge,effortOptions:Zn,width:18,height:18})})}),(0,a.jsxs)(k,{open:ln,anchorRef:zn,popoverRef:In,role:"menu",ariaLabel:"Reasoning",align:"left",children:[0===Zn.length&&(0,a.jsx)("div",{className:"jp-CodexMenuItem",children:"No reasoning options"}),Zn.map(e=>{const n=("__config__"===ge&&Yn?Yn:ge)===e.value;return(0,a.jsxs)("button",{type:"button",className:"jp-CodexMenuItem "+(n?"is-active":""),onClick:()=>{Se(e.value),pn(!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:Rn,children:(0,a.jsx)("button",{type:"button",className:`jp-CodexIconBtn jp-CodexPermissionBtn${fn?" is-open":""}${"danger-full-access"===Me?" is-danger":""}`,ref:Ln,onClick:()=>{mn(e=>!e),cn(!1),pn(!1),un(!1)},disabled:"running"===vt,"aria-label":`Permission: ${Nt}`,"aria-haspopup":"menu","aria-expanded":fn,title:`Permission: ${Nt}`,children:(0,a.jsx)(w,{width:18,height:18})})}),(0,a.jsx)(k,{open:fn,anchorRef:Ln,popoverRef:On,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),mn(!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"===vt?" is-stop":""),onClick:()=>{"running"!==vt?mt():function(){const e=bn.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?(st(n,"Cancelling..."),e.send(JSON.stringify({type:"cancel",runId:o}))):ct(n,"system","Cancel not available yet (waiting for run id)."):ct(n,"system","Cancel failed: WebSocket is not connected.")}()},disabled:"running"===vt?!_t:!Ct||!He.trim()&&0===Ye.length,"aria-label":"running"===vt?"Stop run":"Send",title:"running"===vt?gt?.activeRunId?`runId: ${gt.activeRunId}`:"Waiting for run id...":"disconnected"===vt?"Connecting...":"Send",children:"running"===vt?(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"===vt,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"===vt}),"Auto-save before send"]}),(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:Ue,onChange:e=>Ee(e.currentTarget.checked),disabled:"running"===vt}),"Include active cell"]}),(0,a.jsxs)("label",{className:"jp-CodexChat-toggle",children:[(0,a.jsx)("input",{type:"checkbox",checked:Le,onChange:e=>Oe(e.currentTarget.checked),disabled:"running"===vt||!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 ct(t,"system","Browser notifications are not supported in this environment."),void Fe(!1);if("granted"!==n){if("denied"===n)return ct(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&&ct(t,"system","Browser notification permission was denied. Allow notifications in browser settings to enable this option."),Fe(!1)}catch{ct(t,"system","Failed to request browser notification permission."),Fe(!1)}}else Fe(!0)}(e.currentTarget.checked)},disabled:"running"===vt||Bt}),"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:Bt}),(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:$t})]})]}),(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: ",Jn]})}),(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&&pt(t),le(),!at()&&t&&ct(t,"system","Delete request could not be sent now. It will be retried when you reconnect."),vn.current=new Map,jn.current=new Map,ce(D),Xn(new Map),Qn(),ft()}()},disabled:"running"===vt||0===Jn&&0===n.size,title:"running"===vt?"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),Ee=t.n(Ue),Le=t(7659),Oe=t.n(Le),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=Ee(),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"}}]);
@@ -1 +1 @@
1
- var _JUPYTERLAB;(()=>{"use strict";var e,r,t,a,n,o,i,u,f,l,d,s,c,p,h,b,v,m,g,y,w,j,k,x={4379(e,r,t){var a={"./index":()=>Promise.all([t.e(504),t.e(972)]).then(()=>()=>t(8972)),"./extension":()=>Promise.all([t.e(504),t.e(972)]).then(()=>()=>t(8972))},n=(e,r)=>(t.R=r,r=t.o(a,e)?a[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),o=(e,r)=>{if(t.S){var a="default",n=t.S[a];if(n&&n!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[a]=e,t.I(a,r)}};t.d(r,{get:()=>n,init:()=>o})}},S={};function P(e){var r=S[e];if(void 0!==r)return r.exports;var t=S[e]={id:e,exports:{}};return x[e](t,t.exports,P),t.exports}P.m=x,P.c=S,P.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return P.d(r,{a:r}),r},P.d=(e,r)=>{for(var t in r)P.o(r,t)&&!P.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},P.f={},P.e=e=>Promise.all(Object.keys(P.f).reduce((r,t)=>(P.f[t](e,r),r),[])),P.u=e=>e+"."+{124:"ac0734653995d3fe00f2",364:"15acf07c0b6852a40fd9",489:"ef138a7e916c5b465543",504:"335f3447c84ba3d74517",972:"d43137b7438a053eeb72",997:"213b5a946a1c8e2b1bba"}[e]+".js?v="+{124:"ac0734653995d3fe00f2",364:"15acf07c0b6852a40fd9",489:"ef138a7e916c5b465543",504:"335f3447c84ba3d74517",972:"d43137b7438a053eeb72",997:"213b5a946a1c8e2b1bba"}[e],P.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),P.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="jupyterlab-codex-sidebar:",P.l=(t,a,n,o)=>{if(e[t])e[t].push(a);else{var i,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),l=0;l<f.length;l++){var d=f[l];if(d.getAttribute("src")==t||d.getAttribute("data-webpack")==r+n){i=d;break}}i||(u=!0,(i=document.createElement("script")).charset="utf-8",P.nc&&i.setAttribute("nonce",P.nc),i.setAttribute("data-webpack",r+n),i.src=t),e[t]=[a];var s=(r,a)=>{i.onerror=i.onload=null,clearTimeout(c);var n=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(e=>e(a)),r)return r(a)},c=setTimeout(s.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=s.bind(null,i.onerror),i.onload=s.bind(null,i.onload),u&&document.head.appendChild(i)}},P.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{P.S={};var e={},r={};P.I=(t,a)=>{a||(a=[]);var n=r[t];if(n||(n=r[t]={}),!(a.indexOf(n)>=0)){if(a.push(n),e[t])return e[t];P.o(P.S,t)||(P.S[t]={});var o=P.S[t],i="jupyterlab-codex-sidebar",u=(e,r,t,a)=>{var n=o[e]=o[e]||{},u=n[r];(!u||!u.loaded&&(!a!=!u.eager?a:i>u.from))&&(n[r]={get:t,from:i,eager:!!a})},f=[];return"default"===t&&(u("dompurify","3.3.1",()=>P.e(997).then(()=>()=>P(4997))),u("jupyterlab-codex-sidebar","0.1.3",()=>Promise.all([P.e(504),P.e(972)]).then(()=>()=>P(8972))),u("katex","0.16.28",()=>P.e(489).then(()=>()=>P(5489))),u("marked-katex-extension","5.1.7",()=>P.e(124).then(()=>()=>P(8124))),u("marked","16.4.2",()=>P.e(364).then(()=>()=>P(4364)))),e[t]=f.length?Promise.all(f).then(()=>e[t]=1):1}}})(),(()=>{var e;P.g.importScripts&&(e=P.g.location+"");var r=P.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),P.p=e})(),t=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),a=t[1]?r(t[1]):[];return t[2]&&(a.length++,a.push.apply(a,r(t[2]))),t[3]&&(a.push([]),a.push.apply(a,r(t[3]))),a},a=(e,r)=>{e=t(e),r=t(r);for(var a=0;;){if(a>=e.length)return a<r.length&&"u"!=(typeof r[a])[0];var n=e[a],o=(typeof n)[0];if(a>=r.length)return"u"==o;var i=r[a],u=(typeof i)[0];if(o!=u)return"o"==o&&"n"==u||"s"==u||"u"==o;if("o"!=o&&"u"!=o&&n!=i)return n<i;a++}},n=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var a=1,o=1;o<e.length;o++)a--,t+="u"==(typeof(u=e[o]))[0]?"-":(a>0?".":"")+(a=2,u);return t}var i=[];for(o=1;o<e.length;o++){var u=e[o];i.push(0===u?"not("+f()+")":1===u?"("+f()+" || "+f()+")":2===u?i.pop()+" "+i.pop():n(u))}return f();function f(){return i.pop().replace(/^\((.+)\)$/,"$1")}},o=(e,r)=>{if(0 in e){r=t(r);var a=e[0],n=a<0;n&&(a=-a-1);for(var i=0,u=1,f=!0;;u++,i++){var l,d,s=u<e.length?(typeof e[u])[0]:"";if(i>=r.length||"o"==(d=(typeof(l=r[i]))[0]))return!f||("u"==s?u>a&&!n:""==s!=n);if("u"==d){if(!f||"u"!=s)return!1}else if(f)if(s==d)if(u<=a){if(l!=e[u])return!1}else{if(n?l>e[u]:l<e[u])return!1;l!=e[u]&&(f=!1)}else if("s"!=s&&"n"!=s){if(n||u<=a)return!1;f=!1,u--}else{if(u<=a||d<s!=n)return!1;f=!1}else"s"!=s&&"n"!=s&&(f=!1,u--)}}var c=[],p=c.pop.bind(c);for(i=1;i<e.length;i++){var h=e[i];c.push(1==h?p()|p():2==h?p()&p():h?o(h,r):!p())}return!!p()},i=(e,r)=>e&&P.o(e,r),u=e=>(e.loaded=1,e.get()),f=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),l=(e,r,t,n)=>{var i=n?f(e[r]):e[r];return(r=Object.keys(i).reduce((e,r)=>!o(t,r)||e&&!a(e,r)?e:r,0))&&i[r]},d=(e,r,t)=>{var n=t?f(e[r]):e[r];return Object.keys(n).reduce((e,r)=>!e||!n[e].loaded&&a(e,r)?r:e,0)},s=(e,r,t,a)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+n(a)+")",c=(e,r,t,a,o)=>{var i=e[t];return"No satisfying version ("+n(a)+")"+(o?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(i).map(e=>e+" from "+i[e].from).join(", ")},p=e=>{throw new Error(e)},h=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},v=(e,r,t)=>t?t():((e,r)=>p("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),m=(b=e=>function(r,t,a,n,o){var i=P.I(r);return i&&i.then&&!a?i.then(e.bind(e,r,P.S[r],t,!1,n,o)):e(r,P.S[r],t,a,n,o)})((e,r,t,a,n,o)=>{if(!i(r,t))return v(e,t,o);var f=l(r,t,n,a);return f?u(f):o?o():void p(c(r,e,t,n,a))}),g=b((e,r,t,a,n,f)=>{if(!i(r,t))return v(e,t,f);var l=d(r,t,a);return o(n,l)||h(s(r,t,l,n)),u(r[t][l])}),y={},w={405:()=>m("default","marked-katex-extension",!1,[1,5,1,7],()=>P.e(124).then(()=>()=>P(8124))),1125:()=>g("default","@jupyterlab/services",!1,[1,7,5,3]),2707:()=>m("default","dompurify",!1,[1,3,3,1],()=>P.e(997).then(()=>()=>P(4997))),2931:()=>g("default","@jupyterlab/notebook",!1,[1,4,5,3]),3345:()=>g("default","react",!1,[1,18,2,0]),4281:()=>m("default","marked",!1,[1,16,4,2],()=>P.e(364).then(()=>()=>P(4364))),4526:()=>g("default","@jupyterlab/coreutils",!1,[1,6,5,3]),5285:()=>g("default","@jupyterlab/apputils",!1,[1,4,6,3]),7628:()=>g("default","react-dom",!1,[1,18,2,0]),4502:()=>m("default","katex",!1,[,[-1,0,17],[0,0,16],2],()=>P.e(489).then(()=>()=>P(5489)))},j={124:[4502],972:[405,1125,2707,2931,3345,4281,4526,5285,7628]},k={},P.f.consumes=(e,r)=>{P.o(j,e)&&j[e].forEach(e=>{if(P.o(y,e))return r.push(y[e]);if(!k[e]){var t=r=>{y[e]=0,P.m[e]=t=>{delete P.c[e],t.exports=r()}};k[e]=!0;var a=r=>{delete y[e],P.m[e]=t=>{throw delete P.c[e],r}};try{var n=w[e]();n.then?r.push(y[e]=n.then(t).catch(a)):t(n)}catch(e){a(e)}}})},(()=>{P.b="undefined"!=typeof document&&document.baseURI||self.location.href;var e={646:0};P.f.j=(r,t)=>{var a=P.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var n=new Promise((t,n)=>a=e[r]=[t,n]);t.push(a[2]=n);var o=P.p+P.u(r),i=new Error;P.l(o,t=>{if(P.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+n+": "+o+")",i.name="ChunkLoadError",i.type=n,i.request=o,a[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,n,[o,i,u]=t,f=0;if(o.some(r=>0!==e[r])){for(a in i)P.o(i,a)&&(P.m[a]=i[a]);u&&u(P)}for(r&&r(t);f<o.length;f++)n=o[f],P.o(e,n)&&e[n]&&e[n][0](),e[n]=0},t=self.webpackChunkjupyterlab_codex_sidebar=self.webpackChunkjupyterlab_codex_sidebar||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),P.nc=void 0;var E=P(4379);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["jupyterlab-codex-sidebar"]=E})();
1
+ var _JUPYTERLAB;(()=>{"use strict";var e,r,t,a,n,o,i,u,d,l,f,s,c,p,h,b,v,m,g,y,w,j,k,x={4379(e,r,t){var a={"./index":()=>Promise.all([t.e(504),t.e(972)]).then(()=>()=>t(8972)),"./extension":()=>Promise.all([t.e(504),t.e(972)]).then(()=>()=>t(8972))},n=(e,r)=>(t.R=r,r=t.o(a,e)?a[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),t.R=void 0,r),o=(e,r)=>{if(t.S){var a="default",n=t.S[a];if(n&&n!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[a]=e,t.I(a,r)}};t.d(r,{get:()=>n,init:()=>o})}},S={};function P(e){var r=S[e];if(void 0!==r)return r.exports;var t=S[e]={id:e,exports:{}};return x[e](t,t.exports,P),t.exports}P.m=x,P.c=S,P.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return P.d(r,{a:r}),r},P.d=(e,r)=>{for(var t in r)P.o(r,t)&&!P.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},P.f={},P.e=e=>Promise.all(Object.keys(P.f).reduce((r,t)=>(P.f[t](e,r),r),[])),P.u=e=>e+"."+{124:"ac0734653995d3fe00f2",364:"15acf07c0b6852a40fd9",489:"ef138a7e916c5b465543",504:"335f3447c84ba3d74517",972:"8e856719e40acc1ef4cb",997:"213b5a946a1c8e2b1bba"}[e]+".js?v="+{124:"ac0734653995d3fe00f2",364:"15acf07c0b6852a40fd9",489:"ef138a7e916c5b465543",504:"335f3447c84ba3d74517",972:"8e856719e40acc1ef4cb",997:"213b5a946a1c8e2b1bba"}[e],P.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),P.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),e={},r="jupyterlab-codex-sidebar:",P.l=(t,a,n,o)=>{if(e[t])e[t].push(a);else{var i,u;if(void 0!==n)for(var d=document.getElementsByTagName("script"),l=0;l<d.length;l++){var f=d[l];if(f.getAttribute("src")==t||f.getAttribute("data-webpack")==r+n){i=f;break}}i||(u=!0,(i=document.createElement("script")).charset="utf-8",P.nc&&i.setAttribute("nonce",P.nc),i.setAttribute("data-webpack",r+n),i.src=t),e[t]=[a];var s=(r,a)=>{i.onerror=i.onload=null,clearTimeout(c);var n=e[t];if(delete e[t],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach(e=>e(a)),r)return r(a)},c=setTimeout(s.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=s.bind(null,i.onerror),i.onload=s.bind(null,i.onload),u&&document.head.appendChild(i)}},P.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{P.S={};var e={},r={};P.I=(t,a)=>{a||(a=[]);var n=r[t];if(n||(n=r[t]={}),!(a.indexOf(n)>=0)){if(a.push(n),e[t])return e[t];P.o(P.S,t)||(P.S[t]={});var o=P.S[t],i="jupyterlab-codex-sidebar",u=(e,r,t,a)=>{var n=o[e]=o[e]||{},u=n[r];(!u||!u.loaded&&(!a!=!u.eager?a:i>u.from))&&(n[r]={get:t,from:i,eager:!!a})},d=[];return"default"===t&&(u("dompurify","3.3.1",()=>P.e(997).then(()=>()=>P(4997))),u("jupyterlab-codex-sidebar","0.1.4",()=>Promise.all([P.e(504),P.e(972)]).then(()=>()=>P(8972))),u("katex","0.16.28",()=>P.e(489).then(()=>()=>P(5489))),u("marked-katex-extension","5.1.7",()=>P.e(124).then(()=>()=>P(8124))),u("marked","16.4.2",()=>P.e(364).then(()=>()=>P(4364)))),e[t]=d.length?Promise.all(d).then(()=>e[t]=1):1}}})(),(()=>{var e;P.g.importScripts&&(e=P.g.location+"");var r=P.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),P.p=e})(),t=e=>{var r=e=>e.split(".").map(e=>+e==e?+e:e),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),a=t[1]?r(t[1]):[];return t[2]&&(a.length++,a.push.apply(a,r(t[2]))),t[3]&&(a.push([]),a.push.apply(a,r(t[3]))),a},a=(e,r)=>{e=t(e),r=t(r);for(var a=0;;){if(a>=e.length)return a<r.length&&"u"!=(typeof r[a])[0];var n=e[a],o=(typeof n)[0];if(a>=r.length)return"u"==o;var i=r[a],u=(typeof i)[0];if(o!=u)return"o"==o&&"n"==u||"s"==u||"u"==o;if("o"!=o&&"u"!=o&&n!=i)return n<i;a++}},n=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var a=1,o=1;o<e.length;o++)a--,t+="u"==(typeof(u=e[o]))[0]?"-":(a>0?".":"")+(a=2,u);return t}var i=[];for(o=1;o<e.length;o++){var u=e[o];i.push(0===u?"not("+d()+")":1===u?"("+d()+" || "+d()+")":2===u?i.pop()+" "+i.pop():n(u))}return d();function d(){return i.pop().replace(/^\((.+)\)$/,"$1")}},o=(e,r)=>{if(0 in e){r=t(r);var a=e[0],n=a<0;n&&(a=-a-1);for(var i=0,u=1,d=!0;;u++,i++){var l,f,s=u<e.length?(typeof e[u])[0]:"";if(i>=r.length||"o"==(f=(typeof(l=r[i]))[0]))return!d||("u"==s?u>a&&!n:""==s!=n);if("u"==f){if(!d||"u"!=s)return!1}else if(d)if(s==f)if(u<=a){if(l!=e[u])return!1}else{if(n?l>e[u]:l<e[u])return!1;l!=e[u]&&(d=!1)}else if("s"!=s&&"n"!=s){if(n||u<=a)return!1;d=!1,u--}else{if(u<=a||f<s!=n)return!1;d=!1}else"s"!=s&&"n"!=s&&(d=!1,u--)}}var c=[],p=c.pop.bind(c);for(i=1;i<e.length;i++){var h=e[i];c.push(1==h?p()|p():2==h?p()&p():h?o(h,r):!p())}return!!p()},i=(e,r)=>e&&P.o(e,r),u=e=>(e.loaded=1,e.get()),d=e=>Object.keys(e).reduce((r,t)=>(e[t].eager&&(r[t]=e[t]),r),{}),l=(e,r,t,n)=>{var i=n?d(e[r]):e[r];return(r=Object.keys(i).reduce((e,r)=>!o(t,r)||e&&!a(e,r)?e:r,0))&&i[r]},f=(e,r,t)=>{var n=t?d(e[r]):e[r];return Object.keys(n).reduce((e,r)=>!e||!n[e].loaded&&a(e,r)?r:e,0)},s=(e,r,t,a)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+n(a)+")",c=(e,r,t,a,o)=>{var i=e[t];return"No satisfying version ("+n(a)+")"+(o?" for eager consumption":"")+" of shared module "+t+" found in shared scope "+r+".\nAvailable versions: "+Object.keys(i).map(e=>e+" from "+i[e].from).join(", ")},p=e=>{throw new Error(e)},h=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},v=(e,r,t)=>t?t():((e,r)=>p("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),m=(b=e=>function(r,t,a,n,o){var i=P.I(r);return i&&i.then&&!a?i.then(e.bind(e,r,P.S[r],t,!1,n,o)):e(r,P.S[r],t,a,n,o)})((e,r,t,a,n,o)=>{if(!i(r,t))return v(e,t,o);var d=l(r,t,n,a);return d?u(d):o?o():void p(c(r,e,t,n,a))}),g=b((e,r,t,a,n,d)=>{if(!i(r,t))return v(e,t,d);var l=f(r,t,a);return o(n,l)||h(s(r,t,l,n)),u(r[t][l])}),y={},w={405:()=>m("default","marked-katex-extension",!1,[1,5,1,7],()=>P.e(124).then(()=>()=>P(8124))),1125:()=>g("default","@jupyterlab/services",!1,[1,7,5,3]),2707:()=>m("default","dompurify",!1,[1,3,3,1],()=>P.e(997).then(()=>()=>P(4997))),2931:()=>g("default","@jupyterlab/notebook",!1,[1,4,5,3]),3345:()=>g("default","react",!1,[1,18,2,0]),4281:()=>m("default","marked",!1,[1,16,4,2],()=>P.e(364).then(()=>()=>P(4364))),4526:()=>g("default","@jupyterlab/coreutils",!1,[1,6,5,3]),5285:()=>g("default","@jupyterlab/apputils",!1,[1,4,6,3]),7628:()=>g("default","react-dom",!1,[1,18,2,0]),4502:()=>m("default","katex",!1,[,[-1,0,17],[0,0,16],2],()=>P.e(489).then(()=>()=>P(5489)))},j={124:[4502],972:[405,1125,2707,2931,3345,4281,4526,5285,7628]},k={},P.f.consumes=(e,r)=>{P.o(j,e)&&j[e].forEach(e=>{if(P.o(y,e))return r.push(y[e]);if(!k[e]){var t=r=>{y[e]=0,P.m[e]=t=>{delete P.c[e],t.exports=r()}};k[e]=!0;var a=r=>{delete y[e],P.m[e]=t=>{throw delete P.c[e],r}};try{var n=w[e]();n.then?r.push(y[e]=n.then(t).catch(a)):t(n)}catch(e){a(e)}}})},(()=>{P.b="undefined"!=typeof document&&document.baseURI||self.location.href;var e={646:0};P.f.j=(r,t)=>{var a=P.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var n=new Promise((t,n)=>a=e[r]=[t,n]);t.push(a[2]=n);var o=P.p+P.u(r),i=new Error;P.l(o,t=>{if(P.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+n+": "+o+")",i.name="ChunkLoadError",i.type=n,i.request=o,a[1](i)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,n,[o,i,u]=t,d=0;if(o.some(r=>0!==e[r])){for(a in i)P.o(i,a)&&(P.m[a]=i[a]);u&&u(P)}for(r&&r(t);d<o.length;d++)n=o[d],P.o(e,n)&&e[n]&&e[n][0](),e[n]=0},t=self.webpackChunkjupyterlab_codex_sidebar=self.webpackChunkjupyterlab_codex_sidebar||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),P.nc=void 0;var E=P(4379);(_JUPYTERLAB=void 0===_JUPYTERLAB?{}:_JUPYTERLAB)["jupyterlab-codex-sidebar"]=E})();
@@ -65,20 +65,56 @@ class CodexRunner:
65
65
  if proc.stdin is None or proc.stdout is None or proc.stderr is None:
66
66
  raise RuntimeError("Failed to open app-server subprocess streams")
67
67
 
68
- async def read_message() -> dict[str, Any] | None:
69
- raw = await asyncio.wait_for(proc.stdout.readline(), timeout=3.0)
70
- if not raw:
68
+ buffer = bytearray()
69
+ max_message_bytes = 1024 * 1024
70
+
71
+ def _pop_message_from_buffer() -> dict[str, Any] | None:
72
+ separator_index = buffer.find(b"\n")
73
+ if separator_index < 0:
71
74
  return None
72
- line = raw.decode("utf-8", errors="replace").strip()
75
+ raw_line = bytes(buffer[:separator_index])
76
+ del buffer[:separator_index + 1]
77
+ line = raw_line.decode("utf-8", errors="replace").strip()
73
78
  if not line:
74
- return None
79
+ return {}
75
80
  try:
76
81
  payload = json.loads(line)
77
82
  except json.JSONDecodeError:
78
- return None
83
+ return {}
79
84
  if isinstance(payload, dict):
80
85
  return payload
81
- return None
86
+ return {}
87
+
88
+ async def read_message() -> dict[str, Any] | None:
89
+ deadline = time.monotonic() + 3.0
90
+ while True:
91
+ message = _pop_message_from_buffer()
92
+ if message is not None:
93
+ if message:
94
+ return message
95
+ continue
96
+
97
+ remaining = deadline - time.monotonic()
98
+ if remaining <= 0:
99
+ raise RuntimeError("App-server response timed out")
100
+
101
+ chunk = await asyncio.wait_for(proc.stdout.read(4096), timeout=remaining)
102
+ if not chunk:
103
+ if buffer:
104
+ line = buffer.decode("utf-8", errors="replace").strip()
105
+ buffer.clear()
106
+ if not line:
107
+ return None
108
+ try:
109
+ payload = json.loads(line)
110
+ except json.JSONDecodeError:
111
+ return None
112
+ if isinstance(payload, dict):
113
+ return payload
114
+ return None
115
+ buffer.extend(chunk)
116
+ if len(buffer) > max_message_bytes and b"\n" not in buffer:
117
+ raise RuntimeError("App-server emitted an oversized response line")
82
118
 
83
119
  async def read_response(expected_id: int) -> dict[str, Any]:
84
120
  while True:
@@ -263,15 +299,39 @@ class CodexRunner:
263
299
  proc.stdin.close()
264
300
 
265
301
  async def _read_stdout() -> None:
266
- async for raw in proc.stdout:
267
- line = raw.decode("utf-8", errors="replace").strip()
268
- if not line:
269
- continue
270
- try:
271
- event = json.loads(line)
272
- except json.JSONDecodeError:
273
- event = {"type": "raw", "text": line}
274
- await on_event(event)
302
+ buffer = bytearray()
303
+ max_event_line_bytes = 1024 * 1024
304
+ while True:
305
+ chunk = await proc.stdout.read(8192)
306
+ if not chunk:
307
+ if buffer:
308
+ line = buffer.decode("utf-8", errors="replace").strip()
309
+ if line:
310
+ try:
311
+ event = json.loads(line)
312
+ except json.JSONDecodeError:
313
+ event = {"type": "raw", "text": line}
314
+ await on_event(event)
315
+ break
316
+
317
+ buffer.extend(chunk)
318
+ if len(buffer) > max_event_line_bytes and b"\n" not in buffer:
319
+ raise RuntimeError("Codex emitted an oversized unterminated stdout line")
320
+ while True:
321
+ separator_index = buffer.find(b"\n")
322
+ if separator_index < 0:
323
+ break
324
+ raw_line = bytes(buffer[:separator_index])
325
+ del buffer[:separator_index + 1]
326
+
327
+ line = raw_line.decode("utf-8", errors="replace").strip()
328
+ if not line:
329
+ continue
330
+ try:
331
+ event = json.loads(line)
332
+ except json.JSONDecodeError:
333
+ event = {"type": "raw", "text": line}
334
+ await on_event(event)
275
335
 
276
336
  async def _read_stderr() -> None:
277
337
  # Stream stderr so users can see prompts/errors even if Codex blocks.
@@ -287,6 +347,9 @@ class CodexRunner:
287
347
  except asyncio.CancelledError:
288
348
  await self._terminate_process(proc)
289
349
  raise
350
+ except Exception:
351
+ await self._terminate_process(proc)
352
+ raise
290
353
 
291
354
  async def _terminate_process(self, proc: asyncio.subprocess.Process) -> None:
292
355
  if proc.returncode is not None: