@feng0531/dsh-vcs 0.3.77 → 0.3.79

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/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
  | --- | --- |
15
15
  | 查看工作区变更 | Git 全部、已暂存、未暂存文件;SVN 本地基线与工作副本、属性差异 |
16
16
  | 阅读代码差异 | 默认 Monaco 只读 Diff,支持并排/行内、换行、忽略行尾空白、上一处/下一处差异 |
17
- | 浏览 Git 历史 | 搜索提交说明、作者和路径;查看本地分支、提交图、提交详情与目录 |
17
+ | 浏览 Git 历史 | 搜索提交说明、作者、路径与提交时间范围(since/until,含边界,按 committer date);查看本地分支、提交图、提交详情与目录 |
18
18
  | 比较历史版本 | 比较提交与选定父提交,或选择两个本地提交进行 A/B 比较 |
19
19
  | 追溯代码来源 | 文件历史、唯一来源重命名追踪(含改名同时修改)、Blame(逐行查看最后修改者和提交) |
20
20
  | 查看其他内容 | 支持部分静态图片比较;较大历史 UTF-8 文件可分段阅读 |
@@ -79,6 +79,7 @@ profile是DSH的配置和插件环境,不是Session。下面的web是示例,
79
79
  - 普通文本比较每侧最多 **2MiB**。Git提交/A-B/工作区三个模式比较超限时可手动加载完整UTF-8文本,每侧最多 **8MiB、10万行**,单行最多65536字符;计算超时会明确提示结果不完整。工作区读取期间发生变化会拒绝结果,但不是系统级原子快照;SVN大文件仍不支持。
80
80
  - 历史 UTF-8 正文分段最多 **16MiB**;分段阅读不是完整Diff,与上述完整比较是不同功能。
81
81
  - 重命名追溯仅沿第一父链,至少50%相似且确认唯一删除源/新增目标;合并、复制、歧义或累计32次确认后停止。
82
+ - 子模块变更只显示 Index 记录的提交指针与本地检出状态(已检出/未初始化/目录缺失/不可读);不进入子模块、不读取其 HEAD,也不更新或同步。
82
83
  - 树浏览和来源行预览可手动查看该历史路径的文件历史,并可选跟随重命名;路径必须存在于所选提交,跟随规则与路径历史一致(第一父链、≥50%相似、唯一确认、32次上限)。
83
84
  - 冲突文件可额外手动查看 Git Index 阶段1/2/3,任意两阶段可只读比较。缺失阶段显示为空、不推断原内容;阶段编号不声称合并/变基归属。每阶段仍为 2MiB 预览;不读取工作文件、不解决冲突,子模块只显示提交引用,链接只显示目标文本。
84
85
  - 图片支持 PNG、基线 JPEG 和简单静态 VP8/无损VP8L WebP;动画、扩展 WebP 等不支持。
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 $o=Object.create;var _e=Object.defineProperty;var Zo=Object.getOwnPropertyDescriptor;var Ro=Object.getOwnPropertyNames;var er=Object.getPrototypeOf,tr=Object.prototype.hasOwnProperty;var or=(e,t)=>{for(var r in t)_e(e,r,{get:t[r],enumerable:!0})},ro=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ro(t))!tr.call(e,i)&&i!==r&&_e(e,i,{get:()=>t[i],enumerable:!(o=Zo(t,i))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?$o(er(e)):{},ro(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e)),rr=e=>ro(_e({},"__esModule",{value:!0}),e);var Mr={};or(Mr,{apply:()=>Dr,inject:()=>Fr});module.exports=rr(Mr);var n=R(require("react"),1);var ht=`.vcs-root .vcs-discovery{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}
2
+ var Ro=Object.create;var Ke=Object.defineProperty;var er=Object.getOwnPropertyDescriptor;var tr=Object.getOwnPropertyNames;var or=Object.getPrototypeOf,rr=Object.prototype.hasOwnProperty;var ir=(e,t)=>{for(var r in t)Ke(e,r,{get:t[r],enumerable:!0})},io=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of tr(t))!rr.call(e,i)&&i!==r&&Ke(e,i,{get:()=>t[i],enumerable:!(o=er(t,i))||o.enumerable});return e};var Z=(e,t,r)=>(r=e!=null?Ro(or(e)):{},io(t||!e||!e.__esModule?Ke(r,"default",{value:e,enumerable:!0}):r,e)),sr=e=>io(Ke({},"__esModule",{value:!0}),e);var jr={};ir(jr,{apply:()=>Tr,inject:()=>Mr});module.exports=sr(jr);var n=Z(require("react"),1);var ht=`.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 $o=Object.create;var _e=Object.defineProperty;var Zo=Object.getOwnPropertyDe
92
92
  .vcs-root .vcs-toolbar{gap:6px}
93
93
  .vcs-root .vcs-title{font-size:16px}
94
94
  }
