codexui-android 0.1.85 → 0.1.88

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.
@@ -1,2 +1,2 @@
1
- import{d as et,u as tt,r as w,w as K,b as at,A as st,e as nt,o as i,c as l,a,t as r,v as U,f as h,m as ke,q as it,F as m,g as x,B as lt,C as rt,h as ge,l as O,x as D,j as ot,s as Ce,T as ut,y as _,D as vt,E as dt,G as ct,n as pt,H as Be,J as ft,_ as wt}from"./index-CWwHJTfC.js";const ht={class:"review-pane-header"},yt={class:"review-pane-heading"},mt={class:"review-pane-title"},_t={class:"review-pane-header-actions"},bt={class:"review-pane-toolbar"},kt={class:"review-pane-toolbar-tabs"},gt={class:"review-pane-segmented review-pane-segmented-primary"},Ct=["data-active","onClick"],Bt={class:"review-pane-toolbar-controls"},Lt={class:"review-pane-control-cluster"},Ft={class:"review-pane-segmented"},It=["data-active"],xt=["data-active","disabled"],Rt={key:0,class:"review-pane-control-cluster"},St={class:"review-pane-branch-select-wrap"},$t=["value"],Tt={key:1,class:"review-pane-control-cluster"},At={class:"review-pane-segmented"},Et=["data-active"],Mt=["data-active"],Nt={class:"review-pane-toolbar-actions"},Pt=["disabled"],Dt=["disabled"],Gt={key:1,class:"review-pane-meta"},Wt={class:"review-pane-summary-pill review-pane-summary-pill-add"},zt={class:"review-pane-summary-pill review-pane-summary-pill-remove"},Vt={key:0},Ht={key:1},Kt={key:2,class:"review-pane-content"},Ut={key:0,class:"review-pane-empty"},Ot={key:1,class:"review-pane-empty"},Xt=["disabled"],jt={key:2,class:"review-pane-empty"},Yt={key:0,class:"review-pane-bulk-actions"},qt=["disabled","onClick"],Jt={key:1,class:"review-pane-empty"},Qt={class:"review-pane-empty-text"},Zt={key:0,class:"review-pane-file-list"},ea=["data-expanded","onClick"],ta=["data-expanded"],aa={class:"review-pane-tree-folder-name"},sa={class:"review-pane-tree-folder-count"},na=["data-active","title","onClick"],ia={class:"review-pane-file-meta-row"},la={class:"review-pane-file-main"},ra=["data-operation"],oa={class:"review-pane-file-path"},ua={class:"review-pane-file-delta"},va={class:"review-pane-delta-add"},da={class:"review-pane-delta-remove"},ca={class:"review-pane-diff"},pa={class:"review-pane-file-header"},fa={class:"review-pane-file-header-main"},wa={class:"review-pane-file-title"},ha={class:"review-pane-file-subtitle"},ya={key:0,class:"review-pane-row-actions"},ma=["disabled","onClick"],_a={key:0,class:"review-pane-raw-diff"},ba={key:1,class:"review-pane-hunks"},ka=["data-active","onClick"],ga={class:"review-pane-hunk-header"},Ca={class:"review-pane-hunk-title"},Ba={class:"review-pane-hunk-meta"},La={key:0,class:"review-pane-row-actions"},Fa=["disabled","onClick"],Ia={class:"review-pane-lines"},xa=["data-kind"],Ra={class:"review-pane-line-number"},Sa={class:"review-pane-line-number"},$a={class:"review-pane-line-marker"},Ta={class:"review-pane-line-code"},Aa={key:3,class:"review-pane-findings"},Ea={key:0,class:"review-pane-summary-card"},Ma={class:"review-pane-summary-text"},Na={key:1,class:"review-pane-findings-list"},Pa=["onClick"],Da={class:"review-pane-finding-title"},Ga={key:0,class:"review-pane-finding-location"},Wa={key:1,class:"review-pane-finding-body"},za={key:2,class:"review-pane-empty"},Va={class:"review-pane-empty-text"},Ha={class:"review-pane-sheet-header"},Ka={class:"review-pane-sheet-count"},Ua={class:"review-pane-sheet-list"},Oa=["data-expanded","onClick"],Xa=["data-expanded"],ja={class:"review-pane-tree-folder-name"},Ya={class:"review-pane-tree-folder-count"},qa=["data-active","title","onClick"],Ja={class:"review-pane-file-meta-row"},Qa={class:"review-pane-file-main"},Za=["data-operation"],es={class:"review-pane-file-path"},ts={class:"review-pane-file-delta"},as={class:"review-pane-delta-add"},ss={class:"review-pane-delta-remove"},Le="codex-web-local.review-pane-file-list-width.v1",ns=220,is=420,Fe=288,ls=et({__name:"ReviewPane",props:{threadId:{},cwd:{},isThreadInProgress:{type:Boolean}},emits:["close"],setup(Ie){const b=Ie,{isMobile:F}=tt(),A=w("changes"),p=w("workspace"),C=w("unstaged"),u=w(null),R=w(""),X=w(!1),S=w(""),B=w(""),j=w(!1),ae=w(!1),E=w(!1),T=w(!1),Y=w(!1),G=w(""),L=w(""),M=w(""),N=w({}),q=w(""),se=new Map;let J=null,$=null;const xe=[{value:"changes",label:"Changes"},{value:"findings",label:"Findings"}],Q=_(()=>`${p.value}:${C.value}`),W=_(()=>N.value[Q.value]??null),k=_(()=>{var t,e;return((t=u.value)==null?void 0:t.files.find(n=>n.id===S.value))??((e=u.value)==null?void 0:e.files[0])??null}),P=w({}),Re=_(()=>{var t,e;return(t=u.value)!=null&&t.isGitRepo?p.value==="workspace"?C.value==="staged"?"Staged changes":"Workspace changes":(e=u.value)!=null&&e.baseBranch?`Against ${u.value.baseBranch}`:"Base branch":"Repository review"}),oe=_(()=>{var t,e;return b.threadId.trim().length>0&&b.cwd.trim().length>0&&((t=u.value)==null?void 0:t.isGitRepo)===!0&&!b.isThreadInProgress&&!(p.value==="baseBranch"&&!((e=u.value)!=null&&e.baseBranch))}),ue=_(()=>{var t;return p.value==="workspace"&&((t=u.value)==null?void 0:t.isGitRepo)===!0&&u.value.files.length>0}),ve=_(()=>ue.value&&!E.value),Se=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage all"}]:[{value:"stage",label:"Stage all"},{value:"revert",label:"Revert all"}]),$e=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage file"}]:[{value:"stage",label:"Stage file"},{value:"revert",label:"Revert file"}]),Te=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage hunk"}]:[{value:"stage",label:"Stage hunk"},{value:"revert",label:"Revert hunk"}]),de=_(()=>L.value||G.value||M.value),Ae=_(()=>!!(L.value||G.value)),Z=w(Ne()),Ee=_(()=>{const t={};return F.value||(t["--review-file-list-width"]=`${Z.value}px`),t}),ce=_(()=>{var t;return We(((t=u.value)==null?void 0:t.files)??[],P.value)}),pe=_(()=>ce.value.nodes),Me=_(()=>ce.value.folderIdsByFileId);function ne(t){return Number.isFinite(t)?Math.min(is,Math.max(ns,Math.round(t))):Fe}function Ne(){if(typeof window>"u")return Fe;const t=window.localStorage.getItem(Le),e=t?Number(t):Number.NaN;return ne(e)}function Pe(t){typeof window>"u"||window.localStorage.setItem(Le,String(ne(t)))}function De(t){if(F.value)return;t.preventDefault(),$==null||$();const e=t.clientX,n=Z.value,v=f=>{Z.value=ne(n+(f.clientX-e))},d=()=>{window.removeEventListener("pointermove",v),window.removeEventListener("pointerup",y),$=null},y=()=>{d(),Pe(Z.value)};window.addEventListener("pointermove",v),window.addEventListener("pointerup",y),$=d}function Ge(t){return t==="add"?"+":t==="remove"?"-":t==="hunk"?"@@":" "}function fe(t){const e=t.split("/").filter(Boolean);return e[e.length-1]??t}function we(t,e){return t.localeCompare(e,void 0,{numeric:!0,sensitivity:"base"})}function We(t,e){const n={folders:new Map,files:[]},v={};for(const g of t){const s=g.path.split("/").filter(Boolean),o=s.pop()??g.path;let c=n,I="";const be=[];for(const[Ze,V]of s.entries()){I=I?`${I}/${V}`:V;let H=c.folders.get(V);H||(H={id:I,name:V,depth:Ze,folders:new Map,files:[]},c.folders.set(V,H)),c=H,be.push(H.id)}c.files.push({file:g,name:o,depth:s.length}),v[g.id]=be}const d=[],y=g=>g.files.length+Array.from(g.folders.values()).reduce((s,o)=>s+y(o),0),f=g=>{const s=Array.from(g.folders.values()).sort((c,I)=>we(c.name,I.name)),o=[...g.files].sort((c,I)=>we(c.name,I.name));for(const c of s)d.push({kind:"folder",treeKey:`folder:${c.id}`,id:c.id,name:c.name,depth:c.depth,fileCount:y(c)}),e[c.id]!==!1&&f(c);for(const c of o)d.push({kind:"file",treeKey:`file:${c.file.id}`,id:c.file.id,name:c.name,depth:c.depth,file:c.file})};return f(n),{nodes:d,folderIdsByFileId:v}}function z(t){return P.value[t]!==!1}function he(t){P.value={...P.value,[t]:!z(t)}}function ie(t){const e=Me.value[t]??[];if(e.length===0)return;const n={...P.value};let v=!1;for(const d of e)n[d]===!1&&(n[d]=!0,v=!0);v&&(P.value=n)}function ee(t){const e=F.value?8:10,n=F.value?12:14;return{paddingLeft:`${e+t*n}px`}}function le(t){return t==="add"?"Added":t==="delete"?"Deleted":t==="rename"?"Renamed":"Modified"}function ze(t,e){if(!(e instanceof HTMLElement)){se.delete(t);return}se.set(t,e)}function Ve(t){const e=t.params!==null&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:null;return typeof(e==null?void 0:e.threadId)=="string"?e.threadId:""}async function te(){var t,e,n;if(b.cwd.trim()){ae.value=!0,G.value="";try{const v=p.value==="baseBranch"?R.value.trim():"",d=await vt(b.cwd,p.value,C.value,v||null);if(d.baseBranchOptions.length>0){const f=d.baseBranch??d.baseBranchOptions[0]??"";R.value!==f&&(X.value=!0,R.value=f)}else R.value!==""&&(X.value=!0,R.value="");u.value=d,d.files.some(f=>f.id===S.value)||(S.value=((t=d.files[0])==null?void 0:t.id)??"",B.value=((n=(e=d.files[0])==null?void 0:e.hunks[0])==null?void 0:n.id)??"")}catch(v){G.value=v instanceof Error?v.message:"Failed to load review snapshot"}finally{ae.value=!1}}}async function He(){if(b.threadId.trim())try{const t=await Be(b.threadId);t.result&&(N.value={...N.value,[Q.value]:t.result})}catch{}}async function ye(){await Promise.all([te(),He()])}function me(t){var n,v;ie(t),S.value=t;const e=((n=u.value)==null?void 0:n.files.find(d=>d.id===t))??null;B.value=((v=e==null?void 0:e.hunks[0])==null?void 0:v.id)??"",F.value&&(j.value=!1)}async function re(t,e,n=""){var v,d,y;if(u.value){E.value=!0,L.value="";try{const f=await ft({cwd:b.cwd,scope:p.value,workspaceView:C.value,action:t,level:e,patch:n});u.value=f,f.files.some(s=>s.id===S.value)||(S.value=((v=f.files[0])==null?void 0:v.id)??"",B.value=((y=(d=f.files[0])==null?void 0:d.hunks[0])==null?void 0:y.id)??"")}catch(f){L.value=f instanceof Error?f.message:"Failed to apply review action"}finally{E.value=!1}}}async function Ke(t){await re(t,"all")}async function Ue(t,e){await re(t,"file",e.diff)}async function Oe(t,e){B.value=e.id,await re(t,"hunk",e.patch)}async function Xe(){if(b.cwd.trim()){Y.value=!0,L.value="";try{await dt(b.cwd),await te()}catch(t){L.value=t instanceof Error?t.message:"Failed to initialize Git"}finally{Y.value=!1}}}async function je(){var t,e;if(!(!oe.value||T.value)){L.value="",M.value=p.value==="workspace"?"Reviewing current changes":`Reviewing against ${((t=u.value)==null?void 0:t.baseBranch)??"base branch"}`,T.value=!0,q.value=Q.value;try{await ct(b.threadId,p.value,C.value,R.value||(((e=u.value)==null?void 0:e.baseBranch)??null))}catch(n){T.value=!1,M.value="",L.value=n instanceof Error?n.message:"Failed to start review"}}}function Ye(t){if(!t.absolutePath)return"";const e=t.startLine?`:${t.startLine}${t.endLine&&t.endLine!==t.startLine?`-${t.endLine}`:""}`:"";return`${t.absolutePath}${e}`}function qe(t,e){if(!e.startLine)return t.hunks[0]??null;for(const n of t.hunks){if(n.newStart!==null){const v=n.newStart+Math.max(n.newLineCount,1)-1;if(e.startLine>=n.newStart&&e.startLine<=v)return n}if(n.oldStart!==null){const v=n.oldStart+Math.max(n.oldLineCount,1)-1;if(e.startLine>=n.oldStart&&e.startLine<=v)return n}}return t.hunks[0]??null}async function _e(t){await pt();const e=se.get(t);e==null||e.scrollIntoView({block:"center",behavior:"smooth"})}async function Je(t){var v;A.value="changes";const e=((v=u.value)==null?void 0:v.files.find(d=>d.absolutePath===t.absolutePath||d.previousAbsolutePath===t.absolutePath))??null;if(!e)return;ie(e.id),S.value=e.id;const n=qe(e,t);B.value=(n==null?void 0:n.id)??"",n!=null&&n.id&&await _e(n.id)}function Qe(t){if(Ve(t)!==b.threadId)return;const e=t.params!==null&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:null,n=(e==null?void 0:e.item)!==null&&typeof(e==null?void 0:e.item)=="object"&&!Array.isArray(e.item)?e.item:null,v=typeof(n==null?void 0:n.type)=="string"?n.type:"";if(t.method==="item/started"&&v==="enteredReviewMode"){T.value=!0,M.value=typeof(n==null?void 0:n.review)=="string"?n.review:"Review in progress";return}if(t.method==="item/completed"&&v==="exitedReviewMode"){const d=q.value||Q.value;T.value=!1,M.value="",Be(b.threadId).then(y=>{y.result&&(N.value={...N.value,[d]:y.result},A.value="findings")}).catch(y=>{L.value=y instanceof Error?y.message:"Failed to load review result"}).finally(()=>{q.value=""})}}return K(()=>[b.threadId,b.cwd],()=>{S.value="",B.value="",N.value={},q.value="",L.value="",M.value="",ye()},{immediate:!0}),K(()=>[p.value,C.value],()=>{S.value="",B.value="",L.value="",G.value="",te()}),K(R,(t,e)=>{if(X.value){X.value=!1;return}p.value==="baseBranch"&&(!t||t===e||te())}),K(k,t=>{var e;t&&(ie(t.id),t.hunks.some(n=>n.id===B.value)||(B.value=((e=t.hunks[0])==null?void 0:e.id)??""))}),K(B,t=>{t&&_e(t)}),at(()=>{J=st(Qe)}),nt(()=>{J&&(J(),J=null),$==null||$()}),(t,e)=>{var n,v,d,y,f,g;return i(),l("section",{class:ge(["review-pane",{"is-mobile":U(F)}]),onClick:e[9]||(e[9]=Ce(()=>{},["stop"]))},[a("header",ht,[a("div",yt,[e[10]||(e[10]=a("p",{class:"review-pane-eyebrow"},"Review",-1)),a("p",mt,r(Re.value),1)]),a("div",_t,[U(F)&&A.value==="changes"&&((n=u.value)!=null&&n.files.length)?(i(),l("button",{key:0,type:"button",class:"review-pane-mobile-files-button",onClick:e[0]||(e[0]=s=>j.value=!0)}," Files ")):h("",!0),a("button",{type:"button",class:"review-pane-close","aria-label":"Close review pane",onClick:e[1]||(e[1]=s=>t.$emit("close"))},[ke(it,{class:"icon-svg"})])])]),a("div",bt,[a("div",kt,[a("div",gt,[(i(),l(m,null,x(xe,s=>a("button",{key:s.value,type:"button",class:"review-pane-segmented-button review-pane-tab","data-active":A.value===s.value,onClick:o=>A.value=s.value},r(s.label),9,Ct)),64))])]),a("div",Bt,[a("div",Lt,[e[11]||(e[11]=a("span",{class:"review-pane-control-label"},"Compare",-1)),a("div",Ft,[a("button",{type:"button",class:"review-pane-segmented-button review-pane-scope","data-active":p.value==="workspace",onClick:e[2]||(e[2]=s=>p.value="workspace")}," Workspace ",8,It),a("button",{type:"button",class:"review-pane-segmented-button review-pane-scope","data-active":p.value==="baseBranch",disabled:!((v=u.value)!=null&&v.baseBranch),onClick:e[3]||(e[3]=s=>p.value="baseBranch")}," Base branch ",8,xt)])]),p.value==="baseBranch"&&((d=u.value)!=null&&d.baseBranchOptions.length)?(i(),l("div",Rt,[e[12]||(e[12]=a("span",{class:"review-pane-control-label"},"Branch",-1)),a("label",St,[lt(a("select",{"onUpdate:modelValue":e[4]||(e[4]=s=>R.value=s),class:"review-pane-branch-select"},[(i(!0),l(m,null,x(u.value.baseBranchOptions,s=>(i(),l("option",{key:s,value:s},r(s),9,$t))),128))],512),[[rt,R.value]])])])):h("",!0),p.value==="workspace"?(i(),l("div",Tt,[e[13]||(e[13]=a("span",{class:"review-pane-control-label"},"Changes",-1)),a("div",At,[a("button",{type:"button",class:"review-pane-segmented-button review-pane-view","data-active":C.value==="unstaged",onClick:e[5]||(e[5]=s=>C.value="unstaged")}," Unstaged ",8,Et),a("button",{type:"button",class:"review-pane-segmented-button review-pane-view","data-active":C.value==="staged",onClick:e[6]||(e[6]=s=>C.value="staged")}," Staged ",8,Mt)])])):h("",!0)]),a("div",Nt,[a("button",{type:"button",class:"review-pane-run",disabled:!oe.value||T.value,onClick:je},r(T.value?"Reviewing…":"Run review"),9,Pt),a("button",{type:"button",class:"review-pane-refresh",disabled:ae.value,onClick:ye}," Refresh ",8,Dt)])]),de.value?(i(),l("div",{key:0,class:ge(["review-pane-banner",{"is-error":Ae.value}])},r(de.value),3)):h("",!0),u.value?(i(),l("div",Gt,[a("span",null,r(u.value.summary.fileCount)+" files",1),a("span",Wt,"+"+r(u.value.summary.addedLineCount),1),a("span",zt,"-"+r(u.value.summary.removedLineCount),1),u.value.headBranch?(i(),l("span",Vt,r(u.value.headBranch),1)):h("",!0),p.value==="baseBranch"&&u.value.baseBranch?(i(),l("span",Ht,"vs "+r(u.value.baseBranch),1)):h("",!0)])):h("",!0),A.value==="changes"?(i(),l("div",Kt,[u.value?u.value.isGitRepo?p.value==="baseBranch"&&!u.value.baseBranch?(i(),l("div",jt,[...e[17]||(e[17]=[a("p",{class:"review-pane-empty-title"},"Base branch unavailable",-1),a("p",{class:"review-pane-empty-text"},"Could not resolve `origin/HEAD`, `main`, or `master` for this repository.",-1)])])):(i(),l(m,{key:3},[ue.value?(i(),l("div",Yt,[(i(!0),l(m,null,x(Se.value,s=>(i(),l("button",{key:s.value,type:"button",class:"review-pane-bulk-button",disabled:E.value,onClick:o=>Ke(s.value)},r(s.label),9,qt))),128))])):h("",!0),u.value.files.length?(i(),l("div",{key:2,class:"review-pane-main",style:O(Ee.value)},[U(F)?h("",!0):(i(),l("aside",Zt,[(i(!0),l(m,null,x(pe.value,s=>{var o;return i(),l(m,{key:s.treeKey},[s.kind==="folder"?(i(),l("button",{key:0,type:"button",class:"review-pane-tree-folder",style:O(ee(s.depth)),"data-expanded":z(s.id),onClick:c=>he(s.id)},[a("span",{class:"review-pane-tree-caret","data-expanded":z(s.id)},null,8,ta),a("span",aa,r(s.name),1),a("span",sa,r(s.fileCount),1)],12,ea)):(i(),l("button",{key:1,type:"button",class:"review-pane-file review-pane-tree-file",style:O(ee(s.depth)),"data-active":((o=k.value)==null?void 0:o.id)===s.file.id,title:s.file.path,onClick:c=>me(s.file.id)},[a("span",ia,[a("span",la,[a("span",{class:"review-pane-file-op","data-operation":s.file.operation},r(le(s.file.operation)),9,ra),a("span",oa,[D(r(s.name)+" ",1),s.file.previousPath?(i(),l(m,{key:0},[D(" ← "+r(fe(s.file.previousPath)),1)],64)):h("",!0)])]),a("span",ua,[a("span",va,"+"+r(s.file.addedLineCount),1),e[19]||(e[19]=a("span",{class:"review-pane-delta-separator"},"/",-1)),a("span",da,"-"+r(s.file.removedLineCount),1)])])],12,na))],64)}),128))])),U(F)?h("",!0):(i(),l("div",{key:1,class:"review-pane-resizer",role:"separator","aria-orientation":"vertical","aria-label":"Resize file list",onPointerdown:De},null,32)),a("section",ca,[k.value?(i(),l(m,{key:0},[a("div",pa,[a("div",fa,[a("p",wa,[D(r(k.value.path)+" ",1),k.value.previousPath?(i(),l(m,{key:0},[D(" ← "+r(k.value.previousPath),1)],64)):h("",!0)]),a("p",ha,r(le(k.value.operation))+" · +"+r(k.value.addedLineCount)+" / -"+r(k.value.removedLineCount),1)]),ve.value?(i(),l("div",ya,[(i(!0),l(m,null,x($e.value,s=>(i(),l("button",{key:`${k.value.id}:${s.value}`,type:"button",class:"review-pane-row-button",disabled:E.value,onClick:o=>Ue(s.value,k.value)},r(s.label),9,ma))),128))])):h("",!0)]),k.value.hunks.length===0?(i(),l("div",_a,[a("pre",null,r(k.value.diff||"No unified diff available."),1)])):(i(),l("div",ba,[(i(!0),l(m,null,x(k.value.hunks,s=>(i(),l("article",{key:s.id,ref_for:!0,ref:o=>ze(s.id,o),class:"review-pane-hunk","data-active":B.value===s.id,onClick:o=>B.value=s.id},[a("div",ga,[a("div",null,[a("p",Ca,r(s.header),1),a("p",Ba,"+"+r(s.addedLineCount)+" / -"+r(s.removedLineCount),1)]),ve.value?(i(),l("div",La,[(i(!0),l(m,null,x(Te.value,o=>(i(),l("button",{key:`${s.id}:${o.value}`,type:"button",class:"review-pane-row-button",disabled:E.value,onClick:c=>Oe(o.value,s)},r(o.label),9,Fa))),128))])):h("",!0)]),a("div",Ia,[(i(!0),l(m,null,x(s.lines,o=>(i(),l("div",{key:o.key,class:"review-pane-line","data-kind":o.kind},[a("span",Ra,r(o.oldLine??""),1),a("span",Sa,r(o.newLine??""),1),a("span",$a,r(Ge(o.kind)),1),a("code",Ta,r(o.text||" "),1)],8,xa))),128))])],8,ka))),128))]))],64)):h("",!0)])],4)):(i(),l("div",Jt,[e[18]||(e[18]=a("p",{class:"review-pane-empty-title"},"No changes in this scope",-1)),a("p",Qt,r(p.value==="workspace"?"Your current workspace is clean.":"No merge diff found against the base branch."),1)]))],64)):(i(),l("div",Ot,[e[15]||(e[15]=a("p",{class:"review-pane-empty-title"},"This folder is not a Git repository",-1)),e[16]||(e[16]=a("p",{class:"review-pane-empty-text"},"Initialize Git to review local changes and run Codex review.",-1)),a("button",{type:"button",class:"review-pane-primary-cta",disabled:Y.value,onClick:Xe},r(Y.value?"Initializing…":"Initialize Git"),9,Xt)])):(i(),l("div",Ut,[...e[14]||(e[14]=[a("p",{class:"review-pane-empty-title"},"Loading review state",-1)])]))])):(i(),l("div",Aa,[(y=W.value)!=null&&y.summary?(i(),l("div",Ea,[e[20]||(e[20]=a("p",{class:"review-pane-summary-title"},"Summary",-1)),a("pre",Ma,r(W.value.summary),1)])):h("",!0),(f=W.value)!=null&&f.findings.length?(i(),l("div",Na,[(i(!0),l(m,null,x(W.value.findings,s=>(i(),l("button",{key:s.id,type:"button",class:"review-pane-finding",onClick:o=>Je(s)},[a("span",Da,r(s.title),1),s.absolutePath?(i(),l("span",Ga,r(Ye(s)),1)):h("",!0),s.body?(i(),l("span",Wa,r(s.body),1)):h("",!0)],8,Pa))),128))])):(i(),l("div",za,[e[21]||(e[21]=a("p",{class:"review-pane-empty-title"},"No structured findings yet",-1)),a("p",Va,r((g=W.value)!=null&&g.summary?"The latest review only returned summary text.":"Run review to populate this pane."),1)]))])),ke(ut,{name:"review-pane-sheet"},{default:ot(()=>{var s;return[U(F)&&j.value&&((s=u.value)!=null&&s.files.length)?(i(),l("div",{key:0,class:"review-pane-sheet-backdrop",onClick:e[8]||(e[8]=o=>j.value=!1)},[a("div",{class:"review-pane-sheet",onClick:e[7]||(e[7]=Ce(()=>{},["stop"]))},[e[24]||(e[24]=a("div",{class:"review-pane-sheet-handle","aria-hidden":"true"},null,-1)),a("div",Ha,[e[22]||(e[22]=a("p",{class:"review-pane-sheet-title"},"Changed files",-1)),a("p",Ka,r(u.value.files.length),1)]),a("div",Ua,[(i(!0),l(m,null,x(pe.value,o=>{var c;return i(),l(m,{key:`sheet:${o.treeKey}`},[o.kind==="folder"?(i(),l("button",{key:0,type:"button",class:"review-pane-tree-folder review-pane-tree-folder-sheet",style:O(ee(o.depth)),"data-expanded":z(o.id),onClick:I=>he(o.id)},[a("span",{class:"review-pane-tree-caret","data-expanded":z(o.id)},null,8,Xa),a("span",ja,r(o.name),1),a("span",Ya,r(o.fileCount),1)],12,Oa)):(i(),l("button",{key:1,type:"button",class:"review-pane-file review-pane-tree-file",style:O(ee(o.depth)),"data-active":((c=k.value)==null?void 0:c.id)===o.file.id,title:o.file.path,onClick:I=>me(o.file.id)},[a("span",Ja,[a("span",Qa,[a("span",{class:"review-pane-file-op","data-operation":o.file.operation},r(le(o.file.operation)),9,Za),a("span",es,[D(r(o.name)+" ",1),o.file.previousPath?(i(),l(m,{key:0},[D(" ← "+r(fe(o.file.previousPath)),1)],64)):h("",!0)])]),a("span",ts,[a("span",as,"+"+r(o.file.addedLineCount),1),e[23]||(e[23]=a("span",{class:"review-pane-delta-separator"},"/",-1)),a("span",ss,"-"+r(o.file.removedLineCount),1)])])],12,qa))],64)}),128))])])])):h("",!0)]}),_:1})],2)}}}),os=wt(ls,[["__scopeId","data-v-cf07d06e"]]);export{os as default};
2
- //# sourceMappingURL=ReviewPane-BYXF27M-.js.map
1
+ import{d as et,u as tt,r as w,w as H,b as at,B as st,e as nt,o as i,c as l,a,t as r,v as U,f as h,m as ke,q as it,F as m,g as x,C as lt,D as rt,h as ge,l as O,x as D,j as ot,s as Ce,T as ut,y as _,E as vt,G as dt,H as ct,n as pt,J as Be,K as ft,_ as wt}from"./index-CmAz60O4.js";const ht={class:"review-pane-header"},yt={class:"review-pane-heading"},mt={class:"review-pane-title"},_t={class:"review-pane-header-actions"},bt={class:"review-pane-toolbar"},kt={class:"review-pane-toolbar-tabs"},gt={class:"review-pane-segmented review-pane-segmented-primary"},Ct=["data-active","onClick"],Bt={class:"review-pane-toolbar-controls"},Lt={class:"review-pane-control-cluster"},Ft={class:"review-pane-segmented"},It=["data-active"],xt=["data-active","disabled"],Rt={key:0,class:"review-pane-control-cluster"},St={class:"review-pane-branch-select-wrap"},$t=["value"],Tt={key:1,class:"review-pane-control-cluster"},Et={class:"review-pane-segmented"},At=["data-active"],Mt=["data-active"],Nt={class:"review-pane-toolbar-actions"},Pt=["disabled"],Dt=["disabled"],Gt={key:1,class:"review-pane-meta"},Wt={class:"review-pane-summary-pill review-pane-summary-pill-add"},zt={class:"review-pane-summary-pill review-pane-summary-pill-remove"},Kt={key:0},Vt={key:1},Ht={key:2,class:"review-pane-content"},Ut={key:0,class:"review-pane-empty"},Ot={key:1,class:"review-pane-empty"},Xt=["disabled"],jt={key:2,class:"review-pane-empty"},Yt={key:0,class:"review-pane-bulk-actions"},qt=["disabled","onClick"],Jt={key:1,class:"review-pane-empty"},Qt={class:"review-pane-empty-text"},Zt={key:0,class:"review-pane-file-list"},ea=["data-expanded","onClick"],ta=["data-expanded"],aa={class:"review-pane-tree-folder-name"},sa={class:"review-pane-tree-folder-count"},na=["data-active","title","onClick"],ia={class:"review-pane-file-meta-row"},la={class:"review-pane-file-main"},ra=["data-operation"],oa={class:"review-pane-file-path"},ua={class:"review-pane-file-delta"},va={class:"review-pane-delta-add"},da={class:"review-pane-delta-remove"},ca={class:"review-pane-diff"},pa={class:"review-pane-file-header"},fa={class:"review-pane-file-header-main"},wa={class:"review-pane-file-title"},ha={class:"review-pane-file-subtitle"},ya={key:0,class:"review-pane-row-actions"},ma=["disabled","onClick"],_a={key:0,class:"review-pane-raw-diff"},ba={key:1,class:"review-pane-hunks"},ka=["data-active","onClick"],ga={class:"review-pane-hunk-header"},Ca={class:"review-pane-hunk-title"},Ba={class:"review-pane-hunk-meta"},La={key:0,class:"review-pane-row-actions"},Fa=["disabled","onClick"],Ia={class:"review-pane-lines"},xa=["data-kind"],Ra={class:"review-pane-line-number"},Sa={class:"review-pane-line-number"},$a={class:"review-pane-line-marker"},Ta={class:"review-pane-line-code"},Ea={key:3,class:"review-pane-findings"},Aa={key:0,class:"review-pane-summary-card"},Ma={class:"review-pane-summary-text"},Na={key:1,class:"review-pane-findings-list"},Pa=["onClick"],Da={class:"review-pane-finding-title"},Ga={key:0,class:"review-pane-finding-location"},Wa={key:1,class:"review-pane-finding-body"},za={key:2,class:"review-pane-empty"},Ka={class:"review-pane-empty-text"},Va={class:"review-pane-sheet-header"},Ha={class:"review-pane-sheet-count"},Ua={class:"review-pane-sheet-list"},Oa=["data-expanded","onClick"],Xa=["data-expanded"],ja={class:"review-pane-tree-folder-name"},Ya={class:"review-pane-tree-folder-count"},qa=["data-active","title","onClick"],Ja={class:"review-pane-file-meta-row"},Qa={class:"review-pane-file-main"},Za=["data-operation"],es={class:"review-pane-file-path"},ts={class:"review-pane-file-delta"},as={class:"review-pane-delta-add"},ss={class:"review-pane-delta-remove"},Le="codex-web-local.review-pane-file-list-width.v1",ns=220,is=420,Fe=288,ls=et({__name:"ReviewPane",props:{threadId:{},cwd:{},isThreadInProgress:{type:Boolean}},emits:["close"],setup(Ie){const b=Ie,{isMobile:F}=tt(),E=w("changes"),p=w("workspace"),C=w("unstaged"),u=w(null),R=w(""),X=w(!1),S=w(""),B=w(""),j=w(!1),ae=w(!1),A=w(!1),T=w(!1),Y=w(!1),G=w(""),L=w(""),M=w(""),N=w({}),q=w(""),se=new Map;let J=null,$=null;const xe=[{value:"changes",label:"Changes"},{value:"findings",label:"Findings"}],Q=_(()=>`${p.value}:${C.value}`),W=_(()=>N.value[Q.value]??null),k=_(()=>{var t,e;return((t=u.value)==null?void 0:t.files.find(n=>n.id===S.value))??((e=u.value)==null?void 0:e.files[0])??null}),P=w({}),Re=_(()=>{var t,e;return(t=u.value)!=null&&t.isGitRepo?p.value==="workspace"?C.value==="staged"?"Staged changes":"Workspace changes":(e=u.value)!=null&&e.baseBranch?`Against ${u.value.baseBranch}`:"Base branch":"Repository review"}),oe=_(()=>{var t,e;return b.threadId.trim().length>0&&b.cwd.trim().length>0&&((t=u.value)==null?void 0:t.isGitRepo)===!0&&!b.isThreadInProgress&&!(p.value==="baseBranch"&&!((e=u.value)!=null&&e.baseBranch))}),ue=_(()=>{var t;return p.value==="workspace"&&((t=u.value)==null?void 0:t.isGitRepo)===!0&&u.value.files.length>0}),ve=_(()=>ue.value&&!A.value),Se=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage all"}]:[{value:"stage",label:"Stage all"},{value:"revert",label:"Revert all"}]),$e=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage file"}]:[{value:"stage",label:"Stage file"},{value:"revert",label:"Revert file"}]),Te=_(()=>C.value==="staged"?[{value:"unstage",label:"Unstage hunk"}]:[{value:"stage",label:"Stage hunk"},{value:"revert",label:"Revert hunk"}]),de=_(()=>L.value||G.value||M.value),Ee=_(()=>!!(L.value||G.value)),Z=w(Ne()),Ae=_(()=>{const t={};return F.value||(t["--review-file-list-width"]=`${Z.value}px`),t}),ce=_(()=>{var t;return We(((t=u.value)==null?void 0:t.files)??[],P.value)}),pe=_(()=>ce.value.nodes),Me=_(()=>ce.value.folderIdsByFileId);function ne(t){return Number.isFinite(t)?Math.min(is,Math.max(ns,Math.round(t))):Fe}function Ne(){if(typeof window>"u")return Fe;const t=window.localStorage.getItem(Le),e=t?Number(t):Number.NaN;return ne(e)}function Pe(t){typeof window>"u"||window.localStorage.setItem(Le,String(ne(t)))}function De(t){if(F.value)return;t.preventDefault(),$==null||$();const e=t.clientX,n=Z.value,v=f=>{Z.value=ne(n+(f.clientX-e))},d=()=>{window.removeEventListener("pointermove",v),window.removeEventListener("pointerup",y),$=null},y=()=>{d(),Pe(Z.value)};window.addEventListener("pointermove",v),window.addEventListener("pointerup",y),$=d}function Ge(t){return t==="add"?"+":t==="remove"?"-":t==="hunk"?"@@":" "}function fe(t){const e=t.split("/").filter(Boolean);return e[e.length-1]??t}function we(t,e){return t.localeCompare(e,void 0,{numeric:!0,sensitivity:"base"})}function We(t,e){const n={folders:new Map,files:[]},v={};for(const g of t){const s=g.path.split("/").filter(Boolean),o=s.pop()??g.path;let c=n,I="";const be=[];for(const[Ze,K]of s.entries()){I=I?`${I}/${K}`:K;let V=c.folders.get(K);V||(V={id:I,name:K,depth:Ze,folders:new Map,files:[]},c.folders.set(K,V)),c=V,be.push(V.id)}c.files.push({file:g,name:o,depth:s.length}),v[g.id]=be}const d=[],y=g=>g.files.length+Array.from(g.folders.values()).reduce((s,o)=>s+y(o),0),f=g=>{const s=Array.from(g.folders.values()).sort((c,I)=>we(c.name,I.name)),o=[...g.files].sort((c,I)=>we(c.name,I.name));for(const c of s)d.push({kind:"folder",treeKey:`folder:${c.id}`,id:c.id,name:c.name,depth:c.depth,fileCount:y(c)}),e[c.id]!==!1&&f(c);for(const c of o)d.push({kind:"file",treeKey:`file:${c.file.id}`,id:c.file.id,name:c.name,depth:c.depth,file:c.file})};return f(n),{nodes:d,folderIdsByFileId:v}}function z(t){return P.value[t]!==!1}function he(t){P.value={...P.value,[t]:!z(t)}}function ie(t){const e=Me.value[t]??[];if(e.length===0)return;const n={...P.value};let v=!1;for(const d of e)n[d]===!1&&(n[d]=!0,v=!0);v&&(P.value=n)}function ee(t){const e=F.value?8:10,n=F.value?12:14;return{paddingLeft:`${e+t*n}px`}}function le(t){return t==="add"?"Added":t==="delete"?"Deleted":t==="rename"?"Renamed":"Modified"}function ze(t,e){if(!(e instanceof HTMLElement)){se.delete(t);return}se.set(t,e)}function Ke(t){const e=t.params!==null&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:null;return typeof(e==null?void 0:e.threadId)=="string"?e.threadId:""}async function te(){var t,e,n;if(b.cwd.trim()){ae.value=!0,G.value="";try{const v=p.value==="baseBranch"?R.value.trim():"",d=await vt(b.cwd,p.value,C.value,v||null);if(d.baseBranchOptions.length>0){const f=d.baseBranch??d.baseBranchOptions[0]??"";R.value!==f&&(X.value=!0,R.value=f)}else R.value!==""&&(X.value=!0,R.value="");u.value=d,d.files.some(f=>f.id===S.value)||(S.value=((t=d.files[0])==null?void 0:t.id)??"",B.value=((n=(e=d.files[0])==null?void 0:e.hunks[0])==null?void 0:n.id)??"")}catch(v){G.value=v instanceof Error?v.message:"Failed to load review snapshot"}finally{ae.value=!1}}}async function Ve(){if(b.threadId.trim())try{const t=await Be(b.threadId);t.result&&(N.value={...N.value,[Q.value]:t.result})}catch{}}async function ye(){await Promise.all([te(),Ve()])}function me(t){var n,v;ie(t),S.value=t;const e=((n=u.value)==null?void 0:n.files.find(d=>d.id===t))??null;B.value=((v=e==null?void 0:e.hunks[0])==null?void 0:v.id)??"",F.value&&(j.value=!1)}async function re(t,e,n=""){var v,d,y;if(u.value){A.value=!0,L.value="";try{const f=await ft({cwd:b.cwd,scope:p.value,workspaceView:C.value,action:t,level:e,patch:n});u.value=f,f.files.some(s=>s.id===S.value)||(S.value=((v=f.files[0])==null?void 0:v.id)??"",B.value=((y=(d=f.files[0])==null?void 0:d.hunks[0])==null?void 0:y.id)??"")}catch(f){L.value=f instanceof Error?f.message:"Failed to apply review action"}finally{A.value=!1}}}async function He(t){await re(t,"all")}async function Ue(t,e){await re(t,"file",e.diff)}async function Oe(t,e){B.value=e.id,await re(t,"hunk",e.patch)}async function Xe(){if(b.cwd.trim()){Y.value=!0,L.value="";try{await dt(b.cwd),await te()}catch(t){L.value=t instanceof Error?t.message:"Failed to initialize Git"}finally{Y.value=!1}}}async function je(){var t,e;if(!(!oe.value||T.value)){L.value="",M.value=p.value==="workspace"?"Reviewing current changes":`Reviewing against ${((t=u.value)==null?void 0:t.baseBranch)??"base branch"}`,T.value=!0,q.value=Q.value;try{await ct(b.threadId,p.value,C.value,R.value||(((e=u.value)==null?void 0:e.baseBranch)??null))}catch(n){T.value=!1,M.value="",L.value=n instanceof Error?n.message:"Failed to start review"}}}function Ye(t){if(!t.absolutePath)return"";const e=t.startLine?`:${t.startLine}${t.endLine&&t.endLine!==t.startLine?`-${t.endLine}`:""}`:"";return`${t.absolutePath}${e}`}function qe(t,e){if(!e.startLine)return t.hunks[0]??null;for(const n of t.hunks){if(n.newStart!==null){const v=n.newStart+Math.max(n.newLineCount,1)-1;if(e.startLine>=n.newStart&&e.startLine<=v)return n}if(n.oldStart!==null){const v=n.oldStart+Math.max(n.oldLineCount,1)-1;if(e.startLine>=n.oldStart&&e.startLine<=v)return n}}return t.hunks[0]??null}async function _e(t){await pt();const e=se.get(t);e==null||e.scrollIntoView({block:"center",behavior:"smooth"})}async function Je(t){var v;E.value="changes";const e=((v=u.value)==null?void 0:v.files.find(d=>d.absolutePath===t.absolutePath||d.previousAbsolutePath===t.absolutePath))??null;if(!e)return;ie(e.id),S.value=e.id;const n=qe(e,t);B.value=(n==null?void 0:n.id)??"",n!=null&&n.id&&await _e(n.id)}function Qe(t){if(Ke(t)!==b.threadId)return;const e=t.params!==null&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:null,n=(e==null?void 0:e.item)!==null&&typeof(e==null?void 0:e.item)=="object"&&!Array.isArray(e.item)?e.item:null,v=typeof(n==null?void 0:n.type)=="string"?n.type:"";if(t.method==="item/started"&&v==="enteredReviewMode"){T.value=!0,M.value=typeof(n==null?void 0:n.review)=="string"?n.review:"Review in progress";return}if(t.method==="item/completed"&&v==="exitedReviewMode"){const d=q.value||Q.value;T.value=!1,M.value="",Be(b.threadId).then(y=>{y.result&&(N.value={...N.value,[d]:y.result},E.value="findings")}).catch(y=>{L.value=y instanceof Error?y.message:"Failed to load review result"}).finally(()=>{q.value=""})}}return H(()=>[b.threadId,b.cwd],()=>{S.value="",B.value="",N.value={},q.value="",L.value="",M.value="",ye()},{immediate:!0}),H(()=>[p.value,C.value],()=>{S.value="",B.value="",L.value="",G.value="",te()}),H(R,(t,e)=>{if(X.value){X.value=!1;return}p.value==="baseBranch"&&(!t||t===e||te())}),H(k,t=>{var e;t&&(ie(t.id),t.hunks.some(n=>n.id===B.value)||(B.value=((e=t.hunks[0])==null?void 0:e.id)??""))}),H(B,t=>{t&&_e(t)}),at(()=>{J=st(Qe)}),nt(()=>{J&&(J(),J=null),$==null||$()}),(t,e)=>{var n,v,d,y,f,g;return i(),l("section",{class:ge(["review-pane",{"is-mobile":U(F)}]),onClick:e[9]||(e[9]=Ce(()=>{},["stop"]))},[a("header",ht,[a("div",yt,[e[10]||(e[10]=a("p",{class:"review-pane-eyebrow"},"Review",-1)),a("p",mt,r(Re.value),1)]),a("div",_t,[U(F)&&E.value==="changes"&&((n=u.value)!=null&&n.files.length)?(i(),l("button",{key:0,type:"button",class:"review-pane-mobile-files-button",onClick:e[0]||(e[0]=s=>j.value=!0)}," Files ")):h("",!0),a("button",{type:"button",class:"review-pane-close","aria-label":"Close review pane",onClick:e[1]||(e[1]=s=>t.$emit("close"))},[ke(it,{class:"icon-svg"})])])]),a("div",bt,[a("div",kt,[a("div",gt,[(i(),l(m,null,x(xe,s=>a("button",{key:s.value,type:"button",class:"review-pane-segmented-button review-pane-tab","data-active":E.value===s.value,onClick:o=>E.value=s.value},r(s.label),9,Ct)),64))])]),a("div",Bt,[a("div",Lt,[e[11]||(e[11]=a("span",{class:"review-pane-control-label"},"Compare",-1)),a("div",Ft,[a("button",{type:"button",class:"review-pane-segmented-button review-pane-scope","data-active":p.value==="workspace",onClick:e[2]||(e[2]=s=>p.value="workspace")}," Workspace ",8,It),a("button",{type:"button",class:"review-pane-segmented-button review-pane-scope","data-active":p.value==="baseBranch",disabled:!((v=u.value)!=null&&v.baseBranch),onClick:e[3]||(e[3]=s=>p.value="baseBranch")}," Base branch ",8,xt)])]),p.value==="baseBranch"&&((d=u.value)!=null&&d.baseBranchOptions.length)?(i(),l("div",Rt,[e[12]||(e[12]=a("span",{class:"review-pane-control-label"},"Branch",-1)),a("label",St,[lt(a("select",{"onUpdate:modelValue":e[4]||(e[4]=s=>R.value=s),class:"review-pane-branch-select"},[(i(!0),l(m,null,x(u.value.baseBranchOptions,s=>(i(),l("option",{key:s,value:s},r(s),9,$t))),128))],512),[[rt,R.value]])])])):h("",!0),p.value==="workspace"?(i(),l("div",Tt,[e[13]||(e[13]=a("span",{class:"review-pane-control-label"},"Changes",-1)),a("div",Et,[a("button",{type:"button",class:"review-pane-segmented-button review-pane-view","data-active":C.value==="unstaged",onClick:e[5]||(e[5]=s=>C.value="unstaged")}," Unstaged ",8,At),a("button",{type:"button",class:"review-pane-segmented-button review-pane-view","data-active":C.value==="staged",onClick:e[6]||(e[6]=s=>C.value="staged")}," Staged ",8,Mt)])])):h("",!0)]),a("div",Nt,[a("button",{type:"button",class:"review-pane-run",disabled:!oe.value||T.value,onClick:je},r(T.value?"Reviewing…":"Run review"),9,Pt),a("button",{type:"button",class:"review-pane-refresh",disabled:ae.value,onClick:ye}," Refresh ",8,Dt)])]),de.value?(i(),l("div",{key:0,class:ge(["review-pane-banner",{"is-error":Ee.value}])},r(de.value),3)):h("",!0),u.value?(i(),l("div",Gt,[a("span",null,r(u.value.summary.fileCount)+" files",1),a("span",Wt,"+"+r(u.value.summary.addedLineCount),1),a("span",zt,"-"+r(u.value.summary.removedLineCount),1),u.value.headBranch?(i(),l("span",Kt,r(u.value.headBranch),1)):h("",!0),p.value==="baseBranch"&&u.value.baseBranch?(i(),l("span",Vt,"vs "+r(u.value.baseBranch),1)):h("",!0)])):h("",!0),E.value==="changes"?(i(),l("div",Ht,[u.value?u.value.isGitRepo?p.value==="baseBranch"&&!u.value.baseBranch?(i(),l("div",jt,[...e[17]||(e[17]=[a("p",{class:"review-pane-empty-title"},"Base branch unavailable",-1),a("p",{class:"review-pane-empty-text"},"Could not resolve `origin/HEAD`, `main`, or `master` for this repository.",-1)])])):(i(),l(m,{key:3},[ue.value?(i(),l("div",Yt,[(i(!0),l(m,null,x(Se.value,s=>(i(),l("button",{key:s.value,type:"button",class:"review-pane-bulk-button",disabled:A.value,onClick:o=>He(s.value)},r(s.label),9,qt))),128))])):h("",!0),u.value.files.length?(i(),l("div",{key:2,class:"review-pane-main",style:O(Ae.value)},[U(F)?h("",!0):(i(),l("aside",Zt,[(i(!0),l(m,null,x(pe.value,s=>{var o;return i(),l(m,{key:s.treeKey},[s.kind==="folder"?(i(),l("button",{key:0,type:"button",class:"review-pane-tree-folder",style:O(ee(s.depth)),"data-expanded":z(s.id),onClick:c=>he(s.id)},[a("span",{class:"review-pane-tree-caret","data-expanded":z(s.id)},null,8,ta),a("span",aa,r(s.name),1),a("span",sa,r(s.fileCount),1)],12,ea)):(i(),l("button",{key:1,type:"button",class:"review-pane-file review-pane-tree-file",style:O(ee(s.depth)),"data-active":((o=k.value)==null?void 0:o.id)===s.file.id,title:s.file.path,onClick:c=>me(s.file.id)},[a("span",ia,[a("span",la,[a("span",{class:"review-pane-file-op","data-operation":s.file.operation},r(le(s.file.operation)),9,ra),a("span",oa,[D(r(s.name)+" ",1),s.file.previousPath?(i(),l(m,{key:0},[D(" ← "+r(fe(s.file.previousPath)),1)],64)):h("",!0)])]),a("span",ua,[a("span",va,"+"+r(s.file.addedLineCount),1),e[19]||(e[19]=a("span",{class:"review-pane-delta-separator"},"/",-1)),a("span",da,"-"+r(s.file.removedLineCount),1)])])],12,na))],64)}),128))])),U(F)?h("",!0):(i(),l("div",{key:1,class:"review-pane-resizer",role:"separator","aria-orientation":"vertical","aria-label":"Resize file list",onPointerdown:De},null,32)),a("section",ca,[k.value?(i(),l(m,{key:0},[a("div",pa,[a("div",fa,[a("p",wa,[D(r(k.value.path)+" ",1),k.value.previousPath?(i(),l(m,{key:0},[D(" ← "+r(k.value.previousPath),1)],64)):h("",!0)]),a("p",ha,r(le(k.value.operation))+" · +"+r(k.value.addedLineCount)+" / -"+r(k.value.removedLineCount),1)]),ve.value?(i(),l("div",ya,[(i(!0),l(m,null,x($e.value,s=>(i(),l("button",{key:`${k.value.id}:${s.value}`,type:"button",class:"review-pane-row-button",disabled:A.value,onClick:o=>Ue(s.value,k.value)},r(s.label),9,ma))),128))])):h("",!0)]),k.value.hunks.length===0?(i(),l("div",_a,[a("pre",null,r(k.value.diff||"No unified diff available."),1)])):(i(),l("div",ba,[(i(!0),l(m,null,x(k.value.hunks,s=>(i(),l("article",{key:s.id,ref_for:!0,ref:o=>ze(s.id,o),class:"review-pane-hunk","data-active":B.value===s.id,onClick:o=>B.value=s.id},[a("div",ga,[a("div",null,[a("p",Ca,r(s.header),1),a("p",Ba,"+"+r(s.addedLineCount)+" / -"+r(s.removedLineCount),1)]),ve.value?(i(),l("div",La,[(i(!0),l(m,null,x(Te.value,o=>(i(),l("button",{key:`${s.id}:${o.value}`,type:"button",class:"review-pane-row-button",disabled:A.value,onClick:c=>Oe(o.value,s)},r(o.label),9,Fa))),128))])):h("",!0)]),a("div",Ia,[(i(!0),l(m,null,x(s.lines,o=>(i(),l("div",{key:o.key,class:"review-pane-line","data-kind":o.kind},[a("span",Ra,r(o.oldLine??""),1),a("span",Sa,r(o.newLine??""),1),a("span",$a,r(Ge(o.kind)),1),a("code",Ta,r(o.text||" "),1)],8,xa))),128))])],8,ka))),128))]))],64)):h("",!0)])],4)):(i(),l("div",Jt,[e[18]||(e[18]=a("p",{class:"review-pane-empty-title"},"No changes in this scope",-1)),a("p",Qt,r(p.value==="workspace"?"Your current workspace is clean.":"No merge diff found against the base branch."),1)]))],64)):(i(),l("div",Ot,[e[15]||(e[15]=a("p",{class:"review-pane-empty-title"},"This folder is not a Git repository",-1)),e[16]||(e[16]=a("p",{class:"review-pane-empty-text"},"Initialize Git to review local changes and run Codex review.",-1)),a("button",{type:"button",class:"review-pane-primary-cta",disabled:Y.value,onClick:Xe},r(Y.value?"Initializing…":"Initialize Git"),9,Xt)])):(i(),l("div",Ut,[...e[14]||(e[14]=[a("p",{class:"review-pane-empty-title"},"Loading review state",-1)])]))])):(i(),l("div",Ea,[(y=W.value)!=null&&y.summary?(i(),l("div",Aa,[e[20]||(e[20]=a("p",{class:"review-pane-summary-title"},"Summary",-1)),a("pre",Ma,r(W.value.summary),1)])):h("",!0),(f=W.value)!=null&&f.findings.length?(i(),l("div",Na,[(i(!0),l(m,null,x(W.value.findings,s=>(i(),l("button",{key:s.id,type:"button",class:"review-pane-finding",onClick:o=>Je(s)},[a("span",Da,r(s.title),1),s.absolutePath?(i(),l("span",Ga,r(Ye(s)),1)):h("",!0),s.body?(i(),l("span",Wa,r(s.body),1)):h("",!0)],8,Pa))),128))])):(i(),l("div",za,[e[21]||(e[21]=a("p",{class:"review-pane-empty-title"},"No structured findings yet",-1)),a("p",Ka,r((g=W.value)!=null&&g.summary?"The latest review only returned summary text.":"Run review to populate this pane."),1)]))])),ke(ut,{name:"review-pane-sheet"},{default:ot(()=>{var s;return[U(F)&&j.value&&((s=u.value)!=null&&s.files.length)?(i(),l("div",{key:0,class:"review-pane-sheet-backdrop",onClick:e[8]||(e[8]=o=>j.value=!1)},[a("div",{class:"review-pane-sheet",onClick:e[7]||(e[7]=Ce(()=>{},["stop"]))},[e[24]||(e[24]=a("div",{class:"review-pane-sheet-handle","aria-hidden":"true"},null,-1)),a("div",Va,[e[22]||(e[22]=a("p",{class:"review-pane-sheet-title"},"Changed files",-1)),a("p",Ha,r(u.value.files.length),1)]),a("div",Ua,[(i(!0),l(m,null,x(pe.value,o=>{var c;return i(),l(m,{key:`sheet:${o.treeKey}`},[o.kind==="folder"?(i(),l("button",{key:0,type:"button",class:"review-pane-tree-folder review-pane-tree-folder-sheet",style:O(ee(o.depth)),"data-expanded":z(o.id),onClick:I=>he(o.id)},[a("span",{class:"review-pane-tree-caret","data-expanded":z(o.id)},null,8,Xa),a("span",ja,r(o.name),1),a("span",Ya,r(o.fileCount),1)],12,Oa)):(i(),l("button",{key:1,type:"button",class:"review-pane-file review-pane-tree-file",style:O(ee(o.depth)),"data-active":((c=k.value)==null?void 0:c.id)===o.file.id,title:o.file.path,onClick:I=>me(o.file.id)},[a("span",Ja,[a("span",Qa,[a("span",{class:"review-pane-file-op","data-operation":o.file.operation},r(le(o.file.operation)),9,Za),a("span",es,[D(r(o.name)+" ",1),o.file.previousPath?(i(),l(m,{key:0},[D(" ← "+r(fe(o.file.previousPath)),1)],64)):h("",!0)])]),a("span",ts,[a("span",as,"+"+r(o.file.addedLineCount),1),e[23]||(e[23]=a("span",{class:"review-pane-delta-separator"},"/",-1)),a("span",ss,"-"+r(o.file.removedLineCount),1)])])],12,qa))],64)}),128))])])])):h("",!0)]}),_:1})],2)}}}),os=wt(ls,[["__scopeId","data-v-cf07d06e"]]);export{os as default};
2
+ //# sourceMappingURL=ReviewPane-Blnhnm6J.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReviewPane-BYXF27M-.js","sources":["../../src/components/content/ReviewPane.vue"],"sourcesContent":["<template>\n <section class=\"review-pane\" :class=\"{ 'is-mobile': isMobile }\" @click.stop>\n <header class=\"review-pane-header\">\n <div class=\"review-pane-heading\">\n <p class=\"review-pane-eyebrow\">Review</p>\n <p class=\"review-pane-title\">{{ headerTitle }}</p>\n </div>\n <div class=\"review-pane-header-actions\">\n <button\n v-if=\"isMobile && activeTab === 'changes' && snapshot?.files.length\"\n type=\"button\"\n class=\"review-pane-mobile-files-button\"\n @click=\"isFileSheetOpen = true\"\n >\n Files\n </button>\n <button type=\"button\" class=\"review-pane-close\" aria-label=\"Close review pane\" @click=\"$emit('close')\">\n <IconTablerX class=\"icon-svg\" />\n </button>\n </div>\n </header>\n\n <div class=\"review-pane-toolbar\">\n <div class=\"review-pane-toolbar-tabs\">\n <div class=\"review-pane-segmented review-pane-segmented-primary\">\n <button\n v-for=\"tab in reviewTabs\"\n :key=\"tab.value\"\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-tab\"\n :data-active=\"activeTab === tab.value\"\n @click=\"activeTab = tab.value\"\n >\n {{ tab.label }}\n </button>\n </div>\n </div>\n\n <div class=\"review-pane-toolbar-controls\">\n <div class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Compare</span>\n <div class=\"review-pane-segmented\">\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-scope\"\n :data-active=\"activeScope === 'workspace'\"\n @click=\"activeScope = 'workspace'\"\n >\n Workspace\n </button>\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-scope\"\n :data-active=\"activeScope === 'baseBranch'\"\n :disabled=\"!snapshot?.baseBranch\"\n @click=\"activeScope = 'baseBranch'\"\n >\n Base branch\n </button>\n </div>\n </div>\n\n <div v-if=\"activeScope === 'baseBranch' && snapshot?.baseBranchOptions.length\" class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Branch</span>\n <label class=\"review-pane-branch-select-wrap\">\n <select\n v-model=\"selectedBaseBranch\"\n class=\"review-pane-branch-select\"\n >\n <option\n v-for=\"branch in snapshot.baseBranchOptions\"\n :key=\"branch\"\n :value=\"branch\"\n >\n {{ branch }}\n </option>\n </select>\n </label>\n </div>\n\n <div v-if=\"activeScope === 'workspace'\" class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Changes</span>\n <div class=\"review-pane-segmented\">\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-view\"\n :data-active=\"workspaceView === 'unstaged'\"\n @click=\"workspaceView = 'unstaged'\"\n >\n Unstaged\n </button>\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-view\"\n :data-active=\"workspaceView === 'staged'\"\n @click=\"workspaceView = 'staged'\"\n >\n Staged\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"review-pane-toolbar-actions\">\n <button\n type=\"button\"\n class=\"review-pane-run\"\n :disabled=\"!canRunReview || isRunningReview\"\n @click=\"runReview\"\n >\n {{ isRunningReview ? 'Reviewing…' : 'Run review' }}\n </button>\n <button type=\"button\" class=\"review-pane-refresh\" :disabled=\"isLoadingSnapshot\" @click=\"reloadAll\">\n Refresh\n </button>\n </div>\n </div>\n\n <div v-if=\"reviewBannerText\" class=\"review-pane-banner\" :class=\"{ 'is-error': reviewBannerIsError }\">\n {{ reviewBannerText }}\n </div>\n\n <div v-if=\"snapshot\" class=\"review-pane-meta\">\n <span>{{ snapshot.summary.fileCount }} files</span>\n <span class=\"review-pane-summary-pill review-pane-summary-pill-add\">+{{ snapshot.summary.addedLineCount }}</span>\n <span class=\"review-pane-summary-pill review-pane-summary-pill-remove\">-{{ snapshot.summary.removedLineCount }}</span>\n <span v-if=\"snapshot.headBranch\">{{ snapshot.headBranch }}</span>\n <span v-if=\"activeScope === 'baseBranch' && snapshot.baseBranch\">vs {{ snapshot.baseBranch }}</span>\n </div>\n\n <div v-if=\"activeTab === 'changes'\" class=\"review-pane-content\">\n <template v-if=\"!snapshot\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">Loading review state</p>\n </div>\n </template>\n\n <template v-else-if=\"!snapshot.isGitRepo\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">This folder is not a Git repository</p>\n <p class=\"review-pane-empty-text\">Initialize Git to review local changes and run Codex review.</p>\n <button type=\"button\" class=\"review-pane-primary-cta\" :disabled=\"isInitializingGit\" @click=\"initializeGit\">\n {{ isInitializingGit ? 'Initializing…' : 'Initialize Git' }}\n </button>\n </div>\n </template>\n\n <template v-else-if=\"activeScope === 'baseBranch' && !snapshot.baseBranch\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">Base branch unavailable</p>\n <p class=\"review-pane-empty-text\">Could not resolve `origin/HEAD`, `main`, or `master` for this repository.</p>\n </div>\n </template>\n\n <template v-else>\n <div v-if=\"showBulkActions\" class=\"review-pane-bulk-actions\">\n <button\n v-for=\"action in bulkActions\"\n :key=\"action.value\"\n type=\"button\"\n class=\"review-pane-bulk-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyBulkAction(action.value)\"\n >\n {{ action.label }}\n </button>\n </div>\n\n <div v-if=\"!snapshot.files.length\" class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">No changes in this scope</p>\n <p class=\"review-pane-empty-text\">\n {{ activeScope === 'workspace' ? 'Your current workspace is clean.' : 'No merge diff found against the base branch.' }}\n </p>\n </div>\n\n <div v-else class=\"review-pane-main\" :style=\"reviewMainStyle\">\n <aside v-if=\"!isMobile\" class=\"review-pane-file-list\">\n <template v-for=\"node in visibleFileTreeNodes\" :key=\"node.treeKey\">\n <button\n v-if=\"node.kind === 'folder'\"\n type=\"button\"\n class=\"review-pane-tree-folder\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-expanded=\"isFolderExpanded(node.id)\"\n @click=\"toggleFolder(node.id)\"\n >\n <span class=\"review-pane-tree-caret\" :data-expanded=\"isFolderExpanded(node.id)\"></span>\n <span class=\"review-pane-tree-folder-name\">{{ node.name }}</span>\n <span class=\"review-pane-tree-folder-count\">{{ node.fileCount }}</span>\n </button>\n\n <button\n v-else\n type=\"button\"\n class=\"review-pane-file review-pane-tree-file\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-active=\"selectedFile?.id === node.file.id\"\n :title=\"node.file.path\"\n @click=\"selectFile(node.file.id)\"\n >\n <span class=\"review-pane-file-meta-row\">\n <span class=\"review-pane-file-main\">\n <span class=\"review-pane-file-op\" :data-operation=\"node.file.operation\">{{ formatOperation(node.file.operation) }}</span>\n <span class=\"review-pane-file-path\">\n {{ node.name }}\n <template v-if=\"node.file.previousPath\"> ← {{ fileBaseName(node.file.previousPath) }}</template>\n </span>\n </span>\n <span class=\"review-pane-file-delta\">\n <span class=\"review-pane-delta-add\">+{{ node.file.addedLineCount }}</span>\n <span class=\"review-pane-delta-separator\">/</span>\n <span class=\"review-pane-delta-remove\">-{{ node.file.removedLineCount }}</span>\n </span>\n </span>\n </button>\n </template>\n </aside>\n\n <div\n v-if=\"!isMobile\"\n class=\"review-pane-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize file list\"\n @pointerdown=\"onResizerPointerDown\"\n ></div>\n\n <section class=\"review-pane-diff\">\n <template v-if=\"selectedFile\">\n <div class=\"review-pane-file-header\">\n <div class=\"review-pane-file-header-main\">\n <p class=\"review-pane-file-title\">\n {{ selectedFile.path }}\n <template v-if=\"selectedFile.previousPath\"> ← {{ selectedFile.previousPath }}</template>\n </p>\n <p class=\"review-pane-file-subtitle\">\n {{ formatOperation(selectedFile.operation) }} · +{{ selectedFile.addedLineCount }} / -{{ selectedFile.removedLineCount }}\n </p>\n </div>\n <div v-if=\"showRowActions\" class=\"review-pane-row-actions\">\n <button\n v-for=\"action in fileActions\"\n :key=\"`${selectedFile.id}:${action.value}`\"\n type=\"button\"\n class=\"review-pane-row-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyFileAction(action.value, selectedFile)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <div v-if=\"selectedFile.hunks.length === 0\" class=\"review-pane-raw-diff\">\n <pre>{{ selectedFile.diff || 'No unified diff available.' }}</pre>\n </div>\n\n <div v-else class=\"review-pane-hunks\">\n <article\n v-for=\"hunk in selectedFile.hunks\"\n :key=\"hunk.id\"\n :ref=\"(element) => bindHunkRef(hunk.id, element)\"\n class=\"review-pane-hunk\"\n :data-active=\"selectedHunkId === hunk.id\"\n @click=\"selectedHunkId = hunk.id\"\n >\n <div class=\"review-pane-hunk-header\">\n <div>\n <p class=\"review-pane-hunk-title\">{{ hunk.header }}</p>\n <p class=\"review-pane-hunk-meta\">+{{ hunk.addedLineCount }} / -{{ hunk.removedLineCount }}</p>\n </div>\n <div v-if=\"showRowActions\" class=\"review-pane-row-actions\">\n <button\n v-for=\"action in hunkActions\"\n :key=\"`${hunk.id}:${action.value}`\"\n type=\"button\"\n class=\"review-pane-row-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyHunkAction(action.value, hunk)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <div class=\"review-pane-lines\">\n <div\n v-for=\"line in hunk.lines\"\n :key=\"line.key\"\n class=\"review-pane-line\"\n :data-kind=\"line.kind\"\n >\n <span class=\"review-pane-line-number\">{{ line.oldLine ?? '' }}</span>\n <span class=\"review-pane-line-number\">{{ line.newLine ?? '' }}</span>\n <span class=\"review-pane-line-marker\">{{ lineMarker(line.kind) }}</span>\n <code class=\"review-pane-line-code\">{{ line.text || ' ' }}</code>\n </div>\n </div>\n </article>\n </div>\n </template>\n </section>\n </div>\n </template>\n </div>\n\n <div v-else class=\"review-pane-findings\">\n <div v-if=\"currentReviewResult?.summary\" class=\"review-pane-summary-card\">\n <p class=\"review-pane-summary-title\">Summary</p>\n <pre class=\"review-pane-summary-text\">{{ currentReviewResult.summary }}</pre>\n </div>\n\n <div v-if=\"currentReviewResult?.findings.length\" class=\"review-pane-findings-list\">\n <button\n v-for=\"finding in currentReviewResult.findings\"\n :key=\"finding.id\"\n type=\"button\"\n class=\"review-pane-finding\"\n @click=\"openFinding(finding)\"\n >\n <span class=\"review-pane-finding-title\">{{ finding.title }}</span>\n <span v-if=\"finding.absolutePath\" class=\"review-pane-finding-location\">\n {{ formatFindingLocation(finding) }}\n </span>\n <span v-if=\"finding.body\" class=\"review-pane-finding-body\">{{ finding.body }}</span>\n </button>\n </div>\n\n <div v-else class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">No structured findings yet</p>\n <p class=\"review-pane-empty-text\">\n {{ currentReviewResult?.summary ? 'The latest review only returned summary text.' : 'Run review to populate this pane.' }}\n </p>\n </div>\n </div>\n\n <Transition name=\"review-pane-sheet\">\n <div\n v-if=\"isMobile && isFileSheetOpen && snapshot?.files.length\"\n class=\"review-pane-sheet-backdrop\"\n @click=\"isFileSheetOpen = false\"\n >\n <div class=\"review-pane-sheet\" @click.stop>\n <div class=\"review-pane-sheet-handle\" aria-hidden=\"true\"></div>\n <div class=\"review-pane-sheet-header\">\n <p class=\"review-pane-sheet-title\">Changed files</p>\n <p class=\"review-pane-sheet-count\">{{ snapshot.files.length }}</p>\n </div>\n <div class=\"review-pane-sheet-list\">\n <template v-for=\"node in visibleFileTreeNodes\" :key=\"`sheet:${node.treeKey}`\">\n <button\n v-if=\"node.kind === 'folder'\"\n type=\"button\"\n class=\"review-pane-tree-folder review-pane-tree-folder-sheet\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-expanded=\"isFolderExpanded(node.id)\"\n @click=\"toggleFolder(node.id)\"\n >\n <span class=\"review-pane-tree-caret\" :data-expanded=\"isFolderExpanded(node.id)\"></span>\n <span class=\"review-pane-tree-folder-name\">{{ node.name }}</span>\n <span class=\"review-pane-tree-folder-count\">{{ node.fileCount }}</span>\n </button>\n\n <button\n v-else\n type=\"button\"\n class=\"review-pane-file review-pane-tree-file\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-active=\"selectedFile?.id === node.file.id\"\n :title=\"node.file.path\"\n @click=\"selectFile(node.file.id)\"\n >\n <span class=\"review-pane-file-meta-row\">\n <span class=\"review-pane-file-main\">\n <span class=\"review-pane-file-op\" :data-operation=\"node.file.operation\">{{ formatOperation(node.file.operation) }}</span>\n <span class=\"review-pane-file-path\">\n {{ node.name }}\n <template v-if=\"node.file.previousPath\"> ← {{ fileBaseName(node.file.previousPath) }}</template>\n </span>\n </span>\n <span class=\"review-pane-file-delta\">\n <span class=\"review-pane-delta-add\">+{{ node.file.addedLineCount }}</span>\n <span class=\"review-pane-delta-separator\">/</span>\n <span class=\"review-pane-delta-remove\">-{{ node.file.removedLineCount }}</span>\n </span>\n </span>\n </button>\n </template>\n </div>\n </div>\n </div>\n </Transition>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport {\n applyReviewAction,\n getReviewSnapshot,\n getThreadReviewResult,\n initializeReviewGit,\n startThreadReview,\n subscribeCodexNotifications,\n type RpcNotification,\n} from '../../api/codexGateway'\nimport { useMobile } from '../../composables/useMobile'\nimport type {\n UiReviewAction,\n UiReviewFinding,\n UiReviewResult,\n UiReviewScope,\n UiReviewSnapshot,\n UiReviewTab,\n UiReviewWorkspaceView,\n UiReviewFile,\n UiReviewHunk,\n} from '../../types/codex'\nimport IconTablerX from '../icons/IconTablerX.vue'\n\nconst props = defineProps<{\n threadId: string\n cwd: string\n isThreadInProgress: boolean\n}>()\n\ndefineEmits<{\n close: []\n}>()\n\nconst { isMobile } = useMobile()\n\nconst activeTab = ref<UiReviewTab>('changes')\nconst activeScope = ref<UiReviewScope>('workspace')\nconst workspaceView = ref<UiReviewWorkspaceView>('unstaged')\nconst snapshot = ref<UiReviewSnapshot | null>(null)\nconst selectedBaseBranch = ref('')\nconst isSyncingBaseBranch = ref(false)\nconst selectedFileId = ref('')\nconst selectedHunkId = ref('')\nconst isFileSheetOpen = ref(false)\nconst isLoadingSnapshot = ref(false)\nconst isApplyingAction = ref(false)\nconst isRunningReview = ref(false)\nconst isInitializingGit = ref(false)\nconst snapshotError = ref('')\nconst reviewError = ref('')\nconst reviewStatusLabel = ref('')\nconst reviewResultsByKey = ref<Record<string, UiReviewResult | null>>({})\nconst pendingReviewKey = ref('')\nconst hunkRefs = new Map<string, HTMLElement>()\nlet stopNotifications: (() => void) | null = null\nlet stopResizeTracking: (() => void) | null = null\n\nconst reviewTabs = [\n { value: 'changes' as const, label: 'Changes' },\n { value: 'findings' as const, label: 'Findings' },\n]\n\ntype ReviewTreeFolderNode = {\n kind: 'folder'\n treeKey: string\n id: string\n name: string\n depth: number\n fileCount: number\n}\n\ntype ReviewTreeFileNode = {\n kind: 'file'\n treeKey: string\n id: string\n name: string\n depth: number\n file: UiReviewFile\n}\n\ntype ReviewTreeNode = ReviewTreeFolderNode | ReviewTreeFileNode\n\ntype MutableReviewTreeFile = {\n file: UiReviewFile\n name: string\n depth: number\n}\n\ntype MutableReviewTreeFolder = {\n id: string\n name: string\n depth: number\n folders: Map<string, MutableReviewTreeFolder>\n files: MutableReviewTreeFile[]\n}\n\nconst reviewKey = computed(() => `${activeScope.value}:${workspaceView.value}`)\nconst currentReviewResult = computed(() => reviewResultsByKey.value[reviewKey.value] ?? null)\nconst selectedFile = computed(() => snapshot.value?.files.find((file) => file.id === selectedFileId.value) ?? snapshot.value?.files[0] ?? null)\nconst folderExpansionState = ref<Record<string, boolean>>({})\n\nconst headerTitle = computed(() => {\n if (!snapshot.value?.isGitRepo) return 'Repository review'\n if (activeScope.value === 'workspace') {\n return workspaceView.value === 'staged' ? 'Staged changes' : 'Workspace changes'\n }\n return snapshot.value?.baseBranch ? `Against ${snapshot.value.baseBranch}` : 'Base branch'\n})\n\nconst canRunReview = computed(() => (\n props.threadId.trim().length > 0\n && props.cwd.trim().length > 0\n && snapshot.value?.isGitRepo === true\n && !props.isThreadInProgress\n && !(activeScope.value === 'baseBranch' && !snapshot.value?.baseBranch)\n))\n\nconst showBulkActions = computed(() => (\n activeScope.value === 'workspace'\n && snapshot.value?.isGitRepo === true\n && snapshot.value.files.length > 0\n))\n\nconst showRowActions = computed(() => showBulkActions.value && !isApplyingAction.value)\n\nconst bulkActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage all' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage all' },\n { value: 'revert' as UiReviewAction, label: 'Revert all' },\n ]\n})\n\nconst fileActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage file' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage file' },\n { value: 'revert' as UiReviewAction, label: 'Revert file' },\n ]\n})\n\nconst hunkActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage hunk' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage hunk' },\n { value: 'revert' as UiReviewAction, label: 'Revert hunk' },\n ]\n})\n\nconst reviewBannerText = computed(() => (\n reviewError.value\n || snapshotError.value\n || reviewStatusLabel.value\n))\nconst reviewBannerIsError = computed(() => Boolean(reviewError.value || snapshotError.value))\nconst REVIEW_FILE_LIST_WIDTH_KEY = 'codex-web-local.review-pane-file-list-width.v1'\nconst MIN_FILE_LIST_WIDTH = 220\nconst MAX_FILE_LIST_WIDTH = 420\nconst DEFAULT_FILE_LIST_WIDTH = 288\nconst fileListWidth = ref(loadFileListWidth())\n\nconst reviewMainStyle = computed<Record<string, string>>(() => {\n const style: Record<string, string> = {}\n if (!isMobile.value) {\n style['--review-file-list-width'] = `${fileListWidth.value}px`\n }\n return style\n})\n\nconst fileTreeData = computed(() => buildVisibleFileTree(snapshot.value?.files ?? [], folderExpansionState.value))\nconst visibleFileTreeNodes = computed(() => fileTreeData.value.nodes)\nconst fileTreeFolderIdsByFileId = computed(() => fileTreeData.value.folderIdsByFileId)\n\nfunction clampFileListWidth(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_FILE_LIST_WIDTH\n return Math.min(MAX_FILE_LIST_WIDTH, Math.max(MIN_FILE_LIST_WIDTH, Math.round(value)))\n}\n\nfunction loadFileListWidth(): number {\n if (typeof window === 'undefined') return DEFAULT_FILE_LIST_WIDTH\n const raw = window.localStorage.getItem(REVIEW_FILE_LIST_WIDTH_KEY)\n const parsed = raw ? Number(raw) : Number.NaN\n return clampFileListWidth(parsed)\n}\n\nfunction persistFileListWidth(value: number): void {\n if (typeof window === 'undefined') return\n window.localStorage.setItem(REVIEW_FILE_LIST_WIDTH_KEY, String(clampFileListWidth(value)))\n}\n\nfunction onResizerPointerDown(event: PointerEvent): void {\n if (isMobile.value) return\n event.preventDefault()\n stopResizeTracking?.()\n const startX = event.clientX\n const startWidth = fileListWidth.value\n\n const handleMove = (moveEvent: PointerEvent) => {\n fileListWidth.value = clampFileListWidth(startWidth + (moveEvent.clientX - startX))\n }\n\n const cleanup = () => {\n window.removeEventListener('pointermove', handleMove)\n window.removeEventListener('pointerup', handleUp)\n stopResizeTracking = null\n }\n\n const handleUp = () => {\n cleanup()\n persistFileListWidth(fileListWidth.value)\n }\n\n window.addEventListener('pointermove', handleMove)\n window.addEventListener('pointerup', handleUp)\n stopResizeTracking = cleanup\n}\n\nfunction lineMarker(kind: string): string {\n if (kind === 'add') return '+'\n if (kind === 'remove') return '-'\n if (kind === 'hunk') return '@@'\n return ' '\n}\n\nfunction fileBaseName(path: string): string {\n const segments = path.split('/').filter(Boolean)\n return segments[segments.length - 1] ?? path\n}\n\nfunction sortTreeEntries(left: string, right: string): number {\n return left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' })\n}\n\nfunction buildVisibleFileTree(\n files: UiReviewFile[],\n expansionState: Record<string, boolean>,\n): {\n nodes: ReviewTreeNode[]\n folderIdsByFileId: Record<string, string[]>\n} {\n const root: MutableReviewTreeFolder = {\n id: '',\n name: '',\n depth: -1,\n folders: new Map(),\n files: [],\n }\n const folderIdsByFileId: Record<string, string[]> = {}\n\n for (const file of files) {\n const segments = file.path.split('/').filter(Boolean)\n const fileName = segments.pop() ?? file.path\n let currentFolder = root\n let folderPath = ''\n const parentFolderIds: string[] = []\n\n for (const [index, segment] of segments.entries()) {\n folderPath = folderPath ? `${folderPath}/${segment}` : segment\n let nextFolder = currentFolder.folders.get(segment)\n if (!nextFolder) {\n nextFolder = {\n id: folderPath,\n name: segment,\n depth: index,\n folders: new Map(),\n files: [],\n }\n currentFolder.folders.set(segment, nextFolder)\n }\n currentFolder = nextFolder\n parentFolderIds.push(nextFolder.id)\n }\n\n currentFolder.files.push({\n file,\n name: fileName,\n depth: segments.length,\n })\n folderIdsByFileId[file.id] = parentFolderIds\n }\n\n const nodes: ReviewTreeNode[] = []\n const countFiles = (folder: MutableReviewTreeFolder): number => (\n folder.files.length + Array.from(folder.folders.values()).reduce((sum, child) => sum + countFiles(child), 0)\n )\n\n const visitFolder = (folder: MutableReviewTreeFolder) => {\n const childFolders = Array.from(folder.folders.values()).sort((left, right) => sortTreeEntries(left.name, right.name))\n const childFiles = [...folder.files].sort((left, right) => sortTreeEntries(left.name, right.name))\n\n for (const childFolder of childFolders) {\n nodes.push({\n kind: 'folder',\n treeKey: `folder:${childFolder.id}`,\n id: childFolder.id,\n name: childFolder.name,\n depth: childFolder.depth,\n fileCount: countFiles(childFolder),\n })\n if (expansionState[childFolder.id] !== false) {\n visitFolder(childFolder)\n }\n }\n\n for (const childFile of childFiles) {\n nodes.push({\n kind: 'file',\n treeKey: `file:${childFile.file.id}`,\n id: childFile.file.id,\n name: childFile.name,\n depth: childFile.depth,\n file: childFile.file,\n })\n }\n }\n\n visitFolder(root)\n return { nodes, folderIdsByFileId }\n}\n\nfunction isFolderExpanded(folderId: string): boolean {\n return folderExpansionState.value[folderId] !== false\n}\n\nfunction toggleFolder(folderId: string): void {\n folderExpansionState.value = {\n ...folderExpansionState.value,\n [folderId]: !isFolderExpanded(folderId),\n }\n}\n\nfunction expandFileAncestors(fileId: string): void {\n const folderIds = fileTreeFolderIdsByFileId.value[fileId] ?? []\n if (folderIds.length === 0) return\n const nextState = { ...folderExpansionState.value }\n let changed = false\n for (const folderId of folderIds) {\n if (nextState[folderId] === false) {\n nextState[folderId] = true\n changed = true\n }\n }\n if (changed) {\n folderExpansionState.value = nextState\n }\n}\n\nfunction treeIndentStyle(depth: number): Record<string, string> {\n const base = isMobile.value ? 8 : 10\n const step = isMobile.value ? 12 : 14\n return {\n paddingLeft: `${base + (depth * step)}px`,\n }\n}\n\nfunction formatOperation(operation: string): string {\n if (operation === 'add') return 'Added'\n if (operation === 'delete') return 'Deleted'\n if (operation === 'rename') return 'Renamed'\n return 'Modified'\n}\n\nfunction bindHunkRef(hunkId: string, element: unknown): void {\n if (!(element instanceof HTMLElement)) {\n hunkRefs.delete(hunkId)\n return\n }\n hunkRefs.set(hunkId, element)\n}\n\nfunction extractNotificationThreadId(notification: RpcNotification): string {\n const params = notification.params !== null && typeof notification.params === 'object' && !Array.isArray(notification.params)\n ? notification.params as Record<string, unknown>\n : null\n return typeof params?.threadId === 'string' ? params.threadId : ''\n}\n\nasync function loadSnapshot(): Promise<void> {\n if (!props.cwd.trim()) return\n isLoadingSnapshot.value = true\n snapshotError.value = ''\n try {\n const desiredBaseBranch = activeScope.value === 'baseBranch' ? selectedBaseBranch.value.trim() : ''\n const nextSnapshot = await getReviewSnapshot(\n props.cwd,\n activeScope.value,\n workspaceView.value,\n desiredBaseBranch || null,\n )\n if (nextSnapshot.baseBranchOptions.length > 0) {\n const normalizedBaseBranch = nextSnapshot.baseBranch ?? nextSnapshot.baseBranchOptions[0] ?? ''\n if (selectedBaseBranch.value !== normalizedBaseBranch) {\n isSyncingBaseBranch.value = true\n selectedBaseBranch.value = normalizedBaseBranch\n }\n } else {\n if (selectedBaseBranch.value !== '') {\n isSyncingBaseBranch.value = true\n selectedBaseBranch.value = ''\n }\n }\n snapshot.value = nextSnapshot\n const hasSelectedFile = nextSnapshot.files.some((file) => file.id === selectedFileId.value)\n if (!hasSelectedFile) {\n selectedFileId.value = nextSnapshot.files[0]?.id ?? ''\n selectedHunkId.value = nextSnapshot.files[0]?.hunks[0]?.id ?? ''\n }\n } catch (error) {\n snapshotError.value = error instanceof Error ? error.message : 'Failed to load review snapshot'\n } finally {\n isLoadingSnapshot.value = false\n }\n}\n\nasync function loadLatestReviewResult(): Promise<void> {\n if (!props.threadId.trim()) return\n try {\n const reviewState = await getThreadReviewResult(props.threadId)\n if (reviewState.result) {\n reviewResultsByKey.value = {\n ...reviewResultsByKey.value,\n [reviewKey.value]: reviewState.result,\n }\n }\n } catch {\n // Keep the pane usable even if thread history refresh fails.\n }\n}\n\nasync function reloadAll(): Promise<void> {\n await Promise.all([\n loadSnapshot(),\n loadLatestReviewResult(),\n ])\n}\n\nfunction selectFile(fileId: string): void {\n expandFileAncestors(fileId)\n selectedFileId.value = fileId\n const file = snapshot.value?.files.find((entry) => entry.id === fileId) ?? null\n selectedHunkId.value = file?.hunks[0]?.id ?? ''\n if (isMobile.value) {\n isFileSheetOpen.value = false\n }\n}\n\nasync function applyAction(action: UiReviewAction, level: 'all' | 'file' | 'hunk', patch = ''): Promise<void> {\n if (!snapshot.value) return\n isApplyingAction.value = true\n reviewError.value = ''\n try {\n const nextSnapshot = await applyReviewAction({\n cwd: props.cwd,\n scope: activeScope.value,\n workspaceView: workspaceView.value,\n action,\n level,\n patch,\n })\n snapshot.value = nextSnapshot\n const hasSelectedFile = nextSnapshot.files.some((file) => file.id === selectedFileId.value)\n if (!hasSelectedFile) {\n selectedFileId.value = nextSnapshot.files[0]?.id ?? ''\n selectedHunkId.value = nextSnapshot.files[0]?.hunks[0]?.id ?? ''\n }\n } catch (error) {\n reviewError.value = error instanceof Error ? error.message : 'Failed to apply review action'\n } finally {\n isApplyingAction.value = false\n }\n}\n\nasync function applyBulkAction(action: UiReviewAction): Promise<void> {\n await applyAction(action, 'all')\n}\n\nasync function applyFileAction(action: UiReviewAction, file: UiReviewFile): Promise<void> {\n await applyAction(action, 'file', file.diff)\n}\n\nasync function applyHunkAction(action: UiReviewAction, hunk: UiReviewHunk): Promise<void> {\n selectedHunkId.value = hunk.id\n await applyAction(action, 'hunk', hunk.patch)\n}\n\nasync function initializeGit(): Promise<void> {\n if (!props.cwd.trim()) return\n isInitializingGit.value = true\n reviewError.value = ''\n try {\n await initializeReviewGit(props.cwd)\n await loadSnapshot()\n } catch (error) {\n reviewError.value = error instanceof Error ? error.message : 'Failed to initialize Git'\n } finally {\n isInitializingGit.value = false\n }\n}\n\nasync function runReview(): Promise<void> {\n if (!canRunReview.value || isRunningReview.value) return\n reviewError.value = ''\n reviewStatusLabel.value = activeScope.value === 'workspace'\n ? 'Reviewing current changes'\n : `Reviewing against ${snapshot.value?.baseBranch ?? 'base branch'}`\n isRunningReview.value = true\n pendingReviewKey.value = reviewKey.value\n\n try {\n await startThreadReview(\n props.threadId,\n activeScope.value,\n workspaceView.value,\n selectedBaseBranch.value || (snapshot.value?.baseBranch ?? null),\n )\n } catch (error) {\n isRunningReview.value = false\n reviewStatusLabel.value = ''\n reviewError.value = error instanceof Error ? error.message : 'Failed to start review'\n }\n}\n\nfunction formatFindingLocation(finding: UiReviewFinding): string {\n if (!finding.absolutePath) return ''\n const lineSuffix = finding.startLine ? `:${finding.startLine}${finding.endLine && finding.endLine !== finding.startLine ? `-${finding.endLine}` : ''}` : ''\n return `${finding.absolutePath}${lineSuffix}`\n}\n\nfunction findMatchingHunk(file: UiReviewFile, finding: UiReviewFinding): UiReviewHunk | null {\n if (!finding.startLine) return file.hunks[0] ?? null\n for (const hunk of file.hunks) {\n if (hunk.newStart !== null) {\n const newEnd = hunk.newStart + Math.max(hunk.newLineCount, 1) - 1\n if (finding.startLine >= hunk.newStart && finding.startLine <= newEnd) {\n return hunk\n }\n }\n if (hunk.oldStart !== null) {\n const oldEnd = hunk.oldStart + Math.max(hunk.oldLineCount, 1) - 1\n if (finding.startLine >= hunk.oldStart && finding.startLine <= oldEnd) {\n return hunk\n }\n }\n }\n return file.hunks[0] ?? null\n}\n\nasync function scrollToHunk(hunkId: string): Promise<void> {\n await nextTick()\n const element = hunkRefs.get(hunkId)\n element?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n}\n\nasync function openFinding(finding: UiReviewFinding): Promise<void> {\n activeTab.value = 'changes'\n const file = snapshot.value?.files.find((entry) => (\n entry.absolutePath === finding.absolutePath\n || entry.previousAbsolutePath === finding.absolutePath\n )) ?? null\n if (!file) return\n\n expandFileAncestors(file.id)\n selectedFileId.value = file.id\n const matchedHunk = findMatchingHunk(file, finding)\n selectedHunkId.value = matchedHunk?.id ?? ''\n if (matchedHunk?.id) {\n await scrollToHunk(matchedHunk.id)\n }\n}\n\nfunction handleNotification(notification: RpcNotification): void {\n if (extractNotificationThreadId(notification) !== props.threadId) return\n const params = notification.params !== null && typeof notification.params === 'object' && !Array.isArray(notification.params)\n ? notification.params as Record<string, unknown>\n : null\n const item = params?.item !== null && typeof params?.item === 'object' && !Array.isArray(params.item)\n ? params.item as Record<string, unknown>\n : null\n const itemType = typeof item?.type === 'string' ? item.type : ''\n\n if (notification.method === 'item/started' && itemType === 'enteredReviewMode') {\n isRunningReview.value = true\n reviewStatusLabel.value = typeof item?.review === 'string' ? item.review : 'Review in progress'\n return\n }\n\n if (notification.method === 'item/completed' && itemType === 'exitedReviewMode') {\n const targetKey = pendingReviewKey.value || reviewKey.value\n isRunningReview.value = false\n reviewStatusLabel.value = ''\n void getThreadReviewResult(props.threadId)\n .then((reviewState) => {\n if (!reviewState.result) return\n reviewResultsByKey.value = {\n ...reviewResultsByKey.value,\n [targetKey]: reviewState.result,\n }\n activeTab.value = 'findings'\n })\n .catch((error) => {\n reviewError.value = error instanceof Error ? error.message : 'Failed to load review result'\n })\n .finally(() => {\n pendingReviewKey.value = ''\n })\n }\n}\n\nwatch(\n () => [props.threadId, props.cwd] as const,\n () => {\n selectedFileId.value = ''\n selectedHunkId.value = ''\n reviewResultsByKey.value = {}\n pendingReviewKey.value = ''\n reviewError.value = ''\n reviewStatusLabel.value = ''\n void reloadAll()\n },\n { immediate: true },\n)\n\nwatch(\n () => [activeScope.value, workspaceView.value] as const,\n () => {\n selectedFileId.value = ''\n selectedHunkId.value = ''\n reviewError.value = ''\n snapshotError.value = ''\n void loadSnapshot()\n },\n)\n\nwatch(selectedBaseBranch, (branch, previous) => {\n if (isSyncingBaseBranch.value) {\n isSyncingBaseBranch.value = false\n return\n }\n if (activeScope.value !== 'baseBranch') return\n if (!branch || branch === previous) return\n void loadSnapshot()\n})\n\nwatch(selectedFile, (file) => {\n if (!file) return\n expandFileAncestors(file.id)\n if (!file.hunks.some((hunk) => hunk.id === selectedHunkId.value)) {\n selectedHunkId.value = file.hunks[0]?.id ?? ''\n }\n})\n\nwatch(selectedHunkId, (hunkId) => {\n if (!hunkId) return\n void scrollToHunk(hunkId)\n})\n\nonMounted(() => {\n stopNotifications = subscribeCodexNotifications(handleNotification)\n})\n\nonBeforeUnmount(() => {\n if (stopNotifications) {\n stopNotifications()\n stopNotifications = null\n }\n stopResizeTracking?.()\n})\n</script>\n\n<style scoped>\n@reference \"tailwindcss\";\n\n.review-pane {\n @apply flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-2xl border border-zinc-200 bg-white;\n}\n\n.review-pane.is-mobile {\n @apply fixed inset-0 z-40 rounded-none border-0;\n}\n\n.review-pane-header {\n @apply flex items-start justify-between gap-3 border-b border-zinc-200 px-3 py-2.5;\n}\n\n.review-pane-heading {\n @apply min-w-0;\n}\n\n.review-pane-eyebrow {\n @apply m-0 text-[11px] uppercase tracking-[0.12em] text-zinc-400;\n}\n\n.review-pane-title {\n @apply m-0 truncate text-sm font-medium text-zinc-900;\n}\n\n.review-pane-header-actions {\n @apply flex items-center gap-2;\n}\n\n.review-pane-close,\n.review-pane-mobile-files-button,\n.review-pane-refresh,\n.review-pane-run,\n.review-pane-bulk-button,\n.review-pane-row-button,\n.review-pane-primary-cta {\n @apply rounded-full border border-zinc-200 bg-white px-2.5 py-1.25 text-[11px] text-zinc-700 transition hover:bg-zinc-50 disabled:cursor-default disabled:opacity-50;\n}\n\n.review-pane-close {\n @apply flex h-7.5 w-7.5 items-center justify-center rounded-full p-0;\n}\n\n.review-pane-toolbar {\n @apply flex flex-col gap-2 border-b border-zinc-100 px-3 py-2.5;\n}\n\n.review-pane-toolbar-tabs {\n @apply min-w-0;\n}\n\n.review-pane-toolbar-controls {\n @apply flex flex-wrap items-center gap-2;\n}\n\n.review-pane-control-cluster {\n @apply flex min-w-0 items-center gap-1.5;\n}\n\n.review-pane-control-label {\n @apply shrink-0 text-[10px] font-medium uppercase tracking-[0.08em] text-zinc-400;\n}\n\n.review-pane-branch-select-wrap {\n @apply inline-flex min-w-[9rem] items-center rounded-full border border-zinc-200 bg-white px-2.5 py-1 shadow-sm;\n}\n\n.review-pane-branch-select {\n @apply w-full appearance-none bg-transparent text-[11px] font-medium text-zinc-700 outline-none;\n}\n\n.review-pane-segmented {\n @apply inline-flex min-w-0 items-center gap-1 rounded-full bg-zinc-100 p-1;\n}\n\n.review-pane-segmented-primary {\n @apply flex-1 bg-zinc-100/80;\n}\n\n.review-pane-segmented-button {\n @apply relative min-w-0 rounded-full border border-transparent px-2.5 py-1.25 text-[11px] font-medium text-zinc-500 transition-colors;\n}\n\n.review-pane-segmented-button::before {\n content: '';\n @apply mr-1.5 inline-block h-1.5 w-1.5 rounded-full bg-zinc-300 align-middle transition-colors;\n}\n\n.review-pane-segmented-button[data-active='true'] {\n @apply border-sky-200 bg-sky-600 text-white shadow-sm;\n}\n\n.review-pane-segmented-button[data-active='true']::before {\n @apply bg-white;\n}\n\n.review-pane-segmented-button:disabled {\n @apply opacity-45;\n}\n\n.review-pane-toolbar-actions {\n @apply flex shrink-0 items-center gap-1.5;\n}\n\n.review-pane-run {\n @apply border-emerald-600 bg-emerald-600 text-white hover:bg-emerald-700;\n}\n\n.review-pane-refresh {\n @apply border-amber-300 bg-amber-50 text-amber-900 hover:bg-amber-100;\n}\n\n.review-pane-banner {\n @apply mx-3 mt-2.5 rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-800;\n}\n\n.review-pane-banner.is-error {\n @apply border-rose-200 bg-rose-50 text-rose-700;\n}\n\n.review-pane-meta {\n @apply flex flex-wrap items-center gap-1.5 px-3 pt-2.5 text-[11px] text-zinc-500;\n}\n\n.review-pane-meta span {\n @apply rounded-full bg-zinc-100 px-2 py-1;\n}\n\n.review-pane-summary-pill.review-pane-summary-pill-add {\n @apply bg-emerald-100 text-emerald-700;\n}\n\n.review-pane-summary-pill.review-pane-summary-pill-remove {\n @apply bg-rose-100 text-rose-700;\n}\n\n.review-pane-content,\n.review-pane-findings {\n @apply min-h-0 flex-1 overflow-hidden;\n}\n\n.review-pane-bulk-actions {\n @apply flex flex-nowrap gap-1.5 overflow-x-auto border-b border-zinc-100 px-3 py-2.5;\n}\n\n.review-pane-main {\n @apply grid h-full min-h-0 grid-cols-[var(--review-file-list-width,18rem)_0.5rem_minmax(0,1fr)];\n}\n\n.review-pane-file-list {\n @apply hidden min-w-0 overflow-y-auto border-r border-zinc-100 bg-zinc-50/60 p-2 md:flex md:flex-col md:gap-1.5;\n}\n\n.review-pane-tree-folder {\n @apply flex w-full items-center gap-1 rounded-lg border border-transparent px-2 py-1.5 text-left text-[12px] font-medium text-zinc-600 transition hover:bg-white hover:text-zinc-900;\n}\n\n.review-pane-tree-folder[data-expanded='false'] {\n @apply text-zinc-500;\n}\n\n.review-pane-tree-folder-sheet {\n @apply rounded-md bg-zinc-50/80;\n}\n\n.review-pane-tree-caret {\n @apply relative h-3.5 w-3.5 shrink-0;\n}\n\n.review-pane-tree-caret::before {\n content: '';\n @apply absolute left-1 top-1 h-0 w-0 border-y-[4px] border-l-[5px] border-y-transparent border-l-current transition-transform;\n}\n\n.review-pane-tree-caret[data-expanded='true']::before {\n transform: rotate(90deg);\n transform-origin: 2px 4px;\n}\n\n.review-pane-tree-folder-name {\n @apply min-w-0 flex-1 truncate;\n}\n\n.review-pane-tree-folder-count {\n @apply shrink-0 rounded-full bg-zinc-200 px-1.5 py-0.5 text-[10px] font-medium text-zinc-500;\n}\n\n.review-pane-resizer {\n @apply relative hidden cursor-col-resize bg-zinc-100 md:block;\n}\n\n.review-pane-resizer::before {\n content: '';\n @apply absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-zinc-300 transition-colors;\n}\n\n.review-pane-resizer:hover::before {\n @apply bg-sky-500;\n}\n\n.review-pane-file,\n.review-pane-finding {\n @apply flex w-full flex-col gap-0.75 rounded-xl border border-transparent px-2.5 py-2 text-left transition hover:border-zinc-200 hover:bg-white;\n}\n\n.review-pane-tree-file {\n @apply rounded-lg px-2 py-1.75;\n}\n\n.review-pane-file-meta-row {\n @apply flex items-start justify-between gap-2;\n}\n\n.review-pane-file-main {\n @apply flex min-w-0 items-center gap-1.5;\n}\n\n.review-pane-file[data-active='true'] {\n @apply border-zinc-300 bg-white shadow-sm;\n}\n\n.review-pane-file-op {\n @apply inline-flex w-fit rounded-full px-2 py-0.5 text-[10px] font-medium uppercase tracking-[0.08em];\n}\n\n.review-pane-file-op[data-operation='add'] {\n @apply bg-emerald-100 text-emerald-800;\n}\n\n.review-pane-file-op[data-operation='delete'] {\n @apply bg-rose-100 text-rose-700;\n}\n\n.review-pane-file-op[data-operation='rename'] {\n @apply bg-sky-100 text-sky-700;\n}\n\n.review-pane-file-op[data-operation='update'] {\n @apply bg-amber-100 text-amber-800;\n}\n\n.review-pane-file-path {\n @apply min-w-0 break-all text-sm text-zinc-800;\n}\n\n.review-pane-file-delta {\n @apply inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px];\n}\n\n.review-pane-delta-add {\n @apply text-emerald-600;\n}\n\n.review-pane-delta-remove {\n @apply text-rose-600;\n}\n\n.review-pane-delta-separator {\n @apply text-zinc-400;\n}\n\n.review-pane-diff {\n @apply min-h-0 overflow-y-auto px-3 py-3;\n}\n\n.review-pane-file-header,\n.review-pane-hunk {\n @apply rounded-2xl border border-zinc-200 bg-white;\n}\n\n.review-pane-file-header {\n @apply mb-3 flex flex-wrap items-start justify-between gap-2 px-3 py-2.5;\n}\n\n.review-pane-file-title {\n @apply m-0 break-all text-sm font-medium text-zinc-900;\n}\n\n.review-pane-file-subtitle,\n.review-pane-hunk-meta,\n.review-pane-finding-location {\n @apply m-0 text-[11px] text-zinc-500;\n}\n\n.review-pane-row-actions {\n @apply flex flex-wrap gap-1.5;\n}\n\n.review-pane-hunks {\n @apply flex flex-col gap-2.5;\n}\n\n.review-pane-hunk {\n @apply overflow-hidden;\n}\n\n.review-pane-hunk[data-active='true'] {\n @apply border-zinc-400 shadow-[0_0_0_1px_rgba(24,24,27,0.08)];\n}\n\n.review-pane-hunk-header {\n @apply flex flex-wrap items-start justify-between gap-2 border-b border-zinc-100 bg-zinc-50/70 px-3 py-2.5;\n}\n\n.review-pane-hunk-title {\n @apply m-0 font-mono text-xs text-zinc-800;\n}\n\n.review-pane-lines {\n @apply overflow-x-auto bg-zinc-950 px-0 py-0 font-mono text-xs text-zinc-100;\n}\n\n.review-pane-line {\n @apply grid min-w-max grid-cols-[3.5rem_3.5rem_1.5rem_minmax(0,1fr)] gap-0;\n}\n\n.review-pane-line-number {\n @apply px-2.5 py-1 text-right text-zinc-500;\n}\n\n.review-pane-line-marker {\n @apply px-2 py-1 text-center text-zinc-500;\n}\n\n.review-pane-line-code {\n @apply block px-2.5 py-1 whitespace-pre-wrap break-all;\n}\n\n.review-pane-line[data-kind='add'] {\n @apply bg-emerald-950/60 text-emerald-100;\n}\n\n.review-pane-line[data-kind='remove'] {\n @apply bg-rose-950/60 text-rose-100;\n}\n\n.review-pane-line[data-kind='add'] .review-pane-line-marker,\n.review-pane-line[data-kind='add'] .review-pane-line-code {\n @apply text-emerald-300;\n}\n\n.review-pane-line[data-kind='remove'] .review-pane-line-marker,\n.review-pane-line[data-kind='remove'] .review-pane-line-code {\n @apply text-rose-300;\n}\n\n.review-pane-line[data-kind='hunk'] {\n @apply bg-sky-950/70 text-sky-200;\n}\n\n.review-pane-line[data-kind='meta'] {\n @apply bg-zinc-900 text-zinc-400;\n}\n\n.review-pane-raw-diff {\n @apply overflow-x-auto rounded-2xl border border-zinc-200 bg-zinc-950 p-3 text-xs text-zinc-100;\n}\n\n.review-pane-raw-diff pre,\n.review-pane-summary-text {\n @apply m-0 whitespace-pre-wrap break-all font-mono;\n}\n\n.review-pane-summary-card {\n @apply mx-3 mt-3 rounded-2xl border border-zinc-200 bg-zinc-50 px-3 py-2.5;\n}\n\n.review-pane-summary-title {\n @apply m-0 mb-2 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-findings-list {\n @apply flex h-full flex-col gap-2.5 overflow-y-auto px-3 py-3;\n}\n\n.review-pane-finding {\n @apply border-zinc-200 bg-white hover:border-zinc-300;\n}\n\n.review-pane-finding-title {\n @apply text-sm font-medium text-zinc-900;\n}\n\n.review-pane-finding-body {\n @apply text-sm text-zinc-600 whitespace-pre-wrap;\n}\n\n.review-pane-empty {\n @apply flex h-full min-h-0 flex-col items-center justify-center px-6 text-center;\n}\n\n.review-pane-empty-title {\n @apply m-0 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-empty-text {\n @apply mt-2 max-w-sm text-sm text-zinc-500;\n}\n\n.review-pane-primary-cta {\n @apply mt-4 border-emerald-600 bg-emerald-600 text-white hover:bg-emerald-700;\n}\n\n.review-pane-sheet-backdrop {\n @apply fixed inset-0 z-50 bg-black/30;\n}\n\n.review-pane-sheet {\n @apply absolute inset-x-0 bottom-0 rounded-t-3xl bg-white px-4 pb-6 pt-3 shadow-2xl;\n}\n\n.review-pane-sheet-handle {\n @apply mx-auto mb-3 h-1.5 w-12 rounded-full bg-zinc-300;\n}\n\n.review-pane-sheet-header {\n @apply mb-3 flex items-center justify-between;\n}\n\n.review-pane-sheet-title {\n @apply m-0 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-sheet-count {\n @apply m-0 rounded-full bg-zinc-100 px-2 py-1 text-[11px] text-zinc-500;\n}\n\n.review-pane-sheet-list {\n @apply flex max-h-[60vh] flex-col gap-2 overflow-y-auto pb-3;\n}\n\n.review-pane-sheet-enter-active,\n.review-pane-sheet-leave-active {\n transition: opacity 160ms ease;\n}\n\n.review-pane-sheet-enter-active .review-pane-sheet,\n.review-pane-sheet-leave-active .review-pane-sheet {\n transition: transform 200ms ease;\n}\n\n.review-pane-sheet-enter-from,\n.review-pane-sheet-leave-to {\n opacity: 0;\n}\n\n.review-pane-sheet-enter-from .review-pane-sheet,\n.review-pane-sheet-leave-to .review-pane-sheet {\n transform: translateY(16px);\n}\n\n@media (max-width: 767px) {\n .review-pane-header {\n @apply px-3 py-2;\n }\n\n .review-pane-eyebrow {\n @apply text-[10px];\n }\n\n .review-pane-title {\n @apply text-xs leading-5;\n }\n\n .review-pane-header-actions {\n @apply gap-1.5;\n }\n\n .review-pane-close,\n .review-pane-mobile-files-button,\n .review-pane-refresh,\n .review-pane-run {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-close {\n @apply h-7 w-7;\n }\n\n .review-pane-toolbar {\n @apply gap-1.5 px-3 py-2;\n }\n\n .review-pane-toolbar-controls {\n @apply grid grid-cols-1 gap-1.5;\n }\n\n .review-pane-control-cluster {\n @apply gap-1;\n }\n\n .review-pane-control-label {\n @apply text-[9px];\n }\n\n .review-pane-branch-select-wrap {\n @apply min-w-0 flex-1 px-2 py-0.75;\n }\n\n .review-pane-branch-select {\n @apply text-[12px];\n }\n\n .review-pane-segmented {\n @apply w-full justify-between gap-1 p-0.75;\n }\n\n .review-pane-segmented-button {\n @apply flex-1 px-2 py-1 text-[12px];\n }\n\n .review-pane-toolbar-actions {\n @apply w-auto gap-1;\n }\n\n .review-pane-refresh,\n .review-pane-run {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-banner {\n @apply mx-3 mt-2 px-2.5 py-1.5 text-xs;\n }\n\n .review-pane-meta {\n @apply gap-1 px-3 pt-2;\n }\n\n .review-pane-meta span {\n @apply px-1.75 py-0.75 text-[11px];\n }\n\n .review-pane-bulk-actions {\n @apply gap-1 px-3 py-2;\n }\n\n .review-pane-bulk-button {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-main {\n @apply block;\n }\n\n .review-pane-resizer {\n @apply hidden;\n }\n\n .review-pane-diff {\n @apply px-2 py-2.5;\n }\n\n .review-pane-file-header,\n .review-pane-hunk-header {\n @apply px-2.5 py-2;\n }\n\n .review-pane-sheet {\n @apply px-3 pb-4 pt-2.5;\n }\n\n .review-pane-sheet-handle {\n @apply mb-2 h-1.25 w-11;\n }\n\n .review-pane-sheet-header {\n @apply mb-2;\n }\n\n .review-pane-sheet-title {\n @apply text-xs;\n }\n\n .review-pane-sheet-count {\n @apply px-1.5 py-0.75 text-[10px];\n }\n\n .review-pane-sheet-list {\n @apply gap-1.5 pb-2;\n }\n\n .review-pane-sheet-list .review-pane-tree-folder {\n @apply gap-1 rounded-md px-2 py-1 text-[12px];\n }\n\n .review-pane-sheet-list .review-pane-tree-folder-count {\n @apply px-1.25 py-0.25 text-[9px];\n }\n\n .review-pane-sheet-list .review-pane-file {\n @apply gap-0.5 rounded-lg px-2 py-1.5;\n }\n\n .review-pane-sheet-list .review-pane-file-meta-row {\n @apply gap-1.5;\n }\n\n .review-pane-sheet-list .review-pane-file-op {\n @apply px-1.5 py-0.25 text-[9px];\n }\n\n .review-pane-sheet-list .review-pane-file-main {\n @apply gap-1;\n }\n\n .review-pane-sheet-list .review-pane-file-path {\n @apply text-[13px] leading-5;\n }\n\n .review-pane-sheet-list .review-pane-file-delta {\n @apply text-[11px];\n }\n}\n\n@media (min-width: 768px) {\n .review-pane-toolbar {\n @apply flex-row items-center gap-2.5;\n }\n\n .review-pane-toolbar-tabs {\n @apply flex-1;\n }\n\n .review-pane-toolbar-controls {\n @apply min-w-0 flex-nowrap;\n }\n\n .review-pane-control-cluster {\n @apply shrink-0;\n }\n\n .review-pane-toolbar-actions {\n @apply ml-auto;\n }\n}\n</style>\n"],"names":["REVIEW_FILE_LIST_WIDTH_KEY","MIN_FILE_LIST_WIDTH","MAX_FILE_LIST_WIDTH","DEFAULT_FILE_LIST_WIDTH","props","__props","isMobile","useMobile","activeTab","ref","activeScope","workspaceView","snapshot","selectedBaseBranch","isSyncingBaseBranch","selectedFileId","selectedHunkId","isFileSheetOpen","isLoadingSnapshot","isApplyingAction","isRunningReview","isInitializingGit","snapshotError","reviewError","reviewStatusLabel","reviewResultsByKey","pendingReviewKey","hunkRefs","stopNotifications","stopResizeTracking","reviewTabs","reviewKey","computed","currentReviewResult","selectedFile","_a","file","_b","folderExpansionState","headerTitle","canRunReview","showBulkActions","showRowActions","bulkActions","fileActions","hunkActions","reviewBannerText","reviewBannerIsError","fileListWidth","loadFileListWidth","reviewMainStyle","style","fileTreeData","buildVisibleFileTree","visibleFileTreeNodes","fileTreeFolderIdsByFileId","clampFileListWidth","value","raw","parsed","persistFileListWidth","onResizerPointerDown","event","startX","startWidth","handleMove","moveEvent","cleanup","handleUp","lineMarker","kind","fileBaseName","path","segments","sortTreeEntries","left","right","files","expansionState","root","folderIdsByFileId","fileName","currentFolder","folderPath","parentFolderIds","index","segment","nextFolder","nodes","countFiles","folder","sum","child","visitFolder","childFolders","childFiles","childFolder","childFile","isFolderExpanded","folderId","toggleFolder","expandFileAncestors","fileId","folderIds","nextState","changed","treeIndentStyle","depth","base","step","formatOperation","operation","bindHunkRef","hunkId","element","extractNotificationThreadId","notification","params","loadSnapshot","desiredBaseBranch","nextSnapshot","getReviewSnapshot","normalizedBaseBranch","_c","error","loadLatestReviewResult","reviewState","getThreadReviewResult","reloadAll","selectFile","entry","applyAction","action","level","patch","applyReviewAction","applyBulkAction","applyFileAction","applyHunkAction","hunk","initializeGit","initializeReviewGit","runReview","startThreadReview","formatFindingLocation","finding","lineSuffix","findMatchingHunk","newEnd","oldEnd","scrollToHunk","nextTick","openFinding","matchedHunk","handleNotification","item","itemType","targetKey","watch","branch","previous","onMounted","subscribeCodexNotifications","onBeforeUnmount","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_hoisted_2","_cache","_hoisted_3","_toDisplayString","_hoisted_4","$emit","_createVNode","IconTablerX","_hoisted_5","_hoisted_6","_hoisted_7","_Fragment","_renderList","tab","$event","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_openBlock","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_38","node","_normalizeStyle","_hoisted_41","_hoisted_42","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_createTextVNode","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","line","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_36","_hoisted_37","_hoisted_31","_hoisted_32","_hoisted_30","_hoisted_72","_d","_hoisted_73","_hoisted_74","_e","_hoisted_75","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_f","_Transition","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_87","_hoisted_88","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96"],"mappings":"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"}
1
+ {"version":3,"file":"ReviewPane-Blnhnm6J.js","sources":["../../src/components/content/ReviewPane.vue"],"sourcesContent":["<template>\n <section class=\"review-pane\" :class=\"{ 'is-mobile': isMobile }\" @click.stop>\n <header class=\"review-pane-header\">\n <div class=\"review-pane-heading\">\n <p class=\"review-pane-eyebrow\">Review</p>\n <p class=\"review-pane-title\">{{ headerTitle }}</p>\n </div>\n <div class=\"review-pane-header-actions\">\n <button\n v-if=\"isMobile && activeTab === 'changes' && snapshot?.files.length\"\n type=\"button\"\n class=\"review-pane-mobile-files-button\"\n @click=\"isFileSheetOpen = true\"\n >\n Files\n </button>\n <button type=\"button\" class=\"review-pane-close\" aria-label=\"Close review pane\" @click=\"$emit('close')\">\n <IconTablerX class=\"icon-svg\" />\n </button>\n </div>\n </header>\n\n <div class=\"review-pane-toolbar\">\n <div class=\"review-pane-toolbar-tabs\">\n <div class=\"review-pane-segmented review-pane-segmented-primary\">\n <button\n v-for=\"tab in reviewTabs\"\n :key=\"tab.value\"\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-tab\"\n :data-active=\"activeTab === tab.value\"\n @click=\"activeTab = tab.value\"\n >\n {{ tab.label }}\n </button>\n </div>\n </div>\n\n <div class=\"review-pane-toolbar-controls\">\n <div class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Compare</span>\n <div class=\"review-pane-segmented\">\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-scope\"\n :data-active=\"activeScope === 'workspace'\"\n @click=\"activeScope = 'workspace'\"\n >\n Workspace\n </button>\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-scope\"\n :data-active=\"activeScope === 'baseBranch'\"\n :disabled=\"!snapshot?.baseBranch\"\n @click=\"activeScope = 'baseBranch'\"\n >\n Base branch\n </button>\n </div>\n </div>\n\n <div v-if=\"activeScope === 'baseBranch' && snapshot?.baseBranchOptions.length\" class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Branch</span>\n <label class=\"review-pane-branch-select-wrap\">\n <select\n v-model=\"selectedBaseBranch\"\n class=\"review-pane-branch-select\"\n >\n <option\n v-for=\"branch in snapshot.baseBranchOptions\"\n :key=\"branch\"\n :value=\"branch\"\n >\n {{ branch }}\n </option>\n </select>\n </label>\n </div>\n\n <div v-if=\"activeScope === 'workspace'\" class=\"review-pane-control-cluster\">\n <span class=\"review-pane-control-label\">Changes</span>\n <div class=\"review-pane-segmented\">\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-view\"\n :data-active=\"workspaceView === 'unstaged'\"\n @click=\"workspaceView = 'unstaged'\"\n >\n Unstaged\n </button>\n <button\n type=\"button\"\n class=\"review-pane-segmented-button review-pane-view\"\n :data-active=\"workspaceView === 'staged'\"\n @click=\"workspaceView = 'staged'\"\n >\n Staged\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"review-pane-toolbar-actions\">\n <button\n type=\"button\"\n class=\"review-pane-run\"\n :disabled=\"!canRunReview || isRunningReview\"\n @click=\"runReview\"\n >\n {{ isRunningReview ? 'Reviewing…' : 'Run review' }}\n </button>\n <button type=\"button\" class=\"review-pane-refresh\" :disabled=\"isLoadingSnapshot\" @click=\"reloadAll\">\n Refresh\n </button>\n </div>\n </div>\n\n <div v-if=\"reviewBannerText\" class=\"review-pane-banner\" :class=\"{ 'is-error': reviewBannerIsError }\">\n {{ reviewBannerText }}\n </div>\n\n <div v-if=\"snapshot\" class=\"review-pane-meta\">\n <span>{{ snapshot.summary.fileCount }} files</span>\n <span class=\"review-pane-summary-pill review-pane-summary-pill-add\">+{{ snapshot.summary.addedLineCount }}</span>\n <span class=\"review-pane-summary-pill review-pane-summary-pill-remove\">-{{ snapshot.summary.removedLineCount }}</span>\n <span v-if=\"snapshot.headBranch\">{{ snapshot.headBranch }}</span>\n <span v-if=\"activeScope === 'baseBranch' && snapshot.baseBranch\">vs {{ snapshot.baseBranch }}</span>\n </div>\n\n <div v-if=\"activeTab === 'changes'\" class=\"review-pane-content\">\n <template v-if=\"!snapshot\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">Loading review state</p>\n </div>\n </template>\n\n <template v-else-if=\"!snapshot.isGitRepo\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">This folder is not a Git repository</p>\n <p class=\"review-pane-empty-text\">Initialize Git to review local changes and run Codex review.</p>\n <button type=\"button\" class=\"review-pane-primary-cta\" :disabled=\"isInitializingGit\" @click=\"initializeGit\">\n {{ isInitializingGit ? 'Initializing…' : 'Initialize Git' }}\n </button>\n </div>\n </template>\n\n <template v-else-if=\"activeScope === 'baseBranch' && !snapshot.baseBranch\">\n <div class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">Base branch unavailable</p>\n <p class=\"review-pane-empty-text\">Could not resolve `origin/HEAD`, `main`, or `master` for this repository.</p>\n </div>\n </template>\n\n <template v-else>\n <div v-if=\"showBulkActions\" class=\"review-pane-bulk-actions\">\n <button\n v-for=\"action in bulkActions\"\n :key=\"action.value\"\n type=\"button\"\n class=\"review-pane-bulk-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyBulkAction(action.value)\"\n >\n {{ action.label }}\n </button>\n </div>\n\n <div v-if=\"!snapshot.files.length\" class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">No changes in this scope</p>\n <p class=\"review-pane-empty-text\">\n {{ activeScope === 'workspace' ? 'Your current workspace is clean.' : 'No merge diff found against the base branch.' }}\n </p>\n </div>\n\n <div v-else class=\"review-pane-main\" :style=\"reviewMainStyle\">\n <aside v-if=\"!isMobile\" class=\"review-pane-file-list\">\n <template v-for=\"node in visibleFileTreeNodes\" :key=\"node.treeKey\">\n <button\n v-if=\"node.kind === 'folder'\"\n type=\"button\"\n class=\"review-pane-tree-folder\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-expanded=\"isFolderExpanded(node.id)\"\n @click=\"toggleFolder(node.id)\"\n >\n <span class=\"review-pane-tree-caret\" :data-expanded=\"isFolderExpanded(node.id)\"></span>\n <span class=\"review-pane-tree-folder-name\">{{ node.name }}</span>\n <span class=\"review-pane-tree-folder-count\">{{ node.fileCount }}</span>\n </button>\n\n <button\n v-else\n type=\"button\"\n class=\"review-pane-file review-pane-tree-file\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-active=\"selectedFile?.id === node.file.id\"\n :title=\"node.file.path\"\n @click=\"selectFile(node.file.id)\"\n >\n <span class=\"review-pane-file-meta-row\">\n <span class=\"review-pane-file-main\">\n <span class=\"review-pane-file-op\" :data-operation=\"node.file.operation\">{{ formatOperation(node.file.operation) }}</span>\n <span class=\"review-pane-file-path\">\n {{ node.name }}\n <template v-if=\"node.file.previousPath\"> ← {{ fileBaseName(node.file.previousPath) }}</template>\n </span>\n </span>\n <span class=\"review-pane-file-delta\">\n <span class=\"review-pane-delta-add\">+{{ node.file.addedLineCount }}</span>\n <span class=\"review-pane-delta-separator\">/</span>\n <span class=\"review-pane-delta-remove\">-{{ node.file.removedLineCount }}</span>\n </span>\n </span>\n </button>\n </template>\n </aside>\n\n <div\n v-if=\"!isMobile\"\n class=\"review-pane-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize file list\"\n @pointerdown=\"onResizerPointerDown\"\n ></div>\n\n <section class=\"review-pane-diff\">\n <template v-if=\"selectedFile\">\n <div class=\"review-pane-file-header\">\n <div class=\"review-pane-file-header-main\">\n <p class=\"review-pane-file-title\">\n {{ selectedFile.path }}\n <template v-if=\"selectedFile.previousPath\"> ← {{ selectedFile.previousPath }}</template>\n </p>\n <p class=\"review-pane-file-subtitle\">\n {{ formatOperation(selectedFile.operation) }} · +{{ selectedFile.addedLineCount }} / -{{ selectedFile.removedLineCount }}\n </p>\n </div>\n <div v-if=\"showRowActions\" class=\"review-pane-row-actions\">\n <button\n v-for=\"action in fileActions\"\n :key=\"`${selectedFile.id}:${action.value}`\"\n type=\"button\"\n class=\"review-pane-row-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyFileAction(action.value, selectedFile)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <div v-if=\"selectedFile.hunks.length === 0\" class=\"review-pane-raw-diff\">\n <pre>{{ selectedFile.diff || 'No unified diff available.' }}</pre>\n </div>\n\n <div v-else class=\"review-pane-hunks\">\n <article\n v-for=\"hunk in selectedFile.hunks\"\n :key=\"hunk.id\"\n :ref=\"(element) => bindHunkRef(hunk.id, element)\"\n class=\"review-pane-hunk\"\n :data-active=\"selectedHunkId === hunk.id\"\n @click=\"selectedHunkId = hunk.id\"\n >\n <div class=\"review-pane-hunk-header\">\n <div>\n <p class=\"review-pane-hunk-title\">{{ hunk.header }}</p>\n <p class=\"review-pane-hunk-meta\">+{{ hunk.addedLineCount }} / -{{ hunk.removedLineCount }}</p>\n </div>\n <div v-if=\"showRowActions\" class=\"review-pane-row-actions\">\n <button\n v-for=\"action in hunkActions\"\n :key=\"`${hunk.id}:${action.value}`\"\n type=\"button\"\n class=\"review-pane-row-button\"\n :disabled=\"isApplyingAction\"\n @click=\"applyHunkAction(action.value, hunk)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n\n <div class=\"review-pane-lines\">\n <div\n v-for=\"line in hunk.lines\"\n :key=\"line.key\"\n class=\"review-pane-line\"\n :data-kind=\"line.kind\"\n >\n <span class=\"review-pane-line-number\">{{ line.oldLine ?? '' }}</span>\n <span class=\"review-pane-line-number\">{{ line.newLine ?? '' }}</span>\n <span class=\"review-pane-line-marker\">{{ lineMarker(line.kind) }}</span>\n <code class=\"review-pane-line-code\">{{ line.text || ' ' }}</code>\n </div>\n </div>\n </article>\n </div>\n </template>\n </section>\n </div>\n </template>\n </div>\n\n <div v-else class=\"review-pane-findings\">\n <div v-if=\"currentReviewResult?.summary\" class=\"review-pane-summary-card\">\n <p class=\"review-pane-summary-title\">Summary</p>\n <pre class=\"review-pane-summary-text\">{{ currentReviewResult.summary }}</pre>\n </div>\n\n <div v-if=\"currentReviewResult?.findings.length\" class=\"review-pane-findings-list\">\n <button\n v-for=\"finding in currentReviewResult.findings\"\n :key=\"finding.id\"\n type=\"button\"\n class=\"review-pane-finding\"\n @click=\"openFinding(finding)\"\n >\n <span class=\"review-pane-finding-title\">{{ finding.title }}</span>\n <span v-if=\"finding.absolutePath\" class=\"review-pane-finding-location\">\n {{ formatFindingLocation(finding) }}\n </span>\n <span v-if=\"finding.body\" class=\"review-pane-finding-body\">{{ finding.body }}</span>\n </button>\n </div>\n\n <div v-else class=\"review-pane-empty\">\n <p class=\"review-pane-empty-title\">No structured findings yet</p>\n <p class=\"review-pane-empty-text\">\n {{ currentReviewResult?.summary ? 'The latest review only returned summary text.' : 'Run review to populate this pane.' }}\n </p>\n </div>\n </div>\n\n <Transition name=\"review-pane-sheet\">\n <div\n v-if=\"isMobile && isFileSheetOpen && snapshot?.files.length\"\n class=\"review-pane-sheet-backdrop\"\n @click=\"isFileSheetOpen = false\"\n >\n <div class=\"review-pane-sheet\" @click.stop>\n <div class=\"review-pane-sheet-handle\" aria-hidden=\"true\"></div>\n <div class=\"review-pane-sheet-header\">\n <p class=\"review-pane-sheet-title\">Changed files</p>\n <p class=\"review-pane-sheet-count\">{{ snapshot.files.length }}</p>\n </div>\n <div class=\"review-pane-sheet-list\">\n <template v-for=\"node in visibleFileTreeNodes\" :key=\"`sheet:${node.treeKey}`\">\n <button\n v-if=\"node.kind === 'folder'\"\n type=\"button\"\n class=\"review-pane-tree-folder review-pane-tree-folder-sheet\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-expanded=\"isFolderExpanded(node.id)\"\n @click=\"toggleFolder(node.id)\"\n >\n <span class=\"review-pane-tree-caret\" :data-expanded=\"isFolderExpanded(node.id)\"></span>\n <span class=\"review-pane-tree-folder-name\">{{ node.name }}</span>\n <span class=\"review-pane-tree-folder-count\">{{ node.fileCount }}</span>\n </button>\n\n <button\n v-else\n type=\"button\"\n class=\"review-pane-file review-pane-tree-file\"\n :style=\"treeIndentStyle(node.depth)\"\n :data-active=\"selectedFile?.id === node.file.id\"\n :title=\"node.file.path\"\n @click=\"selectFile(node.file.id)\"\n >\n <span class=\"review-pane-file-meta-row\">\n <span class=\"review-pane-file-main\">\n <span class=\"review-pane-file-op\" :data-operation=\"node.file.operation\">{{ formatOperation(node.file.operation) }}</span>\n <span class=\"review-pane-file-path\">\n {{ node.name }}\n <template v-if=\"node.file.previousPath\"> ← {{ fileBaseName(node.file.previousPath) }}</template>\n </span>\n </span>\n <span class=\"review-pane-file-delta\">\n <span class=\"review-pane-delta-add\">+{{ node.file.addedLineCount }}</span>\n <span class=\"review-pane-delta-separator\">/</span>\n <span class=\"review-pane-delta-remove\">-{{ node.file.removedLineCount }}</span>\n </span>\n </span>\n </button>\n </template>\n </div>\n </div>\n </div>\n </Transition>\n </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport {\n applyReviewAction,\n getReviewSnapshot,\n getThreadReviewResult,\n initializeReviewGit,\n startThreadReview,\n subscribeCodexNotifications,\n type RpcNotification,\n} from '../../api/codexGateway'\nimport { useMobile } from '../../composables/useMobile'\nimport type {\n UiReviewAction,\n UiReviewFinding,\n UiReviewResult,\n UiReviewScope,\n UiReviewSnapshot,\n UiReviewTab,\n UiReviewWorkspaceView,\n UiReviewFile,\n UiReviewHunk,\n} from '../../types/codex'\nimport IconTablerX from '../icons/IconTablerX.vue'\n\nconst props = defineProps<{\n threadId: string\n cwd: string\n isThreadInProgress: boolean\n}>()\n\ndefineEmits<{\n close: []\n}>()\n\nconst { isMobile } = useMobile()\n\nconst activeTab = ref<UiReviewTab>('changes')\nconst activeScope = ref<UiReviewScope>('workspace')\nconst workspaceView = ref<UiReviewWorkspaceView>('unstaged')\nconst snapshot = ref<UiReviewSnapshot | null>(null)\nconst selectedBaseBranch = ref('')\nconst isSyncingBaseBranch = ref(false)\nconst selectedFileId = ref('')\nconst selectedHunkId = ref('')\nconst isFileSheetOpen = ref(false)\nconst isLoadingSnapshot = ref(false)\nconst isApplyingAction = ref(false)\nconst isRunningReview = ref(false)\nconst isInitializingGit = ref(false)\nconst snapshotError = ref('')\nconst reviewError = ref('')\nconst reviewStatusLabel = ref('')\nconst reviewResultsByKey = ref<Record<string, UiReviewResult | null>>({})\nconst pendingReviewKey = ref('')\nconst hunkRefs = new Map<string, HTMLElement>()\nlet stopNotifications: (() => void) | null = null\nlet stopResizeTracking: (() => void) | null = null\n\nconst reviewTabs = [\n { value: 'changes' as const, label: 'Changes' },\n { value: 'findings' as const, label: 'Findings' },\n]\n\ntype ReviewTreeFolderNode = {\n kind: 'folder'\n treeKey: string\n id: string\n name: string\n depth: number\n fileCount: number\n}\n\ntype ReviewTreeFileNode = {\n kind: 'file'\n treeKey: string\n id: string\n name: string\n depth: number\n file: UiReviewFile\n}\n\ntype ReviewTreeNode = ReviewTreeFolderNode | ReviewTreeFileNode\n\ntype MutableReviewTreeFile = {\n file: UiReviewFile\n name: string\n depth: number\n}\n\ntype MutableReviewTreeFolder = {\n id: string\n name: string\n depth: number\n folders: Map<string, MutableReviewTreeFolder>\n files: MutableReviewTreeFile[]\n}\n\nconst reviewKey = computed(() => `${activeScope.value}:${workspaceView.value}`)\nconst currentReviewResult = computed(() => reviewResultsByKey.value[reviewKey.value] ?? null)\nconst selectedFile = computed(() => snapshot.value?.files.find((file) => file.id === selectedFileId.value) ?? snapshot.value?.files[0] ?? null)\nconst folderExpansionState = ref<Record<string, boolean>>({})\n\nconst headerTitle = computed(() => {\n if (!snapshot.value?.isGitRepo) return 'Repository review'\n if (activeScope.value === 'workspace') {\n return workspaceView.value === 'staged' ? 'Staged changes' : 'Workspace changes'\n }\n return snapshot.value?.baseBranch ? `Against ${snapshot.value.baseBranch}` : 'Base branch'\n})\n\nconst canRunReview = computed(() => (\n props.threadId.trim().length > 0\n && props.cwd.trim().length > 0\n && snapshot.value?.isGitRepo === true\n && !props.isThreadInProgress\n && !(activeScope.value === 'baseBranch' && !snapshot.value?.baseBranch)\n))\n\nconst showBulkActions = computed(() => (\n activeScope.value === 'workspace'\n && snapshot.value?.isGitRepo === true\n && snapshot.value.files.length > 0\n))\n\nconst showRowActions = computed(() => showBulkActions.value && !isApplyingAction.value)\n\nconst bulkActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage all' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage all' },\n { value: 'revert' as UiReviewAction, label: 'Revert all' },\n ]\n})\n\nconst fileActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage file' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage file' },\n { value: 'revert' as UiReviewAction, label: 'Revert file' },\n ]\n})\n\nconst hunkActions = computed(() => {\n if (workspaceView.value === 'staged') {\n return [{ value: 'unstage' as UiReviewAction, label: 'Unstage hunk' }]\n }\n return [\n { value: 'stage' as UiReviewAction, label: 'Stage hunk' },\n { value: 'revert' as UiReviewAction, label: 'Revert hunk' },\n ]\n})\n\nconst reviewBannerText = computed(() => (\n reviewError.value\n || snapshotError.value\n || reviewStatusLabel.value\n))\nconst reviewBannerIsError = computed(() => Boolean(reviewError.value || snapshotError.value))\nconst REVIEW_FILE_LIST_WIDTH_KEY = 'codex-web-local.review-pane-file-list-width.v1'\nconst MIN_FILE_LIST_WIDTH = 220\nconst MAX_FILE_LIST_WIDTH = 420\nconst DEFAULT_FILE_LIST_WIDTH = 288\nconst fileListWidth = ref(loadFileListWidth())\n\nconst reviewMainStyle = computed<Record<string, string>>(() => {\n const style: Record<string, string> = {}\n if (!isMobile.value) {\n style['--review-file-list-width'] = `${fileListWidth.value}px`\n }\n return style\n})\n\nconst fileTreeData = computed(() => buildVisibleFileTree(snapshot.value?.files ?? [], folderExpansionState.value))\nconst visibleFileTreeNodes = computed(() => fileTreeData.value.nodes)\nconst fileTreeFolderIdsByFileId = computed(() => fileTreeData.value.folderIdsByFileId)\n\nfunction clampFileListWidth(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_FILE_LIST_WIDTH\n return Math.min(MAX_FILE_LIST_WIDTH, Math.max(MIN_FILE_LIST_WIDTH, Math.round(value)))\n}\n\nfunction loadFileListWidth(): number {\n if (typeof window === 'undefined') return DEFAULT_FILE_LIST_WIDTH\n const raw = window.localStorage.getItem(REVIEW_FILE_LIST_WIDTH_KEY)\n const parsed = raw ? Number(raw) : Number.NaN\n return clampFileListWidth(parsed)\n}\n\nfunction persistFileListWidth(value: number): void {\n if (typeof window === 'undefined') return\n window.localStorage.setItem(REVIEW_FILE_LIST_WIDTH_KEY, String(clampFileListWidth(value)))\n}\n\nfunction onResizerPointerDown(event: PointerEvent): void {\n if (isMobile.value) return\n event.preventDefault()\n stopResizeTracking?.()\n const startX = event.clientX\n const startWidth = fileListWidth.value\n\n const handleMove = (moveEvent: PointerEvent) => {\n fileListWidth.value = clampFileListWidth(startWidth + (moveEvent.clientX - startX))\n }\n\n const cleanup = () => {\n window.removeEventListener('pointermove', handleMove)\n window.removeEventListener('pointerup', handleUp)\n stopResizeTracking = null\n }\n\n const handleUp = () => {\n cleanup()\n persistFileListWidth(fileListWidth.value)\n }\n\n window.addEventListener('pointermove', handleMove)\n window.addEventListener('pointerup', handleUp)\n stopResizeTracking = cleanup\n}\n\nfunction lineMarker(kind: string): string {\n if (kind === 'add') return '+'\n if (kind === 'remove') return '-'\n if (kind === 'hunk') return '@@'\n return ' '\n}\n\nfunction fileBaseName(path: string): string {\n const segments = path.split('/').filter(Boolean)\n return segments[segments.length - 1] ?? path\n}\n\nfunction sortTreeEntries(left: string, right: string): number {\n return left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' })\n}\n\nfunction buildVisibleFileTree(\n files: UiReviewFile[],\n expansionState: Record<string, boolean>,\n): {\n nodes: ReviewTreeNode[]\n folderIdsByFileId: Record<string, string[]>\n} {\n const root: MutableReviewTreeFolder = {\n id: '',\n name: '',\n depth: -1,\n folders: new Map(),\n files: [],\n }\n const folderIdsByFileId: Record<string, string[]> = {}\n\n for (const file of files) {\n const segments = file.path.split('/').filter(Boolean)\n const fileName = segments.pop() ?? file.path\n let currentFolder = root\n let folderPath = ''\n const parentFolderIds: string[] = []\n\n for (const [index, segment] of segments.entries()) {\n folderPath = folderPath ? `${folderPath}/${segment}` : segment\n let nextFolder = currentFolder.folders.get(segment)\n if (!nextFolder) {\n nextFolder = {\n id: folderPath,\n name: segment,\n depth: index,\n folders: new Map(),\n files: [],\n }\n currentFolder.folders.set(segment, nextFolder)\n }\n currentFolder = nextFolder\n parentFolderIds.push(nextFolder.id)\n }\n\n currentFolder.files.push({\n file,\n name: fileName,\n depth: segments.length,\n })\n folderIdsByFileId[file.id] = parentFolderIds\n }\n\n const nodes: ReviewTreeNode[] = []\n const countFiles = (folder: MutableReviewTreeFolder): number => (\n folder.files.length + Array.from(folder.folders.values()).reduce((sum, child) => sum + countFiles(child), 0)\n )\n\n const visitFolder = (folder: MutableReviewTreeFolder) => {\n const childFolders = Array.from(folder.folders.values()).sort((left, right) => sortTreeEntries(left.name, right.name))\n const childFiles = [...folder.files].sort((left, right) => sortTreeEntries(left.name, right.name))\n\n for (const childFolder of childFolders) {\n nodes.push({\n kind: 'folder',\n treeKey: `folder:${childFolder.id}`,\n id: childFolder.id,\n name: childFolder.name,\n depth: childFolder.depth,\n fileCount: countFiles(childFolder),\n })\n if (expansionState[childFolder.id] !== false) {\n visitFolder(childFolder)\n }\n }\n\n for (const childFile of childFiles) {\n nodes.push({\n kind: 'file',\n treeKey: `file:${childFile.file.id}`,\n id: childFile.file.id,\n name: childFile.name,\n depth: childFile.depth,\n file: childFile.file,\n })\n }\n }\n\n visitFolder(root)\n return { nodes, folderIdsByFileId }\n}\n\nfunction isFolderExpanded(folderId: string): boolean {\n return folderExpansionState.value[folderId] !== false\n}\n\nfunction toggleFolder(folderId: string): void {\n folderExpansionState.value = {\n ...folderExpansionState.value,\n [folderId]: !isFolderExpanded(folderId),\n }\n}\n\nfunction expandFileAncestors(fileId: string): void {\n const folderIds = fileTreeFolderIdsByFileId.value[fileId] ?? []\n if (folderIds.length === 0) return\n const nextState = { ...folderExpansionState.value }\n let changed = false\n for (const folderId of folderIds) {\n if (nextState[folderId] === false) {\n nextState[folderId] = true\n changed = true\n }\n }\n if (changed) {\n folderExpansionState.value = nextState\n }\n}\n\nfunction treeIndentStyle(depth: number): Record<string, string> {\n const base = isMobile.value ? 8 : 10\n const step = isMobile.value ? 12 : 14\n return {\n paddingLeft: `${base + (depth * step)}px`,\n }\n}\n\nfunction formatOperation(operation: string): string {\n if (operation === 'add') return 'Added'\n if (operation === 'delete') return 'Deleted'\n if (operation === 'rename') return 'Renamed'\n return 'Modified'\n}\n\nfunction bindHunkRef(hunkId: string, element: unknown): void {\n if (!(element instanceof HTMLElement)) {\n hunkRefs.delete(hunkId)\n return\n }\n hunkRefs.set(hunkId, element)\n}\n\nfunction extractNotificationThreadId(notification: RpcNotification): string {\n const params = notification.params !== null && typeof notification.params === 'object' && !Array.isArray(notification.params)\n ? notification.params as Record<string, unknown>\n : null\n return typeof params?.threadId === 'string' ? params.threadId : ''\n}\n\nasync function loadSnapshot(): Promise<void> {\n if (!props.cwd.trim()) return\n isLoadingSnapshot.value = true\n snapshotError.value = ''\n try {\n const desiredBaseBranch = activeScope.value === 'baseBranch' ? selectedBaseBranch.value.trim() : ''\n const nextSnapshot = await getReviewSnapshot(\n props.cwd,\n activeScope.value,\n workspaceView.value,\n desiredBaseBranch || null,\n )\n if (nextSnapshot.baseBranchOptions.length > 0) {\n const normalizedBaseBranch = nextSnapshot.baseBranch ?? nextSnapshot.baseBranchOptions[0] ?? ''\n if (selectedBaseBranch.value !== normalizedBaseBranch) {\n isSyncingBaseBranch.value = true\n selectedBaseBranch.value = normalizedBaseBranch\n }\n } else {\n if (selectedBaseBranch.value !== '') {\n isSyncingBaseBranch.value = true\n selectedBaseBranch.value = ''\n }\n }\n snapshot.value = nextSnapshot\n const hasSelectedFile = nextSnapshot.files.some((file) => file.id === selectedFileId.value)\n if (!hasSelectedFile) {\n selectedFileId.value = nextSnapshot.files[0]?.id ?? ''\n selectedHunkId.value = nextSnapshot.files[0]?.hunks[0]?.id ?? ''\n }\n } catch (error) {\n snapshotError.value = error instanceof Error ? error.message : 'Failed to load review snapshot'\n } finally {\n isLoadingSnapshot.value = false\n }\n}\n\nasync function loadLatestReviewResult(): Promise<void> {\n if (!props.threadId.trim()) return\n try {\n const reviewState = await getThreadReviewResult(props.threadId)\n if (reviewState.result) {\n reviewResultsByKey.value = {\n ...reviewResultsByKey.value,\n [reviewKey.value]: reviewState.result,\n }\n }\n } catch {\n // Keep the pane usable even if thread history refresh fails.\n }\n}\n\nasync function reloadAll(): Promise<void> {\n await Promise.all([\n loadSnapshot(),\n loadLatestReviewResult(),\n ])\n}\n\nfunction selectFile(fileId: string): void {\n expandFileAncestors(fileId)\n selectedFileId.value = fileId\n const file = snapshot.value?.files.find((entry) => entry.id === fileId) ?? null\n selectedHunkId.value = file?.hunks[0]?.id ?? ''\n if (isMobile.value) {\n isFileSheetOpen.value = false\n }\n}\n\nasync function applyAction(action: UiReviewAction, level: 'all' | 'file' | 'hunk', patch = ''): Promise<void> {\n if (!snapshot.value) return\n isApplyingAction.value = true\n reviewError.value = ''\n try {\n const nextSnapshot = await applyReviewAction({\n cwd: props.cwd,\n scope: activeScope.value,\n workspaceView: workspaceView.value,\n action,\n level,\n patch,\n })\n snapshot.value = nextSnapshot\n const hasSelectedFile = nextSnapshot.files.some((file) => file.id === selectedFileId.value)\n if (!hasSelectedFile) {\n selectedFileId.value = nextSnapshot.files[0]?.id ?? ''\n selectedHunkId.value = nextSnapshot.files[0]?.hunks[0]?.id ?? ''\n }\n } catch (error) {\n reviewError.value = error instanceof Error ? error.message : 'Failed to apply review action'\n } finally {\n isApplyingAction.value = false\n }\n}\n\nasync function applyBulkAction(action: UiReviewAction): Promise<void> {\n await applyAction(action, 'all')\n}\n\nasync function applyFileAction(action: UiReviewAction, file: UiReviewFile): Promise<void> {\n await applyAction(action, 'file', file.diff)\n}\n\nasync function applyHunkAction(action: UiReviewAction, hunk: UiReviewHunk): Promise<void> {\n selectedHunkId.value = hunk.id\n await applyAction(action, 'hunk', hunk.patch)\n}\n\nasync function initializeGit(): Promise<void> {\n if (!props.cwd.trim()) return\n isInitializingGit.value = true\n reviewError.value = ''\n try {\n await initializeReviewGit(props.cwd)\n await loadSnapshot()\n } catch (error) {\n reviewError.value = error instanceof Error ? error.message : 'Failed to initialize Git'\n } finally {\n isInitializingGit.value = false\n }\n}\n\nasync function runReview(): Promise<void> {\n if (!canRunReview.value || isRunningReview.value) return\n reviewError.value = ''\n reviewStatusLabel.value = activeScope.value === 'workspace'\n ? 'Reviewing current changes'\n : `Reviewing against ${snapshot.value?.baseBranch ?? 'base branch'}`\n isRunningReview.value = true\n pendingReviewKey.value = reviewKey.value\n\n try {\n await startThreadReview(\n props.threadId,\n activeScope.value,\n workspaceView.value,\n selectedBaseBranch.value || (snapshot.value?.baseBranch ?? null),\n )\n } catch (error) {\n isRunningReview.value = false\n reviewStatusLabel.value = ''\n reviewError.value = error instanceof Error ? error.message : 'Failed to start review'\n }\n}\n\nfunction formatFindingLocation(finding: UiReviewFinding): string {\n if (!finding.absolutePath) return ''\n const lineSuffix = finding.startLine ? `:${finding.startLine}${finding.endLine && finding.endLine !== finding.startLine ? `-${finding.endLine}` : ''}` : ''\n return `${finding.absolutePath}${lineSuffix}`\n}\n\nfunction findMatchingHunk(file: UiReviewFile, finding: UiReviewFinding): UiReviewHunk | null {\n if (!finding.startLine) return file.hunks[0] ?? null\n for (const hunk of file.hunks) {\n if (hunk.newStart !== null) {\n const newEnd = hunk.newStart + Math.max(hunk.newLineCount, 1) - 1\n if (finding.startLine >= hunk.newStart && finding.startLine <= newEnd) {\n return hunk\n }\n }\n if (hunk.oldStart !== null) {\n const oldEnd = hunk.oldStart + Math.max(hunk.oldLineCount, 1) - 1\n if (finding.startLine >= hunk.oldStart && finding.startLine <= oldEnd) {\n return hunk\n }\n }\n }\n return file.hunks[0] ?? null\n}\n\nasync function scrollToHunk(hunkId: string): Promise<void> {\n await nextTick()\n const element = hunkRefs.get(hunkId)\n element?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n}\n\nasync function openFinding(finding: UiReviewFinding): Promise<void> {\n activeTab.value = 'changes'\n const file = snapshot.value?.files.find((entry) => (\n entry.absolutePath === finding.absolutePath\n || entry.previousAbsolutePath === finding.absolutePath\n )) ?? null\n if (!file) return\n\n expandFileAncestors(file.id)\n selectedFileId.value = file.id\n const matchedHunk = findMatchingHunk(file, finding)\n selectedHunkId.value = matchedHunk?.id ?? ''\n if (matchedHunk?.id) {\n await scrollToHunk(matchedHunk.id)\n }\n}\n\nfunction handleNotification(notification: RpcNotification): void {\n if (extractNotificationThreadId(notification) !== props.threadId) return\n const params = notification.params !== null && typeof notification.params === 'object' && !Array.isArray(notification.params)\n ? notification.params as Record<string, unknown>\n : null\n const item = params?.item !== null && typeof params?.item === 'object' && !Array.isArray(params.item)\n ? params.item as Record<string, unknown>\n : null\n const itemType = typeof item?.type === 'string' ? item.type : ''\n\n if (notification.method === 'item/started' && itemType === 'enteredReviewMode') {\n isRunningReview.value = true\n reviewStatusLabel.value = typeof item?.review === 'string' ? item.review : 'Review in progress'\n return\n }\n\n if (notification.method === 'item/completed' && itemType === 'exitedReviewMode') {\n const targetKey = pendingReviewKey.value || reviewKey.value\n isRunningReview.value = false\n reviewStatusLabel.value = ''\n void getThreadReviewResult(props.threadId)\n .then((reviewState) => {\n if (!reviewState.result) return\n reviewResultsByKey.value = {\n ...reviewResultsByKey.value,\n [targetKey]: reviewState.result,\n }\n activeTab.value = 'findings'\n })\n .catch((error) => {\n reviewError.value = error instanceof Error ? error.message : 'Failed to load review result'\n })\n .finally(() => {\n pendingReviewKey.value = ''\n })\n }\n}\n\nwatch(\n () => [props.threadId, props.cwd] as const,\n () => {\n selectedFileId.value = ''\n selectedHunkId.value = ''\n reviewResultsByKey.value = {}\n pendingReviewKey.value = ''\n reviewError.value = ''\n reviewStatusLabel.value = ''\n void reloadAll()\n },\n { immediate: true },\n)\n\nwatch(\n () => [activeScope.value, workspaceView.value] as const,\n () => {\n selectedFileId.value = ''\n selectedHunkId.value = ''\n reviewError.value = ''\n snapshotError.value = ''\n void loadSnapshot()\n },\n)\n\nwatch(selectedBaseBranch, (branch, previous) => {\n if (isSyncingBaseBranch.value) {\n isSyncingBaseBranch.value = false\n return\n }\n if (activeScope.value !== 'baseBranch') return\n if (!branch || branch === previous) return\n void loadSnapshot()\n})\n\nwatch(selectedFile, (file) => {\n if (!file) return\n expandFileAncestors(file.id)\n if (!file.hunks.some((hunk) => hunk.id === selectedHunkId.value)) {\n selectedHunkId.value = file.hunks[0]?.id ?? ''\n }\n})\n\nwatch(selectedHunkId, (hunkId) => {\n if (!hunkId) return\n void scrollToHunk(hunkId)\n})\n\nonMounted(() => {\n stopNotifications = subscribeCodexNotifications(handleNotification)\n})\n\nonBeforeUnmount(() => {\n if (stopNotifications) {\n stopNotifications()\n stopNotifications = null\n }\n stopResizeTracking?.()\n})\n</script>\n\n<style scoped>\n@reference \"tailwindcss\";\n\n.review-pane {\n @apply flex h-full min-h-0 min-w-0 flex-col overflow-hidden rounded-2xl border border-zinc-200 bg-white;\n}\n\n.review-pane.is-mobile {\n @apply fixed inset-0 z-40 rounded-none border-0;\n}\n\n.review-pane-header {\n @apply flex items-start justify-between gap-3 border-b border-zinc-200 px-3 py-2.5;\n}\n\n.review-pane-heading {\n @apply min-w-0;\n}\n\n.review-pane-eyebrow {\n @apply m-0 text-[11px] uppercase tracking-[0.12em] text-zinc-400;\n}\n\n.review-pane-title {\n @apply m-0 truncate text-sm font-medium text-zinc-900;\n}\n\n.review-pane-header-actions {\n @apply flex items-center gap-2;\n}\n\n.review-pane-close,\n.review-pane-mobile-files-button,\n.review-pane-refresh,\n.review-pane-run,\n.review-pane-bulk-button,\n.review-pane-row-button,\n.review-pane-primary-cta {\n @apply rounded-full border border-zinc-200 bg-white px-2.5 py-1.25 text-[11px] text-zinc-700 transition hover:bg-zinc-50 disabled:cursor-default disabled:opacity-50;\n}\n\n.review-pane-close {\n @apply flex h-7.5 w-7.5 items-center justify-center rounded-full p-0;\n}\n\n.review-pane-toolbar {\n @apply flex flex-col gap-2 border-b border-zinc-100 px-3 py-2.5;\n}\n\n.review-pane-toolbar-tabs {\n @apply min-w-0;\n}\n\n.review-pane-toolbar-controls {\n @apply flex flex-wrap items-center gap-2;\n}\n\n.review-pane-control-cluster {\n @apply flex min-w-0 items-center gap-1.5;\n}\n\n.review-pane-control-label {\n @apply shrink-0 text-[10px] font-medium uppercase tracking-[0.08em] text-zinc-400;\n}\n\n.review-pane-branch-select-wrap {\n @apply inline-flex min-w-[9rem] items-center rounded-full border border-zinc-200 bg-white px-2.5 py-1 shadow-sm;\n}\n\n.review-pane-branch-select {\n @apply w-full appearance-none bg-transparent text-[11px] font-medium text-zinc-700 outline-none;\n}\n\n.review-pane-segmented {\n @apply inline-flex min-w-0 items-center gap-1 rounded-full bg-zinc-100 p-1;\n}\n\n.review-pane-segmented-primary {\n @apply flex-1 bg-zinc-100/80;\n}\n\n.review-pane-segmented-button {\n @apply relative min-w-0 rounded-full border border-transparent px-2.5 py-1.25 text-[11px] font-medium text-zinc-500 transition-colors;\n}\n\n.review-pane-segmented-button::before {\n content: '';\n @apply mr-1.5 inline-block h-1.5 w-1.5 rounded-full bg-zinc-300 align-middle transition-colors;\n}\n\n.review-pane-segmented-button[data-active='true'] {\n @apply border-sky-200 bg-sky-600 text-white shadow-sm;\n}\n\n.review-pane-segmented-button[data-active='true']::before {\n @apply bg-white;\n}\n\n.review-pane-segmented-button:disabled {\n @apply opacity-45;\n}\n\n.review-pane-toolbar-actions {\n @apply flex shrink-0 items-center gap-1.5;\n}\n\n.review-pane-run {\n @apply border-emerald-600 bg-emerald-600 text-white hover:bg-emerald-700;\n}\n\n.review-pane-refresh {\n @apply border-amber-300 bg-amber-50 text-amber-900 hover:bg-amber-100;\n}\n\n.review-pane-banner {\n @apply mx-3 mt-2.5 rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-800;\n}\n\n.review-pane-banner.is-error {\n @apply border-rose-200 bg-rose-50 text-rose-700;\n}\n\n.review-pane-meta {\n @apply flex flex-wrap items-center gap-1.5 px-3 pt-2.5 text-[11px] text-zinc-500;\n}\n\n.review-pane-meta span {\n @apply rounded-full bg-zinc-100 px-2 py-1;\n}\n\n.review-pane-summary-pill.review-pane-summary-pill-add {\n @apply bg-emerald-100 text-emerald-700;\n}\n\n.review-pane-summary-pill.review-pane-summary-pill-remove {\n @apply bg-rose-100 text-rose-700;\n}\n\n.review-pane-content,\n.review-pane-findings {\n @apply min-h-0 flex-1 overflow-hidden;\n}\n\n.review-pane-bulk-actions {\n @apply flex flex-nowrap gap-1.5 overflow-x-auto border-b border-zinc-100 px-3 py-2.5;\n}\n\n.review-pane-main {\n @apply grid h-full min-h-0 grid-cols-[var(--review-file-list-width,18rem)_0.5rem_minmax(0,1fr)];\n}\n\n.review-pane-file-list {\n @apply hidden min-w-0 overflow-y-auto border-r border-zinc-100 bg-zinc-50/60 p-2 md:flex md:flex-col md:gap-1.5;\n}\n\n.review-pane-tree-folder {\n @apply flex w-full items-center gap-1 rounded-lg border border-transparent px-2 py-1.5 text-left text-[12px] font-medium text-zinc-600 transition hover:bg-white hover:text-zinc-900;\n}\n\n.review-pane-tree-folder[data-expanded='false'] {\n @apply text-zinc-500;\n}\n\n.review-pane-tree-folder-sheet {\n @apply rounded-md bg-zinc-50/80;\n}\n\n.review-pane-tree-caret {\n @apply relative h-3.5 w-3.5 shrink-0;\n}\n\n.review-pane-tree-caret::before {\n content: '';\n @apply absolute left-1 top-1 h-0 w-0 border-y-[4px] border-l-[5px] border-y-transparent border-l-current transition-transform;\n}\n\n.review-pane-tree-caret[data-expanded='true']::before {\n transform: rotate(90deg);\n transform-origin: 2px 4px;\n}\n\n.review-pane-tree-folder-name {\n @apply min-w-0 flex-1 truncate;\n}\n\n.review-pane-tree-folder-count {\n @apply shrink-0 rounded-full bg-zinc-200 px-1.5 py-0.5 text-[10px] font-medium text-zinc-500;\n}\n\n.review-pane-resizer {\n @apply relative hidden cursor-col-resize bg-zinc-100 md:block;\n}\n\n.review-pane-resizer::before {\n content: '';\n @apply absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-zinc-300 transition-colors;\n}\n\n.review-pane-resizer:hover::before {\n @apply bg-sky-500;\n}\n\n.review-pane-file,\n.review-pane-finding {\n @apply flex w-full flex-col gap-0.75 rounded-xl border border-transparent px-2.5 py-2 text-left transition hover:border-zinc-200 hover:bg-white;\n}\n\n.review-pane-tree-file {\n @apply rounded-lg px-2 py-1.75;\n}\n\n.review-pane-file-meta-row {\n @apply flex items-start justify-between gap-2;\n}\n\n.review-pane-file-main {\n @apply flex min-w-0 items-center gap-1.5;\n}\n\n.review-pane-file[data-active='true'] {\n @apply border-zinc-300 bg-white shadow-sm;\n}\n\n.review-pane-file-op {\n @apply inline-flex w-fit rounded-full px-2 py-0.5 text-[10px] font-medium uppercase tracking-[0.08em];\n}\n\n.review-pane-file-op[data-operation='add'] {\n @apply bg-emerald-100 text-emerald-800;\n}\n\n.review-pane-file-op[data-operation='delete'] {\n @apply bg-rose-100 text-rose-700;\n}\n\n.review-pane-file-op[data-operation='rename'] {\n @apply bg-sky-100 text-sky-700;\n}\n\n.review-pane-file-op[data-operation='update'] {\n @apply bg-amber-100 text-amber-800;\n}\n\n.review-pane-file-path {\n @apply min-w-0 break-all text-sm text-zinc-800;\n}\n\n.review-pane-file-delta {\n @apply inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px];\n}\n\n.review-pane-delta-add {\n @apply text-emerald-600;\n}\n\n.review-pane-delta-remove {\n @apply text-rose-600;\n}\n\n.review-pane-delta-separator {\n @apply text-zinc-400;\n}\n\n.review-pane-diff {\n @apply min-h-0 overflow-y-auto px-3 py-3;\n}\n\n.review-pane-file-header,\n.review-pane-hunk {\n @apply rounded-2xl border border-zinc-200 bg-white;\n}\n\n.review-pane-file-header {\n @apply mb-3 flex flex-wrap items-start justify-between gap-2 px-3 py-2.5;\n}\n\n.review-pane-file-title {\n @apply m-0 break-all text-sm font-medium text-zinc-900;\n}\n\n.review-pane-file-subtitle,\n.review-pane-hunk-meta,\n.review-pane-finding-location {\n @apply m-0 text-[11px] text-zinc-500;\n}\n\n.review-pane-row-actions {\n @apply flex flex-wrap gap-1.5;\n}\n\n.review-pane-hunks {\n @apply flex flex-col gap-2.5;\n}\n\n.review-pane-hunk {\n @apply overflow-hidden;\n}\n\n.review-pane-hunk[data-active='true'] {\n @apply border-zinc-400 shadow-[0_0_0_1px_rgba(24,24,27,0.08)];\n}\n\n.review-pane-hunk-header {\n @apply flex flex-wrap items-start justify-between gap-2 border-b border-zinc-100 bg-zinc-50/70 px-3 py-2.5;\n}\n\n.review-pane-hunk-title {\n @apply m-0 font-mono text-xs text-zinc-800;\n}\n\n.review-pane-lines {\n @apply overflow-x-auto bg-zinc-950 px-0 py-0 font-mono text-xs text-zinc-100;\n}\n\n.review-pane-line {\n @apply grid min-w-max grid-cols-[3.5rem_3.5rem_1.5rem_minmax(0,1fr)] gap-0;\n}\n\n.review-pane-line-number {\n @apply px-2.5 py-1 text-right text-zinc-500;\n}\n\n.review-pane-line-marker {\n @apply px-2 py-1 text-center text-zinc-500;\n}\n\n.review-pane-line-code {\n @apply block px-2.5 py-1 whitespace-pre-wrap break-all;\n}\n\n.review-pane-line[data-kind='add'] {\n @apply bg-emerald-950/60 text-emerald-100;\n}\n\n.review-pane-line[data-kind='remove'] {\n @apply bg-rose-950/60 text-rose-100;\n}\n\n.review-pane-line[data-kind='add'] .review-pane-line-marker,\n.review-pane-line[data-kind='add'] .review-pane-line-code {\n @apply text-emerald-300;\n}\n\n.review-pane-line[data-kind='remove'] .review-pane-line-marker,\n.review-pane-line[data-kind='remove'] .review-pane-line-code {\n @apply text-rose-300;\n}\n\n.review-pane-line[data-kind='hunk'] {\n @apply bg-sky-950/70 text-sky-200;\n}\n\n.review-pane-line[data-kind='meta'] {\n @apply bg-zinc-900 text-zinc-400;\n}\n\n.review-pane-raw-diff {\n @apply overflow-x-auto rounded-2xl border border-zinc-200 bg-zinc-950 p-3 text-xs text-zinc-100;\n}\n\n.review-pane-raw-diff pre,\n.review-pane-summary-text {\n @apply m-0 whitespace-pre-wrap break-all font-mono;\n}\n\n.review-pane-summary-card {\n @apply mx-3 mt-3 rounded-2xl border border-zinc-200 bg-zinc-50 px-3 py-2.5;\n}\n\n.review-pane-summary-title {\n @apply m-0 mb-2 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-findings-list {\n @apply flex h-full flex-col gap-2.5 overflow-y-auto px-3 py-3;\n}\n\n.review-pane-finding {\n @apply border-zinc-200 bg-white hover:border-zinc-300;\n}\n\n.review-pane-finding-title {\n @apply text-sm font-medium text-zinc-900;\n}\n\n.review-pane-finding-body {\n @apply text-sm text-zinc-600 whitespace-pre-wrap;\n}\n\n.review-pane-empty {\n @apply flex h-full min-h-0 flex-col items-center justify-center px-6 text-center;\n}\n\n.review-pane-empty-title {\n @apply m-0 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-empty-text {\n @apply mt-2 max-w-sm text-sm text-zinc-500;\n}\n\n.review-pane-primary-cta {\n @apply mt-4 border-emerald-600 bg-emerald-600 text-white hover:bg-emerald-700;\n}\n\n.review-pane-sheet-backdrop {\n @apply fixed inset-0 z-50 bg-black/30;\n}\n\n.review-pane-sheet {\n @apply absolute inset-x-0 bottom-0 rounded-t-3xl bg-white px-4 pb-6 pt-3 shadow-2xl;\n}\n\n.review-pane-sheet-handle {\n @apply mx-auto mb-3 h-1.5 w-12 rounded-full bg-zinc-300;\n}\n\n.review-pane-sheet-header {\n @apply mb-3 flex items-center justify-between;\n}\n\n.review-pane-sheet-title {\n @apply m-0 text-sm font-medium text-zinc-900;\n}\n\n.review-pane-sheet-count {\n @apply m-0 rounded-full bg-zinc-100 px-2 py-1 text-[11px] text-zinc-500;\n}\n\n.review-pane-sheet-list {\n @apply flex max-h-[60vh] flex-col gap-2 overflow-y-auto pb-3;\n}\n\n.review-pane-sheet-enter-active,\n.review-pane-sheet-leave-active {\n transition: opacity 160ms ease;\n}\n\n.review-pane-sheet-enter-active .review-pane-sheet,\n.review-pane-sheet-leave-active .review-pane-sheet {\n transition: transform 200ms ease;\n}\n\n.review-pane-sheet-enter-from,\n.review-pane-sheet-leave-to {\n opacity: 0;\n}\n\n.review-pane-sheet-enter-from .review-pane-sheet,\n.review-pane-sheet-leave-to .review-pane-sheet {\n transform: translateY(16px);\n}\n\n@media (max-width: 767px) {\n .review-pane-header {\n @apply px-3 py-2;\n }\n\n .review-pane-eyebrow {\n @apply text-[10px];\n }\n\n .review-pane-title {\n @apply text-xs leading-5;\n }\n\n .review-pane-header-actions {\n @apply gap-1.5;\n }\n\n .review-pane-close,\n .review-pane-mobile-files-button,\n .review-pane-refresh,\n .review-pane-run {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-close {\n @apply h-7 w-7;\n }\n\n .review-pane-toolbar {\n @apply gap-1.5 px-3 py-2;\n }\n\n .review-pane-toolbar-controls {\n @apply grid grid-cols-1 gap-1.5;\n }\n\n .review-pane-control-cluster {\n @apply gap-1;\n }\n\n .review-pane-control-label {\n @apply text-[9px];\n }\n\n .review-pane-branch-select-wrap {\n @apply min-w-0 flex-1 px-2 py-0.75;\n }\n\n .review-pane-branch-select {\n @apply text-[12px];\n }\n\n .review-pane-segmented {\n @apply w-full justify-between gap-1 p-0.75;\n }\n\n .review-pane-segmented-button {\n @apply flex-1 px-2 py-1 text-[12px];\n }\n\n .review-pane-toolbar-actions {\n @apply w-auto gap-1;\n }\n\n .review-pane-refresh,\n .review-pane-run {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-banner {\n @apply mx-3 mt-2 px-2.5 py-1.5 text-xs;\n }\n\n .review-pane-meta {\n @apply gap-1 px-3 pt-2;\n }\n\n .review-pane-meta span {\n @apply px-1.75 py-0.75 text-[11px];\n }\n\n .review-pane-bulk-actions {\n @apply gap-1 px-3 py-2;\n }\n\n .review-pane-bulk-button {\n @apply px-2.5 py-1 text-[12px];\n }\n\n .review-pane-main {\n @apply block;\n }\n\n .review-pane-resizer {\n @apply hidden;\n }\n\n .review-pane-diff {\n @apply px-2 py-2.5;\n }\n\n .review-pane-file-header,\n .review-pane-hunk-header {\n @apply px-2.5 py-2;\n }\n\n .review-pane-sheet {\n @apply px-3 pb-4 pt-2.5;\n }\n\n .review-pane-sheet-handle {\n @apply mb-2 h-1.25 w-11;\n }\n\n .review-pane-sheet-header {\n @apply mb-2;\n }\n\n .review-pane-sheet-title {\n @apply text-xs;\n }\n\n .review-pane-sheet-count {\n @apply px-1.5 py-0.75 text-[10px];\n }\n\n .review-pane-sheet-list {\n @apply gap-1.5 pb-2;\n }\n\n .review-pane-sheet-list .review-pane-tree-folder {\n @apply gap-1 rounded-md px-2 py-1 text-[12px];\n }\n\n .review-pane-sheet-list .review-pane-tree-folder-count {\n @apply px-1.25 py-0.25 text-[9px];\n }\n\n .review-pane-sheet-list .review-pane-file {\n @apply gap-0.5 rounded-lg px-2 py-1.5;\n }\n\n .review-pane-sheet-list .review-pane-file-meta-row {\n @apply gap-1.5;\n }\n\n .review-pane-sheet-list .review-pane-file-op {\n @apply px-1.5 py-0.25 text-[9px];\n }\n\n .review-pane-sheet-list .review-pane-file-main {\n @apply gap-1;\n }\n\n .review-pane-sheet-list .review-pane-file-path {\n @apply text-[13px] leading-5;\n }\n\n .review-pane-sheet-list .review-pane-file-delta {\n @apply text-[11px];\n }\n}\n\n@media (min-width: 768px) {\n .review-pane-toolbar {\n @apply flex-row items-center gap-2.5;\n }\n\n .review-pane-toolbar-tabs {\n @apply flex-1;\n }\n\n .review-pane-toolbar-controls {\n @apply min-w-0 flex-nowrap;\n }\n\n .review-pane-control-cluster {\n @apply shrink-0;\n }\n\n .review-pane-toolbar-actions {\n @apply ml-auto;\n }\n}\n</style>\n"],"names":["REVIEW_FILE_LIST_WIDTH_KEY","MIN_FILE_LIST_WIDTH","MAX_FILE_LIST_WIDTH","DEFAULT_FILE_LIST_WIDTH","props","__props","isMobile","useMobile","activeTab","ref","activeScope","workspaceView","snapshot","selectedBaseBranch","isSyncingBaseBranch","selectedFileId","selectedHunkId","isFileSheetOpen","isLoadingSnapshot","isApplyingAction","isRunningReview","isInitializingGit","snapshotError","reviewError","reviewStatusLabel","reviewResultsByKey","pendingReviewKey","hunkRefs","stopNotifications","stopResizeTracking","reviewTabs","reviewKey","computed","currentReviewResult","selectedFile","_a","file","_b","folderExpansionState","headerTitle","canRunReview","showBulkActions","showRowActions","bulkActions","fileActions","hunkActions","reviewBannerText","reviewBannerIsError","fileListWidth","loadFileListWidth","reviewMainStyle","style","fileTreeData","buildVisibleFileTree","visibleFileTreeNodes","fileTreeFolderIdsByFileId","clampFileListWidth","value","raw","parsed","persistFileListWidth","onResizerPointerDown","event","startX","startWidth","handleMove","moveEvent","cleanup","handleUp","lineMarker","kind","fileBaseName","path","segments","sortTreeEntries","left","right","files","expansionState","root","folderIdsByFileId","fileName","currentFolder","folderPath","parentFolderIds","index","segment","nextFolder","nodes","countFiles","folder","sum","child","visitFolder","childFolders","childFiles","childFolder","childFile","isFolderExpanded","folderId","toggleFolder","expandFileAncestors","fileId","folderIds","nextState","changed","treeIndentStyle","depth","base","step","formatOperation","operation","bindHunkRef","hunkId","element","extractNotificationThreadId","notification","params","loadSnapshot","desiredBaseBranch","nextSnapshot","getReviewSnapshot","normalizedBaseBranch","_c","error","loadLatestReviewResult","reviewState","getThreadReviewResult","reloadAll","selectFile","entry","applyAction","action","level","patch","applyReviewAction","applyBulkAction","applyFileAction","applyHunkAction","hunk","initializeGit","initializeReviewGit","runReview","startThreadReview","formatFindingLocation","finding","lineSuffix","findMatchingHunk","newEnd","oldEnd","scrollToHunk","nextTick","openFinding","matchedHunk","handleNotification","item","itemType","targetKey","watch","branch","previous","onMounted","subscribeCodexNotifications","onBeforeUnmount","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_hoisted_2","_cache","_hoisted_3","_toDisplayString","_hoisted_4","$emit","_createVNode","IconTablerX","_hoisted_5","_hoisted_6","_hoisted_7","_Fragment","_renderList","tab","$event","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_openBlock","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_38","node","_normalizeStyle","_hoisted_41","_hoisted_42","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_createTextVNode","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","line","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_36","_hoisted_37","_hoisted_31","_hoisted_32","_hoisted_30","_hoisted_72","_d","_hoisted_73","_hoisted_74","_e","_hoisted_75","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_f","_Transition","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_87","_hoisted_88","_hoisted_90","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","_hoisted_96"],"mappings":"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"}