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