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