@feng0531/dsh-vcs 0.3.52 → 0.3.54

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
@@ -1,5 +1,5 @@
1
1
  window.__ModuleLoader__.load({ id: "@feng0531/dsh-vcs", factory(require) { var module = { exports: {} }; var exports = module.exports;
2
- var wr=Object.create;var De=Object.defineProperty;var kr=Object.getOwnPropertyDescriptor;var Sr=Object.getOwnPropertyNames;var Cr=Object.getPrototypeOf,Nr=Object.prototype.hasOwnProperty;var Er=(t,e)=>{for(var s in e)De(t,s,{get:e[s],enumerable:!0})},Ft=(t,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Sr(e))!Nr.call(t,o)&&o!==s&&De(t,o,{get:()=>e[o],enumerable:!(i=kr(e,o))||i.enumerable});return t};var K=(t,e,s)=>(s=t!=null?wr(Cr(t)):{},Ft(e||!t||!t.__esModule?De(s,"default",{value:t,enumerable:!0}):s,t)),Ar=t=>Ft(De({},"__esModule",{value:!0}),t);var Yr={};Er(Yr,{apply:()=>Xr,inject:()=>Qr});module.exports=Ar(Yr);var r=K(require("react"),1);var Ze=`.vcs-root .vcs-discovery{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}
2
+ var wr=Object.create;var Be=Object.defineProperty;var Sr=Object.getOwnPropertyDescriptor;var kr=Object.getOwnPropertyNames;var Cr=Object.getPrototypeOf,Nr=Object.prototype.hasOwnProperty;var Er=(t,e)=>{for(var s in e)Be(t,s,{get:e[s],enumerable:!0})},Tt=(t,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of kr(e))!Nr.call(t,o)&&o!==s&&Be(t,o,{get:()=>e[o],enumerable:!(i=Sr(e,o))||i.enumerable});return t};var K=(t,e,s)=>(s=t!=null?wr(Cr(t)):{},Tt(e||!t||!t.__esModule?Be(s,"default",{value:t,enumerable:!0}):s,t)),Ar=t=>Tt(Be({},"__esModule",{value:!0}),t);var Yr={};Er(Yr,{apply:()=>Xr,inject:()=>Qr});module.exports=Ar(Yr);var r=K(require("react"),1);var et=`.vcs-root .vcs-discovery{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}
3
3
  .vcs-root .vcs-discovery input{min-width:160px;max-width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-base);padding:6px 9px}
4
4
  .vcs-root .vcs-discovery span{font-size:12px;color:var(--dsw-alias-label-secondary)}
5
5
  .vcs-root .vcs-mode{display:flex;align-items:center;gap:6px}
@@ -92,5 +92,5 @@ var wr=Object.create;var De=Object.defineProperty;var kr=Object.getOwnPropertyDe
92
92
  .vcs-root .vcs-toolbar{gap:6px}
93
93
  .vcs-root .vcs-title{font-size:16px}
94
94
  }
