@feng0531/dsh-vcs 0.3.60 → 0.3.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js CHANGED
@@ -92,6 +92,6 @@ var wr=Object.create;var Ue=Object.defineProperty;var Sr=Object.getOwnPropertyDe
92
92
  .vcs-root .vcs-toolbar{gap:6px}
93
93
  .vcs-root .vcs-title{font-size:16px}
94
94
  }
95
- `;var _=X(require("react"),1);function Tt(t){return t===""?[]:t.split(/\r\n|\n|\r/)}function jt(t="",e=""){let s=Tt(t),i=Tt(e),o=0;for(;o<s.length&&o<i.length&&s[o]===i[o];)o++;let l=0;for(;l<s.length-o&&l<i.length-o&&s[s.length-l-1]===i[i.length-l-1];)l++;let m=s.length-l,c=i.length-l,d=m-o,n=c-o,p=d&&n?(d+1)*(n+1):0,h=p>2e5,k=[],y=0;function D(u,C){y++,!(k.length>=2e3)&&k.push({left:u===null?null:{number:u+1,text:s[u]},right:C===null?null:{number:C+1,text:i[C]},kind:u===null?"insert":C===null?"delete":s[u]===i[C]?"equal":"replace"})}for(let u=0;u<o;u++)D(u,u);if(h||!d||!n)for(let u=0;u<Math.max(d,n);u++)D(u<d?o+u:null,u<n?o+u:null);else{let u=n+1,C=new Uint32Array(p);for(let f=d-1;f>=0;f--)for(let x=n-1;x>=0;x--)C[f*u+x]=s[o+f]===i[o+x]?C[(f+1)*u+x+1]+1:Math.max(C[(f+1)*u+x],C[f*u+x+1]);let v=0,g=0;for(;v<d||g<n;)v<d&&g<n&&s[o+v]===i[o+g]?D(o+v++,o+g++):v<d&&(g===n||C[(v+1)*u+g]>=C[v*u+g+1])?D(o+v++,null):D(null,o+g++)}for(let u=0;u<l;u++)D(m+u,c+u);return{rows:k,approximate:h,truncated:y>k.length,totalRows:y,omittedRows:y-k.length,leftLineCount:s.length,rightLineCount:i.length,lcsCells:h?0:p}}var Hr={before:"Before",after:"After",readonly:"Read-only text comparison",approximate:"Approximate alignment: the changed region is too large for exact matching; lines are paired by position.",truncated:"Preview truncated to the first 2,000 aligned lines; additional lines are not shown.",empty:"Both versions are empty."},st={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Br={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Dr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Or={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Ne({comparison:t,labels:e={}}){let s=t?.left?.text??"",i=t?.right?.text??"",o=(0,_.useMemo)(()=>jt(s,i),[s,i]),l=c=>e[c]??Hr[c],m=(c,d,n)=>{let p=c&&n!=="equal";return _.default.createElement("td",{style:{...st,background:p?d==="left"?"#d6454520":"#259b4920":void 0}},_.default.createElement("div",{style:Br},_.default.createElement("span",{style:Dr},c?.number??""),_.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},p?d==="left"?"\u2212":"+":""),_.default.createElement("pre",{style:Or},c?.text??"")))};return _.default.createElement("section",{className:"vcs-text-comparison","aria-label":l("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},o.approximate&&_.default.createElement("div",{role:"status",style:{padding:8}},l("approximate")),o.truncated&&_.default.createElement("div",{role:"status",style:{padding:8}},l("truncated")," (",2e3," / ",o.totalRows,")"),_.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},_.default.createElement("thead",null,_.default.createElement("tr",null,_.default.createElement("th",{scope:"col",style:{...st,padding:8,overflowWrap:"anywhere"}},t?.left?.label||l("before")),_.default.createElement("th",{scope:"col",style:{...st,padding:8,overflowWrap:"anywhere"}},t?.right?.label||l("after")))),_.default.createElement("tbody",null,o.rows.map((c,d)=>_.default.createElement("tr",{key:d,"data-kind":c.kind},m(c.left,"left",c.kind),m(c.right,"right",c.kind))))),!o.rows.length&&_.default.createElement("p",{style:{padding:8}},l("empty")))}var j=X(require("react"),1);function Ut(t,{width:e,height:s,signal:i,timeoutMs:o=1e4,createURL:l=d=>URL.createObjectURL(d),revokeURL:m=d=>URL.revokeObjectURL(d),createImage:c=()=>new Image}={}){return new Promise((d,n)=>{if(i?.aborted){n(i.reason);return}if(!["image/png","image/jpeg"].includes(t?.type)||t.size>2*1024*1024||!Number.isInteger(e)||!Number.isInteger(s)||e<1||s<1||e>8192||s>8192||e*s>16e6||!Number.isFinite(o)||o<=0){n(new Error("Invalid image preview"));return}let p,h,k,y=!1,D=!1,u=()=>{D||(D=!0,h&&(h.src=""),p&&m(p))},C=()=>{clearTimeout(k),i?.removeEventListener("abort",g)},v=f=>{y||(y=!0,C(),u(),n(f))},g=()=>v(i.reason||new Error("Image cancelled"));try{p=l(t),h=c(),i?.addEventListener("abort",g,{once:!0}),k=setTimeout(()=>v(new Error("Image decode timed out")),o),h.src=p,Promise.resolve(h.decode()).then(()=>{if(!y){if(i?.aborted){g();return}if(h.naturalWidth!==e||h.naturalHeight!==s){v(new Error("Image dimensions mismatch"));return}y=!0,C(),d({url:p,dispose:u})}},v)}catch(f){v(f)}})}function Mr({side:t,sessionId:e,repositoryId:s,commit:i,parentIndex:o,base:l,target:m,workspace:c=!1,mode:d,id:n,rpc:p,t:h,onRediscover:k}){let[y,D]=(0,j.useState)(null),[u,C]=(0,j.useState)(""),[v,g]=(0,j.useState)(0);return(0,j.useEffect)(()=>{let f=new AbortController,x;return D(null),C(""),(async()=>{let S=await p(c?"vcs/workspace-image":l?"vcs/revision-image":"vcs/commit-image",c?{sessionId:e,repositoryId:s,mode:d,id:n,side:t}:l?{sessionId:e,repositoryId:s,base:l,target:m,id:n,side:t}:{sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:n,side:t},f.signal);if(f.signal.aborted)return;if(S.absent){D(S);return}if(!["image/png","image/jpeg"].includes(S.mime)||typeof S.base64!="string"||S.base64.length>2796204||!Number.isInteger(S.bytes)||S.bytes<1||S.bytes>2097152)throw Error(h("imageInvalid"));let E=atob(S.base64);if(E.length!==S.bytes)throw Error(h("imageInvalid"));let N=new Blob([Uint8Array.from(E,T=>T.charCodeAt(0))],{type:S.mime});if(x=await Ut(N,{width:S.width,height:S.height,signal:f.signal}),f.signal.aborted){x.dispose();return}D({...S,url:x.url})})().catch(S=>{f.signal.aborted||(C(S.message),S.code==="vcs/rediscover-required"&&k())}),()=>{f.abort(),x?.dispose()}},[t,e,s,i,o,l,m,c,d,n,v]),j.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(t==="left"?"imageBefore":"imageAfter")},j.default.createElement("h5",null,h(t==="left"?"imageBefore":"imageAfter")),u?j.default.createElement("p",{role:"alert"},u," ",j.default.createElement("button",{onClick:()=>g(f=>f+1)},h("retry"))):y?j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,j.default.createElement("code",null,y.commit)," \xB7 ",y.path),y.absent?j.default.createElement("p",null,h("imageAbsent")):j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,y.width," \xD7 ",y.height," \xB7 ",y.bytes," B"),j.default.createElement("img",{src:y.url,alt:y.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),y.metadataStripped&&j.default.createElement("p",null,h("imageMetadata")))):j.default.createElement("p",{role:"status"},h("loading")))}function Ee(t){let[e,s]=(0,j.useState)(!1);return j.default.createElement("div",null,j.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("imageCompare")),e&&j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,t.t("imageScope")),j.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(i=>j.default.createElement(Mr,{key:i,...t,side:i})))))}function Ie(t){return{before:t("textBefore"),after:t("textAfter"),readonly:t("textReadonly"),empty:t("textEmpty"),approximate:t("approximate"),truncated:t("textTruncated")}}var b=X(require("react"),1);function It(t){let e=new Map;for(let s of t){let i=e.get(s.commit);i||(i={names:[],hidden:0},e.set(s.commit,i)),i.names.length<3?i.names.push(s.name):i.hidden++}return e}var F=X(require("react"),1);var B=X(require("react"),1);var W=X(require("react"),1);var U=X(require("react"),1);function qt({load:t,node:e,comparison:s,key:i,single:o=!1,onReady:l=()=>{},onError:m=()=>{}}){let c=new AbortController,d,n=!1,p=()=>{let k=d;d=void 0,k?.dispose()};return{done:Promise.resolve().then(()=>(c.signal.throwIfAborted(),t(c.signal))).then(k=>{n||(d=k.createDiff(e,{single:o}),d.setContent(s,i),n||l(d))}).catch(k=>{try{p()}finally{n||m(k)}}),dispose(){n||(n=!0,c.abort(),p())}}}async function qe(t,{signal:e,fetcher:s=fetch,importer:i=o=>import(o)}={}){let o=await s(t,{credentials:"same-origin",cache:"no-cache",signal:e});if(!o.ok)throw new Error("Editor resource HTTP "+o.status+" ("+t+"). "+(o.status===401?"Refresh the authenticated DSH page.":o.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let l=o.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(l))throw new Error("Editor resource returned "+(l||"no Content-Type")+" instead of JavaScript.");return await o.arrayBuffer(),e?.throwIfAborted(),i(t)}var Je="0.3.60";function Le({comparison:t,identity:e,t:s,single:i=!1,line:o=null}){let l=(0,U.useRef)(null),m=(0,U.useRef)(null),[c,d]=(0,U.useState)(!0),[n,p]=(0,U.useState)(!1),[h,k]=(0,U.useState)(!1),[y,D]=(0,U.useState)(!0),[u,C]=(0,U.useState)(!1),[v,g]=(0,U.useState)("");return(0,U.useEffect)(()=>{if(C(!1),g(""),!y)return;let f=E=>new URL("vcs-assets/"+E,document.baseURI).href,x=document.createElement("link");x.rel="stylesheet",x.href=f("editor.css"),document.head.appendChild(x);let S=qt({node:l.current,comparison:t,key:e,single:i,load:E=>qe(f("editor.js")+"?v="+encodeURIComponent(Je)+"&retry=0",{signal:E}),onReady:E=>{m.current=E,C(!0)},onError:E=>g(E.message)});return()=>{m.current=null;try{S.dispose()}finally{x.remove()}}},[y,t,e,i]),(0,U.useEffect)(()=>{u&&i&&o&&m.current?.revealLine(o)},[u,i,o]),(0,U.useEffect)(()=>{u&&m.current?.options({sideBySide:c,ignoreWhitespace:n,wrap:h})},[u,c,n,h]),U.default.createElement("div",null,U.default.createElement("button",{"aria-pressed":y,onClick:()=>D(f=>!f)},s(y?"historyBasic":"historyAdvanced")),u&&!i&&U.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},U.default.createElement("button",{"aria-pressed":c,onClick:()=>d(f=>!f)},s(c?"side":"inline")),U.default.createElement("label",null,U.default.createElement("input",{type:"checkbox",checked:n,onChange:f=>p(f.target.checked)}),s("whitespace")),U.default.createElement("label",null,U.default.createElement("input",{type:"checkbox",checked:h,onChange:f=>k(f.target.checked)}),s("wrap")),U.default.createElement("button",{onClick:()=>m.current?.navigate("previous")},s("previous")),U.default.createElement("button",{onClick:()=>m.current?.navigate("next")},s("next"))),y&&!u&&!v&&U.default.createElement("p",{role:"status"},s("loading")),v&&U.default.createElement("p",{role:"status"},s("fallback")," ",v),U.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},U.default.createElement("div",{ref:l,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&U.default.createElement(Ne,{comparison:t,labels:Ie(s)})))}function Ae({sessionId:t,repositoryId:e,commit:s,path:i,rpc:o,t:l,onRediscover:m,onClose:c,line:d=null}){let[n,p]=(0,W.useState)(null),[h,k]=(0,W.useState)(""),[y,D]=(0,W.useState)(0);(0,W.useEffect)(()=>{let C=new AbortController;return p(null),k(""),o("vcs/tree-file",{sessionId:t,repositoryId:e,commit:s,path:i},C.signal).then(v=>{C.signal.aborted||p(v)}).catch(v=>{C.signal.aborted||(k(v.message),v.code==="vcs/rediscover-required"&&m())}),()=>C.abort()},[t,e,s,i,y]);let u=(0,W.useMemo)(()=>n?{path:i,left:{label:s,text:n.text||""},right:{label:s,text:n.text||""}}:null,[n,i,s]);return W.default.createElement("section",{"aria-label":l("treePreview")},W.default.createElement("h4",null,i),W.default.createElement("button",{onClick:c},l("treeClose")),W.default.createElement("p",null,W.default.createElement("code",null,s)),h?W.default.createElement("p",{role:"alert"},h," ",W.default.createElement("button",{onClick:()=>D(C=>C+1)},l("retry"))):n?W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,W.default.createElement("code",null,n.oid)," \xB7 ",l("encoding"),": ",n.encoding||"\u2014"),d&&W.default.createElement("p",{role:"status"},l("blameOriginLine"),": ",d,!n.text||d>n.text.split(`
96
- `).length?" \xB7 "+l("blameUnmapped"):""),n.notice&&W.default.createElement("p",{role:"status"},n.notice),n.binary?W.default.createElement("p",null,l("binary")):n.text===""?W.default.createElement("p",null,l("treeEmpty")):W.default.createElement(Le,{single:!0,line:d,comparison:u,identity:JSON.stringify([t,e,s,i]),t:l})):W.default.createElement("p",{role:"status"},l("loading")))}function Jt(t=""){let e=[{path:"",name:"/"}];if(t){let s="";for(let i of t.split("/"))s=s?s+"/"+i:i,e.push({path:s,name:i})}return e}function Wt(t,e="",s=""){let i=e?e+"/":"",o=s.toLowerCase();return t.filter(l=>{let m=l.path.slice(i.length);return l.path.startsWith(i)&&m.length>0&&!m.includes("/")&&m.toLowerCase().includes(o)}).sort((l,m)=>+(m.type==="tree")-+(l.type==="tree")||(l.path<m.path?-1:l.path>m.path?1:0))}function Tr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l}){let[m,c]=(0,B.useState)(null),[d,n]=(0,B.useState)(""),[p,h]=(0,B.useState)(0),[k,y]=(0,B.useState)(""),[D,u]=(0,B.useState)(0),[C,v]=(0,B.useState)(""),[g,f]=(0,B.useState)(null);if((0,B.useEffect)(()=>{let N=new AbortController;return c(null),n(""),i("vcs/tree",{sessionId:t,repositoryId:e,commit:s},N.signal).then(T=>{N.signal.aborted||c(T)}).catch(T=>{N.signal.aborted||(n(T.message),T.code==="vcs/rediscover-required"&&l())}),()=>N.abort()},[t,e,s,p]),d)return B.default.createElement("p",{role:"alert"},d," ",B.default.createElement("button",{onClick:()=>h(N=>N+1)},o("retry")));if(!m)return B.default.createElement("p",{role:"status"},o("loading"));let x=k?k+"/":"",S=Wt(m.entries,k,C),E=N=>{y(N),u(0),v(""),f(null)};return B.default.createElement("section",{"aria-label":o("historicalTree")},B.default.createElement("p",null,o("historicalTreeScope")),B.default.createElement("code",null,s),B.default.createElement("p",null,k||"/"," ",k&&B.default.createElement("button",{onClick:()=>E(k.includes("/")?k.slice(0,k.lastIndexOf("/")):"")},o("treeUp"))),B.default.createElement("nav",{"aria-label":o("treeBreadcrumbs")},Jt(k).map(N=>B.default.createElement(B.default.Fragment,{key:N.path},N.path&&" / ",N.path===k?B.default.createElement("span",{"aria-current":"location"},N.name):B.default.createElement("button",{onClick:()=>E(N.path)},N.name)))),B.default.createElement("label",null,o("treeSearch")," ",B.default.createElement("input",{"aria-label":o("treeSearch"),value:C,onChange:N=>{v(N.target.value),u(0),f(null)}})),B.default.createElement("p",null,S.length," ",o("treeEntries")),!S.length&&C&&B.default.createElement("p",{role:"status"},o("emptySearch")),B.default.createElement("ul",null,S.slice(D*100,D*100+100).map(N=>B.default.createElement("li",{key:N.path},N.type==="tree"?B.default.createElement("button",{onClick:()=>E(N.path)},N.path.slice(x.length),"/"):N.type==="blob"&&["100644","100755"].includes(N.mode)?B.default.createElement("button",{"aria-pressed":g===N.path,onClick:()=>f(N.path)},N.path.slice(x.length)):B.default.createElement("span",null,N.path.slice(x.length))," \xB7 ",B.default.createElement("code",null,N.mode," ",N.type," ",B.default.createElement("span",{title:N.oid},N.oid.slice(0,10)))))),D>0&&B.default.createElement("button",{onClick:()=>{u(N=>N-1),f(null)}},o("treePrevious")),(D+1)*100<S.length&&B.default.createElement("button",{onClick:()=>{u(N=>N+1),f(null)}},o("treeNext")),g&&B.default.createElement(Ae,{key:JSON.stringify([t,e,s,g]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l,path:g,onClose:()=>f(null)}))}function nt(t){return B.default.createElement(jr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function jr(t){let[e,s]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historicalTree")),e&&B.default.createElement(Tr,{...t}))}var V=X(require("react"),1);var M=X(require("react"),1);function Ur({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,follow:l,rpc:m,t:c,onRediscover:d,onSelectCommit:n}){let[p,h]=(0,M.useState)({commits:[],nextOffset:null}),[k,y]=(0,M.useState)(0),[D,u]=(0,M.useState)(0),[C,v]=(0,M.useState)(!0),[g,f]=(0,M.useState)("");return(0,M.useEffect)(()=>{let x=new AbortController;return v(!0),f(""),m("vcs/file-history",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,offset:k,limit:50,follow:l},x.signal).then(S=>{x.signal.aborted||h(E=>({...S,commits:k?[...E.commits,...S.commits]:S.commits}))}).catch(S=>{x.signal.aborted||(f(S.message),S.code==="vcs/rediscover-required"&&d())}).finally(()=>{x.signal.aborted||v(!1)}),()=>x.abort()},[t,e,s,i,o,k,D]),M.default.createElement("section",{"aria-label":c("fileHistory"),"aria-busy":C},M.default.createElement("p",null,c("fileHistoryScope")),M.default.createElement("p",{style:{overflowWrap:"anywhere"}},p.path," \xB7 ",M.default.createElement("code",null,s)),M.default.createElement("ol",null,p.commits.map(x=>M.default.createElement("li",{key:x.id},M.default.createElement("code",{title:x.id},x.id.slice(0,10))," \xB7 ",n?M.default.createElement("button",{onClick:()=>n(x.id,x.path||p.path)},x.subject):x.subject,M.default.createElement("div",null,x.boundary&&M.default.createElement("span",null,c(x.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":"fileHistoryBoundary")," "),x.path&&M.default.createElement("code",null,x.oldPath?x.oldPath+" \u2192 ":"",x.path)," ",x.author," \xB7 ",M.default.createElement("time",{dateTime:x.date},x.date))))),C&&M.default.createElement("p",{role:"status"},c("loading")),g&&M.default.createElement("p",{role:"alert"},g," ",M.default.createElement("button",{onClick:()=>u(x=>x+1)},c("retry"))),!C&&!g&&!p.commits.length&&M.default.createElement("p",null,c("historyEmpty")),p.truncated&&M.default.createElement("p",{role:"status"},c("historyLimit")),!g&&p.nextOffset!==null&&M.default.createElement("button",{disabled:C,onClick:()=>y(p.nextOffset)},c("historyMore")))}function at(t){return M.default.createElement(Ir,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit,t.parentIndex,t.id]),...t})}function Ir(t){let[e,s]=(0,M.useState)(!1),[i,o]=(0,M.useState)(!1);return M.default.createElement("div",null,M.default.createElement("button",{"aria-expanded":e,onClick:()=>s(l=>!l)},t.t("fileHistory")),e&&M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:i,onChange:l=>o(l.target.checked)}),t.t("fileHistoryFollow")),M.default.createElement("p",null,t.t("fileHistoryFollowScope")),M.default.createElement(Ur,{key:String(i),follow:i,...t})))}var H=X(require("react"),1);function qr({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:l,t:m,onRediscover:c,onSelectCommit:d}){let[n,p]=(0,H.useState)(null),[h,k]=(0,H.useState)(""),[y,D]=(0,H.useState)(0),[u,C]=(0,H.useState)(1),[v,g]=(0,H.useState)(null);return(0,H.useEffect)(()=>{let f=new AbortController;return p(null),k(""),g(null),l("vcs/blame",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,startLine:u,lineLimit:500},f.signal).then(x=>{f.signal.aborted||p(x)}).catch(x=>{f.signal.aborted||(k(x.message),x.code==="vcs/rediscover-required"&&c())}),()=>f.abort()},[t,e,s,i,o,y,u]),h?H.default.createElement("p",{role:"alert"},h," ",H.default.createElement("button",{onClick:()=>D(f=>f+1)},m("retry"))):n?H.default.createElement("section",{"aria-label":m("blame")},H.default.createElement("p",null,m("blameScope")),d&&H.default.createElement("p",null,m("blameNavigation")),n.notice&&H.default.createElement("p",{role:"status"},n.notice),n.truncated&&H.default.createElement("p",{role:"status"},m("blameLimit")),!n.notice&&!n.lines.length&&H.default.createElement("p",null,m("blameEmpty")),!!n.lines.length&&H.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},H.default.createElement("table",null,H.default.createElement("thead",null,H.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(f=>H.default.createElement("th",{key:f,scope:"col"},m(f))))),H.default.createElement("tbody",null,n.lines.map(f=>H.default.createElement("tr",{key:f.line},H.default.createElement("th",{scope:"row"},f.line),H.default.createElement("td",null,d?H.default.createElement("button",{title:f.commit,onClick:()=>d(f.commit)},H.default.createElement("code",null,f.commit.slice(0,10))):H.default.createElement("code",{title:f.commit},f.commit.slice(0,10))),H.default.createElement("td",null,f.author),H.default.createElement("td",null,f.summary),H.default.createElement("td",null,H.default.createElement("pre",{style:{margin:0}},f.text),f.path&&f.originalLine?H.default.createElement("button",{onClick:()=>g(f)},m("blameOriginLine"),": ",f.path,":",f.originalLine):H.default.createElement("span",null,m("blameUnmapped")))))))),H.default.createElement("p",null,n.startLine||u,"\u2013",n.lines.at(-1)?.line||u," / ",n.totalLines??"\u2014"),H.default.createElement("button",{disabled:u===1,onClick:()=>C(Math.max(1,u-500))},m("blamePrevious")),H.default.createElement("button",{disabled:n.nextLine==null,onClick:()=>C(n.nextLine)},m("blameNext")),v&&H.default.createElement(Ae,{key:JSON.stringify([v.commit,v.path,v.originalLine]),sessionId:t,repositoryId:e,commit:v.commit,path:v.path,line:v.originalLine,rpc:l,t:m,onRediscover:c,onClose:()=>g(null)})):H.default.createElement("p",{role:"status"},m("loading"))}function lt(t){let[e,s]=(0,H.useState)(!1);return H.default.createElement("div",null,H.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("blame")),e&&H.default.createElement(qr,{...t}))}function Pe({sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:l,id:m,rpc:c,t:d,onRediscover:n,onSelectCommit:p}){let[h,k]=(0,V.useState)(null),[y,D]=(0,V.useState)(""),[u,C]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let v=new AbortController;return k(null),D(""),c(o?"vcs/revision-compare":"vcs/commit-compare",o?{sessionId:t,repositoryId:e,base:o,target:l,id:m}:{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m},v.signal).then(g=>{v.signal.aborted||k(g)}).catch(g=>{v.signal.aborted||(D(g.message),g.code==="vcs/rediscover-required"&&n())}),()=>v.abort()},[t,e,s,i,o,l,m,u]),y?V.default.createElement("p",{role:"alert"},y," ",V.default.createElement("button",{onClick:()=>C(v=>v+1)},d("retry"))):h?V.default.createElement("section",null,V.default.createElement("h4",null,h.path),V.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&V.default.createElement("p",{role:"status"},h.notice),h.binary?V.default.createElement("p",null,d("binary")):V.default.createElement(Le,{comparison:h,identity:JSON.stringify(o?[t,e,o,l,m]:[t,e,s,i,m]),t:d}),s&&!o&&V.default.createElement(at,{onSelectCommit:p,key:"file-history:"+JSON.stringify([t,e,s,i,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m,rpc:c,t:d,onRediscover:n}),s&&!o&&V.default.createElement(lt,{onSelectCommit:p,key:"blame:"+JSON.stringify([t,e,s,i,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m,rpc:c,t:d,onRediscover:n}),(s||o)&&V.default.createElement(Ee,{key:"image:"+JSON.stringify([t,e,s,i,o,l,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:l,id:m,rpc:c,t:d,onRediscover:n})):V.default.createElement("p",{role:"status"},d("loading"))}function Gt(t,e){if(typeof e!="string"||!e)return null;let s=t.filter(i=>i.path===e);return s.length===1&&typeof s[0].id=="string"&&s[0].id?s[0].id:null}function zt(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.id,i.author,i.subject].some(o=>o?.toLowerCase().includes(s))):t}function We(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.path,i.oldPath].some(o=>o?.toLowerCase().includes(s))):t}function dt(t){return F.default.createElement(Jr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function Jr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l,onSelectCommit:m,initialPath:c}){let d=(0,F.useRef)(!0),[n,p]=(0,F.useState)(null),[h,k]=(0,F.useState)(""),[y,D]=(0,F.useState)(0),[u,C]=(0,F.useState)(null),[v,g]=(0,F.useState)(""),[f,x]=(0,F.useState)(0);if((0,F.useEffect)(()=>{let E=new AbortController;return C(null),g(""),i("vcs/commit",{sessionId:t,repositoryId:e,commit:s,parentIndex:y},E.signal).then(N=>{E.signal.aborted||(C(N),d.current&&(d.current=!1,p(Gt(N.changes,c))))}).catch(N=>{E.signal.aborted||(g(N.message),N.code==="vcs/rediscover-required"&&l())}),()=>E.abort()},[t,e,s,y,f]),v)return F.default.createElement("p",{role:"alert"},v," ",F.default.createElement("button",{onClick:()=>x(E=>E+1)},o("retry")));if(!u)return F.default.createElement("p",{role:"status"},o("loading"));let S=We(u.changes,h);return F.default.createElement("section",{"aria-label":o("commitDetails")},F.default.createElement("h3",null,u.subject),F.default.createElement("code",null,u.id),F.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&F.default.createElement("p",{role:"status"},o("commitMessageLimit")),u.message&&F.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&F.default.createElement("label",null,o("commitParent")," ",F.default.createElement("select",{"aria-label":o("commitParent"),value:y,onChange:E=>{p(null),C(null),D(Number(E.target.value))}},u.parents.map((E,N)=>F.default.createElement("option",{key:E,value:N},N+1,": ",E.slice(0,10))))),F.default.createElement("p",null,u.parent||o("commitRoot")," \u2192 ",u.id.slice(0,10)),F.default.createElement("label",null,o("commitFileSearch")," ",F.default.createElement("input",{"aria-label":o("commitFileSearch"),value:h,onChange:E=>{k(E.target.value),p(null)}})),F.default.createElement("span",null," ",S.length," / ",u.changes.length),F.default.createElement("ul",null,S.map(E=>F.default.createElement("li",{key:E.id},F.default.createElement("button",{"aria-pressed":n===E.id,onClick:()=>p(E.id)},E.status," \xB7 ",E.oldPath?E.oldPath+" \u2192 ":"",E.path)))),!!u.changes.length&&!S.length&&F.default.createElement("p",{role:"status"},o("emptySearch")),!u.changes.length&&F.default.createElement("p",null,o("commitNoChanges")),n&&F.default.createElement(Pe,{key:n,sessionId:t,repositoryId:e,commit:s,parentIndex:y,id:n,onSelectCommit:m,rpc:i,t:o,onRediscover:l}),F.default.createElement(nt,{key:JSON.stringify([t,e,s]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l}))}var G=X(require("react"),1);function _t(t){if(!Array.isArray(t))throw new Error("Invalid graph commits");let e=t.slice(0,200),s=new Map,i=[],o=[],l=c=>typeof c=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(c);for(let[c,d]of e.entries()){if(!d||!l(d.id)||!Array.isArray(d.parents)||s.has(d.id))throw new Error("Invalid graph node");s.set(d.id,c),i.push({id:d.id,row:c})}let m=!1;for(let c of e){let d=new Set;for(let n of c.parents){if(o.length===1e3){m=!0;break}if(!l(n)||n.length!==c.id.length||n===c.id||d.has(n))throw new Error("Invalid graph parent");d.add(n);let p=s.get(n);if(p!==void 0&&p<=s.get(c.id))throw new Error("Graph requires child-before-parent order");o.push({from:c.id,to:n,missing:p===void 0})}if(m)break}return{nodes:i,edges:o,nodesTruncated:t.length>200,edgesTruncated:m}}function Vt(t){let e=Array(32).fill(null),s=new Map,i=[],o=new Set,l=!1,m=n=>{if(o.has(n))return null;let p=e.indexOf(n);return p>=0?p:(p=e.indexOf(null),p<0?(l=!0,o.add(n),null):(e[p]=n,p))},c=new Map;for(let n of t.edges){if(n.missing)continue;let p=c.get(n.from)||[];p.push(n.to),c.set(n.from,p)}for(let n of t.nodes){let p=m(n.id);if(s.set(n.id,{...n,lane:p}),i.push({...n,lane:p}),p===null)continue;e[p]=null;let h=c.get(n.id)||[];for(let[k,y]of h.entries())e.includes(y)||(k===0&&e[p]===null?e[p]=y:m(y))}let d=t.edges.filter(n=>!n.missing).flatMap(n=>{let p=s.get(n.from),h=s.get(n.to);return p.lane===null||h.lane===null?[]:[{...n,start:p.row,end:h.row,fromLane:p.lane,toLane:h.lane}]});return{nodes:i,edges:d,lanesTruncated:l,laneCount:Math.max(1,...i.map(n=>(n.lane??0)+1))}}function Wr({commits:t,selected:e,onSelect:s,t:i}){let o;try{o=_t(t)}catch{return G.default.createElement("p",{role:"alert"},i("graphInvalid"))}let l=Vt(o),m=l.edges,c=Math.max(100,24+18*l.laneCount),d=Math.max(40,o.nodes.length*36);return G.default.createElement("section",{"aria-label":i("historyGraph")},G.default.createElement("p",null,i("graphScope")),l.lanesTruncated&&G.default.createElement("p",{role:"status"},i("graphLaneLimit")),(o.nodesTruncated||o.edgesTruncated)&&G.default.createElement("p",{role:"status"},i("graphLimit")),G.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},G.default.createElement("svg",{width:c,height:d,"aria-hidden":"true",style:{flexShrink:0}},m.map(n=>{let p=n.start*36+18,h=n.end*36+18,k=12+n.fromLane*18,y=12+n.toLane*18;return G.default.createElement("path",{key:n.from+n.to,d:"M "+k+" "+p+" C "+k+" "+(p+18)+", "+y+" "+(h-18)+", "+y+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),l.nodes.filter(n=>n.lane!==null).map(n=>G.default.createElement("circle",{key:n.id,cx:12+n.lane*18,cy:n.row*36+18,r:"4",fill:"currentColor"}))),G.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},o.nodes.map(n=>G.default.createElement("li",{key:n.id,style:{height:36,whiteSpace:"nowrap"}},G.default.createElement("button",{title:n.id,"aria-current":e===n.id?!0:void 0,style:e===n.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:p=>{if(p.altKey||p.ctrlKey||p.metaKey||p.shiftKey)return;let h=p.key==="ArrowDown"?Math.min(n.row+1,o.nodes.length-1):p.key==="ArrowUp"?Math.max(0,n.row-1):p.key==="Home"?0:p.key==="End"?o.nodes.length-1:null;h!==null&&(p.preventDefault(),p.stopPropagation(),p.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>s(n.id)},G.default.createElement("code",null,n.id.slice(0,10))," ",t[n.row].subject))))),G.default.createElement("details",null,G.default.createElement("summary",null,i("graphRelations")),G.default.createElement("ul",null,o.edges.map(n=>G.default.createElement("li",{key:n.from+n.to},G.default.createElement("code",null,n.from)," \u2192 ",G.default.createElement("code",null,n.to),n.missing?" \xB7 "+i("graphMissing"):"")))))}function ct(t){let[e,s]=(0,G.useState)(!1);return G.default.createElement("div",null,G.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historyGraph")),e&&G.default.createElement(Wr,{...t}))}var A=X(require("react"),1);function Gr({sessionId:t,repositoryId:e,base:s,target:i,rpc:o,t:l,onRediscover:m}){let[c,d]=(0,A.useState)(null),[n,p]=(0,A.useState)(""),[h,k]=(0,A.useState)(0),[y,D]=(0,A.useState)(null),[u,C]=(0,A.useState)("");if((0,A.useEffect)(()=>{let g=new AbortController;return d(null),p(""),D(null),o("vcs/revision-changes",{sessionId:t,repositoryId:e,base:s,target:i},g.signal).then(f=>{g.signal.aborted||d(f)}).catch(f=>{g.signal.aborted||(p(f.message),f.code==="vcs/rediscover-required"&&m())}),()=>g.abort()},[t,e,s,i,h]),n)return A.default.createElement("p",{role:"alert"},n," ",A.default.createElement("button",{onClick:()=>k(g=>g+1)},l("retry")));if(!c)return A.default.createElement("p",{role:"status"},l("loading"));let v=We(c.changes,u);return A.default.createElement("div",null,A.default.createElement("label",null,l("commitFileSearch")," ",A.default.createElement("input",{"aria-label":l("commitFileSearch"),value:u,onChange:g=>{C(g.target.value),D(null)}})),A.default.createElement("span",null," ",v.length," / ",c.changes.length),!!c.changes.length&&!v.length&&A.default.createElement("p",{role:"status"},l("emptySearch")),!c.changes.length&&A.default.createElement("p",null,l("revisionEmpty")),A.default.createElement("ul",null,v.map(g=>A.default.createElement("li",{key:g.id},A.default.createElement("button",{"aria-pressed":y===g.id,onClick:()=>D(g.id)},g.status," \xB7 ",g.oldPath?g.oldPath+" \u2192 ":"",g.path)))),y&&A.default.createElement(Pe,{key:y,sessionId:t,repositoryId:e,base:s,target:i,id:y,rpc:o,t:l,onRediscover:m}))}function pt(t){return A.default.createElement(zr,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function zr({commits:t,sessionId:e,repositoryId:s,rpc:i,t:o,onRediscover:l,onReferencesLoaded:m}){let[c,d]=(0,A.useState)(""),[n,p]=(0,A.useState)(""),[h,k]=(0,A.useState)([]),[y,D]=(0,A.useState)(!1),[u,C]=(0,A.useState)(0),[v,g]=(0,A.useState)(!1),[f,x]=(0,A.useState)("");return(0,A.useEffect)(()=>{if(!u)return;let S=new AbortController;return g(!0),x(""),i("vcs/references",{sessionId:e,repositoryId:s},S.signal).then(E=>{S.signal.aborted||(k(E.references),D(!0),m?.(E.references))}).catch(E=>{S.signal.aborted||(x(E.message),E.code==="vcs/rediscover-required"&&l())}).finally(()=>{S.signal.aborted||g(!1)}),()=>S.abort()},[e,s,u]),A.default.createElement("section",{"aria-label":o("revisionTitle")},A.default.createElement("h3",null,o("revisionTitle")),A.default.createElement("p",null,o("revisionScope")),A.default.createElement("button",{disabled:v,onClick:()=>C(S=>S+1)},o("revisionLoadRefs")),A.default.createElement("p",null,o("revisionRefsScope")),y&&!v&&!f&&A.default.createElement("p",{role:"status"},h.length?`${o("revisionRefsCount")}: ${h.length}`:o("revisionRefsEmpty")),v&&A.default.createElement("p",{role:"status"},o("loading")),f&&A.default.createElement("p",{role:"alert"},f),[[c,d,"revisionBase"],[n,p,"revisionTarget"]].map(([S,E,N])=>A.default.createElement("label",{key:N},o(N)," ",A.default.createElement("select",{"aria-label":o(N),value:S,onChange:T=>E(T.target.value)},A.default.createElement("option",{value:""},"\u2014"),!!t.length&&A.default.createElement("optgroup",{label:o("revisionLoadedCommits")},t.map(T=>A.default.createElement("option",{key:T.id,value:T.id},T.id.slice(0,10)," \xB7 ",T.subject))),!!h.length&&A.default.createElement("optgroup",{label:o("revisionLocalRefs")},h.map(T=>A.default.createElement("option",{key:T.name,value:T.commit},T.name," \xB7 ",T.commit.slice(0,10)))),S&&!t.some(T=>T.id===S)&&!h.some(T=>T.commit===S)&&A.default.createElement("option",{value:S},S)))),A.default.createElement("button",{disabled:!c||!n,onClick:()=>{d(n),p(c)}},o("revisionSwap")),A.default.createElement("p",{style:{overflowWrap:"anywhere"}},A.default.createElement("code",null,c||"\u2014")," \u2192 ",A.default.createElement("code",null,n||"\u2014")),c&&n&&A.default.createElement(Gr,{key:JSON.stringify([e,s,c,n]),sessionId:e,repositoryId:s,base:c,target:n,rpc:i,t:o,onRediscover:l}))}function ut(t){return b.default.createElement(_r,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function _r({sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o}){let[l,m]=(0,b.useState)({id:null,path:null,revision:0}),[c,d]=(0,b.useState)(""),[n,p]=(0,b.useState)(null),[h,k]=(0,b.useState)(""),[y,D]=(0,b.useState)(""),u=L=>{let Y=(n||[]).find(Q=>JSON.stringify([Q.name,Q.commit])===L)?.commit||"";D(L),k(Y),f(Q=>Q?{...Q,snapshot:Y||null}:null),re(0),d(""),T(null),le({commits:[],snapshot:null,nextOffset:null})},[C,v]=(0,b.useState)({message:"",author:"",path:""}),[g,f]=(0,b.useState)(null),x=L=>{f({values:L,snapshot:K.snapshot}),re(0),d(""),T(null),le(J=>({...J,commits:[],nextOffset:null}))},S=(0,b.useMemo)(()=>It(n||[]),[n]),E=l.id,N=(L,J=null)=>m(Y=>({id:L,path:J,revision:Y.revision+1})),T=(L,J=null)=>m(Y=>({id:L,path:J,revision:Y.revision+(J||Y.path?1:0)})),[K,le]=(0,b.useState)({commits:[],snapshot:null,nextOffset:null}),[I,re]=(0,b.useState)(0),[P,oe]=(0,b.useState)(0),[$,ge]=(0,b.useState)(!0),[de,ve]=(0,b.useState)("");(0,b.useEffect)(()=>{let L=new AbortController;return ge(!0),ve(""),s("vcs/history",{sessionId:t,repositoryId:e,offset:I,limit:50,...g?{search:g.values}:{},...g?.snapshot||h||I?{snapshot:g?.snapshot||h||K.snapshot}:{}},L.signal).then(J=>{L.signal.aborted||le(Y=>({...J,commits:I?[...Y.commits,...J.commits]:J.commits}))}).catch(J=>{L.signal.aborted||(ve(J.message),J.code==="vcs/rediscover-required"&&o())}).finally(()=>{L.signal.aborted||ge(!1)}),()=>L.abort()},[t,e,I,P,g,h]);let R=zt(K.commits,c);return b.default.createElement("section",{className:"vcs-history","aria-label":i("history"),"aria-busy":$},b.default.createElement("div",{className:"vcs-history-list"},b.default.createElement("p",null,i("historyListOnly")),n!==null&&b.default.createElement("p",null,i("historyRefsScope")),b.default.createElement("label",null,i("historyBranch")," ",b.default.createElement("select",{"aria-label":i("historyBranch"),value:y,disabled:$,onChange:L=>u(L.target.value)},b.default.createElement("option",{value:""},"HEAD"),y&&!(n||[]).some(L=>JSON.stringify([L.name,L.commit])===y)&&b.default.createElement("option",{value:y},JSON.parse(y)[0]," \xB7 ",h.slice(0,10)," \xB7 ",i("historyPinned")),(n||[]).map(L=>{let J=JSON.stringify([L.name,L.commit]);return b.default.createElement("option",{key:J,value:J},L.name," \xB7 ",L.commit.slice(0,10))}))),b.default.createElement("p",null,i("historyBranchScope"),h&&b.default.createElement(b.default.Fragment,null," \xB7 ",b.default.createElement("code",null,h))),b.default.createElement("form",{"aria-label":i("historyServerSearch"),onSubmit:L=>{L.preventDefault(),x({...C})}},b.default.createElement("fieldset",{disabled:$},b.default.createElement("legend",null,i("historyServerSearch")),b.default.createElement("p",null,i("historyServerScope")),["message","author","path"].map(L=>b.default.createElement("label",{key:L},i("historyServer_"+L)," ",b.default.createElement("input",{maxLength:1024,"aria-label":i("historyServer_"+L),value:C[L],onChange:J=>v(Y=>({...Y,[L]:J.target.value}))}))),b.default.createElement("button",{type:"submit"},i("historyServerApply")),b.default.createElement("button",{type:"button",onClick:()=>{v({message:"",author:"",path:""}),x({})}},i("historyServerClear")))),g&&b.default.createElement("p",{role:"status"},i("historyServerActive"),": ",JSON.stringify(g.values)," \xB7 ",b.default.createElement("code",null,g.snapshot||K.snapshot)),b.default.createElement("label",null,i("historySearch")," ",b.default.createElement("input",{"aria-label":i("historySearch"),value:c,onChange:L=>{d(L.target.value),T(null)}})),b.default.createElement("span",null," ",R.length," / ",K.commits.length),!!K.commits.length&&!R.length&&b.default.createElement("p",{role:"status"},i("historyNoMatch")),b.default.createElement("ol",null,R.map(L=>b.default.createElement("li",{key:L.id},b.default.createElement("button",{"aria-pressed":E===L.id,onClick:()=>T(L.id)},L.subject),b.default.createElement("div",null,b.default.createElement("code",{title:L.id},L.id.slice(0,10))," \xB7 ",L.author," \xB7 ",b.default.createElement("time",{dateTime:L.date},L.date)),S.has(L.id)&&b.default.createElement("div",{"aria-label":i("historyRefsLabel"),style:{overflowWrap:"anywhere"}},S.get(L.id).names.map(J=>b.default.createElement("span",{key:J},b.default.createElement("code",null,J)," ")),S.get(L.id).hidden>0&&b.default.createElement("span",null,i("historyRefsMore"),": ",S.get(L.id).hidden))))),$&&b.default.createElement("p",{role:"status"},i("loading")),de&&b.default.createElement("p",{role:"alert"},de," ",b.default.createElement("button",{onClick:()=>oe(L=>L+1)},i("retry"))),!$&&!de&&!K.commits.length&&b.default.createElement("p",null,i("historyEmpty")),K.truncated&&b.default.createElement("p",{role:"status"},i("historyLimit")),!de&&K.nextOffset!==null&&b.default.createElement("button",{disabled:$,onClick:()=>re(K.nextOffset)},i("historyMore")),!!K.commits.length&&b.default.createElement(ct,{commits:K.commits,selected:E,onSelect:T,t:i}),b.default.createElement(pt,{onReferencesLoaded:p,commits:K.commits,sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o})),b.default.createElement("div",{className:"vcs-history-details"},E&&b.default.createElement(dt,{key:JSON.stringify([E,l.revision]),initialPath:l.path,sessionId:t,repositoryId:e,commit:E,onSelectCommit:N,rpc:s,t:i,onRediscover:o})))}var Kt={zh:{blameOriginLine:"\u67E5\u770B\u6765\u6E90\u5386\u53F2\u884C",blameUnmapped:"\u65E0\u6CD5\u7CBE\u786E\u5B9A\u4F4D\u6765\u6E90\u884C",blamePrevious:"\u4E0A\u4E00\u884C\u9875",blameNext:"\u4E0B\u4E00\u884C\u9875",fileHistoryMergeBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u5408\u5E76\u63D0\u4EA4\uFF0C\u6B64\u5904\u505C\u6B62\uFF0C\u4E0D\u63A8\u65AD\u591A\u7236\u6765\u6E90",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u5185\u5BB9\u76F8\u540C\u7684\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u4EC5\u8DDF\u968FGit\u68C0\u51FA\u7684100%\u91CD\u547D\u540D\uFF1B\u4E0D\u63A8\u65AD\u76F8\u4F3C\u5185\u5BB9\u3001\u590D\u5236\u6216\u5408\u5E76\u591A\u7236\u6765\u6E90\u3002\u65B0\u589E\u6587\u4EF6\u5904\u505C\u6B62\uFF0C\u53D7\u8F93\u51FA/\u65F6\u95F4\u9650\u5236\uFF1B\u6BCF\u6761\u8BB0\u5F55\u6309\u5F53\u65F6\u8DEF\u5F84\u5B9A\u4F4D\u3002",graphLaneLimit:"\u6CF3\u9053\u6700\u591A32\u6761\uFF1B\u8D85\u51FA\u90E8\u5206\u7701\u7565\u56FE\u5F62\uFF0C\u5B8C\u6574\u5DF2\u52A0\u8F7D\u8282\u70B9\u4E0E\u5173\u7CFB\u4ECD\u53EF\u5728\u6587\u5B57\u4E2D\u67E5\u770B\u3002",historyBranch:"\u5386\u53F2\u8D77\u70B9\uFF08\u672C\u5730\u5F15\u7528\uFF09",historyPinned:"\u56FA\u5B9A\u5FEB\u7167",historyBranchScope:"\u5F15\u7528\u7531\u4E0B\u65B9\u624B\u52A8\u52A0\u8F7D\uFF1B\u9009\u62E9\u540E\u56FA\u5B9A\u8BE5\u6B21OID\uFF0C\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5386\u53F2\u8D77\u70B9\u3002\u9009\u62E9HEAD\u91CD\u65B0\u8BFB\u53D6\u5F53\u524DHEAD\uFF0C\u4E0D\u5207\u6362\u5DE5\u4F5C\u533A\u3002",historyServerSearch:"\u5168\u5386\u53F2\u67E5\u8BE2",historyServerScope:"\u67E5\u8BE2\u56FA\u5B9A\u5FEB\u7167\u53EF\u8FBE\u7684\u5B8C\u6574\u5386\u53F2\uFF1B\u8BF4\u660E/\u4F5C\u8005\u4E3A\u5FFD\u7565\u5927\u5C0F\u5199\u7684\u5B57\u9762\u5339\u914D\uFF0C\u8DEF\u5F84\u4E3A\u7CBE\u786E\u8DEF\u5F84\u6216\u76EE\u5F55\uFF0C\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u3002\u5206\u9875\u4E0E\u8FD0\u884C\u65F6\u95F4\u6709\u754C\u3002",historyServer_message:"\u63D0\u4EA4\u8BF4\u660E",historyServer_author:"\u4F5C\u8005",historyServer_path:"\u8DEF\u5F84",historyServerApply:"\u6267\u884C\u67E5\u8BE2",historyServerClear:"\u6E05\u9664\u67E5\u8BE2",historyServerActive:"\u5F53\u524D\u5DF2\u63D0\u4EA4\u67E5\u8BE2",reviewView:"\u5BA1\u9605\u89C6\u56FE",workspaceView:"\u5DE5\u4F5C\u533A\u6539\u52A8",workspaceRoot:"\u5DE5\u4F5C\u533A\u672C\u8EAB",title:"VCS \u53D8\u66F4",readonly:"\u53EA\u8BFB\u9884\u89C8",refresh:"\u5237\u65B0",back:"\u8FD4\u56DE\u5BF9\u8BDD",all:"\u5168\u90E8\u53D8\u66F4",staged:"\u5DF2\u6682\u5B58",unstaged:"\u672A\u6682\u5B58",search:"\u641C\u7D22\u6587\u4EF6\u2026",noSession:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u4F1A\u8BDD\uFF0C\u518D\u67E5\u770B\u53D8\u66F4\u3002",noRepo:"\u672A\u53D1\u73B0 Git / SVN \u4ED3\u5E93\u3002\u53EF\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u540E\u91CD\u65B0\u626B\u63CF\u3002",clean:"\u6CA1\u6709\u53D8\u66F4",pick:"\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",loading:"\u6B63\u5728\u8BFB\u53D6\u2026",side:"\u5DE6\u53F3\u5BF9\u6BD4",inline:"\u884C\u5185\u5BF9\u6BD4",whitespace:"\u5FFD\u7565\u884C\u9996\u5C3E\u7A7A\u767D",wrap:"\u81EA\u52A8\u6362\u884C",previous:"\u4E0A\u4E00\u5904",next:"\u4E0B\u4E00\u5904",content:"\u5185\u5BB9",properties:"\u5C5E\u6027",binary:"\u4E8C\u8FDB\u5236\u6216\u53D7\u9650\u5185\u5BB9\u65E0\u6CD5\u6309\u6587\u672C\u6BD4\u8F83",changes:"\u5904\u53D8\u66F4",files:"\u4E2A\u6587\u4EF6",list:"\u5E73\u94FA",tree:"\u76EE\u5F55",emptySearch:"\u6CA1\u6709\u5339\u914D\u6587\u4EF6",session:"\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55",M:"\u4FEE\u6539",A:"\u65B0\u589E",D:"\u5220\u9664",R:"\u91CD\u547D\u540D",C:"\u590D\u5236",U:"\u51B2\u7A81","?":"\u672A\u8DDF\u8E2A",P:"\u5C5E\u6027",error:"\u8BFB\u53D6\u5931\u8D25",retry:"\u91CD\u8BD5",stale:"\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",repositories:"\u4ED3\u5E93",allRepositories:"\u5168\u90E8\u4ED3\u5E93",gitMode:"Git \u53D8\u66F4",svnBase:"SVN \xB7 BASE \u2194 \u5DE5\u4F5C\u526F\u672C",subdirectory:"\u76F8\u5BF9\u5B50\u76EE\u5F55\uFF08\u53EF\u9009\uFF09",rescan:"\u91CD\u65B0\u626B\u63CF\u4ED3\u5E93",scanHint:"\u4EC5\u626B\u63CF\u5F53\u524D\u76EE\u5F55\u53CA\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF0C\u4E0D\u9012\u5F52\u6DF1\u5165 \xB7 \u7F13\u5B58 5 \u5206\u949F\u540E\u8FC7\u671F",truncated:"\u5DF2\u8FBE\u5230\u626B\u63CF\u4E0A\u9650\u3002\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u5E76\u91CD\u65B0\u626B\u63CF\u4EE5\u8865\u5145\u5176\u4ED6\u4F4D\u7F6E\u3002",fallback:"\u9AD8\u7EA7\u7F16\u8F91\u5668\u4E0D\u53EF\u7528\uFF0C\u5DF2\u5207\u6362\u4E3A\u57FA\u7840\u5DE6\u53F3\u6587\u672C\u5BF9\u6BD4\u3002",diagnostics:"\u52A0\u8F7D\u8BCA\u65AD",approximate:"\u5185\u5BB9\u8F83\u5927\uFF0C\u4F7F\u7528\u8FD1\u4F3C\u884C\u5BF9\u9F50\u3002",textTruncated:"\u4EC5\u663E\u793A\u524D 2000 \u884C\u3002",textBefore:"\u4FEE\u6539\u524D",textAfter:"\u4FEE\u6539\u540E",textReadonly:"\u53EA\u8BFB\u6587\u672C\u6BD4\u8F83",textEmpty:"\u4E24\u4E2A\u7248\u672C\u5747\u4E3A\u7A7A\u3002",commitDetails:"\u63D0\u4EA4\u8BE6\u60C5",commitFileSearch:"\u7B5B\u9009\u672C\u6B21\u63D0\u4EA4\u6587\u4EF6",commitParent:"\u6BD4\u8F83\u7236\u63D0\u4EA4",commitRoot:"\u7A7A\u57FA\u7EBF\uFF08\u6839\u63D0\u4EA4\uFF09",commitNoChanges:"\u76F8\u5BF9\u6B64\u57FA\u7EBF\u65E0\u6587\u4EF6\u53D8\u66F4",history:"\u63D0\u4EA4\u5386\u53F2",historyAdvanced:"\u52A0\u8F7D\u9AD8\u7EA7\u53EA\u8BFB Diff",historyBasic:"\u8FD4\u56DE\u57FA\u7840\u6587\u672C Diff",historyListOnly:"\u672C\u5730 HEAD \u5386\u53F2\uFF1B\u9009\u62E9\u63D0\u4EA4\u53CA\u6587\u4EF6\u67E5\u770B\u53EA\u8BFB\u6587\u672C\u5DEE\u5F02\u3002",historyEmpty:"\u5C1A\u65E0\u63D0\u4EA4",historyRefsScope:"\u6807\u8BB0\u6765\u81EA\u6700\u8FD1\u4E00\u6B21\u624B\u52A8\u52A0\u8F7D\u7684\u672C\u5730\u5F15\u7528\uFF0C\u4E0D\u4EE3\u8868\u63D0\u4EA4\u521B\u5EFA\u65F6\u7684\u5206\u652F\u72B6\u6001\uFF1B\u5237\u65B0\u5931\u8D25\u65F6\u4FDD\u7559\u4E0A\u6B21\u6210\u529F\u7ED3\u679C\u3002",historyRefsLabel:"\u5DF2\u52A0\u8F7D\u672C\u5730\u5F15\u7528",historyRefsMore:"\u5176\u4ED6\u5F15\u7528",historySearch:"\u7B5B\u9009\u5DF2\u52A0\u8F7D\u63D0\u4EA4\uFF08\u4F5C\u8005 / \u6458\u8981 / SHA\uFF09",historyNoMatch:"\u5DF2\u52A0\u8F7D\u63D0\u4EA4\u4E2D\u65E0\u5339\u914D\u9879\uFF1B\u53EF\u7EE7\u7EED\u52A0\u8F7D\u66F4\u591A\u3002",historyMore:"\u52A0\u8F7D\u66F4\u591A\u63D0\u4EA4",historyLimit:"\u5DF2\u8FBE\u5230\u5386\u53F2\u6D4F\u89C8\u8303\u56F4\u4E0A\u9650\uFF0C\u4ECD\u6709\u66F4\u65E9\u63D0\u4EA4\u672A\u663E\u793A\u3002",autoRefresh:"\u624B\u52A8\u6216\u7A97\u53E3\u805A\u7126\u65F6\u5237\u65B0",comparisonContext:"\u6BD4\u8F83\u4E0A\u4E0B\u6587",encoding:"\u7F16\u7801",before:"\u524D\u7248\u672C",after:"\u540E\u7248\u672C",filterStatus:"\u6309\u72B6\u6001\u7B5B\u9009",allFiles:"\u5168\u90E8\u6587\u4EF6",previousFile:"\u4E0A\u4E00\u4E2A\u6587\u4EF6",nextFile:"\u4E0B\u4E00\u4E2A\u6587\u4EF6",expandAll:"\u5168\u90E8\u5C55\u5F00",collapseAll:"\u5168\u90E8\u6298\u53E0",revealSelected:"\u5B9A\u4F4D\u5F53\u524D\u6587\u4EF6",reviewPosition:"\u7B2C {index} / {total} \u4E2A\u6587\u4EF6",clearFilters:"\u6E05\u9664\u7B5B\u9009",searchShortcut:"Ctrl / \u2318 + F \u641C\u7D22\uFF1BEsc \u6E05\u7A7A\u641C\u7D22",fileShortcut:"Alt + \u2190 / \u2192 \u5207\u6362\u4E0A\u4E00\u4E2A\u6216\u4E0B\u4E00\u4E2A\u6587\u4EF6",copyPath:"\u590D\u5236\u8DEF\u5F84",copied:"\u5DF2\u590D\u5236",pathCopied:"\u6587\u4EF6\u8DEF\u5F84\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",copyFailed:"\u65E0\u6CD5\u590D\u5236\u6587\u4EF6\u8DEF\u5F84\u3002",binaryComparison:"\uFF08{files}\uFF09",revisionTitle:"\u672C\u5730\u7248\u672C A/B \u6BD4\u8F83",revisionScope:"\u53EF\u9009\u62E9\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4\uFF0C\u6216\u624B\u52A8\u52A0\u8F7D\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E\uFF1B\u76F4\u63A5\u6BD4\u8F83 A \u2192 B\uFF0C\u4E0D\u4F7F\u7528\u5408\u5E76\u57FA\u70B9\u3002",revisionBase:"A\uFF08\u5DE6\u4FA7\uFF09",revisionTarget:"B\uFF08\u53F3\u4FA7\uFF09",revisionSwap:"\u4EA4\u6362 A/B",revisionEmpty:"\u4E24\u4E2A\u7248\u672C\u6CA1\u6709\u6587\u4EF6\u53D8\u66F4\u3002",fileHistory:"\u8DEF\u5F84\u5386\u53F2",fileHistoryScope:"\u56FA\u5B9A\u63D0\u4EA4\u5FEB\u7167\u4E0B\u7684\u7CBE\u786E\u8DEF\u5F84\u5386\u53F2\uFF1B\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u524D\u8DEF\u5F84\uFF0C\u5305\u542B\u540C\u8DEF\u5F84\u5220\u9664\u540E\u91CD\u5EFA\u3002\u70B9\u51FB\u63D0\u4EA4\u540E\uFF0C\u4EC5\u5728\u76F8\u5BF9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF08\u6839\u63D0\u4EA4\u4E3A\u7A7A\u6811\uFF09\u7684\u53D8\u66F4\u4E2D\u552F\u4E00\u5339\u914D\u540C\u8DEF\u5F84\u65F6\u6253\u5F00 Diff\uFF1B\u5426\u5219\u53EA\u663E\u793A\u8BE6\u60C5\u3002",blame:"\u884C\u5F52\u5C5E\uFF08Blame\uFF09",blameNavigation:"\u70B9\u51FB\u5F52\u5C5E\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5\uFF1B\u9ED8\u8BA4\u9009\u62E9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\u5386\u53F2\u6587\u4EF6\u6216\u884C\u53F7\u3002",blameScope:"\u6240\u9009\u63D0\u4EA4\u7684 UTF-8 \u666E\u901A\u6587\u672C\uFF0C\u6700\u591A\u663E\u793A\u524D 500 \u884C\uFF1B\u4E0D\u5305\u542B\u5DE5\u4F5C\u533A\u4FEE\u6539\u3002",blameLimit:"\u4EC5\u663E\u793A\u524D 500 \u884C\uFF0C\u7ED3\u679C\u5DF2\u622A\u65AD\u3002",blameEmpty:"\u6587\u4EF6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u884C\u3002",blameLine:"\u884C\u53F7",blameCommit:"\u5F52\u5C5E\u63D0\u4EA4",blameAuthor:"\u4F5C\u8005",blameSummary:"\u63D0\u4EA4\u6458\u8981",blameSource:"\u6E90\u7801",historicalTree:"\u5386\u53F2\u76EE\u5F55",historicalTreeScope:"\u6240\u9009\u63D0\u4EA4\u7684\u76EE\u5F55\u6761\u76EE\uFF1B\u6BCF\u9875 100 \u9879\u3002\u70B9\u51FB\u666E\u901A\u6587\u4EF6\u53EA\u8BFB\u9884\u89C8\uFF1B\u4E0D\u8DDF\u968F\u7B26\u53F7\u94FE\u63A5\u6216\u5B50\u6A21\u5757\u3002",treePreview:"\u5386\u53F2\u6587\u4EF6\u9884\u89C8",treeClose:"\u5173\u95ED\u6587\u4EF6\u9884\u89C8",treeEmpty:"\u7A7A\u6587\u4EF6\u6216\u65E0\u53EF\u663E\u793A\u7684\u6587\u672C\u3002",treeSearch:"\u7B5B\u9009\u5F53\u524D\u76EE\u5F55\u540D\u79F0",treeBreadcrumbs:"\u5386\u53F2\u76EE\u5F55\u8DEF\u5F84",treeUp:"\u4E0A\u7EA7\u76EE\u5F55",treeEntries:"\u4E2A\u6761\u76EE",treePrevious:"\u4E0A\u4E00\u9875",treeNext:"\u4E0B\u4E00\u9875",historyGraph:"\u5C40\u90E8\u63D0\u4EA4\u56FE",graphScope:"\u4EC5\u5C55\u793A\u5DF2\u52A0\u8F7D\u5386\u53F2\u7684\u524D 200 \u4E2A\u63D0\u4EA4\uFF0C\u6700\u591A 1000 \u6761\u7236\u5B50\u8FB9\uFF1B\u4E0D\u53D7\u6587\u672C\u7B5B\u9009\u5F71\u54CD\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5206\u652F\u56FE\u3002\u8282\u70B9\u70B9\u51FB\u53EF\u67E5\u770B\u8BE6\u60C5\u3002",graphLimit:"\u56FE\u5DF2\u8FBE\u5230\u8282\u70B9\u6216\u8FB9\u4E0A\u9650\uFF0C\u90E8\u5206\u5173\u7CFB\u672A\u5C55\u793A\u3002",graphMissing:"\u7236\u63D0\u4EA4\u672A\u5728\u5F53\u524D\u56FE\u4E2D",graphRelations:"\u7236\u5B50\u5173\u7CFB\uFF08\u6587\u672C\uFF09",graphInvalid:"\u5F53\u524D\u63D0\u4EA4\u987A\u5E8F\u65E0\u6CD5\u7ED8\u56FE\uFF1B\u8BF7\u4F7F\u7528\u5386\u53F2\u5217\u8868\u3002",imageCompare:"PNG \u56FE\u7247\u6BD4\u8F83",imageBefore:"\u6240\u9009\u7236\u63D0\u4EA4",imageAfter:"\u6240\u9009\u63D0\u4EA4",imageAbsent:"\u6B64\u4FA7\u6CA1\u6709\u6587\u4EF6\u3002",imageInvalid:"\u56FE\u7247\u54CD\u5E94\u65E0\u6548\u3002",imageMetadata:"\u9884\u89C8\u5DF2\u79FB\u9664\u9644\u52A0\u5143\u6570\u636E\u3002",imageScope:"\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u4E0E 8 \u4F4D\u5355\u626B\u63CF baseline JPEG \u666E\u901A\u6587\u4EF6\uFF08\u4E0D\u652F\u6301\u6E10\u8FDB\u5F0F/CMYK\uFF09\uFF1B\u6BCF\u4FA7\u6700\u591A 2 MiB\u30011600 \u4E07\u50CF\u7D20\u3002\u5143\u6570\u636E\u88AB\u79FB\u9664\uFF0C\u4E0D\u9002\u7528\u4E8E\u8272\u5F69\u7CBE\u786E\u6027\u5BA1\u9605\u3002\u652F\u6301\u5386\u53F2\u63D0\u4EA4\u3001\u56FA\u5B9A A/B \u53CA Git \u5DE5\u4F5C\u533A\uFF1B\u6309\u6240\u9009\u6A21\u5F0F\u8BFB\u53D6 HEAD\u3001\u6682\u5B58\u533A\u6216\u5DE5\u4F5C\u6587\u4EF6\u3002\u51B2\u7A81\u56FE\u7247\u4E0D\u652F\u6301\u3002",commitMessageLimit:"\u5B8C\u6574\u63D0\u4EA4\u8BF4\u660E\u8D85\u8FC7 2 MiB \u9884\u89C8\u4E0A\u9650\uFF0C\u5DF2\u7701\u7565\u3002",revisionLoadRefs:"\u52A0\u8F7D / \u5237\u65B0\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsScope:"\u4EC5\u672C\u5730\u5206\u652F\u548C\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\uFF0C\u6700\u591A 1000 \u6761\uFF1B\u4E0D fetch\u3002\u9009\u62E9\u56FA\u5B9A\u4E3A\u52A0\u8F7D\u65F6\u7684\u63D0\u4EA4 OID\uFF1B\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5DF2\u9009\u7248\u672C\u3002",revisionRefsEmpty:"\u6CA1\u6709\u53EF\u7528\u7684\u672C\u5730\u5206\u652F\u6216\u63D0\u4EA4\u6807\u7B7E\u3002",revisionLoadedCommits:"\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4",revisionLocalRefs:"\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{blameOriginLine:"View origin historical line",blameUnmapped:"Origin line cannot be located precisely",blamePrevious:"Previous line page",blameNext:"Next line page",fileHistoryMergeBoundary:"Identity boundary: merge commit; stopped without inferring parent origin",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow exact renames (first-parent)",fileHistoryFollowScope:"Only Git-detected 100% renames. No identity inference for similarity, copies or merge-parent origins. Stops at creation; output/runtime bounded. Each row uses its historical path.",graphLaneLimit:"At most 32 lanes. Overflow geometry is omitted; loaded nodes and relations remain available as text.",historyBranch:"History tip (local reference)",historyPinned:"Pinned snapshot",historyBranchScope:"Load references manually below. Selection pins that OID; refreshing references does not move the history tip. Selecting HEAD reads current HEAD without checking out.",historyServerSearch:"Full history query",historyServerScope:"Search all history reachable from the pinned snapshot. Message/author use case-insensitive literal matching; path is an exact path or directory, without rename following. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServerApply:"Run query",historyServerClear:"Clear query",historyServerActive:"Submitted query",reviewView:"Review view",workspaceView:"Working changes",workspaceRoot:"Workspace root",title:"VCS changes",readonly:"Read-only preview",refresh:"Refresh",back:"Back to chat",all:"All changes",staged:"Staged",unstaged:"Unstaged",search:"Filter files\u2026",noSession:"Open a project session to inspect its changes.",noRepo:"No Git / SVN repositories discovered. Try a relative subdirectory and rescan.",clean:"No changes",pick:"Select a file to review",loading:"Loading\u2026",side:"Side by side",inline:"Inline",whitespace:"Ignore trim whitespace",wrap:"Word wrap",previous:"Previous change",next:"Next change",content:"Content",properties:"Properties",binary:"Binary or restricted content cannot be compared as text",changes:"changes",files:"files",list:"Flat",tree:"Tree",emptySearch:"No matching files",session:"Session directory",M:"Modified",A:"Added",D:"Deleted",R:"Renamed",C:"Copied",U:"Conflict","?":"Untracked",P:"Property",error:"Failed to read",retry:"Retry",stale:"Content changed. Refresh and try again.",repositories:"Repositories",allRepositories:"All repositories",gitMode:"Git changes",svnBase:"SVN \xB7 BASE \u2194 Working Copy",subdirectory:"Relative subdirectory (optional)",rescan:"Rescan repositories",scanHint:"Scan current directory and immediate children only \xB7 cache expires after 5 minutes",truncated:"Discovery limit reached. Enter a relative subdirectory and rescan to include another location.",fallback:"Advanced editor unavailable. Showing basic side-by-side text comparison.",diagnostics:"Loading diagnostics",approximate:"Large content: approximate line alignment.",textTruncated:"Only the first 2000 lines are displayed.",textBefore:"Before",textAfter:"After",textReadonly:"Read-only text comparison",textEmpty:"Both versions are empty.",commitDetails:"Commit details",commitFileSearch:"Filter files in this commit",commitParent:"Compare parent",commitRoot:"Empty baseline (root commit)",commitNoChanges:"No file changes against this baseline",history:"Commit history",historyAdvanced:"Load advanced read-only diff",historyBasic:"Return to basic text diff",historyListOnly:"Local HEAD history. Select a commit and file to view a read-only text diff.",historyEmpty:"No commits yet",historyRefsScope:"Labels reflect the last manually loaded local refs, not branches at commit creation. Failed refreshes retain the last successful result.",historyRefsLabel:"Loaded local references",historyRefsMore:"Additional references",historySearch:"Filter loaded commits (author / subject / SHA)",historyNoMatch:"No matches in loaded commits; you can load more if available.",historyMore:"Load more commits",historyLimit:"History browsing limit reached; older commits are not shown.",autoRefresh:"Refresh manually or on window focus",comparisonContext:"Comparison context",encoding:"Encoding",before:"Before",after:"After",filterStatus:"Filter by status",allFiles:"All files",previousFile:"Previous file",nextFile:"Next file",expandAll:"Expand all",collapseAll:"Collapse all",revealSelected:"Reveal current file",reviewPosition:"File {index} of {total}",clearFilters:"Clear filters",searchShortcut:"Ctrl / \u2318 + F to search; Esc clears search",fileShortcut:"Alt + \u2190 / \u2192 switches the previous or next file",copyPath:"Copy path",copied:"Copied",pathCopied:"File path copied to the clipboard.",copyFailed:"Unable to copy the file path.",binaryComparison:"({files})",revisionTitle:"Local A/B revision comparison",revisionScope:"Choose loaded commits or manually load local branches and tags. Compare A \u2192 B directly, not via merge-base.",revisionBase:"A (left)",revisionTarget:"B (right)",revisionSwap:"Swap A/B",revisionEmpty:"No file changes between these revisions.",fileHistory:"Path history",fileHistoryScope:"Exact-path history at the pinned commit; no rename following, including deletion and recreation. Selecting a commit opens its Diff only for a unique same-path change against the first parent (empty tree for a root); otherwise only details are shown.",blame:"Blame",blameNavigation:"Select an attributed commit to view details with its first parent selected; no automatic historical file or line navigation.",blameScope:"UTF-8 regular text at the selected commit, first 500 lines at most. Working changes are excluded.",blameLimit:"Only the first 500 lines are shown; result truncated.",blameEmpty:"No source lines to display.",blameLine:"Line",blameCommit:"Commit",blameAuthor:"Author",blameSummary:"Summary",blameSource:"Source",historicalTree:"Historical tree",historicalTreeScope:"Entries at the selected commit; 100 per page. Select regular files for read-only preview; symlinks and submodules are not followed.",treePreview:"Historical file preview",treeClose:"Close file preview",treeEmpty:"Empty file or no displayable text.",treeSearch:"Filter names in this directory",treeBreadcrumbs:"Historical directory path",treeUp:"Parent directory",treeEntries:"entries",treePrevious:"Previous page",treeNext:"Next page",historyGraph:"Local commit graph",graphScope:"First 200 loaded commits, at most 1000 parent edges. Independent of text filtering; not a complete branch graph. Select a node for details.",graphLimit:"Node or edge limit reached; some relationships are omitted.",graphMissing:"Parent outside this graph",graphRelations:"Parent relationships (text)",graphInvalid:"Cannot graph this commit order; use the history list.",imageCompare:"PNG image comparison",imageBefore:"Selected parent",imageAfter:"Selected commit",imageAbsent:"No file on this side.",imageInvalid:"Invalid image response.",imageMetadata:"Ancillary metadata was removed from this preview.",imageScope:"Non-interlaced static PNG or 8-bit single-scan baseline JPEG regular files (no progressive/CMYK); at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Supports commits, fixed A/B and Git working changes; HEAD, index or working bytes follow the selected mode. Conflicted images are unsupported.",commitMessageLimit:"Full commit message exceeds the 2 MiB preview limit and was omitted.",revisionLoadRefs:"Load / refresh local branches and tags",revisionRefsScope:"Local branches and commit tags only, at most 1000 refs; no fetch. Selections pin the loaded commit OID; refreshing refs does not move selected versions.",revisionRefsEmpty:"No local branches or commit tags are available.",revisionLoadedCommits:"Loaded commits",revisionLocalRefs:"Local branches and tags",revisionRefsCount:"Selectable references loaded"}};function Yt(t,e,s,i){let o=t.target;if(!e?.contains(o)||t.defaultPrevented||t.isComposing||o?.closest?.(".monaco-editor")||o?.closest?.(".vcs-history"))return null;if(t.key==="Escape"&&o===s&&i)return"clear";let l=o?.isContentEditable||o?.closest?.('input,textarea,select,[role="textbox"]');if(l&&o!==s)return null;if((t.ctrlKey||t.metaKey)&&!t.altKey&&!t.shiftKey&&t.key?.toLowerCase()==="f")return"search";if(!l&&t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){if(t.key==="ArrowLeft")return"previous";if(t.key==="ArrowRight")return"next"}return null}var Qt=t=>"dsh-vcs:project:v1:"+t;function Xt(t,e){if(!t)return"";try{let s=(e??globalThis.localStorage)?.getItem(Qt(t));return typeof s=="string"&&s.length<=1024?s:""}catch{return""}}function $t(t,e,s){if(!(!t||!e))try{(s??globalThis.localStorage)?.setItem(Qt(t),e)}catch{}}function Rt(t,e=""){return t.find(s=>s.id===e)?.id||t.find(s=>s.relativePath===".")?.id||t[0]?.id||""}var He=(t,e)=>JSON.stringify([t,e]),Be=(t,e=".")=>[t.type.toUpperCase(),t.relativePath==="."?e:t.relativePath||".",t.branch].filter(Boolean).join(" \xB7 "),Ge=(t,e="all")=>t.type==="git"&&["staged","unstaged"].includes(e)?e:"all",Zt=(t="",e="")=>t===e?0:t<e?-1:1;function ft(t=[]){let e={id:"",name:"",directories:new Map,files:[],count:0};for(let i of t){let o=String(i.path||"").split("/").filter(Boolean);if(!o.length)continue;let l=e;for(let m of o.slice(0,-1)){let c=l.id?l.id+"/"+m:m;l.directories.has(m)||l.directories.set(m,{id:c,name:m,directories:new Map,files:[],count:0}),l=l.directories.get(m),l.count++}l.files.push(i)}let s=i=>({...i,directories:[...i.directories.values()].sort((o,l)=>Zt(o.name,l.name)).map(s),files:[...i.files].sort((o,l)=>Zt(o.path,l.path))});return s(e)}function er(t=[],e){let s=t.findIndex(i=>i.id===e);return{index:s<0?0:s+1,total:t.length}}function tr(t=[],e,s){if(!t.length||!["previous","next"].includes(s))return null;let i=t.findIndex(m=>m.id===e),o=s==="next"?1:-1,l=i<0?s==="next"?-1:0:i;return t[(l+o+t.length)%t.length]||null}function rr(t=""){let e=String(t).split("/").filter(Boolean);return e.slice(0,-1).map((s,i)=>e.slice(0,i+1).join("/"))}function mt(t,e=[]){for(let s of t?.directories||[])e.push(s.id),mt(s,e);return e}function or(t=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[t]||t}function ir(t=[]){return t.reduce((e,s)=>{let i=or(s.status);return e.all++,e[i]=(e[i]||0)+1,e},{all:0})}function Kr(t=[],e="",s="all"){let i=e.toLowerCase();return t.filter(o=>(s==="all"||or(o.status)===s)&&o.path.toLowerCase().includes(i)).sort((o,l)=>o.path.localeCompare(l.path))}function sr(t,e,s="",i="all"){return t.map(o=>({...e[o.id],repository:o,changes:Kr(e[o.id]?.changes,s,i)}))}function nr(t,e,s=""){if(!s||!t||t.cwd!==e.cwd)return e;let i=new Map(t.repositories.map(o=>[o.id,o]));for(let o of e.repositories)i.set(o.id,o);return{...e,repositories:[...i.values()],truncated:t.truncated||e.truncated,warnings:[...t.warnings||[],...e.warnings||[]]}}function ar(t=2){if(!Number.isInteger(t)||t<1||t>2)throw new RangeError("Status concurrency must be 1 or 2");let e=0,s=[];function i(){for(;e<t&&s.length;){let o=s.shift();if(o.signal?.removeEventListener("abort",o.abort),o.signal?.aborted){o.reject(new Error("Aborted"));continue}e++,Promise.resolve().then(()=>{if(o.signal?.aborted)throw new Error("Aborted");return o.run()}).then(o.resolve,o.reject).finally(()=>{e--,i()})}}return(o,l)=>new Promise((m,c)=>{let d={run:o,signal:l,resolve:m,reject:c,abort:null};if(d.abort=()=>{let n=s.indexOf(d);n>=0&&(s.splice(n,1),c(new Error("Aborted")))},l?.aborted){c(new Error("Aborted"));return}l?.addEventListener("abort",d.abort,{once:!0}),s.push(d),i()})}var lr={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},dr=t=>new URL("vcs-assets/"+t,document.baseURI).href;function cr(){return r.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},r.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),r.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var Yr=["slots","layout","locale","connection","uiSession"];function Qr(t){t.effect(()=>t.locale.register("local.vcs",Kt));let e=t.locale.bind("local.vcs"),s=ar(2);async function i(c,d,n){let p=await t.connection.rpc.call("/vcs-rpc",c,d,n);if(!p.ok){let h=new Error(p.error?.message||String(p.error||e("error")));throw h.code=p.error?.code,h}return p.value}function o(c){let d=c.useSessions(n=>Object.values(n.byId).find(p=>(p.retainedBy.mainView??0)>0));return r.default.createElement(l,{key:JSON.stringify([d?.id,d?.cwd])},r.default.createElement(m,{session:d}))}class l extends r.default.Component{state={error:null};static getDerivedStateFromError(d){return{error:d}}render(){return this.state.error?r.default.createElement("section",{className:"vcs-root"},r.default.createElement("style",null,it),r.default.createElement("div",{className:"vcs-message vcs-error"},e("error"),r.default.createElement("button",{onClick:()=>this.setState({error:null})},e("retry")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")))):this.props.children}}function m({session:c}){(0,r.useSyncExternalStore)(a=>t.locale.subscribe(a),()=>t.locale.getSnapshot(),()=>t.locale.getSnapshot());let d=c?.id,[n,p]=(0,r.useState)("all"),[h,k]=(0,r.useState)(0),[y,D]=(0,r.useState)(0),[u,C]=(0,r.useState)(null),[v,g]=(0,r.useState)({}),[f,x]=(0,r.useState)(()=>Xt(c?.cwd)),[S,E]=(0,r.useState)(0),[N,T]=(0,r.useState)(""),[K,le]=(0,r.useState)(""),[I,re]=(0,r.useState)(null),[P,oe]=(0,r.useState)(null),[$,ge]=(0,r.useState)(!1),[de,ve]=(0,r.useState)(!1),[R,L]=(0,r.useState)(""),[J,Y]=(0,r.useState)(""),[Q,ht]=(0,r.useState)(""),[gt,vt]=(0,r.useState)(!1),[se,ze]=(0,r.useState)(""),[De,bt]=(0,r.useState)("all"),[ce,yt]=(0,r.useState)(!0),[xt,_e]=(0,r.useState)({}),[be,pr]=(0,r.useState)(!0),[Ve,ur]=(0,r.useState)(!1),[Ke,fr]=(0,r.useState)(!1),[Oe,ye]=(0,r.useState)("content"),[wt,St]=(0,r.useState)(0),[mr,kt]=(0,r.useState)(!1),[Ye,Qe]=(0,r.useState)({added:0,deleted:0,count:0}),[Z,Ct]=(0,r.useState)(!1),Nt=(0,r.useRef)(null),Et=(0,r.useRef)(null),pe=(0,r.useRef)(null),Xe=(0,r.useRef)(null),Me=(0,r.useRef)(null),$e=(0,r.useRef)(null),Lt=(0,r.useRef)(null),xe=(0,r.useRef)(null),Ze=(0,r.useRef)(null),Re=(0,r.useRef)(null),et=(0,r.useRef)(!1),Fe=(0,r.useRef)(!1),ne=u?.repositories||[],ue=ne.filter(a=>a.id===f),ee=mr&&ue.some(a=>a.type==="git"),hr=()=>{xe.current?.abort(),oe(null),re(null),Y(""),kt(!0)};(0,r.useEffect)(()=>{ne.some(a=>a.id===f)&&$t(c?.cwd,f)},[c?.cwd,f,u]);let we=()=>{Lt.current?.abort(),xe.current?.abort(),oe(null),re(null),Y(""),ye("content"),Qe({added:0,deleted:0,count:0})},Te=()=>{Fe.current=!1,we(),Ze.current?.abort(),Re.current=u,C(null),g({}),le(N.trim()),E(a=>a+1)},je=()=>{Fe.current||(Fe.current=!0,we(),Ze.current?.abort(),Re.current=null,C(null),g({}),le(""),E(a=>a+1))},At=(a=!1)=>{a||D(w=>w+1),et.current=a,a||we(),a||g({}),k(w=>w+1)};(0,r.useEffect)(()=>{let a=new AbortController;return Ze.current=a,L(""),ge(!!d),d&&i("vcs/repositories",{sessionId:d,...K?{subdirectory:K}:{}},a.signal).then(w=>{if(!a.signal.aborted){let O=nr(Re.current,w,K);Fe.current=!1,x(q=>Rt(O.repositories,q)),C(O)}}).catch(w=>{a.signal.aborted||L(w.message)}).finally(()=>{a.signal.aborted||ge(!1)}),()=>a.abort()},[d,S,K]),(0,r.useEffect)(()=>{let a=new AbortController,w=et.current;Lt.current=a,et.current=!1,w||(g({}),Y(""));for(let O of ue){let q=Ge(O,n);s(()=>i("vcs/status",{sessionId:d,repositoryId:O.id,mode:q},a.signal),a.signal).then(z=>{a.signal.aborted||g(te=>({...te,[O.id]:{...z,mode:q}}))}).catch(z=>{if(!a.signal.aborted){if(z.code==="vcs/rediscover-required"){je();return}g(te=>({...te,[O.id]:{error:z.message,changes:[],mode:q}}))}})}return()=>a.abort()},[d,u,f,n,h]),(0,r.useEffect)(()=>{let a=w=>{w.target===window&&d&&f&&document.visibilityState==="visible"&&At(!0)};return window.addEventListener("focus",a),()=>window.removeEventListener("focus",a)},[d,f,n]);let Se=ne.find(a=>a.id===I?.repositoryId),fe=I?v[I.repositoryId]:null;(0,r.useEffect)(()=>{let a=new AbortController;return xe.current=a,oe(null),Y(""),Qe({added:0,deleted:0,count:0}),ye("content"),ve(!!I&&!!fe),!ee&&I&&fe&&Se&&i("vcs/compare",{sessionId:d,repositoryId:I.repositoryId,mode:Ge(Se,n),id:I.id},a.signal).then(w=>{a.signal.aborted||oe(w)}).catch(w=>{if(!a.signal.aborted){if(w.code==="vcs/rediscover-required"){je();return}Y(w.message)}}).finally(()=>{a.signal.aborted||ve(!1)}),()=>a.abort()},[I,fe,d,n,ee]),(0,r.useEffect)(()=>{let a=!1,w,O=new AbortController;Ct(!1),ht("");let q=document.createElement("link");return q.rel="stylesheet",q.href=dr("editor.css"),document.head.appendChild(q),qe(dr("editor.js")+"?v="+encodeURIComponent(Je)+"&retry="+wt,{signal:O.signal}).then(z=>{a||(w=z.createDiff(Et.current,{onStats:Qe}),pe.current=w,Ct(!0))}).catch(z=>{a||ht(z.message)}),()=>{a=!0,O.abort(),w?.dispose(),pe.current=null,q.remove()}},[wt]),(0,r.useEffect)(()=>{Z&&P&&!P.binary&&pe.current?.setContent(P,JSON.stringify([d,u?.cwd,I?.repositoryId,n,I?.id,P.path]))},[Z,P,d,u,I,n]),(0,r.useEffect)(()=>{pe.current?.options({sideBySide:be,ignoreWhitespace:Ve,wrap:Ke})},[Z,be,Ve,Ke]);let ke=sr(ue,v,se,De),me=ke.flatMap(a=>a.changes),gr=ir(fe?.changes),tt=er(me,I?.id),Pt=()=>{ze(""),bt("all")},vr=async()=>{let a=P?.path||ie?.path;if(a)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(a);else{let w=document.createElement("textarea");try{if(w.value=a,w.style.cssText="position:fixed;opacity:0",document.body.appendChild(w),w.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{w.remove()}}vt(!0),window.setTimeout(()=>vt(!1),1500)}catch{Y(e("copyFailed"))}};(0,r.useEffect)(()=>{let a=w=>{if(ee)return;let O=Yt(w,Nt.current,Me.current,!!se);O&&(w.preventDefault(),O==="search"?(Me.current?.focus(),Me.current?.select()):O==="clear"?ze(""):rt(O))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[se,me,I,ee]);let Ht=a=>_e(w=>{let O={...w};for(let q of ke)for(let z of mt(ft(q.changes)))O[q.repository.id+"\0"+z]=!a;return O}),br=()=>{let a=ie;!a||!I||(yt(!0),Pt(),_e(w=>{let O={...w};for(let q of rr(a.path))O[I.repositoryId+"\0"+q]=!1;return O}),$e.current=He(I.repositoryId,a.id))};(0,r.useEffect)(()=>{let a=$e.current;if(!a)return;let w=[...Xe.current?.querySelectorAll("button[data-vcs-change]")||[]].find(O=>O.dataset.vcsChange===a);w&&(w.scrollIntoView({block:"nearest"}),w.focus(),$e.current=null)},[ce,se,De,xt,ke]);let rt=a=>{let w=tr(me,I?.id,a);w&&(xe.current?.abort(),oe(null),ye("content"),re({repositoryId:f,id:w.id}))},Bt=$||ue.some(a=>!v[a.id]),ie=fe?.changes?.find(a=>a.id===I?.id),ae=P?.properties,ot=ae?[...new Set([...Object.keys(ae.left||{}),...Object.keys(ae.right||{})])].filter(a=>ae.left?.[a]!==ae.right?.[a]):[],Ce=a=>lr[a?.status]||a?.status?.slice(0,1).toUpperCase()||"M",Dt=P?.binary?[P.left.label,P.right.label].filter(Boolean).join(" \u2194 "):"",he=J||(de?e("loading"):d?Bt&&!ie?e("loading"):R||(ne.length?ie?P?.binary?e("binary")+(Dt?" "+e("binaryComparison",{files:Dt}):""):P?!Z&&!Q?e("loading"):"":e("pick"):e("pick"):e("noRepo")):e("noSession")),yr=a=>{let w=Xe.current,O=w?[...w.querySelectorAll("button[data-vcs-item]")]:[],q=O.indexOf(a.target);if(q<0)return;let z;if(a.key==="ArrowDown")z=O[q+1];else if(a.key==="ArrowUp")z=O[q-1];else if(a.key==="Home")z=O[0];else if(a.key==="End")z=O.at(-1);else if(a.key==="ArrowRight"&&a.target.dataset.vcsDirectory==="closed"){a.preventDefault(),a.target.click();return}else if(a.key==="ArrowLeft"&&a.target.dataset.vcsDirectory==="open"){a.preventDefault(),a.target.click();return}else return;a.preventDefault(),z?.focus()},Ot=({entry:a,compact:w=!1,depth:O=0})=>{let q=a.path.lastIndexOf("/");return r.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":He(f,a.id),"aria-current":I?.repositoryId===f&&I?.id===a.id?"true":void 0,style:{paddingInlineStart:8+O*14},title:(a.oldPath?a.oldPath+" \u2192 ":"")+a.path+" \xB7 "+e(Ce(a)),onClick:()=>{xe.current?.abort(),oe(null),ye("content"),re({repositoryId:f,id:a.id})}},r.default.createElement("span",{className:"vcs-status","data-status":Ce(a)},Ce(a)),r.default.createElement("span",{className:"vcs-filename"},w?a.path.slice(q+1):a.path,a.oldPath&&r.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",a.oldPath)))},Mt=({node:a,repository:w,depth:O=0})=>r.default.createElement(r.default.Fragment,null,a.directories.map(q=>{let z=w.id+"\0"+q.id,te=!!xt[z];return r.default.createElement(r.default.Fragment,{key:z},r.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":te?"closed":"open","aria-expanded":!te,style:{paddingInlineStart:8+O*14},onClick:()=>_e(xr=>({...xr,[z]:!te}))},r.default.createElement("span",{"aria-hidden":"true"},te?"\u203A":"\u2304"),q.name,r.default.createElement("small",null,q.count)),!te&&r.default.createElement(Mt,{node:q,repository:w,depth:O+1}))}),a.files.map(q=>r.default.createElement(Ot,{key:He(w.id,q.id),entry:q,compact:a.id!=="",depth:O})));return r.default.createElement("section",{ref:Nt,className:"vcs-root","aria-label":e("title")},r.default.createElement("style",null,it),r.default.createElement("header",{className:"vcs-top"},r.default.createElement(cr,null),r.default.createElement("h1",{className:"vcs-title"},e("title")),r.default.createElement("span",{className:"vcs-badge"},e("readonly")),r.default.createElement("span",{className:"vcs-spacer"}),r.default.createElement("select",{"aria-label":e("repositories"),value:f,disabled:$||!ne.length,onChange:a=>{we(),g({}),x(a.target.value)}},!ne.length&&r.default.createElement("option",{value:""},e("repositories")),ne.map(a=>r.default.createElement("option",{key:a.id,value:a.id},Be(a,e("workspaceRoot"))))),r.default.createElement("label",{className:"vcs-mode"},e("gitMode")," ",r.default.createElement("select",{"aria-label":e("gitMode"),value:n,disabled:ee||!ue.some(a=>a.type==="git"),onChange:a=>{we(),g({}),p(a.target.value)}},["all","unstaged","staged"].map(a=>r.default.createElement("option",{key:a,value:a},e(a))))),r.default.createElement("button",{onClick:()=>At(!1),disabled:Bt||!d},e("refresh")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")),r.default.createElement("div",{className:"vcs-path",title:u?.cwd||c?.cwd},e("session"),": ",u?.cwd||c?.cwd||"\u2014"),r.default.createElement("form",{className:"vcs-discovery",onSubmit:a=>{a.preventDefault(),Te()}},r.default.createElement("input",{"aria-label":e("subdirectory"),placeholder:e("subdirectory"),value:N,onChange:a=>T(a.target.value)}),r.default.createElement("button",{disabled:!d||$},e("rescan")),r.default.createElement("span",null,e("scanHint"))),u?.truncated&&r.default.createElement("div",{className:"vcs-notice"},e("truncated")),(u?.warnings||[]).map((a,w)=>r.default.createElement("div",{className:"vcs-notice",key:w},typeof a=="string"?a:a.message||JSON.stringify(a)))),ue.some(a=>a.type==="git")&&r.default.createElement(r.default.Fragment,null,r.default.createElement("nav",{className:"vcs-review-views","aria-label":e("reviewView")},r.default.createElement("button",{"aria-pressed":!ee,onClick:()=>kt(!1)},e("workspaceView")),r.default.createElement("button",{"aria-pressed":ee,"aria-expanded":ee,onClick:hr},e("history"))),ee&&r.default.createElement(ut,{key:JSON.stringify([d,f,y,S]),sessionId:d,repositoryId:f,rpc:i,t:e,onRediscover:je})),r.default.createElement("div",{className:"vcs-body",hidden:ee,"aria-label":e("workspaceView")},r.default.createElement("aside",{className:"vcs-files"},r.default.createElement("div",{className:"vcs-filter"},r.default.createElement("input",{ref:Me,"aria-label":e("search"),placeholder:e("search"),title:e("searchShortcut"),value:se,onChange:a=>ze(a.target.value)}),(se||De!=="all")&&r.default.createElement("button",{className:"vcs-clear-filter",onClick:Pt},e("clearFilters"))),r.default.createElement("div",{className:"vcs-status-filter","aria-label":e("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(a=>r.default.createElement("button",{key:a,"aria-pressed":De===a,onClick:()=>bt(a)},e(a==="all"?"allFiles":lr[a]||"M")," ",r.default.createElement("small",null,gr[a]||0)))),r.default.createElement("div",{className:"vcs-count"},r.default.createElement("span",null,me.length," ",e("files")),r.default.createElement("span",{className:"vcs-auto"},e("autoRefresh")),r.default.createElement("button",{"aria-pressed":ce,onClick:()=>yt(!ce)},e(ce?"tree":"list"))),ce&&r.default.createElement("div",{className:"vcs-tree-actions"},r.default.createElement("button",{onClick:()=>Ht(!0)},e("expandAll")),r.default.createElement("button",{onClick:()=>Ht(!1)},e("collapseAll")),r.default.createElement("button",{onClick:br,disabled:!ie},e("revealSelected"))),r.default.createElement("nav",{className:"vcs-filelist","aria-label":e("title"),ref:Xe,onKeyDown:yr},ke.map(a=>{let w=a.repository;return r.default.createElement("section",{className:"vcs-repository",key:w.id,"aria-label":Be(w,e("workspaceRoot"))},r.default.createElement("div",{className:"vcs-repository-heading",title:w.root},r.default.createElement("strong",null,Be(w,e("workspaceRoot"))),r.default.createElement("small",null,w.type==="svn"?e("svnBase"):e(Ge(w,n)))),a.error?r.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},a.error,r.default.createElement("button",{onClick:Te},e("rescan"))):v[w.id]?ce?r.default.createElement(Mt,{node:ft(a.changes),repository:w}):a.changes.map(O=>r.default.createElement(Ot,{key:He(w.id,O.id),entry:O})):r.default.createElement("div",{className:"vcs-message"},e("loading")),!a.error&&v[w.id]&&!a.changes.length&&r.default.createElement("div",{className:"vcs-message"},e(se?"emptySearch":"clean")))}),!ke.length&&r.default.createElement("div",{className:"vcs-message"},$?e("loading"):R||e(d?"noRepo":"noSession"),R&&r.default.createElement("button",{onClick:Te},e("rescan"))))),r.default.createElement("main",{className:"vcs-detail"},r.default.createElement("div",{className:"vcs-filehead"},r.default.createElement("strong",{title:P?.path||ie?.path},Se?Be(Se,e("workspaceRoot"))+" / ":"",P?.path||ie?.path||e("pick")),r.default.createElement("button",{className:"vcs-copy-path",disabled:!(P?.path||ie?.path),onClick:vr},e(gt?"copied":"copyPath")),gt&&r.default.createElement("span",{className:"vcs-sr-only",role:"status"},e("pathCopied")),r.default.createElement("span",{className:"vcs-spacer"}),P&&!P.binary&&Z&&r.default.createElement(r.default.Fragment,null,r.default.createElement("span",{className:"vcs-add"},"+",Ye.added),r.default.createElement("span",{className:"vcs-del"},"\u2212",Ye.deleted))),Q&&r.default.createElement("div",{className:"vcs-notice",role:"status"},e("fallback")," ",r.default.createElement("button",{onClick:()=>St(a=>a+1)},e("retry")),r.default.createElement("details",null,r.default.createElement("summary",null,e("diagnostics")),Q)),P&&r.default.createElement("div",{className:"vcs-context","aria-label":e("comparisonContext")},r.default.createElement("span",{className:"vcs-context-status","data-status":Ce(P)},e(Ce(P))),P.oldPath&&r.default.createElement("span",{className:"vcs-context-rename",title:P.oldPath+" \u2192 "+P.path},P.oldPath," ",r.default.createElement("b",null,"\u2192")," ",P.path),r.default.createElement("span",null,P.left.label||"\u2014"," ",r.default.createElement("b",null,"\u2194")," ",P.right.label||"\u2014"),(P.left.encoding||P.right.encoding)&&r.default.createElement("span",null,e("encoding"),": ",P.left.encoding||"\u2014"," / ",P.right.encoding||"\u2014")),P&&Se?.type==="git"&&r.default.createElement(Ee,{key:JSON.stringify([d,u?.cwd,I.repositoryId,n,I.id,h,fe]),workspace:!0,sessionId:d,repositoryId:I.repositoryId,mode:n,id:I.id,rpc:i,t:e,onRediscover:je}),P?.notice&&r.default.createElement("div",{className:"vcs-notice"},P.notice),ot.length>0&&r.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(a=>r.default.createElement("button",{key:a,"aria-pressed":Oe===a,onClick:()=>ye(a)},e(a),a==="properties"?" ("+ot.length+")":""))),r.default.createElement("div",{className:"vcs-labels"},r.default.createElement("span",null,P?.left.label||"\u2014",P?.left.encoding?" \xB7 "+P.left.encoding:""),r.default.createElement("span",null,P?.right.label||"\u2014",P?.right.encoding?" \xB7 "+P.right.encoding:"")),r.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!he||Oe!=="content",style:Oe==="properties"?{display:"none"}:void 0},r.default.createElement("div",{className:"vcs-editor",ref:Et,style:Q?{display:"none"}:void 0}),Q&&P&&!P.binary&&!he&&r.default.createElement(Ne,{comparison:P,labels:Ie(e)}),he&&r.default.createElement("div",{className:"vcs-message "+(R||J||Q?"vcs-error":""),role:"status"},he,(R||J||Q)&&r.default.createElement("button",{onClick:()=>Q?St(a=>a+1):Te()},e(Q?"retry":"rescan")))),Oe==="properties"&&r.default.createElement("div",{className:"vcs-properties"},r.default.createElement("table",null,r.default.createElement("thead",null,r.default.createElement("tr",null,r.default.createElement("th",null,e("properties")),r.default.createElement("th",null,P?.left.label||e("before")),r.default.createElement("th",null,P?.right.label||e("after")))),r.default.createElement("tbody",null,ot.map(a=>r.default.createElement("tr",{key:a},r.default.createElement("th",null,a),r.default.createElement("td",null,ae.left?.[a]??"\u2014"),r.default.createElement("td",null,ae.right?.[a]??"\u2014")))))),r.default.createElement("footer",{className:"vcs-toolbar"},r.default.createElement("button",{disabled:!Z,"aria-pressed":be,onClick:()=>pr(!be)},e(be?"side":"inline")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Z,checked:Ve,onChange:a=>ur(a.target.checked)}),e("whitespace")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Z,checked:Ke,onChange:a=>fr(a.target.checked)}),e("wrap")),r.default.createElement("span",{className:"vcs-spacer"}),Z&&r.default.createElement("span",null,Ye.count," ",e("changes")),r.default.createElement("button",{disabled:!Z||!P||!!he,onClick:()=>pe.current?.navigate("previous")},e("previous")),r.default.createElement("button",{disabled:!Z||!P||!!he,onClick:()=>pe.current?.navigate("next")},e("next")),tt.index>0&&r.default.createElement("span",{className:"vcs-review-position"},e("reviewPosition",{index:tt.index,total:tt.total})),r.default.createElement("span",{className:"vcs-toolbar-separator"}),r.default.createElement("button",{title:e("fileShortcut"),disabled:!me.length,onClick:()=>rt("previous")},e("previousFile")),r.default.createElement("button",{title:e("fileShortcut"),disabled:!me.length,onClick:()=>rt("next")},e("nextFile"))))))}t.slots.inject("main",()=>t.slots.register({name:"main",key:"local-vcs"},o)),t.slots.inject("sidebar.panellist",()=>t.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>e("title"),order:65},cr))}
95
+ `;var _=X(require("react"),1);function Tt(t){return t===""?[]:t.split(/\r\n|\n|\r/)}function jt(t="",e=""){let s=Tt(t),i=Tt(e),o=0;for(;o<s.length&&o<i.length&&s[o]===i[o];)o++;let l=0;for(;l<s.length-o&&l<i.length-o&&s[s.length-l-1]===i[i.length-l-1];)l++;let m=s.length-l,c=i.length-l,d=m-o,n=c-o,p=d&&n?(d+1)*(n+1):0,h=p>2e5,k=[],y=0;function D(u,C){y++,!(k.length>=2e3)&&k.push({left:u===null?null:{number:u+1,text:s[u]},right:C===null?null:{number:C+1,text:i[C]},kind:u===null?"insert":C===null?"delete":s[u]===i[C]?"equal":"replace"})}for(let u=0;u<o;u++)D(u,u);if(h||!d||!n)for(let u=0;u<Math.max(d,n);u++)D(u<d?o+u:null,u<n?o+u:null);else{let u=n+1,C=new Uint32Array(p);for(let f=d-1;f>=0;f--)for(let x=n-1;x>=0;x--)C[f*u+x]=s[o+f]===i[o+x]?C[(f+1)*u+x+1]+1:Math.max(C[(f+1)*u+x],C[f*u+x+1]);let v=0,g=0;for(;v<d||g<n;)v<d&&g<n&&s[o+v]===i[o+g]?D(o+v++,o+g++):v<d&&(g===n||C[(v+1)*u+g]>=C[v*u+g+1])?D(o+v++,null):D(null,o+g++)}for(let u=0;u<l;u++)D(m+u,c+u);return{rows:k,approximate:h,truncated:y>k.length,totalRows:y,omittedRows:y-k.length,leftLineCount:s.length,rightLineCount:i.length,lcsCells:h?0:p}}var Hr={before:"Before",after:"After",readonly:"Read-only text comparison",approximate:"Approximate alignment: the changed region is too large for exact matching; lines are paired by position.",truncated:"Preview truncated to the first 2,000 aligned lines; additional lines are not shown.",empty:"Both versions are empty."},st={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Br={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Dr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Or={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Ne({comparison:t,labels:e={}}){let s=t?.left?.text??"",i=t?.right?.text??"",o=(0,_.useMemo)(()=>jt(s,i),[s,i]),l=c=>e[c]??Hr[c],m=(c,d,n)=>{let p=c&&n!=="equal";return _.default.createElement("td",{style:{...st,background:p?d==="left"?"#d6454520":"#259b4920":void 0}},_.default.createElement("div",{style:Br},_.default.createElement("span",{style:Dr},c?.number??""),_.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},p?d==="left"?"\u2212":"+":""),_.default.createElement("pre",{style:Or},c?.text??"")))};return _.default.createElement("section",{className:"vcs-text-comparison","aria-label":l("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},o.approximate&&_.default.createElement("div",{role:"status",style:{padding:8}},l("approximate")),o.truncated&&_.default.createElement("div",{role:"status",style:{padding:8}},l("truncated")," (",2e3," / ",o.totalRows,")"),_.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},_.default.createElement("thead",null,_.default.createElement("tr",null,_.default.createElement("th",{scope:"col",style:{...st,padding:8,overflowWrap:"anywhere"}},t?.left?.label||l("before")),_.default.createElement("th",{scope:"col",style:{...st,padding:8,overflowWrap:"anywhere"}},t?.right?.label||l("after")))),_.default.createElement("tbody",null,o.rows.map((c,d)=>_.default.createElement("tr",{key:d,"data-kind":c.kind},m(c.left,"left",c.kind),m(c.right,"right",c.kind))))),!o.rows.length&&_.default.createElement("p",{style:{padding:8}},l("empty")))}var j=X(require("react"),1);function Ut(t,{width:e,height:s,signal:i,timeoutMs:o=1e4,createURL:l=d=>URL.createObjectURL(d),revokeURL:m=d=>URL.revokeObjectURL(d),createImage:c=()=>new Image}={}){return new Promise((d,n)=>{if(i?.aborted){n(i.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(t?.type)||t.size>2*1024*1024||!Number.isInteger(e)||!Number.isInteger(s)||e<1||s<1||e>8192||s>8192||e*s>16e6||!Number.isFinite(o)||o<=0){n(new Error("Invalid image preview"));return}let p,h,k,y=!1,D=!1,u=()=>{D||(D=!0,h&&(h.src=""),p&&m(p))},C=()=>{clearTimeout(k),i?.removeEventListener("abort",g)},v=f=>{y||(y=!0,C(),u(),n(f))},g=()=>v(i.reason||new Error("Image cancelled"));try{p=l(t),h=c(),i?.addEventListener("abort",g,{once:!0}),k=setTimeout(()=>v(new Error("Image decode timed out")),o),h.src=p,Promise.resolve(h.decode()).then(()=>{if(!y){if(i?.aborted){g();return}if(h.naturalWidth!==e||h.naturalHeight!==s){v(new Error("Image dimensions mismatch"));return}y=!0,C(),d({url:p,dispose:u})}},v)}catch(f){v(f)}})}function Mr({side:t,sessionId:e,repositoryId:s,commit:i,parentIndex:o,base:l,target:m,workspace:c=!1,mode:d,id:n,rpc:p,t:h,onRediscover:k}){let[y,D]=(0,j.useState)(null),[u,C]=(0,j.useState)(""),[v,g]=(0,j.useState)(0);return(0,j.useEffect)(()=>{let f=new AbortController,x;return D(null),C(""),(async()=>{let S=await p(c?"vcs/workspace-image":l?"vcs/revision-image":"vcs/commit-image",c?{sessionId:e,repositoryId:s,mode:d,id:n,side:t}:l?{sessionId:e,repositoryId:s,base:l,target:m,id:n,side:t}:{sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:n,side:t},f.signal);if(f.signal.aborted)return;if(S.absent){D(S);return}if(!["image/png","image/jpeg","image/webp"].includes(S.mime)||typeof S.base64!="string"||S.base64.length>2796204||!Number.isInteger(S.bytes)||S.bytes<1||S.bytes>2097152)throw Error(h("imageInvalid"));let E=atob(S.base64);if(E.length!==S.bytes)throw Error(h("imageInvalid"));let N=new Blob([Uint8Array.from(E,T=>T.charCodeAt(0))],{type:S.mime});if(x=await Ut(N,{width:S.width,height:S.height,signal:f.signal}),f.signal.aborted){x.dispose();return}D({...S,url:x.url})})().catch(S=>{f.signal.aborted||(C(S.message),S.code==="vcs/rediscover-required"&&k())}),()=>{f.abort(),x?.dispose()}},[t,e,s,i,o,l,m,c,d,n,v]),j.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(t==="left"?"imageBefore":"imageAfter")},j.default.createElement("h5",null,h(t==="left"?"imageBefore":"imageAfter")),u?j.default.createElement("p",{role:"alert"},u," ",j.default.createElement("button",{onClick:()=>g(f=>f+1)},h("retry"))):y?j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,j.default.createElement("code",null,y.commit)," \xB7 ",y.path),y.absent?j.default.createElement("p",null,h("imageAbsent")):j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,y.width," \xD7 ",y.height," \xB7 ",y.bytes," B"),j.default.createElement("img",{src:y.url,alt:y.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),y.metadataStripped&&j.default.createElement("p",null,h("imageMetadata")))):j.default.createElement("p",{role:"status"},h("loading")))}function Ee(t){let[e,s]=(0,j.useState)(!1);return j.default.createElement("div",null,j.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("imageCompare")),e&&j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,t.t("imageScope")),j.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(i=>j.default.createElement(Mr,{key:i,...t,side:i})))))}function We(t){return{before:t("textBefore"),after:t("textAfter"),readonly:t("textReadonly"),empty:t("textEmpty"),approximate:t("approximate"),truncated:t("textTruncated")}}var b=X(require("react"),1);function Wt(t){let e=new Map;for(let s of t){let i=e.get(s.commit);i||(i={names:[],hidden:0},e.set(s.commit,i)),i.names.length<3?i.names.push(s.name):i.hidden++}return e}var F=X(require("react"),1);var B=X(require("react"),1);var q=X(require("react"),1);var U=X(require("react"),1);function It({load:t,node:e,comparison:s,key:i,single:o=!1,onReady:l=()=>{},onError:m=()=>{}}){let c=new AbortController,d,n=!1,p=()=>{let k=d;d=void 0,k?.dispose()};return{done:Promise.resolve().then(()=>(c.signal.throwIfAborted(),t(c.signal))).then(k=>{n||(d=k.createDiff(e,{single:o}),d.setContent(s,i),n||l(d))}).catch(k=>{try{p()}finally{n||m(k)}}),dispose(){n||(n=!0,c.abort(),p())}}}async function Ie(t,{signal:e,fetcher:s=fetch,importer:i=o=>import(o)}={}){let o=await s(t,{credentials:"same-origin",cache:"no-cache",signal:e});if(!o.ok)throw new Error("Editor resource HTTP "+o.status+" ("+t+"). "+(o.status===401?"Refresh the authenticated DSH page.":o.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let l=o.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(l))throw new Error("Editor resource returned "+(l||"no Content-Type")+" instead of JavaScript.");return await o.arrayBuffer(),e?.throwIfAborted(),i(t)}var Je="0.3.61";function Le({comparison:t,identity:e,t:s,single:i=!1,line:o=null}){let l=(0,U.useRef)(null),m=(0,U.useRef)(null),[c,d]=(0,U.useState)(!0),[n,p]=(0,U.useState)(!1),[h,k]=(0,U.useState)(!1),[y,D]=(0,U.useState)(!0),[u,C]=(0,U.useState)(!1),[v,g]=(0,U.useState)("");return(0,U.useEffect)(()=>{if(C(!1),g(""),!y)return;let f=E=>new URL("vcs-assets/"+E,document.baseURI).href,x=document.createElement("link");x.rel="stylesheet",x.href=f("editor.css"),document.head.appendChild(x);let S=It({node:l.current,comparison:t,key:e,single:i,load:E=>Ie(f("editor.js")+"?v="+encodeURIComponent(Je)+"&retry=0",{signal:E}),onReady:E=>{m.current=E,C(!0)},onError:E=>g(E.message)});return()=>{m.current=null;try{S.dispose()}finally{x.remove()}}},[y,t,e,i]),(0,U.useEffect)(()=>{u&&i&&o&&m.current?.revealLine(o)},[u,i,o]),(0,U.useEffect)(()=>{u&&m.current?.options({sideBySide:c,ignoreWhitespace:n,wrap:h})},[u,c,n,h]),U.default.createElement("div",null,U.default.createElement("button",{"aria-pressed":y,onClick:()=>D(f=>!f)},s(y?"historyBasic":"historyAdvanced")),u&&!i&&U.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},U.default.createElement("button",{"aria-pressed":c,onClick:()=>d(f=>!f)},s(c?"side":"inline")),U.default.createElement("label",null,U.default.createElement("input",{type:"checkbox",checked:n,onChange:f=>p(f.target.checked)}),s("whitespace")),U.default.createElement("label",null,U.default.createElement("input",{type:"checkbox",checked:h,onChange:f=>k(f.target.checked)}),s("wrap")),U.default.createElement("button",{onClick:()=>m.current?.navigate("previous")},s("previous")),U.default.createElement("button",{onClick:()=>m.current?.navigate("next")},s("next"))),y&&!u&&!v&&U.default.createElement("p",{role:"status"},s("loading")),v&&U.default.createElement("p",{role:"status"},s("fallback")," ",v),U.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},U.default.createElement("div",{ref:l,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&U.default.createElement(Ne,{comparison:t,labels:We(s)})))}function Ae({sessionId:t,repositoryId:e,commit:s,path:i,rpc:o,t:l,onRediscover:m,onClose:c,line:d=null}){let[n,p]=(0,q.useState)(null),[h,k]=(0,q.useState)(""),[y,D]=(0,q.useState)(0);(0,q.useEffect)(()=>{let C=new AbortController;return p(null),k(""),o("vcs/tree-file",{sessionId:t,repositoryId:e,commit:s,path:i},C.signal).then(v=>{C.signal.aborted||p(v)}).catch(v=>{C.signal.aborted||(k(v.message),v.code==="vcs/rediscover-required"&&m())}),()=>C.abort()},[t,e,s,i,y]);let u=(0,q.useMemo)(()=>n?{path:i,left:{label:s,text:n.text||""},right:{label:s,text:n.text||""}}:null,[n,i,s]);return q.default.createElement("section",{"aria-label":l("treePreview")},q.default.createElement("h4",null,i),q.default.createElement("button",{onClick:c},l("treeClose")),q.default.createElement("p",null,q.default.createElement("code",null,s)),h?q.default.createElement("p",{role:"alert"},h," ",q.default.createElement("button",{onClick:()=>D(C=>C+1)},l("retry"))):n?q.default.createElement(q.default.Fragment,null,q.default.createElement("p",null,q.default.createElement("code",null,n.oid)," \xB7 ",l("encoding"),": ",n.encoding||"\u2014"),d&&q.default.createElement("p",{role:"status"},l("blameOriginLine"),": ",d,!n.text||d>n.text.split(`
96
+ `).length?" \xB7 "+l("blameUnmapped"):""),n.notice&&q.default.createElement("p",{role:"status"},n.notice),n.binary?q.default.createElement("p",null,l("binary")):n.text===""?q.default.createElement("p",null,l("treeEmpty")):q.default.createElement(Le,{single:!0,line:d,comparison:u,identity:JSON.stringify([t,e,s,i]),t:l})):q.default.createElement("p",{role:"status"},l("loading")))}function Jt(t=""){let e=[{path:"",name:"/"}];if(t){let s="";for(let i of t.split("/"))s=s?s+"/"+i:i,e.push({path:s,name:i})}return e}function qt(t,e="",s=""){let i=e?e+"/":"",o=s.toLowerCase();return t.filter(l=>{let m=l.path.slice(i.length);return l.path.startsWith(i)&&m.length>0&&!m.includes("/")&&m.toLowerCase().includes(o)}).sort((l,m)=>+(m.type==="tree")-+(l.type==="tree")||(l.path<m.path?-1:l.path>m.path?1:0))}function Tr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l}){let[m,c]=(0,B.useState)(null),[d,n]=(0,B.useState)(""),[p,h]=(0,B.useState)(0),[k,y]=(0,B.useState)(""),[D,u]=(0,B.useState)(0),[C,v]=(0,B.useState)(""),[g,f]=(0,B.useState)(null);if((0,B.useEffect)(()=>{let N=new AbortController;return c(null),n(""),i("vcs/tree",{sessionId:t,repositoryId:e,commit:s},N.signal).then(T=>{N.signal.aborted||c(T)}).catch(T=>{N.signal.aborted||(n(T.message),T.code==="vcs/rediscover-required"&&l())}),()=>N.abort()},[t,e,s,p]),d)return B.default.createElement("p",{role:"alert"},d," ",B.default.createElement("button",{onClick:()=>h(N=>N+1)},o("retry")));if(!m)return B.default.createElement("p",{role:"status"},o("loading"));let x=k?k+"/":"",S=qt(m.entries,k,C),E=N=>{y(N),u(0),v(""),f(null)};return B.default.createElement("section",{"aria-label":o("historicalTree")},B.default.createElement("p",null,o("historicalTreeScope")),B.default.createElement("code",null,s),B.default.createElement("p",null,k||"/"," ",k&&B.default.createElement("button",{onClick:()=>E(k.includes("/")?k.slice(0,k.lastIndexOf("/")):"")},o("treeUp"))),B.default.createElement("nav",{"aria-label":o("treeBreadcrumbs")},Jt(k).map(N=>B.default.createElement(B.default.Fragment,{key:N.path},N.path&&" / ",N.path===k?B.default.createElement("span",{"aria-current":"location"},N.name):B.default.createElement("button",{onClick:()=>E(N.path)},N.name)))),B.default.createElement("label",null,o("treeSearch")," ",B.default.createElement("input",{"aria-label":o("treeSearch"),value:C,onChange:N=>{v(N.target.value),u(0),f(null)}})),B.default.createElement("p",null,S.length," ",o("treeEntries")),!S.length&&C&&B.default.createElement("p",{role:"status"},o("emptySearch")),B.default.createElement("ul",null,S.slice(D*100,D*100+100).map(N=>B.default.createElement("li",{key:N.path},N.type==="tree"?B.default.createElement("button",{onClick:()=>E(N.path)},N.path.slice(x.length),"/"):N.type==="blob"&&["100644","100755"].includes(N.mode)?B.default.createElement("button",{"aria-pressed":g===N.path,onClick:()=>f(N.path)},N.path.slice(x.length)):B.default.createElement("span",null,N.path.slice(x.length))," \xB7 ",B.default.createElement("code",null,N.mode," ",N.type," ",B.default.createElement("span",{title:N.oid},N.oid.slice(0,10)))))),D>0&&B.default.createElement("button",{onClick:()=>{u(N=>N-1),f(null)}},o("treePrevious")),(D+1)*100<S.length&&B.default.createElement("button",{onClick:()=>{u(N=>N+1),f(null)}},o("treeNext")),g&&B.default.createElement(Ae,{key:JSON.stringify([t,e,s,g]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l,path:g,onClose:()=>f(null)}))}function nt(t){return B.default.createElement(jr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function jr(t){let[e,s]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historicalTree")),e&&B.default.createElement(Tr,{...t}))}var V=X(require("react"),1);var M=X(require("react"),1);function Ur({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,follow:l,rpc:m,t:c,onRediscover:d,onSelectCommit:n}){let[p,h]=(0,M.useState)({commits:[],nextOffset:null}),[k,y]=(0,M.useState)(0),[D,u]=(0,M.useState)(0),[C,v]=(0,M.useState)(!0),[g,f]=(0,M.useState)("");return(0,M.useEffect)(()=>{let x=new AbortController;return v(!0),f(""),m("vcs/file-history",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,offset:k,limit:50,follow:l},x.signal).then(S=>{x.signal.aborted||h(E=>({...S,commits:k?[...E.commits,...S.commits]:S.commits}))}).catch(S=>{x.signal.aborted||(f(S.message),S.code==="vcs/rediscover-required"&&d())}).finally(()=>{x.signal.aborted||v(!1)}),()=>x.abort()},[t,e,s,i,o,k,D]),M.default.createElement("section",{"aria-label":c("fileHistory"),"aria-busy":C},M.default.createElement("p",null,c("fileHistoryScope")),M.default.createElement("p",{style:{overflowWrap:"anywhere"}},p.path," \xB7 ",M.default.createElement("code",null,s)),M.default.createElement("ol",null,p.commits.map(x=>M.default.createElement("li",{key:x.id},M.default.createElement("code",{title:x.id},x.id.slice(0,10))," \xB7 ",n?M.default.createElement("button",{onClick:()=>n(x.id,x.path||p.path)},x.subject):x.subject,M.default.createElement("div",null,x.boundary&&M.default.createElement("span",null,c(x.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":"fileHistoryBoundary")," "),x.path&&M.default.createElement("code",null,x.oldPath?x.oldPath+" \u2192 ":"",x.path)," ",x.author," \xB7 ",M.default.createElement("time",{dateTime:x.date},x.date))))),C&&M.default.createElement("p",{role:"status"},c("loading")),g&&M.default.createElement("p",{role:"alert"},g," ",M.default.createElement("button",{onClick:()=>u(x=>x+1)},c("retry"))),!C&&!g&&!p.commits.length&&M.default.createElement("p",null,c("historyEmpty")),p.truncated&&M.default.createElement("p",{role:"status"},c("historyLimit")),!g&&p.nextOffset!==null&&M.default.createElement("button",{disabled:C,onClick:()=>y(p.nextOffset)},c("historyMore")))}function at(t){return M.default.createElement(Wr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit,t.parentIndex,t.id]),...t})}function Wr(t){let[e,s]=(0,M.useState)(!1),[i,o]=(0,M.useState)(!1);return M.default.createElement("div",null,M.default.createElement("button",{"aria-expanded":e,onClick:()=>s(l=>!l)},t.t("fileHistory")),e&&M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:i,onChange:l=>o(l.target.checked)}),t.t("fileHistoryFollow")),M.default.createElement("p",null,t.t("fileHistoryFollowScope")),M.default.createElement(Ur,{key:String(i),follow:i,...t})))}var H=X(require("react"),1);function Ir({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:l,t:m,onRediscover:c,onSelectCommit:d}){let[n,p]=(0,H.useState)(null),[h,k]=(0,H.useState)(""),[y,D]=(0,H.useState)(0),[u,C]=(0,H.useState)(1),[v,g]=(0,H.useState)(null);return(0,H.useEffect)(()=>{let f=new AbortController;return p(null),k(""),g(null),l("vcs/blame",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,startLine:u,lineLimit:500},f.signal).then(x=>{f.signal.aborted||p(x)}).catch(x=>{f.signal.aborted||(k(x.message),x.code==="vcs/rediscover-required"&&c())}),()=>f.abort()},[t,e,s,i,o,y,u]),h?H.default.createElement("p",{role:"alert"},h," ",H.default.createElement("button",{onClick:()=>D(f=>f+1)},m("retry"))):n?H.default.createElement("section",{"aria-label":m("blame")},H.default.createElement("p",null,m("blameScope")),d&&H.default.createElement("p",null,m("blameNavigation")),n.notice&&H.default.createElement("p",{role:"status"},n.notice),n.truncated&&H.default.createElement("p",{role:"status"},m("blameLimit")),!n.notice&&!n.lines.length&&H.default.createElement("p",null,m("blameEmpty")),!!n.lines.length&&H.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},H.default.createElement("table",null,H.default.createElement("thead",null,H.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(f=>H.default.createElement("th",{key:f,scope:"col"},m(f))))),H.default.createElement("tbody",null,n.lines.map(f=>H.default.createElement("tr",{key:f.line},H.default.createElement("th",{scope:"row"},f.line),H.default.createElement("td",null,d?H.default.createElement("button",{title:f.commit,onClick:()=>d(f.commit)},H.default.createElement("code",null,f.commit.slice(0,10))):H.default.createElement("code",{title:f.commit},f.commit.slice(0,10))),H.default.createElement("td",null,f.author),H.default.createElement("td",null,f.summary),H.default.createElement("td",null,H.default.createElement("pre",{style:{margin:0}},f.text),f.path&&f.originalLine?H.default.createElement("button",{onClick:()=>g(f)},m("blameOriginLine"),": ",f.path,":",f.originalLine):H.default.createElement("span",null,m("blameUnmapped")))))))),H.default.createElement("p",null,n.startLine||u,"\u2013",n.lines.at(-1)?.line||u," / ",n.totalLines??"\u2014"),H.default.createElement("button",{disabled:u===1,onClick:()=>C(Math.max(1,u-500))},m("blamePrevious")),H.default.createElement("button",{disabled:n.nextLine==null,onClick:()=>C(n.nextLine)},m("blameNext")),v&&H.default.createElement(Ae,{key:JSON.stringify([v.commit,v.path,v.originalLine]),sessionId:t,repositoryId:e,commit:v.commit,path:v.path,line:v.originalLine,rpc:l,t:m,onRediscover:c,onClose:()=>g(null)})):H.default.createElement("p",{role:"status"},m("loading"))}function lt(t){let[e,s]=(0,H.useState)(!1);return H.default.createElement("div",null,H.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("blame")),e&&H.default.createElement(Ir,{...t}))}function Pe({sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:l,id:m,rpc:c,t:d,onRediscover:n,onSelectCommit:p}){let[h,k]=(0,V.useState)(null),[y,D]=(0,V.useState)(""),[u,C]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let v=new AbortController;return k(null),D(""),c(o?"vcs/revision-compare":"vcs/commit-compare",o?{sessionId:t,repositoryId:e,base:o,target:l,id:m}:{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m},v.signal).then(g=>{v.signal.aborted||k(g)}).catch(g=>{v.signal.aborted||(D(g.message),g.code==="vcs/rediscover-required"&&n())}),()=>v.abort()},[t,e,s,i,o,l,m,u]),y?V.default.createElement("p",{role:"alert"},y," ",V.default.createElement("button",{onClick:()=>C(v=>v+1)},d("retry"))):h?V.default.createElement("section",null,V.default.createElement("h4",null,h.path),V.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&V.default.createElement("p",{role:"status"},h.notice),h.binary?V.default.createElement("p",null,d("binary")):V.default.createElement(Le,{comparison:h,identity:JSON.stringify(o?[t,e,o,l,m]:[t,e,s,i,m]),t:d}),s&&!o&&V.default.createElement(at,{onSelectCommit:p,key:"file-history:"+JSON.stringify([t,e,s,i,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m,rpc:c,t:d,onRediscover:n}),s&&!o&&V.default.createElement(lt,{onSelectCommit:p,key:"blame:"+JSON.stringify([t,e,s,i,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:m,rpc:c,t:d,onRediscover:n}),(s||o)&&V.default.createElement(Ee,{key:"image:"+JSON.stringify([t,e,s,i,o,l,m]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:l,id:m,rpc:c,t:d,onRediscover:n})):V.default.createElement("p",{role:"status"},d("loading"))}function Gt(t,e){if(typeof e!="string"||!e)return null;let s=t.filter(i=>i.path===e);return s.length===1&&typeof s[0].id=="string"&&s[0].id?s[0].id:null}function zt(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.id,i.author,i.subject].some(o=>o?.toLowerCase().includes(s))):t}function qe(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.path,i.oldPath].some(o=>o?.toLowerCase().includes(s))):t}function dt(t){return F.default.createElement(Jr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function Jr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l,onSelectCommit:m,initialPath:c}){let d=(0,F.useRef)(!0),[n,p]=(0,F.useState)(null),[h,k]=(0,F.useState)(""),[y,D]=(0,F.useState)(0),[u,C]=(0,F.useState)(null),[v,g]=(0,F.useState)(""),[f,x]=(0,F.useState)(0);if((0,F.useEffect)(()=>{let E=new AbortController;return C(null),g(""),i("vcs/commit",{sessionId:t,repositoryId:e,commit:s,parentIndex:y},E.signal).then(N=>{E.signal.aborted||(C(N),d.current&&(d.current=!1,p(Gt(N.changes,c))))}).catch(N=>{E.signal.aborted||(g(N.message),N.code==="vcs/rediscover-required"&&l())}),()=>E.abort()},[t,e,s,y,f]),v)return F.default.createElement("p",{role:"alert"},v," ",F.default.createElement("button",{onClick:()=>x(E=>E+1)},o("retry")));if(!u)return F.default.createElement("p",{role:"status"},o("loading"));let S=qe(u.changes,h);return F.default.createElement("section",{"aria-label":o("commitDetails")},F.default.createElement("h3",null,u.subject),F.default.createElement("code",null,u.id),F.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&F.default.createElement("p",{role:"status"},o("commitMessageLimit")),u.message&&F.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&F.default.createElement("label",null,o("commitParent")," ",F.default.createElement("select",{"aria-label":o("commitParent"),value:y,onChange:E=>{p(null),C(null),D(Number(E.target.value))}},u.parents.map((E,N)=>F.default.createElement("option",{key:E,value:N},N+1,": ",E.slice(0,10))))),F.default.createElement("p",null,u.parent||o("commitRoot")," \u2192 ",u.id.slice(0,10)),F.default.createElement("label",null,o("commitFileSearch")," ",F.default.createElement("input",{"aria-label":o("commitFileSearch"),value:h,onChange:E=>{k(E.target.value),p(null)}})),F.default.createElement("span",null," ",S.length," / ",u.changes.length),F.default.createElement("ul",null,S.map(E=>F.default.createElement("li",{key:E.id},F.default.createElement("button",{"aria-pressed":n===E.id,onClick:()=>p(E.id)},E.status," \xB7 ",E.oldPath?E.oldPath+" \u2192 ":"",E.path)))),!!u.changes.length&&!S.length&&F.default.createElement("p",{role:"status"},o("emptySearch")),!u.changes.length&&F.default.createElement("p",null,o("commitNoChanges")),n&&F.default.createElement(Pe,{key:n,sessionId:t,repositoryId:e,commit:s,parentIndex:y,id:n,onSelectCommit:m,rpc:i,t:o,onRediscover:l}),F.default.createElement(nt,{key:JSON.stringify([t,e,s]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:l}))}var G=X(require("react"),1);function _t(t){if(!Array.isArray(t))throw new Error("Invalid graph commits");let e=t.slice(0,200),s=new Map,i=[],o=[],l=c=>typeof c=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(c);for(let[c,d]of e.entries()){if(!d||!l(d.id)||!Array.isArray(d.parents)||s.has(d.id))throw new Error("Invalid graph node");s.set(d.id,c),i.push({id:d.id,row:c})}let m=!1;for(let c of e){let d=new Set;for(let n of c.parents){if(o.length===1e3){m=!0;break}if(!l(n)||n.length!==c.id.length||n===c.id||d.has(n))throw new Error("Invalid graph parent");d.add(n);let p=s.get(n);if(p!==void 0&&p<=s.get(c.id))throw new Error("Graph requires child-before-parent order");o.push({from:c.id,to:n,missing:p===void 0})}if(m)break}return{nodes:i,edges:o,nodesTruncated:t.length>200,edgesTruncated:m}}function Vt(t){let e=Array(32).fill(null),s=new Map,i=[],o=new Set,l=!1,m=n=>{if(o.has(n))return null;let p=e.indexOf(n);return p>=0?p:(p=e.indexOf(null),p<0?(l=!0,o.add(n),null):(e[p]=n,p))},c=new Map;for(let n of t.edges){if(n.missing)continue;let p=c.get(n.from)||[];p.push(n.to),c.set(n.from,p)}for(let n of t.nodes){let p=m(n.id);if(s.set(n.id,{...n,lane:p}),i.push({...n,lane:p}),p===null)continue;e[p]=null;let h=c.get(n.id)||[];for(let[k,y]of h.entries())e.includes(y)||(k===0&&e[p]===null?e[p]=y:m(y))}let d=t.edges.filter(n=>!n.missing).flatMap(n=>{let p=s.get(n.from),h=s.get(n.to);return p.lane===null||h.lane===null?[]:[{...n,start:p.row,end:h.row,fromLane:p.lane,toLane:h.lane}]});return{nodes:i,edges:d,lanesTruncated:l,laneCount:Math.max(1,...i.map(n=>(n.lane??0)+1))}}function qr({commits:t,selected:e,onSelect:s,t:i}){let o;try{o=_t(t)}catch{return G.default.createElement("p",{role:"alert"},i("graphInvalid"))}let l=Vt(o),m=l.edges,c=Math.max(100,24+18*l.laneCount),d=Math.max(40,o.nodes.length*36);return G.default.createElement("section",{"aria-label":i("historyGraph")},G.default.createElement("p",null,i("graphScope")),l.lanesTruncated&&G.default.createElement("p",{role:"status"},i("graphLaneLimit")),(o.nodesTruncated||o.edgesTruncated)&&G.default.createElement("p",{role:"status"},i("graphLimit")),G.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},G.default.createElement("svg",{width:c,height:d,"aria-hidden":"true",style:{flexShrink:0}},m.map(n=>{let p=n.start*36+18,h=n.end*36+18,k=12+n.fromLane*18,y=12+n.toLane*18;return G.default.createElement("path",{key:n.from+n.to,d:"M "+k+" "+p+" C "+k+" "+(p+18)+", "+y+" "+(h-18)+", "+y+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),l.nodes.filter(n=>n.lane!==null).map(n=>G.default.createElement("circle",{key:n.id,cx:12+n.lane*18,cy:n.row*36+18,r:"4",fill:"currentColor"}))),G.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},o.nodes.map(n=>G.default.createElement("li",{key:n.id,style:{height:36,whiteSpace:"nowrap"}},G.default.createElement("button",{title:n.id,"aria-current":e===n.id?!0:void 0,style:e===n.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:p=>{if(p.altKey||p.ctrlKey||p.metaKey||p.shiftKey)return;let h=p.key==="ArrowDown"?Math.min(n.row+1,o.nodes.length-1):p.key==="ArrowUp"?Math.max(0,n.row-1):p.key==="Home"?0:p.key==="End"?o.nodes.length-1:null;h!==null&&(p.preventDefault(),p.stopPropagation(),p.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>s(n.id)},G.default.createElement("code",null,n.id.slice(0,10))," ",t[n.row].subject))))),G.default.createElement("details",null,G.default.createElement("summary",null,i("graphRelations")),G.default.createElement("ul",null,o.edges.map(n=>G.default.createElement("li",{key:n.from+n.to},G.default.createElement("code",null,n.from)," \u2192 ",G.default.createElement("code",null,n.to),n.missing?" \xB7 "+i("graphMissing"):"")))))}function ct(t){let[e,s]=(0,G.useState)(!1);return G.default.createElement("div",null,G.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historyGraph")),e&&G.default.createElement(qr,{...t}))}var A=X(require("react"),1);function Gr({sessionId:t,repositoryId:e,base:s,target:i,rpc:o,t:l,onRediscover:m}){let[c,d]=(0,A.useState)(null),[n,p]=(0,A.useState)(""),[h,k]=(0,A.useState)(0),[y,D]=(0,A.useState)(null),[u,C]=(0,A.useState)("");if((0,A.useEffect)(()=>{let g=new AbortController;return d(null),p(""),D(null),o("vcs/revision-changes",{sessionId:t,repositoryId:e,base:s,target:i},g.signal).then(f=>{g.signal.aborted||d(f)}).catch(f=>{g.signal.aborted||(p(f.message),f.code==="vcs/rediscover-required"&&m())}),()=>g.abort()},[t,e,s,i,h]),n)return A.default.createElement("p",{role:"alert"},n," ",A.default.createElement("button",{onClick:()=>k(g=>g+1)},l("retry")));if(!c)return A.default.createElement("p",{role:"status"},l("loading"));let v=qe(c.changes,u);return A.default.createElement("div",null,A.default.createElement("label",null,l("commitFileSearch")," ",A.default.createElement("input",{"aria-label":l("commitFileSearch"),value:u,onChange:g=>{C(g.target.value),D(null)}})),A.default.createElement("span",null," ",v.length," / ",c.changes.length),!!c.changes.length&&!v.length&&A.default.createElement("p",{role:"status"},l("emptySearch")),!c.changes.length&&A.default.createElement("p",null,l("revisionEmpty")),A.default.createElement("ul",null,v.map(g=>A.default.createElement("li",{key:g.id},A.default.createElement("button",{"aria-pressed":y===g.id,onClick:()=>D(g.id)},g.status," \xB7 ",g.oldPath?g.oldPath+" \u2192 ":"",g.path)))),y&&A.default.createElement(Pe,{key:y,sessionId:t,repositoryId:e,base:s,target:i,id:y,rpc:o,t:l,onRediscover:m}))}function pt(t){return A.default.createElement(zr,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function zr({commits:t,sessionId:e,repositoryId:s,rpc:i,t:o,onRediscover:l,onReferencesLoaded:m}){let[c,d]=(0,A.useState)(""),[n,p]=(0,A.useState)(""),[h,k]=(0,A.useState)([]),[y,D]=(0,A.useState)(!1),[u,C]=(0,A.useState)(0),[v,g]=(0,A.useState)(!1),[f,x]=(0,A.useState)("");return(0,A.useEffect)(()=>{if(!u)return;let S=new AbortController;return g(!0),x(""),i("vcs/references",{sessionId:e,repositoryId:s},S.signal).then(E=>{S.signal.aborted||(k(E.references),D(!0),m?.(E.references))}).catch(E=>{S.signal.aborted||(x(E.message),E.code==="vcs/rediscover-required"&&l())}).finally(()=>{S.signal.aborted||g(!1)}),()=>S.abort()},[e,s,u]),A.default.createElement("section",{"aria-label":o("revisionTitle")},A.default.createElement("h3",null,o("revisionTitle")),A.default.createElement("p",null,o("revisionScope")),A.default.createElement("button",{disabled:v,onClick:()=>C(S=>S+1)},o("revisionLoadRefs")),A.default.createElement("p",null,o("revisionRefsScope")),y&&!v&&!f&&A.default.createElement("p",{role:"status"},h.length?`${o("revisionRefsCount")}: ${h.length}`:o("revisionRefsEmpty")),v&&A.default.createElement("p",{role:"status"},o("loading")),f&&A.default.createElement("p",{role:"alert"},f),[[c,d,"revisionBase"],[n,p,"revisionTarget"]].map(([S,E,N])=>A.default.createElement("label",{key:N},o(N)," ",A.default.createElement("select",{"aria-label":o(N),value:S,onChange:T=>E(T.target.value)},A.default.createElement("option",{value:""},"\u2014"),!!t.length&&A.default.createElement("optgroup",{label:o("revisionLoadedCommits")},t.map(T=>A.default.createElement("option",{key:T.id,value:T.id},T.id.slice(0,10)," \xB7 ",T.subject))),!!h.length&&A.default.createElement("optgroup",{label:o("revisionLocalRefs")},h.map(T=>A.default.createElement("option",{key:T.name,value:T.commit},T.name," \xB7 ",T.commit.slice(0,10)))),S&&!t.some(T=>T.id===S)&&!h.some(T=>T.commit===S)&&A.default.createElement("option",{value:S},S)))),A.default.createElement("button",{disabled:!c||!n,onClick:()=>{d(n),p(c)}},o("revisionSwap")),A.default.createElement("p",{style:{overflowWrap:"anywhere"}},A.default.createElement("code",null,c||"\u2014")," \u2192 ",A.default.createElement("code",null,n||"\u2014")),c&&n&&A.default.createElement(Gr,{key:JSON.stringify([e,s,c,n]),sessionId:e,repositoryId:s,base:c,target:n,rpc:i,t:o,onRediscover:l}))}function ut(t){return b.default.createElement(_r,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function _r({sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o}){let[l,m]=(0,b.useState)({id:null,path:null,revision:0}),[c,d]=(0,b.useState)(""),[n,p]=(0,b.useState)(null),[h,k]=(0,b.useState)(""),[y,D]=(0,b.useState)(""),u=L=>{let Y=(n||[]).find(Q=>JSON.stringify([Q.name,Q.commit])===L)?.commit||"";D(L),k(Y),f(Q=>Q?{...Q,snapshot:Y||null}:null),re(0),d(""),T(null),le({commits:[],snapshot:null,nextOffset:null})},[C,v]=(0,b.useState)({message:"",author:"",path:""}),[g,f]=(0,b.useState)(null),x=L=>{f({values:L,snapshot:K.snapshot}),re(0),d(""),T(null),le(J=>({...J,commits:[],nextOffset:null}))},S=(0,b.useMemo)(()=>Wt(n||[]),[n]),E=l.id,N=(L,J=null)=>m(Y=>({id:L,path:J,revision:Y.revision+1})),T=(L,J=null)=>m(Y=>({id:L,path:J,revision:Y.revision+(J||Y.path?1:0)})),[K,le]=(0,b.useState)({commits:[],snapshot:null,nextOffset:null}),[W,re]=(0,b.useState)(0),[P,oe]=(0,b.useState)(0),[$,ge]=(0,b.useState)(!0),[de,ve]=(0,b.useState)("");(0,b.useEffect)(()=>{let L=new AbortController;return ge(!0),ve(""),s("vcs/history",{sessionId:t,repositoryId:e,offset:W,limit:50,...g?{search:g.values}:{},...g?.snapshot||h||W?{snapshot:g?.snapshot||h||K.snapshot}:{}},L.signal).then(J=>{L.signal.aborted||le(Y=>({...J,commits:W?[...Y.commits,...J.commits]:J.commits}))}).catch(J=>{L.signal.aborted||(ve(J.message),J.code==="vcs/rediscover-required"&&o())}).finally(()=>{L.signal.aborted||ge(!1)}),()=>L.abort()},[t,e,W,P,g,h]);let R=zt(K.commits,c);return b.default.createElement("section",{className:"vcs-history","aria-label":i("history"),"aria-busy":$},b.default.createElement("div",{className:"vcs-history-list"},b.default.createElement("p",null,i("historyListOnly")),n!==null&&b.default.createElement("p",null,i("historyRefsScope")),b.default.createElement("label",null,i("historyBranch")," ",b.default.createElement("select",{"aria-label":i("historyBranch"),value:y,disabled:$,onChange:L=>u(L.target.value)},b.default.createElement("option",{value:""},"HEAD"),y&&!(n||[]).some(L=>JSON.stringify([L.name,L.commit])===y)&&b.default.createElement("option",{value:y},JSON.parse(y)[0]," \xB7 ",h.slice(0,10)," \xB7 ",i("historyPinned")),(n||[]).map(L=>{let J=JSON.stringify([L.name,L.commit]);return b.default.createElement("option",{key:J,value:J},L.name," \xB7 ",L.commit.slice(0,10))}))),b.default.createElement("p",null,i("historyBranchScope"),h&&b.default.createElement(b.default.Fragment,null," \xB7 ",b.default.createElement("code",null,h))),b.default.createElement("form",{"aria-label":i("historyServerSearch"),onSubmit:L=>{L.preventDefault(),x({...C})}},b.default.createElement("fieldset",{disabled:$},b.default.createElement("legend",null,i("historyServerSearch")),b.default.createElement("p",null,i("historyServerScope")),["message","author","path"].map(L=>b.default.createElement("label",{key:L},i("historyServer_"+L)," ",b.default.createElement("input",{maxLength:1024,"aria-label":i("historyServer_"+L),value:C[L],onChange:J=>v(Y=>({...Y,[L]:J.target.value}))}))),b.default.createElement("button",{type:"submit"},i("historyServerApply")),b.default.createElement("button",{type:"button",onClick:()=>{v({message:"",author:"",path:""}),x({})}},i("historyServerClear")))),g&&b.default.createElement("p",{role:"status"},i("historyServerActive"),": ",JSON.stringify(g.values)," \xB7 ",b.default.createElement("code",null,g.snapshot||K.snapshot)),b.default.createElement("label",null,i("historySearch")," ",b.default.createElement("input",{"aria-label":i("historySearch"),value:c,onChange:L=>{d(L.target.value),T(null)}})),b.default.createElement("span",null," ",R.length," / ",K.commits.length),!!K.commits.length&&!R.length&&b.default.createElement("p",{role:"status"},i("historyNoMatch")),b.default.createElement("ol",null,R.map(L=>b.default.createElement("li",{key:L.id},b.default.createElement("button",{"aria-pressed":E===L.id,onClick:()=>T(L.id)},L.subject),b.default.createElement("div",null,b.default.createElement("code",{title:L.id},L.id.slice(0,10))," \xB7 ",L.author," \xB7 ",b.default.createElement("time",{dateTime:L.date},L.date)),S.has(L.id)&&b.default.createElement("div",{"aria-label":i("historyRefsLabel"),style:{overflowWrap:"anywhere"}},S.get(L.id).names.map(J=>b.default.createElement("span",{key:J},b.default.createElement("code",null,J)," ")),S.get(L.id).hidden>0&&b.default.createElement("span",null,i("historyRefsMore"),": ",S.get(L.id).hidden))))),$&&b.default.createElement("p",{role:"status"},i("loading")),de&&b.default.createElement("p",{role:"alert"},de," ",b.default.createElement("button",{onClick:()=>oe(L=>L+1)},i("retry"))),!$&&!de&&!K.commits.length&&b.default.createElement("p",null,i("historyEmpty")),K.truncated&&b.default.createElement("p",{role:"status"},i("historyLimit")),!de&&K.nextOffset!==null&&b.default.createElement("button",{disabled:$,onClick:()=>re(K.nextOffset)},i("historyMore")),!!K.commits.length&&b.default.createElement(ct,{commits:K.commits,selected:E,onSelect:T,t:i}),b.default.createElement(pt,{onReferencesLoaded:p,commits:K.commits,sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o})),b.default.createElement("div",{className:"vcs-history-details"},E&&b.default.createElement(dt,{key:JSON.stringify([E,l.revision]),initialPath:l.path,sessionId:t,repositoryId:e,commit:E,onSelectCommit:N,rpc:s,t:i,onRediscover:o})))}var Kt={zh:{blameOriginLine:"\u67E5\u770B\u6765\u6E90\u5386\u53F2\u884C",blameUnmapped:"\u65E0\u6CD5\u7CBE\u786E\u5B9A\u4F4D\u6765\u6E90\u884C",blamePrevious:"\u4E0A\u4E00\u884C\u9875",blameNext:"\u4E0B\u4E00\u884C\u9875",fileHistoryMergeBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u5408\u5E76\u63D0\u4EA4\uFF0C\u6B64\u5904\u505C\u6B62\uFF0C\u4E0D\u63A8\u65AD\u591A\u7236\u6765\u6E90",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u5185\u5BB9\u76F8\u540C\u7684\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u4EC5\u8DDF\u968FGit\u68C0\u51FA\u7684100%\u91CD\u547D\u540D\uFF1B\u4E0D\u63A8\u65AD\u76F8\u4F3C\u5185\u5BB9\u3001\u590D\u5236\u6216\u5408\u5E76\u591A\u7236\u6765\u6E90\u3002\u65B0\u589E\u6587\u4EF6\u5904\u505C\u6B62\uFF0C\u53D7\u8F93\u51FA/\u65F6\u95F4\u9650\u5236\uFF1B\u6BCF\u6761\u8BB0\u5F55\u6309\u5F53\u65F6\u8DEF\u5F84\u5B9A\u4F4D\u3002",graphLaneLimit:"\u6CF3\u9053\u6700\u591A32\u6761\uFF1B\u8D85\u51FA\u90E8\u5206\u7701\u7565\u56FE\u5F62\uFF0C\u5B8C\u6574\u5DF2\u52A0\u8F7D\u8282\u70B9\u4E0E\u5173\u7CFB\u4ECD\u53EF\u5728\u6587\u5B57\u4E2D\u67E5\u770B\u3002",historyBranch:"\u5386\u53F2\u8D77\u70B9\uFF08\u672C\u5730\u5F15\u7528\uFF09",historyPinned:"\u56FA\u5B9A\u5FEB\u7167",historyBranchScope:"\u5F15\u7528\u7531\u4E0B\u65B9\u624B\u52A8\u52A0\u8F7D\uFF1B\u9009\u62E9\u540E\u56FA\u5B9A\u8BE5\u6B21OID\uFF0C\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5386\u53F2\u8D77\u70B9\u3002\u9009\u62E9HEAD\u91CD\u65B0\u8BFB\u53D6\u5F53\u524DHEAD\uFF0C\u4E0D\u5207\u6362\u5DE5\u4F5C\u533A\u3002",historyServerSearch:"\u5168\u5386\u53F2\u67E5\u8BE2",historyServerScope:"\u67E5\u8BE2\u56FA\u5B9A\u5FEB\u7167\u53EF\u8FBE\u7684\u5B8C\u6574\u5386\u53F2\uFF1B\u8BF4\u660E/\u4F5C\u8005\u4E3A\u5FFD\u7565\u5927\u5C0F\u5199\u7684\u5B57\u9762\u5339\u914D\uFF0C\u8DEF\u5F84\u4E3A\u7CBE\u786E\u8DEF\u5F84\u6216\u76EE\u5F55\uFF0C\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u3002\u5206\u9875\u4E0E\u8FD0\u884C\u65F6\u95F4\u6709\u754C\u3002",historyServer_message:"\u63D0\u4EA4\u8BF4\u660E",historyServer_author:"\u4F5C\u8005",historyServer_path:"\u8DEF\u5F84",historyServerApply:"\u6267\u884C\u67E5\u8BE2",historyServerClear:"\u6E05\u9664\u67E5\u8BE2",historyServerActive:"\u5F53\u524D\u5DF2\u63D0\u4EA4\u67E5\u8BE2",reviewView:"\u5BA1\u9605\u89C6\u56FE",workspaceView:"\u5DE5\u4F5C\u533A\u6539\u52A8",workspaceRoot:"\u5DE5\u4F5C\u533A\u672C\u8EAB",title:"VCS \u53D8\u66F4",readonly:"\u53EA\u8BFB\u9884\u89C8",refresh:"\u5237\u65B0",back:"\u8FD4\u56DE\u5BF9\u8BDD",all:"\u5168\u90E8\u53D8\u66F4",staged:"\u5DF2\u6682\u5B58",unstaged:"\u672A\u6682\u5B58",search:"\u641C\u7D22\u6587\u4EF6\u2026",noSession:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u4F1A\u8BDD\uFF0C\u518D\u67E5\u770B\u53D8\u66F4\u3002",noRepo:"\u672A\u53D1\u73B0 Git / SVN \u4ED3\u5E93\u3002\u53EF\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u540E\u91CD\u65B0\u626B\u63CF\u3002",clean:"\u6CA1\u6709\u53D8\u66F4",pick:"\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",loading:"\u6B63\u5728\u8BFB\u53D6\u2026",side:"\u5DE6\u53F3\u5BF9\u6BD4",inline:"\u884C\u5185\u5BF9\u6BD4",whitespace:"\u5FFD\u7565\u884C\u9996\u5C3E\u7A7A\u767D",wrap:"\u81EA\u52A8\u6362\u884C",previous:"\u4E0A\u4E00\u5904",next:"\u4E0B\u4E00\u5904",content:"\u5185\u5BB9",properties:"\u5C5E\u6027",binary:"\u4E8C\u8FDB\u5236\u6216\u53D7\u9650\u5185\u5BB9\u65E0\u6CD5\u6309\u6587\u672C\u6BD4\u8F83",changes:"\u5904\u53D8\u66F4",files:"\u4E2A\u6587\u4EF6",list:"\u5E73\u94FA",tree:"\u76EE\u5F55",emptySearch:"\u6CA1\u6709\u5339\u914D\u6587\u4EF6",session:"\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55",M:"\u4FEE\u6539",A:"\u65B0\u589E",D:"\u5220\u9664",R:"\u91CD\u547D\u540D",C:"\u590D\u5236",U:"\u51B2\u7A81","?":"\u672A\u8DDF\u8E2A",P:"\u5C5E\u6027",error:"\u8BFB\u53D6\u5931\u8D25",retry:"\u91CD\u8BD5",stale:"\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",repositories:"\u4ED3\u5E93",allRepositories:"\u5168\u90E8\u4ED3\u5E93",gitMode:"Git \u53D8\u66F4",svnBase:"SVN \xB7 BASE \u2194 \u5DE5\u4F5C\u526F\u672C",subdirectory:"\u76F8\u5BF9\u5B50\u76EE\u5F55\uFF08\u53EF\u9009\uFF09",rescan:"\u91CD\u65B0\u626B\u63CF\u4ED3\u5E93",scanHint:"\u4EC5\u626B\u63CF\u5F53\u524D\u76EE\u5F55\u53CA\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF0C\u4E0D\u9012\u5F52\u6DF1\u5165 \xB7 \u7F13\u5B58 5 \u5206\u949F\u540E\u8FC7\u671F",truncated:"\u5DF2\u8FBE\u5230\u626B\u63CF\u4E0A\u9650\u3002\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u5E76\u91CD\u65B0\u626B\u63CF\u4EE5\u8865\u5145\u5176\u4ED6\u4F4D\u7F6E\u3002",fallback:"\u9AD8\u7EA7\u7F16\u8F91\u5668\u4E0D\u53EF\u7528\uFF0C\u5DF2\u5207\u6362\u4E3A\u57FA\u7840\u5DE6\u53F3\u6587\u672C\u5BF9\u6BD4\u3002",diagnostics:"\u52A0\u8F7D\u8BCA\u65AD",approximate:"\u5185\u5BB9\u8F83\u5927\uFF0C\u4F7F\u7528\u8FD1\u4F3C\u884C\u5BF9\u9F50\u3002",textTruncated:"\u4EC5\u663E\u793A\u524D 2000 \u884C\u3002",textBefore:"\u4FEE\u6539\u524D",textAfter:"\u4FEE\u6539\u540E",textReadonly:"\u53EA\u8BFB\u6587\u672C\u6BD4\u8F83",textEmpty:"\u4E24\u4E2A\u7248\u672C\u5747\u4E3A\u7A7A\u3002",commitDetails:"\u63D0\u4EA4\u8BE6\u60C5",commitFileSearch:"\u7B5B\u9009\u672C\u6B21\u63D0\u4EA4\u6587\u4EF6",commitParent:"\u6BD4\u8F83\u7236\u63D0\u4EA4",commitRoot:"\u7A7A\u57FA\u7EBF\uFF08\u6839\u63D0\u4EA4\uFF09",commitNoChanges:"\u76F8\u5BF9\u6B64\u57FA\u7EBF\u65E0\u6587\u4EF6\u53D8\u66F4",history:"\u63D0\u4EA4\u5386\u53F2",historyAdvanced:"\u52A0\u8F7D\u9AD8\u7EA7\u53EA\u8BFB Diff",historyBasic:"\u8FD4\u56DE\u57FA\u7840\u6587\u672C Diff",historyListOnly:"\u672C\u5730 HEAD \u5386\u53F2\uFF1B\u9009\u62E9\u63D0\u4EA4\u53CA\u6587\u4EF6\u67E5\u770B\u53EA\u8BFB\u6587\u672C\u5DEE\u5F02\u3002",historyEmpty:"\u5C1A\u65E0\u63D0\u4EA4",historyRefsScope:"\u6807\u8BB0\u6765\u81EA\u6700\u8FD1\u4E00\u6B21\u624B\u52A8\u52A0\u8F7D\u7684\u672C\u5730\u5F15\u7528\uFF0C\u4E0D\u4EE3\u8868\u63D0\u4EA4\u521B\u5EFA\u65F6\u7684\u5206\u652F\u72B6\u6001\uFF1B\u5237\u65B0\u5931\u8D25\u65F6\u4FDD\u7559\u4E0A\u6B21\u6210\u529F\u7ED3\u679C\u3002",historyRefsLabel:"\u5DF2\u52A0\u8F7D\u672C\u5730\u5F15\u7528",historyRefsMore:"\u5176\u4ED6\u5F15\u7528",historySearch:"\u7B5B\u9009\u5DF2\u52A0\u8F7D\u63D0\u4EA4\uFF08\u4F5C\u8005 / \u6458\u8981 / SHA\uFF09",historyNoMatch:"\u5DF2\u52A0\u8F7D\u63D0\u4EA4\u4E2D\u65E0\u5339\u914D\u9879\uFF1B\u53EF\u7EE7\u7EED\u52A0\u8F7D\u66F4\u591A\u3002",historyMore:"\u52A0\u8F7D\u66F4\u591A\u63D0\u4EA4",historyLimit:"\u5DF2\u8FBE\u5230\u5386\u53F2\u6D4F\u89C8\u8303\u56F4\u4E0A\u9650\uFF0C\u4ECD\u6709\u66F4\u65E9\u63D0\u4EA4\u672A\u663E\u793A\u3002",autoRefresh:"\u624B\u52A8\u6216\u7A97\u53E3\u805A\u7126\u65F6\u5237\u65B0",comparisonContext:"\u6BD4\u8F83\u4E0A\u4E0B\u6587",encoding:"\u7F16\u7801",before:"\u524D\u7248\u672C",after:"\u540E\u7248\u672C",filterStatus:"\u6309\u72B6\u6001\u7B5B\u9009",allFiles:"\u5168\u90E8\u6587\u4EF6",previousFile:"\u4E0A\u4E00\u4E2A\u6587\u4EF6",nextFile:"\u4E0B\u4E00\u4E2A\u6587\u4EF6",expandAll:"\u5168\u90E8\u5C55\u5F00",collapseAll:"\u5168\u90E8\u6298\u53E0",revealSelected:"\u5B9A\u4F4D\u5F53\u524D\u6587\u4EF6",reviewPosition:"\u7B2C {index} / {total} \u4E2A\u6587\u4EF6",clearFilters:"\u6E05\u9664\u7B5B\u9009",searchShortcut:"Ctrl / \u2318 + F \u641C\u7D22\uFF1BEsc \u6E05\u7A7A\u641C\u7D22",fileShortcut:"Alt + \u2190 / \u2192 \u5207\u6362\u4E0A\u4E00\u4E2A\u6216\u4E0B\u4E00\u4E2A\u6587\u4EF6",copyPath:"\u590D\u5236\u8DEF\u5F84",copied:"\u5DF2\u590D\u5236",pathCopied:"\u6587\u4EF6\u8DEF\u5F84\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",copyFailed:"\u65E0\u6CD5\u590D\u5236\u6587\u4EF6\u8DEF\u5F84\u3002",binaryComparison:"\uFF08{files}\uFF09",revisionTitle:"\u672C\u5730\u7248\u672C A/B \u6BD4\u8F83",revisionScope:"\u53EF\u9009\u62E9\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4\uFF0C\u6216\u624B\u52A8\u52A0\u8F7D\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E\uFF1B\u76F4\u63A5\u6BD4\u8F83 A \u2192 B\uFF0C\u4E0D\u4F7F\u7528\u5408\u5E76\u57FA\u70B9\u3002",revisionBase:"A\uFF08\u5DE6\u4FA7\uFF09",revisionTarget:"B\uFF08\u53F3\u4FA7\uFF09",revisionSwap:"\u4EA4\u6362 A/B",revisionEmpty:"\u4E24\u4E2A\u7248\u672C\u6CA1\u6709\u6587\u4EF6\u53D8\u66F4\u3002",fileHistory:"\u8DEF\u5F84\u5386\u53F2",fileHistoryScope:"\u56FA\u5B9A\u63D0\u4EA4\u5FEB\u7167\u4E0B\u7684\u7CBE\u786E\u8DEF\u5F84\u5386\u53F2\uFF1B\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u524D\u8DEF\u5F84\uFF0C\u5305\u542B\u540C\u8DEF\u5F84\u5220\u9664\u540E\u91CD\u5EFA\u3002\u70B9\u51FB\u63D0\u4EA4\u540E\uFF0C\u4EC5\u5728\u76F8\u5BF9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF08\u6839\u63D0\u4EA4\u4E3A\u7A7A\u6811\uFF09\u7684\u53D8\u66F4\u4E2D\u552F\u4E00\u5339\u914D\u540C\u8DEF\u5F84\u65F6\u6253\u5F00 Diff\uFF1B\u5426\u5219\u53EA\u663E\u793A\u8BE6\u60C5\u3002",blame:"\u884C\u5F52\u5C5E\uFF08Blame\uFF09",blameNavigation:"\u70B9\u51FB\u5F52\u5C5E\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5\uFF1B\u9ED8\u8BA4\u9009\u62E9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\u5386\u53F2\u6587\u4EF6\u6216\u884C\u53F7\u3002",blameScope:"\u6240\u9009\u63D0\u4EA4\u7684 UTF-8 \u666E\u901A\u6587\u672C\uFF0C\u6700\u591A\u663E\u793A\u524D 500 \u884C\uFF1B\u4E0D\u5305\u542B\u5DE5\u4F5C\u533A\u4FEE\u6539\u3002",blameLimit:"\u4EC5\u663E\u793A\u524D 500 \u884C\uFF0C\u7ED3\u679C\u5DF2\u622A\u65AD\u3002",blameEmpty:"\u6587\u4EF6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u884C\u3002",blameLine:"\u884C\u53F7",blameCommit:"\u5F52\u5C5E\u63D0\u4EA4",blameAuthor:"\u4F5C\u8005",blameSummary:"\u63D0\u4EA4\u6458\u8981",blameSource:"\u6E90\u7801",historicalTree:"\u5386\u53F2\u76EE\u5F55",historicalTreeScope:"\u6240\u9009\u63D0\u4EA4\u7684\u76EE\u5F55\u6761\u76EE\uFF1B\u6BCF\u9875 100 \u9879\u3002\u70B9\u51FB\u666E\u901A\u6587\u4EF6\u53EA\u8BFB\u9884\u89C8\uFF1B\u4E0D\u8DDF\u968F\u7B26\u53F7\u94FE\u63A5\u6216\u5B50\u6A21\u5757\u3002",treePreview:"\u5386\u53F2\u6587\u4EF6\u9884\u89C8",treeClose:"\u5173\u95ED\u6587\u4EF6\u9884\u89C8",treeEmpty:"\u7A7A\u6587\u4EF6\u6216\u65E0\u53EF\u663E\u793A\u7684\u6587\u672C\u3002",treeSearch:"\u7B5B\u9009\u5F53\u524D\u76EE\u5F55\u540D\u79F0",treeBreadcrumbs:"\u5386\u53F2\u76EE\u5F55\u8DEF\u5F84",treeUp:"\u4E0A\u7EA7\u76EE\u5F55",treeEntries:"\u4E2A\u6761\u76EE",treePrevious:"\u4E0A\u4E00\u9875",treeNext:"\u4E0B\u4E00\u9875",historyGraph:"\u5C40\u90E8\u63D0\u4EA4\u56FE",graphScope:"\u4EC5\u5C55\u793A\u5DF2\u52A0\u8F7D\u5386\u53F2\u7684\u524D 200 \u4E2A\u63D0\u4EA4\uFF0C\u6700\u591A 1000 \u6761\u7236\u5B50\u8FB9\uFF1B\u4E0D\u53D7\u6587\u672C\u7B5B\u9009\u5F71\u54CD\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5206\u652F\u56FE\u3002\u8282\u70B9\u70B9\u51FB\u53EF\u67E5\u770B\u8BE6\u60C5\u3002",graphLimit:"\u56FE\u5DF2\u8FBE\u5230\u8282\u70B9\u6216\u8FB9\u4E0A\u9650\uFF0C\u90E8\u5206\u5173\u7CFB\u672A\u5C55\u793A\u3002",graphMissing:"\u7236\u63D0\u4EA4\u672A\u5728\u5F53\u524D\u56FE\u4E2D",graphRelations:"\u7236\u5B50\u5173\u7CFB\uFF08\u6587\u672C\uFF09",graphInvalid:"\u5F53\u524D\u63D0\u4EA4\u987A\u5E8F\u65E0\u6CD5\u7ED8\u56FE\uFF1B\u8BF7\u4F7F\u7528\u5386\u53F2\u5217\u8868\u3002",imageCompare:"PNG \u56FE\u7247\u6BD4\u8F83",imageBefore:"\u6240\u9009\u7236\u63D0\u4EA4",imageAfter:"\u6240\u9009\u63D0\u4EA4",imageAbsent:"\u6B64\u4FA7\u6CA1\u6709\u6587\u4EF6\u3002",imageInvalid:"\u56FE\u7247\u54CD\u5E94\u65E0\u6548\u3002",imageMetadata:"\u9884\u89C8\u5DF2\u79FB\u9664\u9644\u52A0\u5143\u6570\u636E\u3002",imageScope:"\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u4E0E 8 \u4F4D\u5355\u626B\u63CF baseline JPEG \u666E\u901A\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5355\u5757 simple \u9759\u6001 WebP\uFF08\u4E0D\u652F\u6301\u6E10\u8FDB\u5F0F/CMYK JPEG\u3001\u6269\u5C55/\u52A8\u753B WebP\uFF09\uFF1B\u6BCF\u4FA7\u6700\u591A 2 MiB\u30011600 \u4E07\u50CF\u7D20\u3002\u5143\u6570\u636E\u88AB\u79FB\u9664\uFF0C\u4E0D\u9002\u7528\u4E8E\u8272\u5F69\u7CBE\u786E\u6027\u5BA1\u9605\u3002\u652F\u6301\u5386\u53F2\u63D0\u4EA4\u3001\u56FA\u5B9A A/B \u53CA Git \u5DE5\u4F5C\u533A\uFF1B\u6309\u6240\u9009\u6A21\u5F0F\u8BFB\u53D6 HEAD\u3001\u6682\u5B58\u533A\u6216\u5DE5\u4F5C\u6587\u4EF6\u3002\u51B2\u7A81\u56FE\u7247\u4E0D\u652F\u6301\u3002",commitMessageLimit:"\u5B8C\u6574\u63D0\u4EA4\u8BF4\u660E\u8D85\u8FC7 2 MiB \u9884\u89C8\u4E0A\u9650\uFF0C\u5DF2\u7701\u7565\u3002",revisionLoadRefs:"\u52A0\u8F7D / \u5237\u65B0\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsScope:"\u4EC5\u672C\u5730\u5206\u652F\u548C\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\uFF0C\u6700\u591A 1000 \u6761\uFF1B\u4E0D fetch\u3002\u9009\u62E9\u56FA\u5B9A\u4E3A\u52A0\u8F7D\u65F6\u7684\u63D0\u4EA4 OID\uFF1B\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5DF2\u9009\u7248\u672C\u3002",revisionRefsEmpty:"\u6CA1\u6709\u53EF\u7528\u7684\u672C\u5730\u5206\u652F\u6216\u63D0\u4EA4\u6807\u7B7E\u3002",revisionLoadedCommits:"\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4",revisionLocalRefs:"\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{blameOriginLine:"View origin historical line",blameUnmapped:"Origin line cannot be located precisely",blamePrevious:"Previous line page",blameNext:"Next line page",fileHistoryMergeBoundary:"Identity boundary: merge commit; stopped without inferring parent origin",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow exact renames (first-parent)",fileHistoryFollowScope:"Only Git-detected 100% renames. No identity inference for similarity, copies or merge-parent origins. Stops at creation; output/runtime bounded. Each row uses its historical path.",graphLaneLimit:"At most 32 lanes. Overflow geometry is omitted; loaded nodes and relations remain available as text.",historyBranch:"History tip (local reference)",historyPinned:"Pinned snapshot",historyBranchScope:"Load references manually below. Selection pins that OID; refreshing references does not move the history tip. Selecting HEAD reads current HEAD without checking out.",historyServerSearch:"Full history query",historyServerScope:"Search all history reachable from the pinned snapshot. Message/author use case-insensitive literal matching; path is an exact path or directory, without rename following. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServerApply:"Run query",historyServerClear:"Clear query",historyServerActive:"Submitted query",reviewView:"Review view",workspaceView:"Working changes",workspaceRoot:"Workspace root",title:"VCS changes",readonly:"Read-only preview",refresh:"Refresh",back:"Back to chat",all:"All changes",staged:"Staged",unstaged:"Unstaged",search:"Filter files\u2026",noSession:"Open a project session to inspect its changes.",noRepo:"No Git / SVN repositories discovered. Try a relative subdirectory and rescan.",clean:"No changes",pick:"Select a file to review",loading:"Loading\u2026",side:"Side by side",inline:"Inline",whitespace:"Ignore trim whitespace",wrap:"Word wrap",previous:"Previous change",next:"Next change",content:"Content",properties:"Properties",binary:"Binary or restricted content cannot be compared as text",changes:"changes",files:"files",list:"Flat",tree:"Tree",emptySearch:"No matching files",session:"Session directory",M:"Modified",A:"Added",D:"Deleted",R:"Renamed",C:"Copied",U:"Conflict","?":"Untracked",P:"Property",error:"Failed to read",retry:"Retry",stale:"Content changed. Refresh and try again.",repositories:"Repositories",allRepositories:"All repositories",gitMode:"Git changes",svnBase:"SVN \xB7 BASE \u2194 Working Copy",subdirectory:"Relative subdirectory (optional)",rescan:"Rescan repositories",scanHint:"Scan current directory and immediate children only \xB7 cache expires after 5 minutes",truncated:"Discovery limit reached. Enter a relative subdirectory and rescan to include another location.",fallback:"Advanced editor unavailable. Showing basic side-by-side text comparison.",diagnostics:"Loading diagnostics",approximate:"Large content: approximate line alignment.",textTruncated:"Only the first 2000 lines are displayed.",textBefore:"Before",textAfter:"After",textReadonly:"Read-only text comparison",textEmpty:"Both versions are empty.",commitDetails:"Commit details",commitFileSearch:"Filter files in this commit",commitParent:"Compare parent",commitRoot:"Empty baseline (root commit)",commitNoChanges:"No file changes against this baseline",history:"Commit history",historyAdvanced:"Load advanced read-only diff",historyBasic:"Return to basic text diff",historyListOnly:"Local HEAD history. Select a commit and file to view a read-only text diff.",historyEmpty:"No commits yet",historyRefsScope:"Labels reflect the last manually loaded local refs, not branches at commit creation. Failed refreshes retain the last successful result.",historyRefsLabel:"Loaded local references",historyRefsMore:"Additional references",historySearch:"Filter loaded commits (author / subject / SHA)",historyNoMatch:"No matches in loaded commits; you can load more if available.",historyMore:"Load more commits",historyLimit:"History browsing limit reached; older commits are not shown.",autoRefresh:"Refresh manually or on window focus",comparisonContext:"Comparison context",encoding:"Encoding",before:"Before",after:"After",filterStatus:"Filter by status",allFiles:"All files",previousFile:"Previous file",nextFile:"Next file",expandAll:"Expand all",collapseAll:"Collapse all",revealSelected:"Reveal current file",reviewPosition:"File {index} of {total}",clearFilters:"Clear filters",searchShortcut:"Ctrl / \u2318 + F to search; Esc clears search",fileShortcut:"Alt + \u2190 / \u2192 switches the previous or next file",copyPath:"Copy path",copied:"Copied",pathCopied:"File path copied to the clipboard.",copyFailed:"Unable to copy the file path.",binaryComparison:"({files})",revisionTitle:"Local A/B revision comparison",revisionScope:"Choose loaded commits or manually load local branches and tags. Compare A \u2192 B directly, not via merge-base.",revisionBase:"A (left)",revisionTarget:"B (right)",revisionSwap:"Swap A/B",revisionEmpty:"No file changes between these revisions.",fileHistory:"Path history",fileHistoryScope:"Exact-path history at the pinned commit; no rename following, including deletion and recreation. Selecting a commit opens its Diff only for a unique same-path change against the first parent (empty tree for a root); otherwise only details are shown.",blame:"Blame",blameNavigation:"Select an attributed commit to view details with its first parent selected; no automatic historical file or line navigation.",blameScope:"UTF-8 regular text at the selected commit, first 500 lines at most. Working changes are excluded.",blameLimit:"Only the first 500 lines are shown; result truncated.",blameEmpty:"No source lines to display.",blameLine:"Line",blameCommit:"Commit",blameAuthor:"Author",blameSummary:"Summary",blameSource:"Source",historicalTree:"Historical tree",historicalTreeScope:"Entries at the selected commit; 100 per page. Select regular files for read-only preview; symlinks and submodules are not followed.",treePreview:"Historical file preview",treeClose:"Close file preview",treeEmpty:"Empty file or no displayable text.",treeSearch:"Filter names in this directory",treeBreadcrumbs:"Historical directory path",treeUp:"Parent directory",treeEntries:"entries",treePrevious:"Previous page",treeNext:"Next page",historyGraph:"Local commit graph",graphScope:"First 200 loaded commits, at most 1000 parent edges. Independent of text filtering; not a complete branch graph. Select a node for details.",graphLimit:"Node or edge limit reached; some relationships are omitted.",graphMissing:"Parent outside this graph",graphRelations:"Parent relationships (text)",graphInvalid:"Cannot graph this commit order; use the history list.",imageCompare:"PNG image comparison",imageBefore:"Selected parent",imageAfter:"Selected commit",imageAbsent:"No file on this side.",imageInvalid:"Invalid image response.",imageMetadata:"Ancillary metadata was removed from this preview.",imageScope:"Non-interlaced static PNG or 8-bit single-scan baseline JPEG regular files , or single-chunk simple static WebP (no progressive/CMYK JPEG or extended/animated WebP); at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Supports commits, fixed A/B and Git working changes; HEAD, index or working bytes follow the selected mode. Conflicted images are unsupported.",commitMessageLimit:"Full commit message exceeds the 2 MiB preview limit and was omitted.",revisionLoadRefs:"Load / refresh local branches and tags",revisionRefsScope:"Local branches and commit tags only, at most 1000 refs; no fetch. Selections pin the loaded commit OID; refreshing refs does not move selected versions.",revisionRefsEmpty:"No local branches or commit tags are available.",revisionLoadedCommits:"Loaded commits",revisionLocalRefs:"Local branches and tags",revisionRefsCount:"Selectable references loaded"}};function Yt(t,e,s,i){let o=t.target;if(!e?.contains(o)||t.defaultPrevented||t.isComposing||o?.closest?.(".monaco-editor")||o?.closest?.(".vcs-history"))return null;if(t.key==="Escape"&&o===s&&i)return"clear";let l=o?.isContentEditable||o?.closest?.('input,textarea,select,[role="textbox"]');if(l&&o!==s)return null;if((t.ctrlKey||t.metaKey)&&!t.altKey&&!t.shiftKey&&t.key?.toLowerCase()==="f")return"search";if(!l&&t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){if(t.key==="ArrowLeft")return"previous";if(t.key==="ArrowRight")return"next"}return null}var Qt=t=>"dsh-vcs:project:v1:"+t;function Xt(t,e){if(!t)return"";try{let s=(e??globalThis.localStorage)?.getItem(Qt(t));return typeof s=="string"&&s.length<=1024?s:""}catch{return""}}function $t(t,e,s){if(!(!t||!e))try{(s??globalThis.localStorage)?.setItem(Qt(t),e)}catch{}}function Rt(t,e=""){return t.find(s=>s.id===e)?.id||t.find(s=>s.relativePath===".")?.id||t[0]?.id||""}var He=(t,e)=>JSON.stringify([t,e]),Be=(t,e=".")=>[t.type.toUpperCase(),t.relativePath==="."?e:t.relativePath||".",t.branch].filter(Boolean).join(" \xB7 "),Ge=(t,e="all")=>t.type==="git"&&["staged","unstaged"].includes(e)?e:"all",Zt=(t="",e="")=>t===e?0:t<e?-1:1;function ft(t=[]){let e={id:"",name:"",directories:new Map,files:[],count:0};for(let i of t){let o=String(i.path||"").split("/").filter(Boolean);if(!o.length)continue;let l=e;for(let m of o.slice(0,-1)){let c=l.id?l.id+"/"+m:m;l.directories.has(m)||l.directories.set(m,{id:c,name:m,directories:new Map,files:[],count:0}),l=l.directories.get(m),l.count++}l.files.push(i)}let s=i=>({...i,directories:[...i.directories.values()].sort((o,l)=>Zt(o.name,l.name)).map(s),files:[...i.files].sort((o,l)=>Zt(o.path,l.path))});return s(e)}function er(t=[],e){let s=t.findIndex(i=>i.id===e);return{index:s<0?0:s+1,total:t.length}}function tr(t=[],e,s){if(!t.length||!["previous","next"].includes(s))return null;let i=t.findIndex(m=>m.id===e),o=s==="next"?1:-1,l=i<0?s==="next"?-1:0:i;return t[(l+o+t.length)%t.length]||null}function rr(t=""){let e=String(t).split("/").filter(Boolean);return e.slice(0,-1).map((s,i)=>e.slice(0,i+1).join("/"))}function mt(t,e=[]){for(let s of t?.directories||[])e.push(s.id),mt(s,e);return e}function or(t=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[t]||t}function ir(t=[]){return t.reduce((e,s)=>{let i=or(s.status);return e.all++,e[i]=(e[i]||0)+1,e},{all:0})}function Kr(t=[],e="",s="all"){let i=e.toLowerCase();return t.filter(o=>(s==="all"||or(o.status)===s)&&o.path.toLowerCase().includes(i)).sort((o,l)=>o.path.localeCompare(l.path))}function sr(t,e,s="",i="all"){return t.map(o=>({...e[o.id],repository:o,changes:Kr(e[o.id]?.changes,s,i)}))}function nr(t,e,s=""){if(!s||!t||t.cwd!==e.cwd)return e;let i=new Map(t.repositories.map(o=>[o.id,o]));for(let o of e.repositories)i.set(o.id,o);return{...e,repositories:[...i.values()],truncated:t.truncated||e.truncated,warnings:[...t.warnings||[],...e.warnings||[]]}}function ar(t=2){if(!Number.isInteger(t)||t<1||t>2)throw new RangeError("Status concurrency must be 1 or 2");let e=0,s=[];function i(){for(;e<t&&s.length;){let o=s.shift();if(o.signal?.removeEventListener("abort",o.abort),o.signal?.aborted){o.reject(new Error("Aborted"));continue}e++,Promise.resolve().then(()=>{if(o.signal?.aborted)throw new Error("Aborted");return o.run()}).then(o.resolve,o.reject).finally(()=>{e--,i()})}}return(o,l)=>new Promise((m,c)=>{let d={run:o,signal:l,resolve:m,reject:c,abort:null};if(d.abort=()=>{let n=s.indexOf(d);n>=0&&(s.splice(n,1),c(new Error("Aborted")))},l?.aborted){c(new Error("Aborted"));return}l?.addEventListener("abort",d.abort,{once:!0}),s.push(d),i()})}var lr={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},dr=t=>new URL("vcs-assets/"+t,document.baseURI).href;function cr(){return r.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},r.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),r.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var Yr=["slots","layout","locale","connection","uiSession"];function Qr(t){t.effect(()=>t.locale.register("local.vcs",Kt));let e=t.locale.bind("local.vcs"),s=ar(2);async function i(c,d,n){let p=await t.connection.rpc.call("/vcs-rpc",c,d,n);if(!p.ok){let h=new Error(p.error?.message||String(p.error||e("error")));throw h.code=p.error?.code,h}return p.value}function o(c){let d=c.useSessions(n=>Object.values(n.byId).find(p=>(p.retainedBy.mainView??0)>0));return r.default.createElement(l,{key:JSON.stringify([d?.id,d?.cwd])},r.default.createElement(m,{session:d}))}class l extends r.default.Component{state={error:null};static getDerivedStateFromError(d){return{error:d}}render(){return this.state.error?r.default.createElement("section",{className:"vcs-root"},r.default.createElement("style",null,it),r.default.createElement("div",{className:"vcs-message vcs-error"},e("error"),r.default.createElement("button",{onClick:()=>this.setState({error:null})},e("retry")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")))):this.props.children}}function m({session:c}){(0,r.useSyncExternalStore)(a=>t.locale.subscribe(a),()=>t.locale.getSnapshot(),()=>t.locale.getSnapshot());let d=c?.id,[n,p]=(0,r.useState)("all"),[h,k]=(0,r.useState)(0),[y,D]=(0,r.useState)(0),[u,C]=(0,r.useState)(null),[v,g]=(0,r.useState)({}),[f,x]=(0,r.useState)(()=>Xt(c?.cwd)),[S,E]=(0,r.useState)(0),[N,T]=(0,r.useState)(""),[K,le]=(0,r.useState)(""),[W,re]=(0,r.useState)(null),[P,oe]=(0,r.useState)(null),[$,ge]=(0,r.useState)(!1),[de,ve]=(0,r.useState)(!1),[R,L]=(0,r.useState)(""),[J,Y]=(0,r.useState)(""),[Q,ht]=(0,r.useState)(""),[gt,vt]=(0,r.useState)(!1),[se,ze]=(0,r.useState)(""),[De,bt]=(0,r.useState)("all"),[ce,yt]=(0,r.useState)(!0),[xt,_e]=(0,r.useState)({}),[be,pr]=(0,r.useState)(!0),[Ve,ur]=(0,r.useState)(!1),[Ke,fr]=(0,r.useState)(!1),[Oe,ye]=(0,r.useState)("content"),[wt,St]=(0,r.useState)(0),[mr,kt]=(0,r.useState)(!1),[Ye,Qe]=(0,r.useState)({added:0,deleted:0,count:0}),[Z,Ct]=(0,r.useState)(!1),Nt=(0,r.useRef)(null),Et=(0,r.useRef)(null),pe=(0,r.useRef)(null),Xe=(0,r.useRef)(null),Me=(0,r.useRef)(null),$e=(0,r.useRef)(null),Lt=(0,r.useRef)(null),xe=(0,r.useRef)(null),Ze=(0,r.useRef)(null),Re=(0,r.useRef)(null),et=(0,r.useRef)(!1),Fe=(0,r.useRef)(!1),ne=u?.repositories||[],ue=ne.filter(a=>a.id===f),ee=mr&&ue.some(a=>a.type==="git"),hr=()=>{xe.current?.abort(),oe(null),re(null),Y(""),kt(!0)};(0,r.useEffect)(()=>{ne.some(a=>a.id===f)&&$t(c?.cwd,f)},[c?.cwd,f,u]);let we=()=>{Lt.current?.abort(),xe.current?.abort(),oe(null),re(null),Y(""),ye("content"),Qe({added:0,deleted:0,count:0})},Te=()=>{Fe.current=!1,we(),Ze.current?.abort(),Re.current=u,C(null),g({}),le(N.trim()),E(a=>a+1)},je=()=>{Fe.current||(Fe.current=!0,we(),Ze.current?.abort(),Re.current=null,C(null),g({}),le(""),E(a=>a+1))},At=(a=!1)=>{a||D(w=>w+1),et.current=a,a||we(),a||g({}),k(w=>w+1)};(0,r.useEffect)(()=>{let a=new AbortController;return Ze.current=a,L(""),ge(!!d),d&&i("vcs/repositories",{sessionId:d,...K?{subdirectory:K}:{}},a.signal).then(w=>{if(!a.signal.aborted){let O=nr(Re.current,w,K);Fe.current=!1,x(I=>Rt(O.repositories,I)),C(O)}}).catch(w=>{a.signal.aborted||L(w.message)}).finally(()=>{a.signal.aborted||ge(!1)}),()=>a.abort()},[d,S,K]),(0,r.useEffect)(()=>{let a=new AbortController,w=et.current;Lt.current=a,et.current=!1,w||(g({}),Y(""));for(let O of ue){let I=Ge(O,n);s(()=>i("vcs/status",{sessionId:d,repositoryId:O.id,mode:I},a.signal),a.signal).then(z=>{a.signal.aborted||g(te=>({...te,[O.id]:{...z,mode:I}}))}).catch(z=>{if(!a.signal.aborted){if(z.code==="vcs/rediscover-required"){je();return}g(te=>({...te,[O.id]:{error:z.message,changes:[],mode:I}}))}})}return()=>a.abort()},[d,u,f,n,h]),(0,r.useEffect)(()=>{let a=w=>{w.target===window&&d&&f&&document.visibilityState==="visible"&&At(!0)};return window.addEventListener("focus",a),()=>window.removeEventListener("focus",a)},[d,f,n]);let Se=ne.find(a=>a.id===W?.repositoryId),fe=W?v[W.repositoryId]:null;(0,r.useEffect)(()=>{let a=new AbortController;return xe.current=a,oe(null),Y(""),Qe({added:0,deleted:0,count:0}),ye("content"),ve(!!W&&!!fe),!ee&&W&&fe&&Se&&i("vcs/compare",{sessionId:d,repositoryId:W.repositoryId,mode:Ge(Se,n),id:W.id},a.signal).then(w=>{a.signal.aborted||oe(w)}).catch(w=>{if(!a.signal.aborted){if(w.code==="vcs/rediscover-required"){je();return}Y(w.message)}}).finally(()=>{a.signal.aborted||ve(!1)}),()=>a.abort()},[W,fe,d,n,ee]),(0,r.useEffect)(()=>{let a=!1,w,O=new AbortController;Ct(!1),ht("");let I=document.createElement("link");return I.rel="stylesheet",I.href=dr("editor.css"),document.head.appendChild(I),Ie(dr("editor.js")+"?v="+encodeURIComponent(Je)+"&retry="+wt,{signal:O.signal}).then(z=>{a||(w=z.createDiff(Et.current,{onStats:Qe}),pe.current=w,Ct(!0))}).catch(z=>{a||ht(z.message)}),()=>{a=!0,O.abort(),w?.dispose(),pe.current=null,I.remove()}},[wt]),(0,r.useEffect)(()=>{Z&&P&&!P.binary&&pe.current?.setContent(P,JSON.stringify([d,u?.cwd,W?.repositoryId,n,W?.id,P.path]))},[Z,P,d,u,W,n]),(0,r.useEffect)(()=>{pe.current?.options({sideBySide:be,ignoreWhitespace:Ve,wrap:Ke})},[Z,be,Ve,Ke]);let ke=sr(ue,v,se,De),me=ke.flatMap(a=>a.changes),gr=ir(fe?.changes),tt=er(me,W?.id),Pt=()=>{ze(""),bt("all")},vr=async()=>{let a=P?.path||ie?.path;if(a)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(a);else{let w=document.createElement("textarea");try{if(w.value=a,w.style.cssText="position:fixed;opacity:0",document.body.appendChild(w),w.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{w.remove()}}vt(!0),window.setTimeout(()=>vt(!1),1500)}catch{Y(e("copyFailed"))}};(0,r.useEffect)(()=>{let a=w=>{if(ee)return;let O=Yt(w,Nt.current,Me.current,!!se);O&&(w.preventDefault(),O==="search"?(Me.current?.focus(),Me.current?.select()):O==="clear"?ze(""):rt(O))};return window.addEventListener("keydown",a),()=>window.removeEventListener("keydown",a)},[se,me,W,ee]);let Ht=a=>_e(w=>{let O={...w};for(let I of ke)for(let z of mt(ft(I.changes)))O[I.repository.id+"\0"+z]=!a;return O}),br=()=>{let a=ie;!a||!W||(yt(!0),Pt(),_e(w=>{let O={...w};for(let I of rr(a.path))O[W.repositoryId+"\0"+I]=!1;return O}),$e.current=He(W.repositoryId,a.id))};(0,r.useEffect)(()=>{let a=$e.current;if(!a)return;let w=[...Xe.current?.querySelectorAll("button[data-vcs-change]")||[]].find(O=>O.dataset.vcsChange===a);w&&(w.scrollIntoView({block:"nearest"}),w.focus(),$e.current=null)},[ce,se,De,xt,ke]);let rt=a=>{let w=tr(me,W?.id,a);w&&(xe.current?.abort(),oe(null),ye("content"),re({repositoryId:f,id:w.id}))},Bt=$||ue.some(a=>!v[a.id]),ie=fe?.changes?.find(a=>a.id===W?.id),ae=P?.properties,ot=ae?[...new Set([...Object.keys(ae.left||{}),...Object.keys(ae.right||{})])].filter(a=>ae.left?.[a]!==ae.right?.[a]):[],Ce=a=>lr[a?.status]||a?.status?.slice(0,1).toUpperCase()||"M",Dt=P?.binary?[P.left.label,P.right.label].filter(Boolean).join(" \u2194 "):"",he=J||(de?e("loading"):d?Bt&&!ie?e("loading"):R||(ne.length?ie?P?.binary?e("binary")+(Dt?" "+e("binaryComparison",{files:Dt}):""):P?!Z&&!Q?e("loading"):"":e("pick"):e("pick"):e("noRepo")):e("noSession")),yr=a=>{let w=Xe.current,O=w?[...w.querySelectorAll("button[data-vcs-item]")]:[],I=O.indexOf(a.target);if(I<0)return;let z;if(a.key==="ArrowDown")z=O[I+1];else if(a.key==="ArrowUp")z=O[I-1];else if(a.key==="Home")z=O[0];else if(a.key==="End")z=O.at(-1);else if(a.key==="ArrowRight"&&a.target.dataset.vcsDirectory==="closed"){a.preventDefault(),a.target.click();return}else if(a.key==="ArrowLeft"&&a.target.dataset.vcsDirectory==="open"){a.preventDefault(),a.target.click();return}else return;a.preventDefault(),z?.focus()},Ot=({entry:a,compact:w=!1,depth:O=0})=>{let I=a.path.lastIndexOf("/");return r.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":He(f,a.id),"aria-current":W?.repositoryId===f&&W?.id===a.id?"true":void 0,style:{paddingInlineStart:8+O*14},title:(a.oldPath?a.oldPath+" \u2192 ":"")+a.path+" \xB7 "+e(Ce(a)),onClick:()=>{xe.current?.abort(),oe(null),ye("content"),re({repositoryId:f,id:a.id})}},r.default.createElement("span",{className:"vcs-status","data-status":Ce(a)},Ce(a)),r.default.createElement("span",{className:"vcs-filename"},w?a.path.slice(I+1):a.path,a.oldPath&&r.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",a.oldPath)))},Mt=({node:a,repository:w,depth:O=0})=>r.default.createElement(r.default.Fragment,null,a.directories.map(I=>{let z=w.id+"\0"+I.id,te=!!xt[z];return r.default.createElement(r.default.Fragment,{key:z},r.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":te?"closed":"open","aria-expanded":!te,style:{paddingInlineStart:8+O*14},onClick:()=>_e(xr=>({...xr,[z]:!te}))},r.default.createElement("span",{"aria-hidden":"true"},te?"\u203A":"\u2304"),I.name,r.default.createElement("small",null,I.count)),!te&&r.default.createElement(Mt,{node:I,repository:w,depth:O+1}))}),a.files.map(I=>r.default.createElement(Ot,{key:He(w.id,I.id),entry:I,compact:a.id!=="",depth:O})));return r.default.createElement("section",{ref:Nt,className:"vcs-root","aria-label":e("title")},r.default.createElement("style",null,it),r.default.createElement("header",{className:"vcs-top"},r.default.createElement(cr,null),r.default.createElement("h1",{className:"vcs-title"},e("title")),r.default.createElement("span",{className:"vcs-badge"},e("readonly")),r.default.createElement("span",{className:"vcs-spacer"}),r.default.createElement("select",{"aria-label":e("repositories"),value:f,disabled:$||!ne.length,onChange:a=>{we(),g({}),x(a.target.value)}},!ne.length&&r.default.createElement("option",{value:""},e("repositories")),ne.map(a=>r.default.createElement("option",{key:a.id,value:a.id},Be(a,e("workspaceRoot"))))),r.default.createElement("label",{className:"vcs-mode"},e("gitMode")," ",r.default.createElement("select",{"aria-label":e("gitMode"),value:n,disabled:ee||!ue.some(a=>a.type==="git"),onChange:a=>{we(),g({}),p(a.target.value)}},["all","unstaged","staged"].map(a=>r.default.createElement("option",{key:a,value:a},e(a))))),r.default.createElement("button",{onClick:()=>At(!1),disabled:Bt||!d},e("refresh")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")),r.default.createElement("div",{className:"vcs-path",title:u?.cwd||c?.cwd},e("session"),": ",u?.cwd||c?.cwd||"\u2014"),r.default.createElement("form",{className:"vcs-discovery",onSubmit:a=>{a.preventDefault(),Te()}},r.default.createElement("input",{"aria-label":e("subdirectory"),placeholder:e("subdirectory"),value:N,onChange:a=>T(a.target.value)}),r.default.createElement("button",{disabled:!d||$},e("rescan")),r.default.createElement("span",null,e("scanHint"))),u?.truncated&&r.default.createElement("div",{className:"vcs-notice"},e("truncated")),(u?.warnings||[]).map((a,w)=>r.default.createElement("div",{className:"vcs-notice",key:w},typeof a=="string"?a:a.message||JSON.stringify(a)))),ue.some(a=>a.type==="git")&&r.default.createElement(r.default.Fragment,null,r.default.createElement("nav",{className:"vcs-review-views","aria-label":e("reviewView")},r.default.createElement("button",{"aria-pressed":!ee,onClick:()=>kt(!1)},e("workspaceView")),r.default.createElement("button",{"aria-pressed":ee,"aria-expanded":ee,onClick:hr},e("history"))),ee&&r.default.createElement(ut,{key:JSON.stringify([d,f,y,S]),sessionId:d,repositoryId:f,rpc:i,t:e,onRediscover:je})),r.default.createElement("div",{className:"vcs-body",hidden:ee,"aria-label":e("workspaceView")},r.default.createElement("aside",{className:"vcs-files"},r.default.createElement("div",{className:"vcs-filter"},r.default.createElement("input",{ref:Me,"aria-label":e("search"),placeholder:e("search"),title:e("searchShortcut"),value:se,onChange:a=>ze(a.target.value)}),(se||De!=="all")&&r.default.createElement("button",{className:"vcs-clear-filter",onClick:Pt},e("clearFilters"))),r.default.createElement("div",{className:"vcs-status-filter","aria-label":e("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(a=>r.default.createElement("button",{key:a,"aria-pressed":De===a,onClick:()=>bt(a)},e(a==="all"?"allFiles":lr[a]||"M")," ",r.default.createElement("small",null,gr[a]||0)))),r.default.createElement("div",{className:"vcs-count"},r.default.createElement("span",null,me.length," ",e("files")),r.default.createElement("span",{className:"vcs-auto"},e("autoRefresh")),r.default.createElement("button",{"aria-pressed":ce,onClick:()=>yt(!ce)},e(ce?"tree":"list"))),ce&&r.default.createElement("div",{className:"vcs-tree-actions"},r.default.createElement("button",{onClick:()=>Ht(!0)},e("expandAll")),r.default.createElement("button",{onClick:()=>Ht(!1)},e("collapseAll")),r.default.createElement("button",{onClick:br,disabled:!ie},e("revealSelected"))),r.default.createElement("nav",{className:"vcs-filelist","aria-label":e("title"),ref:Xe,onKeyDown:yr},ke.map(a=>{let w=a.repository;return r.default.createElement("section",{className:"vcs-repository",key:w.id,"aria-label":Be(w,e("workspaceRoot"))},r.default.createElement("div",{className:"vcs-repository-heading",title:w.root},r.default.createElement("strong",null,Be(w,e("workspaceRoot"))),r.default.createElement("small",null,w.type==="svn"?e("svnBase"):e(Ge(w,n)))),a.error?r.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},a.error,r.default.createElement("button",{onClick:Te},e("rescan"))):v[w.id]?ce?r.default.createElement(Mt,{node:ft(a.changes),repository:w}):a.changes.map(O=>r.default.createElement(Ot,{key:He(w.id,O.id),entry:O})):r.default.createElement("div",{className:"vcs-message"},e("loading")),!a.error&&v[w.id]&&!a.changes.length&&r.default.createElement("div",{className:"vcs-message"},e(se?"emptySearch":"clean")))}),!ke.length&&r.default.createElement("div",{className:"vcs-message"},$?e("loading"):R||e(d?"noRepo":"noSession"),R&&r.default.createElement("button",{onClick:Te},e("rescan"))))),r.default.createElement("main",{className:"vcs-detail"},r.default.createElement("div",{className:"vcs-filehead"},r.default.createElement("strong",{title:P?.path||ie?.path},Se?Be(Se,e("workspaceRoot"))+" / ":"",P?.path||ie?.path||e("pick")),r.default.createElement("button",{className:"vcs-copy-path",disabled:!(P?.path||ie?.path),onClick:vr},e(gt?"copied":"copyPath")),gt&&r.default.createElement("span",{className:"vcs-sr-only",role:"status"},e("pathCopied")),r.default.createElement("span",{className:"vcs-spacer"}),P&&!P.binary&&Z&&r.default.createElement(r.default.Fragment,null,r.default.createElement("span",{className:"vcs-add"},"+",Ye.added),r.default.createElement("span",{className:"vcs-del"},"\u2212",Ye.deleted))),Q&&r.default.createElement("div",{className:"vcs-notice",role:"status"},e("fallback")," ",r.default.createElement("button",{onClick:()=>St(a=>a+1)},e("retry")),r.default.createElement("details",null,r.default.createElement("summary",null,e("diagnostics")),Q)),P&&r.default.createElement("div",{className:"vcs-context","aria-label":e("comparisonContext")},r.default.createElement("span",{className:"vcs-context-status","data-status":Ce(P)},e(Ce(P))),P.oldPath&&r.default.createElement("span",{className:"vcs-context-rename",title:P.oldPath+" \u2192 "+P.path},P.oldPath," ",r.default.createElement("b",null,"\u2192")," ",P.path),r.default.createElement("span",null,P.left.label||"\u2014"," ",r.default.createElement("b",null,"\u2194")," ",P.right.label||"\u2014"),(P.left.encoding||P.right.encoding)&&r.default.createElement("span",null,e("encoding"),": ",P.left.encoding||"\u2014"," / ",P.right.encoding||"\u2014")),P&&Se?.type==="git"&&r.default.createElement(Ee,{key:JSON.stringify([d,u?.cwd,W.repositoryId,n,W.id,h,fe]),workspace:!0,sessionId:d,repositoryId:W.repositoryId,mode:n,id:W.id,rpc:i,t:e,onRediscover:je}),P?.notice&&r.default.createElement("div",{className:"vcs-notice"},P.notice),ot.length>0&&r.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(a=>r.default.createElement("button",{key:a,"aria-pressed":Oe===a,onClick:()=>ye(a)},e(a),a==="properties"?" ("+ot.length+")":""))),r.default.createElement("div",{className:"vcs-labels"},r.default.createElement("span",null,P?.left.label||"\u2014",P?.left.encoding?" \xB7 "+P.left.encoding:""),r.default.createElement("span",null,P?.right.label||"\u2014",P?.right.encoding?" \xB7 "+P.right.encoding:"")),r.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!he||Oe!=="content",style:Oe==="properties"?{display:"none"}:void 0},r.default.createElement("div",{className:"vcs-editor",ref:Et,style:Q?{display:"none"}:void 0}),Q&&P&&!P.binary&&!he&&r.default.createElement(Ne,{comparison:P,labels:We(e)}),he&&r.default.createElement("div",{className:"vcs-message "+(R||J||Q?"vcs-error":""),role:"status"},he,(R||J||Q)&&r.default.createElement("button",{onClick:()=>Q?St(a=>a+1):Te()},e(Q?"retry":"rescan")))),Oe==="properties"&&r.default.createElement("div",{className:"vcs-properties"},r.default.createElement("table",null,r.default.createElement("thead",null,r.default.createElement("tr",null,r.default.createElement("th",null,e("properties")),r.default.createElement("th",null,P?.left.label||e("before")),r.default.createElement("th",null,P?.right.label||e("after")))),r.default.createElement("tbody",null,ot.map(a=>r.default.createElement("tr",{key:a},r.default.createElement("th",null,a),r.default.createElement("td",null,ae.left?.[a]??"\u2014"),r.default.createElement("td",null,ae.right?.[a]??"\u2014")))))),r.default.createElement("footer",{className:"vcs-toolbar"},r.default.createElement("button",{disabled:!Z,"aria-pressed":be,onClick:()=>pr(!be)},e(be?"side":"inline")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Z,checked:Ve,onChange:a=>ur(a.target.checked)}),e("whitespace")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Z,checked:Ke,onChange:a=>fr(a.target.checked)}),e("wrap")),r.default.createElement("span",{className:"vcs-spacer"}),Z&&r.default.createElement("span",null,Ye.count," ",e("changes")),r.default.createElement("button",{disabled:!Z||!P||!!he,onClick:()=>pe.current?.navigate("previous")},e("previous")),r.default.createElement("button",{disabled:!Z||!P||!!he,onClick:()=>pe.current?.navigate("next")},e("next")),tt.index>0&&r.default.createElement("span",{className:"vcs-review-position"},e("reviewPosition",{index:tt.index,total:tt.total})),r.default.createElement("span",{className:"vcs-toolbar-separator"}),r.default.createElement("button",{title:e("fileShortcut"),disabled:!me.length,onClick:()=>rt("previous")},e("previousFile")),r.default.createElement("button",{title:e("fileShortcut"),disabled:!me.length,onClick:()=>rt("next")},e("nextFile"))))))}t.slots.inject("main",()=>t.slots.register({name:"main",key:"local-vcs"},o)),t.slots.inject("sidebar.panellist",()=>t.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>e("title"),order:65},cr))}
97
97
  return module.exports; }});
package/image-preview.mjs CHANGED
@@ -2,8 +2,22 @@
2
2
  export async function prepareRaster(buffer,{signal}={}){
3
3
  signal?.throwIfAborted();
4
4
  if(Buffer.isBuffer(buffer)&&buffer[0]===255&&buffer[1]===216){const result=prepareBaselineJpeg(buffer);signal?.throwIfAborted();return result;}
5
+ if(Buffer.isBuffer(buffer)&&buffer.toString('ascii',0,4)==='RIFF'){const result=prepareSimpleWebp(buffer);signal?.throwIfAborted();return result;}
5
6
  return preparePng(buffer,{signal});
6
7
  }
8
+ // Simple static WebP only; extended/animated containers remain rejected.
9
+ export function prepareSimpleWebp(buffer){
10
+ if(!Buffer.isBuffer(buffer)||buffer.length<26||buffer.length>2097152||buffer.toString('ascii',0,4)!=='RIFF'||buffer.toString('ascii',8,12)!=='WEBP'||buffer.readUInt32LE(4)!==buffer.length-8)throw Error('Invalid WebP RIFF or byte limit');
11
+ const kind=buffer.toString('ascii',12,16),size=buffer.readUInt32LE(16),end=20+size;if(end+(size&1)!==buffer.length||(size&1&&buffer[end]!==0))throw Error('Invalid WebP single chunk length or padding');
12
+ let width,height;
13
+ if(kind==='VP8 '){
14
+ if(size<10)throw Error('Truncated WebP VP8 header');const tag=buffer.readUIntLE(20,3),partition=tag>>>5;
15
+ if((tag&1)||((tag>>>1)&7)>3||!(tag&16)||!partition||partition>size-3||!buffer.subarray(23,26).equals(Buffer.from([157,1,42])))throw Error('Unsupported WebP VP8 frame');
16
+ const w=buffer.readUInt16LE(26),h=buffer.readUInt16LE(28);if(w>>>14||h>>>14)throw Error('WebP scaled frame unsupported');width=w&16383;height=h&16383;
17
+ }else throw Error('Only simple static WebP is supported');
18
+ if(!width||!height||width>8192||height>8192||width*height>16000000)throw Error('WebP dimensions exceed limit');
19
+ return {mime:'image/webp',width,height,bytes:buffer.length,originalBytes:buffer.length,data:Buffer.from(buffer),metadataStripped:false};
20
+ }
7
21
  export function prepareBaselineJpeg(buffer){
8
22
  if(!Buffer.isBuffer(buffer)||buffer.length<4||buffer.length>2097152||buffer[0]!==255||buffer[1]!==216)throw Error('Invalid JPEG input or byte limit');
9
23
  let offset=2,segments=0,width,height,components,seenFrame=false,seenScan=false;const quant=new Set(),huffman=new Set(),frame=new Map();const parts=[buffer.subarray(0,2)];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng0531/dsh-vcs",
3
- "version": "0.3.60",
3
+ "version": "0.3.61",
4
4
  "private": false,
5
5
  "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
6
6
  "type": "module",