95
- `;function io(e,t){return async(r,o,i)=>{let s=await e.rpc.call("/vcs-rpc",r,o,i);if(!s.ok){let p=new Error(s.error?.message||String(s.error||t()));throw p.code=s.error?.code,p}return s.value}}function gt(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,r=[];function o(){for(;t<e&&r.length;){let i=r.shift();if(i.signal?.removeEventListener("abort",i.abort),i.signal?.aborted){i.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(i.signal?.aborted)throw new Error("Aborted");return i.run()}).then(i.resolve,i.reject).finally(()=>{t--,o()})}}return(i,s)=>new Promise((p,f)=>{let c={run:i,signal:s,resolve:p,reject:f,abort:null};if(c.abort=()=>{let a=r.indexOf(c);a>=0&&(r.splice(a,1),f(new Error("Aborted")))},s?.aborted){f(new Error("Aborted"));return}s?.addEventListener("abort",c.abort,{once:!0}),r.push(c),o()})}var te=R(require("react"),1);function so(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function no(e="",t=""){let r=so(e),o=so(t),i=0;for(;i<r.length&&i<o.length&&r[i]===o[i];)i++;let s=0;for(;s<r.length-i&&s<o.length-i&&r[r.length-s-1]===o[o.length-s-1];)s++;let p=r.length-s,f=o.length-s,c=p-i,a=f-i,d=c&&a?(c+1)*(a+1):0,h=d>2e5,k=[],y=0;function C(u,x){y++,!(k.length>=2e3)&&k.push({left:u===null?null:{number:u+1,text:r[u]},right:x===null?null:{number:x+1,text:o[x]},kind:u===null?"insert":x===null?"delete":r[u]===o[x]?"equal":"replace"})}for(let u=0;u<i;u++)C(u,u);if(h||!c||!a)for(let u=0;u<Math.max(c,a);u++)C(u<c?i+u:null,u<a?i+u:null);else{let u=a+1,x=new Uint32Array(d);for(let g=c-1;g>=0;g--)for(let m=a-1;m>=0;m--)x[g*u+m]=r[i+g]===o[i+m]?x[(g+1)*u+m+1]+1:Math.max(x[(g+1)*u+m],x[g*u+m+1]);let b=0,v=0;for(;b<c||v<a;)b<c&&v<a&&r[i+b]===o[i+v]?C(i+b++,i+v++):b<c&&(v===a||x[(b+1)*u+v]>=x[b*u+v+1])?C(i+b++,null):C(null,i+v++)}for(let u=0;u<s;u++)C(p+u,f+u);return{rows:k,approximate:h,truncated:y>k.length,totalRows:y,omittedRows:y-k.length,leftLineCount:r.length,rightLineCount:o.length,lcsCells:h?0:d}}var nr={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."},yt={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},ar={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},lr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},cr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Te({comparison:e,labels:t={}}){let r=e?.left?.text??"",o=e?.right?.text??"",i=(0,te.useMemo)(()=>no(r,o),[r,o]),s=f=>t[f]??nr[f],p=(f,c,a)=>{let d=f&&a!=="equal";return te.default.createElement("td",{style:{...yt,background:d?c==="left"?"#d6454520":"#259b4920":void 0}},te.default.createElement("div",{style:ar},te.default.createElement("span",{style:lr},f?.number??""),te.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},d?c==="left"?"\u2212":"+":""),te.default.createElement("pre",{style:cr},f?.text??"")))};return te.default.createElement("section",{className:"vcs-text-comparison","aria-label":s("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},i.approximate&&te.default.createElement("div",{role:"status",style:{padding:8}},s("approximate")),i.truncated&&te.default.createElement("div",{role:"status",style:{padding:8}},s("truncated")," (",2e3," / ",i.totalRows,")"),te.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},te.default.createElement("thead",null,te.default.createElement("tr",null,te.default.createElement("th",{scope:"col",style:{...yt,padding:8,overflowWrap:"anywhere"}},e?.left?.label||s("before")),te.default.createElement("th",{scope:"col",style:{...yt,padding:8,overflowWrap:"anywhere"}},e?.right?.label||s("after")))),te.default.createElement("tbody",null,i.rows.map((f,c)=>te.default.createElement("tr",{key:c,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!i.rows.length&&te.default.createElement("p",{style:{padding:8}},s("empty")))}var U=R(require("react"),1);function ao(e,{width:t,height:r,signal:o,timeoutMs:i=1e4,createURL:s=c=>URL.createObjectURL(c),revokeURL:p=c=>URL.revokeObjectURL(c),createImage:f=()=>new Image}={}){return new Promise((c,a)=>{if(o?.aborted){a(o.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(r)||t<1||r<1||t>8192||r>8192||t*r>16e6||!Number.isFinite(i)||i<=0){a(new Error("Invalid image preview"));return}let d,h,k,y=!1,C=!1,u=()=>{C||(C=!0,h&&(h.src=""),d&&p(d))},x=()=>{clearTimeout(k),o?.removeEventListener("abort",v)},b=g=>{y||(y=!0,x(),u(),a(g))},v=()=>b(o.reason||new Error("Image cancelled"));try{d=s(e),h=f(),o?.addEventListener("abort",v,{once:!0}),k=setTimeout(()=>b(new Error("Image decode timed out")),i),h.src=d,Promise.resolve(h.decode()).then(()=>{if(!y){if(o?.aborted){v();return}if(h.naturalWidth!==t||h.naturalHeight!==r){b(new Error("Image dimensions mismatch"));return}y=!0,x(),c({url:d,dispose:u})}},b)}catch(g){b(g)}})}function dr({side:e,sessionId:t,repositoryId:r,commit:o,parentIndex:i,base:s,target:p,workspace:f=!1,mode:c,id:a,rpc:d,t:h,onRediscover:k}){let[y,C]=(0,U.useState)(null),[u,x]=(0,U.useState)(""),[b,v]=(0,U.useState)(0);return(0,U.useEffect)(()=>{let g=new AbortController,m;return C(null),x(""),(async()=>{let S=await d(f?"vcs/workspace-image":s?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:r,mode:c,id:a,side:e}:s?{sessionId:t,repositoryId:r,base:s,target:p,id:a,side:e}:{sessionId:t,repositoryId:r,commit:o,parentIndex:i,id:a,side:e},g.signal);if(g.signal.aborted)return;if(S.absent){C(S);return}if(!["image/png","image/jpeg","image/webp"].includes(S.mime)||typeof S.base64!="string"||S.base64.length>2796204||!Number.isInteger(S.bytes)||S.bytes<1||S.bytes>2097152)throw Error(h("imageInvalid"));let H=atob(S.base64);if(H.length!==S.bytes)throw Error(h("imageInvalid"));let _=new Blob([Uint8Array.from(H,w=>w.charCodeAt(0))],{type:S.mime});if(m=await ao(_,{width:S.width,height:S.height,signal:g.signal}),g.signal.aborted){m.dispose();return}C({...S,url:m.url})})().catch(S=>{g.signal.aborted||(x(S.message),S.code==="vcs/rediscover-required"&&k())}),()=>{g.abort(),m?.dispose()}},[e,t,r,o,i,s,p,f,c,a,b]),U.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(e==="left"?"imageBefore":"imageAfter")},U.default.createElement("h5",null,h(e==="left"?"imageBefore":"imageAfter")),u?U.default.createElement("p",{role:"alert"},u," ",U.default.createElement("button",{onClick:()=>v(g=>g+1)},h("retry"))):y?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,U.default.createElement("code",null,y.commit)," \xB7 ",y.path),y.absent?U.default.createElement("p",null,h("imageAbsent")):U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,y.mime,y.encoding?" \xB7 "+y.encoding:""," \xB7 ",y.width," \xD7 ",y.height," \xB7 ",y.bytes," B"),U.default.createElement("img",{src:y.url,alt:y.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),y.metadataStripped&&U.default.createElement("p",null,h("imageMetadata")))):U.default.createElement("p",{role:"status"},h("loading")))}function je(e){let[t,r]=(0,U.useState)(!1);return U.default.createElement("div",null,U.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("imageCompare")),t&&U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,e.t("imageScope")),U.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(o=>U.default.createElement(dr,{key:o,...e,side:o})))))}var J=R(require("react"),1);var $=R(require("react"),1);function Ye(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var de=require("react");function lo({load:e,node:t,comparison:r,key:o,single:i=!1,onReady:s=()=>{},onError:p=()=>{},onComputation:f=()=>{}}){let c=new AbortController,a,d=!1,h=()=>{let y=a;a=void 0,y?.dispose()};return{done:Promise.resolve().then(()=>(c.signal.throwIfAborted(),e(c.signal))).then(y=>{d||(a=y.createDiff(t,{single:i,onComputation:C=>{d||f(C)}}),a.setContent(r,o),d||s(a))}).catch(y=>{try{h()}finally{d||p(y)}}),dispose(){d||(d=!0,c.abort(),h())}}}async function Qe(e,{signal:t,fetcher:r=fetch,importer:o=i=>import(i)}={}){let i=await r(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!i.ok)throw new Error("Editor resource HTTP "+i.status+" ("+e+"). "+(i.status===401?"Refresh the authenticated DSH page.":i.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let s=i.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(s))throw new Error("Editor resource returned "+(s||"no Content-Type")+" instead of JavaScript.");return await i.arrayBuffer(),t?.throwIfAborted(),o(e)}var Xe="0.3.77";function co({comparison:e,identity:t,enabled:r,single:o,line:i,sideBySide:s,ignoreWhitespace:p,wrap:f}){let c=(0,de.useRef)(null),a=(0,de.useRef)(null),[d,h]=(0,de.useState)(!1),[k,y]=(0,de.useState)(""),[C,u]=(0,de.useState)("pending");return(0,de.useEffect)(()=>{if(h(!1),u("pending"),y(""),!r)return;let x=g=>new URL("vcs-assets/"+g,document.baseURI).href,b=document.createElement("link");b.rel="stylesheet",b.href=x("editor.css"),document.head.appendChild(b);let v=lo({node:c.current,comparison:e,key:t,single:o,load:g=>Qe(x("editor.js")+"?v="+encodeURIComponent(Xe)+"&retry=0",{signal:g}),onReady:g=>{a.current=g,h(!0)},onError:g=>y(g.message),onComputation:u});return()=>{a.current=null;try{v.dispose()}finally{b.remove()}}},[r,e,t,o]),(0,de.useEffect)(()=>{d&&o&&i&&a.current?.revealLine(i)},[d,o,i]),(0,de.useEffect)(()=>{d&&a.current?.options({sideBySide:s,ignoreWhitespace:p,wrap:f})},[d,s,p,f]),{node:c,viewer:a,ready:d,error:k,computation:C}}function pe({comparison:e,identity:t,t:r,single:o=!1,line:i=null}){let[s,p]=(0,$.useState)(!0),[f,c]=(0,$.useState)(!1),[a,d]=(0,$.useState)(!1),[h,k]=(0,$.useState)(!0),{node:y,viewer:C,ready:u,error:x,computation:b}=co({comparison:e,identity:t,enabled:h,single:o,line:i,sideBySide:s,ignoreWhitespace:f,wrap:a});return $.default.createElement("div",null,$.default.createElement("button",{"aria-pressed":h,onClick:()=>k(v=>!v)},r(h?"historyBasic":"historyAdvanced")),u&&!o&&$.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},$.default.createElement("button",{"aria-pressed":s,onClick:()=>p(v=>!v)},r(s?"side":"inline")),$.default.createElement("label",null,$.default.createElement("input",{type:"checkbox",checked:f,onChange:v=>c(v.target.checked)}),r("whitespace")),$.default.createElement("label",null,$.default.createElement("input",{type:"checkbox",checked:a,onChange:v=>d(v.target.checked)}),r("wrap")),$.default.createElement("button",{onClick:()=>C.current?.navigate("previous")},r("previous")),$.default.createElement("button",{onClick:()=>C.current?.navigate("next")},r("next"))),h&&!u&&!x&&$.default.createElement("p",{role:"status"},r("loading")),e.large&&!o&&u&&$.default.createElement("p",{role:"status"},r(b==="complete"?"diffComplete":b==="incomplete"?"diffIncomplete":"diffPending")),e.large&&!u&&$.default.createElement("p",{role:"status"},r("largeFallback")),x&&$.default.createElement("p",{role:"status"},r("fallback")," ",x),$.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},$.default.createElement("div",{ref:y,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&$.default.createElement(Te,{comparison:e,labels:Ye(r)})))}function vt({sessionId:e,repositoryId:t,mode:r,id:o,rpc:i,t:s,onRediscover:p}){let[f,c]=(0,J.useState)(null),[a,d]=(0,J.useState)(""),[h,k]=(0,J.useState)(0),[y,C]=(0,J.useState)(1),[u,x]=(0,J.useState)(3);(0,J.useEffect)(()=>{let w=new AbortController;return c(null),d(""),i("vcs/conflict-stages",{sessionId:e,repositoryId:t,mode:r,id:o},w.signal).then(T=>{w.signal.aborted||c(T)}).catch(T=>{w.signal.aborted||(d(T.message),T.code==="vcs/rediscover-required"&&p())}),()=>w.abort()},[e,t,r,o,h]);let b={1:s("conflictStage1"),2:s("conflictStage2"),3:s("conflictStage3")},v=s("conflictStageMissing"),g=b[y],m=b[u],S=(0,J.useMemo)(()=>{if(!f)return null;let w=E=>f.stages.find(Z=>Z.stage===E),T=E=>{let Z=w(E);return!Z||!Z.present?{text:"",label:b[E]}:{text:Z.text,label:b[E],...Z.binary?{binary:!0}:{},...Z.encoding?{encoding:Z.encoding}:{},...Z.notice?{notice:Z.notice}:{}}},ue=T(y),M=T(u),ne=[ue.notice,M.notice].filter(Boolean);return w(y)?.present&&w(u)?.present||ne.push(v),{path:f.path,left:ue,right:M,binary:!!(ue.binary||M.binary),...ne.length?{notice:[...new Set(ne)].join(" \xB7 ")}:{}}},[f,y,u,g,m,v]);if(a)return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",{role:"alert"},a," ",J.default.createElement("button",{onClick:()=>k(w=>w+1)},s("retry"))));if(!f||!S)return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",{role:"status"},s("loading")));let H=w=>f.stages.find(T=>T.stage===w),_=S.binary&&!S.left.text&&!S.right.text;return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",null,s("conflictStagesScope")),J.default.createElement("ul",null,[1,2,3].map(w=>J.default.createElement("li",{key:w},J.default.createElement("code",null,b[w])," \xB7 ",H(w)?.present?s("conflictStagePresent"):s("conflictStageAbsent"),H(w)?.kind==="gitlink"&&" \xB7 "+s("conflictStageGitlink"),H(w)?.kind==="symlink"&&" \xB7 "+s("conflictStageSymlink"),H(w)?.present&&H(w)?.notice&&" \xB7 "+H(w).notice))),J.default.createElement("label",null,s("conflictStageLeft")," ",J.default.createElement("select",{"aria-label":s("conflictStageLeft"),value:y,onChange:w=>C(Number(w.target.value))},[1,2,3].map(w=>J.default.createElement("option",{key:w,value:w},b[w])))),J.default.createElement("label",null,s("conflictStageRight")," ",J.default.createElement("select",{"aria-label":s("conflictStageRight"),value:u,onChange:w=>x(Number(w.target.value))},[1,2,3].map(w=>J.default.createElement("option",{key:w,value:w},b[w])))),S.notice&&J.default.createElement("p",{role:"status"},S.notice),_?J.default.createElement("p",{role:"status"},s("binary")):J.default.createElement(pe,{key:JSON.stringify([o,y,u,f.snapshot]),comparison:S,identity:JSON.stringify([e,t,r,o,y,u,f.snapshot]),t:s}))}var K=R(require("react"),1);function bt(e){return K.default.createElement(ur,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function ur({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,K.useState)(!1),[f,c]=(0,K.useState)(null),[a,d]=(0,K.useState)(""),[h,k]=(0,K.useState)(0);return(0,K.useEffect)(()=>{if(!s)return;let y=new AbortController;return c(null),d(""),r("vcs/svn-identity",{sessionId:e,repositoryId:t},y.signal).then(C=>{y.signal.aborted||c(C)}).catch(C=>{y.signal.aborted||(d(C.message),C.code==="vcs/rediscover-required"&&i())}),()=>y.abort()},[s,e,t,h]),K.default.createElement("section",null,K.default.createElement("button",{"aria-expanded":s,onClick:()=>p(y=>!y)},o("svnIdentity")),s&&K.default.createElement(K.default.Fragment,null,K.default.createElement("p",null,o("svnOfflineIdentity")),a?K.default.createElement("p",{role:"alert"},a," ",K.default.createElement("button",{onClick:()=>k(y=>y+1)},o("retry"))):f?K.default.createElement(K.default.Fragment,null,K.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(y=>K.default.createElement(K.default.Fragment,{key:y},K.default.createElement("dt",null,y),K.default.createElement("dd",null,K.default.createElement("code",null,f[y]))))),K.default.createElement("p",{role:"status"},o("svnRemoteDisabled"))):K.default.createElement("p",{role:"status"},o("loading"))))}function $e(e,t,{now:r=Date.now,schedule:o=setTimeout,cancel:i=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=r()||e-r()>3e5)throw Error("Invalid SVN consent expiry");let s=!0,p=o(()=>{s&&(s=!1,t())},e-r());return()=>{s&&(s=!1,i(p))}}function po(e,t=Date.now()){if(!e||typeof e.token!="string"||!/^[a-f0-9]{64}$/.test(e.token)||typeof e.snapshot!="string"||!/^(0|[1-9][0-9]*)$/.test(e.snapshot)||BigInt(e.snapshot)>9223372036854775807n||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t||e.expiresAt-t>3e5)throw Error("Invalid SVN consent response");return e}var ee=R(require("react"),1);var q=R(require("react"),1);function xt(e){return q.default.createElement(fr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function fr({sessionId:e,repositoryId:t,rpc:r,t:o,onApproved:i,onRediscover:s}){let[p,f]=(0,q.useState)(!1),[c,a]=(0,q.useState)(null),[d,h]=(0,q.useState)(!1),[k,y]=(0,q.useState)(""),[C,u]=(0,q.useState)(!1),[x,b]=(0,q.useState)(0);(0,q.useEffect)(()=>{if(!p)return;let m=new AbortController;return a(null),h(!1),y(""),u(!0),r("vcs/svn-describe",{sessionId:e,repositoryId:t},m.signal).then(S=>{m.signal.aborted||a(S)}).catch(S=>{m.signal.aborted||(y(S.message),S.code==="vcs/rediscover-required"&&s())}).finally(()=>{m.signal.aborted||u(!1)}),()=>m.abort()},[p,e,t,x]);let[v,g]=(0,q.useState)(0);return(0,q.useEffect)(()=>{if(!p||!c||c.expiresAt===void 0)return;let m=()=>{a(null),h(!1),g(0),u(!1),y(o("svnOfferExpired"))};try{return $e(c.expiresAt,m)}catch{m()}},[p,c]),(0,q.useEffect)(()=>{if(!v||!p||!c)return;let m=new AbortController;return u(!0),y(""),r("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:c.offer,explicit:!0},m.signal).then(S=>{m.signal.aborted||i(S)}).catch(S=>{m.signal.aborted||(y(S.message),h(!1),S.code==="vcs/rediscover-required"&&s())}).finally(()=>{m.signal.aborted||u(!1)}),()=>m.abort()},[v,p,c]),q.default.createElement("section",null,q.default.createElement("button",{"aria-expanded":p,onClick:()=>{g(0),f(m=>!m)}},o("svnConsentReview")),p&&q.default.createElement(q.default.Fragment,null,q.default.createElement("p",null,o("svnConsentScope")),k&&q.default.createElement("p",{role:"alert"},k," ",q.default.createElement("button",{disabled:C,onClick:()=>{g(0),b(m=>m+1)}},o("retry"))),c&&q.default.createElement(q.default.Fragment,null,q.default.createElement("dl",null,["origin","root","uuid","scope"].map(m=>q.default.createElement(q.default.Fragment,{key:m},q.default.createElement("dt",null,m),q.default.createElement("dd",null,q.default.createElement("code",null,c[m]))))),c.remoteEnabled?q.default.createElement(q.default.Fragment,null,q.default.createElement("label",null,q.default.createElement("input",{type:"checkbox",checked:d,disabled:C,onChange:m=>h(m.target.checked)}),o("svnConsentExplicit")),q.default.createElement("button",{disabled:C||!d,onClick:()=>g(m=>m+1)},o("svnConsentApprove"))):q.default.createElement("p",{role:"status"},o("svnRemoteDisabled"))),C&&q.default.createElement("p",{role:"status"},o("loading"))))}var A=R(require("react"),1);function wt(e){return A.default.createElement(mr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function mr({sessionId:e,repositoryId:t,token:r,snapshot:o,rpc:i,t:s,onRediscover:p}){let[f,c]=(0,A.useState)(o),[a,d]=(0,A.useState)(null),[h,k]=(0,A.useState)(null),[y,C]=(0,A.useState)(""),[u,x]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let b=new AbortController;return d(null),k(null),C(""),i("vcs/svn-log",{sessionId:e,repositoryId:t,token:r,snapshot:o,cursor:f,limit:50},b.signal).then(v=>{b.signal.aborted||d(v)}).catch(v=>{b.signal.aborted||(C(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[f,u]),A.default.createElement("section",null,A.default.createElement("p",null,s("svnHistoryScope")," \xB7 r",o),y?A.default.createElement("p",{role:"alert"},y," ",A.default.createElement("button",{onClick:()=>x(b=>b+1)},s("retry"))):a?A.default.createElement(A.default.Fragment,null,A.default.createElement("ol",null,a.entries.map(b=>A.default.createElement("li",{key:b.revision},A.default.createElement("button",{onClick:()=>k(b.revision)},"r",b.revision," \xB7 ",b.message)))),a.nextRevision!==null&&A.default.createElement("button",{onClick:()=>c(a.nextRevision)},s("historyMore"))):A.default.createElement("p",{role:"status"},s("loading")),h&&A.default.createElement(hr,{key:h,sessionId:e,repositoryId:t,token:r,snapshot:o,rpc:i,t:s,onRediscover:p,revision:h}))}function hr({sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f}){let[c,a]=(0,A.useState)(null),[d,h]=(0,A.useState)(null),[k,y]=(0,A.useState)(""),[C,u]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let x=new AbortController;return a(null),h(null),y(""),s("vcs/svn-detail",{sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i},x.signal).then(b=>{x.signal.aborted||a(b)}).catch(b=>{x.signal.aborted||(y(b.message),b.code==="vcs/rediscover-required"&&f())}),()=>x.abort()},[C]),A.default.createElement("section",null,k?A.default.createElement("p",{role:"alert"},k," ",A.default.createElement("button",{onClick:()=>u(x=>x+1)},p("retry"))):c?A.default.createElement(A.default.Fragment,null,A.default.createElement("p",null,c.message),c.changes.map(x=>A.default.createElement("div",{key:x.id},A.default.createElement("span",null,x.action," ",x.path),x.kind==="file"&&A.default.createElement(A.default.Fragment,null,A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"compare"})},p("svnHistoricalDiff")),A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"trace"})},p("fileHistory")),x.copyFromPath&&x.copyFromRevision&&A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"copytrace"})},p("svnCopyHistory")," \xB7 ",x.copyFromPath," @r",x.copyFromRevision),x.copySourceOutsideScope&&A.default.createElement("span",null,p("svnCopyOutside")))))):A.default.createElement("p",{role:"status"},p("loading")),d&&A.default.createElement(gr,{key:JSON.stringify(d),sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f,...d}))}function gr({sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f,id:c,mode:a}){let[d,h]=(0,A.useState)(null),[k,y]=(0,A.useState)(null),[C,u]=(0,A.useState)(""),[x,b]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let v=new AbortController;return h(null),u(""),s("vcs/svn-"+a,{sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,id:c,...k===null?{}:{cursor:k}},v.signal).then(g=>{v.signal.aborted||h(g)}).catch(g=>{v.signal.aborted||(u(g.message),g.code==="vcs/rediscover-required"&&f())}),()=>v.abort()},[k,x]),C?A.default.createElement("p",{role:"alert"},C," ",A.default.createElement("button",{onClick:()=>b(v=>v+1)},p("retry"))):d?a==="compare"?d.binary?A.default.createElement("p",null,p("binary")):A.default.createElement(pe,{comparison:d,identity:JSON.stringify([e,t,o,i,c]),t:p}):A.default.createElement("section",null,A.default.createElement("p",null,p(a==="copytrace"?"svnCopyTraceScope":"svnTraceScope")," \xB7 ",d.path," \xB7 peg r",d.pegRevision),A.default.createElement("ol",null,d.entries.map(v=>A.default.createElement("li",{key:v.revision},"r",v.revision," \xB7 ",v.message))),d.nextRevision!==null&&A.default.createElement("button",{onClick:()=>y(d.nextRevision)},p("historyMore"))):A.default.createElement("p",{role:"status"},p("loading"))}function St(e){return ee.default.createElement(yr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function yr({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,ee.useState)(null),[f,c]=(0,ee.useState)(!1),[a,d]=(0,ee.useState)(""),[h,k]=(0,ee.useState)(0);(0,ee.useEffect)(()=>{if(s)return()=>{Promise.resolve().then(()=>r("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:s.token})).catch(()=>{})}},[s,e,t]),(0,ee.useEffect)(()=>{if(s)try{return $e(s.expiresAt,()=>{p(null),k(0),c(!1),d(o("svnExpired"))})}catch{p(null),d(o("svnExpired"))}},[s]),(0,ee.useEffect)(()=>{if(!h||!s)return;let u=new AbortController;return c(!0),d(""),r("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:s.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(x=>{u.signal.aborted||(d(x.message),x.code==="vcs/rediscover-required"&&i())}).finally(()=>{u.signal.aborted||c(!1)}),()=>u.abort()},[h,s]);let y=u=>{try{po(u),d(""),k(0),p(u)}catch(x){d(x.message)}},C=async(...u)=>{try{return await r(...u)}catch(x){throw x.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),k(0),d(o("svnExpired"))),x}};return ee.default.createElement("section",null,!s&&a&&ee.default.createElement("p",{role:"status"},a),s?ee.default.createElement(ee.default.Fragment,null,ee.default.createElement("p",null,o("svnGrantScope")),ee.default.createElement("button",{disabled:f,onClick:()=>k(u=>u+1)},o("svnRevoke")),a&&ee.default.createElement("p",{role:"alert"},a),!f&&ee.default.createElement(wt,{sessionId:e,repositoryId:t,t:o,onRediscover:i,rpc:C,token:s.token,snapshot:s.snapshot})):ee.default.createElement(xt,{sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i,onApproved:y}))}var N=R(require("react"),1);function uo(e){let t=new Map;for(let r of e){let o=t.get(r.commit);o||(o={names:[],hidden:0},t.set(r.commit,o)),o.names.length<3?o.names.push(r.name):o.hidden++}return t}var G=R(require("react"),1);var F=R(require("react"),1);var W=R(require("react"),1);var I=R(require("react"),1);function kt(e){return I.default.createElement(vr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function vr({sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p}){let[f,c]=(0,I.useState)(!1),[a,d]=(0,I.useState)([0]),[h,k]=(0,I.useState)(null),[y,C]=(0,I.useState)(""),[u,x]=(0,I.useState)(0),b=a.at(-1);(0,I.useEffect)(()=>{if(!f)return;let g=new AbortController;return k(null),C(""),i("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:r,path:o,offset:b},g.signal).then(m=>{g.signal.aborted||k(m)}).catch(m=>{g.signal.aborted||(C(m.message),m.code==="vcs/rediscover-required"&&p())}),()=>g.abort()},[f,b,e,t,r,o,u]);let v=(0,I.useMemo)(()=>h?{path:o,left:{label:r,text:h.text},right:{label:r,text:h.text}}:null,[h,o,r]);return I.default.createElement("section",null,I.default.createElement("button",{"aria-expanded":f,onClick:()=>c(g=>!g)},s("segments")),f&&I.default.createElement(I.default.Fragment,null,I.default.createElement("p",null,s("segmentScope")),y?I.default.createElement("p",{role:"alert"},y," ",I.default.createElement("button",{onClick:()=>x(g=>g+1)},s("retry"))):h?I.default.createElement(I.default.Fragment,null,I.default.createElement("p",null,s("segmentBytes"),": ",h.offset,"\u2013",h.endOffset," / ",h.totalBytes," \xB7 ",I.default.createElement("code",null,h.oid)),I.default.createElement("button",{disabled:a.length===1,onClick:()=>d(g=>g.slice(0,-1))},s("previous")),I.default.createElement("button",{disabled:h.nextOffset===null,onClick:()=>d(g=>[...g,h.nextOffset])},s("next")),I.default.createElement(pe,{single:!0,comparison:v,identity:JSON.stringify([e,t,r,o,b]),t:s})):I.default.createElement("p",{role:"status"},s("loading"))))}var D=R(require("react"),1);function br({sessionId:e,repositoryId:t,commit:r,path:o,follow:i,rpc:s,t:p,onRediscover:f,onSelectCommit:c}){let[a,d]=(0,D.useState)({commits:[],nextOffset:null}),[h,k]=(0,D.useState)(0),[y,C]=(0,D.useState)(0),[u,x]=(0,D.useState)(!0),[b,v]=(0,D.useState)("");(0,D.useEffect)(()=>{let m=new AbortController;return x(!0),v(""),s("vcs/tree-history",{sessionId:e,repositoryId:t,commit:r,path:o,offset:h,limit:50,follow:i},m.signal).then(S=>{m.signal.aborted||d(H=>({...S,commits:h?[...H.commits,...S.commits]:S.commits}))}).catch(S=>{m.signal.aborted||(v(S.message),S.code==="vcs/rediscover-required"&&f())}).finally(()=>{m.signal.aborted||x(!1)}),()=>m.abort()},[e,t,r,o,h,y,i]);let g=m=>p(m.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":m.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":m.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary");return D.default.createElement("section",{"aria-label":p("pathHistory"),"aria-busy":u},D.default.createElement("p",null,p("pathHistoryScope")),D.default.createElement("p",{style:{overflowWrap:"anywhere"}},D.default.createElement("code",null,a.path||o)," \xB7 ",D.default.createElement("code",null,r),a.followsRenames!==void 0&&D.default.createElement(D.default.Fragment,null," \xB7 ",p(a.followsRenames?"fileHistoryFollow":"pathHistoryNoFollow"))),D.default.createElement("ol",null,a.commits.map(m=>D.default.createElement("li",{key:m.id},D.default.createElement("code",{title:m.id},m.id.slice(0,10))," \xB7 ",c?D.default.createElement("button",{onClick:()=>c(m.id,m.path||o)},m.subject):m.subject,D.default.createElement("div",null,m.boundary&&D.default.createElement("span",null,g(m)," "),m.path&&D.default.createElement("code",null,m.oldPath?m.oldPath+" \u2192 ":"",m.path)," ",m.similarity!==void 0&&D.default.createElement("span",null,p("fileHistorySimilarity"),": ",m.similarity,"% \xB7 "),m.author," \xB7 ",D.default.createElement("time",{dateTime:m.date},m.date))))),u&&D.default.createElement("p",{role:"status"},p("loading")),b&&D.default.createElement("p",{role:"alert"},b," ",D.default.createElement("button",{onClick:()=>C(m=>m+1)},p("retry"))),!u&&!b&&!a.commits.length&&D.default.createElement("p",null,p("historyEmpty")),a.truncated&&D.default.createElement("p",{role:"status"},p("historyLimit")),!b&&a.nextOffset!==null&&D.default.createElement("button",{disabled:u,onClick:()=>k(a.nextOffset)},p("historyMore")))}function Ct(e){let[t,r]=(0,D.useState)(!1),[o,i]=(0,D.useState)(!1);return D.default.createElement("div",null,D.default.createElement("button",{"aria-expanded":t,onClick:()=>r(s=>!s)},e.t("pathHistory")),t&&D.default.createElement(D.default.Fragment,null,D.default.createElement("label",null,D.default.createElement("input",{type:"checkbox",checked:o,onChange:s=>i(s.target.checked)}),e.t("fileHistoryFollow")),D.default.createElement("p",null,e.t("pathHistoryFollowScope")),D.default.createElement(br,{key:String(o),follow:o,...e})))}function qe({sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p,onClose:f,onSelectCommit:c,line:a=null}){let[d,h]=(0,W.useState)(null),[k,y]=(0,W.useState)(""),[C,u]=(0,W.useState)(0);(0,W.useEffect)(()=>{let b=new AbortController;return h(null),y(""),i("vcs/tree-file",{sessionId:e,repositoryId:t,commit:r,path:o},b.signal).then(v=>{b.signal.aborted||h(v)}).catch(v=>{b.signal.aborted||(y(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[e,t,r,o,C]);let x=(0,W.useMemo)(()=>d?{path:o,left:{label:r,text:d.text||""},right:{label:r,text:d.text||""}}:null,[d,o,r]);return W.default.createElement("section",{"aria-label":s("treePreview")},W.default.createElement("h4",null,o),W.default.createElement("button",{onClick:f},s("treeClose")),W.default.createElement("p",null,W.default.createElement("code",null,r)),k?W.default.createElement("p",{role:"alert"},k," ",W.default.createElement("button",{onClick:()=>u(b=>b+1)},s("retry"))):d?W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,W.default.createElement("code",null,d.oid)," \xB7 ",s("encoding"),": ",d.encoding||"\u2014"),a&&W.default.createElement("p",{role:"status"},s("blameOriginLine"),": ",a,!d.text||a>d.text.split(`
96
- `).length?" \xB7 "+s("blameUnmapped"):""),d.notice&&W.default.createElement("p",{role:"status"},d.notice),d.binary?W.default.createElement("p",null,s("binary")):d.text===""?W.default.createElement("p",null,s("treeEmpty")):W.default.createElement(pe,{single:!0,line:a,comparison:x,identity:JSON.stringify([e,t,r,o]),t:s})):W.default.createElement("p",{role:"status"},s("loading")),W.default.createElement(kt,{sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p}),W.default.createElement(Ct,{key:JSON.stringify([e,t,r,o]),sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p,onSelectCommit:c}))}function fo(e=""){let t=[{path:"",name:"/"}];if(e){let r="";for(let o of e.split("/"))r=r?r+"/"+o:o,t.push({path:r,name:o})}return t}function mo(e,t="",r=""){let o=t?t+"/":"",i=r.toLowerCase();return e.filter(s=>{let p=s.path.slice(o.length);return s.path.startsWith(o)&&p.length>0&&!p.includes("/")&&p.toLowerCase().includes(i)}).sort((s,p)=>+(p.type==="tree")-+(s.type==="tree")||(s.path<p.path?-1:s.path>p.path?1:0))}function xr({sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p}){let[f,c]=(0,F.useState)(null),[a,d]=(0,F.useState)(""),[h,k]=(0,F.useState)(0),[y,C]=(0,F.useState)(""),[u,x]=(0,F.useState)(0),[b,v]=(0,F.useState)(""),[g,m]=(0,F.useState)(null);if((0,F.useEffect)(()=>{let w=new AbortController;return c(null),d(""),o("vcs/tree",{sessionId:e,repositoryId:t,commit:r},w.signal).then(T=>{w.signal.aborted||c(T)}).catch(T=>{w.signal.aborted||(d(T.message),T.code==="vcs/rediscover-required"&&s())}),()=>w.abort()},[e,t,r,h]),a)return F.default.createElement("p",{role:"alert"},a," ",F.default.createElement("button",{onClick:()=>k(w=>w+1)},i("retry")));if(!f)return F.default.createElement("p",{role:"status"},i("loading"));let S=y?y+"/":"",H=mo(f.entries,y,b),_=w=>{C(w),x(0),v(""),m(null)};return F.default.createElement("section",{"aria-label":i("historicalTree")},F.default.createElement("p",null,i("historicalTreeScope")),F.default.createElement("code",null,r),F.default.createElement("p",null,y||"/"," ",y&&F.default.createElement("button",{onClick:()=>_(y.includes("/")?y.slice(0,y.lastIndexOf("/")):"")},i("treeUp"))),F.default.createElement("nav",{"aria-label":i("treeBreadcrumbs")},fo(y).map(w=>F.default.createElement(F.default.Fragment,{key:w.path},w.path&&" / ",w.path===y?F.default.createElement("span",{"aria-current":"location"},w.name):F.default.createElement("button",{onClick:()=>_(w.path)},w.name)))),F.default.createElement("label",null,i("treeSearch")," ",F.default.createElement("input",{"aria-label":i("treeSearch"),value:b,onChange:w=>{v(w.target.value),x(0),m(null)}})),F.default.createElement("p",null,H.length," ",i("treeEntries")),!H.length&&b&&F.default.createElement("p",{role:"status"},i("emptySearch")),F.default.createElement("ul",null,H.slice(u*100,u*100+100).map(w=>F.default.createElement("li",{key:w.path},w.type==="tree"?F.default.createElement("button",{onClick:()=>_(w.path)},w.path.slice(S.length),"/"):w.type==="blob"&&["100644","100755"].includes(w.mode)?F.default.createElement("button",{"aria-pressed":g===w.path,onClick:()=>m(w.path)},w.path.slice(S.length)):F.default.createElement("span",null,w.path.slice(S.length))," \xB7 ",F.default.createElement("code",null,w.mode," ",w.type," ",F.default.createElement("span",{title:w.oid},w.oid.slice(0,10)))))),u>0&&F.default.createElement("button",{onClick:()=>{x(w=>w-1),m(null)}},i("treePrevious")),(u+1)*100<H.length&&F.default.createElement("button",{onClick:()=>{x(w=>w+1),m(null)}},i("treeNext")),g&&F.default.createElement(qe,{key:JSON.stringify([e,t,r,g]),sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p,path:g,onClose:()=>m(null)}))}function Nt(e){return F.default.createElement(wr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function wr(e){let[t,r]=(0,F.useState)(!1);return F.default.createElement("div",null,F.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("historicalTree")),t&&F.default.createElement(xr,{...e}))}var z=R(require("react"),1);var j=R(require("react"),1);function Sr({sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,follow:s,rpc:p,t:f,onRediscover:c,onSelectCommit:a}){let[d,h]=(0,j.useState)({commits:[],nextOffset:null}),[k,y]=(0,j.useState)(0),[C,u]=(0,j.useState)(0),[x,b]=(0,j.useState)(!0),[v,g]=(0,j.useState)("");return(0,j.useEffect)(()=>{let m=new AbortController;return b(!0),g(""),p("vcs/file-history",{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,offset:k,limit:50,follow:s},m.signal).then(S=>{m.signal.aborted||h(H=>({...S,commits:k?[...H.commits,...S.commits]:S.commits}))}).catch(S=>{m.signal.aborted||(g(S.message),S.code==="vcs/rediscover-required"&&c())}).finally(()=>{m.signal.aborted||b(!1)}),()=>m.abort()},[e,t,r,o,i,k,C]),j.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":x},j.default.createElement("p",null,f("fileHistoryScope")),j.default.createElement("p",{style:{overflowWrap:"anywhere"}},d.path," \xB7 ",j.default.createElement("code",null,r)),j.default.createElement("ol",null,d.commits.map(m=>j.default.createElement("li",{key:m.id},j.default.createElement("code",{title:m.id},m.id.slice(0,10))," \xB7 ",a?j.default.createElement("button",{onClick:()=>a(m.id,m.path||d.path)},m.subject):m.subject,j.default.createElement("div",null,m.boundary&&j.default.createElement("span",null,f(m.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":m.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":m.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary")," "),m.path&&j.default.createElement("code",null,m.oldPath?m.oldPath+" \u2192 ":"",m.path)," ",m.similarity!==void 0&&j.default.createElement("span",null,f("fileHistorySimilarity"),": ",m.similarity,"% \xB7 "),m.author," \xB7 ",j.default.createElement("time",{dateTime:m.date},m.date))))),x&&j.default.createElement("p",{role:"status"},f("loading")),v&&j.default.createElement("p",{role:"alert"},v," ",j.default.createElement("button",{onClick:()=>u(m=>m+1)},f("retry"))),!x&&!v&&!d.commits.length&&j.default.createElement("p",null,f("historyEmpty")),d.truncated&&j.default.createElement("p",{role:"status"},f("historyLimit")),!v&&d.nextOffset!==null&&j.default.createElement("button",{disabled:x,onClick:()=>y(d.nextOffset)},f("historyMore")))}function Et(e){return j.default.createElement(kr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.id]),...e})}function kr(e){let[t,r]=(0,j.useState)(!1),[o,i]=(0,j.useState)(!1);return j.default.createElement("div",null,j.default.createElement("button",{"aria-expanded":t,onClick:()=>r(s=>!s)},e.t("fileHistory")),t&&j.default.createElement(j.default.Fragment,null,j.default.createElement("label",null,j.default.createElement("input",{type:"checkbox",checked:o,onChange:s=>i(s.target.checked)}),e.t("fileHistoryFollow")),j.default.createElement("p",null,e.t("fileHistoryFollowScope")),j.default.createElement(Sr,{key:String(o),follow:o,...e})))}var B=R(require("react"),1);function Cr({sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,rpc:s,t:p,onRediscover:f,onSelectCommit:c}){let[a,d]=(0,B.useState)(null),[h,k]=(0,B.useState)(""),[y,C]=(0,B.useState)(0),[u,x]=(0,B.useState)(1),[b,v]=(0,B.useState)(null);return(0,B.useEffect)(()=>{let g=new AbortController;return d(null),k(""),v(null),s("vcs/blame",{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,startLine:u,lineLimit:500},g.signal).then(m=>{g.signal.aborted||d(m)}).catch(m=>{g.signal.aborted||(k(m.message),m.code==="vcs/rediscover-required"&&f())}),()=>g.abort()},[e,t,r,o,i,y,u]),h?B.default.createElement("p",{role:"alert"},h," ",B.default.createElement("button",{onClick:()=>C(g=>g+1)},p("retry"))):a?B.default.createElement("section",{"aria-label":p("blame")},B.default.createElement("p",null,p("blameScope")),c&&B.default.createElement("p",null,p("blameNavigation")),a.notice&&B.default.createElement("p",{role:"status"},a.notice),a.truncated&&B.default.createElement("p",{role:"status"},p("blameLimit")),!a.notice&&!a.lines.length&&B.default.createElement("p",null,p("blameEmpty")),!!a.lines.length&&B.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},B.default.createElement("table",null,B.default.createElement("thead",null,B.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(g=>B.default.createElement("th",{key:g,scope:"col"},p(g))))),B.default.createElement("tbody",null,a.lines.map(g=>B.default.createElement("tr",{key:g.line},B.default.createElement("th",{scope:"row"},g.line),B.default.createElement("td",null,c?B.default.createElement("button",{title:g.commit,onClick:()=>c(g.commit,g.path||null)},B.default.createElement("code",null,g.commit.slice(0,10))):B.default.createElement("code",{title:g.commit},g.commit.slice(0,10))),B.default.createElement("td",null,g.author),B.default.createElement("td",null,g.summary),B.default.createElement("td",null,B.default.createElement("pre",{style:{margin:0}},g.text),g.path&&g.originalLine?B.default.createElement("button",{onClick:()=>v(g)},p("blameOriginLine"),": ",g.path,":",g.originalLine):B.default.createElement("span",null,p("blameUnmapped")))))))),B.default.createElement("p",null,a.startLine||u,"\u2013",a.lines.at(-1)?.line||u," / ",a.totalLines??"\u2014"),B.default.createElement("button",{disabled:u===1,onClick:()=>x(Math.max(1,u-500))},p("blamePrevious")),B.default.createElement("button",{disabled:a.nextLine==null,onClick:()=>x(a.nextLine)},p("blameNext")),b&&B.default.createElement(qe,{key:JSON.stringify([b.commit,b.path,b.originalLine]),sessionId:e,repositoryId:t,rpc:s,t:p,onRediscover:f,onSelectCommit:c,commit:b.commit,path:b.path,line:b.originalLine,onClose:()=>v(null)})):B.default.createElement("p",{role:"status"},p("loading"))}function Lt(e){let[t,r]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("blame")),t&&B.default.createElement(Cr,{...e}))}function Ge(e){return z.default.createElement(Nr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.base,e.target,e.id]),...e})}function Nr({sessionId:e,repositoryId:t,commit:r,parentIndex:o,base:i,target:s,id:p,rpc:f,t:c,onRediscover:a,onSelectCommit:d}){let[h,k]=(0,z.useState)(null),[y,C]=(0,z.useState)(""),[u,x]=(0,z.useState)(0),[b,v]=(0,z.useState)(!1);return(0,z.useEffect)(()=>{let g=new AbortController;return k(null),C(""),f(i?"vcs/revision-compare":"vcs/commit-compare",i?{sessionId:e,repositoryId:t,base:i,target:s,id:p,...b?{large:!0}:{}}:{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,...b?{large:!0}:{}},g.signal).then(m=>{g.signal.aborted||k(m)}).catch(m=>{g.signal.aborted||(C(m.message),m.code==="vcs/rediscover-required"&&a())}),()=>g.abort()},[e,t,r,o,i,s,p,u,b]),y?z.default.createElement("p",{role:"alert"},y," ",z.default.createElement("button",{onClick:()=>x(g=>g+1)},c("retry")),b&&z.default.createElement("button",{onClick:()=>v(!1)},c("largeClose"))):h?z.default.createElement("section",null,z.default.createElement("h4",null,h.path),z.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&z.default.createElement("p",{role:"status"},h.notice),b?z.default.createElement("p",null,c("largeScope")," ",z.default.createElement("button",{onClick:()=>v(!1)},c("largeClose"))):h.notice?.includes("2 MiB")&&z.default.createElement("p",null,c("largeScope")," ",z.default.createElement("button",{onClick:()=>v(!0)},c("largeLoad"))),h.binary?z.default.createElement("p",null,c("binary")):z.default.createElement(pe,{comparison:h,identity:JSON.stringify(i?[e,t,i,s,p]:[e,t,r,o,p]),t:c}),r&&!i&&z.default.createElement(Et,{onSelectCommit:d,key:"file-history:"+JSON.stringify([e,t,r,o,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,rpc:f,t:c,onRediscover:a}),r&&!i&&z.default.createElement(Lt,{onSelectCommit:d,key:"blame:"+JSON.stringify([e,t,r,o,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,rpc:f,t:c,onRediscover:a}),(r||i)&&z.default.createElement(je,{key:"image:"+JSON.stringify([e,t,r,o,i,s,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,base:i,target:s,id:p,rpc:f,t:c,onRediscover:a})):z.default.createElement("p",{role:"status"},c("loading"),b&&z.default.createElement("button",{onClick:()=>v(!1)},c("largeClose")))}function ho(e,t){if(typeof t!="string"||!t)return null;let r=e.filter(o=>o.path===t);return r.length===1&&typeof r[0].id=="string"&&r[0].id?r[0].id:null}function go(e,t=""){let r=t.trim().toLowerCase();return r?e.filter(o=>[o.id,o.author,o.subject].some(i=>i?.toLowerCase().includes(r))):e}function Ze(e,t=""){let r=t.trim().toLowerCase();return r?e.filter(o=>[o.path,o.oldPath].some(i=>i?.toLowerCase().includes(r))):e}function At(e){return G.default.createElement(Er,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function Er({sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p,initialPath:f}){let c=(0,G.useRef)(!0),[a,d]=(0,G.useState)(null),[h,k]=(0,G.useState)(""),[y,C]=(0,G.useState)(0),[u,x]=(0,G.useState)(null),[b,v]=(0,G.useState)(""),[g,m]=(0,G.useState)(0);if((0,G.useEffect)(()=>{let H=new AbortController;return x(null),v(""),o("vcs/commit",{sessionId:e,repositoryId:t,commit:r,parentIndex:y},H.signal).then(_=>{H.signal.aborted||(x(_),c.current&&(c.current=!1,d(ho(_.changes,f))))}).catch(_=>{H.signal.aborted||(v(_.message),_.code==="vcs/rediscover-required"&&s())}),()=>H.abort()},[e,t,r,y,g]),b)return G.default.createElement("p",{role:"alert"},b," ",G.default.createElement("button",{onClick:()=>m(H=>H+1)},i("retry")));if(!u)return G.default.createElement("p",{role:"status"},i("loading"));let S=Ze(u.changes,h);return G.default.createElement("section",{"aria-label":i("commitDetails")},G.default.createElement("h3",null,u.subject),G.default.createElement("code",null,u.id),G.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&G.default.createElement("p",{role:"status"},i("commitMessageLimit")),u.message&&G.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&G.default.createElement("label",null,i("commitParent")," ",G.default.createElement("select",{"aria-label":i("commitParent"),value:y,onChange:H=>{d(null),x(null),C(Number(H.target.value))}},u.parents.map((H,_)=>G.default.createElement("option",{key:H,value:_},_+1,": ",H.slice(0,10))))),G.default.createElement("p",null,u.parent||i("commitRoot")," \u2192 ",u.id.slice(0,10)),G.default.createElement("label",null,i("commitFileSearch")," ",G.default.createElement("input",{"aria-label":i("commitFileSearch"),value:h,onChange:H=>{k(H.target.value),d(null)}})),G.default.createElement("span",null," ",S.length," / ",u.changes.length),G.default.createElement("ul",null,S.map(H=>G.default.createElement("li",{key:H.id},G.default.createElement("button",{"aria-pressed":a===H.id,onClick:()=>d(H.id)},H.status," \xB7 ",H.oldPath?H.oldPath+" \u2192 ":"",H.path)))),!!u.changes.length&&!S.length&&G.default.createElement("p",{role:"status"},i("emptySearch")),!u.changes.length&&G.default.createElement("p",null,i("commitNoChanges")),a&&G.default.createElement(Ge,{key:a,sessionId:e,repositoryId:t,commit:r,parentIndex:y,id:a,onSelectCommit:p,rpc:o,t:i,onRediscover:s}),G.default.createElement(Nt,{key:JSON.stringify([e,t,r]),sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p}))}var X=R(require("react"),1);function yo(e){if(!Array.isArray(e))throw new Error("Invalid graph commits");let t=e.slice(0,200),r=new Map,o=[],i=[],s=f=>typeof f=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(f);for(let[f,c]of t.entries()){if(!c||!s(c.id)||!Array.isArray(c.parents)||r.has(c.id))throw new Error("Invalid graph node");r.set(c.id,f),o.push({id:c.id,row:f})}let p=!1;for(let f of t){let c=new Set;for(let a of f.parents){if(i.length===1e3){p=!0;break}if(!s(a)||a.length!==f.id.length||a===f.id||c.has(a))throw new Error("Invalid graph parent");c.add(a);let d=r.get(a);if(d!==void 0&&d<=r.get(f.id))throw new Error("Graph requires child-before-parent order");i.push({from:f.id,to:a,missing:d===void 0})}if(p)break}return{nodes:o,edges:i,nodesTruncated:e.length>200,edgesTruncated:p}}function vo(e){let t=Array(32).fill(null),r=new Map,o=[],i=new Set,s=!1,p=a=>{if(i.has(a))return null;let d=t.indexOf(a);return d>=0?d:(d=t.indexOf(null),d<0?(s=!0,i.add(a),null):(t[d]=a,d))},f=new Map;for(let a of e.edges){if(a.missing)continue;let d=f.get(a.from)||[];d.push(a.to),f.set(a.from,d)}for(let a of e.nodes){let d=p(a.id);if(r.set(a.id,{...a,lane:d}),o.push({...a,lane:d}),d===null)continue;t[d]=null;let h=f.get(a.id)||[];for(let[k,y]of h.entries())t.includes(y)||(k===0&&t[d]===null?t[d]=y:p(y))}let c=e.edges.filter(a=>!a.missing).flatMap(a=>{let d=r.get(a.from),h=r.get(a.to);return d.lane===null||h.lane===null?[]:[{...a,start:d.row,end:h.row,fromLane:d.lane,toLane:h.lane}]});return{nodes:o,edges:c,lanesTruncated:s,laneCount:Math.max(1,...o.map(a=>(a.lane??0)+1))}}function Lr({commits:e,selected:t,onSelect:r,t:o}){let i;try{i=yo(e)}catch{return X.default.createElement("p",{role:"alert"},o("graphInvalid"))}let s=vo(i),p=s.edges,f=Math.max(100,24+18*s.laneCount),c=Math.max(40,i.nodes.length*36);return X.default.createElement("section",{"aria-label":o("historyGraph")},X.default.createElement("p",null,o("graphScope")),s.lanesTruncated&&X.default.createElement("p",{role:"status"},o("graphLaneLimit")),(i.nodesTruncated||i.edgesTruncated)&&X.default.createElement("p",{role:"status"},o("graphLimit")),X.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},X.default.createElement("svg",{width:f,height:c,"aria-hidden":"true",style:{flexShrink:0}},p.map(a=>{let d=a.start*36+18,h=a.end*36+18,k=12+a.fromLane*18,y=12+a.toLane*18;return X.default.createElement("path",{key:a.from+a.to,d:"M "+k+" "+d+" C "+k+" "+(d+18)+", "+y+" "+(h-18)+", "+y+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),s.nodes.filter(a=>a.lane!==null).map(a=>X.default.createElement("circle",{key:a.id,cx:12+a.lane*18,cy:a.row*36+18,r:"4",fill:"currentColor"}))),X.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},i.nodes.map(a=>X.default.createElement("li",{key:a.id,style:{height:36,whiteSpace:"nowrap"}},X.default.createElement("button",{title:a.id,"aria-current":t===a.id?!0:void 0,style:t===a.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:d=>{if(d.altKey||d.ctrlKey||d.metaKey||d.shiftKey)return;let h=d.key==="ArrowDown"?Math.min(a.row+1,i.nodes.length-1):d.key==="ArrowUp"?Math.max(0,a.row-1):d.key==="Home"?0:d.key==="End"?i.nodes.length-1:null;h!==null&&(d.preventDefault(),d.stopPropagation(),d.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>r(a.id)},X.default.createElement("code",null,a.id.slice(0,10))," ",e[a.row].subject))))),X.default.createElement("details",null,X.default.createElement("summary",null,o("graphRelations")),X.default.createElement("ul",null,i.edges.map(a=>X.default.createElement("li",{key:a.from+a.to},X.default.createElement("code",null,a.from)," \u2192 ",X.default.createElement("code",null,a.to),a.missing?" \xB7 "+o("graphMissing"):"")))))}function Ht(e){let[t,r]=(0,X.useState)(!1);return X.default.createElement("div",null,X.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("historyGraph")),t&&X.default.createElement(Lr,{...e}))}var O=R(require("react"),1);function Ar({sessionId:e,repositoryId:t,base:r,target:o,rpc:i,t:s,onRediscover:p}){let[f,c]=(0,O.useState)(null),[a,d]=(0,O.useState)(""),[h,k]=(0,O.useState)(0),[y,C]=(0,O.useState)(null),[u,x]=(0,O.useState)("");if((0,O.useEffect)(()=>{let v=new AbortController;return c(null),d(""),C(null),i("vcs/revision-changes",{sessionId:e,repositoryId:t,base:r,target:o},v.signal).then(g=>{v.signal.aborted||c(g)}).catch(g=>{v.signal.aborted||(d(g.message),g.code==="vcs/rediscover-required"&&p())}),()=>v.abort()},[e,t,r,o,h]),a)return O.default.createElement("p",{role:"alert"},a," ",O.default.createElement("button",{onClick:()=>k(v=>v+1)},s("retry")));if(!f)return O.default.createElement("p",{role:"status"},s("loading"));let b=Ze(f.changes,u);return O.default.createElement("div",null,O.default.createElement("label",null,s("commitFileSearch")," ",O.default.createElement("input",{"aria-label":s("commitFileSearch"),value:u,onChange:v=>{x(v.target.value),C(null)}})),O.default.createElement("span",null," ",b.length," / ",f.changes.length),!!f.changes.length&&!b.length&&O.default.createElement("p",{role:"status"},s("emptySearch")),!f.changes.length&&O.default.createElement("p",null,s("revisionEmpty")),O.default.createElement("ul",null,b.map(v=>O.default.createElement("li",{key:v.id},O.default.createElement("button",{"aria-pressed":y===v.id,onClick:()=>C(v.id)},v.status," \xB7 ",v.oldPath?v.oldPath+" \u2192 ":"",v.path)))),y&&O.default.createElement(Ge,{key:y,sessionId:e,repositoryId:t,base:r,target:o,id:y,rpc:i,t:s,onRediscover:p}))}function Pt(e){return O.default.createElement(Hr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Hr({commits:e,sessionId:t,repositoryId:r,rpc:o,t:i,onRediscover:s,onReferencesLoaded:p}){let[f,c]=(0,O.useState)(""),[a,d]=(0,O.useState)(""),[h,k]=(0,O.useState)([]),[y,C]=(0,O.useState)(!1),[u,x]=(0,O.useState)(0),[b,v]=(0,O.useState)(!1),[g,m]=(0,O.useState)("");return(0,O.useEffect)(()=>{if(!u)return;let S=new AbortController;return v(!0),m(""),o("vcs/references",{sessionId:t,repositoryId:r},S.signal).then(H=>{S.signal.aborted||(k(H.references),C(!0),p?.(H.references))}).catch(H=>{S.signal.aborted||(m(H.message),H.code==="vcs/rediscover-required"&&s())}).finally(()=>{S.signal.aborted||v(!1)}),()=>S.abort()},[t,r,u]),O.default.createElement("section",{"aria-label":i("revisionTitle")},O.default.createElement("h3",null,i("revisionTitle")),O.default.createElement("p",null,i("revisionScope")),O.default.createElement("button",{disabled:b,onClick:()=>x(S=>S+1)},i("revisionLoadRefs")),O.default.createElement("p",null,i("revisionRefsScope")),y&&!b&&!g&&O.default.createElement("p",{role:"status"},h.length?`${i("revisionRefsCount")}: ${h.length}`:i("revisionRefsEmpty")),b&&O.default.createElement("p",{role:"status"},i("loading")),g&&O.default.createElement("p",{role:"alert"},g),[[f,c,"revisionBase"],[a,d,"revisionTarget"]].map(([S,H,_])=>O.default.createElement("label",{key:_},i(_)," ",O.default.createElement("select",{"aria-label":i(_),value:S,onChange:w=>H(w.target.value)},O.default.createElement("option",{value:""},"\u2014"),!!e.length&&O.default.createElement("optgroup",{label:i("revisionLoadedCommits")},e.map(w=>O.default.createElement("option",{key:w.id,value:w.id},w.id.slice(0,10)," \xB7 ",w.subject))),!!h.length&&O.default.createElement("optgroup",{label:i("revisionLocalRefs")},h.map(w=>O.default.createElement("option",{key:w.name,value:w.commit},w.name," \xB7 ",w.commit.slice(0,10)))),S&&!e.some(w=>w.id===S)&&!h.some(w=>w.commit===S)&&O.default.createElement("option",{value:S},S)))),O.default.createElement("button",{disabled:!f||!a,onClick:()=>{c(a),d(f)}},i("revisionSwap")),O.default.createElement("p",{style:{overflowWrap:"anywhere"}},O.default.createElement("code",null,f||"\u2014")," \u2192 ",O.default.createElement("code",null,a||"\u2014")),f&&a&&O.default.createElement(Ar,{key:JSON.stringify([t,r,f,a]),sessionId:t,repositoryId:r,base:f,target:a,rpc:o,t:i,onRediscover:s}))}function bo(e,t,r){let o=r?[...e.commits.filter(i=>!t.commits.some(s=>s.id===i.id)),...t.commits]:t.commits;return{...t,windowEnd:r+t.commits.length,commits:o.slice(-200)}}function Ot(e){return N.default.createElement(Pr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Pr({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,N.useState)({id:null,path:null,revision:0}),[f,c]=(0,N.useState)(""),[a,d]=(0,N.useState)(null),[h,k]=(0,N.useState)(""),[y,C]=(0,N.useState)(""),u=P=>{let oe=(a||[]).find(re=>JSON.stringify([re.name,re.commit])===P)?.commit||"";C(P),k(oe),g(re=>re?{...re,snapshot:oe||null}:null),ne(0),c(""),w(null),ue({commits:[],snapshot:null,nextOffset:null})},[x,b]=(0,N.useState)({message:"",author:"",path:""}),[v,g]=(0,N.useState)(null),m=P=>{g({values:P,snapshot:T.snapshot}),ne(0),c(""),w(null),ue(Y=>({...Y,commits:[],nextOffset:null}))},S=(0,N.useMemo)(()=>uo(a||[]),[a]),H=s.id,_=(P,Y=null)=>p(oe=>({id:P,path:Y,revision:oe.revision+1})),w=(P,Y=null)=>p(oe=>({id:P,path:Y,revision:oe.revision+(Y||oe.path?1:0)})),[T,ue]=(0,N.useState)({commits:[],snapshot:null,nextOffset:null}),[M,ne]=(0,N.useState)(0),[E,Z]=(0,N.useState)(0),[le,He]=(0,N.useState)(!0),[ke,Pe]=(0,N.useState)("");(0,N.useEffect)(()=>{let P=new AbortController;return He(!0),Pe(""),r("vcs/history",{sessionId:e,repositoryId:t,offset:M,limit:50,...v?{search:v.values}:{},...v?.snapshot||h||M?{snapshot:v?.snapshot||h||T.snapshot}:{}},P.signal).then(Y=>{P.signal.aborted||(ue(oe=>bo(oe,Y,M)),M>=200&&(w(null),c("")))}).catch(Y=>{P.signal.aborted||(Pe(Y.message),Y.code==="vcs/rediscover-required"&&i())}).finally(()=>{P.signal.aborted||He(!1)}),()=>P.abort()},[e,t,M,E,v,h]);let fe=go(T.commits,f);return N.default.createElement("section",{className:"vcs-history","aria-label":o("history"),"aria-busy":le},N.default.createElement("div",{className:"vcs-history-list"},N.default.createElement("p",null,o("historyListOnly")),a!==null&&N.default.createElement("p",null,o("historyRefsScope")),N.default.createElement("label",null,o("historyBranch")," ",N.default.createElement("select",{"aria-label":o("historyBranch"),value:y,disabled:le,onChange:P=>u(P.target.value)},N.default.createElement("option",{value:""},"HEAD"),y&&!(a||[]).some(P=>JSON.stringify([P.name,P.commit])===y)&&N.default.createElement("option",{value:y},JSON.parse(y)[0]," \xB7 ",h.slice(0,10)," \xB7 ",o("historyPinned")),(a||[]).map(P=>{let Y=JSON.stringify([P.name,P.commit]);return N.default.createElement("option",{key:Y,value:Y},P.name," \xB7 ",P.commit.slice(0,10))}))),N.default.createElement("p",null,o("historyBranchScope"),h&&N.default.createElement(N.default.Fragment,null," \xB7 ",N.default.createElement("code",null,h))),N.default.createElement("form",{"aria-label":o("historyServerSearch"),onSubmit:P=>{P.preventDefault(),m({...x})}},N.default.createElement("fieldset",{disabled:le},N.default.createElement("legend",null,o("historyServerSearch")),N.default.createElement("p",null,o("historyServerScope")),["message","author","path"].map(P=>N.default.createElement("label",{key:P},o("historyServer_"+P)," ",N.default.createElement("input",{maxLength:1024,"aria-label":o("historyServer_"+P),value:x[P],onChange:Y=>b(oe=>({...oe,[P]:Y.target.value}))}))),N.default.createElement("button",{type:"submit"},o("historyServerApply")),N.default.createElement("button",{type:"button",onClick:()=>{b({message:"",author:"",path:""}),m({})}},o("historyServerClear")))),v&&N.default.createElement("p",{role:"status"},o("historyServerActive"),": ",JSON.stringify(v.values)," \xB7 ",N.default.createElement("code",null,v.snapshot||T.snapshot)),N.default.createElement("label",null,o("historySearch")," ",N.default.createElement("input",{"aria-label":o("historySearch"),value:f,onChange:P=>{c(P.target.value),w(null)}})),N.default.createElement("span",null," ",fe.length," / ",T.commits.length),!!T.commits.length&&N.default.createElement("p",{role:"status"},o("historyWindow"),": ",Math.max(0,(T.windowEnd??T.commits.length)-T.commits.length),"\u2013",T.windowEnd??T.commits.length," \xB7 ",o("historyWindowScope")),!!T.commits.length&&!fe.length&&N.default.createElement("p",{role:"status"},o("historyNoMatch")),N.default.createElement("ol",null,fe.map(P=>N.default.createElement("li",{key:P.id},N.default.createElement("button",{"aria-pressed":H===P.id,onClick:()=>w(P.id)},P.subject),N.default.createElement("div",null,N.default.createElement("code",{title:P.id},P.id.slice(0,10))," \xB7 ",P.author," \xB7 ",N.default.createElement("time",{dateTime:P.date},P.date)),S.has(P.id)&&N.default.createElement("div",{"aria-label":o("historyRefsLabel"),style:{overflowWrap:"anywhere"}},S.get(P.id).names.map(Y=>N.default.createElement("span",{key:Y},N.default.createElement("code",null,Y)," ")),S.get(P.id).hidden>0&&N.default.createElement("span",null,o("historyRefsMore"),": ",S.get(P.id).hidden))))),le&&N.default.createElement("p",{role:"status"},o("loading")),ke&&N.default.createElement("p",{role:"alert"},ke," ",N.default.createElement("button",{onClick:()=>Z(P=>P+1)},o("retry"))),!le&&!ke&&!T.commits.length&&N.default.createElement("p",null,o("historyEmpty")),T.truncated&&N.default.createElement("p",{role:"status"},o("historyLimit")),!ke&&T.nextOffset!==null&&N.default.createElement("button",{disabled:le,onClick:()=>ne(T.nextOffset)},o("historyMore")),!!T.commits.length&&N.default.createElement(Ht,{commits:T.commits,selected:H,onSelect:w,t:o}),N.default.createElement(Pt,{onReferencesLoaded:d,commits:T.commits,sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i})),N.default.createElement("div",{className:"vcs-history-details"},H&&N.default.createElement(At,{key:JSON.stringify([H,s.revision]),initialPath:s.path,sessionId:e,repositoryId:t,commit:H,onSelectCommit:_,rpc:r,t:o,onRediscover:i})))}var xo={zh:{svnOfferExpired:"\u7F51\u7EDC\u8BBF\u95EE\u63D0\u6848\u5DF2\u8FC7\u671F\uFF1B\u8BF7\u624B\u52A8\u91CD\u8BD5\uFF0C\u5E76\u91CD\u65B0\u52FE\u9009\u540C\u610F\u3002",svnExpired:"SVN \u7F51\u7EDC\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u5386\u53F2\u8BF7\u6C42\u5DF2\u505C\u6B62\uFF1B\u8BF7\u91CD\u65B0\u5BA1\u9605\u5E76\u540C\u610F\u3002",svnConsentReview:"\u5BA1\u9605 SVN \u7F51\u7EDC\u8BBF\u95EE\u8303\u56F4",svnConsentScope:"\u540C\u610F\u524D\u4EC5\u8BFB\u53D6\u672C\u5730\u8EAB\u4EFD\u3002\u6388\u6743\u53EA\u9002\u7528\u4E8E\u6240\u5217\u4ED3\u5E93\u3001Session \u4E0E\u76EE\u5F55\uFF0C\u4E94\u5206\u949F\u6709\u6548\uFF1B\u4E0D\u6388\u6743\u91CD\u5B9A\u5411\u6216\u5199\u64CD\u4F5C\u3002",svnConsentExplicit:"\u6211\u540C\u610F\u8BBF\u95EE\u4EE5\u4E0A HTTPS SVN \u4ED3\u5E93",svnConsentApprove:"\u540C\u610F\u5E76\u8BFB\u53D6\u5386\u53F2",svnHistoryScope:"\u56FA\u5B9A\u672C\u5730 revision \u5FEB\u7167\u7684 SVN \u5386\u53F2\uFF1B\u5206\u9875\u66FF\u6362\u663E\u793A",svnHistoricalDiff:"\u5386\u53F2\u53EA\u8BFB Diff",svnCopyHistory:"\u67E5\u770B\u590D\u5236\u6765\u6E90\u5386\u53F2",svnCopyOutside:"\u590D\u5236\u6765\u6E90\u5728\u6388\u6743\u8303\u56F4\u5916\uFF0C\u4E0D\u80FD\u6253\u5F00",svnCopyTraceScope:"\u5355\u72EC\u67E5\u770B\u8303\u56F4\u5185\u56FA\u5B9A\u6765\u6E90\uFF0C\u4ECD\u6B62\u4E8E\u5176\u590D\u5236\u8FB9\u754C\uFF1B\u4E0D\u662F\u81EA\u52A8\u8FFD\u6EAF",svnTraceScope:"\u6587\u4EF6\u8FFD\u6EAF\u5728\u590D\u5236\u8FB9\u754C\u505C\u6B62\uFF0C\u4E0D\u8DDF\u968F\u8303\u56F4\u5916\u6765\u6E90",svnGrantScope:"\u7F51\u7EDC\u6388\u6743\u4E94\u5206\u949F\u6709\u6548\uFF1B\u53EF\u968F\u65F6\u64A4\u9500\uFF0C\u5386\u53F2\u64CD\u4F5C\u4E0D\u4FEE\u6539\u5DE5\u4F5C\u526F\u672C\u3002",svnRevoke:"\u64A4\u9500 SVN \u7F51\u7EDC\u6388\u6743",svnIdentity:"\u67E5\u770B SVN \u672C\u5730\u5386\u53F2\u8BBF\u95EE\u8EAB\u4EFD",svnOfflineIdentity:"\u4EC5\u4ECE\u6388\u6743\u5DE5\u4F5C\u526F\u672C\u8BFB\u53D6\u672C\u5730\u5143\u6570\u636E\uFF0C\u4E0D\u53D1\u8D77\u8FDC\u7A0B\u8BF7\u6C42\u3002",svnRemoteDisabled:"\u8FDC\u7A0B SVN \u5386\u53F2\u4F20\u8F93\u5C1A\u672A\u542F\u7528\uFF1B\u6CA1\u6709\u7F51\u7EDC\u6388\u6743\u6216\u53EF\u7528\u8BBF\u95EE\u51ED\u636E\u3002\u672C\u9875\u4E0D\u662F\u5DF2\u6388\u6743\u5386\u53F2\u5165\u53E3\u3002",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",fileHistorySimilarity:"Git\u76F8\u4F3C\u5EA6",fileHistoryAmbiguous:"\u591A\u4E2A\u5019\u9009\u6765\u6E90\uFF0C\u6B64\u5904\u505C\u6B62\u8FFD\u6EAF",fileHistoryRenameLimit:"\u5DF2\u8FBE32\u6B21\u91CD\u547D\u540D\u786E\u8BA4\u4E0A\u9650\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u8DDF\u968FGit\u68C0\u51FA\u7684\u91CD\u547D\u540D\uFF1B50%\u4EE5\u4E0A\u76F8\u4F3C\u91CD\u547D\u540D\u989D\u5916\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u548C\u5408\u5E76\u5904\u505C\u6B62\u3002\u76F8\u4F3C\u5EA6\u4E0D\u662F\u8EAB\u4EFD\u4FDD\u8BC1\uFF1B\u6BCF\u6761\u8BB0\u5F55\u4F7F\u7528\u5F53\u65F6\u8DEF\u5F84\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",conflictStages:"Index \u51B2\u7A81\u9636\u6BB5",conflictStagesScope:"\u624B\u52A8\u8BFB\u53D6\u6240\u9009\u51B2\u7A81\u7684 Index \u9636\u6BB51\uFF0F2\uFF0F3\uFF1B\u9636\u6BB5\u7F16\u53F7\u53EA\u8868\u793A Index \u8EAB\u4EFD\uFF0C\u4E0D\u58F0\u79F0\u5408\u5E76\uFF0F\u53D8\u57FA\u5F52\u5C5E\u3002\u7F3A\u5931\u9636\u6BB5\u663E\u793A\u4E3A\u7A7A\uFF0C\u4E0D\u63A8\u65AD\u5185\u5BB9\uFF1B\u4E0D\u8BFB\u53D6\u5DE5\u4F5C\u6587\u4EF6\uFF0C\u4E0D\u89E3\u51B3\u51B2\u7A81\u3002",conflictStage1:"\u9636\u6BB51\uFF08BASE\uFF09",conflictStage2:"\u9636\u6BB52\uFF08ours\uFF09",conflictStage3:"\u9636\u6BB53\uFF08theirs\uFF09",conflictStagePresent:"\u5B58\u5728",conflictStageAbsent:"\u7F3A\u5931\uFF08\u663E\u793A\u4E3A\u7A7A\uFF09",conflictStageGitlink:"\u5B50\u6A21\u5757\u63D0\u4EA4\u5F15\u7528\uFF0C\u4E0D\u52A0\u8F7D\u5185\u5BB9",conflictStageSymlink:"\u94FE\u63A5\u76EE\u6807\u6587\u672C\uFF0C\u4E0D\u8DDF\u968F",conflictStageLeft:"\u5DE6\u4FA7\u9636\u6BB5",conflictStageRight:"\u53F3\u4FA7\u9636\u6BB5",conflictStageMissing:"\u6240\u9009\u9636\u6BB5\u7F3A\u5931\uFF0C\u6309\u7A7A\u5185\u5BB9\u6BD4\u8F83\uFF1B\u4E0D\u63A8\u65AD\u539F\u59CB\u5185\u5BB9\u3002",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",workspaceLargeScope:"Git\u5DE5\u4F5C\u533A\u5B8C\u6574UTF-8\u6BD4\u8F83\uFF0C\u6BCF\u4FA78MiB\uFF0F10\u4E07\u884C\uFF1B\u8BFB\u53D6\u671F\u95F4\u53D8\u5316\u4F1A\u62D2\u7EDD\u7ED3\u679C\uFF0C\u6210\u529F\u540E\u6587\u4EF6\u4ECD\u53EF\u88AB\u5916\u90E8\u4FEE\u6539\u3002",largeLoad:"\u52A0\u8F7D\u5B8C\u6574\u5927\u6587\u4EF6\u6BD4\u8F83",largeClose:"\u53D6\u6D88\u5927\u6587\u4EF6\u6A21\u5F0F",largeScope:"\u4EC5Git\u5386\u53F2UTF-8\u666E\u901A\u6587\u4EF6\uFF0C\u6BCF\u4FA7\u6700\u591A8MiB\u300110\u4E07\u884C\uFF1B\u4E0D\u662F\u5DE5\u4F5C\u533A\u6216SVN\u5927\u6587\u4EF6\u3002",diffPending:"\u6B63\u5728\u8BA1\u7B97\u5DEE\u5F02\uFF0C\u5C1A\u4E0D\u80FD\u5224\u65AD\u662F\u5426\u76F8\u540C\u3002",diffIncomplete:"\u5DEE\u5F02\u8BA1\u7B97\u672A\u5B8C\u6210\u6216\u8D85\u65F6\uFF0C\u5F53\u524D\u7ED3\u679C\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002",diffComplete:"\u5DEE\u5F02\u8BA1\u7B97\u5B8C\u6210\u3002",largeFallback:"\u57FA\u7840\u89C6\u56FE\u53EA\u5C55\u793A\u6709\u754C\u7247\u6BB5\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5927\u6587\u4EF6\u5DEE\u5F02\u3002",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",pathHistory:"\u6B64\u8DEF\u5F84\u5386\u53F2",pathHistoryScope:"\u624B\u52A8\u8BFB\u53D6\u6240\u9009\u5386\u53F2\u8DEF\u5F84\u5728\u8BE5\u63D0\u4EA4\u4E0B\u7684\u6587\u4EF6\u5386\u53F2\uFF1B\u8DEF\u5F84\u5FC5\u987B\u5B58\u5728\u4E8E\u8BE5\u63D0\u4EA4\u3002\u5173\u95ED\u8DDF\u968F\u65F6\u4E0D\u8DE8\u91CD\u547D\u540D\u3002",pathHistoryNoFollow:"\u672A\u8DDF\u968F\u91CD\u547D\u540D",pathHistoryFollowScope:"\u8DDF\u968F\u6CBF\u7528\u540C\u4E00\u4FDD\u5B88\u89C4\u5219\uFF1A\u7B2C\u4E00\u7236\u94FE\u3001Git\u76F8\u4F3C\u5EA6\u81F3\u5C1150%\u3001\u6BCF\u6B21\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u621632\u6B21\u786E\u8BA4\u4E0A\u9650\u5904\u505C\u6B62\uFF1B\u53EA\u9002\u7528\u4E8E\u63D0\u4EA4\u4E2D\u7684\u666E\u901A\u6587\u4EF6\u6216\u94FE\u63A5\u3002",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\uFF0C\u5E76\u5C1D\u8BD5\u9009\u4E2D\u8BE5\u63D0\u4EA4\u53D8\u66F4\u4E2D\u8DEF\u5F84\u5B8C\u5168\u4E00\u81F4\u7684\u552F\u4E00\u6587\u4EF6\uFF08\u4E0D\u4F1A\u731C\u6D4B\u91CD\u547D\u540D\u6216\u65E7\u8DEF\u5F84\uFF09\uFF1B\u65E0\u552F\u4E00\u5339\u914D\u65F6\u4E0D\u9884\u9009\u6587\u4EF6\u3002\u9ED8\u8BA4\u4F7F\u7528\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\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\u9759\u6001VP8\uFF0F\u65E0\u635FVP8L 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:"\u672C\u5730\u5206\u652F\u3001\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\u53CA\u672C\u5730\u7F13\u5B58\u7684\u8FDC\u7A0B\u8DDF\u8E2A\u5F15\u7528\uFF0C\u5171\u6700\u591A1000\u6761\uFF1B\u4E0D\u8FDE\u63A5\u8FDC\u7AEF\u6216fetch\uFF0C\u8FDC\u7A0B\u7F13\u5B58\u53EF\u80FD\u8FC7\u671F\u3002\u91CD\u65B0\u52A0\u8F7D\u65F6\uFF0Corigin/HEAD \u663E\u793A\u5B83\u5F53\u524D\u6307\u5411\u7684\u672C\u5730\u63D0\u4EA4\uFF1B\u5DF2\u9009\u5386\u53F2\u548C\u7248\u672C\u4ECD\u56FA\u5B9A\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\u5F15\u7528\uFF08\u542B\u8FDC\u7A0B\u7F13\u5B58\uFF09",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{svnOfferExpired:"Network access offer expired. Retry manually and check consent again.",svnExpired:"SVN network consent expired; history requests stopped. Review and consent again.",svnConsentReview:"Review SVN network access",svnConsentScope:"Before consent, read local identity only. Access binds this repository, Session and cwd for five minutes; redirects and writes are not authorized.",svnConsentExplicit:"I consent to access the HTTPS SVN repository above",svnConsentApprove:"Consent and read history",svnHistoryScope:"SVN history at a fixed local revision snapshot; pages replace displayed rows",svnHistoricalDiff:"Historical read-only Diff",svnCopyHistory:"View copy source history",svnCopyOutside:"Copy source is outside the authorized scope",svnCopyTraceScope:"Separate fixed in-scope source history, stopping at its copy boundary; not automatic tracing",svnTraceScope:"File trace stops at copy boundaries and does not follow out-of-scope sources",svnGrantScope:"Network consent lasts five minutes; revoke at any time. History operations do not modify the working copy.",svnRevoke:"Revoke SVN network consent",svnIdentity:"Inspect local SVN history identity",svnOfflineIdentity:"Read local metadata from the authorized working copy only; no remote request.",svnRemoteDisabled:"Remote SVN history transport is not enabled; no network grant or usable access token. This is not an authorized history entry point.",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",fileHistorySimilarity:"Git similarity",fileHistoryAmbiguous:"Multiple candidate origins; tracing stopped here",fileHistoryRenameLimit:"32 rename confirmations reached; tracing stopped here",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow renames (first-parent)",fileHistoryFollowScope:"Git-detected renames; similarities of 50% or more require a unique deletion/addition transition. Stops at ambiguity, copies and merges. Similarity is not an identity guarantee; rows use historical paths.",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",conflictStages:"Index conflict stages",conflictStagesScope:"Manually reads Index stages 1/2/3 of the selected conflict. Stage numbers are Index identities, not merge/rebase ownership claims. Missing stages show as empty and are never inferred; the working file is not read and the conflict is not resolved.",conflictStage1:"Stage 1 (BASE)",conflictStage2:"Stage 2 (ours)",conflictStage3:"Stage 3 (theirs)",conflictStagePresent:"present",conflictStageAbsent:"absent (shown empty)",conflictStageGitlink:"submodule commit reference, contents not loaded",conflictStageSymlink:"link target text, not followed",conflictStageLeft:"Left stage",conflictStageRight:"Right stage",conflictStageMissing:"A selected stage is absent, so it is compared as empty; original content is not inferred.",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",workspaceLargeScope:"Complete Git working-copy UTF-8 comparison: 8 MiB / 100000 lines per side. Changes during loading reject the result; external edits remain possible afterward.",largeLoad:"Load complete large-file comparison",largeClose:"Cancel large-file mode",largeScope:"Git historical UTF-8 regular files only: 8 MiB and 100000 lines per side, not working-copy or SVN large files.",diffPending:"Computing differences; equality is not yet known.",diffIncomplete:"Difference computation is incomplete or timed out; displayed results may be partial.",diffComplete:"Difference computation completed.",largeFallback:"The basic view shows bounded excerpts, not the complete large-file diff.",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",pathHistory:"History of this path",pathHistoryScope:"Manually reads the file history of the selected historical path at that commit; the path must exist in that commit. Without following, renames are not crossed.",pathHistoryNoFollow:"renames not followed",pathHistoryFollowScope:"Following uses the same conservative rules: first parent, Git similarity of at least 50%, a unique deletion/addition confirmed each time, stopping at ambiguity, copies or the 32-confirmation cap; only committed regular files or links are supported.",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 and preselect the single exactly matching path in that commit; rename or old paths are never guessed, and a missing or ambiguous match preselects nothing. The first parent is used and no line is auto-located.",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 static VP8 / lossless VP8L 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, commit tags and locally cached remote-tracking refs, at most 1000 total; no network or fetch. Remote caches may be stale. Reloading origin/HEAD shows its current local target; selected history and versions stay pinned. 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 refs (including remote caches)",revisionRefsCount:"Selectable references loaded"}};function wo(e,t,r,o){let i=e.target;if(!t?.contains(i)||e.defaultPrevented||e.isComposing||i?.closest?.(".monaco-editor")||i?.closest?.(".vcs-history"))return null;if(e.key==="Escape"&&i===r&&o)return"clear";let s=i?.isContentEditable||i?.closest?.('input,textarea,select,[role="textbox"]');if(s&&i!==r)return null;if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&e.key?.toLowerCase()==="f")return"search";if(!s&&e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){if(e.key==="ArrowLeft")return"previous";if(e.key==="ArrowRight")return"next"}return null}function So(e,t){let r=t?[...t.querySelectorAll("button[data-vcs-item]")]:[],o=r.indexOf(e.target);if(o<0)return;let i;if(e.key==="ArrowDown")i=r[o+1];else if(e.key==="ArrowUp")i=r[o-1];else if(e.key==="Home")i=r[0];else if(e.key==="End")i=r.at(-1);else if(e.key==="ArrowRight"&&e.target.dataset.vcsDirectory==="closed"||e.key==="ArrowLeft"&&e.target.dataset.vcsDirectory==="open"){e.preventDefault(),e.target.click();return}else return;e.preventDefault(),i?.focus()}var ko=e=>"dsh-vcs:project:v1:"+e;function Co(e,t){if(!e)return"";try{let r=(t??globalThis.localStorage)?.getItem(ko(e));return typeof r=="string"&&r.length<=1024?r:""}catch{return""}}function No(e,t,r){if(!(!e||!t))try{(r??globalThis.localStorage)?.setItem(ko(e),t)}catch{}}function Lo(e,t=""){return e.find(r=>r.id===t)?.id||e.find(r=>r.relativePath===".")?.id||e[0]?.id||""}var Je=(e,t)=>JSON.stringify([e,t]),Ve=(e,t=".")=>[e.type.toUpperCase(),e.relativePath==="."?t:e.relativePath||".",e.branch].filter(Boolean).join(" \xB7 "),Re=(e,t="all")=>e.type==="git"&&["staged","unstaged"].includes(t)?t:"all",Eo=(e="",t="")=>e===t?0:e<t?-1:1;function Bt(e=[]){let t={id:"",name:"",directories:new Map,files:[],count:0};for(let o of e){let i=String(o.path||"").split("/").filter(Boolean);if(!i.length)continue;let s=t;for(let p of i.slice(0,-1)){let f=s.id?s.id+"/"+p:p;s.directories.has(p)||s.directories.set(p,{id:f,name:p,directories:new Map,files:[],count:0}),s=s.directories.get(p),s.count++}s.files.push(o)}let r=o=>({...o,directories:[...o.directories.values()].sort((i,s)=>Eo(i.name,s.name)).map(r),files:[...o.files].sort((i,s)=>Eo(i.path,s.path))});return r(t)}function Ao(e=[],t){let r=e.findIndex(o=>o.id===t);return{index:r<0?0:r+1,total:e.length}}function Ho(e=[],t,r){if(!e.length||!["previous","next"].includes(r))return null;let o=e.findIndex(p=>p.id===t),i=r==="next"?1:-1,s=o<0?r==="next"?-1:0:o;return e[(s+i+e.length)%e.length]||null}function Po(e=""){let t=String(e).split("/").filter(Boolean);return t.slice(0,-1).map((r,o)=>t.slice(0,o+1).join("/"))}function Ft(e,t=[]){for(let r of e?.directories||[])t.push(r.id),Ft(r,t);return t}function Oo(e=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[e]||e}function Bo(e=[]){return e.reduce((t,r)=>{let o=Oo(r.status);return t.all++,t[o]=(t[o]||0)+1,t},{all:0})}function Br(e=[],t="",r="all"){let o=t.toLowerCase();return e.filter(i=>(r==="all"||Oo(i.status)===r)&&i.path.toLowerCase().includes(o)).sort((i,s)=>i.path.localeCompare(s.path))}function Fo(e,t,r="",o="all"){return e.map(i=>({...t[i.id],repository:i,changes:Br(t[i.id]?.changes,r,o)}))}function Do(e,t,r=""){if(!r||!e||e.cwd!==t.cwd)return t;let o=new Map(e.repositories.map(i=>[i.id,i]));for(let i of t.repositories)o.set(i.id,i);return{...t,repositories:[...o.values()],truncated:e.truncated||t.truncated,warnings:[...e.warnings||[],...t.warnings||[]]}}var Mo={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},To=e=>new URL("vcs-assets/"+e,document.baseURI).href;function jo(){return n.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},n.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),n.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var Fr=["slots","layout","locale","connection","uiSession"];function Dr(e){e.effect(()=>e.locale.register("local.vcs",xo));let t=e.locale.bind("local.vcs"),r=gt(2),o=io(e.connection,()=>t("error"));function i(f){let c=f.useSessions(a=>Object.values(a.byId).find(d=>(d.retainedBy.mainView??0)>0));return n.default.createElement(s,{key:JSON.stringify([c?.id,c?.cwd])},n.default.createElement(p,{session:c}))}class s extends n.default.Component{state={error:null};static getDerivedStateFromError(c){return{error:c}}render(){return this.state.error?n.default.createElement("section",{className:"vcs-root"},n.default.createElement("style",null,ht),n.default.createElement("div",{className:"vcs-message vcs-error"},t("error"),n.default.createElement("button",{onClick:()=>this.setState({error:null})},t("retry")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")))):this.props.children}}function p({session:f}){(0,n.useSyncExternalStore)(l=>e.locale.subscribe(l),()=>e.locale.getSnapshot(),()=>e.locale.getSnapshot());let c=f?.id,[a,d]=(0,n.useState)("all"),[h,k]=(0,n.useState)(0),[y,C]=(0,n.useState)(0),[u,x]=(0,n.useState)(null),[b,v]=(0,n.useState)({}),[g,m]=(0,n.useState)(()=>Co(f?.cwd)),[S,H]=(0,n.useState)(0),[_,w]=(0,n.useState)(""),[T,ue]=(0,n.useState)(""),[M,ne]=(0,n.useState)(null),[E,Z]=(0,n.useState)(null),[le,He]=(0,n.useState)(!1),[ke,Pe]=(0,n.useState)(!1),[fe,P]=(0,n.useState)(""),[Y,oe]=(0,n.useState)(""),[re,Dt]=(0,n.useState)(""),[Mt,Tt]=(0,n.useState)(!1),[ge,et]=(0,n.useState)(""),[Ue,jt]=(0,n.useState)("all"),[Ce,qt]=(0,n.useState)(!0),[Gt,tt]=(0,n.useState)({}),[Oe,qo]=(0,n.useState)(!0),[ot,Go]=(0,n.useState)(!1),[rt,Jo]=(0,n.useState)(!1),[We,Be]=(0,n.useState)("content"),[Jt,Vt]=(0,n.useState)(0),[Vo,Ut]=(0,n.useState)(!1),[Wt,It]=(0,n.useState)(null),[Uo,Wo]=(0,n.useState)(0),[zt,Io]=(0,n.useState)("pending"),[it,st]=(0,n.useState)({added:0,deleted:0,count:0}),[ae,Kt]=(0,n.useState)(!1),_t=(0,n.useRef)(null),Yt=(0,n.useRef)(null),ye=(0,n.useRef)(null),nt=(0,n.useRef)(null),Ie=(0,n.useRef)(null),at=(0,n.useRef)(null),Qt=(0,n.useRef)(null),Ne=(0,n.useRef)(null),lt=(0,n.useRef)(null),ct=(0,n.useRef)(null),dt=(0,n.useRef)(!1),ze=(0,n.useRef)(!1),ve=u?.repositories||[],be=ve.filter(l=>l.id===g),ie=Vo&&be.some(l=>l.type==="git"),zo=()=>{Ne.current?.abort(),Z(null),ne(null),oe(""),Ut(!0)};(0,n.useEffect)(()=>{ve.some(l=>l.id===g)&&No(f?.cwd,g)},[f?.cwd,g,u]);let Fe=()=>{Qt.current?.abort(),Ne.current?.abort(),Z(null),ne(null),oe(""),Be("content"),st({added:0,deleted:0,count:0})},Ke=()=>{ze.current=!1,Fe(),lt.current?.abort(),ct.current=u,x(null),v({}),ue(_.trim()),H(l=>l+1)},xe=()=>{ze.current||(ze.current=!0,Fe(),lt.current?.abort(),ct.current=null,x(null),v({}),ue(""),H(l=>l+1))},Xt=(l=!1)=>{l||C(L=>L+1),dt.current=l,l||Fe(),l||v({}),k(L=>L+1)};(0,n.useEffect)(()=>{let l=new AbortController;return lt.current=l,P(""),He(!!c),c&&o("vcs/repositories",{sessionId:c,...T?{subdirectory:T}:{}},l.signal).then(L=>{if(!l.signal.aborted){let V=Do(ct.current,L,T);ze.current=!1,m(Q=>Lo(V.repositories,Q)),x(V)}}).catch(L=>{l.signal.aborted||P(L.message)}).finally(()=>{l.signal.aborted||He(!1)}),()=>l.abort()},[c,S,T]),(0,n.useEffect)(()=>{let l=new AbortController,L=dt.current;Qt.current=l,dt.current=!1,L||(v({}),oe(""));for(let V of be){let Q=Re(V,a);r(()=>o("vcs/status",{sessionId:c,repositoryId:V.id,mode:Q},l.signal),l.signal).then(se=>{l.signal.aborted||v(ce=>({...ce,[V.id]:{...se,mode:Q}}))}).catch(se=>{if(!l.signal.aborted){if(se.code==="vcs/rediscover-required"){xe();return}v(ce=>({...ce,[V.id]:{error:se.message,changes:[],mode:Q}}))}})}return()=>l.abort()},[c,u,g,a,h]),(0,n.useEffect)(()=>{let l=L=>{L.target===window&&c&&g&&document.visibilityState==="visible"&&Xt(!0)};return window.addEventListener("focus",l),()=>window.removeEventListener("focus",l)},[c,g,a]);let we=ve.find(l=>l.id===M?.repositoryId),me=M?b[M.repositoryId]:null,pt=JSON.stringify([c,u?.cwd,M?.repositoryId,a,M?.id]),Ee=Wt?.key===pt&&Wt?.status===me;(0,n.useEffect)(()=>It(null),[pt,me,ie]),(0,n.useEffect)(()=>{let l=new AbortController;return Ne.current=l,Z(null),oe(""),st({added:0,deleted:0,count:0}),Be("content"),Pe(!!M&&!!me),!ie&&M&&me&&we&&o("vcs/compare",{sessionId:c,repositoryId:M.repositoryId,mode:Re(we,a),id:M.id,...Ee?{large:!0}:{}},l.signal).then(L=>{l.signal.aborted||Z(L)}).catch(L=>{if(!l.signal.aborted){if(L.code==="vcs/rediscover-required"){xe();return}oe(L.message)}}).finally(()=>{l.signal.aborted||Pe(!1)}),()=>l.abort()},[M,me,c,a,ie,Ee,Uo]),(0,n.useEffect)(()=>{let l=!1,L,V=new AbortController;Kt(!1),Dt("");let Q=document.createElement("link");return Q.rel="stylesheet",Q.href=To("editor.css"),document.head.appendChild(Q),Qe(To("editor.js")+"?v="+encodeURIComponent(Xe)+"&retry="+Jt,{signal:V.signal}).then(se=>{l||(L=se.createDiff(Yt.current,{onStats:st,onComputation:ce=>{l||Io(ce)}}),ye.current=L,Kt(!0))}).catch(se=>{l||Dt(se.message)}),()=>{l=!0,V.abort(),L?.dispose(),ye.current=null,Q.remove()}},[Jt]),(0,n.useEffect)(()=>{ae&&(!E||E.binary||ie)&&ye.current?.setContent({left:{text:""},right:{text:""}},"empty"),ae&&E&&!E.binary&&!ie&&ye.current?.setContent(E,JSON.stringify([c,u?.cwd,M?.repositoryId,a,M?.id,E.path]))},[ae,E,c,u,M,a,ie]),(0,n.useEffect)(()=>{ye.current?.options({sideBySide:Oe,ignoreWhitespace:ot,wrap:rt})},[ae,Oe,ot,rt]);let De=Fo(be,b,ge,Ue),Le=De.flatMap(l=>l.changes),Ko=Bo(me?.changes),ut=Ao(Le,M?.id),$t=()=>{et(""),jt("all")},_o=async()=>{let l=E?.path||he?.path;if(l)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{let L=document.createElement("textarea");try{if(L.value=l,L.style.cssText="position:fixed;opacity:0",document.body.appendChild(L),L.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{L.remove()}}Tt(!0),window.setTimeout(()=>Tt(!1),1500)}catch{oe(t("copyFailed"))}};(0,n.useEffect)(()=>{let l=L=>{if(ie)return;let V=wo(L,_t.current,Ie.current,!!ge);V&&(L.preventDefault(),V==="search"?(Ie.current?.focus(),Ie.current?.select()):V==="clear"?et(""):ft(V))};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[ge,Le,M,ie]);let Zt=l=>tt(L=>{let V={...L};for(let Q of De)for(let se of Ft(Bt(Q.changes)))V[Q.repository.id+"\0"+se]=!l;return V}),Yo=()=>{let l=he;!l||!M||(qt(!0),$t(),tt(L=>{let V={...L};for(let Q of Po(l.path))V[M.repositoryId+"\0"+Q]=!1;return V}),at.current=Je(M.repositoryId,l.id))};(0,n.useEffect)(()=>{let l=at.current;if(!l)return;let L=[...nt.current?.querySelectorAll("button[data-vcs-change]")||[]].find(V=>V.dataset.vcsChange===l);L&&(L.scrollIntoView({block:"nearest"}),L.focus(),at.current=null)},[Ce,ge,Ue,Gt,De]);let ft=l=>{let L=Ho(Le,M?.id,l);L&&(Ne.current?.abort(),Z(null),Be("content"),ne({repositoryId:g,id:L.id}))},Rt=le||be.some(l=>!b[l.id]),he=me?.changes?.find(l=>l.id===M?.id),Se=E?.properties,mt=Se?[...new Set([...Object.keys(Se.left||{}),...Object.keys(Se.right||{})])].filter(l=>Se.left?.[l]!==Se.right?.[l]):[],Me=l=>Mo[l?.status]||l?.status?.slice(0,1).toUpperCase()||"M",eo=E?.binary?[E.left.label,E.right.label].filter(Boolean).join(" \u2194 "):"",Ae=Y||(ke?t("loading"):c?Rt&&!he?t("loading"):fe||(ve.length?he?E?.binary?t("binary")+(eo?" "+t("binaryComparison",{files:eo}):""):E?!ae&&!re?t("loading"):"":t("pick"):t("pick"):t("noRepo")):t("noSession")),Qo=l=>So(l,nt.current),to=({entry:l,compact:L=!1,depth:V=0})=>{let Q=l.path.lastIndexOf("/");return n.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":Je(g,l.id),"aria-current":M?.repositoryId===g&&M?.id===l.id?"true":void 0,style:{paddingInlineStart:8+V*14},title:(l.oldPath?l.oldPath+" \u2192 ":"")+l.path+" \xB7 "+t(Me(l)),onClick:()=>{Ne.current?.abort(),Z(null),Be("content"),ne({repositoryId:g,id:l.id})}},n.default.createElement("span",{className:"vcs-status","data-status":Me(l)},Me(l)),n.default.createElement("span",{className:"vcs-filename"},L?l.path.slice(Q+1):l.path,l.oldPath&&n.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",l.oldPath)))},oo=({node:l,repository:L,depth:V=0})=>n.default.createElement(n.default.Fragment,null,l.directories.map(Q=>{let se=L.id+"\0"+Q.id,ce=!!Gt[se];return n.default.createElement(n.default.Fragment,{key:se},n.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":ce?"closed":"open","aria-expanded":!ce,style:{paddingInlineStart:8+V*14},onClick:()=>tt(Xo=>({...Xo,[se]:!ce}))},n.default.createElement("span",{"aria-hidden":"true"},ce?"\u203A":"\u2304"),Q.name,n.default.createElement("small",null,Q.count)),!ce&&n.default.createElement(oo,{node:Q,repository:L,depth:V+1}))}),l.files.map(Q=>n.default.createElement(to,{key:Je(L.id,Q.id),entry:Q,compact:l.id!=="",depth:V})));return n.default.createElement("section",{ref:_t,className:"vcs-root","aria-label":t("title")},n.default.createElement("style",null,ht),n.default.createElement("header",{className:"vcs-top"},n.default.createElement(jo,null),n.default.createElement("h1",{className:"vcs-title"},t("title")),n.default.createElement("span",{className:"vcs-badge"},t("readonly")),n.default.createElement("span",{className:"vcs-spacer"}),n.default.createElement("select",{"aria-label":t("repositories"),value:g,disabled:le||!ve.length,onChange:l=>{Fe(),v({}),m(l.target.value)}},!ve.length&&n.default.createElement("option",{value:""},t("repositories")),ve.map(l=>n.default.createElement("option",{key:l.id,value:l.id},Ve(l,t("workspaceRoot"))))),n.default.createElement("label",{className:"vcs-mode"},t("gitMode")," ",n.default.createElement("select",{"aria-label":t("gitMode"),value:a,disabled:ie||!be.some(l=>l.type==="git"),onChange:l=>{Fe(),v({}),d(l.target.value)}},["all","unstaged","staged"].map(l=>n.default.createElement("option",{key:l,value:l},t(l))))),n.default.createElement("button",{onClick:()=>Xt(!1),disabled:Rt||!c},t("refresh")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")),n.default.createElement("div",{className:"vcs-path",title:u?.cwd||f?.cwd},t("session"),": ",u?.cwd||f?.cwd||"\u2014"),n.default.createElement("form",{className:"vcs-discovery",onSubmit:l=>{l.preventDefault(),Ke()}},n.default.createElement("input",{"aria-label":t("subdirectory"),placeholder:t("subdirectory"),value:_,onChange:l=>w(l.target.value)}),n.default.createElement("button",{disabled:!c||le},t("rescan")),n.default.createElement("span",null,t("scanHint"))),u?.truncated&&n.default.createElement("div",{className:"vcs-notice"},t("truncated")),(u?.warnings||[]).map((l,L)=>n.default.createElement("div",{className:"vcs-notice",key:L},typeof l=="string"?l:l.message||JSON.stringify(l)))),be.filter(l=>l.type==="svn").map(l=>n.default.createElement(n.default.Fragment,{key:JSON.stringify([c,l.id,S,h])},n.default.createElement(bt,{repositoryId:l.id,sessionId:c,rpc:o,t,onRediscover:xe}),n.default.createElement(St,{repositoryId:l.id,sessionId:c,rpc:o,t,onRediscover:xe}))),be.some(l=>l.type==="git")&&n.default.createElement(n.default.Fragment,null,n.default.createElement("nav",{className:"vcs-review-views","aria-label":t("reviewView")},n.default.createElement("button",{"aria-pressed":!ie,onClick:()=>Ut(!1)},t("workspaceView")),n.default.createElement("button",{"aria-pressed":ie,"aria-expanded":ie,onClick:zo},t("history"))),ie&&n.default.createElement(Ot,{key:JSON.stringify([c,g,y,S]),sessionId:c,repositoryId:g,rpc:o,t,onRediscover:xe})),n.default.createElement("div",{className:"vcs-body",hidden:ie,"aria-label":t("workspaceView")},n.default.createElement("aside",{className:"vcs-files"},n.default.createElement("div",{className:"vcs-filter"},n.default.createElement("input",{ref:Ie,"aria-label":t("search"),placeholder:t("search"),title:t("searchShortcut"),value:ge,onChange:l=>et(l.target.value)}),(ge||Ue!=="all")&&n.default.createElement("button",{className:"vcs-clear-filter",onClick:$t},t("clearFilters"))),n.default.createElement("div",{className:"vcs-status-filter","aria-label":t("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":Ue===l,onClick:()=>jt(l)},t(l==="all"?"allFiles":Mo[l]||"M")," ",n.default.createElement("small",null,Ko[l]||0)))),n.default.createElement("div",{className:"vcs-count"},n.default.createElement("span",null,Le.length," ",t("files")),n.default.createElement("span",{className:"vcs-auto"},t("autoRefresh")),n.default.createElement("button",{"aria-pressed":Ce,onClick:()=>qt(!Ce)},t(Ce?"tree":"list"))),Ce&&n.default.createElement("div",{className:"vcs-tree-actions"},n.default.createElement("button",{onClick:()=>Zt(!0)},t("expandAll")),n.default.createElement("button",{onClick:()=>Zt(!1)},t("collapseAll")),n.default.createElement("button",{onClick:Yo,disabled:!he},t("revealSelected"))),n.default.createElement("nav",{className:"vcs-filelist","aria-label":t("title"),ref:nt,onKeyDown:Qo},De.map(l=>{let L=l.repository;return n.default.createElement("section",{className:"vcs-repository",key:L.id,"aria-label":Ve(L,t("workspaceRoot"))},n.default.createElement("div",{className:"vcs-repository-heading",title:L.root},n.default.createElement("strong",null,Ve(L,t("workspaceRoot"))),n.default.createElement("small",null,L.type==="svn"?t("svnBase"):t(Re(L,a)))),l.error?n.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},l.error,n.default.createElement("button",{onClick:Ke},t("rescan"))):b[L.id]?Ce?n.default.createElement(oo,{node:Bt(l.changes),repository:L}):l.changes.map(V=>n.default.createElement(to,{key:Je(L.id,V.id),entry:V})):n.default.createElement("div",{className:"vcs-message"},t("loading")),!l.error&&b[L.id]&&!l.changes.length&&n.default.createElement("div",{className:"vcs-message"},t(ge?"emptySearch":"clean")))}),!De.length&&n.default.createElement("div",{className:"vcs-message"},le?t("loading"):fe||t(c?"noRepo":"noSession"),fe&&n.default.createElement("button",{onClick:Ke},t("rescan"))))),n.default.createElement("main",{className:"vcs-detail"},n.default.createElement("div",{className:"vcs-filehead"},n.default.createElement("strong",{title:E?.path||he?.path},we?Ve(we,t("workspaceRoot"))+" / ":"",E?.path||he?.path||t("pick")),n.default.createElement("button",{className:"vcs-copy-path",disabled:!(E?.path||he?.path),onClick:_o},t(Mt?"copied":"copyPath")),Mt&&n.default.createElement("span",{className:"vcs-sr-only",role:"status"},t("pathCopied")),n.default.createElement("span",{className:"vcs-spacer"}),E&&!E.binary&&ae&&n.default.createElement(n.default.Fragment,null,n.default.createElement("span",{className:"vcs-add"},"+",it.added),n.default.createElement("span",{className:"vcs-del"},"\u2212",it.deleted))),re&&n.default.createElement("div",{className:"vcs-notice",role:"status"},t("fallback")," ",n.default.createElement("button",{onClick:()=>Vt(l=>l+1)},t("retry")),n.default.createElement("details",null,n.default.createElement("summary",null,t("diagnostics")),re)),E&&n.default.createElement("div",{className:"vcs-context","aria-label":t("comparisonContext")},n.default.createElement("span",{className:"vcs-context-status","data-status":Me(E)},t(Me(E))),E.oldPath&&n.default.createElement("span",{className:"vcs-context-rename",title:E.oldPath+" \u2192 "+E.path},E.oldPath," ",n.default.createElement("b",null,"\u2192")," ",E.path),n.default.createElement("span",null,E.left.label||"\u2014"," ",n.default.createElement("b",null,"\u2194")," ",E.right.label||"\u2014"),(E.left.encoding||E.right.encoding)&&n.default.createElement("span",null,t("encoding"),": ",E.left.encoding||"\u2014"," / ",E.right.encoding||"\u2014")),E&&we?.type==="git"&&n.default.createElement(je,{key:JSON.stringify([c,u?.cwd,M.repositoryId,a,M.id,h,me]),workspace:!0,sessionId:c,repositoryId:M.repositoryId,mode:a,id:M.id,rpc:o,t,onRediscover:xe}),we?.type==="git"&&(Ee||E?.notice?.includes("2 MiB"))&&n.default.createElement("div",{className:"vcs-notice"},n.default.createElement("span",null,t("workspaceLargeScope")),n.default.createElement("button",{onClick:()=>{Ne.current?.abort(),Z(null),It(Ee?null:{key:pt,status:me})}},t(Ee?"largeClose":"largeLoad")),Ee&&Y&&n.default.createElement("button",{onClick:()=>Wo(l=>l+1)},t("retry"))),E?.large&&n.default.createElement("p",{role:"status"},t(re?"largeFallback":zt==="complete"?"diffComplete":zt==="incomplete"?"diffIncomplete":"diffPending")),E?.notice&&n.default.createElement("div",{className:"vcs-notice"},E.notice),E?.status==="conflicted"&&we?.type==="git"&&n.default.createElement(vt,{key:JSON.stringify([c,M.repositoryId,a,M.id,h]),sessionId:c,repositoryId:M.repositoryId,mode:a,id:M.id,rpc:o,t,onRediscover:xe}),mt.length>0&&n.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":We===l,onClick:()=>Be(l)},t(l),l==="properties"?" ("+mt.length+")":""))),n.default.createElement("div",{className:"vcs-labels"},n.default.createElement("span",null,E?.left.label||"\u2014",E?.left.encoding?" \xB7 "+E.left.encoding:""),n.default.createElement("span",null,E?.right.label||"\u2014",E?.right.encoding?" \xB7 "+E.right.encoding:"")),n.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!Ae||We!=="content",style:We==="properties"?{display:"none"}:void 0},n.default.createElement("div",{className:"vcs-editor",ref:Yt,style:re?{display:"none"}:void 0}),re&&E&&!E.binary&&!Ae&&n.default.createElement(Te,{comparison:E,labels:Ye(t)}),Ae&&n.default.createElement("div",{className:"vcs-message "+(fe||Y||re?"vcs-error":""),role:"status"},Ae,(fe||Y||re)&&n.default.createElement("button",{onClick:()=>re?Vt(l=>l+1):Ke()},t(re?"retry":"rescan")))),We==="properties"&&n.default.createElement("div",{className:"vcs-properties"},n.default.createElement("table",null,n.default.createElement("thead",null,n.default.createElement("tr",null,n.default.createElement("th",null,t("properties")),n.default.createElement("th",null,E?.left.label||t("before")),n.default.createElement("th",null,E?.right.label||t("after")))),n.default.createElement("tbody",null,mt.map(l=>n.default.createElement("tr",{key:l},n.default.createElement("th",null,l),n.default.createElement("td",null,Se.left?.[l]??"\u2014"),n.default.createElement("td",null,Se.right?.[l]??"\u2014")))))),n.default.createElement("footer",{className:"vcs-toolbar"},n.default.createElement("button",{disabled:!ae,"aria-pressed":Oe,onClick:()=>qo(!Oe)},t(Oe?"side":"inline")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!ae,checked:ot,onChange:l=>Go(l.target.checked)}),t("whitespace")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!ae,checked:rt,onChange:l=>Jo(l.target.checked)}),t("wrap")),n.default.createElement("span",{className:"vcs-spacer"}),ae&&n.default.createElement("span",null,it.count," ",t("changes")),n.default.createElement("button",{disabled:!ae||!E||!!Ae,onClick:()=>ye.current?.navigate("previous")},t("previous")),n.default.createElement("button",{disabled:!ae||!E||!!Ae,onClick:()=>ye.current?.navigate("next")},t("next")),ut.index>0&&n.default.createElement("span",{className:"vcs-review-position"},t("reviewPosition",{index:ut.index,total:ut.total})),n.default.createElement("span",{className:"vcs-toolbar-separator"}),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Le.length,onClick:()=>ft("previous")},t("previousFile")),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Le.length,onClick:()=>ft("next")},t("nextFile"))))))}e.slots.inject("main",()=>e.slots.register({name:"main",key:"local-vcs"},i)),e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>t("title"),order:65},jo))}
95
+ `;function so(e,t){return async(r,o,i)=>{let s=await e.rpc.call("/vcs-rpc",r,o,i);if(!s.ok){let p=new Error(s.error?.message||String(s.error||t()));throw p.code=s.error?.code,p}return s.value}}function gt(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,r=[];function o(){for(;t<e&&r.length;){let i=r.shift();if(i.signal?.removeEventListener("abort",i.abort),i.signal?.aborted){i.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(i.signal?.aborted)throw new Error("Aborted");return i.run()}).then(i.resolve,i.reject).finally(()=>{t--,o()})}}return(i,s)=>new Promise((p,f)=>{let d={run:i,signal:s,resolve:p,reject:f,abort:null};if(d.abort=()=>{let a=r.indexOf(d);a>=0&&(r.splice(a,1),f(new Error("Aborted")))},s?.aborted){f(new Error("Aborted"));return}s?.addEventListener("abort",d.abort,{once:!0}),r.push(d),o()})}var te=Z(require("react"),1);function no(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function ao(e="",t=""){let r=no(e),o=no(t),i=0;for(;i<r.length&&i<o.length&&r[i]===o[i];)i++;let s=0;for(;s<r.length-i&&s<o.length-i&&r[r.length-s-1]===o[o.length-s-1];)s++;let p=r.length-s,f=o.length-s,d=p-i,a=f-i,c=d&&a?(d+1)*(a+1):0,h=c>2e5,k=[],y=0;function C(u,x){y++,!(k.length>=2e3)&&k.push({left:u===null?null:{number:u+1,text:r[u]},right:x===null?null:{number:x+1,text:o[x]},kind:u===null?"insert":x===null?"delete":r[u]===o[x]?"equal":"replace"})}for(let u=0;u<i;u++)C(u,u);if(h||!d||!a)for(let u=0;u<Math.max(d,a);u++)C(u<d?i+u:null,u<a?i+u:null);else{let u=a+1,x=new Uint32Array(c);for(let g=d-1;g>=0;g--)for(let m=a-1;m>=0;m--)x[g*u+m]=r[i+g]===o[i+m]?x[(g+1)*u+m+1]+1:Math.max(x[(g+1)*u+m],x[g*u+m+1]);let b=0,v=0;for(;b<d||v<a;)b<d&&v<a&&r[i+b]===o[i+v]?C(i+b++,i+v++):b<d&&(v===a||x[(b+1)*u+v]>=x[b*u+v+1])?C(i+b++,null):C(null,i+v++)}for(let u=0;u<s;u++)C(p+u,f+u);return{rows:k,approximate:h,truncated:y>k.length,totalRows:y,omittedRows:y-k.length,leftLineCount:r.length,rightLineCount:o.length,lcsCells:h?0:c}}var lr={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."},yt={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},cr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},pr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Te({comparison:e,labels:t={}}){let r=e?.left?.text??"",o=e?.right?.text??"",i=(0,te.useMemo)(()=>ao(r,o),[r,o]),s=f=>t[f]??lr[f],p=(f,d,a)=>{let c=f&&a!=="equal";return te.default.createElement("td",{style:{...yt,background:c?d==="left"?"#d6454520":"#259b4920":void 0}},te.default.createElement("div",{style:dr},te.default.createElement("span",{style:cr},f?.number??""),te.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},c?d==="left"?"\u2212":"+":""),te.default.createElement("pre",{style:pr},f?.text??"")))};return te.default.createElement("section",{className:"vcs-text-comparison","aria-label":s("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},i.approximate&&te.default.createElement("div",{role:"status",style:{padding:8}},s("approximate")),i.truncated&&te.default.createElement("div",{role:"status",style:{padding:8}},s("truncated")," (",2e3," / ",i.totalRows,")"),te.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},te.default.createElement("thead",null,te.default.createElement("tr",null,te.default.createElement("th",{scope:"col",style:{...yt,padding:8,overflowWrap:"anywhere"}},e?.left?.label||s("before")),te.default.createElement("th",{scope:"col",style:{...yt,padding:8,overflowWrap:"anywhere"}},e?.right?.label||s("after")))),te.default.createElement("tbody",null,i.rows.map((f,d)=>te.default.createElement("tr",{key:d,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!i.rows.length&&te.default.createElement("p",{style:{padding:8}},s("empty")))}var U=Z(require("react"),1);function lo(e,{width:t,height:r,signal:o,timeoutMs:i=1e4,createURL:s=d=>URL.createObjectURL(d),revokeURL:p=d=>URL.revokeObjectURL(d),createImage:f=()=>new Image}={}){return new Promise((d,a)=>{if(o?.aborted){a(o.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(r)||t<1||r<1||t>8192||r>8192||t*r>16e6||!Number.isFinite(i)||i<=0){a(new Error("Invalid image preview"));return}let c,h,k,y=!1,C=!1,u=()=>{C||(C=!0,h&&(h.src=""),c&&p(c))},x=()=>{clearTimeout(k),o?.removeEventListener("abort",v)},b=g=>{y||(y=!0,x(),u(),a(g))},v=()=>b(o.reason||new Error("Image cancelled"));try{c=s(e),h=f(),o?.addEventListener("abort",v,{once:!0}),k=setTimeout(()=>b(new Error("Image decode timed out")),i),h.src=c,Promise.resolve(h.decode()).then(()=>{if(!y){if(o?.aborted){v();return}if(h.naturalWidth!==t||h.naturalHeight!==r){b(new Error("Image dimensions mismatch"));return}y=!0,x(),d({url:c,dispose:u})}},b)}catch(g){b(g)}})}function ur({side:e,sessionId:t,repositoryId:r,commit:o,parentIndex:i,base:s,target:p,workspace:f=!1,mode:d,id:a,rpc:c,t:h,onRediscover:k}){let[y,C]=(0,U.useState)(null),[u,x]=(0,U.useState)(""),[b,v]=(0,U.useState)(0);return(0,U.useEffect)(()=>{let g=new AbortController,m;return C(null),x(""),(async()=>{let S=await c(f?"vcs/workspace-image":s?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:r,mode:d,id:a,side:e}:s?{sessionId:t,repositoryId:r,base:s,target:p,id:a,side:e}:{sessionId:t,repositoryId:r,commit:o,parentIndex:i,id:a,side:e},g.signal);if(g.signal.aborted)return;if(S.absent){C(S);return}if(!["image/png","image/jpeg","image/webp"].includes(S.mime)||typeof S.base64!="string"||S.base64.length>2796204||!Number.isInteger(S.bytes)||S.bytes<1||S.bytes>2097152)throw Error(h("imageInvalid"));let H=atob(S.base64);if(H.length!==S.bytes)throw Error(h("imageInvalid"));let K=new Blob([Uint8Array.from(H,w=>w.charCodeAt(0))],{type:S.mime});if(m=await lo(K,{width:S.width,height:S.height,signal:g.signal}),g.signal.aborted){m.dispose();return}C({...S,url:m.url})})().catch(S=>{g.signal.aborted||(x(S.message),S.code==="vcs/rediscover-required"&&k())}),()=>{g.abort(),m?.dispose()}},[e,t,r,o,i,s,p,f,d,a,b]),U.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(e==="left"?"imageBefore":"imageAfter")},U.default.createElement("h5",null,h(e==="left"?"imageBefore":"imageAfter")),u?U.default.createElement("p",{role:"alert"},u," ",U.default.createElement("button",{onClick:()=>v(g=>g+1)},h("retry"))):y?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,U.default.createElement("code",null,y.commit)," \xB7 ",y.path),y.absent?U.default.createElement("p",null,h("imageAbsent")):U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,y.mime,y.encoding?" \xB7 "+y.encoding:""," \xB7 ",y.width," \xD7 ",y.height," \xB7 ",y.bytes," B"),U.default.createElement("img",{src:y.url,alt:y.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),y.metadataStripped&&U.default.createElement("p",null,h("imageMetadata")))):U.default.createElement("p",{role:"status"},h("loading")))}function je(e){let[t,r]=(0,U.useState)(!1);return U.default.createElement("div",null,U.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("imageCompare")),t&&U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,e.t("imageScope")),U.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(o=>U.default.createElement(ur,{key:o,...e,side:o})))))}var J=Z(require("react"),1);var $=Z(require("react"),1);function Ye(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var ce=require("react");function co({load:e,node:t,comparison:r,key:o,single:i=!1,onReady:s=()=>{},onError:p=()=>{},onComputation:f=()=>{}}){let d=new AbortController,a,c=!1,h=()=>{let y=a;a=void 0,y?.dispose()};return{done:Promise.resolve().then(()=>(d.signal.throwIfAborted(),e(d.signal))).then(y=>{c||(a=y.createDiff(t,{single:i,onComputation:C=>{c||f(C)}}),a.setContent(r,o),c||s(a))}).catch(y=>{try{h()}finally{c||p(y)}}),dispose(){c||(c=!0,d.abort(),h())}}}async function Qe(e,{signal:t,fetcher:r=fetch,importer:o=i=>import(i)}={}){let i=await r(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!i.ok)throw new Error("Editor resource HTTP "+i.status+" ("+e+"). "+(i.status===401?"Refresh the authenticated DSH page.":i.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let s=i.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(s))throw new Error("Editor resource returned "+(s||"no Content-Type")+" instead of JavaScript.");return await i.arrayBuffer(),t?.throwIfAborted(),o(e)}var Xe="0.3.79";function po({comparison:e,identity:t,enabled:r,single:o,line:i,sideBySide:s,ignoreWhitespace:p,wrap:f}){let d=(0,ce.useRef)(null),a=(0,ce.useRef)(null),[c,h]=(0,ce.useState)(!1),[k,y]=(0,ce.useState)(""),[C,u]=(0,ce.useState)("pending");return(0,ce.useEffect)(()=>{if(h(!1),u("pending"),y(""),!r)return;let x=g=>new URL("vcs-assets/"+g,document.baseURI).href,b=document.createElement("link");b.rel="stylesheet",b.href=x("editor.css"),document.head.appendChild(b);let v=co({node:d.current,comparison:e,key:t,single:o,load:g=>Qe(x("editor.js")+"?v="+encodeURIComponent(Xe)+"&retry=0",{signal:g}),onReady:g=>{a.current=g,h(!0)},onError:g=>y(g.message),onComputation:u});return()=>{a.current=null;try{v.dispose()}finally{b.remove()}}},[r,e,t,o]),(0,ce.useEffect)(()=>{c&&o&&i&&a.current?.revealLine(i)},[c,o,i]),(0,ce.useEffect)(()=>{c&&a.current?.options({sideBySide:s,ignoreWhitespace:p,wrap:f})},[c,s,p,f]),{node:d,viewer:a,ready:c,error:k,computation:C}}function pe({comparison:e,identity:t,t:r,single:o=!1,line:i=null}){let[s,p]=(0,$.useState)(!0),[f,d]=(0,$.useState)(!1),[a,c]=(0,$.useState)(!1),[h,k]=(0,$.useState)(!0),{node:y,viewer:C,ready:u,error:x,computation:b}=po({comparison:e,identity:t,enabled:h,single:o,line:i,sideBySide:s,ignoreWhitespace:f,wrap:a});return $.default.createElement("div",null,$.default.createElement("button",{"aria-pressed":h,onClick:()=>k(v=>!v)},r(h?"historyBasic":"historyAdvanced")),u&&!o&&$.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},$.default.createElement("button",{"aria-pressed":s,onClick:()=>p(v=>!v)},r(s?"side":"inline")),$.default.createElement("label",null,$.default.createElement("input",{type:"checkbox",checked:f,onChange:v=>d(v.target.checked)}),r("whitespace")),$.default.createElement("label",null,$.default.createElement("input",{type:"checkbox",checked:a,onChange:v=>c(v.target.checked)}),r("wrap")),$.default.createElement("button",{onClick:()=>C.current?.navigate("previous")},r("previous")),$.default.createElement("button",{onClick:()=>C.current?.navigate("next")},r("next"))),h&&!u&&!x&&$.default.createElement("p",{role:"status"},r("loading")),e.large&&!o&&u&&$.default.createElement("p",{role:"status"},r(b==="complete"?"diffComplete":b==="incomplete"?"diffIncomplete":"diffPending")),e.large&&!u&&$.default.createElement("p",{role:"status"},r("largeFallback")),x&&$.default.createElement("p",{role:"status"},r("fallback")," ",x),$.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},$.default.createElement("div",{ref:y,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&$.default.createElement(Te,{comparison:e,labels:Ye(r)})))}function vt({sessionId:e,repositoryId:t,mode:r,id:o,rpc:i,t:s,onRediscover:p}){let[f,d]=(0,J.useState)(null),[a,c]=(0,J.useState)(""),[h,k]=(0,J.useState)(0),[y,C]=(0,J.useState)(1),[u,x]=(0,J.useState)(3);(0,J.useEffect)(()=>{let w=new AbortController;return d(null),c(""),i("vcs/conflict-stages",{sessionId:e,repositoryId:t,mode:r,id:o},w.signal).then(T=>{w.signal.aborted||d(T)}).catch(T=>{w.signal.aborted||(c(T.message),T.code==="vcs/rediscover-required"&&p())}),()=>w.abort()},[e,t,r,o,h]);let b={1:s("conflictStage1"),2:s("conflictStage2"),3:s("conflictStage3")},v=s("conflictStageMissing"),g=b[y],m=b[u],S=(0,J.useMemo)(()=>{if(!f)return null;let w=E=>f.stages.find(R=>R.stage===E),T=E=>{let R=w(E);return!R||!R.present?{text:"",label:b[E]}:{text:R.text,label:b[E],...R.binary?{binary:!0}:{},...R.encoding?{encoding:R.encoding}:{},...R.notice?{notice:R.notice}:{}}},ue=T(y),M=T(u),ne=[ue.notice,M.notice].filter(Boolean);return w(y)?.present&&w(u)?.present||ne.push(v),{path:f.path,left:ue,right:M,binary:!!(ue.binary||M.binary),...ne.length?{notice:[...new Set(ne)].join(" \xB7 ")}:{}}},[f,y,u,g,m,v]);if(a)return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",{role:"alert"},a," ",J.default.createElement("button",{onClick:()=>k(w=>w+1)},s("retry"))));if(!f||!S)return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",{role:"status"},s("loading")));let H=w=>f.stages.find(T=>T.stage===w),K=S.binary&&!S.left.text&&!S.right.text;return J.default.createElement("section",{"aria-label":s("conflictStages")},J.default.createElement("h4",null,s("conflictStages")),J.default.createElement("p",null,s("conflictStagesScope")),J.default.createElement("ul",null,[1,2,3].map(w=>J.default.createElement("li",{key:w},J.default.createElement("code",null,b[w])," \xB7 ",H(w)?.present?s("conflictStagePresent"):s("conflictStageAbsent"),H(w)?.kind==="gitlink"&&" \xB7 "+s("conflictStageGitlink"),H(w)?.kind==="symlink"&&" \xB7 "+s("conflictStageSymlink"),H(w)?.present&&H(w)?.notice&&" \xB7 "+H(w).notice))),J.default.createElement("label",null,s("conflictStageLeft")," ",J.default.createElement("select",{"aria-label":s("conflictStageLeft"),value:y,onChange:w=>C(Number(w.target.value))},[1,2,3].map(w=>J.default.createElement("option",{key:w,value:w},b[w])))),J.default.createElement("label",null,s("conflictStageRight")," ",J.default.createElement("select",{"aria-label":s("conflictStageRight"),value:u,onChange:w=>x(Number(w.target.value))},[1,2,3].map(w=>J.default.createElement("option",{key:w,value:w},b[w])))),S.notice&&J.default.createElement("p",{role:"status"},S.notice),K?J.default.createElement("p",{role:"status"},s("binary")):J.default.createElement(pe,{key:JSON.stringify([o,y,u,f.snapshot]),comparison:S,identity:JSON.stringify([e,t,r,o,y,u,f.snapshot]),t:s}))}var uo=Z(require("react"),1);function bt({submodule:e,t}){if(!e||typeof e.recorded!="string")return null;let r=e.checkout;return uo.default.createElement("span",{className:"vcs-submodule","data-checkout":r,title:e.recorded+" \xB7 "+t("submoduleCheckout_"+r)},t("submoduleBadge")," ",e.recorded.slice(0,10))}var _=Z(require("react"),1);function xt(e){return _.default.createElement(mr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function mr({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,_.useState)(!1),[f,d]=(0,_.useState)(null),[a,c]=(0,_.useState)(""),[h,k]=(0,_.useState)(0);return(0,_.useEffect)(()=>{if(!s)return;let y=new AbortController;return d(null),c(""),r("vcs/svn-identity",{sessionId:e,repositoryId:t},y.signal).then(C=>{y.signal.aborted||d(C)}).catch(C=>{y.signal.aborted||(c(C.message),C.code==="vcs/rediscover-required"&&i())}),()=>y.abort()},[s,e,t,h]),_.default.createElement("section",null,_.default.createElement("button",{"aria-expanded":s,onClick:()=>p(y=>!y)},o("svnIdentity")),s&&_.default.createElement(_.default.Fragment,null,_.default.createElement("p",null,o("svnOfflineIdentity")),a?_.default.createElement("p",{role:"alert"},a," ",_.default.createElement("button",{onClick:()=>k(y=>y+1)},o("retry"))):f?_.default.createElement(_.default.Fragment,null,_.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(y=>_.default.createElement(_.default.Fragment,{key:y},_.default.createElement("dt",null,y),_.default.createElement("dd",null,_.default.createElement("code",null,f[y]))))),_.default.createElement("p",{role:"status"},o("svnRemoteDisabled"))):_.default.createElement("p",{role:"status"},o("loading"))))}function $e(e,t,{now:r=Date.now,schedule:o=setTimeout,cancel:i=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=r()||e-r()>3e5)throw Error("Invalid SVN consent expiry");let s=!0,p=o(()=>{s&&(s=!1,t())},e-r());return()=>{s&&(s=!1,i(p))}}function fo(e,t=Date.now()){if(!e||typeof e.token!="string"||!/^[a-f0-9]{64}$/.test(e.token)||typeof e.snapshot!="string"||!/^(0|[1-9][0-9]*)$/.test(e.snapshot)||BigInt(e.snapshot)>9223372036854775807n||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t||e.expiresAt-t>3e5)throw Error("Invalid SVN consent response");return e}var ee=Z(require("react"),1);var G=Z(require("react"),1);function wt(e){return G.default.createElement(hr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function hr({sessionId:e,repositoryId:t,rpc:r,t:o,onApproved:i,onRediscover:s}){let[p,f]=(0,G.useState)(!1),[d,a]=(0,G.useState)(null),[c,h]=(0,G.useState)(!1),[k,y]=(0,G.useState)(""),[C,u]=(0,G.useState)(!1),[x,b]=(0,G.useState)(0);(0,G.useEffect)(()=>{if(!p)return;let m=new AbortController;return a(null),h(!1),y(""),u(!0),r("vcs/svn-describe",{sessionId:e,repositoryId:t},m.signal).then(S=>{m.signal.aborted||a(S)}).catch(S=>{m.signal.aborted||(y(S.message),S.code==="vcs/rediscover-required"&&s())}).finally(()=>{m.signal.aborted||u(!1)}),()=>m.abort()},[p,e,t,x]);let[v,g]=(0,G.useState)(0);return(0,G.useEffect)(()=>{if(!p||!d||d.expiresAt===void 0)return;let m=()=>{a(null),h(!1),g(0),u(!1),y(o("svnOfferExpired"))};try{return $e(d.expiresAt,m)}catch{m()}},[p,d]),(0,G.useEffect)(()=>{if(!v||!p||!d)return;let m=new AbortController;return u(!0),y(""),r("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:d.offer,explicit:!0},m.signal).then(S=>{m.signal.aborted||i(S)}).catch(S=>{m.signal.aborted||(y(S.message),h(!1),S.code==="vcs/rediscover-required"&&s())}).finally(()=>{m.signal.aborted||u(!1)}),()=>m.abort()},[v,p,d]),G.default.createElement("section",null,G.default.createElement("button",{"aria-expanded":p,onClick:()=>{g(0),f(m=>!m)}},o("svnConsentReview")),p&&G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,o("svnConsentScope")),k&&G.default.createElement("p",{role:"alert"},k," ",G.default.createElement("button",{disabled:C,onClick:()=>{g(0),b(m=>m+1)}},o("retry"))),d&&G.default.createElement(G.default.Fragment,null,G.default.createElement("dl",null,["origin","root","uuid","scope"].map(m=>G.default.createElement(G.default.Fragment,{key:m},G.default.createElement("dt",null,m),G.default.createElement("dd",null,G.default.createElement("code",null,d[m]))))),d.remoteEnabled?G.default.createElement(G.default.Fragment,null,G.default.createElement("label",null,G.default.createElement("input",{type:"checkbox",checked:c,disabled:C,onChange:m=>h(m.target.checked)}),o("svnConsentExplicit")),G.default.createElement("button",{disabled:C||!c,onClick:()=>g(m=>m+1)},o("svnConsentApprove"))):G.default.createElement("p",{role:"status"},o("svnRemoteDisabled"))),C&&G.default.createElement("p",{role:"status"},o("loading"))))}var A=Z(require("react"),1);function St(e){return A.default.createElement(gr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function gr({sessionId:e,repositoryId:t,token:r,snapshot:o,rpc:i,t:s,onRediscover:p}){let[f,d]=(0,A.useState)(o),[a,c]=(0,A.useState)(null),[h,k]=(0,A.useState)(null),[y,C]=(0,A.useState)(""),[u,x]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let b=new AbortController;return c(null),k(null),C(""),i("vcs/svn-log",{sessionId:e,repositoryId:t,token:r,snapshot:o,cursor:f,limit:50},b.signal).then(v=>{b.signal.aborted||c(v)}).catch(v=>{b.signal.aborted||(C(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[f,u]),A.default.createElement("section",null,A.default.createElement("p",null,s("svnHistoryScope")," \xB7 r",o),y?A.default.createElement("p",{role:"alert"},y," ",A.default.createElement("button",{onClick:()=>x(b=>b+1)},s("retry"))):a?A.default.createElement(A.default.Fragment,null,A.default.createElement("ol",null,a.entries.map(b=>A.default.createElement("li",{key:b.revision},A.default.createElement("button",{onClick:()=>k(b.revision)},"r",b.revision," \xB7 ",b.message)))),a.nextRevision!==null&&A.default.createElement("button",{onClick:()=>d(a.nextRevision)},s("historyMore"))):A.default.createElement("p",{role:"status"},s("loading")),h&&A.default.createElement(yr,{key:h,sessionId:e,repositoryId:t,token:r,snapshot:o,rpc:i,t:s,onRediscover:p,revision:h}))}function yr({sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f}){let[d,a]=(0,A.useState)(null),[c,h]=(0,A.useState)(null),[k,y]=(0,A.useState)(""),[C,u]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let x=new AbortController;return a(null),h(null),y(""),s("vcs/svn-detail",{sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i},x.signal).then(b=>{x.signal.aborted||a(b)}).catch(b=>{x.signal.aborted||(y(b.message),b.code==="vcs/rediscover-required"&&f())}),()=>x.abort()},[C]),A.default.createElement("section",null,k?A.default.createElement("p",{role:"alert"},k," ",A.default.createElement("button",{onClick:()=>u(x=>x+1)},p("retry"))):d?A.default.createElement(A.default.Fragment,null,A.default.createElement("p",null,d.message),d.changes.map(x=>A.default.createElement("div",{key:x.id},A.default.createElement("span",null,x.action," ",x.path),x.kind==="file"&&A.default.createElement(A.default.Fragment,null,A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"compare"})},p("svnHistoricalDiff")),A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"trace"})},p("fileHistory")),x.copyFromPath&&x.copyFromRevision&&A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"copytrace"})},p("svnCopyHistory")," \xB7 ",x.copyFromPath," @r",x.copyFromRevision),x.copySourceOutsideScope&&A.default.createElement("span",null,p("svnCopyOutside")))))):A.default.createElement("p",{role:"status"},p("loading")),c&&A.default.createElement(vr,{key:JSON.stringify(c),sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f,...c}))}function vr({sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,rpc:s,t:p,onRediscover:f,id:d,mode:a}){let[c,h]=(0,A.useState)(null),[k,y]=(0,A.useState)(null),[C,u]=(0,A.useState)(""),[x,b]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let v=new AbortController;return h(null),u(""),s("vcs/svn-"+a,{sessionId:e,repositoryId:t,token:r,snapshot:o,revision:i,id:d,...k===null?{}:{cursor:k}},v.signal).then(g=>{v.signal.aborted||h(g)}).catch(g=>{v.signal.aborted||(u(g.message),g.code==="vcs/rediscover-required"&&f())}),()=>v.abort()},[k,x]),C?A.default.createElement("p",{role:"alert"},C," ",A.default.createElement("button",{onClick:()=>b(v=>v+1)},p("retry"))):c?a==="compare"?c.binary?A.default.createElement("p",null,p("binary")):A.default.createElement(pe,{comparison:c,identity:JSON.stringify([e,t,o,i,d]),t:p}):A.default.createElement("section",null,A.default.createElement("p",null,p(a==="copytrace"?"svnCopyTraceScope":"svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),A.default.createElement("ol",null,c.entries.map(v=>A.default.createElement("li",{key:v.revision},"r",v.revision," \xB7 ",v.message))),c.nextRevision!==null&&A.default.createElement("button",{onClick:()=>y(c.nextRevision)},p("historyMore"))):A.default.createElement("p",{role:"status"},p("loading"))}function kt(e){return ee.default.createElement(br,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function br({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,ee.useState)(null),[f,d]=(0,ee.useState)(!1),[a,c]=(0,ee.useState)(""),[h,k]=(0,ee.useState)(0);(0,ee.useEffect)(()=>{if(s)return()=>{Promise.resolve().then(()=>r("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:s.token})).catch(()=>{})}},[s,e,t]),(0,ee.useEffect)(()=>{if(s)try{return $e(s.expiresAt,()=>{p(null),k(0),d(!1),c(o("svnExpired"))})}catch{p(null),c(o("svnExpired"))}},[s]),(0,ee.useEffect)(()=>{if(!h||!s)return;let u=new AbortController;return d(!0),c(""),r("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:s.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(x=>{u.signal.aborted||(c(x.message),x.code==="vcs/rediscover-required"&&i())}).finally(()=>{u.signal.aborted||d(!1)}),()=>u.abort()},[h,s]);let y=u=>{try{fo(u),c(""),k(0),p(u)}catch(x){c(x.message)}},C=async(...u)=>{try{return await r(...u)}catch(x){throw x.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),k(0),c(o("svnExpired"))),x}};return ee.default.createElement("section",null,!s&&a&&ee.default.createElement("p",{role:"status"},a),s?ee.default.createElement(ee.default.Fragment,null,ee.default.createElement("p",null,o("svnGrantScope")),ee.default.createElement("button",{disabled:f,onClick:()=>k(u=>u+1)},o("svnRevoke")),a&&ee.default.createElement("p",{role:"alert"},a),!f&&ee.default.createElement(St,{sessionId:e,repositoryId:t,t:o,onRediscover:i,rpc:C,token:s.token,snapshot:s.snapshot})):ee.default.createElement(wt,{sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i,onApproved:y}))}var N=Z(require("react"),1);function mo(e){let t=new Map;for(let r of e){let o=t.get(r.commit);o||(o={names:[],hidden:0},t.set(r.commit,o)),o.names.length<3?o.names.push(r.name):o.hidden++}return t}var q=Z(require("react"),1);var D=Z(require("react"),1);var W=Z(require("react"),1);var I=Z(require("react"),1);function Ct(e){return I.default.createElement(xr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function xr({sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p}){let[f,d]=(0,I.useState)(!1),[a,c]=(0,I.useState)([0]),[h,k]=(0,I.useState)(null),[y,C]=(0,I.useState)(""),[u,x]=(0,I.useState)(0),b=a.at(-1);(0,I.useEffect)(()=>{if(!f)return;let g=new AbortController;return k(null),C(""),i("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:r,path:o,offset:b},g.signal).then(m=>{g.signal.aborted||k(m)}).catch(m=>{g.signal.aborted||(C(m.message),m.code==="vcs/rediscover-required"&&p())}),()=>g.abort()},[f,b,e,t,r,o,u]);let v=(0,I.useMemo)(()=>h?{path:o,left:{label:r,text:h.text},right:{label:r,text:h.text}}:null,[h,o,r]);return I.default.createElement("section",null,I.default.createElement("button",{"aria-expanded":f,onClick:()=>d(g=>!g)},s("segments")),f&&I.default.createElement(I.default.Fragment,null,I.default.createElement("p",null,s("segmentScope")),y?I.default.createElement("p",{role:"alert"},y," ",I.default.createElement("button",{onClick:()=>x(g=>g+1)},s("retry"))):h?I.default.createElement(I.default.Fragment,null,I.default.createElement("p",null,s("segmentBytes"),": ",h.offset,"\u2013",h.endOffset," / ",h.totalBytes," \xB7 ",I.default.createElement("code",null,h.oid)),I.default.createElement("button",{disabled:a.length===1,onClick:()=>c(g=>g.slice(0,-1))},s("previous")),I.default.createElement("button",{disabled:h.nextOffset===null,onClick:()=>c(g=>[...g,h.nextOffset])},s("next")),I.default.createElement(pe,{single:!0,comparison:v,identity:JSON.stringify([e,t,r,o,b]),t:s})):I.default.createElement("p",{role:"status"},s("loading"))))}var F=Z(require("react"),1);function wr({sessionId:e,repositoryId:t,commit:r,path:o,follow:i,rpc:s,t:p,onRediscover:f,onSelectCommit:d}){let[a,c]=(0,F.useState)({commits:[],nextOffset:null}),[h,k]=(0,F.useState)(0),[y,C]=(0,F.useState)(0),[u,x]=(0,F.useState)(!0),[b,v]=(0,F.useState)("");(0,F.useEffect)(()=>{let m=new AbortController;return x(!0),v(""),s("vcs/tree-history",{sessionId:e,repositoryId:t,commit:r,path:o,offset:h,limit:50,follow:i},m.signal).then(S=>{m.signal.aborted||c(H=>({...S,commits:h?[...H.commits,...S.commits]:S.commits}))}).catch(S=>{m.signal.aborted||(v(S.message),S.code==="vcs/rediscover-required"&&f())}).finally(()=>{m.signal.aborted||x(!1)}),()=>m.abort()},[e,t,r,o,h,y,i]);let g=m=>p(m.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":m.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":m.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary");return F.default.createElement("section",{"aria-label":p("pathHistory"),"aria-busy":u},F.default.createElement("p",null,p("pathHistoryScope")),F.default.createElement("p",{style:{overflowWrap:"anywhere"}},F.default.createElement("code",null,a.path||o)," \xB7 ",F.default.createElement("code",null,r),a.followsRenames!==void 0&&F.default.createElement(F.default.Fragment,null," \xB7 ",p(a.followsRenames?"fileHistoryFollow":"pathHistoryNoFollow"))),F.default.createElement("ol",null,a.commits.map(m=>F.default.createElement("li",{key:m.id},F.default.createElement("code",{title:m.id},m.id.slice(0,10))," \xB7 ",d?F.default.createElement("button",{onClick:()=>d(m.id,m.path||o)},m.subject):m.subject,F.default.createElement("div",null,m.boundary&&F.default.createElement("span",null,g(m)," "),m.path&&F.default.createElement("code",null,m.oldPath?m.oldPath+" \u2192 ":"",m.path)," ",m.similarity!==void 0&&F.default.createElement("span",null,p("fileHistorySimilarity"),": ",m.similarity,"% \xB7 "),m.author," \xB7 ",F.default.createElement("time",{dateTime:m.date},m.date))))),u&&F.default.createElement("p",{role:"status"},p("loading")),b&&F.default.createElement("p",{role:"alert"},b," ",F.default.createElement("button",{onClick:()=>C(m=>m+1)},p("retry"))),!u&&!b&&!a.commits.length&&F.default.createElement("p",null,p("historyEmpty")),a.truncated&&F.default.createElement("p",{role:"status"},p("historyLimit")),!b&&a.nextOffset!==null&&F.default.createElement("button",{disabled:u,onClick:()=>k(a.nextOffset)},p("historyMore")))}function Nt(e){let[t,r]=(0,F.useState)(!1),[o,i]=(0,F.useState)(!1);return F.default.createElement("div",null,F.default.createElement("button",{"aria-expanded":t,onClick:()=>r(s=>!s)},e.t("pathHistory")),t&&F.default.createElement(F.default.Fragment,null,F.default.createElement("label",null,F.default.createElement("input",{type:"checkbox",checked:o,onChange:s=>i(s.target.checked)}),e.t("fileHistoryFollow")),F.default.createElement("p",null,e.t("pathHistoryFollowScope")),F.default.createElement(wr,{key:String(o),follow:o,...e})))}function Ge({sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p,onClose:f,onSelectCommit:d,line:a=null}){let[c,h]=(0,W.useState)(null),[k,y]=(0,W.useState)(""),[C,u]=(0,W.useState)(0);(0,W.useEffect)(()=>{let b=new AbortController;return h(null),y(""),i("vcs/tree-file",{sessionId:e,repositoryId:t,commit:r,path:o},b.signal).then(v=>{b.signal.aborted||h(v)}).catch(v=>{b.signal.aborted||(y(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[e,t,r,o,C]);let x=(0,W.useMemo)(()=>c?{path:o,left:{label:r,text:c.text||""},right:{label:r,text:c.text||""}}:null,[c,o,r]);return W.default.createElement("section",{"aria-label":s("treePreview")},W.default.createElement("h4",null,o),W.default.createElement("button",{onClick:f},s("treeClose")),W.default.createElement("p",null,W.default.createElement("code",null,r)),k?W.default.createElement("p",{role:"alert"},k," ",W.default.createElement("button",{onClick:()=>u(b=>b+1)},s("retry"))):c?W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,W.default.createElement("code",null,c.oid)," \xB7 ",s("encoding"),": ",c.encoding||"\u2014"),a&&W.default.createElement("p",{role:"status"},s("blameOriginLine"),": ",a,!c.text||a>c.text.split(`
96
+ `).length?" \xB7 "+s("blameUnmapped"):""),c.notice&&W.default.createElement("p",{role:"status"},c.notice),c.binary?W.default.createElement("p",null,s("binary")):c.text===""?W.default.createElement("p",null,s("treeEmpty")):W.default.createElement(pe,{single:!0,line:a,comparison:x,identity:JSON.stringify([e,t,r,o]),t:s})):W.default.createElement("p",{role:"status"},s("loading")),W.default.createElement(Ct,{sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p}),W.default.createElement(Nt,{key:JSON.stringify([e,t,r,o]),sessionId:e,repositoryId:t,commit:r,path:o,rpc:i,t:s,onRediscover:p,onSelectCommit:d}))}function ho(e=""){let t=[{path:"",name:"/"}];if(e){let r="";for(let o of e.split("/"))r=r?r+"/"+o:o,t.push({path:r,name:o})}return t}function go(e,t="",r=""){let o=t?t+"/":"",i=r.toLowerCase();return e.filter(s=>{let p=s.path.slice(o.length);return s.path.startsWith(o)&&p.length>0&&!p.includes("/")&&p.toLowerCase().includes(i)}).sort((s,p)=>+(p.type==="tree")-+(s.type==="tree")||(s.path<p.path?-1:s.path>p.path?1:0))}function Sr({sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p}){let[f,d]=(0,D.useState)(null),[a,c]=(0,D.useState)(""),[h,k]=(0,D.useState)(0),[y,C]=(0,D.useState)(""),[u,x]=(0,D.useState)(0),[b,v]=(0,D.useState)(""),[g,m]=(0,D.useState)(null);if((0,D.useEffect)(()=>{let w=new AbortController;return d(null),c(""),o("vcs/tree",{sessionId:e,repositoryId:t,commit:r},w.signal).then(T=>{w.signal.aborted||d(T)}).catch(T=>{w.signal.aborted||(c(T.message),T.code==="vcs/rediscover-required"&&s())}),()=>w.abort()},[e,t,r,h]),a)return D.default.createElement("p",{role:"alert"},a," ",D.default.createElement("button",{onClick:()=>k(w=>w+1)},i("retry")));if(!f)return D.default.createElement("p",{role:"status"},i("loading"));let S=y?y+"/":"",H=go(f.entries,y,b),K=w=>{C(w),x(0),v(""),m(null)};return D.default.createElement("section",{"aria-label":i("historicalTree")},D.default.createElement("p",null,i("historicalTreeScope")),D.default.createElement("code",null,r),D.default.createElement("p",null,y||"/"," ",y&&D.default.createElement("button",{onClick:()=>K(y.includes("/")?y.slice(0,y.lastIndexOf("/")):"")},i("treeUp"))),D.default.createElement("nav",{"aria-label":i("treeBreadcrumbs")},ho(y).map(w=>D.default.createElement(D.default.Fragment,{key:w.path},w.path&&" / ",w.path===y?D.default.createElement("span",{"aria-current":"location"},w.name):D.default.createElement("button",{onClick:()=>K(w.path)},w.name)))),D.default.createElement("label",null,i("treeSearch")," ",D.default.createElement("input",{"aria-label":i("treeSearch"),value:b,onChange:w=>{v(w.target.value),x(0),m(null)}})),D.default.createElement("p",null,H.length," ",i("treeEntries")),!H.length&&b&&D.default.createElement("p",{role:"status"},i("emptySearch")),D.default.createElement("ul",null,H.slice(u*100,u*100+100).map(w=>D.default.createElement("li",{key:w.path},w.type==="tree"?D.default.createElement("button",{onClick:()=>K(w.path)},w.path.slice(S.length),"/"):w.type==="blob"&&["100644","100755"].includes(w.mode)?D.default.createElement("button",{"aria-pressed":g===w.path,onClick:()=>m(w.path)},w.path.slice(S.length)):D.default.createElement("span",null,w.path.slice(S.length))," \xB7 ",D.default.createElement("code",null,w.mode," ",w.type," ",D.default.createElement("span",{title:w.oid},w.oid.slice(0,10)))))),u>0&&D.default.createElement("button",{onClick:()=>{x(w=>w-1),m(null)}},i("treePrevious")),(u+1)*100<H.length&&D.default.createElement("button",{onClick:()=>{x(w=>w+1),m(null)}},i("treeNext")),g&&D.default.createElement(Ge,{key:JSON.stringify([e,t,r,g]),sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p,path:g,onClose:()=>m(null)}))}function Et(e){return D.default.createElement(kr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function kr(e){let[t,r]=(0,D.useState)(!1);return D.default.createElement("div",null,D.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("historicalTree")),t&&D.default.createElement(Sr,{...e}))}var z=Z(require("react"),1);var j=Z(require("react"),1);function Cr({sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,follow:s,rpc:p,t:f,onRediscover:d,onSelectCommit:a}){let[c,h]=(0,j.useState)({commits:[],nextOffset:null}),[k,y]=(0,j.useState)(0),[C,u]=(0,j.useState)(0),[x,b]=(0,j.useState)(!0),[v,g]=(0,j.useState)("");return(0,j.useEffect)(()=>{let m=new AbortController;return b(!0),g(""),p("vcs/file-history",{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,offset:k,limit:50,follow:s},m.signal).then(S=>{m.signal.aborted||h(H=>({...S,commits:k?[...H.commits,...S.commits]:S.commits}))}).catch(S=>{m.signal.aborted||(g(S.message),S.code==="vcs/rediscover-required"&&d())}).finally(()=>{m.signal.aborted||b(!1)}),()=>m.abort()},[e,t,r,o,i,k,C]),j.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":x},j.default.createElement("p",null,f("fileHistoryScope")),j.default.createElement("p",{style:{overflowWrap:"anywhere"}},c.path," \xB7 ",j.default.createElement("code",null,r)),j.default.createElement("ol",null,c.commits.map(m=>j.default.createElement("li",{key:m.id},j.default.createElement("code",{title:m.id},m.id.slice(0,10))," \xB7 ",a?j.default.createElement("button",{onClick:()=>a(m.id,m.path||c.path)},m.subject):m.subject,j.default.createElement("div",null,m.boundary&&j.default.createElement("span",null,f(m.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":m.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":m.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary")," "),m.path&&j.default.createElement("code",null,m.oldPath?m.oldPath+" \u2192 ":"",m.path)," ",m.similarity!==void 0&&j.default.createElement("span",null,f("fileHistorySimilarity"),": ",m.similarity,"% \xB7 "),m.author," \xB7 ",j.default.createElement("time",{dateTime:m.date},m.date))))),x&&j.default.createElement("p",{role:"status"},f("loading")),v&&j.default.createElement("p",{role:"alert"},v," ",j.default.createElement("button",{onClick:()=>u(m=>m+1)},f("retry"))),!x&&!v&&!c.commits.length&&j.default.createElement("p",null,f("historyEmpty")),c.truncated&&j.default.createElement("p",{role:"status"},f("historyLimit")),!v&&c.nextOffset!==null&&j.default.createElement("button",{disabled:x,onClick:()=>y(c.nextOffset)},f("historyMore")))}function Lt(e){return j.default.createElement(Nr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.id]),...e})}function Nr(e){let[t,r]=(0,j.useState)(!1),[o,i]=(0,j.useState)(!1);return j.default.createElement("div",null,j.default.createElement("button",{"aria-expanded":t,onClick:()=>r(s=>!s)},e.t("fileHistory")),t&&j.default.createElement(j.default.Fragment,null,j.default.createElement("label",null,j.default.createElement("input",{type:"checkbox",checked:o,onChange:s=>i(s.target.checked)}),e.t("fileHistoryFollow")),j.default.createElement("p",null,e.t("fileHistoryFollowScope")),j.default.createElement(Cr,{key:String(o),follow:o,...e})))}var B=Z(require("react"),1);function Er({sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,rpc:s,t:p,onRediscover:f,onSelectCommit:d}){let[a,c]=(0,B.useState)(null),[h,k]=(0,B.useState)(""),[y,C]=(0,B.useState)(0),[u,x]=(0,B.useState)(1),[b,v]=(0,B.useState)(null);return(0,B.useEffect)(()=>{let g=new AbortController;return c(null),k(""),v(null),s("vcs/blame",{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:i,startLine:u,lineLimit:500},g.signal).then(m=>{g.signal.aborted||c(m)}).catch(m=>{g.signal.aborted||(k(m.message),m.code==="vcs/rediscover-required"&&f())}),()=>g.abort()},[e,t,r,o,i,y,u]),h?B.default.createElement("p",{role:"alert"},h," ",B.default.createElement("button",{onClick:()=>C(g=>g+1)},p("retry"))):a?B.default.createElement("section",{"aria-label":p("blame")},B.default.createElement("p",null,p("blameScope")),d&&B.default.createElement("p",null,p("blameNavigation")),a.notice&&B.default.createElement("p",{role:"status"},a.notice),a.truncated&&B.default.createElement("p",{role:"status"},p("blameLimit")),!a.notice&&!a.lines.length&&B.default.createElement("p",null,p("blameEmpty")),!!a.lines.length&&B.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},B.default.createElement("table",null,B.default.createElement("thead",null,B.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(g=>B.default.createElement("th",{key:g,scope:"col"},p(g))))),B.default.createElement("tbody",null,a.lines.map(g=>B.default.createElement("tr",{key:g.line},B.default.createElement("th",{scope:"row"},g.line),B.default.createElement("td",null,d?B.default.createElement("button",{title:g.commit,onClick:()=>d(g.commit,g.path||null)},B.default.createElement("code",null,g.commit.slice(0,10))):B.default.createElement("code",{title:g.commit},g.commit.slice(0,10))),B.default.createElement("td",null,g.author),B.default.createElement("td",null,g.summary),B.default.createElement("td",null,B.default.createElement("pre",{style:{margin:0}},g.text),g.path&&g.originalLine?B.default.createElement("button",{onClick:()=>v(g)},p("blameOriginLine"),": ",g.path,":",g.originalLine):B.default.createElement("span",null,p("blameUnmapped")))))))),B.default.createElement("p",null,a.startLine||u,"\u2013",a.lines.at(-1)?.line||u," / ",a.totalLines??"\u2014"),B.default.createElement("button",{disabled:u===1,onClick:()=>x(Math.max(1,u-500))},p("blamePrevious")),B.default.createElement("button",{disabled:a.nextLine==null,onClick:()=>x(a.nextLine)},p("blameNext")),b&&B.default.createElement(Ge,{key:JSON.stringify([b.commit,b.path,b.originalLine]),sessionId:e,repositoryId:t,rpc:s,t:p,onRediscover:f,onSelectCommit:d,commit:b.commit,path:b.path,line:b.originalLine,onClose:()=>v(null)})):B.default.createElement("p",{role:"status"},p("loading"))}function At(e){let[t,r]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("blame")),t&&B.default.createElement(Er,{...e}))}function qe(e){return z.default.createElement(Lr,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.base,e.target,e.id]),...e})}function Lr({sessionId:e,repositoryId:t,commit:r,parentIndex:o,base:i,target:s,id:p,rpc:f,t:d,onRediscover:a,onSelectCommit:c}){let[h,k]=(0,z.useState)(null),[y,C]=(0,z.useState)(""),[u,x]=(0,z.useState)(0),[b,v]=(0,z.useState)(!1);return(0,z.useEffect)(()=>{let g=new AbortController;return k(null),C(""),f(i?"vcs/revision-compare":"vcs/commit-compare",i?{sessionId:e,repositoryId:t,base:i,target:s,id:p,...b?{large:!0}:{}}:{sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,...b?{large:!0}:{}},g.signal).then(m=>{g.signal.aborted||k(m)}).catch(m=>{g.signal.aborted||(C(m.message),m.code==="vcs/rediscover-required"&&a())}),()=>g.abort()},[e,t,r,o,i,s,p,u,b]),y?z.default.createElement("p",{role:"alert"},y," ",z.default.createElement("button",{onClick:()=>x(g=>g+1)},d("retry")),b&&z.default.createElement("button",{onClick:()=>v(!1)},d("largeClose"))):h?z.default.createElement("section",null,z.default.createElement("h4",null,h.path),z.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&z.default.createElement("p",{role:"status"},h.notice),b?z.default.createElement("p",null,d("largeScope")," ",z.default.createElement("button",{onClick:()=>v(!1)},d("largeClose"))):h.notice?.includes("2 MiB")&&z.default.createElement("p",null,d("largeScope")," ",z.default.createElement("button",{onClick:()=>v(!0)},d("largeLoad"))),h.binary?z.default.createElement("p",null,d("binary")):z.default.createElement(pe,{comparison:h,identity:JSON.stringify(i?[e,t,i,s,p]:[e,t,r,o,p]),t:d}),r&&!i&&z.default.createElement(Lt,{onSelectCommit:c,key:"file-history:"+JSON.stringify([e,t,r,o,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,rpc:f,t:d,onRediscover:a}),r&&!i&&z.default.createElement(At,{onSelectCommit:c,key:"blame:"+JSON.stringify([e,t,r,o,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,id:p,rpc:f,t:d,onRediscover:a}),(r||i)&&z.default.createElement(je,{key:"image:"+JSON.stringify([e,t,r,o,i,s,p]),sessionId:e,repositoryId:t,commit:r,parentIndex:o,base:i,target:s,id:p,rpc:f,t:d,onRediscover:a})):z.default.createElement("p",{role:"status"},d("loading"),b&&z.default.createElement("button",{onClick:()=>v(!1)},d("largeClose")))}function yo(e,t){if(typeof t!="string"||!t)return null;let r=e.filter(o=>o.path===t);return r.length===1&&typeof r[0].id=="string"&&r[0].id?r[0].id:null}function vo(e,t=""){let r=t.trim().toLowerCase();return r?e.filter(o=>[o.id,o.author,o.subject].some(i=>i?.toLowerCase().includes(r))):e}function Ze(e,t=""){let r=t.trim().toLowerCase();return r?e.filter(o=>[o.path,o.oldPath].some(i=>i?.toLowerCase().includes(r))):e}function Ht(e){return q.default.createElement(Ar,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function Ar({sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p,initialPath:f}){let d=(0,q.useRef)(!0),[a,c]=(0,q.useState)(null),[h,k]=(0,q.useState)(""),[y,C]=(0,q.useState)(0),[u,x]=(0,q.useState)(null),[b,v]=(0,q.useState)(""),[g,m]=(0,q.useState)(0);if((0,q.useEffect)(()=>{let H=new AbortController;return x(null),v(""),o("vcs/commit",{sessionId:e,repositoryId:t,commit:r,parentIndex:y},H.signal).then(K=>{H.signal.aborted||(x(K),d.current&&(d.current=!1,c(yo(K.changes,f))))}).catch(K=>{H.signal.aborted||(v(K.message),K.code==="vcs/rediscover-required"&&s())}),()=>H.abort()},[e,t,r,y,g]),b)return q.default.createElement("p",{role:"alert"},b," ",q.default.createElement("button",{onClick:()=>m(H=>H+1)},i("retry")));if(!u)return q.default.createElement("p",{role:"status"},i("loading"));let S=Ze(u.changes,h);return q.default.createElement("section",{"aria-label":i("commitDetails")},q.default.createElement("h3",null,u.subject),q.default.createElement("code",null,u.id),q.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&q.default.createElement("p",{role:"status"},i("commitMessageLimit")),u.message&&q.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&q.default.createElement("label",null,i("commitParent")," ",q.default.createElement("select",{"aria-label":i("commitParent"),value:y,onChange:H=>{c(null),x(null),C(Number(H.target.value))}},u.parents.map((H,K)=>q.default.createElement("option",{key:H,value:K},K+1,": ",H.slice(0,10))))),q.default.createElement("p",null,u.parent||i("commitRoot")," \u2192 ",u.id.slice(0,10)),q.default.createElement("label",null,i("commitFileSearch")," ",q.default.createElement("input",{"aria-label":i("commitFileSearch"),value:h,onChange:H=>{k(H.target.value),c(null)}})),q.default.createElement("span",null," ",S.length," / ",u.changes.length),q.default.createElement("ul",null,S.map(H=>q.default.createElement("li",{key:H.id},q.default.createElement("button",{"aria-pressed":a===H.id,onClick:()=>c(H.id)},H.status," \xB7 ",H.oldPath?H.oldPath+" \u2192 ":"",H.path)))),!!u.changes.length&&!S.length&&q.default.createElement("p",{role:"status"},i("emptySearch")),!u.changes.length&&q.default.createElement("p",null,i("commitNoChanges")),a&&q.default.createElement(qe,{key:a,sessionId:e,repositoryId:t,commit:r,parentIndex:y,id:a,onSelectCommit:p,rpc:o,t:i,onRediscover:s}),q.default.createElement(Et,{key:JSON.stringify([e,t,r]),sessionId:e,repositoryId:t,commit:r,rpc:o,t:i,onRediscover:s,onSelectCommit:p}))}var X=Z(require("react"),1);function bo(e){if(!Array.isArray(e))throw new Error("Invalid graph commits");let t=e.slice(0,200),r=new Map,o=[],i=[],s=f=>typeof f=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(f);for(let[f,d]of t.entries()){if(!d||!s(d.id)||!Array.isArray(d.parents)||r.has(d.id))throw new Error("Invalid graph node");r.set(d.id,f),o.push({id:d.id,row:f})}let p=!1;for(let f of t){let d=new Set;for(let a of f.parents){if(i.length===1e3){p=!0;break}if(!s(a)||a.length!==f.id.length||a===f.id||d.has(a))throw new Error("Invalid graph parent");d.add(a);let c=r.get(a);if(c!==void 0&&c<=r.get(f.id))throw new Error("Graph requires child-before-parent order");i.push({from:f.id,to:a,missing:c===void 0})}if(p)break}return{nodes:o,edges:i,nodesTruncated:e.length>200,edgesTruncated:p}}function xo(e){let t=Array(32).fill(null),r=new Map,o=[],i=new Set,s=!1,p=a=>{if(i.has(a))return null;let c=t.indexOf(a);return c>=0?c:(c=t.indexOf(null),c<0?(s=!0,i.add(a),null):(t[c]=a,c))},f=new Map;for(let a of e.edges){if(a.missing)continue;let c=f.get(a.from)||[];c.push(a.to),f.set(a.from,c)}for(let a of e.nodes){let c=p(a.id);if(r.set(a.id,{...a,lane:c}),o.push({...a,lane:c}),c===null)continue;t[c]=null;let h=f.get(a.id)||[];for(let[k,y]of h.entries())t.includes(y)||(k===0&&t[c]===null?t[c]=y:p(y))}let d=e.edges.filter(a=>!a.missing).flatMap(a=>{let c=r.get(a.from),h=r.get(a.to);return c.lane===null||h.lane===null?[]:[{...a,start:c.row,end:h.row,fromLane:c.lane,toLane:h.lane}]});return{nodes:o,edges:d,lanesTruncated:s,laneCount:Math.max(1,...o.map(a=>(a.lane??0)+1))}}function Hr({commits:e,selected:t,onSelect:r,t:o}){let i;try{i=bo(e)}catch{return X.default.createElement("p",{role:"alert"},o("graphInvalid"))}let s=xo(i),p=s.edges,f=Math.max(100,24+18*s.laneCount),d=Math.max(40,i.nodes.length*36);return X.default.createElement("section",{"aria-label":o("historyGraph")},X.default.createElement("p",null,o("graphScope")),s.lanesTruncated&&X.default.createElement("p",{role:"status"},o("graphLaneLimit")),(i.nodesTruncated||i.edgesTruncated)&&X.default.createElement("p",{role:"status"},o("graphLimit")),X.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},X.default.createElement("svg",{width:f,height:d,"aria-hidden":"true",style:{flexShrink:0}},p.map(a=>{let c=a.start*36+18,h=a.end*36+18,k=12+a.fromLane*18,y=12+a.toLane*18;return X.default.createElement("path",{key:a.from+a.to,d:"M "+k+" "+c+" C "+k+" "+(c+18)+", "+y+" "+(h-18)+", "+y+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),s.nodes.filter(a=>a.lane!==null).map(a=>X.default.createElement("circle",{key:a.id,cx:12+a.lane*18,cy:a.row*36+18,r:"4",fill:"currentColor"}))),X.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},i.nodes.map(a=>X.default.createElement("li",{key:a.id,style:{height:36,whiteSpace:"nowrap"}},X.default.createElement("button",{title:a.id,"aria-current":t===a.id?!0:void 0,style:t===a.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:c=>{if(c.altKey||c.ctrlKey||c.metaKey||c.shiftKey)return;let h=c.key==="ArrowDown"?Math.min(a.row+1,i.nodes.length-1):c.key==="ArrowUp"?Math.max(0,a.row-1):c.key==="Home"?0:c.key==="End"?i.nodes.length-1:null;h!==null&&(c.preventDefault(),c.stopPropagation(),c.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>r(a.id)},X.default.createElement("code",null,a.id.slice(0,10))," ",e[a.row].subject))))),X.default.createElement("details",null,X.default.createElement("summary",null,o("graphRelations")),X.default.createElement("ul",null,i.edges.map(a=>X.default.createElement("li",{key:a.from+a.to},X.default.createElement("code",null,a.from)," \u2192 ",X.default.createElement("code",null,a.to),a.missing?" \xB7 "+o("graphMissing"):"")))))}function Pt(e){let[t,r]=(0,X.useState)(!1);return X.default.createElement("div",null,X.default.createElement("button",{"aria-expanded":t,onClick:()=>r(o=>!o)},e.t("historyGraph")),t&&X.default.createElement(Hr,{...e}))}var O=Z(require("react"),1);function Pr({sessionId:e,repositoryId:t,base:r,target:o,rpc:i,t:s,onRediscover:p}){let[f,d]=(0,O.useState)(null),[a,c]=(0,O.useState)(""),[h,k]=(0,O.useState)(0),[y,C]=(0,O.useState)(null),[u,x]=(0,O.useState)("");if((0,O.useEffect)(()=>{let v=new AbortController;return d(null),c(""),C(null),i("vcs/revision-changes",{sessionId:e,repositoryId:t,base:r,target:o},v.signal).then(g=>{v.signal.aborted||d(g)}).catch(g=>{v.signal.aborted||(c(g.message),g.code==="vcs/rediscover-required"&&p())}),()=>v.abort()},[e,t,r,o,h]),a)return O.default.createElement("p",{role:"alert"},a," ",O.default.createElement("button",{onClick:()=>k(v=>v+1)},s("retry")));if(!f)return O.default.createElement("p",{role:"status"},s("loading"));let b=Ze(f.changes,u);return O.default.createElement("div",null,O.default.createElement("label",null,s("commitFileSearch")," ",O.default.createElement("input",{"aria-label":s("commitFileSearch"),value:u,onChange:v=>{x(v.target.value),C(null)}})),O.default.createElement("span",null," ",b.length," / ",f.changes.length),!!f.changes.length&&!b.length&&O.default.createElement("p",{role:"status"},s("emptySearch")),!f.changes.length&&O.default.createElement("p",null,s("revisionEmpty")),O.default.createElement("ul",null,b.map(v=>O.default.createElement("li",{key:v.id},O.default.createElement("button",{"aria-pressed":y===v.id,onClick:()=>C(v.id)},v.status," \xB7 ",v.oldPath?v.oldPath+" \u2192 ":"",v.path)))),y&&O.default.createElement(qe,{key:y,sessionId:e,repositoryId:t,base:r,target:o,id:y,rpc:i,t:s,onRediscover:p}))}function Ot(e){return O.default.createElement(Or,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Or({commits:e,sessionId:t,repositoryId:r,rpc:o,t:i,onRediscover:s,onReferencesLoaded:p}){let[f,d]=(0,O.useState)(""),[a,c]=(0,O.useState)(""),[h,k]=(0,O.useState)([]),[y,C]=(0,O.useState)(!1),[u,x]=(0,O.useState)(0),[b,v]=(0,O.useState)(!1),[g,m]=(0,O.useState)("");return(0,O.useEffect)(()=>{if(!u)return;let S=new AbortController;return v(!0),m(""),o("vcs/references",{sessionId:t,repositoryId:r},S.signal).then(H=>{S.signal.aborted||(k(H.references),C(!0),p?.(H.references))}).catch(H=>{S.signal.aborted||(m(H.message),H.code==="vcs/rediscover-required"&&s())}).finally(()=>{S.signal.aborted||v(!1)}),()=>S.abort()},[t,r,u]),O.default.createElement("section",{"aria-label":i("revisionTitle")},O.default.createElement("h3",null,i("revisionTitle")),O.default.createElement("p",null,i("revisionScope")),O.default.createElement("button",{disabled:b,onClick:()=>x(S=>S+1)},i("revisionLoadRefs")),O.default.createElement("p",null,i("revisionRefsScope")),y&&!b&&!g&&O.default.createElement("p",{role:"status"},h.length?`${i("revisionRefsCount")}: ${h.length}`:i("revisionRefsEmpty")),b&&O.default.createElement("p",{role:"status"},i("loading")),g&&O.default.createElement("p",{role:"alert"},g),[[f,d,"revisionBase"],[a,c,"revisionTarget"]].map(([S,H,K])=>O.default.createElement("label",{key:K},i(K)," ",O.default.createElement("select",{"aria-label":i(K),value:S,onChange:w=>H(w.target.value)},O.default.createElement("option",{value:""},"\u2014"),!!e.length&&O.default.createElement("optgroup",{label:i("revisionLoadedCommits")},e.map(w=>O.default.createElement("option",{key:w.id,value:w.id},w.id.slice(0,10)," \xB7 ",w.subject))),!!h.length&&O.default.createElement("optgroup",{label:i("revisionLocalRefs")},h.map(w=>O.default.createElement("option",{key:w.name,value:w.commit},w.name," \xB7 ",w.commit.slice(0,10)))),S&&!e.some(w=>w.id===S)&&!h.some(w=>w.commit===S)&&O.default.createElement("option",{value:S},S)))),O.default.createElement("button",{disabled:!f||!a,onClick:()=>{d(a),c(f)}},i("revisionSwap")),O.default.createElement("p",{style:{overflowWrap:"anywhere"}},O.default.createElement("code",null,f||"\u2014")," \u2192 ",O.default.createElement("code",null,a||"\u2014")),f&&a&&O.default.createElement(Pr,{key:JSON.stringify([t,r,f,a]),sessionId:t,repositoryId:r,base:f,target:a,rpc:o,t:i,onRediscover:s}))}function wo(e,t,r){let o=r?[...e.commits.filter(i=>!t.commits.some(s=>s.id===i.id)),...t.commits]:t.commits;return{...t,windowEnd:r+t.commits.length,commits:o.slice(-200)}}function Bt(e){return N.default.createElement(Br,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Br({sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i}){let[s,p]=(0,N.useState)({id:null,path:null,revision:0}),[f,d]=(0,N.useState)(""),[a,c]=(0,N.useState)(null),[h,k]=(0,N.useState)(""),[y,C]=(0,N.useState)(""),u=P=>{let oe=(a||[]).find(re=>JSON.stringify([re.name,re.commit])===P)?.commit||"";C(P),k(oe),g(re=>re?{...re,snapshot:oe||null}:null),ne(0),d(""),w(null),ue({commits:[],snapshot:null,nextOffset:null})},[x,b]=(0,N.useState)({message:"",author:"",path:"",since:"",until:""}),[v,g]=(0,N.useState)(null),m=P=>{g({values:P,snapshot:T.snapshot}),ne(0),d(""),w(null),ue(Y=>({...Y,commits:[],nextOffset:null}))},S=(0,N.useMemo)(()=>mo(a||[]),[a]),H=s.id,K=(P,Y=null)=>p(oe=>({id:P,path:Y,revision:oe.revision+1})),w=(P,Y=null)=>p(oe=>({id:P,path:Y,revision:oe.revision+(Y||oe.path?1:0)})),[T,ue]=(0,N.useState)({commits:[],snapshot:null,nextOffset:null}),[M,ne]=(0,N.useState)(0),[E,R]=(0,N.useState)(0),[le,He]=(0,N.useState)(!0),[ke,Pe]=(0,N.useState)("");(0,N.useEffect)(()=>{let P=new AbortController;return He(!0),Pe(""),r("vcs/history",{sessionId:e,repositoryId:t,offset:M,limit:50,...v?{search:v.values}:{},...v?.snapshot||h||M?{snapshot:v?.snapshot||h||T.snapshot}:{}},P.signal).then(Y=>{P.signal.aborted||(ue(oe=>wo(oe,Y,M)),M>=200&&(w(null),d("")))}).catch(Y=>{P.signal.aborted||(Pe(Y.message),Y.code==="vcs/rediscover-required"&&i())}).finally(()=>{P.signal.aborted||He(!1)}),()=>P.abort()},[e,t,M,E,v,h]);let fe=vo(T.commits,f);return N.default.createElement("section",{className:"vcs-history","aria-label":o("history"),"aria-busy":le},N.default.createElement("div",{className:"vcs-history-list"},N.default.createElement("p",null,o("historyListOnly")),a!==null&&N.default.createElement("p",null,o("historyRefsScope")),N.default.createElement("label",null,o("historyBranch")," ",N.default.createElement("select",{"aria-label":o("historyBranch"),value:y,disabled:le,onChange:P=>u(P.target.value)},N.default.createElement("option",{value:""},"HEAD"),y&&!(a||[]).some(P=>JSON.stringify([P.name,P.commit])===y)&&N.default.createElement("option",{value:y},JSON.parse(y)[0]," \xB7 ",h.slice(0,10)," \xB7 ",o("historyPinned")),(a||[]).map(P=>{let Y=JSON.stringify([P.name,P.commit]);return N.default.createElement("option",{key:Y,value:Y},P.name," \xB7 ",P.commit.slice(0,10))}))),N.default.createElement("p",null,o("historyBranchScope"),h&&N.default.createElement(N.default.Fragment,null," \xB7 ",N.default.createElement("code",null,h))),N.default.createElement("form",{"aria-label":o("historyServerSearch"),onSubmit:P=>{P.preventDefault(),m({...x})}},N.default.createElement("fieldset",{disabled:le},N.default.createElement("legend",null,o("historyServerSearch")),N.default.createElement("p",null,o("historyServerScope")),["message","author","path","since","until"].map(P=>N.default.createElement("label",{key:P},o("historyServer_"+P)," ",N.default.createElement("input",{maxLength:P==="since"||P==="until"?40:1024,placeholder:P==="since"||P==="until"?"YYYY-MM-DD[THH:MM[:SS][\xB1HH:MM]]":void 0,"aria-label":o("historyServer_"+P),value:x[P],onChange:Y=>b(oe=>({...oe,[P]:Y.target.value}))}))),N.default.createElement("button",{type:"submit"},o("historyServerApply")),N.default.createElement("button",{type:"button",onClick:()=>{b({message:"",author:"",path:"",since:"",until:""}),m({})}},o("historyServerClear")))),v&&N.default.createElement("p",{role:"status"},o("historyServerActive"),": ",JSON.stringify(v.values)," \xB7 ",N.default.createElement("code",null,v.snapshot||T.snapshot)),N.default.createElement("label",null,o("historySearch")," ",N.default.createElement("input",{"aria-label":o("historySearch"),value:f,onChange:P=>{d(P.target.value),w(null)}})),N.default.createElement("span",null," ",fe.length," / ",T.commits.length),!!T.commits.length&&N.default.createElement("p",{role:"status"},o("historyWindow"),": ",Math.max(0,(T.windowEnd??T.commits.length)-T.commits.length),"\u2013",T.windowEnd??T.commits.length," \xB7 ",o("historyWindowScope")),!!T.commits.length&&!fe.length&&N.default.createElement("p",{role:"status"},o("historyNoMatch")),N.default.createElement("ol",null,fe.map(P=>N.default.createElement("li",{key:P.id},N.default.createElement("button",{"aria-pressed":H===P.id,onClick:()=>w(P.id)},P.subject),N.default.createElement("div",null,N.default.createElement("code",{title:P.id},P.id.slice(0,10))," \xB7 ",P.author," \xB7 ",N.default.createElement("time",{dateTime:P.date},P.date)),S.has(P.id)&&N.default.createElement("div",{"aria-label":o("historyRefsLabel"),style:{overflowWrap:"anywhere"}},S.get(P.id).names.map(Y=>N.default.createElement("span",{key:Y},N.default.createElement("code",null,Y)," ")),S.get(P.id).hidden>0&&N.default.createElement("span",null,o("historyRefsMore"),": ",S.get(P.id).hidden))))),le&&N.default.createElement("p",{role:"status"},o("loading")),ke&&N.default.createElement("p",{role:"alert"},ke," ",N.default.createElement("button",{onClick:()=>R(P=>P+1)},o("retry"))),!le&&!ke&&!T.commits.length&&N.default.createElement("p",null,o("historyEmpty")),T.truncated&&N.default.createElement("p",{role:"status"},o("historyLimit")),!ke&&T.nextOffset!==null&&N.default.createElement("button",{disabled:le,onClick:()=>ne(T.nextOffset)},o("historyMore")),!!T.commits.length&&N.default.createElement(Pt,{commits:T.commits,selected:H,onSelect:w,t:o}),N.default.createElement(Ot,{onReferencesLoaded:c,commits:T.commits,sessionId:e,repositoryId:t,rpc:r,t:o,onRediscover:i})),N.default.createElement("div",{className:"vcs-history-details"},H&&N.default.createElement(Ht,{key:JSON.stringify([H,s.revision]),initialPath:s.path,sessionId:e,repositoryId:t,commit:H,onSelectCommit:K,rpc:r,t:o,onRediscover:i})))}var So={zh:{svnOfferExpired:"\u7F51\u7EDC\u8BBF\u95EE\u63D0\u6848\u5DF2\u8FC7\u671F\uFF1B\u8BF7\u624B\u52A8\u91CD\u8BD5\uFF0C\u5E76\u91CD\u65B0\u52FE\u9009\u540C\u610F\u3002",svnExpired:"SVN \u7F51\u7EDC\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u5386\u53F2\u8BF7\u6C42\u5DF2\u505C\u6B62\uFF1B\u8BF7\u91CD\u65B0\u5BA1\u9605\u5E76\u540C\u610F\u3002",svnConsentReview:"\u5BA1\u9605 SVN \u7F51\u7EDC\u8BBF\u95EE\u8303\u56F4",svnConsentScope:"\u540C\u610F\u524D\u4EC5\u8BFB\u53D6\u672C\u5730\u8EAB\u4EFD\u3002\u6388\u6743\u53EA\u9002\u7528\u4E8E\u6240\u5217\u4ED3\u5E93\u3001Session \u4E0E\u76EE\u5F55\uFF0C\u4E94\u5206\u949F\u6709\u6548\uFF1B\u4E0D\u6388\u6743\u91CD\u5B9A\u5411\u6216\u5199\u64CD\u4F5C\u3002",svnConsentExplicit:"\u6211\u540C\u610F\u8BBF\u95EE\u4EE5\u4E0A HTTPS SVN \u4ED3\u5E93",svnConsentApprove:"\u540C\u610F\u5E76\u8BFB\u53D6\u5386\u53F2",svnHistoryScope:"\u56FA\u5B9A\u672C\u5730 revision \u5FEB\u7167\u7684 SVN \u5386\u53F2\uFF1B\u5206\u9875\u66FF\u6362\u663E\u793A",svnHistoricalDiff:"\u5386\u53F2\u53EA\u8BFB Diff",svnCopyHistory:"\u67E5\u770B\u590D\u5236\u6765\u6E90\u5386\u53F2",svnCopyOutside:"\u590D\u5236\u6765\u6E90\u5728\u6388\u6743\u8303\u56F4\u5916\uFF0C\u4E0D\u80FD\u6253\u5F00",svnCopyTraceScope:"\u5355\u72EC\u67E5\u770B\u8303\u56F4\u5185\u56FA\u5B9A\u6765\u6E90\uFF0C\u4ECD\u6B62\u4E8E\u5176\u590D\u5236\u8FB9\u754C\uFF1B\u4E0D\u662F\u81EA\u52A8\u8FFD\u6EAF",svnTraceScope:"\u6587\u4EF6\u8FFD\u6EAF\u5728\u590D\u5236\u8FB9\u754C\u505C\u6B62\uFF0C\u4E0D\u8DDF\u968F\u8303\u56F4\u5916\u6765\u6E90",svnGrantScope:"\u7F51\u7EDC\u6388\u6743\u4E94\u5206\u949F\u6709\u6548\uFF1B\u53EF\u968F\u65F6\u64A4\u9500\uFF0C\u5386\u53F2\u64CD\u4F5C\u4E0D\u4FEE\u6539\u5DE5\u4F5C\u526F\u672C\u3002",svnRevoke:"\u64A4\u9500 SVN \u7F51\u7EDC\u6388\u6743",svnIdentity:"\u67E5\u770B SVN \u672C\u5730\u5386\u53F2\u8BBF\u95EE\u8EAB\u4EFD",svnOfflineIdentity:"\u4EC5\u4ECE\u6388\u6743\u5DE5\u4F5C\u526F\u672C\u8BFB\u53D6\u672C\u5730\u5143\u6570\u636E\uFF0C\u4E0D\u53D1\u8D77\u8FDC\u7A0B\u8BF7\u6C42\u3002",svnRemoteDisabled:"\u8FDC\u7A0B SVN \u5386\u53F2\u4F20\u8F93\u5C1A\u672A\u542F\u7528\uFF1B\u6CA1\u6709\u7F51\u7EDC\u6388\u6743\u6216\u53EF\u7528\u8BBF\u95EE\u51ED\u636E\u3002\u672C\u9875\u4E0D\u662F\u5DF2\u6388\u6743\u5386\u53F2\u5165\u53E3\u3002",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",fileHistorySimilarity:"Git\u76F8\u4F3C\u5EA6",fileHistoryAmbiguous:"\u591A\u4E2A\u5019\u9009\u6765\u6E90\uFF0C\u6B64\u5904\u505C\u6B62\u8FFD\u6EAF",fileHistoryRenameLimit:"\u5DF2\u8FBE32\u6B21\u91CD\u547D\u540D\u786E\u8BA4\u4E0A\u9650\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u8DDF\u968FGit\u68C0\u51FA\u7684\u91CD\u547D\u540D\uFF1B50%\u4EE5\u4E0A\u76F8\u4F3C\u91CD\u547D\u540D\u989D\u5916\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u548C\u5408\u5E76\u5904\u505C\u6B62\u3002\u76F8\u4F3C\u5EA6\u4E0D\u662F\u8EAB\u4EFD\u4FDD\u8BC1\uFF1B\u6BCF\u6761\u8BB0\u5F55\u4F7F\u7528\u5F53\u65F6\u8DEF\u5F84\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\u65F6\u95F4\u8FB9\u754C\u6309\u63D0\u4EA4\u65F6\u95F4(committer date)\u8FC7\u6EE4\u4E14\u542B\u8FB9\u754C\uFF0C\u4F7F\u7528 --since-as-filter \u907F\u514D\u975E\u5355\u8C03\u5386\u53F2\u88AB\u63D0\u524D\u622A\u65AD\uFF1B\u65E0\u65F6\u533A\u6309\u8FD0\u884C\u673A\u5668\u672C\u5730\u65F6\u533A\u89E3\u91CA\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",historyServer_since:"\u5F00\u59CB\u65F6\u95F4\uFF08\u542B\uFF09",historyServer_until:"\u7ED3\u675F\u65F6\u95F4\uFF08\u542B\uFF09",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",conflictStages:"Index \u51B2\u7A81\u9636\u6BB5",conflictStagesScope:"\u624B\u52A8\u8BFB\u53D6\u6240\u9009\u51B2\u7A81\u7684 Index \u9636\u6BB51\uFF0F2\uFF0F3\uFF1B\u9636\u6BB5\u7F16\u53F7\u53EA\u8868\u793A Index \u8EAB\u4EFD\uFF0C\u4E0D\u58F0\u79F0\u5408\u5E76\uFF0F\u53D8\u57FA\u5F52\u5C5E\u3002\u7F3A\u5931\u9636\u6BB5\u663E\u793A\u4E3A\u7A7A\uFF0C\u4E0D\u63A8\u65AD\u5185\u5BB9\uFF1B\u4E0D\u8BFB\u53D6\u5DE5\u4F5C\u6587\u4EF6\uFF0C\u4E0D\u89E3\u51B3\u51B2\u7A81\u3002",conflictStage1:"\u9636\u6BB51\uFF08BASE\uFF09",conflictStage2:"\u9636\u6BB52\uFF08ours\uFF09",conflictStage3:"\u9636\u6BB53\uFF08theirs\uFF09",conflictStagePresent:"\u5B58\u5728",conflictStageAbsent:"\u7F3A\u5931\uFF08\u663E\u793A\u4E3A\u7A7A\uFF09",conflictStageGitlink:"\u5B50\u6A21\u5757\u63D0\u4EA4\u5F15\u7528\uFF0C\u4E0D\u52A0\u8F7D\u5185\u5BB9",conflictStageSymlink:"\u94FE\u63A5\u76EE\u6807\u6587\u672C\uFF0C\u4E0D\u8DDF\u968F",conflictStageLeft:"\u5DE6\u4FA7\u9636\u6BB5",conflictStageRight:"\u53F3\u4FA7\u9636\u6BB5",conflictStageMissing:"\u6240\u9009\u9636\u6BB5\u7F3A\u5931\uFF0C\u6309\u7A7A\u5185\u5BB9\u6BD4\u8F83\uFF1B\u4E0D\u63A8\u65AD\u539F\u59CB\u5185\u5BB9\u3002",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",workspaceLargeScope:"Git\u5DE5\u4F5C\u533A\u5B8C\u6574UTF-8\u6BD4\u8F83\uFF0C\u6BCF\u4FA78MiB\uFF0F10\u4E07\u884C\uFF1B\u8BFB\u53D6\u671F\u95F4\u53D8\u5316\u4F1A\u62D2\u7EDD\u7ED3\u679C\uFF0C\u6210\u529F\u540E\u6587\u4EF6\u4ECD\u53EF\u88AB\u5916\u90E8\u4FEE\u6539\u3002",largeLoad:"\u52A0\u8F7D\u5B8C\u6574\u5927\u6587\u4EF6\u6BD4\u8F83",largeClose:"\u53D6\u6D88\u5927\u6587\u4EF6\u6A21\u5F0F",largeScope:"\u4EC5Git\u5386\u53F2UTF-8\u666E\u901A\u6587\u4EF6\uFF0C\u6BCF\u4FA7\u6700\u591A8MiB\u300110\u4E07\u884C\uFF1B\u4E0D\u662F\u5DE5\u4F5C\u533A\u6216SVN\u5927\u6587\u4EF6\u3002",diffPending:"\u6B63\u5728\u8BA1\u7B97\u5DEE\u5F02\uFF0C\u5C1A\u4E0D\u80FD\u5224\u65AD\u662F\u5426\u76F8\u540C\u3002",diffIncomplete:"\u5DEE\u5F02\u8BA1\u7B97\u672A\u5B8C\u6210\u6216\u8D85\u65F6\uFF0C\u5F53\u524D\u7ED3\u679C\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002",diffComplete:"\u5DEE\u5F02\u8BA1\u7B97\u5B8C\u6210\u3002",largeFallback:"\u57FA\u7840\u89C6\u56FE\u53EA\u5C55\u793A\u6709\u754C\u7247\u6BB5\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5927\u6587\u4EF6\u5DEE\u5F02\u3002",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",pathHistory:"\u6B64\u8DEF\u5F84\u5386\u53F2",submoduleBadge:"\u5B50\u6A21\u5757",submoduleCheckout_initialized:"\u5B58\u5728\u672C\u5730Git\u6807\u8BB0\uFF08\u672A\u9A8C\u8BC1\u68C0\u51FA\u6709\u6548\u6027\uFF09",submoduleCheckout_uninitialized:"\u672C\u5730\u672A\u521D\u59CB\u5316",submoduleCheckout_absent:"\u672C\u5730\u76EE\u5F55\u7F3A\u5931",submoduleCheckout_unreadable:"\u672C\u5730\u72B6\u6001\u4E0D\u53EF\u8BFB",submoduleScope:"\u9884\u89C8\u53EA\u663E\u793AIndex\u8BB0\u5F55\u7684\u63D0\u4EA4\u6307\u9488\u4E0E\u672C\u5730Git\u6807\u8BB0\u5B58\u5728\u72B6\u6001\uFF0C\u4E0D\u989D\u5916\u89E3\u6790\u5B50\u6A21\u5757HEAD\u6216\u52A0\u8F7D\u5185\u5BB9\u3002Git\u72B6\u6001\u626B\u63CF\u672C\u8EAB\u53EF\u80FD\u68C0\u67E5\u5B50\u6A21\u5757HEAD\u548C\u810F\u72B6\u6001\uFF1B\u4E0D\u66F4\u65B0\u6216\u540C\u6B65\u3002",pathHistoryScope:"\u624B\u52A8\u8BFB\u53D6\u6240\u9009\u5386\u53F2\u8DEF\u5F84\u5728\u8BE5\u63D0\u4EA4\u4E0B\u7684\u6587\u4EF6\u5386\u53F2\uFF1B\u8DEF\u5F84\u5FC5\u987B\u5B58\u5728\u4E8E\u8BE5\u63D0\u4EA4\u3002\u5173\u95ED\u8DDF\u968F\u65F6\u4E0D\u8DE8\u91CD\u547D\u540D\u3002",pathHistoryNoFollow:"\u672A\u8DDF\u968F\u91CD\u547D\u540D",pathHistoryFollowScope:"\u8DDF\u968F\u6CBF\u7528\u540C\u4E00\u4FDD\u5B88\u89C4\u5219\uFF1A\u7B2C\u4E00\u7236\u94FE\u3001Git\u76F8\u4F3C\u5EA6\u81F3\u5C1150%\u3001\u6BCF\u6B21\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u621632\u6B21\u786E\u8BA4\u4E0A\u9650\u5904\u505C\u6B62\uFF1B\u53EA\u9002\u7528\u4E8E\u63D0\u4EA4\u4E2D\u7684\u666E\u901A\u6587\u4EF6\u6216\u94FE\u63A5\u3002",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\uFF0C\u5E76\u5C1D\u8BD5\u9009\u4E2D\u8BE5\u63D0\u4EA4\u53D8\u66F4\u4E2D\u8DEF\u5F84\u5B8C\u5168\u4E00\u81F4\u7684\u552F\u4E00\u6587\u4EF6\uFF08\u4E0D\u4F1A\u731C\u6D4B\u91CD\u547D\u540D\u6216\u65E7\u8DEF\u5F84\uFF09\uFF1B\u65E0\u552F\u4E00\u5339\u914D\u65F6\u4E0D\u9884\u9009\u6587\u4EF6\u3002\u9ED8\u8BA4\u4F7F\u7528\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\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\u9759\u6001VP8\uFF0F\u65E0\u635FVP8L 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:"\u672C\u5730\u5206\u652F\u3001\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\u53CA\u672C\u5730\u7F13\u5B58\u7684\u8FDC\u7A0B\u8DDF\u8E2A\u5F15\u7528\uFF0C\u5171\u6700\u591A1000\u6761\uFF1B\u4E0D\u8FDE\u63A5\u8FDC\u7AEF\u6216fetch\uFF0C\u8FDC\u7A0B\u7F13\u5B58\u53EF\u80FD\u8FC7\u671F\u3002\u91CD\u65B0\u52A0\u8F7D\u65F6\uFF0Corigin/HEAD \u663E\u793A\u5B83\u5F53\u524D\u6307\u5411\u7684\u672C\u5730\u63D0\u4EA4\uFF1B\u5DF2\u9009\u5386\u53F2\u548C\u7248\u672C\u4ECD\u56FA\u5B9A\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\u5F15\u7528\uFF08\u542B\u8FDC\u7A0B\u7F13\u5B58\uFF09",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{svnOfferExpired:"Network access offer expired. Retry manually and check consent again.",svnExpired:"SVN network consent expired; history requests stopped. Review and consent again.",svnConsentReview:"Review SVN network access",svnConsentScope:"Before consent, read local identity only. Access binds this repository, Session and cwd for five minutes; redirects and writes are not authorized.",svnConsentExplicit:"I consent to access the HTTPS SVN repository above",svnConsentApprove:"Consent and read history",svnHistoryScope:"SVN history at a fixed local revision snapshot; pages replace displayed rows",svnHistoricalDiff:"Historical read-only Diff",svnCopyHistory:"View copy source history",svnCopyOutside:"Copy source is outside the authorized scope",svnCopyTraceScope:"Separate fixed in-scope source history, stopping at its copy boundary; not automatic tracing",svnTraceScope:"File trace stops at copy boundaries and does not follow out-of-scope sources",svnGrantScope:"Network consent lasts five minutes; revoke at any time. History operations do not modify the working copy.",svnRevoke:"Revoke SVN network consent",svnIdentity:"Inspect local SVN history identity",svnOfflineIdentity:"Read local metadata from the authorized working copy only; no remote request.",svnRemoteDisabled:"Remote SVN history transport is not enabled; no network grant or usable access token. This is not an authorized history entry point.",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",fileHistorySimilarity:"Git similarity",fileHistoryAmbiguous:"Multiple candidate origins; tracing stopped here",fileHistoryRenameLimit:"32 rename confirmations reached; tracing stopped here",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow renames (first-parent)",fileHistoryFollowScope:"Git-detected renames; similarities of 50% or more require a unique deletion/addition transition. Stops at ambiguity, copies and merges. Similarity is not an identity guarantee; rows use historical paths.",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. Date bounds filter on committer date inclusively and use --since-as-filter to avoid early termination on non-monotonic history; boundary dates without a timezone use the runner local zone. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServer_since:"Since (inclusive)",historyServer_until:"Until (inclusive)",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",conflictStages:"Index conflict stages",conflictStagesScope:"Manually reads Index stages 1/2/3 of the selected conflict. Stage numbers are Index identities, not merge/rebase ownership claims. Missing stages show as empty and are never inferred; the working file is not read and the conflict is not resolved.",conflictStage1:"Stage 1 (BASE)",conflictStage2:"Stage 2 (ours)",conflictStage3:"Stage 3 (theirs)",conflictStagePresent:"present",conflictStageAbsent:"absent (shown empty)",conflictStageGitlink:"submodule commit reference, contents not loaded",conflictStageSymlink:"link target text, not followed",conflictStageLeft:"Left stage",conflictStageRight:"Right stage",conflictStageMissing:"A selected stage is absent, so it is compared as empty; original content is not inferred.",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",workspaceLargeScope:"Complete Git working-copy UTF-8 comparison: 8 MiB / 100000 lines per side. Changes during loading reject the result; external edits remain possible afterward.",largeLoad:"Load complete large-file comparison",largeClose:"Cancel large-file mode",largeScope:"Git historical UTF-8 regular files only: 8 MiB and 100000 lines per side, not working-copy or SVN large files.",diffPending:"Computing differences; equality is not yet known.",diffIncomplete:"Difference computation is incomplete or timed out; displayed results may be partial.",diffComplete:"Difference computation completed.",largeFallback:"The basic view shows bounded excerpts, not the complete large-file diff.",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",pathHistory:"History of this path",submoduleBadge:"submodule",submoduleCheckout_initialized:"local Git marker present (checkout validity not verified)",submoduleCheckout_uninitialized:"not initialized locally",submoduleCheckout_absent:"local directory missing",submoduleCheckout_unreadable:"local state unreadable",submoduleScope:"The preview shows the Index-recorded pointer and local Git-marker presence without separately resolving nested HEAD or loading contents. Git status itself may inspect nested HEAD and dirty state; nothing is updated or synchronized.",pathHistoryScope:"Manually reads the file history of the selected historical path at that commit; the path must exist in that commit. Without following, renames are not crossed.",pathHistoryNoFollow:"renames not followed",pathHistoryFollowScope:"Following uses the same conservative rules: first parent, Git similarity of at least 50%, a unique deletion/addition confirmed each time, stopping at ambiguity, copies or the 32-confirmation cap; only committed regular files or links are supported.",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 and preselect the single exactly matching path in that commit; rename or old paths are never guessed, and a missing or ambiguous match preselects nothing. The first parent is used and no line is auto-located.",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 static VP8 / lossless VP8L 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, commit tags and locally cached remote-tracking refs, at most 1000 total; no network or fetch. Remote caches may be stale. Reloading origin/HEAD shows its current local target; selected history and versions stay pinned. 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 refs (including remote caches)",revisionRefsCount:"Selectable references loaded"}};function ko(e,t,r,o){let i=e.target;if(!t?.contains(i)||e.defaultPrevented||e.isComposing||i?.closest?.(".monaco-editor")||i?.closest?.(".vcs-history"))return null;if(e.key==="Escape"&&i===r&&o)return"clear";let s=i?.isContentEditable||i?.closest?.('input,textarea,select,[role="textbox"]');if(s&&i!==r)return null;if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&e.key?.toLowerCase()==="f")return"search";if(!s&&e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){if(e.key==="ArrowLeft")return"previous";if(e.key==="ArrowRight")return"next"}return null}function Co(e,t){let r=t?[...t.querySelectorAll("button[data-vcs-item]")]:[],o=r.indexOf(e.target);if(o<0)return;let i;if(e.key==="ArrowDown")i=r[o+1];else if(e.key==="ArrowUp")i=r[o-1];else if(e.key==="Home")i=r[0];else if(e.key==="End")i=r.at(-1);else if(e.key==="ArrowRight"&&e.target.dataset.vcsDirectory==="closed"||e.key==="ArrowLeft"&&e.target.dataset.vcsDirectory==="open"){e.preventDefault(),e.target.click();return}else return;e.preventDefault(),i?.focus()}var No=e=>"dsh-vcs:project:v1:"+e;function Eo(e,t){if(!e)return"";try{let r=(t??globalThis.localStorage)?.getItem(No(e));return typeof r=="string"&&r.length<=1024?r:""}catch{return""}}function Lo(e,t,r){if(!(!e||!t))try{(r??globalThis.localStorage)?.setItem(No(e),t)}catch{}}function Ho(e,t=""){return e.find(r=>r.id===t)?.id||e.find(r=>r.relativePath===".")?.id||e[0]?.id||""}var Je=(e,t)=>JSON.stringify([e,t]),Ve=(e,t=".")=>[e.type.toUpperCase(),e.relativePath==="."?t:e.relativePath||".",e.branch].filter(Boolean).join(" \xB7 "),Re=(e,t="all")=>e.type==="git"&&["staged","unstaged"].includes(t)?t:"all",Ao=(e="",t="")=>e===t?0:e<t?-1:1;function Dt(e=[]){let t={id:"",name:"",directories:new Map,files:[],count:0};for(let o of e){let i=String(o.path||"").split("/").filter(Boolean);if(!i.length)continue;let s=t;for(let p of i.slice(0,-1)){let f=s.id?s.id+"/"+p:p;s.directories.has(p)||s.directories.set(p,{id:f,name:p,directories:new Map,files:[],count:0}),s=s.directories.get(p),s.count++}s.files.push(o)}let r=o=>({...o,directories:[...o.directories.values()].sort((i,s)=>Ao(i.name,s.name)).map(r),files:[...o.files].sort((i,s)=>Ao(i.path,s.path))});return r(t)}function Po(e=[],t){let r=e.findIndex(o=>o.id===t);return{index:r<0?0:r+1,total:e.length}}function Oo(e=[],t,r){if(!e.length||!["previous","next"].includes(r))return null;let o=e.findIndex(p=>p.id===t),i=r==="next"?1:-1,s=o<0?r==="next"?-1:0:o;return e[(s+i+e.length)%e.length]||null}function Bo(e=""){let t=String(e).split("/").filter(Boolean);return t.slice(0,-1).map((r,o)=>t.slice(0,o+1).join("/"))}function Ft(e,t=[]){for(let r of e?.directories||[])t.push(r.id),Ft(r,t);return t}function Do(e=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[e]||e}function Fo(e=[]){return e.reduce((t,r)=>{let o=Do(r.status);return t.all++,t[o]=(t[o]||0)+1,t},{all:0})}function Fr(e=[],t="",r="all"){let o=t.toLowerCase();return e.filter(i=>(r==="all"||Do(i.status)===r)&&i.path.toLowerCase().includes(o)).sort((i,s)=>i.path.localeCompare(s.path))}function Mo(e,t,r="",o="all"){return e.map(i=>({...t[i.id],repository:i,changes:Fr(t[i.id]?.changes,r,o)}))}function To(e,t,r=""){if(!r||!e||e.cwd!==t.cwd)return t;let o=new Map(e.repositories.map(i=>[i.id,i]));for(let i of t.repositories)o.set(i.id,i);return{...t,repositories:[...o.values()],truncated:e.truncated||t.truncated,warnings:[...e.warnings||[],...t.warnings||[]]}}var jo={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},Go=e=>new URL("vcs-assets/"+e,document.baseURI).href;function qo(){return n.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},n.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),n.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var Mr=["slots","layout","locale","connection","uiSession"];function Tr(e){e.effect(()=>e.locale.register("local.vcs",So));let t=e.locale.bind("local.vcs"),r=gt(2),o=so(e.connection,()=>t("error"));function i(f){let d=f.useSessions(a=>Object.values(a.byId).find(c=>(c.retainedBy.mainView??0)>0));return n.default.createElement(s,{key:JSON.stringify([d?.id,d?.cwd])},n.default.createElement(p,{session:d}))}class s extends n.default.Component{state={error:null};static getDerivedStateFromError(d){return{error:d}}render(){return this.state.error?n.default.createElement("section",{className:"vcs-root"},n.default.createElement("style",null,ht),n.default.createElement("div",{className:"vcs-message vcs-error"},t("error"),n.default.createElement("button",{onClick:()=>this.setState({error:null})},t("retry")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")))):this.props.children}}function p({session:f}){(0,n.useSyncExternalStore)(l=>e.locale.subscribe(l),()=>e.locale.getSnapshot(),()=>e.locale.getSnapshot());let d=f?.id,[a,c]=(0,n.useState)("all"),[h,k]=(0,n.useState)(0),[y,C]=(0,n.useState)(0),[u,x]=(0,n.useState)(null),[b,v]=(0,n.useState)({}),[g,m]=(0,n.useState)(()=>Eo(f?.cwd)),[S,H]=(0,n.useState)(0),[K,w]=(0,n.useState)(""),[T,ue]=(0,n.useState)(""),[M,ne]=(0,n.useState)(null),[E,R]=(0,n.useState)(null),[le,He]=(0,n.useState)(!1),[ke,Pe]=(0,n.useState)(!1),[fe,P]=(0,n.useState)(""),[Y,oe]=(0,n.useState)(""),[re,Mt]=(0,n.useState)(""),[Tt,jt]=(0,n.useState)(!1),[ge,et]=(0,n.useState)(""),[Ue,Gt]=(0,n.useState)("all"),[Ce,qt]=(0,n.useState)(!0),[Jt,tt]=(0,n.useState)({}),[Oe,Jo]=(0,n.useState)(!0),[ot,Vo]=(0,n.useState)(!1),[rt,Uo]=(0,n.useState)(!1),[We,Be]=(0,n.useState)("content"),[Vt,Ut]=(0,n.useState)(0),[Wo,Wt]=(0,n.useState)(!1),[It,zt]=(0,n.useState)(null),[Io,zo]=(0,n.useState)(0),[_t,_o]=(0,n.useState)("pending"),[it,st]=(0,n.useState)({added:0,deleted:0,count:0}),[ae,Kt]=(0,n.useState)(!1),Yt=(0,n.useRef)(null),Qt=(0,n.useRef)(null),ye=(0,n.useRef)(null),nt=(0,n.useRef)(null),Ie=(0,n.useRef)(null),at=(0,n.useRef)(null),Xt=(0,n.useRef)(null),Ne=(0,n.useRef)(null),lt=(0,n.useRef)(null),dt=(0,n.useRef)(null),ct=(0,n.useRef)(!1),ze=(0,n.useRef)(!1),ve=u?.repositories||[],be=ve.filter(l=>l.id===g),ie=Wo&&be.some(l=>l.type==="git"),Ko=()=>{Ne.current?.abort(),R(null),ne(null),oe(""),Wt(!0)};(0,n.useEffect)(()=>{ve.some(l=>l.id===g)&&Lo(f?.cwd,g)},[f?.cwd,g,u]);let De=()=>{Xt.current?.abort(),Ne.current?.abort(),R(null),ne(null),oe(""),Be("content"),st({added:0,deleted:0,count:0})},_e=()=>{ze.current=!1,De(),lt.current?.abort(),dt.current=u,x(null),v({}),ue(K.trim()),H(l=>l+1)},xe=()=>{ze.current||(ze.current=!0,De(),lt.current?.abort(),dt.current=null,x(null),v({}),ue(""),H(l=>l+1))},$t=(l=!1)=>{l||C(L=>L+1),ct.current=l,l||De(),l||v({}),k(L=>L+1)};(0,n.useEffect)(()=>{let l=new AbortController;return lt.current=l,P(""),He(!!d),d&&o("vcs/repositories",{sessionId:d,...T?{subdirectory:T}:{}},l.signal).then(L=>{if(!l.signal.aborted){let V=To(dt.current,L,T);ze.current=!1,m(Q=>Ho(V.repositories,Q)),x(V)}}).catch(L=>{l.signal.aborted||P(L.message)}).finally(()=>{l.signal.aborted||He(!1)}),()=>l.abort()},[d,S,T]),(0,n.useEffect)(()=>{let l=new AbortController,L=ct.current;Xt.current=l,ct.current=!1,L||(v({}),oe(""));for(let V of be){let Q=Re(V,a);r(()=>o("vcs/status",{sessionId:d,repositoryId:V.id,mode:Q},l.signal),l.signal).then(se=>{l.signal.aborted||v(de=>({...de,[V.id]:{...se,mode:Q}}))}).catch(se=>{if(!l.signal.aborted){if(se.code==="vcs/rediscover-required"){xe();return}v(de=>({...de,[V.id]:{error:se.message,changes:[],mode:Q}}))}})}return()=>l.abort()},[d,u,g,a,h]),(0,n.useEffect)(()=>{let l=L=>{L.target===window&&d&&g&&document.visibilityState==="visible"&&$t(!0)};return window.addEventListener("focus",l),()=>window.removeEventListener("focus",l)},[d,g,a]);let we=ve.find(l=>l.id===M?.repositoryId),me=M?b[M.repositoryId]:null,pt=JSON.stringify([d,u?.cwd,M?.repositoryId,a,M?.id]),Ee=It?.key===pt&&It?.status===me;(0,n.useEffect)(()=>zt(null),[pt,me,ie]),(0,n.useEffect)(()=>{let l=new AbortController;return Ne.current=l,R(null),oe(""),st({added:0,deleted:0,count:0}),Be("content"),Pe(!!M&&!!me),!ie&&M&&me&&we&&o("vcs/compare",{sessionId:d,repositoryId:M.repositoryId,mode:Re(we,a),id:M.id,...Ee?{large:!0}:{}},l.signal).then(L=>{l.signal.aborted||R(L)}).catch(L=>{if(!l.signal.aborted){if(L.code==="vcs/rediscover-required"){xe();return}oe(L.message)}}).finally(()=>{l.signal.aborted||Pe(!1)}),()=>l.abort()},[M,me,d,a,ie,Ee,Io]),(0,n.useEffect)(()=>{let l=!1,L,V=new AbortController;Kt(!1),Mt("");let Q=document.createElement("link");return Q.rel="stylesheet",Q.href=Go("editor.css"),document.head.appendChild(Q),Qe(Go("editor.js")+"?v="+encodeURIComponent(Xe)+"&retry="+Vt,{signal:V.signal}).then(se=>{l||(L=se.createDiff(Qt.current,{onStats:st,onComputation:de=>{l||_o(de)}}),ye.current=L,Kt(!0))}).catch(se=>{l||Mt(se.message)}),()=>{l=!0,V.abort(),L?.dispose(),ye.current=null,Q.remove()}},[Vt]),(0,n.useEffect)(()=>{ae&&(!E||E.binary||ie)&&ye.current?.setContent({left:{text:""},right:{text:""}},"empty"),ae&&E&&!E.binary&&!ie&&ye.current?.setContent(E,JSON.stringify([d,u?.cwd,M?.repositoryId,a,M?.id,E.path]))},[ae,E,d,u,M,a,ie]),(0,n.useEffect)(()=>{ye.current?.options({sideBySide:Oe,ignoreWhitespace:ot,wrap:rt})},[ae,Oe,ot,rt]);let Fe=Mo(be,b,ge,Ue),Le=Fe.flatMap(l=>l.changes),Yo=Fo(me?.changes),ut=Po(Le,M?.id),Zt=()=>{et(""),Gt("all")},Qo=async()=>{let l=E?.path||he?.path;if(l)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{let L=document.createElement("textarea");try{if(L.value=l,L.style.cssText="position:fixed;opacity:0",document.body.appendChild(L),L.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{L.remove()}}jt(!0),window.setTimeout(()=>jt(!1),1500)}catch{oe(t("copyFailed"))}};(0,n.useEffect)(()=>{let l=L=>{if(ie)return;let V=ko(L,Yt.current,Ie.current,!!ge);V&&(L.preventDefault(),V==="search"?(Ie.current?.focus(),Ie.current?.select()):V==="clear"?et(""):ft(V))};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[ge,Le,M,ie]);let Rt=l=>tt(L=>{let V={...L};for(let Q of Fe)for(let se of Ft(Dt(Q.changes)))V[Q.repository.id+"\0"+se]=!l;return V}),Xo=()=>{let l=he;!l||!M||(qt(!0),Zt(),tt(L=>{let V={...L};for(let Q of Bo(l.path))V[M.repositoryId+"\0"+Q]=!1;return V}),at.current=Je(M.repositoryId,l.id))};(0,n.useEffect)(()=>{let l=at.current;if(!l)return;let L=[...nt.current?.querySelectorAll("button[data-vcs-change]")||[]].find(V=>V.dataset.vcsChange===l);L&&(L.scrollIntoView({block:"nearest"}),L.focus(),at.current=null)},[Ce,ge,Ue,Jt,Fe]);let ft=l=>{let L=Oo(Le,M?.id,l);L&&(Ne.current?.abort(),R(null),Be("content"),ne({repositoryId:g,id:L.id}))},eo=le||be.some(l=>!b[l.id]),he=me?.changes?.find(l=>l.id===M?.id),Se=E?.properties,mt=Se?[...new Set([...Object.keys(Se.left||{}),...Object.keys(Se.right||{})])].filter(l=>Se.left?.[l]!==Se.right?.[l]):[],Me=l=>jo[l?.status]||l?.status?.slice(0,1).toUpperCase()||"M",to=E?.binary?[E.left.label,E.right.label].filter(Boolean).join(" \u2194 "):"",Ae=Y||(ke?t("loading"):d?eo&&!he?t("loading"):fe||(ve.length?he?E?.binary?t("binary")+(to?" "+t("binaryComparison",{files:to}):""):E?!ae&&!re?t("loading"):"":t("pick"):t("pick"):t("noRepo")):t("noSession")),$o=l=>Co(l,nt.current),oo=({entry:l,compact:L=!1,depth:V=0})=>{let Q=l.path.lastIndexOf("/");return n.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":Je(g,l.id),"aria-current":M?.repositoryId===g&&M?.id===l.id?"true":void 0,style:{paddingInlineStart:8+V*14},title:(l.oldPath?l.oldPath+" \u2192 ":"")+l.path+" \xB7 "+t(Me(l)),onClick:()=>{Ne.current?.abort(),R(null),Be("content"),ne({repositoryId:g,id:l.id})}},n.default.createElement("span",{className:"vcs-status","data-status":Me(l)},Me(l)),n.default.createElement(bt,{submodule:l.submodule,t}),n.default.createElement("span",{className:"vcs-filename"},L?l.path.slice(Q+1):l.path,l.oldPath&&n.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",l.oldPath)))},ro=({node:l,repository:L,depth:V=0})=>n.default.createElement(n.default.Fragment,null,l.directories.map(Q=>{let se=L.id+"\0"+Q.id,de=!!Jt[se];return n.default.createElement(n.default.Fragment,{key:se},n.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":de?"closed":"open","aria-expanded":!de,style:{paddingInlineStart:8+V*14},onClick:()=>tt(Zo=>({...Zo,[se]:!de}))},n.default.createElement("span",{"aria-hidden":"true"},de?"\u203A":"\u2304"),Q.name,n.default.createElement("small",null,Q.count)),!de&&n.default.createElement(ro,{node:Q,repository:L,depth:V+1}))}),l.files.map(Q=>n.default.createElement(oo,{key:Je(L.id,Q.id),entry:Q,compact:l.id!=="",depth:V})));return n.default.createElement("section",{ref:Yt,className:"vcs-root","aria-label":t("title")},n.default.createElement("style",null,ht),n.default.createElement("header",{className:"vcs-top"},n.default.createElement(qo,null),n.default.createElement("h1",{className:"vcs-title"},t("title")),n.default.createElement("span",{className:"vcs-badge"},t("readonly")),n.default.createElement("span",{className:"vcs-spacer"}),n.default.createElement("select",{"aria-label":t("repositories"),value:g,disabled:le||!ve.length,onChange:l=>{De(),v({}),m(l.target.value)}},!ve.length&&n.default.createElement("option",{value:""},t("repositories")),ve.map(l=>n.default.createElement("option",{key:l.id,value:l.id},Ve(l,t("workspaceRoot"))))),n.default.createElement("label",{className:"vcs-mode"},t("gitMode")," ",n.default.createElement("select",{"aria-label":t("gitMode"),value:a,disabled:ie||!be.some(l=>l.type==="git"),onChange:l=>{De(),v({}),c(l.target.value)}},["all","unstaged","staged"].map(l=>n.default.createElement("option",{key:l,value:l},t(l))))),n.default.createElement("button",{onClick:()=>$t(!1),disabled:eo||!d},t("refresh")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")),n.default.createElement("div",{className:"vcs-path",title:u?.cwd||f?.cwd},t("session"),": ",u?.cwd||f?.cwd||"\u2014"),n.default.createElement("form",{className:"vcs-discovery",onSubmit:l=>{l.preventDefault(),_e()}},n.default.createElement("input",{"aria-label":t("subdirectory"),placeholder:t("subdirectory"),value:K,onChange:l=>w(l.target.value)}),n.default.createElement("button",{disabled:!d||le},t("rescan")),n.default.createElement("span",null,t("scanHint"))),u?.truncated&&n.default.createElement("div",{className:"vcs-notice"},t("truncated")),(u?.warnings||[]).map((l,L)=>n.default.createElement("div",{className:"vcs-notice",key:L},typeof l=="string"?l:l.message||JSON.stringify(l)))),be.filter(l=>l.type==="svn").map(l=>n.default.createElement(n.default.Fragment,{key:JSON.stringify([d,l.id,S,h])},n.default.createElement(xt,{repositoryId:l.id,sessionId:d,rpc:o,t,onRediscover:xe}),n.default.createElement(kt,{repositoryId:l.id,sessionId:d,rpc:o,t,onRediscover:xe}))),be.some(l=>l.type==="git")&&n.default.createElement(n.default.Fragment,null,n.default.createElement("nav",{className:"vcs-review-views","aria-label":t("reviewView")},n.default.createElement("button",{"aria-pressed":!ie,onClick:()=>Wt(!1)},t("workspaceView")),n.default.createElement("button",{"aria-pressed":ie,"aria-expanded":ie,onClick:Ko},t("history"))),ie&&n.default.createElement(Bt,{key:JSON.stringify([d,g,y,S]),sessionId:d,repositoryId:g,rpc:o,t,onRediscover:xe})),n.default.createElement("div",{className:"vcs-body",hidden:ie,"aria-label":t("workspaceView")},n.default.createElement("aside",{className:"vcs-files"},n.default.createElement("div",{className:"vcs-filter"},n.default.createElement("input",{ref:Ie,"aria-label":t("search"),placeholder:t("search"),title:t("searchShortcut"),value:ge,onChange:l=>et(l.target.value)}),(ge||Ue!=="all")&&n.default.createElement("button",{className:"vcs-clear-filter",onClick:Zt},t("clearFilters"))),n.default.createElement("div",{className:"vcs-status-filter","aria-label":t("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":Ue===l,onClick:()=>Gt(l)},t(l==="all"?"allFiles":jo[l]||"M")," ",n.default.createElement("small",null,Yo[l]||0)))),n.default.createElement("div",{className:"vcs-count"},n.default.createElement("span",null,Le.length," ",t("files")),n.default.createElement("span",{className:"vcs-auto"},t("autoRefresh")),n.default.createElement("button",{"aria-pressed":Ce,onClick:()=>qt(!Ce)},t(Ce?"tree":"list"))),Ce&&n.default.createElement("div",{className:"vcs-tree-actions"},n.default.createElement("button",{onClick:()=>Rt(!0)},t("expandAll")),n.default.createElement("button",{onClick:()=>Rt(!1)},t("collapseAll")),n.default.createElement("button",{onClick:Xo,disabled:!he},t("revealSelected"))),n.default.createElement("nav",{className:"vcs-filelist","aria-label":t("title"),ref:nt,onKeyDown:$o},Fe.map(l=>{let L=l.repository;return n.default.createElement("section",{className:"vcs-repository",key:L.id,"aria-label":Ve(L,t("workspaceRoot"))},n.default.createElement("div",{className:"vcs-repository-heading",title:L.root},n.default.createElement("strong",null,Ve(L,t("workspaceRoot"))),n.default.createElement("small",null,L.type==="svn"?t("svnBase"):t(Re(L,a)))),l.error?n.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},l.error,n.default.createElement("button",{onClick:_e},t("rescan"))):b[L.id]?Ce?n.default.createElement(ro,{node:Dt(l.changes),repository:L}):l.changes.map(V=>n.default.createElement(oo,{key:Je(L.id,V.id),entry:V})):n.default.createElement("div",{className:"vcs-message"},t("loading")),!l.error&&b[L.id]&&!l.changes.length&&n.default.createElement("div",{className:"vcs-message"},t(ge?"emptySearch":"clean")))}),!Fe.length&&n.default.createElement("div",{className:"vcs-message"},le?t("loading"):fe||t(d?"noRepo":"noSession"),fe&&n.default.createElement("button",{onClick:_e},t("rescan"))))),n.default.createElement("main",{className:"vcs-detail"},n.default.createElement("div",{className:"vcs-filehead"},n.default.createElement("strong",{title:E?.path||he?.path},we?Ve(we,t("workspaceRoot"))+" / ":"",E?.path||he?.path||t("pick")),n.default.createElement("button",{className:"vcs-copy-path",disabled:!(E?.path||he?.path),onClick:Qo},t(Tt?"copied":"copyPath")),Tt&&n.default.createElement("span",{className:"vcs-sr-only",role:"status"},t("pathCopied")),n.default.createElement("span",{className:"vcs-spacer"}),E&&!E.binary&&ae&&n.default.createElement(n.default.Fragment,null,n.default.createElement("span",{className:"vcs-add"},"+",it.added),n.default.createElement("span",{className:"vcs-del"},"\u2212",it.deleted))),re&&n.default.createElement("div",{className:"vcs-notice",role:"status"},t("fallback")," ",n.default.createElement("button",{onClick:()=>Ut(l=>l+1)},t("retry")),n.default.createElement("details",null,n.default.createElement("summary",null,t("diagnostics")),re)),E&&n.default.createElement("div",{className:"vcs-context","aria-label":t("comparisonContext")},n.default.createElement("span",{className:"vcs-context-status","data-status":Me(E)},t(Me(E))),E.oldPath&&n.default.createElement("span",{className:"vcs-context-rename",title:E.oldPath+" \u2192 "+E.path},E.oldPath," ",n.default.createElement("b",null,"\u2192")," ",E.path),n.default.createElement("span",null,E.left.label||"\u2014"," ",n.default.createElement("b",null,"\u2194")," ",E.right.label||"\u2014"),(E.left.encoding||E.right.encoding)&&n.default.createElement("span",null,t("encoding"),": ",E.left.encoding||"\u2014"," / ",E.right.encoding||"\u2014")),E&&we?.type==="git"&&n.default.createElement(je,{key:JSON.stringify([d,u?.cwd,M.repositoryId,a,M.id,h,me]),workspace:!0,sessionId:d,repositoryId:M.repositoryId,mode:a,id:M.id,rpc:o,t,onRediscover:xe}),we?.type==="git"&&(Ee||E?.notice?.includes("2 MiB"))&&n.default.createElement("div",{className:"vcs-notice"},n.default.createElement("span",null,t("workspaceLargeScope")),n.default.createElement("button",{onClick:()=>{Ne.current?.abort(),R(null),zt(Ee?null:{key:pt,status:me})}},t(Ee?"largeClose":"largeLoad")),Ee&&Y&&n.default.createElement("button",{onClick:()=>zo(l=>l+1)},t("retry"))),E?.large&&n.default.createElement("p",{role:"status"},t(re?"largeFallback":_t==="complete"?"diffComplete":_t==="incomplete"?"diffIncomplete":"diffPending")),E?.notice&&n.default.createElement("div",{className:"vcs-notice"},E.notice),E?.submodule&&n.default.createElement("p",{role:"status"},t("submoduleScope")),E?.status==="conflicted"&&we?.type==="git"&&n.default.createElement(vt,{key:JSON.stringify([d,M.repositoryId,a,M.id,h]),sessionId:d,repositoryId:M.repositoryId,mode:a,id:M.id,rpc:o,t,onRediscover:xe}),mt.length>0&&n.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":We===l,onClick:()=>Be(l)},t(l),l==="properties"?" ("+mt.length+")":""))),n.default.createElement("div",{className:"vcs-labels"},n.default.createElement("span",null,E?.left.label||"\u2014",E?.left.encoding?" \xB7 "+E.left.encoding:""),n.default.createElement("span",null,E?.right.label||"\u2014",E?.right.encoding?" \xB7 "+E.right.encoding:"")),n.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!Ae||We!=="content",style:We==="properties"?{display:"none"}:void 0},n.default.createElement("div",{className:"vcs-editor",ref:Qt,style:re?{display:"none"}:void 0}),re&&E&&!E.binary&&!Ae&&n.default.createElement(Te,{comparison:E,labels:Ye(t)}),Ae&&n.default.createElement("div",{className:"vcs-message "+(fe||Y||re?"vcs-error":""),role:"status"},Ae,(fe||Y||re)&&n.default.createElement("button",{onClick:()=>re?Ut(l=>l+1):_e()},t(re?"retry":"rescan")))),We==="properties"&&n.default.createElement("div",{className:"vcs-properties"},n.default.createElement("table",null,n.default.createElement("thead",null,n.default.createElement("tr",null,n.default.createElement("th",null,t("properties")),n.default.createElement("th",null,E?.left.label||t("before")),n.default.createElement("th",null,E?.right.label||t("after")))),n.default.createElement("tbody",null,mt.map(l=>n.default.createElement("tr",{key:l},n.default.createElement("th",null,l),n.default.createElement("td",null,Se.left?.[l]??"\u2014"),n.default.createElement("td",null,Se.right?.[l]??"\u2014")))))),n.default.createElement("footer",{className:"vcs-toolbar"},n.default.createElement("button",{disabled:!ae,"aria-pressed":Oe,onClick:()=>Jo(!Oe)},t(Oe?"side":"inline")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!ae,checked:ot,onChange:l=>Vo(l.target.checked)}),t("whitespace")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!ae,checked:rt,onChange:l=>Uo(l.target.checked)}),t("wrap")),n.default.createElement("span",{className:"vcs-spacer"}),ae&&n.default.createElement("span",null,it.count," ",t("changes")),n.default.createElement("button",{disabled:!ae||!E||!!Ae,onClick:()=>ye.current?.navigate("previous")},t("previous")),n.default.createElement("button",{disabled:!ae||!E||!!Ae,onClick:()=>ye.current?.navigate("next")},t("next")),ut.index>0&&n.default.createElement("span",{className:"vcs-review-position"},t("reviewPosition",{index:ut.index,total:ut.total})),n.default.createElement("span",{className:"vcs-toolbar-separator"}),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Le.length,onClick:()=>ft("previous")},t("previousFile")),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Le.length,onClick:()=>ft("next")},t("nextFile"))))))}e.slots.inject("main",()=>e.slots.register({name:"main",key:"local-vcs"},i)),e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>t("title"),order:65},qo))}
97
97
  return module.exports; }});
package/git-history.mjs CHANGED
@@ -1,7 +1,12 @@
1
1
  // Search values are literal, bounded and never revision/options or pathspec expressions.
2
+ export function validateDateBound(value){
3
+ if(typeof value!=='string'||!value||value.length>40)throw new Error('Invalid history date bound');
4
+ if(!/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])(?:[T ](?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?(?:Z|[+-](?:[01]\d|2[0-3]):?[0-5]\d)?)?$/.test(value))throw new Error('Invalid history date bound');
5
+ return value;
6
+ }
2
7
  export function historySearchArgs(search) {
3
8
  if (search === undefined) return {args: [], paths: []};
4
- const keys = ['message', 'author', 'path'];
9
+ const keys = ['message', 'author', 'path', 'since', 'until'];
5
10
  if (!search || typeof search !== 'object' || Array.isArray(search) ||
6
11
  Object.keys(search).some(key => !keys.includes(key))) {
7
12
  throw new Error('Invalid history search');
@@ -21,6 +26,10 @@ export function historySearchArgs(search) {
21
26
  throw new Error('Invalid history search path');
22
27
  }
23
28
  paths.push(value);
29
+ } else if (key === 'since') {
30
+ args.push('--since-as-filter=' + validateDateBound(value));
31
+ } else if (key === 'until') {
32
+ args.push('--until=' + validateDateBound(value));
24
33
  } else {
25
34
  args.push((key === 'message' ? '--grep=' : '--author=') + value);
26
35
  }
package/index.mjs CHANGED
@@ -128,7 +128,7 @@ async function readRepository(api, endpoint, repository, payload, {cwd, mode, si
128
128
  case 'vcs/conflict-stages':
129
129
  return api.getConflictStages({...repository},{mode,id:payload.id,signal});
130
130
  case 'vcs/compare':
131
- return api.getComparison({...repository}, {mode, id: payload.id, ...(payload.large !== undefined ? {large: payload.large,signal} : {})});
131
+ return api.getComparison({...repository}, {mode, id: payload.id, ...(signal !== undefined ? {signal} : {}), ...(payload.large !== undefined ? {large: payload.large} : {})});
132
132
  }
133
133
  }
134
134
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng0531/dsh-vcs",
3
- "version": "0.3.77",
3
+ "version": "0.3.79",
4
4
  "private": false,
5
5
  "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
6
6
  "type": "module",
package/vcs.mjs CHANGED
@@ -194,6 +194,11 @@ export async function listHistory(repo, {snapshot,offset=0,limit=50,search,signa
194
194
  if(signal?.aborted) throw Object.assign(new Error('History cancelled'),{code:'ABORT_ERR'});
195
195
  repo=await checkedRepo(repo,signal);
196
196
  if(repo.type!=='git') throw new Error('History currently supports Git only');
197
+ if(search?.since!==undefined){
198
+ signal?.throwIfAborted();
199
+ try{await git(repo.root,['log','--since-as-filter=1970-01-01','-1','--format=%H'],MAX_TEXT,{signal});}
200
+ catch(e){if(e.code==='VCS_COMMAND')throw new Error('Date-range history search requires Git 2.37 or newer (--since-as-filter).');throw e;}
201
+ }
197
202
  if(!snapshot){
198
203
  try{snapshot=(await git(repo.root,['rev-parse','--verify','HEAD^{commit}'],MAX_TEXT,{signal})).toString('utf8').trim();}
199
204
  catch(e){
@@ -469,7 +474,36 @@ function modeFor(repo, mode) {
469
474
  if (!['all', 'staged', 'unstaged'].includes(mode)) throw new Error('Invalid comparison mode');
470
475
  if (repo.type === 'svn' && mode !== 'all') throw new Error('SVN supports only all mode');
471
476
  }
472
- function identity(entry, mode) { return createHash('sha256').update(JSON.stringify([mode, entry.path, entry.oldPath, entry.status, entry.indexStatus, entry.worktreeStatus, entry.propertyStatus])).digest('hex'); }
477
+ function identity(entry, mode) { return createHash('sha256').update(JSON.stringify([mode, entry.path, entry.oldPath, entry.status, entry.indexStatus, entry.worktreeStatus, entry.propertyStatus, entry.submodule?.recorded, entry.submodule?.checkout])).digest('hex'); }
478
+ // Read-only gitlink metadata: recorded index pointer plus local checkout presence.
479
+ // Never runs Git inside the submodule, never follows its gitdir and never fetches.
480
+ async function annotateSubmodules(repo, entries, options) {
481
+ if (!entries.length) return;
482
+ const pointers = new Map();
483
+ const deadline=Date.now()+(options?.timeoutMs??TIMEOUT);
484
+ const check=()=>{options?.signal?.throwIfAborted();if(Date.now()>=deadline)throw Object.assign(Error('Index metadata timed out'),{code:'TIMEOUT'});};
485
+ const files=entries.filter(entry=>entry.status!=='conflicted').map(entry=>entry.path);
486
+ for(let from=0;from<files.length;){
487
+ check();const batch=[];let bytes=0;
488
+ while(from<files.length&&batch.length<64){const file=files[from],size=Buffer.byteLength(file,'utf8')+1;if(size>24000)throw Error('Selected path exceeds metadata budget');if(bytes+size>24000)break;batch.push(file);bytes+=size;from++;}
489
+ const listing=(await git(repo.root,['ls-files','--stage','-z','--',...batch],MAX_TEXT,{...options,timeoutMs:deadline-Date.now()})).toString('utf8');
490
+ for(const record of listing.split('\0')){const tab=record.indexOf('\t');if(tab<0)continue;const [mode,oid,stage]=record.slice(0,tab).split(' '),file=record.slice(tab+1);if(stage==='0'&&mode==='160000'&&batch.includes(file)&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(oid))pointers.set(file,oid);}
491
+ }
492
+ if (!pointers.size) return;
493
+ for (const entry of entries) {
494
+ check();
495
+ const recorded = pointers.get(entry.path); if (!recorded || entry.status === 'conflicted') continue;
496
+ let checkout = 'uninitialized';
497
+ try {
498
+ const target = await confined(repo.root, entry.path);
499
+ check();const info = await fs.lstat(target);check();
500
+ if (info.isDirectory()) { try { const marker = await fs.lstat(path.join(target, '.git')); checkout = marker.isFile() || marker.isDirectory() ? 'initialized' : 'unreadable'; } catch (inner) { if (inner.code !== 'ENOENT') checkout = 'unreadable'; } }
501
+ else checkout = 'uninitialized';
502
+ } catch (e) { check();checkout = e.code === 'ENOENT' ? 'absent' : 'unreadable'; }
503
+ check();
504
+ entry.submodule = { recorded, checkout };
505
+ }
506
+ }
473
507
  const statuses = { M: 'modified', A: 'added', D: 'deleted', R: 'renamed', C: 'copied', U: 'conflicted', T: 'typechanged', '?': 'untracked' };
474
508
  async function changes(repo, mode, options) {
475
509
  let entries;
@@ -485,6 +519,7 @@ async function changes(repo, mode, options) {
485
519
  const code = mode === 'staged' ? x : mode === 'unstaged' ? y : (y !== ' ' && y !== '?' ? y : x);
486
520
  entries.push({ path: file, ...(oldPath ? { oldPath } : {}), status: conflict ? 'conflicted' : statuses[code] || 'modified', indexStatus: x, worktreeStatus: y });
487
521
  }
522
+ await annotateSubmodules(repo, entries, options);
488
523
  } else {
489
524
  const document = parseXML(await svn(repo.root, ['status', '--xml', '--ignore-externals', '--', '.']));
490
525
  entries = [];
@@ -512,7 +547,24 @@ async function working(root, relative, svnLink = false) {
512
547
  const handle = await fs.open(target, 'r');
513
548
  try { const info = await handle.stat(); if (!info.isFile()) throw new Error('Not a regular file'); const buffer = Buffer.alloc(MAX_TEXT + 1); const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0); await confined(root, relative); return decode(buffer.subarray(0, bytesRead)); } finally { await handle.close(); }
514
549
  }
515
- async function gitBlob(root, revision, file) { return content(() => git(root, ['show', '--no-ext-diff', '--no-textconv', revision + ':' + file], MAX_TEXT)); }
550
+ async function gitBlob(root, revision, file, options) {
551
+ let record;
552
+ if(revision){
553
+ const raw=(await git(root,['ls-tree','-z',revision,'--',file],MAX_TEXT,options)).toString('utf8');
554
+ const row=raw.split('\0').find(row=>row.includes('\t')&&row.slice(row.indexOf('\t')+1)===file);
555
+ if(!row)return {text:''};const [mode,type,oid]=row.slice(0,row.indexOf('\t')).split(' ');record={mode,type,oid};
556
+ }else{
557
+ const raw=(await git(root,['ls-files','--stage','-z','--',file],MAX_TEXT,options)).toString('utf8');
558
+ for(const row of raw.split('\0')){const tab=row.indexOf('\t');if(tab<0||row.slice(tab+1)!==file)continue;const [mode,oid,stage]=row.slice(0,tab).split(' ');if(stage==='0')record={mode,oid,type:mode==='160000'?'commit':'blob'};}
559
+ if(!record)return {text:'',notice:'No stage-0 Index entry; conflict stages are not inferred.'};
560
+ }
561
+ if(!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(record.oid))throw Error('Invalid selected object');
562
+ if(record.mode==='160000')return {text:'Submodule '+record.oid,notice:'Recorded gitlink pointer; nested checkout commit and contents are not loaded by this preview.'};
563
+ if(record.type!=='blob'||!['100644','100755','120000'].includes(record.mode))return {text:'',notice:'Unsupported selected object; contents not loaded.'};
564
+ const body=await content(()=>git(root,['cat-file','blob',record.oid],MAX_TEXT,options));
565
+ if(record.mode==='120000')body.notice=[body.notice,'Symbolic link target text; not followed.'].filter(Boolean).join(' ');
566
+ return body;
567
+ }
516
568
  async function historicalBlob(root,revision,file,signal,large=false,budget){
517
569
  const listing=(await git(root,['ls-tree','-z',revision,'--',file],MAX_TEXT,budget?budget():{signal})).toString('utf8');
518
570
  const records=listing.split(String.fromCharCode(0)).filter(Boolean);
@@ -618,8 +670,9 @@ export async function getConflictStages(repo,{mode='all',id,signal}={}){
618
670
  export async function getComparison(repo, { mode = 'all', id, large=false, signal } = {}) {
619
671
  if(typeof large!=='boolean')throw Error('Invalid large comparison mode');
620
672
  if(large)return getWorkspaceLargeComparison(repo,{mode,id,signal});
621
- repo = await checkedRepo(repo); modeFor(repo, mode);
622
- const entry = (await changes(repo, mode)).find(item => item.id === id);
673
+ signal?.throwIfAborted();
674
+ repo = await checkedRepo(repo,signal); modeFor(repo, mode);
675
+ const entry = (await changes(repo, mode,{signal})).find(item => item.id === id);
623
676
  if (!entry) throw new Error('Change no longer exists; refresh repository status.');
624
677
  await confined(repo.root, entry.path); if (entry.oldPath) await confined(repo.root, entry.oldPath);
625
678
  let left = { text: '' }, right = { text: '' }, leftLabel, rightLabel, props, notice;
@@ -627,14 +680,14 @@ export async function getComparison(repo, { mode = 'all', id, large=false, signa
627
680
  leftLabel = mode === 'unstaged' ? 'Index' : 'HEAD'; rightLabel = mode === 'staged' ? 'Index' : 'Working tree';
628
681
  if (entry.status === 'conflicted') {
629
682
  notice = 'Unmerged conflict: showing HEAD versus working tree (index has conflict stages).'; leftLabel = 'HEAD'; rightLabel = 'Working tree';
630
- try { left = await gitBlob(repo.root, 'HEAD', entry.oldPath || entry.path); } catch (e) { if (e.code !== 'VCS_COMMAND') throw e; }
683
+ try { left = await gitBlob(repo.root, 'HEAD', entry.oldPath || entry.path,{signal}); } catch (e) { if (e.code !== 'VCS_COMMAND') throw e; }
631
684
  right = await working(repo.root, entry.path);
632
685
  } else {
633
686
  let hasHead = true; try { await git(repo.root, ['rev-parse', '--verify', 'HEAD']); } catch (e) { if (e.code !== 'VCS_COMMAND') throw e; hasHead = false; }
634
687
  const untracked = entry.indexStatus === '?';
635
688
  const addedToHead = entry.indexStatus === 'A' || entry.indexStatus === 'C';
636
- if (!untracked && (mode === 'unstaged' ? entry.indexStatus !== 'D' : (hasHead && !addedToHead))) left = await gitBlob(repo.root, mode === 'unstaged' ? '' : 'HEAD', mode === 'unstaged' ? entry.path : entry.oldPath || entry.path);
637
- if (mode === 'staged') { if (entry.indexStatus !== 'D') right = await gitBlob(repo.root, '', entry.path); }
689
+ if (!untracked && (mode === 'unstaged' ? entry.indexStatus !== 'D' : (hasHead && !addedToHead))) left = await gitBlob(repo.root, mode === 'unstaged' ? '' : 'HEAD', mode === 'unstaged' ? entry.path : entry.oldPath || entry.path,{signal});
690
+ if (mode === 'staged') { if (entry.indexStatus !== 'D') right = await gitBlob(repo.root, '', entry.path,{signal}); }
638
691
  else right = await working(repo.root, entry.path);
639
692
  }
640
693
  } else {
@@ -652,5 +705,6 @@ export async function getComparison(repo, { mode = 'all', id, large=false, signa
652
705
  if (entry.status !== 'unversioned') props = { left: added ? {} : await properties(repo.root, entry.path, true), right: ['deleted', 'missing'].includes(entry.status) ? {} : await properties(repo.root, entry.path, false) };
653
706
  if (entry.status === 'conflicted') notice = 'Conflicted working copy: showing BASE versus working content.';
654
707
  }
708
+ if (entry.submodule) notice = [notice, `Submodule pointer ${entry.submodule.recorded} (checkout: ${entry.submodule.checkout}); nested commit and contents are not loaded by this preview; Git status may inspect nested state.`].filter(Boolean).join(' ');
655
709
  return { ...entry, left: { label: leftLabel, text: left.text, encoding: left.encoding }, right: { label: rightLabel, text: right.text, encoding: right.encoding }, ...(left.binary || right.binary ? { binary: true } : {}), ...([notice, left.notice, right.notice].filter(Boolean).length ? { notice: [...new Set([notice, left.notice, right.notice].filter(Boolean))].join(' ') } : {}), ...(props ? { properties: props } : {}) };
656
710
  }