95
- `;var J=K(require("react"),1);function Tt(t){return t===""?[]:t.split(/\r\n|\n|\r/)}function Ot(t="",e=""){let s=Tt(t),i=Tt(e),o=0;for(;o<s.length&&o<i.length&&s[o]===i[o];)o++;let c=0;for(;c<s.length-o&&c<i.length-o&&s[s.length-c-1]===i[i.length-c-1];)c++;let u=s.length-c,p=i.length-c,a=u-o,d=p-o,v=a&&d?(a+1)*(d+1):0,g=v>2e5,y=[],L=0;function S(l,x){L++,!(y.length>=2e3)&&y.push({left:l===null?null:{number:l+1,text:s[l]},right:x===null?null:{number:x+1,text:i[x]},kind:l===null?"insert":x===null?"delete":s[l]===i[x]?"equal":"replace"})}for(let l=0;l<o;l++)S(l,l);if(g||!a||!d)for(let l=0;l<Math.max(a,d);l++)S(l<a?o+l:null,l<d?o+l:null);else{let l=d+1,x=new Uint32Array(v);for(let h=a-1;h>=0;h--)for(let F=d-1;F>=0;F--)x[h*l+F]=s[o+h]===i[o+F]?x[(h+1)*l+F+1]+1:Math.max(x[(h+1)*l+F],x[h*l+F+1]);let m=0,f=0;for(;m<a||f<d;)m<a&&f<d&&s[o+m]===i[o+f]?S(o+m++,o+f++):m<a&&(f===d||x[(m+1)*l+f]>=x[m*l+f+1])?S(o+m++,null):S(null,o+f++)}for(let l=0;l<c;l++)S(u+l,p+l);return{rows:y,approximate:g,truncated:L>y.length,totalRows:L,omittedRows:L-y.length,leftLineCount:s.length,rightLineCount:i.length,lcsCells:g?0:v}}var Dr={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."},Re={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},Mr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Hr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function be({comparison:t,labels:e={}}){let s=t?.left?.text??"",i=t?.right?.text??"",o=(0,J.useMemo)(()=>Ot(s,i),[s,i]),c=p=>e[p]??Dr[p],u=(p,a,d)=>{let v=p&&d!=="equal";return J.default.createElement("td",{style:{...Re,background:v?a==="left"?"#d6454520":"#259b4920":void 0}},J.default.createElement("div",{style:Br},J.default.createElement("span",{style:Mr},p?.number??""),J.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},v?a==="left"?"\u2212":"+":""),J.default.createElement("pre",{style:Hr},p?.text??"")))};return J.default.createElement("section",{className:"vcs-text-comparison","aria-label":c("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},o.approximate&&J.default.createElement("div",{role:"status",style:{padding:8}},c("approximate")),o.truncated&&J.default.createElement("div",{role:"status",style:{padding:8}},c("truncated")," (",2e3," / ",o.totalRows,")"),J.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},J.default.createElement("thead",null,J.default.createElement("tr",null,J.default.createElement("th",{scope:"col",style:{...Re,padding:8,overflowWrap:"anywhere"}},t?.left?.label||c("before")),J.default.createElement("th",{scope:"col",style:{...Re,padding:8,overflowWrap:"anywhere"}},t?.right?.label||c("after")))),J.default.createElement("tbody",null,o.rows.map((p,a)=>J.default.createElement("tr",{key:a,"data-kind":p.kind},u(p.left,"left",p.kind),u(p.right,"right",p.kind))))),!o.rows.length&&J.default.createElement("p",{style:{padding:8}},c("empty")))}function Be(t){return{before:t("textBefore"),after:t("textAfter"),readonly:t("textReadonly"),empty:t("textEmpty"),approximate:t("approximate"),truncated:t("textTruncated")}}var E=K(require("react"),1);function jt(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 M=K(require("react"),1);var N=K(require("react"),1);var q=K(require("react"),1);var W=K(require("react"),1);function Ut({load:t,node:e,comparison:s,key:i,single:o=!1,onReady:c=()=>{},onError:u=()=>{}}){let p=new AbortController,a,d=!1,v=()=>{let y=a;a=void 0,y?.dispose()};return{done:Promise.resolve().then(()=>(p.signal.throwIfAborted(),t(p.signal))).then(y=>{d||(a=y.createDiff(e,{single:o}),a.setContent(s,i),d||c(a))}).catch(y=>{try{v()}finally{d||u(y)}}),dispose(){d||(d=!0,p.abort(),v())}}}async function Me(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 c=o.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(c))throw new Error("Editor resource returned "+(c||"no Content-Type")+" instead of JavaScript.");return await o.arrayBuffer(),e?.throwIfAborted(),i(t)}var He="0.3.52";function ye({comparison:t,identity:e,t:s,single:i=!1}){let o=(0,W.useRef)(null),c=(0,W.useRef)(null),[u,p]=(0,W.useState)(!0),[a,d]=(0,W.useState)(!1),[v,g]=(0,W.useState)(!1),[y,L]=(0,W.useState)(!0),[S,l]=(0,W.useState)(!1),[x,m]=(0,W.useState)("");return(0,W.useEffect)(()=>{if(l(!1),m(""),!y)return;let f=A=>new URL("vcs-assets/"+A,document.baseURI).href,h=document.createElement("link");h.rel="stylesheet",h.href=f("editor.css"),document.head.appendChild(h);let F=Ut({node:o.current,comparison:t,key:e,single:i,load:A=>Me(f("editor.js")+"?v="+encodeURIComponent(He)+"&retry=0",{signal:A}),onReady:A=>{c.current=A,l(!0)},onError:A=>m(A.message)});return()=>{c.current=null;try{F.dispose()}finally{h.remove()}}},[y,t,e,i]),(0,W.useEffect)(()=>{S&&c.current?.options({sideBySide:u,ignoreWhitespace:a,wrap:v})},[S,u,a,v]),W.default.createElement("div",null,W.default.createElement("button",{"aria-pressed":y,onClick:()=>L(f=>!f)},s(y?"historyBasic":"historyAdvanced")),S&&!i&&W.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},W.default.createElement("button",{"aria-pressed":u,onClick:()=>p(f=>!f)},s(u?"side":"inline")),W.default.createElement("label",null,W.default.createElement("input",{type:"checkbox",checked:a,onChange:f=>d(f.target.checked)}),s("whitespace")),W.default.createElement("label",null,W.default.createElement("input",{type:"checkbox",checked:v,onChange:f=>g(f.target.checked)}),s("wrap")),W.default.createElement("button",{onClick:()=>c.current?.navigate("previous")},s("previous")),W.default.createElement("button",{onClick:()=>c.current?.navigate("next")},s("next"))),y&&!S&&!x&&W.default.createElement("p",{role:"status"},s("loading")),x&&W.default.createElement("p",{role:"status"},s("fallback")," ",x),W.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},W.default.createElement("div",{ref:o,style:{position:"absolute",inset:0,visibility:S?"visible":"hidden"},"aria-hidden":!S}),!S&&W.default.createElement(be,{comparison:t,labels:Be(s)})))}function et({sessionId:t,repositoryId:e,commit:s,path:i,rpc:o,t:c,onRediscover:u,onClose:p}){let[a,d]=(0,q.useState)(null),[v,g]=(0,q.useState)(""),[y,L]=(0,q.useState)(0);(0,q.useEffect)(()=>{let l=new AbortController;return d(null),g(""),o("vcs/tree-file",{sessionId:t,repositoryId:e,commit:s,path:i},l.signal).then(x=>{l.signal.aborted||d(x)}).catch(x=>{l.signal.aborted||(g(x.message),x.code==="vcs/rediscover-required"&&u())}),()=>l.abort()},[t,e,s,i,y]);let S=(0,q.useMemo)(()=>a?{path:i,left:{label:s,text:a.text||""},right:{label:s,text:a.text||""}}:null,[a,i,s]);return q.default.createElement("section",{"aria-label":c("treePreview")},q.default.createElement("h4",null,i),q.default.createElement("button",{onClick:p},c("treeClose")),q.default.createElement("p",null,q.default.createElement("code",null,s)),v?q.default.createElement("p",{role:"alert"},v," ",q.default.createElement("button",{onClick:()=>L(l=>l+1)},c("retry"))):a?q.default.createElement(q.default.Fragment,null,q.default.createElement("p",null,q.default.createElement("code",null,a.oid)," \xB7 ",c("encoding"),": ",a.encoding||"\u2014"),a.notice&&q.default.createElement("p",{role:"status"},a.notice),a.binary?q.default.createElement("p",null,c("binary")):a.text===""?q.default.createElement("p",null,c("treeEmpty")):q.default.createElement(ye,{single:!0,comparison:S,identity:JSON.stringify([t,e,s,i]),t:c})):q.default.createElement("p",{role:"status"},c("loading")))}function Wt(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 It(t,e="",s=""){let i=e?e+"/":"",o=s.toLowerCase();return t.filter(c=>{let u=c.path.slice(i.length);return c.path.startsWith(i)&&u.length>0&&!u.includes("/")&&u.toLowerCase().includes(o)}).sort((c,u)=>+(u.type==="tree")-+(c.type==="tree")||(c.path<u.path?-1:c.path>u.path?1:0))}function Tr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c}){let[u,p]=(0,N.useState)(null),[a,d]=(0,N.useState)(""),[v,g]=(0,N.useState)(0),[y,L]=(0,N.useState)(""),[S,l]=(0,N.useState)(0),[x,m]=(0,N.useState)(""),[f,h]=(0,N.useState)(null);if((0,N.useEffect)(()=>{let w=new AbortController;return p(null),d(""),i("vcs/tree",{sessionId:t,repositoryId:e,commit:s},w.signal).then(I=>{w.signal.aborted||p(I)}).catch(I=>{w.signal.aborted||(d(I.message),I.code==="vcs/rediscover-required"&&c())}),()=>w.abort()},[t,e,s,v]),a)return N.default.createElement("p",{role:"alert"},a," ",N.default.createElement("button",{onClick:()=>g(w=>w+1)},o("retry")));if(!u)return N.default.createElement("p",{role:"status"},o("loading"));let F=y?y+"/":"",A=It(u.entries,y,x),P=w=>{L(w),l(0),m(""),h(null)};return N.default.createElement("section",{"aria-label":o("historicalTree")},N.default.createElement("p",null,o("historicalTreeScope")),N.default.createElement("code",null,s),N.default.createElement("p",null,y||"/"," ",y&&N.default.createElement("button",{onClick:()=>P(y.includes("/")?y.slice(0,y.lastIndexOf("/")):"")},o("treeUp"))),N.default.createElement("nav",{"aria-label":o("treeBreadcrumbs")},Wt(y).map(w=>N.default.createElement(N.default.Fragment,{key:w.path},w.path&&" / ",w.path===y?N.default.createElement("span",{"aria-current":"location"},w.name):N.default.createElement("button",{onClick:()=>P(w.path)},w.name)))),N.default.createElement("label",null,o("treeSearch")," ",N.default.createElement("input",{"aria-label":o("treeSearch"),value:x,onChange:w=>{m(w.target.value),l(0),h(null)}})),N.default.createElement("p",null,A.length," ",o("treeEntries")),!A.length&&x&&N.default.createElement("p",{role:"status"},o("emptySearch")),N.default.createElement("ul",null,A.slice(S*100,S*100+100).map(w=>N.default.createElement("li",{key:w.path},w.type==="tree"?N.default.createElement("button",{onClick:()=>P(w.path)},w.path.slice(F.length),"/"):w.type==="blob"&&["100644","100755"].includes(w.mode)?N.default.createElement("button",{"aria-pressed":f===w.path,onClick:()=>h(w.path)},w.path.slice(F.length)):N.default.createElement("span",null,w.path.slice(F.length))," \xB7 ",N.default.createElement("code",null,w.mode," ",w.type," ",N.default.createElement("span",{title:w.oid},w.oid.slice(0,10)))))),S>0&&N.default.createElement("button",{onClick:()=>{l(w=>w-1),h(null)}},o("treePrevious")),(S+1)*100<A.length&&N.default.createElement("button",{onClick:()=>{l(w=>w+1),h(null)}},o("treeNext")),f&&N.default.createElement(et,{key:JSON.stringify([t,e,s,f]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c,path:f,onClose:()=>h(null)}))}function tt(t){return N.default.createElement(Or,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function Or(t){let[e,s]=(0,N.useState)(!1);return N.default.createElement("div",null,N.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historicalTree")),e&&N.default.createElement(Tr,{...t}))}var V=K(require("react"),1);var O=K(require("react"),1);function jr({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:c,t:u,onRediscover:p,onSelectCommit:a}){let[d,v]=(0,O.useState)({commits:[],nextOffset:null}),[g,y]=(0,O.useState)(0),[L,S]=(0,O.useState)(0),[l,x]=(0,O.useState)(!0),[m,f]=(0,O.useState)("");return(0,O.useEffect)(()=>{let h=new AbortController;return x(!0),f(""),c("vcs/file-history",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,offset:g,limit:50},h.signal).then(F=>{h.signal.aborted||v(A=>({...F,commits:g?[...A.commits,...F.commits]:F.commits}))}).catch(F=>{h.signal.aborted||(f(F.message),F.code==="vcs/rediscover-required"&&p())}).finally(()=>{h.signal.aborted||x(!1)}),()=>h.abort()},[t,e,s,i,o,g,L]),O.default.createElement("section",{"aria-label":u("fileHistory"),"aria-busy":l},O.default.createElement("p",null,u("fileHistoryScope")),O.default.createElement("p",{style:{overflowWrap:"anywhere"}},d.path," \xB7 ",O.default.createElement("code",null,s)),O.default.createElement("ol",null,d.commits.map(h=>O.default.createElement("li",{key:h.id},O.default.createElement("code",{title:h.id},h.id.slice(0,10))," \xB7 ",a?O.default.createElement("button",{onClick:()=>a(h.id,d.path)},h.subject):h.subject,O.default.createElement("div",null,h.author," \xB7 ",O.default.createElement("time",{dateTime:h.date},h.date))))),l&&O.default.createElement("p",{role:"status"},u("loading")),m&&O.default.createElement("p",{role:"alert"},m," ",O.default.createElement("button",{onClick:()=>S(h=>h+1)},u("retry"))),!l&&!m&&!d.commits.length&&O.default.createElement("p",null,u("historyEmpty")),d.truncated&&O.default.createElement("p",{role:"status"},u("historyLimit")),!m&&d.nextOffset!==null&&O.default.createElement("button",{disabled:l,onClick:()=>y(d.nextOffset)},u("historyMore")))}function rt(t){return O.default.createElement(Ur,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit,t.parentIndex,t.id]),...t})}function Ur(t){let[e,s]=(0,O.useState)(!1);return O.default.createElement("div",null,O.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("fileHistory")),e&&O.default.createElement(jr,{...t}))}var j=K(require("react"),1);function qt(t,{width:e,height:s,signal:i,timeoutMs:o=1e4,createURL:c=a=>URL.createObjectURL(a),revokeURL:u=a=>URL.revokeObjectURL(a),createImage:p=()=>new Image}={}){return new Promise((a,d)=>{if(i?.aborted){d(i.reason);return}if(t?.type!=="image/png"||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){d(new Error("Invalid image preview"));return}let v,g,y,L=!1,S=!1,l=()=>{S||(S=!0,g&&(g.src=""),v&&u(v))},x=()=>{clearTimeout(y),i?.removeEventListener("abort",f)},m=h=>{L||(L=!0,x(),l(),d(h))},f=()=>m(i.reason||new Error("Image cancelled"));try{v=c(t),g=p(),i?.addEventListener("abort",f,{once:!0}),y=setTimeout(()=>m(new Error("Image decode timed out")),o),g.src=v,Promise.resolve(g.decode()).then(()=>{if(!L){if(i?.aborted){f();return}if(g.naturalWidth!==e||g.naturalHeight!==s){m(new Error("Image dimensions mismatch"));return}L=!0,x(),a({url:v,dispose:l})}},m)}catch(h){m(h)}})}function Wr({side:t,sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:c,rpc:u,t:p,onRediscover:a}){let[d,v]=(0,j.useState)(null),[g,y]=(0,j.useState)(""),[L,S]=(0,j.useState)(0);return(0,j.useEffect)(()=>{let l=new AbortController,x;return v(null),y(""),(async()=>{let m=await u("vcs/commit-image",{sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:c,side:t},l.signal);if(l.signal.aborted)return;if(m.absent){v(m);return}if(m.mime!=="image/png"||typeof m.base64!="string"||m.base64.length>2796204||!Number.isInteger(m.bytes)||m.bytes<1||m.bytes>2097152)throw Error(p("imageInvalid"));let f=atob(m.base64);if(f.length!==m.bytes)throw Error(p("imageInvalid"));let h=new Blob([Uint8Array.from(f,F=>F.charCodeAt(0))],{type:m.mime});if(x=await qt(h,{width:m.width,height:m.height,signal:l.signal}),l.signal.aborted){x.dispose();return}v({...m,url:x.url})})().catch(m=>{l.signal.aborted||(y(m.message),m.code==="vcs/rediscover-required"&&a())}),()=>{l.abort(),x?.dispose()}},[t,e,s,i,o,c,L]),j.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":p(t==="left"?"imageBefore":"imageAfter")},j.default.createElement("h5",null,p(t==="left"?"imageBefore":"imageAfter")),g?j.default.createElement("p",{role:"alert"},g," ",j.default.createElement("button",{onClick:()=>S(l=>l+1)},p("retry"))):d?j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,j.default.createElement("code",null,d.commit)," \xB7 ",d.path),d.absent?j.default.createElement("p",null,p("imageAbsent")):j.default.createElement(j.default.Fragment,null,j.default.createElement("p",null,d.width," \xD7 ",d.height," \xB7 ",d.bytes," B"),j.default.createElement("img",{src:d.url,alt:d.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),d.metadataStripped&&j.default.createElement("p",null,p("imageMetadata")))):j.default.createElement("p",{role:"status"},p("loading")))}function ot(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(Wr,{key:i,...t,side:i})))))}var B=K(require("react"),1);function Ir({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:c,t:u,onRediscover:p,onSelectCommit:a}){let[d,v]=(0,B.useState)(null),[g,y]=(0,B.useState)(""),[L,S]=(0,B.useState)(0);return(0,B.useEffect)(()=>{let l=new AbortController;return v(null),y(""),c("vcs/blame",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o},l.signal).then(x=>{l.signal.aborted||v(x)}).catch(x=>{l.signal.aborted||(y(x.message),x.code==="vcs/rediscover-required"&&p())}),()=>l.abort()},[t,e,s,i,o,L]),g?B.default.createElement("p",{role:"alert"},g," ",B.default.createElement("button",{onClick:()=>S(l=>l+1)},u("retry"))):d?B.default.createElement("section",{"aria-label":u("blame")},B.default.createElement("p",null,u("blameScope")),a&&B.default.createElement("p",null,u("blameNavigation")),d.notice&&B.default.createElement("p",{role:"status"},d.notice),d.truncated&&B.default.createElement("p",{role:"status"},u("blameLimit")),!d.notice&&!d.lines.length&&B.default.createElement("p",null,u("blameEmpty")),!!d.lines.length&&B.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},B.default.createElement("table",null,B.default.createElement("thead",null,B.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(l=>B.default.createElement("th",{key:l,scope:"col"},u(l))))),B.default.createElement("tbody",null,d.lines.map(l=>B.default.createElement("tr",{key:l.line},B.default.createElement("th",{scope:"row"},l.line),B.default.createElement("td",null,a?B.default.createElement("button",{title:l.commit,onClick:()=>a(l.commit)},B.default.createElement("code",null,l.commit.slice(0,10))):B.default.createElement("code",{title:l.commit},l.commit.slice(0,10))),B.default.createElement("td",null,l.author),B.default.createElement("td",null,l.summary),B.default.createElement("td",null,B.default.createElement("pre",{style:{margin:0}},l.text)))))))):B.default.createElement("p",{role:"status"},u("loading"))}function st(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("blame")),e&&B.default.createElement(Ir,{...t}))}function xe({sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:c,id:u,rpc:p,t:a,onRediscover:d,onSelectCommit:v}){let[g,y]=(0,V.useState)(null),[L,S]=(0,V.useState)(""),[l,x]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let m=new AbortController;return y(null),S(""),p(o?"vcs/revision-compare":"vcs/commit-compare",o?{sessionId:t,repositoryId:e,base:o,target:c,id:u}:{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u},m.signal).then(f=>{m.signal.aborted||y(f)}).catch(f=>{m.signal.aborted||(S(f.message),f.code==="vcs/rediscover-required"&&d())}),()=>m.abort()},[t,e,s,i,o,c,u,l]),L?V.default.createElement("p",{role:"alert"},L," ",V.default.createElement("button",{onClick:()=>x(m=>m+1)},a("retry"))):g?V.default.createElement("section",null,V.default.createElement("h4",null,g.path),V.default.createElement("p",null,g.left.label," \u2194 ",g.right.label),g.notice&&V.default.createElement("p",{role:"status"},g.notice),g.binary?V.default.createElement("p",null,a("binary")):V.default.createElement(ye,{comparison:g,identity:JSON.stringify(o?[t,e,o,c,u]:[t,e,s,i,u]),t:a}),s&&!o&&V.default.createElement(rt,{onSelectCommit:v,key:"file-history:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:d}),s&&!o&&V.default.createElement(st,{onSelectCommit:v,key:"blame:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:d}),s&&!o&&V.default.createElement(ot,{key:"image:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:d})):V.default.createElement("p",{role:"status"},a("loading"))}function zt(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 Gt(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 Fe(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.path,i.oldPath].some(o=>o?.toLowerCase().includes(s))):t}function it(t){return M.default.createElement(qr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function qr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c,onSelectCommit:u,initialPath:p}){let a=(0,M.useRef)(!0),[d,v]=(0,M.useState)(null),[g,y]=(0,M.useState)(""),[L,S]=(0,M.useState)(0),[l,x]=(0,M.useState)(null),[m,f]=(0,M.useState)(""),[h,F]=(0,M.useState)(0);if((0,M.useEffect)(()=>{let P=new AbortController;return x(null),f(""),i("vcs/commit",{sessionId:t,repositoryId:e,commit:s,parentIndex:L},P.signal).then(w=>{P.signal.aborted||(x(w),a.current&&(a.current=!1,v(zt(w.changes,p))))}).catch(w=>{P.signal.aborted||(f(w.message),w.code==="vcs/rediscover-required"&&c())}),()=>P.abort()},[t,e,s,L,h]),m)return M.default.createElement("p",{role:"alert"},m," ",M.default.createElement("button",{onClick:()=>F(P=>P+1)},o("retry")));if(!l)return M.default.createElement("p",{role:"status"},o("loading"));let A=Fe(l.changes,g);return M.default.createElement("section",{"aria-label":o("commitDetails")},M.default.createElement("h3",null,l.subject),M.default.createElement("code",null,l.id),M.default.createElement("p",null,l.author," \xB7 ",l.date),l.messageTruncated&&M.default.createElement("p",{role:"status"},o("commitMessageLimit")),l.message&&M.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},l.message),l.parents.length>1&&M.default.createElement("label",null,o("commitParent")," ",M.default.createElement("select",{"aria-label":o("commitParent"),value:L,onChange:P=>{v(null),x(null),S(Number(P.target.value))}},l.parents.map((P,w)=>M.default.createElement("option",{key:P,value:w},w+1,": ",P.slice(0,10))))),M.default.createElement("p",null,l.parent||o("commitRoot")," \u2192 ",l.id.slice(0,10)),M.default.createElement("label",null,o("commitFileSearch")," ",M.default.createElement("input",{"aria-label":o("commitFileSearch"),value:g,onChange:P=>{y(P.target.value),v(null)}})),M.default.createElement("span",null," ",A.length," / ",l.changes.length),M.default.createElement("ul",null,A.map(P=>M.default.createElement("li",{key:P.id},M.default.createElement("button",{"aria-pressed":d===P.id,onClick:()=>v(P.id)},P.status," \xB7 ",P.oldPath?P.oldPath+" \u2192 ":"",P.path)))),!!l.changes.length&&!A.length&&M.default.createElement("p",{role:"status"},o("emptySearch")),!l.changes.length&&M.default.createElement("p",null,o("commitNoChanges")),d&&M.default.createElement(xe,{key:d,sessionId:t,repositoryId:e,commit:s,parentIndex:L,id:d,onSelectCommit:u,rpc:i,t:o,onRediscover:c}),M.default.createElement(tt,{key:JSON.stringify([t,e,s]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c}))}var z=K(require("react"),1);function Jt(t){if(!Array.isArray(t))throw new Error("Invalid graph commits");let e=t.slice(0,200),s=new Map,i=[],o=[],c=p=>typeof p=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(p);for(let[p,a]of e.entries()){if(!a||!c(a.id)||!Array.isArray(a.parents)||s.has(a.id))throw new Error("Invalid graph node");s.set(a.id,p),i.push({id:a.id,row:p})}let u=!1;for(let p of e){let a=new Set;for(let d of p.parents){if(o.length===1e3){u=!0;break}if(!c(d)||d.length!==p.id.length||d===p.id||a.has(d))throw new Error("Invalid graph parent");a.add(d);let v=s.get(d);if(v!==void 0&&v<=s.get(p.id))throw new Error("Graph requires child-before-parent order");o.push({from:p.id,to:d,missing:v===void 0})}if(u)break}return{nodes:i,edges:o,nodesTruncated:t.length>200,edgesTruncated:u}}function Vt(t){let e=new Map(t.nodes.map(i=>[i.id,i.row])),s=[];return t.edges.filter(i=>!i.missing).map(i=>{let o=e.get(i.from),c=e.get(i.to),u=s.findIndex(p=>p<o);return u<0&&(u=s.length),s[u]=c,{...i,lane:u,start:o,end:c}})}function zr({commits:t,selected:e,onSelect:s,t:i}){let o;try{o=Jt(t)}catch{return z.default.createElement("p",{role:"alert"},i("graphInvalid"))}let c=Vt(o),u=Math.max(100,48+12*Math.max(0,...c.map(a=>a.lane))),p=Math.max(40,o.nodes.length*36);return z.default.createElement("section",{"aria-label":i("historyGraph")},z.default.createElement("p",null,i("graphScope")),(o.nodesTruncated||o.edgesTruncated)&&z.default.createElement("p",{role:"status"},i("graphLimit")),z.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},z.default.createElement("svg",{width:u,height:p,"aria-hidden":"true",style:{flexShrink:0}},c.map(a=>{let d=a.start*36+18,v=a.end*36+18,g=35+a.lane*12;return z.default.createElement("path",{key:a.from+a.to,d:"M 12 "+d+" C "+g+" "+d+", "+g+" "+v+", 12 "+v,fill:"none",stroke:"currentColor",opacity:"0.45"})}),o.nodes.map(a=>z.default.createElement("circle",{key:a.id,cx:"12",cy:a.row*36+18,r:"4",fill:"currentColor"}))),z.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},o.nodes.map(a=>z.default.createElement("li",{key:a.id,style:{height:36,whiteSpace:"nowrap"}},z.default.createElement("button",{title:a.id,"aria-current":e===a.id?!0:void 0,style:e===a.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:d=>{if(d.altKey||d.ctrlKey||d.metaKey||d.shiftKey)return;let v=d.key==="ArrowDown"?Math.min(a.row+1,o.nodes.length-1):d.key==="ArrowUp"?Math.max(0,a.row-1):d.key==="Home"?0:d.key==="End"?o.nodes.length-1:null;v!==null&&(d.preventDefault(),d.stopPropagation(),d.currentTarget.closest("ol").querySelectorAll("button")[v]?.focus())},onClick:()=>s(a.id)},z.default.createElement("code",null,a.id.slice(0,10))," ",t[a.row].subject))))),z.default.createElement("details",null,z.default.createElement("summary",null,i("graphRelations")),z.default.createElement("ul",null,o.edges.map(a=>z.default.createElement("li",{key:a.from+a.to},z.default.createElement("code",null,a.from)," \u2192 ",z.default.createElement("code",null,a.to),a.missing?" \xB7 "+i("graphMissing"):"")))))}function nt(t){let[e,s]=(0,z.useState)(!1);return z.default.createElement("div",null,z.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historyGraph")),e&&z.default.createElement(zr,{...t}))}var k=K(require("react"),1);function Gr({sessionId:t,repositoryId:e,base:s,target:i,rpc:o,t:c,onRediscover:u}){let[p,a]=(0,k.useState)(null),[d,v]=(0,k.useState)(""),[g,y]=(0,k.useState)(0),[L,S]=(0,k.useState)(null),[l,x]=(0,k.useState)("");if((0,k.useEffect)(()=>{let f=new AbortController;return a(null),v(""),S(null),o("vcs/revision-changes",{sessionId:t,repositoryId:e,base:s,target:i},f.signal).then(h=>{f.signal.aborted||a(h)}).catch(h=>{f.signal.aborted||(v(h.message),h.code==="vcs/rediscover-required"&&u())}),()=>f.abort()},[t,e,s,i,g]),d)return k.default.createElement("p",{role:"alert"},d," ",k.default.createElement("button",{onClick:()=>y(f=>f+1)},c("retry")));if(!p)return k.default.createElement("p",{role:"status"},c("loading"));let m=Fe(p.changes,l);return k.default.createElement("div",null,k.default.createElement("label",null,c("commitFileSearch")," ",k.default.createElement("input",{"aria-label":c("commitFileSearch"),value:l,onChange:f=>{x(f.target.value),S(null)}})),k.default.createElement("span",null," ",m.length," / ",p.changes.length),!!p.changes.length&&!m.length&&k.default.createElement("p",{role:"status"},c("emptySearch")),!p.changes.length&&k.default.createElement("p",null,c("revisionEmpty")),k.default.createElement("ul",null,m.map(f=>k.default.createElement("li",{key:f.id},k.default.createElement("button",{"aria-pressed":L===f.id,onClick:()=>S(f.id)},f.status," \xB7 ",f.oldPath?f.oldPath+" \u2192 ":"",f.path)))),L&&k.default.createElement(xe,{key:L,sessionId:t,repositoryId:e,base:s,target:i,id:L,rpc:o,t:c,onRediscover:u}))}function at(t){return k.default.createElement(Jr,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function Jr({commits:t,sessionId:e,repositoryId:s,rpc:i,t:o,onRediscover:c,onReferencesLoaded:u}){let[p,a]=(0,k.useState)(""),[d,v]=(0,k.useState)(""),[g,y]=(0,k.useState)([]),[L,S]=(0,k.useState)(!1),[l,x]=(0,k.useState)(0),[m,f]=(0,k.useState)(!1),[h,F]=(0,k.useState)("");return(0,k.useEffect)(()=>{if(!l)return;let A=new AbortController;return f(!0),F(""),i("vcs/references",{sessionId:e,repositoryId:s},A.signal).then(P=>{A.signal.aborted||(y(P.references),S(!0),u?.(P.references))}).catch(P=>{A.signal.aborted||(F(P.message),P.code==="vcs/rediscover-required"&&c())}).finally(()=>{A.signal.aborted||f(!1)}),()=>A.abort()},[e,s,l]),k.default.createElement("section",{"aria-label":o("revisionTitle")},k.default.createElement("h3",null,o("revisionTitle")),k.default.createElement("p",null,o("revisionScope")),k.default.createElement("button",{disabled:m,onClick:()=>x(A=>A+1)},o("revisionLoadRefs")),k.default.createElement("p",null,o("revisionRefsScope")),L&&!m&&!h&&k.default.createElement("p",{role:"status"},g.length?`${o("revisionRefsCount")}: ${g.length}`:o("revisionRefsEmpty")),m&&k.default.createElement("p",{role:"status"},o("loading")),h&&k.default.createElement("p",{role:"alert"},h),[[p,a,"revisionBase"],[d,v,"revisionTarget"]].map(([A,P,w])=>k.default.createElement("label",{key:w},o(w)," ",k.default.createElement("select",{"aria-label":o(w),value:A,onChange:I=>P(I.target.value)},k.default.createElement("option",{value:""},"\u2014"),!!t.length&&k.default.createElement("optgroup",{label:o("revisionLoadedCommits")},t.map(I=>k.default.createElement("option",{key:I.id,value:I.id},I.id.slice(0,10)," \xB7 ",I.subject))),!!g.length&&k.default.createElement("optgroup",{label:o("revisionLocalRefs")},g.map(I=>k.default.createElement("option",{key:I.name,value:I.commit},I.name," \xB7 ",I.commit.slice(0,10)))),A&&!t.some(I=>I.id===A)&&!g.some(I=>I.commit===A)&&k.default.createElement("option",{value:A},A)))),k.default.createElement("button",{disabled:!p||!d,onClick:()=>{a(d),v(p)}},o("revisionSwap")),k.default.createElement("p",{style:{overflowWrap:"anywhere"}},k.default.createElement("code",null,p||"\u2014")," \u2192 ",k.default.createElement("code",null,d||"\u2014")),p&&d&&k.default.createElement(Gr,{key:JSON.stringify([e,s,p,d]),sessionId:e,repositoryId:s,base:p,target:d,rpc:i,t:o,onRediscover:c}))}function lt(t){return E.default.createElement(Vr,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function Vr({sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o}){let[c,u]=(0,E.useState)({id:null,path:null,revision:0}),[p,a]=(0,E.useState)(""),[d,v]=(0,E.useState)(null),g=(0,E.useMemo)(()=>jt(d||[]),[d]),y=c.id,L=(T,H=null)=>u(_=>({id:T,path:H,revision:_.revision+1})),S=(T,H=null)=>u(_=>({id:T,path:H,revision:_.revision+(H||_.path?1:0)})),[l,x]=(0,E.useState)({commits:[],snapshot:null,nextOffset:null}),[m,f]=(0,E.useState)(0),[h,F]=(0,E.useState)(0),[A,P]=(0,E.useState)(!0),[w,I]=(0,E.useState)("");(0,E.useEffect)(()=>{let T=new AbortController;return P(!0),I(""),s("vcs/history",{sessionId:t,repositoryId:e,offset:m,limit:50,...m?{snapshot:l.snapshot}:{}},T.signal).then(H=>{T.signal.aborted||x(_=>({...H,commits:m?[..._.commits,...H.commits]:H.commits}))}).catch(H=>{T.signal.aborted||(I(H.message),H.code==="vcs/rediscover-required"&&o())}).finally(()=>{T.signal.aborted||P(!1)}),()=>T.abort()},[t,e,m,h]);let Z=Gt(l.commits,p);return E.default.createElement("section",{className:"vcs-history","aria-label":i("history"),"aria-busy":A},E.default.createElement("div",{className:"vcs-history-list"},E.default.createElement("p",null,i("historyListOnly")),d!==null&&E.default.createElement("p",null,i("historyRefsScope")),E.default.createElement("label",null,i("historySearch")," ",E.default.createElement("input",{"aria-label":i("historySearch"),value:p,onChange:T=>{a(T.target.value),S(null)}})),E.default.createElement("span",null," ",Z.length," / ",l.commits.length),!!l.commits.length&&!Z.length&&E.default.createElement("p",{role:"status"},i("historyNoMatch")),E.default.createElement("ol",null,Z.map(T=>E.default.createElement("li",{key:T.id},E.default.createElement("button",{"aria-pressed":y===T.id,onClick:()=>S(T.id)},T.subject),E.default.createElement("div",null,E.default.createElement("code",{title:T.id},T.id.slice(0,10))," \xB7 ",T.author," \xB7 ",E.default.createElement("time",{dateTime:T.date},T.date)),g.has(T.id)&&E.default.createElement("div",{"aria-label":i("historyRefsLabel"),style:{overflowWrap:"anywhere"}},g.get(T.id).names.map(H=>E.default.createElement("span",{key:H},E.default.createElement("code",null,H)," ")),g.get(T.id).hidden>0&&E.default.createElement("span",null,i("historyRefsMore"),": ",g.get(T.id).hidden))))),A&&E.default.createElement("p",{role:"status"},i("loading")),w&&E.default.createElement("p",{role:"alert"},w," ",E.default.createElement("button",{onClick:()=>F(T=>T+1)},i("retry"))),!A&&!w&&!l.commits.length&&E.default.createElement("p",null,i("historyEmpty")),l.truncated&&E.default.createElement("p",{role:"status"},i("historyLimit")),!w&&l.nextOffset!==null&&E.default.createElement("button",{disabled:A,onClick:()=>f(l.nextOffset)},i("historyMore")),!!l.commits.length&&E.default.createElement(nt,{commits:l.commits,selected:y,onSelect:S,t:i}),E.default.createElement(at,{onReferencesLoaded:v,commits:l.commits,sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o})),E.default.createElement("div",{className:"vcs-history-details"},y&&E.default.createElement(it,{key:JSON.stringify([y,c.revision]),initialPath:c.path,sessionId:t,repositoryId:e,commit:y,onSelectCommit:L,rpc:s,t:i,onRediscover:o})))}var Kt={zh:{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:"\u4EC5\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u666E\u901A\u6587\u4EF6\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\u5DE5\u4F5C\u533A\u4FEE\u6539\u4E0D\u5305\u542B\u5728\u5185\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:{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 regular files only; at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Working changes are excluded.",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 _t(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 c=o?.isContentEditable||o?.closest?.('input,textarea,select,[role="textbox"]');if(c&&o!==s)return null;if((t.ctrlKey||t.metaKey)&&!t.altKey&&!t.shiftKey&&t.key?.toLowerCase()==="f")return"search";if(!c&&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 Yt(t,e,s){if(!(!t||!e))try{(s??globalThis.localStorage)?.setItem(Qt(t),e)}catch{}}function Zt(t,e=""){return t.find(s=>s.id===e)?.id||t.find(s=>s.relativePath===".")?.id||t[0]?.id||""}var we=(t,e)=>JSON.stringify([t,e]),ke=(t,e=".")=>[t.type.toUpperCase(),t.relativePath==="."?e:t.relativePath||".",t.branch].filter(Boolean).join(" \xB7 "),Te=(t,e="all")=>t.type==="git"&&["staged","unstaged"].includes(e)?e:"all",$t=(t="",e="")=>t===e?0:t<e?-1:1;function dt(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 c=e;for(let u of o.slice(0,-1)){let p=c.id?c.id+"/"+u:u;c.directories.has(u)||c.directories.set(u,{id:p,name:u,directories:new Map,files:[],count:0}),c=c.directories.get(u),c.count++}c.files.push(i)}let s=i=>({...i,directories:[...i.directories.values()].sort((o,c)=>$t(o.name,c.name)).map(s),files:[...i.files].sort((o,c)=>$t(o.path,c.path))});return s(e)}function Rt(t=[],e){let s=t.findIndex(i=>i.id===e);return{index:s<0?0:s+1,total:t.length}}function er(t=[],e,s){if(!t.length||!["previous","next"].includes(s))return null;let i=t.findIndex(u=>u.id===e),o=s==="next"?1:-1,c=i<0?s==="next"?-1:0:i;return t[(c+o+t.length)%t.length]||null}function tr(t=""){let e=String(t).split("/").filter(Boolean);return e.slice(0,-1).map((s,i)=>e.slice(0,i+1).join("/"))}function ct(t,e=[]){for(let s of t?.directories||[])e.push(s.id),ct(s,e);return e}function rr(t=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[t]||t}function or(t=[]){return t.reduce((e,s)=>{let i=rr(s.status);return e.all++,e[i]=(e[i]||0)+1,e},{all:0})}function _r(t=[],e="",s="all"){let i=e.toLowerCase();return t.filter(o=>(s==="all"||rr(o.status)===s)&&o.path.toLowerCase().includes(i)).sort((o,c)=>o.path.localeCompare(c.path))}function sr(t,e,s="",i="all"){return t.map(o=>({...e[o.id],repository:o,changes:_r(e[o.id]?.changes,s,i)}))}function ir(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 nr(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,c)=>new Promise((u,p)=>{let a={run:o,signal:c,resolve:u,reject:p,abort:null};if(a.abort=()=>{let d=s.indexOf(a);d>=0&&(s.splice(d,1),p(new Error("Aborted")))},c?.aborted){p(new Error("Aborted"));return}c?.addEventListener("abort",a.abort,{once:!0}),s.push(a),i()})}var ar={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},lr=t=>new URL("vcs-assets/"+t,document.baseURI).href;function dr(){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 Qr=["slots","layout","locale","connection","uiSession"];function Xr(t){t.effect(()=>t.locale.register("local.vcs",Kt));let e=t.locale.bind("local.vcs"),s=nr(2);async function i(p,a,d){let v=await t.connection.rpc.call("/vcs-rpc",p,a,d);if(!v.ok){let g=new Error(v.error?.message||String(v.error||e("error")));throw g.code=v.error?.code,g}return v.value}function o(p){let a=p.useSessions(d=>Object.values(d.byId).find(v=>(v.retainedBy.mainView??0)>0));return r.default.createElement(c,{key:JSON.stringify([a?.id,a?.cwd])},r.default.createElement(u,{session:a}))}class c extends r.default.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}render(){return this.state.error?r.default.createElement("section",{className:"vcs-root"},r.default.createElement("style",null,Ze),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 u({session:p}){(0,r.useSyncExternalStore)(n=>t.locale.subscribe(n),()=>t.locale.getSnapshot(),()=>t.locale.getSnapshot());let a=p?.id,[d,v]=(0,r.useState)("all"),[g,y]=(0,r.useState)(0),[L,S]=(0,r.useState)(0),[l,x]=(0,r.useState)(null),[m,f]=(0,r.useState)({}),[h,F]=(0,r.useState)(()=>Xt(p?.cwd)),[A,P]=(0,r.useState)(0),[w,I]=(0,r.useState)(""),[Z,T]=(0,r.useState)(""),[H,_]=(0,r.useState)(null),[C,oe]=(0,r.useState)(null),[Se,pt]=(0,r.useState)(!1),[cr,ut]=(0,r.useState)(!1),[se,ft]=(0,r.useState)(""),[Oe,ie]=(0,r.useState)(""),[Y,mt]=(0,r.useState)(""),[ht,vt]=(0,r.useState)(!1),[ee,je]=(0,r.useState)(""),[Ce,gt]=(0,r.useState)("all"),[ne,bt]=(0,r.useState)(!0),[yt,Ue]=(0,r.useState)({}),[pe,pr]=(0,r.useState)(!0),[We,ur]=(0,r.useState)(!1),[Ie,fr]=(0,r.useState)(!1),[Ne,ue]=(0,r.useState)("content"),[xt,wt]=(0,r.useState)(0),[mr,kt]=(0,r.useState)(!1),[qe,ze]=(0,r.useState)({added:0,deleted:0,count:0}),[Q,St]=(0,r.useState)(!1),Ct=(0,r.useRef)(null),Nt=(0,r.useRef)(null),ae=(0,r.useRef)(null),Ge=(0,r.useRef)(null),Ee=(0,r.useRef)(null),Je=(0,r.useRef)(null),Et=(0,r.useRef)(null),fe=(0,r.useRef)(null),Ve=(0,r.useRef)(null),Ke=(0,r.useRef)(null),_e=(0,r.useRef)(!1),Ae=(0,r.useRef)(!1),te=l?.repositories||[],le=te.filter(n=>n.id===h),X=mr&&le.some(n=>n.type==="git"),hr=()=>{fe.current?.abort(),oe(null),_(null),ie(""),kt(!0)};(0,r.useEffect)(()=>{te.some(n=>n.id===h)&&Yt(p?.cwd,h)},[p?.cwd,h,l]);let me=()=>{Et.current?.abort(),fe.current?.abort(),oe(null),_(null),ie(""),ue("content"),ze({added:0,deleted:0,count:0})},Le=()=>{Ae.current=!1,me(),Ve.current?.abort(),Ke.current=l,x(null),f({}),T(w.trim()),P(n=>n+1)},Qe=()=>{Ae.current||(Ae.current=!0,me(),Ve.current?.abort(),Ke.current=null,x(null),f({}),T(""),P(n=>n+1))},At=(n=!1)=>{n||S(b=>b+1),_e.current=n,n||me(),n||f({}),y(b=>b+1)};(0,r.useEffect)(()=>{let n=new AbortController;return Ve.current=n,ft(""),pt(!!a),a&&i("vcs/repositories",{sessionId:a,...Z?{subdirectory:Z}:{}},n.signal).then(b=>{if(!n.signal.aborted){let D=ir(Ke.current,b,Z);Ae.current=!1,F(U=>Zt(D.repositories,U)),x(D)}}).catch(b=>{n.signal.aborted||ft(b.message)}).finally(()=>{n.signal.aborted||pt(!1)}),()=>n.abort()},[a,A,Z]),(0,r.useEffect)(()=>{let n=new AbortController,b=_e.current;Et.current=n,_e.current=!1,b||(f({}),ie(""));for(let D of le){let U=Te(D,d);s(()=>i("vcs/status",{sessionId:a,repositoryId:D.id,mode:U},n.signal),n.signal).then(G=>{n.signal.aborted||f($=>({...$,[D.id]:{...G,mode:U}}))}).catch(G=>{if(!n.signal.aborted){if(G.code==="vcs/rediscover-required"){Qe();return}f($=>({...$,[D.id]:{error:G.message,changes:[],mode:U}}))}})}return()=>n.abort()},[a,l,h,d,g]),(0,r.useEffect)(()=>{let n=b=>{b.target===window&&a&&h&&document.visibilityState==="visible"&&At(!0)};return window.addEventListener("focus",n),()=>window.removeEventListener("focus",n)},[a,h,d]);let Pe=te.find(n=>n.id===H?.repositoryId),he=H?m[H.repositoryId]:null;(0,r.useEffect)(()=>{let n=new AbortController;return fe.current=n,oe(null),ie(""),ze({added:0,deleted:0,count:0}),ue("content"),ut(!!H&&!!he),!X&&H&&he&&Pe&&i("vcs/compare",{sessionId:a,repositoryId:H.repositoryId,mode:Te(Pe,d),id:H.id},n.signal).then(b=>{n.signal.aborted||oe(b)}).catch(b=>{if(!n.signal.aborted){if(b.code==="vcs/rediscover-required"){Qe();return}ie(b.message)}}).finally(()=>{n.signal.aborted||ut(!1)}),()=>n.abort()},[H,he,a,d,X]),(0,r.useEffect)(()=>{let n=!1,b,D=new AbortController;St(!1),mt("");let U=document.createElement("link");return U.rel="stylesheet",U.href=lr("editor.css"),document.head.appendChild(U),Me(lr("editor.js")+"?v="+encodeURIComponent(He)+"&retry="+xt,{signal:D.signal}).then(G=>{n||(b=G.createDiff(Nt.current,{onStats:ze}),ae.current=b,St(!0))}).catch(G=>{n||mt(G.message)}),()=>{n=!0,D.abort(),b?.dispose(),ae.current=null,U.remove()}},[xt]),(0,r.useEffect)(()=>{Q&&C&&!C.binary&&ae.current?.setContent(C,JSON.stringify([a,l?.cwd,H?.repositoryId,d,H?.id,C.path]))},[Q,C,a,l,H,d]),(0,r.useEffect)(()=>{ae.current?.options({sideBySide:pe,ignoreWhitespace:We,wrap:Ie})},[Q,pe,We,Ie]);let ve=sr(le,m,ee,Ce),de=ve.flatMap(n=>n.changes),vr=or(he?.changes),Xe=Rt(de,H?.id),Lt=()=>{je(""),gt("all")},gr=async()=>{let n=C?.path||R?.path;if(n)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(n);else{let b=document.createElement("textarea");try{if(b.value=n,b.style.cssText="position:fixed;opacity:0",document.body.appendChild(b),b.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{b.remove()}}vt(!0),window.setTimeout(()=>vt(!1),1500)}catch{ie(e("copyFailed"))}};(0,r.useEffect)(()=>{let n=b=>{if(X)return;let D=_t(b,Ct.current,Ee.current,!!ee);D&&(b.preventDefault(),D==="search"?(Ee.current?.focus(),Ee.current?.select()):D==="clear"?je(""):Ye(D))};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[ee,de,H,X]);let Pt=n=>Ue(b=>{let D={...b};for(let U of ve)for(let G of ct(dt(U.changes)))D[U.repository.id+"\0"+G]=!n;return D}),br=()=>{let n=R;!n||!H||(bt(!0),Lt(),Ue(b=>{let D={...b};for(let U of tr(n.path))D[H.repositoryId+"\0"+U]=!1;return D}),Je.current=we(H.repositoryId,n.id))};(0,r.useEffect)(()=>{let n=Je.current;if(!n)return;let b=[...Ge.current?.querySelectorAll("button[data-vcs-change]")||[]].find(D=>D.dataset.vcsChange===n);b&&(b.scrollIntoView({block:"nearest"}),b.focus(),Je.current=null)},[ne,ee,Ce,yt,ve]);let Ye=n=>{let b=er(de,H?.id,n);b&&(fe.current?.abort(),oe(null),ue("content"),_({repositoryId:h,id:b.id}))},Dt=Se||le.some(n=>!m[n.id]),R=he?.changes?.find(n=>n.id===H?.id),re=C?.properties,$e=re?[...new Set([...Object.keys(re.left||{}),...Object.keys(re.right||{})])].filter(n=>re.left?.[n]!==re.right?.[n]):[],ge=n=>ar[n?.status]||n?.status?.slice(0,1).toUpperCase()||"M",Bt=C?.binary?[C.left.label,C.right.label].filter(Boolean).join(" \u2194 "):"",ce=Oe||(cr?e("loading"):a?Dt&&!R?e("loading"):se||(te.length?R?C?.binary?e("binary")+(Bt?" "+e("binaryComparison",{files:Bt}):""):C?!Q&&!Y?e("loading"):"":e("pick"):e("pick"):e("noRepo")):e("noSession")),yr=n=>{let b=Ge.current,D=b?[...b.querySelectorAll("button[data-vcs-item]")]:[],U=D.indexOf(n.target);if(U<0)return;let G;if(n.key==="ArrowDown")G=D[U+1];else if(n.key==="ArrowUp")G=D[U-1];else if(n.key==="Home")G=D[0];else if(n.key==="End")G=D.at(-1);else if(n.key==="ArrowRight"&&n.target.dataset.vcsDirectory==="closed"){n.preventDefault(),n.target.click();return}else if(n.key==="ArrowLeft"&&n.target.dataset.vcsDirectory==="open"){n.preventDefault(),n.target.click();return}else return;n.preventDefault(),G?.focus()},Mt=({entry:n,compact:b=!1,depth:D=0})=>{let U=n.path.lastIndexOf("/");return r.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":we(h,n.id),"aria-current":H?.repositoryId===h&&H?.id===n.id?"true":void 0,style:{paddingInlineStart:8+D*14},title:(n.oldPath?n.oldPath+" \u2192 ":"")+n.path+" \xB7 "+e(ge(n)),onClick:()=>{fe.current?.abort(),oe(null),ue("content"),_({repositoryId:h,id:n.id})}},r.default.createElement("span",{className:"vcs-status","data-status":ge(n)},ge(n)),r.default.createElement("span",{className:"vcs-filename"},b?n.path.slice(U+1):n.path,n.oldPath&&r.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",n.oldPath)))},Ht=({node:n,repository:b,depth:D=0})=>r.default.createElement(r.default.Fragment,null,n.directories.map(U=>{let G=b.id+"\0"+U.id,$=!!yt[G];return r.default.createElement(r.default.Fragment,{key:G},r.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":$?"closed":"open","aria-expanded":!$,style:{paddingInlineStart:8+D*14},onClick:()=>Ue(xr=>({...xr,[G]:!$}))},r.default.createElement("span",{"aria-hidden":"true"},$?"\u203A":"\u2304"),U.name,r.default.createElement("small",null,U.count)),!$&&r.default.createElement(Ht,{node:U,repository:b,depth:D+1}))}),n.files.map(U=>r.default.createElement(Mt,{key:we(b.id,U.id),entry:U,compact:n.id!=="",depth:D})));return r.default.createElement("section",{ref:Ct,className:"vcs-root","aria-label":e("title")},r.default.createElement("style",null,Ze),r.default.createElement("header",{className:"vcs-top"},r.default.createElement(dr,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:h,disabled:Se||!te.length,onChange:n=>{me(),f({}),F(n.target.value)}},!te.length&&r.default.createElement("option",{value:""},e("repositories")),te.map(n=>r.default.createElement("option",{key:n.id,value:n.id},ke(n,e("workspaceRoot"))))),r.default.createElement("label",{className:"vcs-mode"},e("gitMode")," ",r.default.createElement("select",{"aria-label":e("gitMode"),value:d,disabled:X||!le.some(n=>n.type==="git"),onChange:n=>{me(),f({}),v(n.target.value)}},["all","unstaged","staged"].map(n=>r.default.createElement("option",{key:n,value:n},e(n))))),r.default.createElement("button",{onClick:()=>At(!1),disabled:Dt||!a},e("refresh")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")),r.default.createElement("div",{className:"vcs-path",title:l?.cwd||p?.cwd},e("session"),": ",l?.cwd||p?.cwd||"\u2014"),r.default.createElement("form",{className:"vcs-discovery",onSubmit:n=>{n.preventDefault(),Le()}},r.default.createElement("input",{"aria-label":e("subdirectory"),placeholder:e("subdirectory"),value:w,onChange:n=>I(n.target.value)}),r.default.createElement("button",{disabled:!a||Se},e("rescan")),r.default.createElement("span",null,e("scanHint"))),l?.truncated&&r.default.createElement("div",{className:"vcs-notice"},e("truncated")),(l?.warnings||[]).map((n,b)=>r.default.createElement("div",{className:"vcs-notice",key:b},typeof n=="string"?n:n.message||JSON.stringify(n)))),le.some(n=>n.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":!X,onClick:()=>kt(!1)},e("workspaceView")),r.default.createElement("button",{"aria-pressed":X,"aria-expanded":X,onClick:hr},e("history"))),X&&r.default.createElement(lt,{key:JSON.stringify([a,h,L,A]),sessionId:a,repositoryId:h,rpc:i,t:e,onRediscover:Qe})),r.default.createElement("div",{className:"vcs-body",hidden:X,"aria-label":e("workspaceView")},r.default.createElement("aside",{className:"vcs-files"},r.default.createElement("div",{className:"vcs-filter"},r.default.createElement("input",{ref:Ee,"aria-label":e("search"),placeholder:e("search"),title:e("searchShortcut"),value:ee,onChange:n=>je(n.target.value)}),(ee||Ce!=="all")&&r.default.createElement("button",{className:"vcs-clear-filter",onClick:Lt},e("clearFilters"))),r.default.createElement("div",{className:"vcs-status-filter","aria-label":e("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(n=>r.default.createElement("button",{key:n,"aria-pressed":Ce===n,onClick:()=>gt(n)},e(n==="all"?"allFiles":ar[n]||"M")," ",r.default.createElement("small",null,vr[n]||0)))),r.default.createElement("div",{className:"vcs-count"},r.default.createElement("span",null,de.length," ",e("files")),r.default.createElement("span",{className:"vcs-auto"},e("autoRefresh")),r.default.createElement("button",{"aria-pressed":ne,onClick:()=>bt(!ne)},e(ne?"tree":"list"))),ne&&r.default.createElement("div",{className:"vcs-tree-actions"},r.default.createElement("button",{onClick:()=>Pt(!0)},e("expandAll")),r.default.createElement("button",{onClick:()=>Pt(!1)},e("collapseAll")),r.default.createElement("button",{onClick:br,disabled:!R},e("revealSelected"))),r.default.createElement("nav",{className:"vcs-filelist","aria-label":e("title"),ref:Ge,onKeyDown:yr},ve.map(n=>{let b=n.repository;return r.default.createElement("section",{className:"vcs-repository",key:b.id,"aria-label":ke(b,e("workspaceRoot"))},r.default.createElement("div",{className:"vcs-repository-heading",title:b.root},r.default.createElement("strong",null,ke(b,e("workspaceRoot"))),r.default.createElement("small",null,b.type==="svn"?e("svnBase"):e(Te(b,d)))),n.error?r.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},n.error,r.default.createElement("button",{onClick:Le},e("rescan"))):m[b.id]?ne?r.default.createElement(Ht,{node:dt(n.changes),repository:b}):n.changes.map(D=>r.default.createElement(Mt,{key:we(b.id,D.id),entry:D})):r.default.createElement("div",{className:"vcs-message"},e("loading")),!n.error&&m[b.id]&&!n.changes.length&&r.default.createElement("div",{className:"vcs-message"},e(ee?"emptySearch":"clean")))}),!ve.length&&r.default.createElement("div",{className:"vcs-message"},Se?e("loading"):se||e(a?"noRepo":"noSession"),se&&r.default.createElement("button",{onClick:Le},e("rescan"))))),r.default.createElement("main",{className:"vcs-detail"},r.default.createElement("div",{className:"vcs-filehead"},r.default.createElement("strong",{title:C?.path||R?.path},Pe?ke(Pe,e("workspaceRoot"))+" / ":"",C?.path||R?.path||e("pick")),r.default.createElement("button",{className:"vcs-copy-path",disabled:!(C?.path||R?.path),onClick:gr},e(ht?"copied":"copyPath")),ht&&r.default.createElement("span",{className:"vcs-sr-only",role:"status"},e("pathCopied")),r.default.createElement("span",{className:"vcs-spacer"}),C&&!C.binary&&Q&&r.default.createElement(r.default.Fragment,null,r.default.createElement("span",{className:"vcs-add"},"+",qe.added),r.default.createElement("span",{className:"vcs-del"},"\u2212",qe.deleted))),Y&&r.default.createElement("div",{className:"vcs-notice",role:"status"},e("fallback")," ",r.default.createElement("button",{onClick:()=>wt(n=>n+1)},e("retry")),r.default.createElement("details",null,r.default.createElement("summary",null,e("diagnostics")),Y)),C&&r.default.createElement("div",{className:"vcs-context","aria-label":e("comparisonContext")},r.default.createElement("span",{className:"vcs-context-status","data-status":ge(C)},e(ge(C))),C.oldPath&&r.default.createElement("span",{className:"vcs-context-rename",title:C.oldPath+" \u2192 "+C.path},C.oldPath," ",r.default.createElement("b",null,"\u2192")," ",C.path),r.default.createElement("span",null,C.left.label||"\u2014"," ",r.default.createElement("b",null,"\u2194")," ",C.right.label||"\u2014"),(C.left.encoding||C.right.encoding)&&r.default.createElement("span",null,e("encoding"),": ",C.left.encoding||"\u2014"," / ",C.right.encoding||"\u2014")),C?.notice&&r.default.createElement("div",{className:"vcs-notice"},C.notice),$e.length>0&&r.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(n=>r.default.createElement("button",{key:n,"aria-pressed":Ne===n,onClick:()=>ue(n)},e(n),n==="properties"?" ("+$e.length+")":""))),r.default.createElement("div",{className:"vcs-labels"},r.default.createElement("span",null,C?.left.label||"\u2014",C?.left.encoding?" \xB7 "+C.left.encoding:""),r.default.createElement("span",null,C?.right.label||"\u2014",C?.right.encoding?" \xB7 "+C.right.encoding:"")),r.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!ce||Ne!=="content",style:Ne==="properties"?{display:"none"}:void 0},r.default.createElement("div",{className:"vcs-editor",ref:Nt,style:Y?{display:"none"}:void 0}),Y&&C&&!C.binary&&!ce&&r.default.createElement(be,{comparison:C,labels:Be(e)}),ce&&r.default.createElement("div",{className:"vcs-message "+(se||Oe||Y?"vcs-error":""),role:"status"},ce,(se||Oe||Y)&&r.default.createElement("button",{onClick:()=>Y?wt(n=>n+1):Le()},e(Y?"retry":"rescan")))),Ne==="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,C?.left.label||e("before")),r.default.createElement("th",null,C?.right.label||e("after")))),r.default.createElement("tbody",null,$e.map(n=>r.default.createElement("tr",{key:n},r.default.createElement("th",null,n),r.default.createElement("td",null,re.left?.[n]??"\u2014"),r.default.createElement("td",null,re.right?.[n]??"\u2014")))))),r.default.createElement("footer",{className:"vcs-toolbar"},r.default.createElement("button",{disabled:!Q,"aria-pressed":pe,onClick:()=>pr(!pe)},e(pe?"side":"inline")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Q,checked:We,onChange:n=>ur(n.target.checked)}),e("whitespace")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Q,checked:Ie,onChange:n=>fr(n.target.checked)}),e("wrap")),r.default.createElement("span",{className:"vcs-spacer"}),Q&&r.default.createElement("span",null,qe.count," ",e("changes")),r.default.createElement("button",{disabled:!Q||!C||!!ce,onClick:()=>ae.current?.navigate("previous")},e("previous")),r.default.createElement("button",{disabled:!Q||!C||!!ce,onClick:()=>ae.current?.navigate("next")},e("next")),Xe.index>0&&r.default.createElement("span",{className:"vcs-review-position"},e("reviewPosition",{index:Xe.index,total:Xe.total})),r.default.createElement("span",{className:"vcs-toolbar-separator"}),r.default.createElement("button",{title:e("fileShortcut"),disabled:!de.length,onClick:()=>Ye("previous")},e("previousFile")),r.default.createElement("button",{title:e("fileShortcut"),disabled:!de.length,onClick:()=>Ye("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},dr))}
95
+ `;var _=K(require("react"),1);function Ot(t){return t===""?[]:t.split(/\r\n|\n|\r/)}function jt(t="",e=""){let s=Ot(t),i=Ot(e),o=0;for(;o<s.length&&o<i.length&&s[o]===i[o];)o++;let c=0;for(;c<s.length-o&&c<i.length-o&&s[s.length-c-1]===i[i.length-c-1];)c++;let u=s.length-c,p=i.length-c,a=u-o,l=p-o,v=a&&l?(a+1)*(l+1):0,b=v>2e5,x=[],N=0;function E(d,y){N++,!(x.length>=2e3)&&x.push({left:d===null?null:{number:d+1,text:s[d]},right:y===null?null:{number:y+1,text:i[y]},kind:d===null?"insert":y===null?"delete":s[d]===i[y]?"equal":"replace"})}for(let d=0;d<o;d++)E(d,d);if(b||!a||!l)for(let d=0;d<Math.max(a,l);d++)E(d<a?o+d:null,d<l?o+d:null);else{let d=l+1,y=new Uint32Array(v);for(let f=a-1;f>=0;f--)for(let A=l-1;A>=0;A--)y[f*d+A]=s[o+f]===i[o+A]?y[(f+1)*d+A+1]+1:Math.max(y[(f+1)*d+A],y[f*d+A+1]);let h=0,m=0;for(;h<a||m<l;)h<a&&m<l&&s[o+h]===i[o+m]?E(o+h++,o+m++):h<a&&(m===l||y[(h+1)*d+m]>=y[h*d+m+1])?E(o+h++,null):E(null,o+m++)}for(let d=0;d<c;d++)E(u+d,p+d);return{rows:x,approximate:b,truncated:N>x.length,totalRows:N,omittedRows:N-x.length,leftLineCount:s.length,rightLineCount:i.length,lcsCells:b?0:v}}var Dr={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."},tt={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Mr={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Br={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Hr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function we({comparison:t,labels:e={}}){let s=t?.left?.text??"",i=t?.right?.text??"",o=(0,_.useMemo)(()=>jt(s,i),[s,i]),c=p=>e[p]??Dr[p],u=(p,a,l)=>{let v=p&&l!=="equal";return _.default.createElement("td",{style:{...tt,background:v?a==="left"?"#d6454520":"#259b4920":void 0}},_.default.createElement("div",{style:Mr},_.default.createElement("span",{style:Br},p?.number??""),_.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},v?a==="left"?"\u2212":"+":""),_.default.createElement("pre",{style:Hr},p?.text??"")))};return _.default.createElement("section",{className:"vcs-text-comparison","aria-label":c("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}},c("approximate")),o.truncated&&_.default.createElement("div",{role:"status",style:{padding:8}},c("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:{...tt,padding:8,overflowWrap:"anywhere"}},t?.left?.label||c("before")),_.default.createElement("th",{scope:"col",style:{...tt,padding:8,overflowWrap:"anywhere"}},t?.right?.label||c("after")))),_.default.createElement("tbody",null,o.rows.map((p,a)=>_.default.createElement("tr",{key:a,"data-kind":p.kind},u(p.left,"left",p.kind),u(p.right,"right",p.kind))))),!o.rows.length&&_.default.createElement("p",{style:{padding:8}},c("empty")))}function He(t){return{before:t("textBefore"),after:t("textAfter"),readonly:t("textReadonly"),empty:t("textEmpty"),approximate:t("approximate"),truncated:t("textTruncated")}}var S=K(require("react"),1);function qt(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=K(require("react"),1);var L=K(require("react"),1);var U=K(require("react"),1);var q=K(require("react"),1);function Ut({load:t,node:e,comparison:s,key:i,single:o=!1,onReady:c=()=>{},onError:u=()=>{}}){let p=new AbortController,a,l=!1,v=()=>{let x=a;a=void 0,x?.dispose()};return{done:Promise.resolve().then(()=>(p.signal.throwIfAborted(),t(p.signal))).then(x=>{l||(a=x.createDiff(e,{single:o}),a.setContent(s,i),l||c(a))}).catch(x=>{try{v()}finally{l||u(x)}}),dispose(){l||(l=!0,p.abort(),v())}}}async function Fe(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 c=o.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(c))throw new Error("Editor resource returned "+(c||"no Content-Type")+" instead of JavaScript.");return await o.arrayBuffer(),e?.throwIfAborted(),i(t)}var Te="0.3.54";function Se({comparison:t,identity:e,t:s,single:i=!1}){let o=(0,q.useRef)(null),c=(0,q.useRef)(null),[u,p]=(0,q.useState)(!0),[a,l]=(0,q.useState)(!1),[v,b]=(0,q.useState)(!1),[x,N]=(0,q.useState)(!0),[E,d]=(0,q.useState)(!1),[y,h]=(0,q.useState)("");return(0,q.useEffect)(()=>{if(d(!1),h(""),!x)return;let m=M=>new URL("vcs-assets/"+M,document.baseURI).href,f=document.createElement("link");f.rel="stylesheet",f.href=m("editor.css"),document.head.appendChild(f);let A=Ut({node:o.current,comparison:t,key:e,single:i,load:M=>Fe(m("editor.js")+"?v="+encodeURIComponent(Te)+"&retry=0",{signal:M}),onReady:M=>{c.current=M,d(!0)},onError:M=>h(M.message)});return()=>{c.current=null;try{A.dispose()}finally{f.remove()}}},[x,t,e,i]),(0,q.useEffect)(()=>{E&&c.current?.options({sideBySide:u,ignoreWhitespace:a,wrap:v})},[E,u,a,v]),q.default.createElement("div",null,q.default.createElement("button",{"aria-pressed":x,onClick:()=>N(m=>!m)},s(x?"historyBasic":"historyAdvanced")),E&&!i&&q.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},q.default.createElement("button",{"aria-pressed":u,onClick:()=>p(m=>!m)},s(u?"side":"inline")),q.default.createElement("label",null,q.default.createElement("input",{type:"checkbox",checked:a,onChange:m=>l(m.target.checked)}),s("whitespace")),q.default.createElement("label",null,q.default.createElement("input",{type:"checkbox",checked:v,onChange:m=>b(m.target.checked)}),s("wrap")),q.default.createElement("button",{onClick:()=>c.current?.navigate("previous")},s("previous")),q.default.createElement("button",{onClick:()=>c.current?.navigate("next")},s("next"))),x&&!E&&!y&&q.default.createElement("p",{role:"status"},s("loading")),y&&q.default.createElement("p",{role:"status"},s("fallback")," ",y),q.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},q.default.createElement("div",{ref:o,style:{position:"absolute",inset:0,visibility:E?"visible":"hidden"},"aria-hidden":!E}),!E&&q.default.createElement(we,{comparison:t,labels:He(s)})))}function rt({sessionId:t,repositoryId:e,commit:s,path:i,rpc:o,t:c,onRediscover:u,onClose:p}){let[a,l]=(0,U.useState)(null),[v,b]=(0,U.useState)(""),[x,N]=(0,U.useState)(0);(0,U.useEffect)(()=>{let d=new AbortController;return l(null),b(""),o("vcs/tree-file",{sessionId:t,repositoryId:e,commit:s,path:i},d.signal).then(y=>{d.signal.aborted||l(y)}).catch(y=>{d.signal.aborted||(b(y.message),y.code==="vcs/rediscover-required"&&u())}),()=>d.abort()},[t,e,s,i,x]);let E=(0,U.useMemo)(()=>a?{path:i,left:{label:s,text:a.text||""},right:{label:s,text:a.text||""}}:null,[a,i,s]);return U.default.createElement("section",{"aria-label":c("treePreview")},U.default.createElement("h4",null,i),U.default.createElement("button",{onClick:p},c("treeClose")),U.default.createElement("p",null,U.default.createElement("code",null,s)),v?U.default.createElement("p",{role:"alert"},v," ",U.default.createElement("button",{onClick:()=>N(d=>d+1)},c("retry"))):a?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,U.default.createElement("code",null,a.oid)," \xB7 ",c("encoding"),": ",a.encoding||"\u2014"),a.notice&&U.default.createElement("p",{role:"status"},a.notice),a.binary?U.default.createElement("p",null,c("binary")):a.text===""?U.default.createElement("p",null,c("treeEmpty")):U.default.createElement(Se,{single:!0,comparison:E,identity:JSON.stringify([t,e,s,i]),t:c})):U.default.createElement("p",{role:"status"},c("loading")))}function Wt(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 It(t,e="",s=""){let i=e?e+"/":"",o=s.toLowerCase();return t.filter(c=>{let u=c.path.slice(i.length);return c.path.startsWith(i)&&u.length>0&&!u.includes("/")&&u.toLowerCase().includes(o)}).sort((c,u)=>+(u.type==="tree")-+(c.type==="tree")||(c.path<u.path?-1:c.path>u.path?1:0))}function Tr({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c}){let[u,p]=(0,L.useState)(null),[a,l]=(0,L.useState)(""),[v,b]=(0,L.useState)(0),[x,N]=(0,L.useState)(""),[E,d]=(0,L.useState)(0),[y,h]=(0,L.useState)(""),[m,f]=(0,L.useState)(null);if((0,L.useEffect)(()=>{let w=new AbortController;return p(null),l(""),i("vcs/tree",{sessionId:t,repositoryId:e,commit:s},w.signal).then(W=>{w.signal.aborted||p(W)}).catch(W=>{w.signal.aborted||(l(W.message),W.code==="vcs/rediscover-required"&&c())}),()=>w.abort()},[t,e,s,v]),a)return L.default.createElement("p",{role:"alert"},a," ",L.default.createElement("button",{onClick:()=>b(w=>w+1)},o("retry")));if(!u)return L.default.createElement("p",{role:"status"},o("loading"));let A=x?x+"/":"",M=It(u.entries,x,y),D=w=>{N(w),d(0),h(""),f(null)};return L.default.createElement("section",{"aria-label":o("historicalTree")},L.default.createElement("p",null,o("historicalTreeScope")),L.default.createElement("code",null,s),L.default.createElement("p",null,x||"/"," ",x&&L.default.createElement("button",{onClick:()=>D(x.includes("/")?x.slice(0,x.lastIndexOf("/")):"")},o("treeUp"))),L.default.createElement("nav",{"aria-label":o("treeBreadcrumbs")},Wt(x).map(w=>L.default.createElement(L.default.Fragment,{key:w.path},w.path&&" / ",w.path===x?L.default.createElement("span",{"aria-current":"location"},w.name):L.default.createElement("button",{onClick:()=>D(w.path)},w.name)))),L.default.createElement("label",null,o("treeSearch")," ",L.default.createElement("input",{"aria-label":o("treeSearch"),value:y,onChange:w=>{h(w.target.value),d(0),f(null)}})),L.default.createElement("p",null,M.length," ",o("treeEntries")),!M.length&&y&&L.default.createElement("p",{role:"status"},o("emptySearch")),L.default.createElement("ul",null,M.slice(E*100,E*100+100).map(w=>L.default.createElement("li",{key:w.path},w.type==="tree"?L.default.createElement("button",{onClick:()=>D(w.path)},w.path.slice(A.length),"/"):w.type==="blob"&&["100644","100755"].includes(w.mode)?L.default.createElement("button",{"aria-pressed":m===w.path,onClick:()=>f(w.path)},w.path.slice(A.length)):L.default.createElement("span",null,w.path.slice(A.length))," \xB7 ",L.default.createElement("code",null,w.mode," ",w.type," ",L.default.createElement("span",{title:w.oid},w.oid.slice(0,10)))))),E>0&&L.default.createElement("button",{onClick:()=>{d(w=>w-1),f(null)}},o("treePrevious")),(E+1)*100<M.length&&L.default.createElement("button",{onClick:()=>{d(w=>w+1),f(null)}},o("treeNext")),m&&L.default.createElement(rt,{key:JSON.stringify([t,e,s,m]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c,path:m,onClose:()=>f(null)}))}function ot(t){return L.default.createElement(Or,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function Or(t){let[e,s]=(0,L.useState)(!1);return L.default.createElement("div",null,L.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historicalTree")),e&&L.default.createElement(Tr,{...t}))}var V=K(require("react"),1);var T=K(require("react"),1);function jr({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:c,t:u,onRediscover:p,onSelectCommit:a}){let[l,v]=(0,T.useState)({commits:[],nextOffset:null}),[b,x]=(0,T.useState)(0),[N,E]=(0,T.useState)(0),[d,y]=(0,T.useState)(!0),[h,m]=(0,T.useState)("");return(0,T.useEffect)(()=>{let f=new AbortController;return y(!0),m(""),c("vcs/file-history",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,offset:b,limit:50},f.signal).then(A=>{f.signal.aborted||v(M=>({...A,commits:b?[...M.commits,...A.commits]:A.commits}))}).catch(A=>{f.signal.aborted||(m(A.message),A.code==="vcs/rediscover-required"&&p())}).finally(()=>{f.signal.aborted||y(!1)}),()=>f.abort()},[t,e,s,i,o,b,N]),T.default.createElement("section",{"aria-label":u("fileHistory"),"aria-busy":d},T.default.createElement("p",null,u("fileHistoryScope")),T.default.createElement("p",{style:{overflowWrap:"anywhere"}},l.path," \xB7 ",T.default.createElement("code",null,s)),T.default.createElement("ol",null,l.commits.map(f=>T.default.createElement("li",{key:f.id},T.default.createElement("code",{title:f.id},f.id.slice(0,10))," \xB7 ",a?T.default.createElement("button",{onClick:()=>a(f.id,l.path)},f.subject):f.subject,T.default.createElement("div",null,f.author," \xB7 ",T.default.createElement("time",{dateTime:f.date},f.date))))),d&&T.default.createElement("p",{role:"status"},u("loading")),h&&T.default.createElement("p",{role:"alert"},h," ",T.default.createElement("button",{onClick:()=>E(f=>f+1)},u("retry"))),!d&&!h&&!l.commits.length&&T.default.createElement("p",null,u("historyEmpty")),l.truncated&&T.default.createElement("p",{role:"status"},u("historyLimit")),!h&&l.nextOffset!==null&&T.default.createElement("button",{disabled:d,onClick:()=>x(l.nextOffset)},u("historyMore")))}function st(t){return T.default.createElement(qr,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit,t.parentIndex,t.id]),...t})}function qr(t){let[e,s]=(0,T.useState)(!1);return T.default.createElement("div",null,T.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("fileHistory")),e&&T.default.createElement(jr,{...t}))}var O=K(require("react"),1);function zt(t,{width:e,height:s,signal:i,timeoutMs:o=1e4,createURL:c=a=>URL.createObjectURL(a),revokeURL:u=a=>URL.revokeObjectURL(a),createImage:p=()=>new Image}={}){return new Promise((a,l)=>{if(i?.aborted){l(i.reason);return}if(t?.type!=="image/png"||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){l(new Error("Invalid image preview"));return}let v,b,x,N=!1,E=!1,d=()=>{E||(E=!0,b&&(b.src=""),v&&u(v))},y=()=>{clearTimeout(x),i?.removeEventListener("abort",m)},h=f=>{N||(N=!0,y(),d(),l(f))},m=()=>h(i.reason||new Error("Image cancelled"));try{v=c(t),b=p(),i?.addEventListener("abort",m,{once:!0}),x=setTimeout(()=>h(new Error("Image decode timed out")),o),b.src=v,Promise.resolve(b.decode()).then(()=>{if(!N){if(i?.aborted){m();return}if(b.naturalWidth!==e||b.naturalHeight!==s){h(new Error("Image dimensions mismatch"));return}N=!0,y(),a({url:v,dispose:d})}},h)}catch(f){h(f)}})}function Ur({side:t,sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:c,rpc:u,t:p,onRediscover:a}){let[l,v]=(0,O.useState)(null),[b,x]=(0,O.useState)(""),[N,E]=(0,O.useState)(0);return(0,O.useEffect)(()=>{let d=new AbortController,y;return v(null),x(""),(async()=>{let h=await u("vcs/commit-image",{sessionId:e,repositoryId:s,commit:i,parentIndex:o,id:c,side:t},d.signal);if(d.signal.aborted)return;if(h.absent){v(h);return}if(h.mime!=="image/png"||typeof h.base64!="string"||h.base64.length>2796204||!Number.isInteger(h.bytes)||h.bytes<1||h.bytes>2097152)throw Error(p("imageInvalid"));let m=atob(h.base64);if(m.length!==h.bytes)throw Error(p("imageInvalid"));let f=new Blob([Uint8Array.from(m,A=>A.charCodeAt(0))],{type:h.mime});if(y=await zt(f,{width:h.width,height:h.height,signal:d.signal}),d.signal.aborted){y.dispose();return}v({...h,url:y.url})})().catch(h=>{d.signal.aborted||(x(h.message),h.code==="vcs/rediscover-required"&&a())}),()=>{d.abort(),y?.dispose()}},[t,e,s,i,o,c,N]),O.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":p(t==="left"?"imageBefore":"imageAfter")},O.default.createElement("h5",null,p(t==="left"?"imageBefore":"imageAfter")),b?O.default.createElement("p",{role:"alert"},b," ",O.default.createElement("button",{onClick:()=>E(d=>d+1)},p("retry"))):l?O.default.createElement(O.default.Fragment,null,O.default.createElement("p",null,O.default.createElement("code",null,l.commit)," \xB7 ",l.path),l.absent?O.default.createElement("p",null,p("imageAbsent")):O.default.createElement(O.default.Fragment,null,O.default.createElement("p",null,l.width," \xD7 ",l.height," \xB7 ",l.bytes," B"),O.default.createElement("img",{src:l.url,alt:l.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),l.metadataStripped&&O.default.createElement("p",null,p("imageMetadata")))):O.default.createElement("p",{role:"status"},p("loading")))}function it(t){let[e,s]=(0,O.useState)(!1);return O.default.createElement("div",null,O.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("imageCompare")),e&&O.default.createElement(O.default.Fragment,null,O.default.createElement("p",null,t.t("imageScope")),O.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(i=>O.default.createElement(Ur,{key:i,...t,side:i})))))}var H=K(require("react"),1);function Wr({sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o,rpc:c,t:u,onRediscover:p,onSelectCommit:a}){let[l,v]=(0,H.useState)(null),[b,x]=(0,H.useState)(""),[N,E]=(0,H.useState)(0);return(0,H.useEffect)(()=>{let d=new AbortController;return v(null),x(""),c("vcs/blame",{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:o},d.signal).then(y=>{d.signal.aborted||v(y)}).catch(y=>{d.signal.aborted||(x(y.message),y.code==="vcs/rediscover-required"&&p())}),()=>d.abort()},[t,e,s,i,o,N]),b?H.default.createElement("p",{role:"alert"},b," ",H.default.createElement("button",{onClick:()=>E(d=>d+1)},u("retry"))):l?H.default.createElement("section",{"aria-label":u("blame")},H.default.createElement("p",null,u("blameScope")),a&&H.default.createElement("p",null,u("blameNavigation")),l.notice&&H.default.createElement("p",{role:"status"},l.notice),l.truncated&&H.default.createElement("p",{role:"status"},u("blameLimit")),!l.notice&&!l.lines.length&&H.default.createElement("p",null,u("blameEmpty")),!!l.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(d=>H.default.createElement("th",{key:d,scope:"col"},u(d))))),H.default.createElement("tbody",null,l.lines.map(d=>H.default.createElement("tr",{key:d.line},H.default.createElement("th",{scope:"row"},d.line),H.default.createElement("td",null,a?H.default.createElement("button",{title:d.commit,onClick:()=>a(d.commit)},H.default.createElement("code",null,d.commit.slice(0,10))):H.default.createElement("code",{title:d.commit},d.commit.slice(0,10))),H.default.createElement("td",null,d.author),H.default.createElement("td",null,d.summary),H.default.createElement("td",null,H.default.createElement("pre",{style:{margin:0}},d.text)))))))):H.default.createElement("p",{role:"status"},u("loading"))}function nt(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(Wr,{...t}))}function ke({sessionId:t,repositoryId:e,commit:s,parentIndex:i,base:o,target:c,id:u,rpc:p,t:a,onRediscover:l,onSelectCommit:v}){let[b,x]=(0,V.useState)(null),[N,E]=(0,V.useState)(""),[d,y]=(0,V.useState)(0);return(0,V.useEffect)(()=>{let h=new AbortController;return x(null),E(""),p(o?"vcs/revision-compare":"vcs/commit-compare",o?{sessionId:t,repositoryId:e,base:o,target:c,id:u}:{sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u},h.signal).then(m=>{h.signal.aborted||x(m)}).catch(m=>{h.signal.aborted||(E(m.message),m.code==="vcs/rediscover-required"&&l())}),()=>h.abort()},[t,e,s,i,o,c,u,d]),N?V.default.createElement("p",{role:"alert"},N," ",V.default.createElement("button",{onClick:()=>y(h=>h+1)},a("retry"))):b?V.default.createElement("section",null,V.default.createElement("h4",null,b.path),V.default.createElement("p",null,b.left.label," \u2194 ",b.right.label),b.notice&&V.default.createElement("p",{role:"status"},b.notice),b.binary?V.default.createElement("p",null,a("binary")):V.default.createElement(Se,{comparison:b,identity:JSON.stringify(o?[t,e,o,c,u]:[t,e,s,i,u]),t:a}),s&&!o&&V.default.createElement(st,{onSelectCommit:v,key:"file-history:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:l}),s&&!o&&V.default.createElement(nt,{onSelectCommit:v,key:"blame:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:l}),s&&!o&&V.default.createElement(it,{key:"image:"+JSON.stringify([t,e,s,i,u]),sessionId:t,repositoryId:e,commit:s,parentIndex:i,id:u,rpc:p,t:a,onRediscover:l})):V.default.createElement("p",{role:"status"},a("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 Jt(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 Oe(t,e=""){let s=e.trim().toLowerCase();return s?t.filter(i=>[i.path,i.oldPath].some(o=>o?.toLowerCase().includes(s))):t}function at(t){return F.default.createElement(Ir,{key:JSON.stringify([t.sessionId,t.repositoryId,t.commit]),...t})}function Ir({sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c,onSelectCommit:u,initialPath:p}){let a=(0,F.useRef)(!0),[l,v]=(0,F.useState)(null),[b,x]=(0,F.useState)(""),[N,E]=(0,F.useState)(0),[d,y]=(0,F.useState)(null),[h,m]=(0,F.useState)(""),[f,A]=(0,F.useState)(0);if((0,F.useEffect)(()=>{let D=new AbortController;return y(null),m(""),i("vcs/commit",{sessionId:t,repositoryId:e,commit:s,parentIndex:N},D.signal).then(w=>{D.signal.aborted||(y(w),a.current&&(a.current=!1,v(Gt(w.changes,p))))}).catch(w=>{D.signal.aborted||(m(w.message),w.code==="vcs/rediscover-required"&&c())}),()=>D.abort()},[t,e,s,N,f]),h)return F.default.createElement("p",{role:"alert"},h," ",F.default.createElement("button",{onClick:()=>A(D=>D+1)},o("retry")));if(!d)return F.default.createElement("p",{role:"status"},o("loading"));let M=Oe(d.changes,b);return F.default.createElement("section",{"aria-label":o("commitDetails")},F.default.createElement("h3",null,d.subject),F.default.createElement("code",null,d.id),F.default.createElement("p",null,d.author," \xB7 ",d.date),d.messageTruncated&&F.default.createElement("p",{role:"status"},o("commitMessageLimit")),d.message&&F.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},d.message),d.parents.length>1&&F.default.createElement("label",null,o("commitParent")," ",F.default.createElement("select",{"aria-label":o("commitParent"),value:N,onChange:D=>{v(null),y(null),E(Number(D.target.value))}},d.parents.map((D,w)=>F.default.createElement("option",{key:D,value:w},w+1,": ",D.slice(0,10))))),F.default.createElement("p",null,d.parent||o("commitRoot")," \u2192 ",d.id.slice(0,10)),F.default.createElement("label",null,o("commitFileSearch")," ",F.default.createElement("input",{"aria-label":o("commitFileSearch"),value:b,onChange:D=>{x(D.target.value),v(null)}})),F.default.createElement("span",null," ",M.length," / ",d.changes.length),F.default.createElement("ul",null,M.map(D=>F.default.createElement("li",{key:D.id},F.default.createElement("button",{"aria-pressed":l===D.id,onClick:()=>v(D.id)},D.status," \xB7 ",D.oldPath?D.oldPath+" \u2192 ":"",D.path)))),!!d.changes.length&&!M.length&&F.default.createElement("p",{role:"status"},o("emptySearch")),!d.changes.length&&F.default.createElement("p",null,o("commitNoChanges")),l&&F.default.createElement(ke,{key:l,sessionId:t,repositoryId:e,commit:s,parentIndex:N,id:l,onSelectCommit:u,rpc:i,t:o,onRediscover:c}),F.default.createElement(ot,{key:JSON.stringify([t,e,s]),sessionId:t,repositoryId:e,commit:s,rpc:i,t:o,onRediscover:c}))}var I=K(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=[],c=p=>typeof p=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(p);for(let[p,a]of e.entries()){if(!a||!c(a.id)||!Array.isArray(a.parents)||s.has(a.id))throw new Error("Invalid graph node");s.set(a.id,p),i.push({id:a.id,row:p})}let u=!1;for(let p of e){let a=new Set;for(let l of p.parents){if(o.length===1e3){u=!0;break}if(!c(l)||l.length!==p.id.length||l===p.id||a.has(l))throw new Error("Invalid graph parent");a.add(l);let v=s.get(l);if(v!==void 0&&v<=s.get(p.id))throw new Error("Graph requires child-before-parent order");o.push({from:p.id,to:l,missing:v===void 0})}if(u)break}return{nodes:i,edges:o,nodesTruncated:t.length>200,edgesTruncated:u}}function Vt(t){let e=new Map(t.nodes.map(i=>[i.id,i.row])),s=[];return t.edges.filter(i=>!i.missing).map(i=>{let o=e.get(i.from),c=e.get(i.to),u=s.findIndex(p=>p<o);return u<0&&(u=s.length),s[u]=c,{...i,lane:u,start:o,end:c}})}function zr({commits:t,selected:e,onSelect:s,t:i}){let o;try{o=_t(t)}catch{return I.default.createElement("p",{role:"alert"},i("graphInvalid"))}let c=Vt(o),u=Math.max(100,48+12*Math.max(0,...c.map(a=>a.lane))),p=Math.max(40,o.nodes.length*36);return I.default.createElement("section",{"aria-label":i("historyGraph")},I.default.createElement("p",null,i("graphScope")),(o.nodesTruncated||o.edgesTruncated)&&I.default.createElement("p",{role:"status"},i("graphLimit")),I.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},I.default.createElement("svg",{width:u,height:p,"aria-hidden":"true",style:{flexShrink:0}},c.map(a=>{let l=a.start*36+18,v=a.end*36+18,b=35+a.lane*12;return I.default.createElement("path",{key:a.from+a.to,d:"M 12 "+l+" C "+b+" "+l+", "+b+" "+v+", 12 "+v,fill:"none",stroke:"currentColor",opacity:"0.45"})}),o.nodes.map(a=>I.default.createElement("circle",{key:a.id,cx:"12",cy:a.row*36+18,r:"4",fill:"currentColor"}))),I.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},o.nodes.map(a=>I.default.createElement("li",{key:a.id,style:{height:36,whiteSpace:"nowrap"}},I.default.createElement("button",{title:a.id,"aria-current":e===a.id?!0:void 0,style:e===a.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:l=>{if(l.altKey||l.ctrlKey||l.metaKey||l.shiftKey)return;let v=l.key==="ArrowDown"?Math.min(a.row+1,o.nodes.length-1):l.key==="ArrowUp"?Math.max(0,a.row-1):l.key==="Home"?0:l.key==="End"?o.nodes.length-1:null;v!==null&&(l.preventDefault(),l.stopPropagation(),l.currentTarget.closest("ol").querySelectorAll("button")[v]?.focus())},onClick:()=>s(a.id)},I.default.createElement("code",null,a.id.slice(0,10))," ",t[a.row].subject))))),I.default.createElement("details",null,I.default.createElement("summary",null,i("graphRelations")),I.default.createElement("ul",null,o.edges.map(a=>I.default.createElement("li",{key:a.from+a.to},I.default.createElement("code",null,a.from)," \u2192 ",I.default.createElement("code",null,a.to),a.missing?" \xB7 "+i("graphMissing"):"")))))}function lt(t){let[e,s]=(0,I.useState)(!1);return I.default.createElement("div",null,I.default.createElement("button",{"aria-expanded":e,onClick:()=>s(i=>!i)},t.t("historyGraph")),e&&I.default.createElement(zr,{...t}))}var k=K(require("react"),1);function Gr({sessionId:t,repositoryId:e,base:s,target:i,rpc:o,t:c,onRediscover:u}){let[p,a]=(0,k.useState)(null),[l,v]=(0,k.useState)(""),[b,x]=(0,k.useState)(0),[N,E]=(0,k.useState)(null),[d,y]=(0,k.useState)("");if((0,k.useEffect)(()=>{let m=new AbortController;return a(null),v(""),E(null),o("vcs/revision-changes",{sessionId:t,repositoryId:e,base:s,target:i},m.signal).then(f=>{m.signal.aborted||a(f)}).catch(f=>{m.signal.aborted||(v(f.message),f.code==="vcs/rediscover-required"&&u())}),()=>m.abort()},[t,e,s,i,b]),l)return k.default.createElement("p",{role:"alert"},l," ",k.default.createElement("button",{onClick:()=>x(m=>m+1)},c("retry")));if(!p)return k.default.createElement("p",{role:"status"},c("loading"));let h=Oe(p.changes,d);return k.default.createElement("div",null,k.default.createElement("label",null,c("commitFileSearch")," ",k.default.createElement("input",{"aria-label":c("commitFileSearch"),value:d,onChange:m=>{y(m.target.value),E(null)}})),k.default.createElement("span",null," ",h.length," / ",p.changes.length),!!p.changes.length&&!h.length&&k.default.createElement("p",{role:"status"},c("emptySearch")),!p.changes.length&&k.default.createElement("p",null,c("revisionEmpty")),k.default.createElement("ul",null,h.map(m=>k.default.createElement("li",{key:m.id},k.default.createElement("button",{"aria-pressed":N===m.id,onClick:()=>E(m.id)},m.status," \xB7 ",m.oldPath?m.oldPath+" \u2192 ":"",m.path)))),N&&k.default.createElement(ke,{key:N,sessionId:t,repositoryId:e,base:s,target:i,id:N,rpc:o,t:c,onRediscover:u}))}function dt(t){return k.default.createElement(Jr,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function Jr({commits:t,sessionId:e,repositoryId:s,rpc:i,t:o,onRediscover:c,onReferencesLoaded:u}){let[p,a]=(0,k.useState)(""),[l,v]=(0,k.useState)(""),[b,x]=(0,k.useState)([]),[N,E]=(0,k.useState)(!1),[d,y]=(0,k.useState)(0),[h,m]=(0,k.useState)(!1),[f,A]=(0,k.useState)("");return(0,k.useEffect)(()=>{if(!d)return;let M=new AbortController;return m(!0),A(""),i("vcs/references",{sessionId:e,repositoryId:s},M.signal).then(D=>{M.signal.aborted||(x(D.references),E(!0),u?.(D.references))}).catch(D=>{M.signal.aborted||(A(D.message),D.code==="vcs/rediscover-required"&&c())}).finally(()=>{M.signal.aborted||m(!1)}),()=>M.abort()},[e,s,d]),k.default.createElement("section",{"aria-label":o("revisionTitle")},k.default.createElement("h3",null,o("revisionTitle")),k.default.createElement("p",null,o("revisionScope")),k.default.createElement("button",{disabled:h,onClick:()=>y(M=>M+1)},o("revisionLoadRefs")),k.default.createElement("p",null,o("revisionRefsScope")),N&&!h&&!f&&k.default.createElement("p",{role:"status"},b.length?`${o("revisionRefsCount")}: ${b.length}`:o("revisionRefsEmpty")),h&&k.default.createElement("p",{role:"status"},o("loading")),f&&k.default.createElement("p",{role:"alert"},f),[[p,a,"revisionBase"],[l,v,"revisionTarget"]].map(([M,D,w])=>k.default.createElement("label",{key:w},o(w)," ",k.default.createElement("select",{"aria-label":o(w),value:M,onChange:W=>D(W.target.value)},k.default.createElement("option",{value:""},"\u2014"),!!t.length&&k.default.createElement("optgroup",{label:o("revisionLoadedCommits")},t.map(W=>k.default.createElement("option",{key:W.id,value:W.id},W.id.slice(0,10)," \xB7 ",W.subject))),!!b.length&&k.default.createElement("optgroup",{label:o("revisionLocalRefs")},b.map(W=>k.default.createElement("option",{key:W.name,value:W.commit},W.name," \xB7 ",W.commit.slice(0,10)))),M&&!t.some(W=>W.id===M)&&!b.some(W=>W.commit===M)&&k.default.createElement("option",{value:M},M)))),k.default.createElement("button",{disabled:!p||!l,onClick:()=>{a(l),v(p)}},o("revisionSwap")),k.default.createElement("p",{style:{overflowWrap:"anywhere"}},k.default.createElement("code",null,p||"\u2014")," \u2192 ",k.default.createElement("code",null,l||"\u2014")),p&&l&&k.default.createElement(Gr,{key:JSON.stringify([e,s,p,l]),sessionId:e,repositoryId:s,base:p,target:l,rpc:i,t:o,onRediscover:c}))}function ct(t){return S.default.createElement(_r,{key:JSON.stringify([t.sessionId,t.repositoryId]),...t})}function _r({sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o}){let[c,u]=(0,S.useState)({id:null,path:null,revision:0}),[p,a]=(0,S.useState)(""),[l,v]=(0,S.useState)(null),[b,x]=(0,S.useState)({message:"",author:"",path:""}),[N,E]=(0,S.useState)(null),d=P=>{E({values:P,snapshot:A.snapshot}),w(0),a(""),f(null),M(G=>({...G,commits:[],nextOffset:null}))},y=(0,S.useMemo)(()=>qt(l||[]),[l]),h=c.id,m=(P,G=null)=>u(Y=>({id:P,path:G,revision:Y.revision+1})),f=(P,G=null)=>u(Y=>({id:P,path:G,revision:Y.revision+(G||Y.path?1:0)})),[A,M]=(0,S.useState)({commits:[],snapshot:null,nextOffset:null}),[D,w]=(0,S.useState)(0),[W,ne]=(0,S.useState)(0),[te,z]=(0,S.useState)(!0),[Z,C]=(0,S.useState)("");(0,S.useEffect)(()=>{let P=new AbortController;return z(!0),C(""),s("vcs/history",{sessionId:t,repositoryId:e,offset:D,limit:50,...N?{search:N.values}:{},...N?.snapshot||D?{snapshot:N?.snapshot||A.snapshot}:{}},P.signal).then(G=>{P.signal.aborted||M(Y=>({...G,commits:D?[...Y.commits,...G.commits]:G.commits}))}).catch(G=>{P.signal.aborted||(C(G.message),G.code==="vcs/rediscover-required"&&o())}).finally(()=>{P.signal.aborted||z(!1)}),()=>P.abort()},[t,e,D,W,N]);let X=Jt(A.commits,p);return S.default.createElement("section",{className:"vcs-history","aria-label":i("history"),"aria-busy":te},S.default.createElement("div",{className:"vcs-history-list"},S.default.createElement("p",null,i("historyListOnly")),l!==null&&S.default.createElement("p",null,i("historyRefsScope")),S.default.createElement("form",{"aria-label":i("historyServerSearch"),onSubmit:P=>{P.preventDefault(),d({...b})}},S.default.createElement("fieldset",{disabled:te},S.default.createElement("legend",null,i("historyServerSearch")),S.default.createElement("p",null,i("historyServerScope")),["message","author","path"].map(P=>S.default.createElement("label",{key:P},i("historyServer_"+P)," ",S.default.createElement("input",{maxLength:1024,"aria-label":i("historyServer_"+P),value:b[P],onChange:G=>x(Y=>({...Y,[P]:G.target.value}))}))),S.default.createElement("button",{type:"submit"},i("historyServerApply")),S.default.createElement("button",{type:"button",onClick:()=>{x({message:"",author:"",path:""}),d({})}},i("historyServerClear")))),N&&S.default.createElement("p",{role:"status"},i("historyServerActive"),": ",JSON.stringify(N.values)," \xB7 ",S.default.createElement("code",null,N.snapshot||A.snapshot)),S.default.createElement("label",null,i("historySearch")," ",S.default.createElement("input",{"aria-label":i("historySearch"),value:p,onChange:P=>{a(P.target.value),f(null)}})),S.default.createElement("span",null," ",X.length," / ",A.commits.length),!!A.commits.length&&!X.length&&S.default.createElement("p",{role:"status"},i("historyNoMatch")),S.default.createElement("ol",null,X.map(P=>S.default.createElement("li",{key:P.id},S.default.createElement("button",{"aria-pressed":h===P.id,onClick:()=>f(P.id)},P.subject),S.default.createElement("div",null,S.default.createElement("code",{title:P.id},P.id.slice(0,10))," \xB7 ",P.author," \xB7 ",S.default.createElement("time",{dateTime:P.date},P.date)),y.has(P.id)&&S.default.createElement("div",{"aria-label":i("historyRefsLabel"),style:{overflowWrap:"anywhere"}},y.get(P.id).names.map(G=>S.default.createElement("span",{key:G},S.default.createElement("code",null,G)," ")),y.get(P.id).hidden>0&&S.default.createElement("span",null,i("historyRefsMore"),": ",y.get(P.id).hidden))))),te&&S.default.createElement("p",{role:"status"},i("loading")),Z&&S.default.createElement("p",{role:"alert"},Z," ",S.default.createElement("button",{onClick:()=>ne(P=>P+1)},i("retry"))),!te&&!Z&&!A.commits.length&&S.default.createElement("p",null,i("historyEmpty")),A.truncated&&S.default.createElement("p",{role:"status"},i("historyLimit")),!Z&&A.nextOffset!==null&&S.default.createElement("button",{disabled:te,onClick:()=>w(A.nextOffset)},i("historyMore")),!!A.commits.length&&S.default.createElement(lt,{commits:A.commits,selected:h,onSelect:f,t:i}),S.default.createElement(dt,{onReferencesLoaded:v,commits:A.commits,sessionId:t,repositoryId:e,rpc:s,t:i,onRediscover:o})),S.default.createElement("div",{className:"vcs-history-details"},h&&S.default.createElement(at,{key:JSON.stringify([h,c.revision]),initialPath:c.path,sessionId:t,repositoryId:e,commit:h,onSelectCommit:m,rpc:s,t:i,onRediscover:o})))}var Kt={zh:{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:"\u4EC5\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u666E\u901A\u6587\u4EF6\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\u5DE5\u4F5C\u533A\u4FEE\u6539\u4E0D\u5305\u542B\u5728\u5185\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:{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 regular files only; at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Working changes are excluded.",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 Qt(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 c=o?.isContentEditable||o?.closest?.('input,textarea,select,[role="textbox"]');if(c&&o!==s)return null;if((t.ctrlKey||t.metaKey)&&!t.altKey&&!t.shiftKey&&t.key?.toLowerCase()==="f")return"search";if(!c&&t.altKey&&!t.ctrlKey&&!t.metaKey&&!t.shiftKey){if(t.key==="ArrowLeft")return"previous";if(t.key==="ArrowRight")return"next"}return null}var Xt=t=>"dsh-vcs:project:v1:"+t;function Yt(t,e){if(!t)return"";try{let s=(e??globalThis.localStorage)?.getItem(Xt(t));return typeof s=="string"&&s.length<=1024?s:""}catch{return""}}function $t(t,e,s){if(!(!t||!e))try{(s??globalThis.localStorage)?.setItem(Xt(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 Ce=(t,e)=>JSON.stringify([t,e]),Ne=(t,e=".")=>[t.type.toUpperCase(),t.relativePath==="."?e:t.relativePath||".",t.branch].filter(Boolean).join(" \xB7 "),je=(t,e="all")=>t.type==="git"&&["staged","unstaged"].includes(e)?e:"all",Zt=(t="",e="")=>t===e?0:t<e?-1:1;function pt(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 c=e;for(let u of o.slice(0,-1)){let p=c.id?c.id+"/"+u:u;c.directories.has(u)||c.directories.set(u,{id:p,name:u,directories:new Map,files:[],count:0}),c=c.directories.get(u),c.count++}c.files.push(i)}let s=i=>({...i,directories:[...i.directories.values()].sort((o,c)=>Zt(o.name,c.name)).map(s),files:[...i.files].sort((o,c)=>Zt(o.path,c.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(u=>u.id===e),o=s==="next"?1:-1,c=i<0?s==="next"?-1:0:i;return t[(c+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 ut(t,e=[]){for(let s of t?.directories||[])e.push(s.id),ut(s,e);return e}function or(t=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[t]||t}function sr(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,c)=>o.path.localeCompare(c.path))}function ir(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,c)=>new Promise((u,p)=>{let a={run:o,signal:c,resolve:u,reject:p,abort:null};if(a.abort=()=>{let l=s.indexOf(a);l>=0&&(s.splice(l,1),p(new Error("Aborted")))},c?.aborted){p(new Error("Aborted"));return}c?.addEventListener("abort",a.abort,{once:!0}),s.push(a),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 Qr=["slots","layout","locale","connection","uiSession"];function Xr(t){t.effect(()=>t.locale.register("local.vcs",Kt));let e=t.locale.bind("local.vcs"),s=ar(2);async function i(p,a,l){let v=await t.connection.rpc.call("/vcs-rpc",p,a,l);if(!v.ok){let b=new Error(v.error?.message||String(v.error||e("error")));throw b.code=v.error?.code,b}return v.value}function o(p){let a=p.useSessions(l=>Object.values(l.byId).find(v=>(v.retainedBy.mainView??0)>0));return r.default.createElement(c,{key:JSON.stringify([a?.id,a?.cwd])},r.default.createElement(u,{session:a}))}class c extends r.default.Component{state={error:null};static getDerivedStateFromError(a){return{error:a}}render(){return this.state.error?r.default.createElement("section",{className:"vcs-root"},r.default.createElement("style",null,et),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 u({session:p}){(0,r.useSyncExternalStore)(n=>t.locale.subscribe(n),()=>t.locale.getSnapshot(),()=>t.locale.getSnapshot());let a=p?.id,[l,v]=(0,r.useState)("all"),[b,x]=(0,r.useState)(0),[N,E]=(0,r.useState)(0),[d,y]=(0,r.useState)(null),[h,m]=(0,r.useState)({}),[f,A]=(0,r.useState)(()=>Yt(p?.cwd)),[M,D]=(0,r.useState)(0),[w,W]=(0,r.useState)(""),[ne,te]=(0,r.useState)(""),[z,Z]=(0,r.useState)(null),[C,X]=(0,r.useState)(null),[P,G]=(0,r.useState)(!1),[Y,ft]=(0,r.useState)(!1),[ae,ht]=(0,r.useState)(""),[qe,le]=(0,r.useState)(""),[R,mt]=(0,r.useState)(""),[vt,gt]=(0,r.useState)(!1),[oe,Ue]=(0,r.useState)(""),[Ee,bt]=(0,r.useState)("all"),[de,yt]=(0,r.useState)(!0),[xt,We]=(0,r.useState)({}),[he,pr]=(0,r.useState)(!0),[Ie,ur]=(0,r.useState)(!1),[ze,fr]=(0,r.useState)(!1),[Ae,me]=(0,r.useState)("content"),[wt,St]=(0,r.useState)(0),[hr,kt]=(0,r.useState)(!1),[Ge,Je]=(0,r.useState)({added:0,deleted:0,count:0}),[Q,Ct]=(0,r.useState)(!1),Nt=(0,r.useRef)(null),Et=(0,r.useRef)(null),ce=(0,r.useRef)(null),_e=(0,r.useRef)(null),Le=(0,r.useRef)(null),Ve=(0,r.useRef)(null),At=(0,r.useRef)(null),ve=(0,r.useRef)(null),Ke=(0,r.useRef)(null),Qe=(0,r.useRef)(null),Xe=(0,r.useRef)(!1),Pe=(0,r.useRef)(!1),se=d?.repositories||[],pe=se.filter(n=>n.id===f),$=hr&&pe.some(n=>n.type==="git"),mr=()=>{ve.current?.abort(),X(null),Z(null),le(""),kt(!0)};(0,r.useEffect)(()=>{se.some(n=>n.id===f)&&$t(p?.cwd,f)},[p?.cwd,f,d]);let ge=()=>{At.current?.abort(),ve.current?.abort(),X(null),Z(null),le(""),me("content"),Je({added:0,deleted:0,count:0})},De=()=>{Pe.current=!1,ge(),Ke.current?.abort(),Qe.current=d,y(null),m({}),te(w.trim()),D(n=>n+1)},Ye=()=>{Pe.current||(Pe.current=!0,ge(),Ke.current?.abort(),Qe.current=null,y(null),m({}),te(""),D(n=>n+1))},Lt=(n=!1)=>{n||E(g=>g+1),Xe.current=n,n||ge(),n||m({}),x(g=>g+1)};(0,r.useEffect)(()=>{let n=new AbortController;return Ke.current=n,ht(""),G(!!a),a&&i("vcs/repositories",{sessionId:a,...ne?{subdirectory:ne}:{}},n.signal).then(g=>{if(!n.signal.aborted){let B=nr(Qe.current,g,ne);Pe.current=!1,A(j=>Rt(B.repositories,j)),y(B)}}).catch(g=>{n.signal.aborted||ht(g.message)}).finally(()=>{n.signal.aborted||G(!1)}),()=>n.abort()},[a,M,ne]),(0,r.useEffect)(()=>{let n=new AbortController,g=Xe.current;At.current=n,Xe.current=!1,g||(m({}),le(""));for(let B of pe){let j=je(B,l);s(()=>i("vcs/status",{sessionId:a,repositoryId:B.id,mode:j},n.signal),n.signal).then(J=>{n.signal.aborted||m(ee=>({...ee,[B.id]:{...J,mode:j}}))}).catch(J=>{if(!n.signal.aborted){if(J.code==="vcs/rediscover-required"){Ye();return}m(ee=>({...ee,[B.id]:{error:J.message,changes:[],mode:j}}))}})}return()=>n.abort()},[a,d,f,l,b]),(0,r.useEffect)(()=>{let n=g=>{g.target===window&&a&&f&&document.visibilityState==="visible"&&Lt(!0)};return window.addEventListener("focus",n),()=>window.removeEventListener("focus",n)},[a,f,l]);let Me=se.find(n=>n.id===z?.repositoryId),be=z?h[z.repositoryId]:null;(0,r.useEffect)(()=>{let n=new AbortController;return ve.current=n,X(null),le(""),Je({added:0,deleted:0,count:0}),me("content"),ft(!!z&&!!be),!$&&z&&be&&Me&&i("vcs/compare",{sessionId:a,repositoryId:z.repositoryId,mode:je(Me,l),id:z.id},n.signal).then(g=>{n.signal.aborted||X(g)}).catch(g=>{if(!n.signal.aborted){if(g.code==="vcs/rediscover-required"){Ye();return}le(g.message)}}).finally(()=>{n.signal.aborted||ft(!1)}),()=>n.abort()},[z,be,a,l,$]),(0,r.useEffect)(()=>{let n=!1,g,B=new AbortController;Ct(!1),mt("");let j=document.createElement("link");return j.rel="stylesheet",j.href=dr("editor.css"),document.head.appendChild(j),Fe(dr("editor.js")+"?v="+encodeURIComponent(Te)+"&retry="+wt,{signal:B.signal}).then(J=>{n||(g=J.createDiff(Et.current,{onStats:Je}),ce.current=g,Ct(!0))}).catch(J=>{n||mt(J.message)}),()=>{n=!0,B.abort(),g?.dispose(),ce.current=null,j.remove()}},[wt]),(0,r.useEffect)(()=>{Q&&C&&!C.binary&&ce.current?.setContent(C,JSON.stringify([a,d?.cwd,z?.repositoryId,l,z?.id,C.path]))},[Q,C,a,d,z,l]),(0,r.useEffect)(()=>{ce.current?.options({sideBySide:he,ignoreWhitespace:Ie,wrap:ze})},[Q,he,Ie,ze]);let ye=ir(pe,h,oe,Ee),ue=ye.flatMap(n=>n.changes),vr=sr(be?.changes),$e=er(ue,z?.id),Pt=()=>{Ue(""),bt("all")},gr=async()=>{let n=C?.path||re?.path;if(n)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(n);else{let g=document.createElement("textarea");try{if(g.value=n,g.style.cssText="position:fixed;opacity:0",document.body.appendChild(g),g.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{g.remove()}}gt(!0),window.setTimeout(()=>gt(!1),1500)}catch{le(e("copyFailed"))}};(0,r.useEffect)(()=>{let n=g=>{if($)return;let B=Qt(g,Nt.current,Le.current,!!oe);B&&(g.preventDefault(),B==="search"?(Le.current?.focus(),Le.current?.select()):B==="clear"?Ue(""):Ze(B))};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[oe,ue,z,$]);let Dt=n=>We(g=>{let B={...g};for(let j of ye)for(let J of ut(pt(j.changes)))B[j.repository.id+"\0"+J]=!n;return B}),br=()=>{let n=re;!n||!z||(yt(!0),Pt(),We(g=>{let B={...g};for(let j of rr(n.path))B[z.repositoryId+"\0"+j]=!1;return B}),Ve.current=Ce(z.repositoryId,n.id))};(0,r.useEffect)(()=>{let n=Ve.current;if(!n)return;let g=[..._e.current?.querySelectorAll("button[data-vcs-change]")||[]].find(B=>B.dataset.vcsChange===n);g&&(g.scrollIntoView({block:"nearest"}),g.focus(),Ve.current=null)},[de,oe,Ee,xt,ye]);let Ze=n=>{let g=tr(ue,z?.id,n);g&&(ve.current?.abort(),X(null),me("content"),Z({repositoryId:f,id:g.id}))},Mt=P||pe.some(n=>!h[n.id]),re=be?.changes?.find(n=>n.id===z?.id),ie=C?.properties,Re=ie?[...new Set([...Object.keys(ie.left||{}),...Object.keys(ie.right||{})])].filter(n=>ie.left?.[n]!==ie.right?.[n]):[],xe=n=>lr[n?.status]||n?.status?.slice(0,1).toUpperCase()||"M",Bt=C?.binary?[C.left.label,C.right.label].filter(Boolean).join(" \u2194 "):"",fe=qe||(Y?e("loading"):a?Mt&&!re?e("loading"):ae||(se.length?re?C?.binary?e("binary")+(Bt?" "+e("binaryComparison",{files:Bt}):""):C?!Q&&!R?e("loading"):"":e("pick"):e("pick"):e("noRepo")):e("noSession")),yr=n=>{let g=_e.current,B=g?[...g.querySelectorAll("button[data-vcs-item]")]:[],j=B.indexOf(n.target);if(j<0)return;let J;if(n.key==="ArrowDown")J=B[j+1];else if(n.key==="ArrowUp")J=B[j-1];else if(n.key==="Home")J=B[0];else if(n.key==="End")J=B.at(-1);else if(n.key==="ArrowRight"&&n.target.dataset.vcsDirectory==="closed"){n.preventDefault(),n.target.click();return}else if(n.key==="ArrowLeft"&&n.target.dataset.vcsDirectory==="open"){n.preventDefault(),n.target.click();return}else return;n.preventDefault(),J?.focus()},Ht=({entry:n,compact:g=!1,depth:B=0})=>{let j=n.path.lastIndexOf("/");return r.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":Ce(f,n.id),"aria-current":z?.repositoryId===f&&z?.id===n.id?"true":void 0,style:{paddingInlineStart:8+B*14},title:(n.oldPath?n.oldPath+" \u2192 ":"")+n.path+" \xB7 "+e(xe(n)),onClick:()=>{ve.current?.abort(),X(null),me("content"),Z({repositoryId:f,id:n.id})}},r.default.createElement("span",{className:"vcs-status","data-status":xe(n)},xe(n)),r.default.createElement("span",{className:"vcs-filename"},g?n.path.slice(j+1):n.path,n.oldPath&&r.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",n.oldPath)))},Ft=({node:n,repository:g,depth:B=0})=>r.default.createElement(r.default.Fragment,null,n.directories.map(j=>{let J=g.id+"\0"+j.id,ee=!!xt[J];return r.default.createElement(r.default.Fragment,{key:J},r.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":ee?"closed":"open","aria-expanded":!ee,style:{paddingInlineStart:8+B*14},onClick:()=>We(xr=>({...xr,[J]:!ee}))},r.default.createElement("span",{"aria-hidden":"true"},ee?"\u203A":"\u2304"),j.name,r.default.createElement("small",null,j.count)),!ee&&r.default.createElement(Ft,{node:j,repository:g,depth:B+1}))}),n.files.map(j=>r.default.createElement(Ht,{key:Ce(g.id,j.id),entry:j,compact:n.id!=="",depth:B})));return r.default.createElement("section",{ref:Nt,className:"vcs-root","aria-label":e("title")},r.default.createElement("style",null,et),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:P||!se.length,onChange:n=>{ge(),m({}),A(n.target.value)}},!se.length&&r.default.createElement("option",{value:""},e("repositories")),se.map(n=>r.default.createElement("option",{key:n.id,value:n.id},Ne(n,e("workspaceRoot"))))),r.default.createElement("label",{className:"vcs-mode"},e("gitMode")," ",r.default.createElement("select",{"aria-label":e("gitMode"),value:l,disabled:$||!pe.some(n=>n.type==="git"),onChange:n=>{ge(),m({}),v(n.target.value)}},["all","unstaged","staged"].map(n=>r.default.createElement("option",{key:n,value:n},e(n))))),r.default.createElement("button",{onClick:()=>Lt(!1),disabled:Mt||!a},e("refresh")),r.default.createElement("button",{onClick:()=>t.layout.selectPanel(null)},e("back")),r.default.createElement("div",{className:"vcs-path",title:d?.cwd||p?.cwd},e("session"),": ",d?.cwd||p?.cwd||"\u2014"),r.default.createElement("form",{className:"vcs-discovery",onSubmit:n=>{n.preventDefault(),De()}},r.default.createElement("input",{"aria-label":e("subdirectory"),placeholder:e("subdirectory"),value:w,onChange:n=>W(n.target.value)}),r.default.createElement("button",{disabled:!a||P},e("rescan")),r.default.createElement("span",null,e("scanHint"))),d?.truncated&&r.default.createElement("div",{className:"vcs-notice"},e("truncated")),(d?.warnings||[]).map((n,g)=>r.default.createElement("div",{className:"vcs-notice",key:g},typeof n=="string"?n:n.message||JSON.stringify(n)))),pe.some(n=>n.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":!$,onClick:()=>kt(!1)},e("workspaceView")),r.default.createElement("button",{"aria-pressed":$,"aria-expanded":$,onClick:mr},e("history"))),$&&r.default.createElement(ct,{key:JSON.stringify([a,f,N,M]),sessionId:a,repositoryId:f,rpc:i,t:e,onRediscover:Ye})),r.default.createElement("div",{className:"vcs-body",hidden:$,"aria-label":e("workspaceView")},r.default.createElement("aside",{className:"vcs-files"},r.default.createElement("div",{className:"vcs-filter"},r.default.createElement("input",{ref:Le,"aria-label":e("search"),placeholder:e("search"),title:e("searchShortcut"),value:oe,onChange:n=>Ue(n.target.value)}),(oe||Ee!=="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(n=>r.default.createElement("button",{key:n,"aria-pressed":Ee===n,onClick:()=>bt(n)},e(n==="all"?"allFiles":lr[n]||"M")," ",r.default.createElement("small",null,vr[n]||0)))),r.default.createElement("div",{className:"vcs-count"},r.default.createElement("span",null,ue.length," ",e("files")),r.default.createElement("span",{className:"vcs-auto"},e("autoRefresh")),r.default.createElement("button",{"aria-pressed":de,onClick:()=>yt(!de)},e(de?"tree":"list"))),de&&r.default.createElement("div",{className:"vcs-tree-actions"},r.default.createElement("button",{onClick:()=>Dt(!0)},e("expandAll")),r.default.createElement("button",{onClick:()=>Dt(!1)},e("collapseAll")),r.default.createElement("button",{onClick:br,disabled:!re},e("revealSelected"))),r.default.createElement("nav",{className:"vcs-filelist","aria-label":e("title"),ref:_e,onKeyDown:yr},ye.map(n=>{let g=n.repository;return r.default.createElement("section",{className:"vcs-repository",key:g.id,"aria-label":Ne(g,e("workspaceRoot"))},r.default.createElement("div",{className:"vcs-repository-heading",title:g.root},r.default.createElement("strong",null,Ne(g,e("workspaceRoot"))),r.default.createElement("small",null,g.type==="svn"?e("svnBase"):e(je(g,l)))),n.error?r.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},n.error,r.default.createElement("button",{onClick:De},e("rescan"))):h[g.id]?de?r.default.createElement(Ft,{node:pt(n.changes),repository:g}):n.changes.map(B=>r.default.createElement(Ht,{key:Ce(g.id,B.id),entry:B})):r.default.createElement("div",{className:"vcs-message"},e("loading")),!n.error&&h[g.id]&&!n.changes.length&&r.default.createElement("div",{className:"vcs-message"},e(oe?"emptySearch":"clean")))}),!ye.length&&r.default.createElement("div",{className:"vcs-message"},P?e("loading"):ae||e(a?"noRepo":"noSession"),ae&&r.default.createElement("button",{onClick:De},e("rescan"))))),r.default.createElement("main",{className:"vcs-detail"},r.default.createElement("div",{className:"vcs-filehead"},r.default.createElement("strong",{title:C?.path||re?.path},Me?Ne(Me,e("workspaceRoot"))+" / ":"",C?.path||re?.path||e("pick")),r.default.createElement("button",{className:"vcs-copy-path",disabled:!(C?.path||re?.path),onClick:gr},e(vt?"copied":"copyPath")),vt&&r.default.createElement("span",{className:"vcs-sr-only",role:"status"},e("pathCopied")),r.default.createElement("span",{className:"vcs-spacer"}),C&&!C.binary&&Q&&r.default.createElement(r.default.Fragment,null,r.default.createElement("span",{className:"vcs-add"},"+",Ge.added),r.default.createElement("span",{className:"vcs-del"},"\u2212",Ge.deleted))),R&&r.default.createElement("div",{className:"vcs-notice",role:"status"},e("fallback")," ",r.default.createElement("button",{onClick:()=>St(n=>n+1)},e("retry")),r.default.createElement("details",null,r.default.createElement("summary",null,e("diagnostics")),R)),C&&r.default.createElement("div",{className:"vcs-context","aria-label":e("comparisonContext")},r.default.createElement("span",{className:"vcs-context-status","data-status":xe(C)},e(xe(C))),C.oldPath&&r.default.createElement("span",{className:"vcs-context-rename",title:C.oldPath+" \u2192 "+C.path},C.oldPath," ",r.default.createElement("b",null,"\u2192")," ",C.path),r.default.createElement("span",null,C.left.label||"\u2014"," ",r.default.createElement("b",null,"\u2194")," ",C.right.label||"\u2014"),(C.left.encoding||C.right.encoding)&&r.default.createElement("span",null,e("encoding"),": ",C.left.encoding||"\u2014"," / ",C.right.encoding||"\u2014")),C?.notice&&r.default.createElement("div",{className:"vcs-notice"},C.notice),Re.length>0&&r.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(n=>r.default.createElement("button",{key:n,"aria-pressed":Ae===n,onClick:()=>me(n)},e(n),n==="properties"?" ("+Re.length+")":""))),r.default.createElement("div",{className:"vcs-labels"},r.default.createElement("span",null,C?.left.label||"\u2014",C?.left.encoding?" \xB7 "+C.left.encoding:""),r.default.createElement("span",null,C?.right.label||"\u2014",C?.right.encoding?" \xB7 "+C.right.encoding:"")),r.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!fe||Ae!=="content",style:Ae==="properties"?{display:"none"}:void 0},r.default.createElement("div",{className:"vcs-editor",ref:Et,style:R?{display:"none"}:void 0}),R&&C&&!C.binary&&!fe&&r.default.createElement(we,{comparison:C,labels:He(e)}),fe&&r.default.createElement("div",{className:"vcs-message "+(ae||qe||R?"vcs-error":""),role:"status"},fe,(ae||qe||R)&&r.default.createElement("button",{onClick:()=>R?St(n=>n+1):De()},e(R?"retry":"rescan")))),Ae==="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,C?.left.label||e("before")),r.default.createElement("th",null,C?.right.label||e("after")))),r.default.createElement("tbody",null,Re.map(n=>r.default.createElement("tr",{key:n},r.default.createElement("th",null,n),r.default.createElement("td",null,ie.left?.[n]??"\u2014"),r.default.createElement("td",null,ie.right?.[n]??"\u2014")))))),r.default.createElement("footer",{className:"vcs-toolbar"},r.default.createElement("button",{disabled:!Q,"aria-pressed":he,onClick:()=>pr(!he)},e(he?"side":"inline")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Q,checked:Ie,onChange:n=>ur(n.target.checked)}),e("whitespace")),r.default.createElement("label",null,r.default.createElement("input",{type:"checkbox",disabled:!Q,checked:ze,onChange:n=>fr(n.target.checked)}),e("wrap")),r.default.createElement("span",{className:"vcs-spacer"}),Q&&r.default.createElement("span",null,Ge.count," ",e("changes")),r.default.createElement("button",{disabled:!Q||!C||!!fe,onClick:()=>ce.current?.navigate("previous")},e("previous")),r.default.createElement("button",{disabled:!Q||!C||!!fe,onClick:()=>ce.current?.navigate("next")},e("next")),$e.index>0&&r.default.createElement("span",{className:"vcs-review-position"},e("reviewPosition",{index:$e.index,total:$e.total})),r.default.createElement("span",{className:"vcs-toolbar-separator"}),r.default.createElement("button",{title:e("fileShortcut"),disabled:!ue.length,onClick:()=>Ze("previous")},e("previousFile")),r.default.createElement("button",{title:e("fileShortcut"),disabled:!ue.length,onClick:()=>Ze("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))}
96
96
  return module.exports; }});
package/git-history.mjs CHANGED
@@ -1,3 +1,19 @@
1
+ // Search values are literal, bounded and never revision/options or pathspec expressions.
2
+ export function historySearchArgs(search){
3
+ if(search===undefined)return {args:[],paths:[]};
4
+ if(!search||typeof search!=='object'||Array.isArray(search)||Object.keys(search).some(k=>!['message','author','path'].includes(k)))throw new Error('Invalid history search');
5
+ const args=['--fixed-strings','--regexp-ignore-case'],paths=[];
6
+ for(const key of ['message','author','path']){
7
+ const value=search[key];if(value===undefined)continue;
8
+ if(typeof value!=='string'||value.length>1024||/[\0\r\n]/.test(value))throw new Error('Invalid history search value');
9
+ if(!value)continue;
10
+ if(key==='path'){
11
+ if(value.startsWith('/')||value.includes('\\')||value.split('/').some(p=>!p||p==='.'||p==='..'))throw new Error('Invalid history search path');
12
+ paths.push(value);
13
+ }else args.push((key==='message'?'--grep=':'--author=')+value);
14
+ }
15
+ return {args,paths};
16
+ }
1
17
  // Each line-porcelain record carries its own metadata; never interpret filename as an access path.
2
18
  export function parseBlame(text,maxLines=500){
3
19
  if(typeof text!=='string'||Buffer.byteLength(text,'utf8')>2*1024*1024)throw new Error('Invalid blame output size');
package/index.mjs CHANGED
@@ -22,9 +22,10 @@ export async function resolveSessionCwd(ctx, sessionId, signal) {
22
22
 
23
23
  const rediscover = () => Object.assign(new Error('Repository authorization is missing, expired, or changed. Rediscover repositories for this Session and retry.'), { code: 'vcs/rediscover-required' });
24
24
 
25
+ import {historySearchArgs} from './git-history.mjs';
25
26
  function validatePayload(endpoint, payload) {
26
27
  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) throw invalid('An object payload is required.');
27
- const fields = endpoint==='vcs/tree-file'?['sessionId','repositoryId','commit','path'] : endpoint==='vcs/references'?['sessionId','repositoryId'] : endpoint==='vcs/commit-image'?['sessionId','repositoryId','commit','parentIndex','id','side'] : endpoint==='vcs/tree'?['sessionId','repositoryId','commit'] : endpoint==='vcs/file-history'?['sessionId','repositoryId','commit','parentIndex','id','offset','limit'] : ['vcs/revision-changes','vcs/revision-compare'].includes(endpoint) ? ['sessionId','repositoryId','base','target',...(endpoint==='vcs/revision-compare'?['id']:[])] : ['vcs/commit-compare','vcs/blame'].includes(endpoint) ? ['sessionId','repositoryId','commit','parentIndex','id'] : endpoint === 'vcs/commit' ? ['sessionId','repositoryId','commit','parentIndex'] : endpoint === 'vcs/history' ? ['sessionId','repositoryId','snapshot','offset','limit'] : endpoint === 'vcs/repositories' ? ['sessionId', 'subdirectory'] : ['sessionId', 'repositoryId', 'mode', ...(endpoint === 'vcs/compare' ? ['id'] : [])];
28
+ const fields = endpoint==='vcs/tree-file'?['sessionId','repositoryId','commit','path'] : endpoint==='vcs/references'?['sessionId','repositoryId'] : endpoint==='vcs/commit-image'?['sessionId','repositoryId','commit','parentIndex','id','side'] : endpoint==='vcs/tree'?['sessionId','repositoryId','commit'] : endpoint==='vcs/file-history'?['sessionId','repositoryId','commit','parentIndex','id','offset','limit'] : ['vcs/revision-changes','vcs/revision-compare'].includes(endpoint) ? ['sessionId','repositoryId','base','target',...(endpoint==='vcs/revision-compare'?['id']:[])] : ['vcs/commit-compare','vcs/blame'].includes(endpoint) ? ['sessionId','repositoryId','commit','parentIndex','id'] : endpoint === 'vcs/commit' ? ['sessionId','repositoryId','commit','parentIndex'] : endpoint === 'vcs/history' ? ['sessionId','repositoryId','snapshot','offset','limit','search'] : endpoint === 'vcs/repositories' ? ['sessionId', 'subdirectory'] : ['sessionId', 'repositoryId', 'mode', ...(endpoint === 'vcs/compare' ? ['id'] : [])];
28
29
  if (Object.keys(payload).some(key => !fields.includes(key))) throw invalid('Only Session-addressed repository requests are supported; unknown payload field.');
29
30
  if (endpoint === 'vcs/repositories') {
30
31
  if (payload.subdirectory !== undefined) {
@@ -44,6 +45,7 @@ function validatePayload(endpoint, payload) {
44
45
  if(typeof payload.commit!=='string'||!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(payload.commit))throw invalid('Invalid commit id.');
45
46
  if(payload.parentIndex!==undefined&&(!Number.isInteger(payload.parentIndex)||payload.parentIndex<0||payload.parentIndex>100))throw invalid('Invalid parent index.');
46
47
  }
48
+ if(endpoint==='vcs/history'){try{historySearchArgs(payload.search);}catch{throw invalid('Invalid history search.');}}
47
49
  if(['vcs/history','vcs/file-history'].includes(endpoint)){
48
50
  if(payload.offset===null||payload.limit===null)throw invalid('Invalid history pagination.');
49
51
  if(payload.snapshot!==undefined&&(typeof payload.snapshot!=='string'||!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(payload.snapshot)))throw invalid('Invalid history snapshot.');
@@ -142,7 +144,7 @@ export function createHandler(ctx, api = adapter, maxActive = 4, { now = Date.no
142
144
  : endpoint === 'vcs/commit'
143
145
  ? await api.getCommitDetails({...repository},{commit:payload.commit,parentIndex:payload.parentIndex??0,signal})
144
146
  : endpoint === 'vcs/history'
145
- ? await api.listHistory({...repository},{snapshot:payload.snapshot,offset:payload.offset??0,limit:payload.limit??50,signal})
147
+ ? await api.listHistory({...repository},{snapshot:payload.snapshot,search:payload.search,offset:payload.offset??0,limit:payload.limit??50,signal})
146
148
  : endpoint === 'vcs/status'
147
149
  ? { cwd, repository: { ...repository }, changes: await api.listChanges({ ...repository }, mode), mode }
148
150
  : await api.getComparison({ ...repository }, { mode, id: payload.id });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng0531/dsh-vcs",
3
- "version": "0.3.52",
3
+ "version": "0.3.54",
4
4
  "private": false,
5
5
  "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
6
6
  "type": "module",
package/vcs.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {preparePng} from './image-preview.mjs';
2
2
  import { spawn } from 'node:child_process';
3
- import {parseHistory,HISTORY_FORMAT,historyPage,parseBlame,parseReferences,REFS_FORMAT} from './git-history.mjs';
3
+ import {parseHistory,HISTORY_FORMAT,historyPage,historySearchArgs,parseBlame,parseReferences,REFS_FORMAT} from './git-history.mjs';
4
4
  import * as fs from 'node:fs/promises';
5
5
  import path from 'node:path';
6
6
  import { createHash } from 'node:crypto';
@@ -221,7 +221,8 @@ async function checkedRepo(repo, signal) {
221
221
  if (!found || found.type !== repo.type || path.resolve(found.root) !== path.resolve(repo.root)) throw new Error('Repository root changed or is invalid');
222
222
  return found;
223
223
  }
224
- export async function listHistory(repo, {snapshot,offset=0,limit=50,signal} = {}) {
224
+ export async function listHistory(repo, {snapshot,offset=0,limit=50,search,signal} = {}) {
225
+ const query=historySearchArgs(search);
225
226
  if(!Number.isInteger(offset)||offset<0||offset>10000||!Number.isInteger(limit)||limit<1||limit>100) throw new Error('Invalid history pagination');
226
227
  if(snapshot!==undefined && (typeof snapshot!=='string'||!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(snapshot))) throw new Error('Invalid history snapshot');
227
228
  if(signal?.aborted) throw Object.assign(new Error('History cancelled'),{code:'ABORT_ERR'});
@@ -238,7 +239,7 @@ export async function listHistory(repo, {snapshot,offset=0,limit=50,signal} = {}
238
239
  throw e;
239
240
  }
240
241
  }
241
- const text=await git(repo.root,['log','-z','--no-show-signature','--encoding=UTF-8','--topo-order','--max-count='+String(limit+1),'--skip='+String(offset),'--format='+HISTORY_FORMAT,snapshot,'--'],MAX_TEXT,{signal});
242
+ const text=await git(repo.root,['--literal-pathspecs','log','-z','--no-show-signature','--encoding=UTF-8','--topo-order','--max-count='+String(limit+1),'--skip='+String(offset),'--format='+HISTORY_FORMAT,...query.args,snapshot,'--',...query.paths],MAX_TEXT,{signal});
242
243
  const rows=parseHistory(text.toString('utf8'),limit+1);
243
244
  return historyPage(rows,snapshot,offset,limit);
244
245
  }