@feng0531/dsh-vcs 0.3.67 → 0.3.68
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 +68 -46
- package/THIRD_PARTY_NOTICES.md +3 -1
- package/dist/client.js +1 -1
- package/docs/RELEASING.md +31 -44
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,75 +1,97 @@
|
|
|
1
1
|
# DSH VCS
|
|
2
2
|
|
|
3
|
-
DeepSeek Harness(DSH)Web
|
|
3
|
+
在 DeepSeek Harness(DSH)Web 中查看 Git / SVN 文件变更和提交历史的**只读插件**。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
你可以查看差异、浏览历史、追溯文件,但不能通过本插件修改文件、暂存、提交、拉取或推送。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- npm 包:`@feng0531/dsh-vcs`
|
|
8
|
+
- [下载正式版本](https://github.com/f-e-n-g-0531/dsh-vcs/releases/latest) · [查看更新](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/CHANGELOG.md)
|
|
9
|
+
- 采用[非商业许可证](<LICENSE>),商业用途须另行书面授权。
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
- 安全静态 PNG、基线单扫描 JPEG、单 VP8 WebP 的工作区及 A/B 图片比较;格式结构与浏览器解码双重检查。
|
|
11
|
-
- 第七批:HTTPS SVN 固定工作副本修订日志、历史 r-1/r Diff 与止于复制边界的追溯。必须已发现仓库、手动审阅并勾选网络同意;未授权不联网。仅支持无需额外认证的 HTTPS 服务,不提供凭据或证书配置。
|
|
11
|
+
## 能做什么
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
| 场景 | 功能 |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| 查看工作区变更 | Git 全部、已暂存、未暂存文件;SVN 本地基线与工作副本、属性差异 |
|
|
16
|
+
| 阅读代码差异 | 默认 Monaco 只读 Diff,支持并排/行内、换行、忽略行尾空白、上一处/下一处差异 |
|
|
17
|
+
| 浏览 Git 历史 | 搜索提交说明、作者和路径;查看本地分支、提交图、提交详情与目录 |
|
|
18
|
+
| 比较历史版本 | 比较提交与选定父提交,或选择两个本地提交进行 A/B 比较 |
|
|
19
|
+
| 追溯代码来源 | 文件历史、精确重命名追踪、Blame(逐行查看最后修改者和提交) |
|
|
20
|
+
| 查看其他内容 | 支持部分静态图片比较;较大历史 UTF-8 文件可分段阅读 |
|
|
21
|
+
| 浏览 SVN 历史 | 明确同意连接后,查看 HTTPS 仓库日志、修订差异和文件历史 |
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
提供中英文界面。编辑器加载失败时会显示基础文本比较;它不是完整的 Monaco 替代品。
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
## 安装
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
需要:
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
- Node.js **22 或更新版本**。
|
|
30
|
+
- DSH Web:声明兼容 **0.1.7-rc.2 或 0.2.0-rc.2**。
|
|
31
|
+
- 系统 PATH 中有 Git 或 SVN;只使用 Git 时无需安装 SVN。
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
profile是DSH的配置和插件环境,不是Session。下面的web是示例,请先确认运行中的DSH使用哪个profile;若不同,替换命令中的web。宿主插件命令通过pnpm执行,需确保该工具可用。
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
在终端执行:
|
|
36
|
+
|
|
37
|
+
dsh plugin --profile web add @feng0531/dsh-vcs@0.3.68
|
|
38
|
+
|
|
39
|
+
安装后由你自行重启 DSH,再刷新原来的 Web 页面。安装会改变所选 profile;升级前请备份配置。**本项目的发布不会自动升级或重启你的 DSH。**
|
|
40
|
+
|
|
41
|
+
也可以从 [GitHub Release](https://github.com/f-e-n-g-0531/dsh-vcs/releases/latest) 下载 tgz 和校验文件,核对 SHA-256 后安装:
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
dsh plugin --profile web add "<tgz 的绝对路径>"
|
|
37
44
|
|
|
38
|
-
|
|
45
|
+
升级、旧包迁移和回滚见[安装指南](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/INSTALL.md)。
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
## 开始使用
|
|
41
48
|
|
|
42
|
-
|
|
49
|
+
1. 在 DSH 中选择一个 Session,确认它的工作目录在项目内。
|
|
50
|
+
2. 打开 VCS 页面,发现仓库,再从顶部下拉框选择仓库。
|
|
51
|
+
3. 点击文件查看差异,或进入历史视图浏览提交。
|
|
52
|
+
4. 外部工具修改了项目后,手动刷新;可见窗口重新获得焦点时也会刷新。没有定时轮询。
|
|
43
53
|
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
默认发现当前目录、一级子目录以及包含当前目录的上级仓库。项目更深时,输入相对 Session 目录的子目录,例如 `packages/example`;不接受任意绝对路径或越界路径。
|
|
55
|
+
|
|
56
|
+
**注意:Session 位于仓库子目录时,发现后的查看范围可以覆盖整个仓库。**
|
|
57
|
+
|
|
58
|
+
### 左右两侧比较的是什么
|
|
59
|
+
|
|
60
|
+
| 模式 | 左侧 | 右侧 |
|
|
61
|
+
| --- | --- | --- |
|
|
62
|
+
| Git 全部 | 最近提交(HEAD) | 当前工作区 |
|
|
63
|
+
| Git 已暂存 | 最近提交(HEAD) | 暂存区(Index) |
|
|
64
|
+
| Git 未暂存 | 暂存区(Index) | 当前工作区 |
|
|
65
|
+
| SVN 本地变更 | 本地基线(BASE) | 当前工作副本 |
|
|
46
66
|
|
|
47
|
-
|
|
67
|
+
新增文件可能使用空白左侧。冲突文件只供查看,不提供三方合并或冲突解决。
|
|
48
68
|
|
|
49
|
-
|
|
69
|
+
### SVN 历史需要单独同意
|
|
50
70
|
|
|
51
|
-
|
|
71
|
+
本地 SVN 变更比较不连接服务器。打开远程历史前,需要审阅服务器与路径范围并勾选同意;授权约 5 分钟后过期,须重新手动同意。
|
|
52
72
|
|
|
53
|
-
|
|
73
|
+
目前仅支持系统信任、**无需额外认证的 HTTPS SVN 服务**。不提供用户名/密码、自定义证书或其他协议。历史范围固定在本地工作副本的修订,不自动获取服务器最新版本。
|
|
54
74
|
|
|
55
|
-
##
|
|
75
|
+
## 目前的限制
|
|
56
76
|
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
- 自动化测试不替代真实 DSH 浏览器验收;本说明不宣称已通过特定宿主、浏览器或操作系统的端到端验收。
|
|
77
|
+
- **不是完整的 Fork 客户端**:没有仓库写操作,历史图和列表都有容量限制;分支导航只使用本地分支/标签。
|
|
78
|
+
- 普通文本比较每侧最多 **2MiB**;历史 UTF-8 正文分段最多 **16MiB**。分段阅读不等于完整大文件 Diff。
|
|
79
|
+
- 重命名追溯只沿第一父链识别内容完全相同的重命名;复杂合并、复制或相似重命名可能停止。
|
|
80
|
+
- 图片支持 PNG、基线 JPEG 和简单静态 VP8 WebP;动画、扩展 WebP 等不支持。
|
|
81
|
+
- 支持 UTF-8、GBK、带 BOM 的 UTF-16;不是通用编码检测器。
|
|
82
|
+
- 取消状态/比较请求不保证立即停止底层进程,进程仍受超时和输出上限控制。
|
|
64
83
|
|
|
65
|
-
##
|
|
84
|
+
## 常见问题
|
|
66
85
|
|
|
67
|
-
|
|
86
|
+
- **找不到仓库**:检查 Session 工作目录和 Git/SVN 的 PATH;更深项目使用相对子目录发现。
|
|
87
|
+
- **提示重新发现**:目录变了或发现授权过期,手动重新发现即可。
|
|
88
|
+
- **高级编辑器加载失败**:确认安装了完整正式包并重新加载宿主;失败时仍可使用基础比较。
|
|
89
|
+
- **SVN 历史连接失败**:先确认是受信任 HTTPS 服务,且不要求本插件未支持的额外认证。
|
|
68
90
|
|
|
69
|
-
|
|
91
|
+
正式版本通过自动测试、Windows/Linux 检查和隔离浏览器回归。**这些不证明你的当前 DSH 页面已加载新版,也不代替你的实际环境验证。**
|
|
70
92
|
|
|
71
|
-
|
|
93
|
+
## 开发与更多资料
|
|
72
94
|
|
|
73
|
-
|
|
95
|
+
[文档导航](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/README.md) · [贡献指南](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/CONTRIBUTING.md) · [安全说明](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/SECURITY.md) · [维护者发布流程](<docs/RELEASING.md>)
|
|
74
96
|
|
|
75
|
-
|
|
97
|
+
界面设计参考 [Fork](https://fork.dev/),不代表与 Fork 官方有关联或获得背书。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
# Third-party notices
|
|
1
|
+
# 第三方许可 / Third-party notices
|
|
2
|
+
|
|
3
|
+
本页说明随包分发的第三方组件许可。下面的许可证原文保持不变;项目自己的非商业许可证不覆盖第三方独立授权的权利。
|
|
2
4
|
|
|
3
5
|
The plugin is governed by the DSH VCS Non-Commercial Source Available License 1.0 in LICENSE. Third-party materials remain under their respective licenses; the plugin license does not restrict the rights those licenses independently grant.
|
|
4
6
|
|
package/dist/client.js
CHANGED
|
@@ -92,6 +92,6 @@ var qr=Object.create;var Ie=Object.defineProperty;var Jr=Object.getOwnPropertyDe
|
|
|
92
92
|
.vcs-root .vcs-toolbar{gap:6px}
|
|
93
93
|
.vcs-root .vcs-title{font-size:16px}
|
|
94
94
|
}
|
|
95
|
-
`;function Qt(e,t){return async(o,r,s)=>{let a=await e.rpc.call("/vcs-rpc",o,r,s);if(!a.ok){let p=new Error(a.error?.message||String(a.error||t()));throw p.code=a.error?.code,p}return a.value}}function ut(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,o=[];function r(){for(;t<e&&o.length;){let s=o.shift();if(s.signal?.removeEventListener("abort",s.abort),s.signal?.aborted){s.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(s.signal?.aborted)throw new Error("Aborted");return s.run()}).then(s.resolve,s.reject).finally(()=>{t--,r()})}}return(s,a)=>new Promise((p,f)=>{let d={run:s,signal:a,resolve:p,reject:f,abort:null};if(d.abort=()=>{let i=o.indexOf(d);i>=0&&(o.splice(i,1),f(new Error("Aborted")))},a?.aborted){f(new Error("Aborted"));return}a?.addEventListener("abort",d.abort,{once:!0}),o.push(d),r()})}var X=R(require("react"),1);function Xt(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function $t(e="",t=""){let o=Xt(e),r=Xt(t),s=0;for(;s<o.length&&s<r.length&&o[s]===r[s];)s++;let a=0;for(;a<o.length-s&&a<r.length-s&&o[o.length-a-1]===r[r.length-a-1];)a++;let p=o.length-a,f=r.length-a,d=p-s,i=f-s,c=d&&i?(d+1)*(i+1):0,m=c>2e5,w=[],g=0;function S(u,y){g++,!(w.length>=2e3)&&w.push({left:u===null?null:{number:u+1,text:o[u]},right:y===null?null:{number:y+1,text:r[y]},kind:u===null?"insert":y===null?"delete":o[u]===r[y]?"equal":"replace"})}for(let u=0;u<s;u++)S(u,u);if(m||!d||!i)for(let u=0;u<Math.max(d,i);u++)S(u<d?s+u:null,u<i?s+u:null);else{let u=i+1,y=new Uint32Array(c);for(let h=d-1;h>=0;h--)for(let x=i-1;x>=0;x--)y[h*u+x]=o[s+h]===r[s+x]?y[(h+1)*u+x+1]+1:Math.max(y[(h+1)*u+x],y[h*u+x+1]);let v=0,b=0;for(;v<d||b<i;)v<d&&b<i&&o[s+v]===r[s+b]?S(s+v++,s+b++):v<d&&(b===i||y[(v+1)*u+b]>=y[v*u+b+1])?S(s+v++,null):S(null,s+b++)}for(let u=0;u<a;u++)S(p+u,f+u);return{rows:w,approximate:m,truncated:g>w.length,totalRows:g,omittedRows:g-w.length,leftLineCount:o.length,rightLineCount:r.length,lcsCells:m?0:c}}var _r={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."},ft={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Yr={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Qr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Xr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Be({comparison:e,labels:t={}}){let o=e?.left?.text??"",r=e?.right?.text??"",s=(0,X.useMemo)(()=>$t(o,r),[o,r]),a=f=>t[f]??_r[f],p=(f,d,i)=>{let c=f&&i!=="equal";return X.default.createElement("td",{style:{...ft,background:c?d==="left"?"#d6454520":"#259b4920":void 0}},X.default.createElement("div",{style:Yr},X.default.createElement("span",{style:Qr},f?.number??""),X.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},c?d==="left"?"\u2212":"+":""),X.default.createElement("pre",{style:Xr},f?.text??"")))};return X.default.createElement("section",{className:"vcs-text-comparison","aria-label":a("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},s.approximate&&X.default.createElement("div",{role:"status",style:{padding:8}},a("approximate")),s.truncated&&X.default.createElement("div",{role:"status",style:{padding:8}},a("truncated")," (",2e3," / ",s.totalRows,")"),X.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},X.default.createElement("thead",null,X.default.createElement("tr",null,X.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.left?.label||a("before")),X.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.right?.label||a("after")))),X.default.createElement("tbody",null,s.rows.map((f,d)=>X.default.createElement("tr",{key:d,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!s.rows.length&&X.default.createElement("p",{style:{padding:8}},a("empty")))}var W=R(require("react"),1);function Zt(e,{width:t,height:o,signal:r,timeoutMs:s=1e4,createURL:a=d=>URL.createObjectURL(d),revokeURL:p=d=>URL.revokeObjectURL(d),createImage:f=()=>new Image}={}){return new Promise((d,i)=>{if(r?.aborted){i(r.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(o)||t<1||o<1||t>8192||o>8192||t*o>16e6||!Number.isFinite(s)||s<=0){i(new Error("Invalid image preview"));return}let c,m,w,g=!1,S=!1,u=()=>{S||(S=!0,m&&(m.src=""),c&&p(c))},y=()=>{clearTimeout(w),r?.removeEventListener("abort",b)},v=h=>{g||(g=!0,y(),u(),i(h))},b=()=>v(r.reason||new Error("Image cancelled"));try{c=a(e),m=f(),r?.addEventListener("abort",b,{once:!0}),w=setTimeout(()=>v(new Error("Image decode timed out")),s),m.src=c,Promise.resolve(m.decode()).then(()=>{if(!g){if(r?.aborted){b();return}if(m.naturalWidth!==t||m.naturalHeight!==o){v(new Error("Image dimensions mismatch"));return}g=!0,y(),d({url:c,dispose:u})}},v)}catch(h){v(h)}})}function $r({side:e,sessionId:t,repositoryId:o,commit:r,parentIndex:s,base:a,target:p,workspace:f=!1,mode:d,id:i,rpc:c,t:m,onRediscover:w}){let[g,S]=(0,W.useState)(null),[u,y]=(0,W.useState)(""),[v,b]=(0,W.useState)(0);return(0,W.useEffect)(()=>{let h=new AbortController,x;return S(null),y(""),(async()=>{let k=await c(f?"vcs/workspace-image":a?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:o,mode:d,id:i,side:e}:a?{sessionId:t,repositoryId:o,base:a,target:p,id:i,side:e}:{sessionId:t,repositoryId:o,commit:r,parentIndex:s,id:i,side:e},h.signal);if(h.signal.aborted)return;if(k.absent){S(k);return}if(!["image/png","image/jpeg","image/webp"].includes(k.mime)||typeof k.base64!="string"||k.base64.length>2796204||!Number.isInteger(k.bytes)||k.bytes<1||k.bytes>2097152)throw Error(m("imageInvalid"));let O=atob(k.base64);if(O.length!==k.bytes)throw Error(m("imageInvalid"));let N=new Blob([Uint8Array.from(O,q=>q.charCodeAt(0))],{type:k.mime});if(x=await Zt(N,{width:k.width,height:k.height,signal:h.signal}),h.signal.aborted){x.dispose();return}S({...k,url:x.url})})().catch(k=>{h.signal.aborted||(y(k.message),k.code==="vcs/rediscover-required"&&w())}),()=>{h.abort(),x?.dispose()}},[e,t,o,r,s,a,p,f,d,i,v]),W.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":m(e==="left"?"imageBefore":"imageAfter")},W.default.createElement("h5",null,m(e==="left"?"imageBefore":"imageAfter")),u?W.default.createElement("p",{role:"alert"},u," ",W.default.createElement("button",{onClick:()=>b(h=>h+1)},m("retry"))):g?W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,W.default.createElement("code",null,g.commit)," \xB7 ",g.path),g.absent?W.default.createElement("p",null,m("imageAbsent")):W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,g.width," \xD7 ",g.height," \xB7 ",g.bytes," B"),W.default.createElement("img",{src:g.url,alt:g.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),g.metadataStripped&&W.default.createElement("p",null,m("imageMetadata")))):W.default.createElement("p",{role:"status"},m("loading")))}function Fe(e){let[t,o]=(0,W.useState)(!1);return W.default.createElement("div",null,W.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("imageCompare")),t&&W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,e.t("imageScope")),W.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(r=>W.default.createElement($r,{key:r,...e,side:r})))))}function ze(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var G=R(require("react"),1);function mt(e){return G.default.createElement(Zr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Zr({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s}){let[a,p]=(0,G.useState)(!1),[f,d]=(0,G.useState)(null),[i,c]=(0,G.useState)(""),[m,w]=(0,G.useState)(0);return(0,G.useEffect)(()=>{if(!a)return;let g=new AbortController;return d(null),c(""),o("vcs/svn-identity",{sessionId:e,repositoryId:t},g.signal).then(S=>{g.signal.aborted||d(S)}).catch(S=>{g.signal.aborted||(c(S.message),S.code==="vcs/rediscover-required"&&s())}),()=>g.abort()},[a,e,t,m]),G.default.createElement("section",null,G.default.createElement("button",{"aria-expanded":a,onClick:()=>p(g=>!g)},r("svnIdentity")),a&&G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,r("svnOfflineIdentity")),i?G.default.createElement("p",{role:"alert"},i," ",G.default.createElement("button",{onClick:()=>w(g=>g+1)},r("retry"))):f?G.default.createElement(G.default.Fragment,null,G.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(g=>G.default.createElement(G.default.Fragment,{key:g},G.default.createElement("dt",null,g),G.default.createElement("dd",null,G.default.createElement("code",null,f[g]))))),G.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))):G.default.createElement("p",{role:"status"},r("loading"))))}function Ke(e,t,{now:o=Date.now,schedule:r=setTimeout,cancel:s=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=o()||e-o()>3e5)throw Error("Invalid SVN consent expiry");let a=!0,p=r(()=>{a&&(a=!1,t())},e-o());return()=>{a&&(a=!1,s(p))}}function Rt(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 Q=R(require("react"),1);var M=R(require("react"),1);function ht(e){return M.default.createElement(Rr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Rr({sessionId:e,repositoryId:t,rpc:o,t:r,onApproved:s,onRediscover:a}){let[p,f]=(0,M.useState)(!1),[d,i]=(0,M.useState)(null),[c,m]=(0,M.useState)(!1),[w,g]=(0,M.useState)(""),[S,u]=(0,M.useState)(!1),[y,v]=(0,M.useState)(0);(0,M.useEffect)(()=>{if(!p)return;let x=new AbortController;return i(null),m(!1),g(""),u(!0),o("vcs/svn-describe",{sessionId:e,repositoryId:t},x.signal).then(k=>{x.signal.aborted||i(k)}).catch(k=>{x.signal.aborted||(g(k.message),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{x.signal.aborted||u(!1)}),()=>x.abort()},[p,e,t,y]);let[b,h]=(0,M.useState)(0);return(0,M.useEffect)(()=>{if(!p||!d||d.expiresAt===void 0)return;let x=()=>{i(null),m(!1),h(0),u(!1),g(r("svnOfferExpired"))};try{return Ke(d.expiresAt,x)}catch{x()}},[p,d]),(0,M.useEffect)(()=>{if(!b||!p||!d)return;let x=new AbortController;return u(!0),g(""),o("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:d.offer,explicit:!0},x.signal).then(k=>{x.signal.aborted||s(k)}).catch(k=>{x.signal.aborted||(g(k.message),m(!1),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{x.signal.aborted||u(!1)}),()=>x.abort()},[b,p,d]),M.default.createElement("section",null,M.default.createElement("button",{"aria-expanded":p,onClick:()=>{h(0),f(x=>!x)}},r("svnConsentReview")),p&&M.default.createElement(M.default.Fragment,null,M.default.createElement("p",null,r("svnConsentScope")),w&&M.default.createElement("p",{role:"alert"},w," ",M.default.createElement("button",{disabled:S,onClick:()=>{h(0),v(x=>x+1)}},r("retry"))),d&&M.default.createElement(M.default.Fragment,null,M.default.createElement("dl",null,["origin","root","uuid","scope"].map(x=>M.default.createElement(M.default.Fragment,{key:x},M.default.createElement("dt",null,x),M.default.createElement("dd",null,M.default.createElement("code",null,d[x]))))),d.remoteEnabled?M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:c,disabled:S,onChange:x=>m(x.target.checked)}),r("svnConsentExplicit")),M.default.createElement("button",{disabled:S||!c,onClick:()=>h(x=>x+1)},r("svnConsentApprove"))):M.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))),S&&M.default.createElement("p",{role:"status"},r("loading"))))}var A=R(require("react"),1);var Y=R(require("react"),1);var ne=require("react");function er({load:e,node:t,comparison:o,key:r,single:s=!1,onReady:a=()=>{},onError:p=()=>{}}){let f=new AbortController,d,i=!1,c=()=>{let w=d;d=void 0,w?.dispose()};return{done:Promise.resolve().then(()=>(f.signal.throwIfAborted(),e(f.signal))).then(w=>{i||(d=w.createDiff(t,{single:s}),d.setContent(o,r),i||a(d))}).catch(w=>{try{c()}finally{i||p(w)}}),dispose(){i||(i=!0,f.abort(),c())}}}async function _e(e,{signal:t,fetcher:o=fetch,importer:r=s=>import(s)}={}){let s=await o(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!s.ok)throw new Error("Editor resource HTTP "+s.status+" ("+e+"). "+(s.status===401?"Refresh the authenticated DSH page.":s.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let a=s.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(a))throw new Error("Editor resource returned "+(a||"no Content-Type")+" instead of JavaScript.");return await s.arrayBuffer(),t?.throwIfAborted(),r(e)}var Ye="0.3.67";function tr({comparison:e,identity:t,enabled:o,single:r,line:s,sideBySide:a,ignoreWhitespace:p,wrap:f}){let d=(0,ne.useRef)(null),i=(0,ne.useRef)(null),[c,m]=(0,ne.useState)(!1),[w,g]=(0,ne.useState)("");return(0,ne.useEffect)(()=>{if(m(!1),g(""),!o)return;let S=v=>new URL("vcs-assets/"+v,document.baseURI).href,u=document.createElement("link");u.rel="stylesheet",u.href=S("editor.css"),document.head.appendChild(u);let y=er({node:d.current,comparison:e,key:t,single:r,load:v=>_e(S("editor.js")+"?v="+encodeURIComponent(Ye)+"&retry=0",{signal:v}),onReady:v=>{i.current=v,m(!0)},onError:v=>g(v.message)});return()=>{i.current=null;try{y.dispose()}finally{u.remove()}}},[o,e,t,r]),(0,ne.useEffect)(()=>{c&&r&&s&&i.current?.revealLine(s)},[c,r,s]),(0,ne.useEffect)(()=>{c&&i.current?.options({sideBySide:a,ignoreWhitespace:p,wrap:f})},[c,a,p,f]),{node:d,viewer:i,ready:c,error:w}}function le({comparison:e,identity:t,t:o,single:r=!1,line:s=null}){let[a,p]=(0,Y.useState)(!0),[f,d]=(0,Y.useState)(!1),[i,c]=(0,Y.useState)(!1),[m,w]=(0,Y.useState)(!0),{node:g,viewer:S,ready:u,error:y}=tr({comparison:e,identity:t,enabled:m,single:r,line:s,sideBySide:a,ignoreWhitespace:f,wrap:i});return Y.default.createElement("div",null,Y.default.createElement("button",{"aria-pressed":m,onClick:()=>w(v=>!v)},o(m?"historyBasic":"historyAdvanced")),u&&!r&&Y.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},Y.default.createElement("button",{"aria-pressed":a,onClick:()=>p(v=>!v)},o(a?"side":"inline")),Y.default.createElement("label",null,Y.default.createElement("input",{type:"checkbox",checked:f,onChange:v=>d(v.target.checked)}),o("whitespace")),Y.default.createElement("label",null,Y.default.createElement("input",{type:"checkbox",checked:i,onChange:v=>c(v.target.checked)}),o("wrap")),Y.default.createElement("button",{onClick:()=>S.current?.navigate("previous")},o("previous")),Y.default.createElement("button",{onClick:()=>S.current?.navigate("next")},o("next"))),m&&!u&&!y&&Y.default.createElement("p",{role:"status"},o("loading")),y&&Y.default.createElement("p",{role:"status"},o("fallback")," ",y),Y.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},Y.default.createElement("div",{ref:g,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&Y.default.createElement(Be,{comparison:e,labels:ze(o)})))}function vt(e){return A.default.createElement(to,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function to({sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:s,t:a,onRediscover:p}){let[f,d]=(0,A.useState)(r),[i,c]=(0,A.useState)(null),[m,w]=(0,A.useState)(null),[g,S]=(0,A.useState)(""),[u,y]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let v=new AbortController;return c(null),w(null),S(""),s("vcs/svn-log",{sessionId:e,repositoryId:t,token:o,snapshot:r,cursor:f,limit:50},v.signal).then(b=>{v.signal.aborted||c(b)}).catch(b=>{v.signal.aborted||(S(b.message),b.code==="vcs/rediscover-required"&&p())}),()=>v.abort()},[f,u]),A.default.createElement("section",null,A.default.createElement("p",null,a("svnHistoryScope")," \xB7 r",r),g?A.default.createElement("p",{role:"alert"},g," ",A.default.createElement("button",{onClick:()=>y(v=>v+1)},a("retry"))):i?A.default.createElement(A.default.Fragment,null,A.default.createElement("ol",null,i.entries.map(v=>A.default.createElement("li",{key:v.revision},A.default.createElement("button",{onClick:()=>w(v.revision)},"r",v.revision," \xB7 ",v.message)))),i.nextRevision!==null&&A.default.createElement("button",{onClick:()=>d(i.nextRevision)},a("historyMore"))):A.default.createElement("p",{role:"status"},a("loading")),m&&A.default.createElement(ro,{key:m,sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:s,t:a,onRediscover:p,revision:m}))}function ro({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f}){let[d,i]=(0,A.useState)(null),[c,m]=(0,A.useState)(null),[w,g]=(0,A.useState)(""),[S,u]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let y=new AbortController;return i(null),m(null),g(""),a("vcs/svn-detail",{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s},y.signal).then(v=>{y.signal.aborted||i(v)}).catch(v=>{y.signal.aborted||(g(v.message),v.code==="vcs/rediscover-required"&&f())}),()=>y.abort()},[S]),A.default.createElement("section",null,w?A.default.createElement("p",{role:"alert"},w," ",A.default.createElement("button",{onClick:()=>u(y=>y+1)},p("retry"))):d?A.default.createElement(A.default.Fragment,null,A.default.createElement("p",null,d.message),d.changes.map(y=>A.default.createElement("div",{key:y.id},A.default.createElement("span",null,y.action," ",y.path),y.kind==="file"&&A.default.createElement(A.default.Fragment,null,A.default.createElement("button",{onClick:()=>m({id:y.id,mode:"compare"})},p("svnHistoricalDiff")),A.default.createElement("button",{onClick:()=>m({id:y.id,mode:"trace"})},p("fileHistory")))))):A.default.createElement("p",{role:"status"},p("loading")),c&&A.default.createElement(oo,{key:JSON.stringify(c),sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f,...c}))}function oo({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f,id:d,mode:i}){let[c,m]=(0,A.useState)(null),[w,g]=(0,A.useState)(null),[S,u]=(0,A.useState)(""),[y,v]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let b=new AbortController;return m(null),u(""),a("vcs/svn-"+i,{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,id:d,...w===null?{}:{cursor:w}},b.signal).then(h=>{b.signal.aborted||m(h)}).catch(h=>{b.signal.aborted||(u(h.message),h.code==="vcs/rediscover-required"&&f())}),()=>b.abort()},[w,y]),S?A.default.createElement("p",{role:"alert"},S," ",A.default.createElement("button",{onClick:()=>v(b=>b+1)},p("retry"))):c?i==="compare"?c.binary?A.default.createElement("p",null,p("binary")):A.default.createElement(le,{comparison:c,identity:JSON.stringify([e,t,r,s,d]),t:p}):A.default.createElement("section",null,A.default.createElement("p",null,p("svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),A.default.createElement("ol",null,c.entries.map(b=>A.default.createElement("li",{key:b.revision},"r",b.revision," \xB7 ",b.message))),c.nextRevision!==null&&A.default.createElement("button",{onClick:()=>g(c.nextRevision)},p("historyMore"))):A.default.createElement("p",{role:"status"},p("loading"))}function gt(e){return Q.default.createElement(so,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function so({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s}){let[a,p]=(0,Q.useState)(null),[f,d]=(0,Q.useState)(!1),[i,c]=(0,Q.useState)(""),[m,w]=(0,Q.useState)(0);(0,Q.useEffect)(()=>{if(a)return()=>{Promise.resolve().then(()=>o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token})).catch(()=>{})}},[a,e,t]),(0,Q.useEffect)(()=>{if(a)try{return Ke(a.expiresAt,()=>{p(null),w(0),d(!1),c(r("svnExpired"))})}catch{p(null),c(r("svnExpired"))}},[a]),(0,Q.useEffect)(()=>{if(!m||!a)return;let u=new AbortController;return d(!0),c(""),o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(y=>{u.signal.aborted||(c(y.message),y.code==="vcs/rediscover-required"&&s())}).finally(()=>{u.signal.aborted||d(!1)}),()=>u.abort()},[m,a]);let g=u=>{try{Rt(u),c(""),w(0),p(u)}catch(y){c(y.message)}},S=async(...u)=>{try{return await o(...u)}catch(y){throw y.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),w(0),c(r("svnExpired"))),y}};return Q.default.createElement("section",null,!a&&i&&Q.default.createElement("p",{role:"status"},i),a?Q.default.createElement(Q.default.Fragment,null,Q.default.createElement("p",null,r("svnGrantScope")),Q.default.createElement("button",{disabled:f,onClick:()=>w(u=>u+1)},r("svnRevoke")),i&&Q.default.createElement("p",{role:"alert"},i),!f&&Q.default.createElement(vt,{sessionId:e,repositoryId:t,t:r,onRediscover:s,rpc:S,token:a.token,snapshot:a.snapshot})):Q.default.createElement(ht,{sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s,onApproved:g}))}var C=R(require("react"),1);function rr(e){let t=new Map;for(let o of e){let r=t.get(o.commit);r||(r={names:[],hidden:0},t.set(o.commit,r)),r.names.length<3?r.names.push(o.name):r.hidden++}return t}var T=R(require("react"),1);var B=R(require("react"),1);var V=R(require("react"),1);var U=R(require("react"),1);function bt(e){return U.default.createElement(io,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function io({sessionId:e,repositoryId:t,commit:o,path:r,rpc:s,t:a,onRediscover:p}){let[f,d]=(0,U.useState)(!1),[i,c]=(0,U.useState)([0]),[m,w]=(0,U.useState)(null),[g,S]=(0,U.useState)(""),[u,y]=(0,U.useState)(0),v=i.at(-1);(0,U.useEffect)(()=>{if(!f)return;let h=new AbortController;return w(null),S(""),s("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:o,path:r,offset:v},h.signal).then(x=>{h.signal.aborted||w(x)}).catch(x=>{h.signal.aborted||(S(x.message),x.code==="vcs/rediscover-required"&&p())}),()=>h.abort()},[f,v,e,t,o,r,u]);let b=(0,U.useMemo)(()=>m?{path:r,left:{label:o,text:m.text},right:{label:o,text:m.text}}:null,[m,r,o]);return U.default.createElement("section",null,U.default.createElement("button",{"aria-expanded":f,onClick:()=>d(h=>!h)},a("segments")),f&&U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentScope")),g?U.default.createElement("p",{role:"alert"},g," ",U.default.createElement("button",{onClick:()=>y(h=>h+1)},a("retry"))):m?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentBytes"),": ",m.offset,"\u2013",m.endOffset," / ",m.totalBytes," \xB7 ",U.default.createElement("code",null,m.oid)),U.default.createElement("button",{disabled:i.length===1,onClick:()=>c(h=>h.slice(0,-1))},a("previous")),U.default.createElement("button",{disabled:m.nextOffset===null,onClick:()=>c(h=>[...h,m.nextOffset])},a("next")),U.default.createElement(le,{single:!0,comparison:b,identity:JSON.stringify([e,t,o,r,v]),t:a})):U.default.createElement("p",{role:"status"},a("loading"))))}function Me({sessionId:e,repositoryId:t,commit:o,path:r,rpc:s,t:a,onRediscover:p,onClose:f,line:d=null}){let[i,c]=(0,V.useState)(null),[m,w]=(0,V.useState)(""),[g,S]=(0,V.useState)(0);(0,V.useEffect)(()=>{let y=new AbortController;return c(null),w(""),s("vcs/tree-file",{sessionId:e,repositoryId:t,commit:o,path:r},y.signal).then(v=>{y.signal.aborted||c(v)}).catch(v=>{y.signal.aborted||(w(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>y.abort()},[e,t,o,r,g]);let u=(0,V.useMemo)(()=>i?{path:r,left:{label:o,text:i.text||""},right:{label:o,text:i.text||""}}:null,[i,r,o]);return V.default.createElement("section",{"aria-label":a("treePreview")},V.default.createElement("h4",null,r),V.default.createElement("button",{onClick:f},a("treeClose")),V.default.createElement("p",null,V.default.createElement("code",null,o)),m?V.default.createElement("p",{role:"alert"},m," ",V.default.createElement("button",{onClick:()=>S(y=>y+1)},a("retry"))):i?V.default.createElement(V.default.Fragment,null,V.default.createElement("p",null,V.default.createElement("code",null,i.oid)," \xB7 ",a("encoding"),": ",i.encoding||"\u2014"),d&&V.default.createElement("p",{role:"status"},a("blameOriginLine"),": ",d,!i.text||d>i.text.split(`
|
|
95
|
+
`;function Qt(e,t){return async(o,r,s)=>{let a=await e.rpc.call("/vcs-rpc",o,r,s);if(!a.ok){let p=new Error(a.error?.message||String(a.error||t()));throw p.code=a.error?.code,p}return a.value}}function ut(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,o=[];function r(){for(;t<e&&o.length;){let s=o.shift();if(s.signal?.removeEventListener("abort",s.abort),s.signal?.aborted){s.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(s.signal?.aborted)throw new Error("Aborted");return s.run()}).then(s.resolve,s.reject).finally(()=>{t--,r()})}}return(s,a)=>new Promise((p,f)=>{let d={run:s,signal:a,resolve:p,reject:f,abort:null};if(d.abort=()=>{let i=o.indexOf(d);i>=0&&(o.splice(i,1),f(new Error("Aborted")))},a?.aborted){f(new Error("Aborted"));return}a?.addEventListener("abort",d.abort,{once:!0}),o.push(d),r()})}var X=R(require("react"),1);function Xt(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function $t(e="",t=""){let o=Xt(e),r=Xt(t),s=0;for(;s<o.length&&s<r.length&&o[s]===r[s];)s++;let a=0;for(;a<o.length-s&&a<r.length-s&&o[o.length-a-1]===r[r.length-a-1];)a++;let p=o.length-a,f=r.length-a,d=p-s,i=f-s,c=d&&i?(d+1)*(i+1):0,m=c>2e5,w=[],g=0;function S(u,y){g++,!(w.length>=2e3)&&w.push({left:u===null?null:{number:u+1,text:o[u]},right:y===null?null:{number:y+1,text:r[y]},kind:u===null?"insert":y===null?"delete":o[u]===r[y]?"equal":"replace"})}for(let u=0;u<s;u++)S(u,u);if(m||!d||!i)for(let u=0;u<Math.max(d,i);u++)S(u<d?s+u:null,u<i?s+u:null);else{let u=i+1,y=new Uint32Array(c);for(let h=d-1;h>=0;h--)for(let x=i-1;x>=0;x--)y[h*u+x]=o[s+h]===r[s+x]?y[(h+1)*u+x+1]+1:Math.max(y[(h+1)*u+x],y[h*u+x+1]);let v=0,b=0;for(;v<d||b<i;)v<d&&b<i&&o[s+v]===r[s+b]?S(s+v++,s+b++):v<d&&(b===i||y[(v+1)*u+b]>=y[v*u+b+1])?S(s+v++,null):S(null,s+b++)}for(let u=0;u<a;u++)S(p+u,f+u);return{rows:w,approximate:m,truncated:g>w.length,totalRows:g,omittedRows:g-w.length,leftLineCount:o.length,rightLineCount:r.length,lcsCells:m?0:c}}var _r={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."},ft={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Yr={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Qr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Xr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Be({comparison:e,labels:t={}}){let o=e?.left?.text??"",r=e?.right?.text??"",s=(0,X.useMemo)(()=>$t(o,r),[o,r]),a=f=>t[f]??_r[f],p=(f,d,i)=>{let c=f&&i!=="equal";return X.default.createElement("td",{style:{...ft,background:c?d==="left"?"#d6454520":"#259b4920":void 0}},X.default.createElement("div",{style:Yr},X.default.createElement("span",{style:Qr},f?.number??""),X.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},c?d==="left"?"\u2212":"+":""),X.default.createElement("pre",{style:Xr},f?.text??"")))};return X.default.createElement("section",{className:"vcs-text-comparison","aria-label":a("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},s.approximate&&X.default.createElement("div",{role:"status",style:{padding:8}},a("approximate")),s.truncated&&X.default.createElement("div",{role:"status",style:{padding:8}},a("truncated")," (",2e3," / ",s.totalRows,")"),X.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},X.default.createElement("thead",null,X.default.createElement("tr",null,X.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.left?.label||a("before")),X.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.right?.label||a("after")))),X.default.createElement("tbody",null,s.rows.map((f,d)=>X.default.createElement("tr",{key:d,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!s.rows.length&&X.default.createElement("p",{style:{padding:8}},a("empty")))}var W=R(require("react"),1);function Zt(e,{width:t,height:o,signal:r,timeoutMs:s=1e4,createURL:a=d=>URL.createObjectURL(d),revokeURL:p=d=>URL.revokeObjectURL(d),createImage:f=()=>new Image}={}){return new Promise((d,i)=>{if(r?.aborted){i(r.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(o)||t<1||o<1||t>8192||o>8192||t*o>16e6||!Number.isFinite(s)||s<=0){i(new Error("Invalid image preview"));return}let c,m,w,g=!1,S=!1,u=()=>{S||(S=!0,m&&(m.src=""),c&&p(c))},y=()=>{clearTimeout(w),r?.removeEventListener("abort",b)},v=h=>{g||(g=!0,y(),u(),i(h))},b=()=>v(r.reason||new Error("Image cancelled"));try{c=a(e),m=f(),r?.addEventListener("abort",b,{once:!0}),w=setTimeout(()=>v(new Error("Image decode timed out")),s),m.src=c,Promise.resolve(m.decode()).then(()=>{if(!g){if(r?.aborted){b();return}if(m.naturalWidth!==t||m.naturalHeight!==o){v(new Error("Image dimensions mismatch"));return}g=!0,y(),d({url:c,dispose:u})}},v)}catch(h){v(h)}})}function $r({side:e,sessionId:t,repositoryId:o,commit:r,parentIndex:s,base:a,target:p,workspace:f=!1,mode:d,id:i,rpc:c,t:m,onRediscover:w}){let[g,S]=(0,W.useState)(null),[u,y]=(0,W.useState)(""),[v,b]=(0,W.useState)(0);return(0,W.useEffect)(()=>{let h=new AbortController,x;return S(null),y(""),(async()=>{let k=await c(f?"vcs/workspace-image":a?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:o,mode:d,id:i,side:e}:a?{sessionId:t,repositoryId:o,base:a,target:p,id:i,side:e}:{sessionId:t,repositoryId:o,commit:r,parentIndex:s,id:i,side:e},h.signal);if(h.signal.aborted)return;if(k.absent){S(k);return}if(!["image/png","image/jpeg","image/webp"].includes(k.mime)||typeof k.base64!="string"||k.base64.length>2796204||!Number.isInteger(k.bytes)||k.bytes<1||k.bytes>2097152)throw Error(m("imageInvalid"));let O=atob(k.base64);if(O.length!==k.bytes)throw Error(m("imageInvalid"));let N=new Blob([Uint8Array.from(O,q=>q.charCodeAt(0))],{type:k.mime});if(x=await Zt(N,{width:k.width,height:k.height,signal:h.signal}),h.signal.aborted){x.dispose();return}S({...k,url:x.url})})().catch(k=>{h.signal.aborted||(y(k.message),k.code==="vcs/rediscover-required"&&w())}),()=>{h.abort(),x?.dispose()}},[e,t,o,r,s,a,p,f,d,i,v]),W.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":m(e==="left"?"imageBefore":"imageAfter")},W.default.createElement("h5",null,m(e==="left"?"imageBefore":"imageAfter")),u?W.default.createElement("p",{role:"alert"},u," ",W.default.createElement("button",{onClick:()=>b(h=>h+1)},m("retry"))):g?W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,W.default.createElement("code",null,g.commit)," \xB7 ",g.path),g.absent?W.default.createElement("p",null,m("imageAbsent")):W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,g.width," \xD7 ",g.height," \xB7 ",g.bytes," B"),W.default.createElement("img",{src:g.url,alt:g.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),g.metadataStripped&&W.default.createElement("p",null,m("imageMetadata")))):W.default.createElement("p",{role:"status"},m("loading")))}function Fe(e){let[t,o]=(0,W.useState)(!1);return W.default.createElement("div",null,W.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("imageCompare")),t&&W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,e.t("imageScope")),W.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(r=>W.default.createElement($r,{key:r,...e,side:r})))))}function ze(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var G=R(require("react"),1);function mt(e){return G.default.createElement(Zr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Zr({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s}){let[a,p]=(0,G.useState)(!1),[f,d]=(0,G.useState)(null),[i,c]=(0,G.useState)(""),[m,w]=(0,G.useState)(0);return(0,G.useEffect)(()=>{if(!a)return;let g=new AbortController;return d(null),c(""),o("vcs/svn-identity",{sessionId:e,repositoryId:t},g.signal).then(S=>{g.signal.aborted||d(S)}).catch(S=>{g.signal.aborted||(c(S.message),S.code==="vcs/rediscover-required"&&s())}),()=>g.abort()},[a,e,t,m]),G.default.createElement("section",null,G.default.createElement("button",{"aria-expanded":a,onClick:()=>p(g=>!g)},r("svnIdentity")),a&&G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,r("svnOfflineIdentity")),i?G.default.createElement("p",{role:"alert"},i," ",G.default.createElement("button",{onClick:()=>w(g=>g+1)},r("retry"))):f?G.default.createElement(G.default.Fragment,null,G.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(g=>G.default.createElement(G.default.Fragment,{key:g},G.default.createElement("dt",null,g),G.default.createElement("dd",null,G.default.createElement("code",null,f[g]))))),G.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))):G.default.createElement("p",{role:"status"},r("loading"))))}function Ke(e,t,{now:o=Date.now,schedule:r=setTimeout,cancel:s=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=o()||e-o()>3e5)throw Error("Invalid SVN consent expiry");let a=!0,p=r(()=>{a&&(a=!1,t())},e-o());return()=>{a&&(a=!1,s(p))}}function Rt(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 Q=R(require("react"),1);var M=R(require("react"),1);function ht(e){return M.default.createElement(Rr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Rr({sessionId:e,repositoryId:t,rpc:o,t:r,onApproved:s,onRediscover:a}){let[p,f]=(0,M.useState)(!1),[d,i]=(0,M.useState)(null),[c,m]=(0,M.useState)(!1),[w,g]=(0,M.useState)(""),[S,u]=(0,M.useState)(!1),[y,v]=(0,M.useState)(0);(0,M.useEffect)(()=>{if(!p)return;let x=new AbortController;return i(null),m(!1),g(""),u(!0),o("vcs/svn-describe",{sessionId:e,repositoryId:t},x.signal).then(k=>{x.signal.aborted||i(k)}).catch(k=>{x.signal.aborted||(g(k.message),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{x.signal.aborted||u(!1)}),()=>x.abort()},[p,e,t,y]);let[b,h]=(0,M.useState)(0);return(0,M.useEffect)(()=>{if(!p||!d||d.expiresAt===void 0)return;let x=()=>{i(null),m(!1),h(0),u(!1),g(r("svnOfferExpired"))};try{return Ke(d.expiresAt,x)}catch{x()}},[p,d]),(0,M.useEffect)(()=>{if(!b||!p||!d)return;let x=new AbortController;return u(!0),g(""),o("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:d.offer,explicit:!0},x.signal).then(k=>{x.signal.aborted||s(k)}).catch(k=>{x.signal.aborted||(g(k.message),m(!1),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{x.signal.aborted||u(!1)}),()=>x.abort()},[b,p,d]),M.default.createElement("section",null,M.default.createElement("button",{"aria-expanded":p,onClick:()=>{h(0),f(x=>!x)}},r("svnConsentReview")),p&&M.default.createElement(M.default.Fragment,null,M.default.createElement("p",null,r("svnConsentScope")),w&&M.default.createElement("p",{role:"alert"},w," ",M.default.createElement("button",{disabled:S,onClick:()=>{h(0),v(x=>x+1)}},r("retry"))),d&&M.default.createElement(M.default.Fragment,null,M.default.createElement("dl",null,["origin","root","uuid","scope"].map(x=>M.default.createElement(M.default.Fragment,{key:x},M.default.createElement("dt",null,x),M.default.createElement("dd",null,M.default.createElement("code",null,d[x]))))),d.remoteEnabled?M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:c,disabled:S,onChange:x=>m(x.target.checked)}),r("svnConsentExplicit")),M.default.createElement("button",{disabled:S||!c,onClick:()=>h(x=>x+1)},r("svnConsentApprove"))):M.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))),S&&M.default.createElement("p",{role:"status"},r("loading"))))}var A=R(require("react"),1);var Y=R(require("react"),1);var ne=require("react");function er({load:e,node:t,comparison:o,key:r,single:s=!1,onReady:a=()=>{},onError:p=()=>{}}){let f=new AbortController,d,i=!1,c=()=>{let w=d;d=void 0,w?.dispose()};return{done:Promise.resolve().then(()=>(f.signal.throwIfAborted(),e(f.signal))).then(w=>{i||(d=w.createDiff(t,{single:s}),d.setContent(o,r),i||a(d))}).catch(w=>{try{c()}finally{i||p(w)}}),dispose(){i||(i=!0,f.abort(),c())}}}async function _e(e,{signal:t,fetcher:o=fetch,importer:r=s=>import(s)}={}){let s=await o(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!s.ok)throw new Error("Editor resource HTTP "+s.status+" ("+e+"). "+(s.status===401?"Refresh the authenticated DSH page.":s.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let a=s.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(a))throw new Error("Editor resource returned "+(a||"no Content-Type")+" instead of JavaScript.");return await s.arrayBuffer(),t?.throwIfAborted(),r(e)}var Ye="0.3.68";function tr({comparison:e,identity:t,enabled:o,single:r,line:s,sideBySide:a,ignoreWhitespace:p,wrap:f}){let d=(0,ne.useRef)(null),i=(0,ne.useRef)(null),[c,m]=(0,ne.useState)(!1),[w,g]=(0,ne.useState)("");return(0,ne.useEffect)(()=>{if(m(!1),g(""),!o)return;let S=v=>new URL("vcs-assets/"+v,document.baseURI).href,u=document.createElement("link");u.rel="stylesheet",u.href=S("editor.css"),document.head.appendChild(u);let y=er({node:d.current,comparison:e,key:t,single:r,load:v=>_e(S("editor.js")+"?v="+encodeURIComponent(Ye)+"&retry=0",{signal:v}),onReady:v=>{i.current=v,m(!0)},onError:v=>g(v.message)});return()=>{i.current=null;try{y.dispose()}finally{u.remove()}}},[o,e,t,r]),(0,ne.useEffect)(()=>{c&&r&&s&&i.current?.revealLine(s)},[c,r,s]),(0,ne.useEffect)(()=>{c&&i.current?.options({sideBySide:a,ignoreWhitespace:p,wrap:f})},[c,a,p,f]),{node:d,viewer:i,ready:c,error:w}}function le({comparison:e,identity:t,t:o,single:r=!1,line:s=null}){let[a,p]=(0,Y.useState)(!0),[f,d]=(0,Y.useState)(!1),[i,c]=(0,Y.useState)(!1),[m,w]=(0,Y.useState)(!0),{node:g,viewer:S,ready:u,error:y}=tr({comparison:e,identity:t,enabled:m,single:r,line:s,sideBySide:a,ignoreWhitespace:f,wrap:i});return Y.default.createElement("div",null,Y.default.createElement("button",{"aria-pressed":m,onClick:()=>w(v=>!v)},o(m?"historyBasic":"historyAdvanced")),u&&!r&&Y.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},Y.default.createElement("button",{"aria-pressed":a,onClick:()=>p(v=>!v)},o(a?"side":"inline")),Y.default.createElement("label",null,Y.default.createElement("input",{type:"checkbox",checked:f,onChange:v=>d(v.target.checked)}),o("whitespace")),Y.default.createElement("label",null,Y.default.createElement("input",{type:"checkbox",checked:i,onChange:v=>c(v.target.checked)}),o("wrap")),Y.default.createElement("button",{onClick:()=>S.current?.navigate("previous")},o("previous")),Y.default.createElement("button",{onClick:()=>S.current?.navigate("next")},o("next"))),m&&!u&&!y&&Y.default.createElement("p",{role:"status"},o("loading")),y&&Y.default.createElement("p",{role:"status"},o("fallback")," ",y),Y.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},Y.default.createElement("div",{ref:g,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&Y.default.createElement(Be,{comparison:e,labels:ze(o)})))}function vt(e){return A.default.createElement(to,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function to({sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:s,t:a,onRediscover:p}){let[f,d]=(0,A.useState)(r),[i,c]=(0,A.useState)(null),[m,w]=(0,A.useState)(null),[g,S]=(0,A.useState)(""),[u,y]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let v=new AbortController;return c(null),w(null),S(""),s("vcs/svn-log",{sessionId:e,repositoryId:t,token:o,snapshot:r,cursor:f,limit:50},v.signal).then(b=>{v.signal.aborted||c(b)}).catch(b=>{v.signal.aborted||(S(b.message),b.code==="vcs/rediscover-required"&&p())}),()=>v.abort()},[f,u]),A.default.createElement("section",null,A.default.createElement("p",null,a("svnHistoryScope")," \xB7 r",r),g?A.default.createElement("p",{role:"alert"},g," ",A.default.createElement("button",{onClick:()=>y(v=>v+1)},a("retry"))):i?A.default.createElement(A.default.Fragment,null,A.default.createElement("ol",null,i.entries.map(v=>A.default.createElement("li",{key:v.revision},A.default.createElement("button",{onClick:()=>w(v.revision)},"r",v.revision," \xB7 ",v.message)))),i.nextRevision!==null&&A.default.createElement("button",{onClick:()=>d(i.nextRevision)},a("historyMore"))):A.default.createElement("p",{role:"status"},a("loading")),m&&A.default.createElement(ro,{key:m,sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:s,t:a,onRediscover:p,revision:m}))}function ro({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f}){let[d,i]=(0,A.useState)(null),[c,m]=(0,A.useState)(null),[w,g]=(0,A.useState)(""),[S,u]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let y=new AbortController;return i(null),m(null),g(""),a("vcs/svn-detail",{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s},y.signal).then(v=>{y.signal.aborted||i(v)}).catch(v=>{y.signal.aborted||(g(v.message),v.code==="vcs/rediscover-required"&&f())}),()=>y.abort()},[S]),A.default.createElement("section",null,w?A.default.createElement("p",{role:"alert"},w," ",A.default.createElement("button",{onClick:()=>u(y=>y+1)},p("retry"))):d?A.default.createElement(A.default.Fragment,null,A.default.createElement("p",null,d.message),d.changes.map(y=>A.default.createElement("div",{key:y.id},A.default.createElement("span",null,y.action," ",y.path),y.kind==="file"&&A.default.createElement(A.default.Fragment,null,A.default.createElement("button",{onClick:()=>m({id:y.id,mode:"compare"})},p("svnHistoricalDiff")),A.default.createElement("button",{onClick:()=>m({id:y.id,mode:"trace"})},p("fileHistory")))))):A.default.createElement("p",{role:"status"},p("loading")),c&&A.default.createElement(oo,{key:JSON.stringify(c),sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f,...c}))}function oo({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,rpc:a,t:p,onRediscover:f,id:d,mode:i}){let[c,m]=(0,A.useState)(null),[w,g]=(0,A.useState)(null),[S,u]=(0,A.useState)(""),[y,v]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let b=new AbortController;return m(null),u(""),a("vcs/svn-"+i,{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:s,id:d,...w===null?{}:{cursor:w}},b.signal).then(h=>{b.signal.aborted||m(h)}).catch(h=>{b.signal.aborted||(u(h.message),h.code==="vcs/rediscover-required"&&f())}),()=>b.abort()},[w,y]),S?A.default.createElement("p",{role:"alert"},S," ",A.default.createElement("button",{onClick:()=>v(b=>b+1)},p("retry"))):c?i==="compare"?c.binary?A.default.createElement("p",null,p("binary")):A.default.createElement(le,{comparison:c,identity:JSON.stringify([e,t,r,s,d]),t:p}):A.default.createElement("section",null,A.default.createElement("p",null,p("svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),A.default.createElement("ol",null,c.entries.map(b=>A.default.createElement("li",{key:b.revision},"r",b.revision," \xB7 ",b.message))),c.nextRevision!==null&&A.default.createElement("button",{onClick:()=>g(c.nextRevision)},p("historyMore"))):A.default.createElement("p",{role:"status"},p("loading"))}function gt(e){return Q.default.createElement(so,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function so({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s}){let[a,p]=(0,Q.useState)(null),[f,d]=(0,Q.useState)(!1),[i,c]=(0,Q.useState)(""),[m,w]=(0,Q.useState)(0);(0,Q.useEffect)(()=>{if(a)return()=>{Promise.resolve().then(()=>o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token})).catch(()=>{})}},[a,e,t]),(0,Q.useEffect)(()=>{if(a)try{return Ke(a.expiresAt,()=>{p(null),w(0),d(!1),c(r("svnExpired"))})}catch{p(null),c(r("svnExpired"))}},[a]),(0,Q.useEffect)(()=>{if(!m||!a)return;let u=new AbortController;return d(!0),c(""),o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(y=>{u.signal.aborted||(c(y.message),y.code==="vcs/rediscover-required"&&s())}).finally(()=>{u.signal.aborted||d(!1)}),()=>u.abort()},[m,a]);let g=u=>{try{Rt(u),c(""),w(0),p(u)}catch(y){c(y.message)}},S=async(...u)=>{try{return await o(...u)}catch(y){throw y.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),w(0),c(r("svnExpired"))),y}};return Q.default.createElement("section",null,!a&&i&&Q.default.createElement("p",{role:"status"},i),a?Q.default.createElement(Q.default.Fragment,null,Q.default.createElement("p",null,r("svnGrantScope")),Q.default.createElement("button",{disabled:f,onClick:()=>w(u=>u+1)},r("svnRevoke")),i&&Q.default.createElement("p",{role:"alert"},i),!f&&Q.default.createElement(vt,{sessionId:e,repositoryId:t,t:r,onRediscover:s,rpc:S,token:a.token,snapshot:a.snapshot})):Q.default.createElement(ht,{sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s,onApproved:g}))}var C=R(require("react"),1);function rr(e){let t=new Map;for(let o of e){let r=t.get(o.commit);r||(r={names:[],hidden:0},t.set(o.commit,r)),r.names.length<3?r.names.push(o.name):r.hidden++}return t}var T=R(require("react"),1);var B=R(require("react"),1);var V=R(require("react"),1);var U=R(require("react"),1);function bt(e){return U.default.createElement(io,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function io({sessionId:e,repositoryId:t,commit:o,path:r,rpc:s,t:a,onRediscover:p}){let[f,d]=(0,U.useState)(!1),[i,c]=(0,U.useState)([0]),[m,w]=(0,U.useState)(null),[g,S]=(0,U.useState)(""),[u,y]=(0,U.useState)(0),v=i.at(-1);(0,U.useEffect)(()=>{if(!f)return;let h=new AbortController;return w(null),S(""),s("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:o,path:r,offset:v},h.signal).then(x=>{h.signal.aborted||w(x)}).catch(x=>{h.signal.aborted||(S(x.message),x.code==="vcs/rediscover-required"&&p())}),()=>h.abort()},[f,v,e,t,o,r,u]);let b=(0,U.useMemo)(()=>m?{path:r,left:{label:o,text:m.text},right:{label:o,text:m.text}}:null,[m,r,o]);return U.default.createElement("section",null,U.default.createElement("button",{"aria-expanded":f,onClick:()=>d(h=>!h)},a("segments")),f&&U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentScope")),g?U.default.createElement("p",{role:"alert"},g," ",U.default.createElement("button",{onClick:()=>y(h=>h+1)},a("retry"))):m?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentBytes"),": ",m.offset,"\u2013",m.endOffset," / ",m.totalBytes," \xB7 ",U.default.createElement("code",null,m.oid)),U.default.createElement("button",{disabled:i.length===1,onClick:()=>c(h=>h.slice(0,-1))},a("previous")),U.default.createElement("button",{disabled:m.nextOffset===null,onClick:()=>c(h=>[...h,m.nextOffset])},a("next")),U.default.createElement(le,{single:!0,comparison:b,identity:JSON.stringify([e,t,o,r,v]),t:a})):U.default.createElement("p",{role:"status"},a("loading"))))}function Me({sessionId:e,repositoryId:t,commit:o,path:r,rpc:s,t:a,onRediscover:p,onClose:f,line:d=null}){let[i,c]=(0,V.useState)(null),[m,w]=(0,V.useState)(""),[g,S]=(0,V.useState)(0);(0,V.useEffect)(()=>{let y=new AbortController;return c(null),w(""),s("vcs/tree-file",{sessionId:e,repositoryId:t,commit:o,path:r},y.signal).then(v=>{y.signal.aborted||c(v)}).catch(v=>{y.signal.aborted||(w(v.message),v.code==="vcs/rediscover-required"&&p())}),()=>y.abort()},[e,t,o,r,g]);let u=(0,V.useMemo)(()=>i?{path:r,left:{label:o,text:i.text||""},right:{label:o,text:i.text||""}}:null,[i,r,o]);return V.default.createElement("section",{"aria-label":a("treePreview")},V.default.createElement("h4",null,r),V.default.createElement("button",{onClick:f},a("treeClose")),V.default.createElement("p",null,V.default.createElement("code",null,o)),m?V.default.createElement("p",{role:"alert"},m," ",V.default.createElement("button",{onClick:()=>S(y=>y+1)},a("retry"))):i?V.default.createElement(V.default.Fragment,null,V.default.createElement("p",null,V.default.createElement("code",null,i.oid)," \xB7 ",a("encoding"),": ",i.encoding||"\u2014"),d&&V.default.createElement("p",{role:"status"},a("blameOriginLine"),": ",d,!i.text||d>i.text.split(`
|
|
96
96
|
`).length?" \xB7 "+a("blameUnmapped"):""),i.notice&&V.default.createElement("p",{role:"status"},i.notice),i.binary?V.default.createElement("p",null,a("binary")):i.text===""?V.default.createElement("p",null,a("treeEmpty")):V.default.createElement(le,{single:!0,line:d,comparison:u,identity:JSON.stringify([e,t,o,r]),t:a})):V.default.createElement("p",{role:"status"},a("loading")),V.default.createElement(bt,{sessionId:e,repositoryId:t,commit:o,path:r,rpc:s,t:a,onRediscover:p}))}function or(e=""){let t=[{path:"",name:"/"}];if(e){let o="";for(let r of e.split("/"))o=o?o+"/"+r:r,t.push({path:o,name:r})}return t}function sr(e,t="",o=""){let r=t?t+"/":"",s=o.toLowerCase();return e.filter(a=>{let p=a.path.slice(r.length);return a.path.startsWith(r)&&p.length>0&&!p.includes("/")&&p.toLowerCase().includes(s)}).sort((a,p)=>+(p.type==="tree")-+(a.type==="tree")||(a.path<p.path?-1:a.path>p.path?1:0))}function no({sessionId:e,repositoryId:t,commit:o,rpc:r,t:s,onRediscover:a}){let[p,f]=(0,B.useState)(null),[d,i]=(0,B.useState)(""),[c,m]=(0,B.useState)(0),[w,g]=(0,B.useState)(""),[S,u]=(0,B.useState)(0),[y,v]=(0,B.useState)(""),[b,h]=(0,B.useState)(null);if((0,B.useEffect)(()=>{let N=new AbortController;return f(null),i(""),r("vcs/tree",{sessionId:e,repositoryId:t,commit:o},N.signal).then(q=>{N.signal.aborted||f(q)}).catch(q=>{N.signal.aborted||(i(q.message),q.code==="vcs/rediscover-required"&&a())}),()=>N.abort()},[e,t,o,c]),d)return B.default.createElement("p",{role:"alert"},d," ",B.default.createElement("button",{onClick:()=>m(N=>N+1)},s("retry")));if(!p)return B.default.createElement("p",{role:"status"},s("loading"));let x=w?w+"/":"",k=sr(p.entries,w,y),O=N=>{g(N),u(0),v(""),h(null)};return B.default.createElement("section",{"aria-label":s("historicalTree")},B.default.createElement("p",null,s("historicalTreeScope")),B.default.createElement("code",null,o),B.default.createElement("p",null,w||"/"," ",w&&B.default.createElement("button",{onClick:()=>O(w.includes("/")?w.slice(0,w.lastIndexOf("/")):"")},s("treeUp"))),B.default.createElement("nav",{"aria-label":s("treeBreadcrumbs")},or(w).map(N=>B.default.createElement(B.default.Fragment,{key:N.path},N.path&&" / ",N.path===w?B.default.createElement("span",{"aria-current":"location"},N.name):B.default.createElement("button",{onClick:()=>O(N.path)},N.name)))),B.default.createElement("label",null,s("treeSearch")," ",B.default.createElement("input",{"aria-label":s("treeSearch"),value:y,onChange:N=>{v(N.target.value),u(0),h(null)}})),B.default.createElement("p",null,k.length," ",s("treeEntries")),!k.length&&y&&B.default.createElement("p",{role:"status"},s("emptySearch")),B.default.createElement("ul",null,k.slice(S*100,S*100+100).map(N=>B.default.createElement("li",{key:N.path},N.type==="tree"?B.default.createElement("button",{onClick:()=>O(N.path)},N.path.slice(x.length),"/"):N.type==="blob"&&["100644","100755"].includes(N.mode)?B.default.createElement("button",{"aria-pressed":b===N.path,onClick:()=>h(N.path)},N.path.slice(x.length)):B.default.createElement("span",null,N.path.slice(x.length))," \xB7 ",B.default.createElement("code",null,N.mode," ",N.type," ",B.default.createElement("span",{title:N.oid},N.oid.slice(0,10)))))),S>0&&B.default.createElement("button",{onClick:()=>{u(N=>N-1),h(null)}},s("treePrevious")),(S+1)*100<k.length&&B.default.createElement("button",{onClick:()=>{u(N=>N+1),h(null)}},s("treeNext")),b&&B.default.createElement(Me,{key:JSON.stringify([e,t,o,b]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:s,onRediscover:a,path:b,onClose:()=>h(null)}))}function yt(e){return B.default.createElement(ao,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function ao(e){let[t,o]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historicalTree")),t&&B.default.createElement(no,{...e}))}var $=R(require("react"),1);var F=R(require("react"),1);function lo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:s,follow:a,rpc:p,t:f,onRediscover:d,onSelectCommit:i}){let[c,m]=(0,F.useState)({commits:[],nextOffset:null}),[w,g]=(0,F.useState)(0),[S,u]=(0,F.useState)(0),[y,v]=(0,F.useState)(!0),[b,h]=(0,F.useState)("");return(0,F.useEffect)(()=>{let x=new AbortController;return v(!0),h(""),p("vcs/file-history",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:s,offset:w,limit:50,follow:a},x.signal).then(k=>{x.signal.aborted||m(O=>({...k,commits:w?[...O.commits,...k.commits]:k.commits}))}).catch(k=>{x.signal.aborted||(h(k.message),k.code==="vcs/rediscover-required"&&d())}).finally(()=>{x.signal.aborted||v(!1)}),()=>x.abort()},[e,t,o,r,s,w,S]),F.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":y},F.default.createElement("p",null,f("fileHistoryScope")),F.default.createElement("p",{style:{overflowWrap:"anywhere"}},c.path," \xB7 ",F.default.createElement("code",null,o)),F.default.createElement("ol",null,c.commits.map(x=>F.default.createElement("li",{key:x.id},F.default.createElement("code",{title:x.id},x.id.slice(0,10))," \xB7 ",i?F.default.createElement("button",{onClick:()=>i(x.id,x.path||c.path)},x.subject):x.subject,F.default.createElement("div",null,x.boundary&&F.default.createElement("span",null,f(x.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":"fileHistoryBoundary")," "),x.path&&F.default.createElement("code",null,x.oldPath?x.oldPath+" \u2192 ":"",x.path)," ",x.author," \xB7 ",F.default.createElement("time",{dateTime:x.date},x.date))))),y&&F.default.createElement("p",{role:"status"},f("loading")),b&&F.default.createElement("p",{role:"alert"},b," ",F.default.createElement("button",{onClick:()=>u(x=>x+1)},f("retry"))),!y&&!b&&!c.commits.length&&F.default.createElement("p",null,f("historyEmpty")),c.truncated&&F.default.createElement("p",{role:"status"},f("historyLimit")),!b&&c.nextOffset!==null&&F.default.createElement("button",{disabled:y,onClick:()=>g(c.nextOffset)},f("historyMore")))}function xt(e){return F.default.createElement(co,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.id]),...e})}function co(e){let[t,o]=(0,F.useState)(!1),[r,s]=(0,F.useState)(!1);return F.default.createElement("div",null,F.default.createElement("button",{"aria-expanded":t,onClick:()=>o(a=>!a)},e.t("fileHistory")),t&&F.default.createElement(F.default.Fragment,null,F.default.createElement("label",null,F.default.createElement("input",{type:"checkbox",checked:r,onChange:a=>s(a.target.checked)}),e.t("fileHistoryFollow")),F.default.createElement("p",null,e.t("fileHistoryFollowScope")),F.default.createElement(lo,{key:String(r),follow:r,...e})))}var D=R(require("react"),1);function po({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:s,rpc:a,t:p,onRediscover:f,onSelectCommit:d}){let[i,c]=(0,D.useState)(null),[m,w]=(0,D.useState)(""),[g,S]=(0,D.useState)(0),[u,y]=(0,D.useState)(1),[v,b]=(0,D.useState)(null);return(0,D.useEffect)(()=>{let h=new AbortController;return c(null),w(""),b(null),a("vcs/blame",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:s,startLine:u,lineLimit:500},h.signal).then(x=>{h.signal.aborted||c(x)}).catch(x=>{h.signal.aborted||(w(x.message),x.code==="vcs/rediscover-required"&&f())}),()=>h.abort()},[e,t,o,r,s,g,u]),m?D.default.createElement("p",{role:"alert"},m," ",D.default.createElement("button",{onClick:()=>S(h=>h+1)},p("retry"))):i?D.default.createElement("section",{"aria-label":p("blame")},D.default.createElement("p",null,p("blameScope")),d&&D.default.createElement("p",null,p("blameNavigation")),i.notice&&D.default.createElement("p",{role:"status"},i.notice),i.truncated&&D.default.createElement("p",{role:"status"},p("blameLimit")),!i.notice&&!i.lines.length&&D.default.createElement("p",null,p("blameEmpty")),!!i.lines.length&&D.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},D.default.createElement("table",null,D.default.createElement("thead",null,D.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(h=>D.default.createElement("th",{key:h,scope:"col"},p(h))))),D.default.createElement("tbody",null,i.lines.map(h=>D.default.createElement("tr",{key:h.line},D.default.createElement("th",{scope:"row"},h.line),D.default.createElement("td",null,d?D.default.createElement("button",{title:h.commit,onClick:()=>d(h.commit)},D.default.createElement("code",null,h.commit.slice(0,10))):D.default.createElement("code",{title:h.commit},h.commit.slice(0,10))),D.default.createElement("td",null,h.author),D.default.createElement("td",null,h.summary),D.default.createElement("td",null,D.default.createElement("pre",{style:{margin:0}},h.text),h.path&&h.originalLine?D.default.createElement("button",{onClick:()=>b(h)},p("blameOriginLine"),": ",h.path,":",h.originalLine):D.default.createElement("span",null,p("blameUnmapped")))))))),D.default.createElement("p",null,i.startLine||u,"\u2013",i.lines.at(-1)?.line||u," / ",i.totalLines??"\u2014"),D.default.createElement("button",{disabled:u===1,onClick:()=>y(Math.max(1,u-500))},p("blamePrevious")),D.default.createElement("button",{disabled:i.nextLine==null,onClick:()=>y(i.nextLine)},p("blameNext")),v&&D.default.createElement(Me,{key:JSON.stringify([v.commit,v.path,v.originalLine]),sessionId:e,repositoryId:t,commit:v.commit,path:v.path,line:v.originalLine,rpc:a,t:p,onRediscover:f,onClose:()=>b(null)})):D.default.createElement("p",{role:"status"},p("loading"))}function wt(e){let[t,o]=(0,D.useState)(!1);return D.default.createElement("div",null,D.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("blame")),t&&D.default.createElement(po,{...e}))}function Te({sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:s,target:a,id:p,rpc:f,t:d,onRediscover:i,onSelectCommit:c}){let[m,w]=(0,$.useState)(null),[g,S]=(0,$.useState)(""),[u,y]=(0,$.useState)(0);return(0,$.useEffect)(()=>{let v=new AbortController;return w(null),S(""),f(s?"vcs/revision-compare":"vcs/commit-compare",s?{sessionId:e,repositoryId:t,base:s,target:a,id:p}:{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p},v.signal).then(b=>{v.signal.aborted||w(b)}).catch(b=>{v.signal.aborted||(S(b.message),b.code==="vcs/rediscover-required"&&i())}),()=>v.abort()},[e,t,o,r,s,a,p,u]),g?$.default.createElement("p",{role:"alert"},g," ",$.default.createElement("button",{onClick:()=>y(v=>v+1)},d("retry"))):m?$.default.createElement("section",null,$.default.createElement("h4",null,m.path),$.default.createElement("p",null,m.left.label," \u2194 ",m.right.label),m.notice&&$.default.createElement("p",{role:"status"},m.notice),m.binary?$.default.createElement("p",null,d("binary")):$.default.createElement(le,{comparison:m,identity:JSON.stringify(s?[e,t,s,a,p]:[e,t,o,r,p]),t:d}),o&&!s&&$.default.createElement(xt,{onSelectCommit:c,key:"file-history:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:i}),o&&!s&&$.default.createElement(wt,{onSelectCommit:c,key:"blame:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:i}),(o||s)&&$.default.createElement(Fe,{key:"image:"+JSON.stringify([e,t,o,r,s,a,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:s,target:a,id:p,rpc:f,t:d,onRediscover:i})):$.default.createElement("p",{role:"status"},d("loading"))}function ir(e,t){if(typeof t!="string"||!t)return null;let o=e.filter(r=>r.path===t);return o.length===1&&typeof o[0].id=="string"&&o[0].id?o[0].id:null}function nr(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.id,r.author,r.subject].some(s=>s?.toLowerCase().includes(o))):e}function Qe(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.path,r.oldPath].some(s=>s?.toLowerCase().includes(o))):e}function St(e){return T.default.createElement(uo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function uo({sessionId:e,repositoryId:t,commit:o,rpc:r,t:s,onRediscover:a,onSelectCommit:p,initialPath:f}){let d=(0,T.useRef)(!0),[i,c]=(0,T.useState)(null),[m,w]=(0,T.useState)(""),[g,S]=(0,T.useState)(0),[u,y]=(0,T.useState)(null),[v,b]=(0,T.useState)(""),[h,x]=(0,T.useState)(0);if((0,T.useEffect)(()=>{let O=new AbortController;return y(null),b(""),r("vcs/commit",{sessionId:e,repositoryId:t,commit:o,parentIndex:g},O.signal).then(N=>{O.signal.aborted||(y(N),d.current&&(d.current=!1,c(ir(N.changes,f))))}).catch(N=>{O.signal.aborted||(b(N.message),N.code==="vcs/rediscover-required"&&a())}),()=>O.abort()},[e,t,o,g,h]),v)return T.default.createElement("p",{role:"alert"},v," ",T.default.createElement("button",{onClick:()=>x(O=>O+1)},s("retry")));if(!u)return T.default.createElement("p",{role:"status"},s("loading"));let k=Qe(u.changes,m);return T.default.createElement("section",{"aria-label":s("commitDetails")},T.default.createElement("h3",null,u.subject),T.default.createElement("code",null,u.id),T.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&T.default.createElement("p",{role:"status"},s("commitMessageLimit")),u.message&&T.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&T.default.createElement("label",null,s("commitParent")," ",T.default.createElement("select",{"aria-label":s("commitParent"),value:g,onChange:O=>{c(null),y(null),S(Number(O.target.value))}},u.parents.map((O,N)=>T.default.createElement("option",{key:O,value:N},N+1,": ",O.slice(0,10))))),T.default.createElement("p",null,u.parent||s("commitRoot")," \u2192 ",u.id.slice(0,10)),T.default.createElement("label",null,s("commitFileSearch")," ",T.default.createElement("input",{"aria-label":s("commitFileSearch"),value:m,onChange:O=>{w(O.target.value),c(null)}})),T.default.createElement("span",null," ",k.length," / ",u.changes.length),T.default.createElement("ul",null,k.map(O=>T.default.createElement("li",{key:O.id},T.default.createElement("button",{"aria-pressed":i===O.id,onClick:()=>c(O.id)},O.status," \xB7 ",O.oldPath?O.oldPath+" \u2192 ":"",O.path)))),!!u.changes.length&&!k.length&&T.default.createElement("p",{role:"status"},s("emptySearch")),!u.changes.length&&T.default.createElement("p",null,s("commitNoChanges")),i&&T.default.createElement(Te,{key:i,sessionId:e,repositoryId:t,commit:o,parentIndex:g,id:i,onSelectCommit:p,rpc:r,t:s,onRediscover:a}),T.default.createElement(yt,{key:JSON.stringify([e,t,o]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:s,onRediscover:a}))}var z=R(require("react"),1);function ar(e){if(!Array.isArray(e))throw new Error("Invalid graph commits");let t=e.slice(0,200),o=new Map,r=[],s=[],a=f=>typeof f=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(f);for(let[f,d]of t.entries()){if(!d||!a(d.id)||!Array.isArray(d.parents)||o.has(d.id))throw new Error("Invalid graph node");o.set(d.id,f),r.push({id:d.id,row:f})}let p=!1;for(let f of t){let d=new Set;for(let i of f.parents){if(s.length===1e3){p=!0;break}if(!a(i)||i.length!==f.id.length||i===f.id||d.has(i))throw new Error("Invalid graph parent");d.add(i);let c=o.get(i);if(c!==void 0&&c<=o.get(f.id))throw new Error("Graph requires child-before-parent order");s.push({from:f.id,to:i,missing:c===void 0})}if(p)break}return{nodes:r,edges:s,nodesTruncated:e.length>200,edgesTruncated:p}}function lr(e){let t=Array(32).fill(null),o=new Map,r=[],s=new Set,a=!1,p=i=>{if(s.has(i))return null;let c=t.indexOf(i);return c>=0?c:(c=t.indexOf(null),c<0?(a=!0,s.add(i),null):(t[c]=i,c))},f=new Map;for(let i of e.edges){if(i.missing)continue;let c=f.get(i.from)||[];c.push(i.to),f.set(i.from,c)}for(let i of e.nodes){let c=p(i.id);if(o.set(i.id,{...i,lane:c}),r.push({...i,lane:c}),c===null)continue;t[c]=null;let m=f.get(i.id)||[];for(let[w,g]of m.entries())t.includes(g)||(w===0&&t[c]===null?t[c]=g:p(g))}let d=e.edges.filter(i=>!i.missing).flatMap(i=>{let c=o.get(i.from),m=o.get(i.to);return c.lane===null||m.lane===null?[]:[{...i,start:c.row,end:m.row,fromLane:c.lane,toLane:m.lane}]});return{nodes:r,edges:d,lanesTruncated:a,laneCount:Math.max(1,...r.map(i=>(i.lane??0)+1))}}function fo({commits:e,selected:t,onSelect:o,t:r}){let s;try{s=ar(e)}catch{return z.default.createElement("p",{role:"alert"},r("graphInvalid"))}let a=lr(s),p=a.edges,f=Math.max(100,24+18*a.laneCount),d=Math.max(40,s.nodes.length*36);return z.default.createElement("section",{"aria-label":r("historyGraph")},z.default.createElement("p",null,r("graphScope")),a.lanesTruncated&&z.default.createElement("p",{role:"status"},r("graphLaneLimit")),(s.nodesTruncated||s.edgesTruncated)&&z.default.createElement("p",{role:"status"},r("graphLimit")),z.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},z.default.createElement("svg",{width:f,height:d,"aria-hidden":"true",style:{flexShrink:0}},p.map(i=>{let c=i.start*36+18,m=i.end*36+18,w=12+i.fromLane*18,g=12+i.toLane*18;return z.default.createElement("path",{key:i.from+i.to,d:"M "+w+" "+c+" C "+w+" "+(c+18)+", "+g+" "+(m-18)+", "+g+" "+m,fill:"none",stroke:"currentColor",opacity:"0.45"})}),a.nodes.filter(i=>i.lane!==null).map(i=>z.default.createElement("circle",{key:i.id,cx:12+i.lane*18,cy:i.row*36+18,r:"4",fill:"currentColor"}))),z.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},s.nodes.map(i=>z.default.createElement("li",{key:i.id,style:{height:36,whiteSpace:"nowrap"}},z.default.createElement("button",{title:i.id,"aria-current":t===i.id?!0:void 0,style:t===i.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:c=>{if(c.altKey||c.ctrlKey||c.metaKey||c.shiftKey)return;let m=c.key==="ArrowDown"?Math.min(i.row+1,s.nodes.length-1):c.key==="ArrowUp"?Math.max(0,i.row-1):c.key==="Home"?0:c.key==="End"?s.nodes.length-1:null;m!==null&&(c.preventDefault(),c.stopPropagation(),c.currentTarget.closest("ol").querySelectorAll("button")[m]?.focus())},onClick:()=>o(i.id)},z.default.createElement("code",null,i.id.slice(0,10))," ",e[i.row].subject))))),z.default.createElement("details",null,z.default.createElement("summary",null,r("graphRelations")),z.default.createElement("ul",null,s.edges.map(i=>z.default.createElement("li",{key:i.from+i.to},z.default.createElement("code",null,i.from)," \u2192 ",z.default.createElement("code",null,i.to),i.missing?" \xB7 "+r("graphMissing"):"")))))}function kt(e){let[t,o]=(0,z.useState)(!1);return z.default.createElement("div",null,z.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historyGraph")),t&&z.default.createElement(fo,{...e}))}var P=R(require("react"),1);function mo({sessionId:e,repositoryId:t,base:o,target:r,rpc:s,t:a,onRediscover:p}){let[f,d]=(0,P.useState)(null),[i,c]=(0,P.useState)(""),[m,w]=(0,P.useState)(0),[g,S]=(0,P.useState)(null),[u,y]=(0,P.useState)("");if((0,P.useEffect)(()=>{let b=new AbortController;return d(null),c(""),S(null),s("vcs/revision-changes",{sessionId:e,repositoryId:t,base:o,target:r},b.signal).then(h=>{b.signal.aborted||d(h)}).catch(h=>{b.signal.aborted||(c(h.message),h.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[e,t,o,r,m]),i)return P.default.createElement("p",{role:"alert"},i," ",P.default.createElement("button",{onClick:()=>w(b=>b+1)},a("retry")));if(!f)return P.default.createElement("p",{role:"status"},a("loading"));let v=Qe(f.changes,u);return P.default.createElement("div",null,P.default.createElement("label",null,a("commitFileSearch")," ",P.default.createElement("input",{"aria-label":a("commitFileSearch"),value:u,onChange:b=>{y(b.target.value),S(null)}})),P.default.createElement("span",null," ",v.length," / ",f.changes.length),!!f.changes.length&&!v.length&&P.default.createElement("p",{role:"status"},a("emptySearch")),!f.changes.length&&P.default.createElement("p",null,a("revisionEmpty")),P.default.createElement("ul",null,v.map(b=>P.default.createElement("li",{key:b.id},P.default.createElement("button",{"aria-pressed":g===b.id,onClick:()=>S(b.id)},b.status," \xB7 ",b.oldPath?b.oldPath+" \u2192 ":"",b.path)))),g&&P.default.createElement(Te,{key:g,sessionId:e,repositoryId:t,base:o,target:r,id:g,rpc:s,t:a,onRediscover:p}))}function Ct(e){return P.default.createElement(ho,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function ho({commits:e,sessionId:t,repositoryId:o,rpc:r,t:s,onRediscover:a,onReferencesLoaded:p}){let[f,d]=(0,P.useState)(""),[i,c]=(0,P.useState)(""),[m,w]=(0,P.useState)([]),[g,S]=(0,P.useState)(!1),[u,y]=(0,P.useState)(0),[v,b]=(0,P.useState)(!1),[h,x]=(0,P.useState)("");return(0,P.useEffect)(()=>{if(!u)return;let k=new AbortController;return b(!0),x(""),r("vcs/references",{sessionId:t,repositoryId:o},k.signal).then(O=>{k.signal.aborted||(w(O.references),S(!0),p?.(O.references))}).catch(O=>{k.signal.aborted||(x(O.message),O.code==="vcs/rediscover-required"&&a())}).finally(()=>{k.signal.aborted||b(!1)}),()=>k.abort()},[t,o,u]),P.default.createElement("section",{"aria-label":s("revisionTitle")},P.default.createElement("h3",null,s("revisionTitle")),P.default.createElement("p",null,s("revisionScope")),P.default.createElement("button",{disabled:v,onClick:()=>y(k=>k+1)},s("revisionLoadRefs")),P.default.createElement("p",null,s("revisionRefsScope")),g&&!v&&!h&&P.default.createElement("p",{role:"status"},m.length?`${s("revisionRefsCount")}: ${m.length}`:s("revisionRefsEmpty")),v&&P.default.createElement("p",{role:"status"},s("loading")),h&&P.default.createElement("p",{role:"alert"},h),[[f,d,"revisionBase"],[i,c,"revisionTarget"]].map(([k,O,N])=>P.default.createElement("label",{key:N},s(N)," ",P.default.createElement("select",{"aria-label":s(N),value:k,onChange:q=>O(q.target.value)},P.default.createElement("option",{value:""},"\u2014"),!!e.length&&P.default.createElement("optgroup",{label:s("revisionLoadedCommits")},e.map(q=>P.default.createElement("option",{key:q.id,value:q.id},q.id.slice(0,10)," \xB7 ",q.subject))),!!m.length&&P.default.createElement("optgroup",{label:s("revisionLocalRefs")},m.map(q=>P.default.createElement("option",{key:q.name,value:q.commit},q.name," \xB7 ",q.commit.slice(0,10)))),k&&!e.some(q=>q.id===k)&&!m.some(q=>q.commit===k)&&P.default.createElement("option",{value:k},k)))),P.default.createElement("button",{disabled:!f||!i,onClick:()=>{d(i),c(f)}},s("revisionSwap")),P.default.createElement("p",{style:{overflowWrap:"anywhere"}},P.default.createElement("code",null,f||"\u2014")," \u2192 ",P.default.createElement("code",null,i||"\u2014")),f&&i&&P.default.createElement(mo,{key:JSON.stringify([t,o,f,i]),sessionId:t,repositoryId:o,base:f,target:i,rpc:r,t:s,onRediscover:a}))}function dr(e,t,o){let r=o?[...e.commits.filter(s=>!t.commits.some(a=>a.id===s.id)),...t.commits]:t.commits;return{...t,windowEnd:o+t.commits.length,commits:r.slice(-200)}}function Et(e){return C.default.createElement(vo,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function vo({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s}){let[a,p]=(0,C.useState)({id:null,path:null,revision:0}),[f,d]=(0,C.useState)(""),[i,c]=(0,C.useState)(null),[m,w]=(0,C.useState)(""),[g,S]=(0,C.useState)(""),u=L=>{let Z=(i||[]).find(ee=>JSON.stringify([ee.name,ee.commit])===L)?.commit||"";S(L),w(Z),h(ee=>ee?{...ee,snapshot:Z||null}:null),de(0),d(""),q(null),ve({commits:[],snapshot:null,nextOffset:null})},[y,v]=(0,C.useState)({message:"",author:"",path:""}),[b,h]=(0,C.useState)(null),x=L=>{h({values:L,snapshot:K.snapshot}),de(0),d(""),q(null),ve(_=>({..._,commits:[],nextOffset:null}))},k=(0,C.useMemo)(()=>rr(i||[]),[i]),O=a.id,N=(L,_=null)=>p(Z=>({id:L,path:_,revision:Z.revision+1})),q=(L,_=null)=>p(Z=>({id:L,path:_,revision:Z.revision+(_||Z.path?1:0)})),[K,ve]=(0,C.useState)({commits:[],snapshot:null,nextOffset:null}),[J,de]=(0,C.useState)(0),[H,ce]=(0,C.useState)(0),[re,Ce]=(0,C.useState)(!0),[ge,Ee]=(0,C.useState)("");(0,C.useEffect)(()=>{let L=new AbortController;return Ce(!0),Ee(""),o("vcs/history",{sessionId:e,repositoryId:t,offset:J,limit:50,...b?{search:b.values}:{},...b?.snapshot||m||J?{snapshot:b?.snapshot||m||K.snapshot}:{}},L.signal).then(_=>{L.signal.aborted||(ve(Z=>dr(Z,_,J)),J>=200&&(q(null),d("")))}).catch(_=>{L.signal.aborted||(Ee(_.message),_.code==="vcs/rediscover-required"&&s())}).finally(()=>{L.signal.aborted||Ce(!1)}),()=>L.abort()},[e,t,J,H,b,m]);let se=nr(K.commits,f);return C.default.createElement("section",{className:"vcs-history","aria-label":r("history"),"aria-busy":re},C.default.createElement("div",{className:"vcs-history-list"},C.default.createElement("p",null,r("historyListOnly")),i!==null&&C.default.createElement("p",null,r("historyRefsScope")),C.default.createElement("label",null,r("historyBranch")," ",C.default.createElement("select",{"aria-label":r("historyBranch"),value:g,disabled:re,onChange:L=>u(L.target.value)},C.default.createElement("option",{value:""},"HEAD"),g&&!(i||[]).some(L=>JSON.stringify([L.name,L.commit])===g)&&C.default.createElement("option",{value:g},JSON.parse(g)[0]," \xB7 ",m.slice(0,10)," \xB7 ",r("historyPinned")),(i||[]).map(L=>{let _=JSON.stringify([L.name,L.commit]);return C.default.createElement("option",{key:_,value:_},L.name," \xB7 ",L.commit.slice(0,10))}))),C.default.createElement("p",null,r("historyBranchScope"),m&&C.default.createElement(C.default.Fragment,null," \xB7 ",C.default.createElement("code",null,m))),C.default.createElement("form",{"aria-label":r("historyServerSearch"),onSubmit:L=>{L.preventDefault(),x({...y})}},C.default.createElement("fieldset",{disabled:re},C.default.createElement("legend",null,r("historyServerSearch")),C.default.createElement("p",null,r("historyServerScope")),["message","author","path"].map(L=>C.default.createElement("label",{key:L},r("historyServer_"+L)," ",C.default.createElement("input",{maxLength:1024,"aria-label":r("historyServer_"+L),value:y[L],onChange:_=>v(Z=>({...Z,[L]:_.target.value}))}))),C.default.createElement("button",{type:"submit"},r("historyServerApply")),C.default.createElement("button",{type:"button",onClick:()=>{v({message:"",author:"",path:""}),x({})}},r("historyServerClear")))),b&&C.default.createElement("p",{role:"status"},r("historyServerActive"),": ",JSON.stringify(b.values)," \xB7 ",C.default.createElement("code",null,b.snapshot||K.snapshot)),C.default.createElement("label",null,r("historySearch")," ",C.default.createElement("input",{"aria-label":r("historySearch"),value:f,onChange:L=>{d(L.target.value),q(null)}})),C.default.createElement("span",null," ",se.length," / ",K.commits.length),!!K.commits.length&&C.default.createElement("p",{role:"status"},r("historyWindow"),": ",Math.max(0,(K.windowEnd??K.commits.length)-K.commits.length),"\u2013",K.windowEnd??K.commits.length," \xB7 ",r("historyWindowScope")),!!K.commits.length&&!se.length&&C.default.createElement("p",{role:"status"},r("historyNoMatch")),C.default.createElement("ol",null,se.map(L=>C.default.createElement("li",{key:L.id},C.default.createElement("button",{"aria-pressed":O===L.id,onClick:()=>q(L.id)},L.subject),C.default.createElement("div",null,C.default.createElement("code",{title:L.id},L.id.slice(0,10))," \xB7 ",L.author," \xB7 ",C.default.createElement("time",{dateTime:L.date},L.date)),k.has(L.id)&&C.default.createElement("div",{"aria-label":r("historyRefsLabel"),style:{overflowWrap:"anywhere"}},k.get(L.id).names.map(_=>C.default.createElement("span",{key:_},C.default.createElement("code",null,_)," ")),k.get(L.id).hidden>0&&C.default.createElement("span",null,r("historyRefsMore"),": ",k.get(L.id).hidden))))),re&&C.default.createElement("p",{role:"status"},r("loading")),ge&&C.default.createElement("p",{role:"alert"},ge," ",C.default.createElement("button",{onClick:()=>ce(L=>L+1)},r("retry"))),!re&&!ge&&!K.commits.length&&C.default.createElement("p",null,r("historyEmpty")),K.truncated&&C.default.createElement("p",{role:"status"},r("historyLimit")),!ge&&K.nextOffset!==null&&C.default.createElement("button",{disabled:re,onClick:()=>de(K.nextOffset)},r("historyMore")),!!K.commits.length&&C.default.createElement(kt,{commits:K.commits,selected:O,onSelect:q,t:r}),C.default.createElement(Ct,{onReferencesLoaded:c,commits:K.commits,sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:s})),C.default.createElement("div",{className:"vcs-history-details"},O&&C.default.createElement(St,{key:JSON.stringify([O,a.revision]),initialPath:a.path,sessionId:e,repositoryId:t,commit:O,onSelectCommit:N,rpc:o,t:r,onRediscover:s})))}var cr={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",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",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u5185\u5BB9\u76F8\u540C\u7684\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u4EC5\u8DDF\u968FGit\u68C0\u51FA\u7684100%\u91CD\u547D\u540D\uFF1B\u4E0D\u63A8\u65AD\u76F8\u4F3C\u5185\u5BB9\u3001\u590D\u5236\u6216\u5408\u5E76\u591A\u7236\u6765\u6E90\u3002\u65B0\u589E\u6587\u4EF6\u5904\u505C\u6B62\uFF0C\u53D7\u8F93\u51FA/\u65F6\u95F4\u9650\u5236\uFF1B\u6BCF\u6761\u8BB0\u5F55\u6309\u5F53\u65F6\u8DEF\u5F84\u5B9A\u4F4D\u3002",graphLaneLimit:"\u6CF3\u9053\u6700\u591A32\u6761\uFF1B\u8D85\u51FA\u90E8\u5206\u7701\u7565\u56FE\u5F62\uFF0C\u5B8C\u6574\u5DF2\u52A0\u8F7D\u8282\u70B9\u4E0E\u5173\u7CFB\u4ECD\u53EF\u5728\u6587\u5B57\u4E2D\u67E5\u770B\u3002",historyBranch:"\u5386\u53F2\u8D77\u70B9\uFF08\u672C\u5730\u5F15\u7528\uFF09",historyPinned:"\u56FA\u5B9A\u5FEB\u7167",historyBranchScope:"\u5F15\u7528\u7531\u4E0B\u65B9\u624B\u52A8\u52A0\u8F7D\uFF1B\u9009\u62E9\u540E\u56FA\u5B9A\u8BE5\u6B21OID\uFF0C\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5386\u53F2\u8D77\u70B9\u3002\u9009\u62E9HEAD\u91CD\u65B0\u8BFB\u53D6\u5F53\u524DHEAD\uFF0C\u4E0D\u5207\u6362\u5DE5\u4F5C\u533A\u3002",historyServerSearch:"\u5168\u5386\u53F2\u67E5\u8BE2",historyServerScope:"\u67E5\u8BE2\u56FA\u5B9A\u5FEB\u7167\u53EF\u8FBE\u7684\u5B8C\u6574\u5386\u53F2\uFF1B\u8BF4\u660E/\u4F5C\u8005\u4E3A\u5FFD\u7565\u5927\u5C0F\u5199\u7684\u5B57\u9762\u5339\u914D\uFF0C\u8DEF\u5F84\u4E3A\u7CBE\u786E\u8DEF\u5F84\u6216\u76EE\u5F55\uFF0C\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u3002\u5206\u9875\u4E0E\u8FD0\u884C\u65F6\u95F4\u6709\u754C\u3002",historyServer_message:"\u63D0\u4EA4\u8BF4\u660E",historyServer_author:"\u4F5C\u8005",historyServer_path:"\u8DEF\u5F84",historyServerApply:"\u6267\u884C\u67E5\u8BE2",historyServerClear:"\u6E05\u9664\u67E5\u8BE2",historyServerActive:"\u5F53\u524D\u5DF2\u63D0\u4EA4\u67E5\u8BE2",reviewView:"\u5BA1\u9605\u89C6\u56FE",workspaceView:"\u5DE5\u4F5C\u533A\u6539\u52A8",workspaceRoot:"\u5DE5\u4F5C\u533A\u672C\u8EAB",title:"VCS \u53D8\u66F4",readonly:"\u53EA\u8BFB\u9884\u89C8",refresh:"\u5237\u65B0",back:"\u8FD4\u56DE\u5BF9\u8BDD",all:"\u5168\u90E8\u53D8\u66F4",staged:"\u5DF2\u6682\u5B58",unstaged:"\u672A\u6682\u5B58",search:"\u641C\u7D22\u6587\u4EF6\u2026",noSession:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u4F1A\u8BDD\uFF0C\u518D\u67E5\u770B\u53D8\u66F4\u3002",noRepo:"\u672A\u53D1\u73B0 Git / SVN \u4ED3\u5E93\u3002\u53EF\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u540E\u91CD\u65B0\u626B\u63CF\u3002",clean:"\u6CA1\u6709\u53D8\u66F4",pick:"\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",loading:"\u6B63\u5728\u8BFB\u53D6\u2026",side:"\u5DE6\u53F3\u5BF9\u6BD4",inline:"\u884C\u5185\u5BF9\u6BD4",whitespace:"\u5FFD\u7565\u884C\u9996\u5C3E\u7A7A\u767D",wrap:"\u81EA\u52A8\u6362\u884C",previous:"\u4E0A\u4E00\u5904",next:"\u4E0B\u4E00\u5904",content:"\u5185\u5BB9",properties:"\u5C5E\u6027",binary:"\u4E8C\u8FDB\u5236\u6216\u53D7\u9650\u5185\u5BB9\u65E0\u6CD5\u6309\u6587\u672C\u6BD4\u8F83",changes:"\u5904\u53D8\u66F4",files:"\u4E2A\u6587\u4EF6",list:"\u5E73\u94FA",tree:"\u76EE\u5F55",emptySearch:"\u6CA1\u6709\u5339\u914D\u6587\u4EF6",session:"\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55",M:"\u4FEE\u6539",A:"\u65B0\u589E",D:"\u5220\u9664",R:"\u91CD\u547D\u540D",C:"\u590D\u5236",U:"\u51B2\u7A81","?":"\u672A\u8DDF\u8E2A",P:"\u5C5E\u6027",error:"\u8BFB\u53D6\u5931\u8D25",retry:"\u91CD\u8BD5",stale:"\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",repositories:"\u4ED3\u5E93",allRepositories:"\u5168\u90E8\u4ED3\u5E93",gitMode:"Git \u53D8\u66F4",svnBase:"SVN \xB7 BASE \u2194 \u5DE5\u4F5C\u526F\u672C",subdirectory:"\u76F8\u5BF9\u5B50\u76EE\u5F55\uFF08\u53EF\u9009\uFF09",rescan:"\u91CD\u65B0\u626B\u63CF\u4ED3\u5E93",scanHint:"\u4EC5\u626B\u63CF\u5F53\u524D\u76EE\u5F55\u53CA\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF0C\u4E0D\u9012\u5F52\u6DF1\u5165 \xB7 \u7F13\u5B58 5 \u5206\u949F\u540E\u8FC7\u671F",truncated:"\u5DF2\u8FBE\u5230\u626B\u63CF\u4E0A\u9650\u3002\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u5E76\u91CD\u65B0\u626B\u63CF\u4EE5\u8865\u5145\u5176\u4ED6\u4F4D\u7F6E\u3002",fallback:"\u9AD8\u7EA7\u7F16\u8F91\u5668\u4E0D\u53EF\u7528\uFF0C\u5DF2\u5207\u6362\u4E3A\u57FA\u7840\u5DE6\u53F3\u6587\u672C\u5BF9\u6BD4\u3002",diagnostics:"\u52A0\u8F7D\u8BCA\u65AD",approximate:"\u5185\u5BB9\u8F83\u5927\uFF0C\u4F7F\u7528\u8FD1\u4F3C\u884C\u5BF9\u9F50\u3002",textTruncated:"\u4EC5\u663E\u793A\u524D 2000 \u884C\u3002",textBefore:"\u4FEE\u6539\u524D",textAfter:"\u4FEE\u6539\u540E",textReadonly:"\u53EA\u8BFB\u6587\u672C\u6BD4\u8F83",textEmpty:"\u4E24\u4E2A\u7248\u672C\u5747\u4E3A\u7A7A\u3002",commitDetails:"\u63D0\u4EA4\u8BE6\u60C5",commitFileSearch:"\u7B5B\u9009\u672C\u6B21\u63D0\u4EA4\u6587\u4EF6",commitParent:"\u6BD4\u8F83\u7236\u63D0\u4EA4",commitRoot:"\u7A7A\u57FA\u7EBF\uFF08\u6839\u63D0\u4EA4\uFF09",commitNoChanges:"\u76F8\u5BF9\u6B64\u57FA\u7EBF\u65E0\u6587\u4EF6\u53D8\u66F4",history:"\u63D0\u4EA4\u5386\u53F2",historyAdvanced:"\u52A0\u8F7D\u9AD8\u7EA7\u53EA\u8BFB Diff",historyBasic:"\u8FD4\u56DE\u57FA\u7840\u6587\u672C Diff",historyListOnly:"\u672C\u5730 HEAD \u5386\u53F2\uFF1B\u9009\u62E9\u63D0\u4EA4\u53CA\u6587\u4EF6\u67E5\u770B\u53EA\u8BFB\u6587\u672C\u5DEE\u5F02\u3002",historyEmpty:"\u5C1A\u65E0\u63D0\u4EA4",historyRefsScope:"\u6807\u8BB0\u6765\u81EA\u6700\u8FD1\u4E00\u6B21\u624B\u52A8\u52A0\u8F7D\u7684\u672C\u5730\u5F15\u7528\uFF0C\u4E0D\u4EE3\u8868\u63D0\u4EA4\u521B\u5EFA\u65F6\u7684\u5206\u652F\u72B6\u6001\uFF1B\u5237\u65B0\u5931\u8D25\u65F6\u4FDD\u7559\u4E0A\u6B21\u6210\u529F\u7ED3\u679C\u3002",historyRefsLabel:"\u5DF2\u52A0\u8F7D\u672C\u5730\u5F15\u7528",historyRefsMore:"\u5176\u4ED6\u5F15\u7528",historySearch:"\u7B5B\u9009\u5DF2\u52A0\u8F7D\u63D0\u4EA4\uFF08\u4F5C\u8005 / \u6458\u8981 / SHA\uFF09",historyNoMatch:"\u5DF2\u52A0\u8F7D\u63D0\u4EA4\u4E2D\u65E0\u5339\u914D\u9879\uFF1B\u53EF\u7EE7\u7EED\u52A0\u8F7D\u66F4\u591A\u3002",historyMore:"\u52A0\u8F7D\u66F4\u591A\u63D0\u4EA4",historyLimit:"\u5DF2\u8FBE\u5230\u5386\u53F2\u6D4F\u89C8\u8303\u56F4\u4E0A\u9650\uFF0C\u4ECD\u6709\u66F4\u65E9\u63D0\u4EA4\u672A\u663E\u793A\u3002",autoRefresh:"\u624B\u52A8\u6216\u7A97\u53E3\u805A\u7126\u65F6\u5237\u65B0",comparisonContext:"\u6BD4\u8F83\u4E0A\u4E0B\u6587",encoding:"\u7F16\u7801",before:"\u524D\u7248\u672C",after:"\u540E\u7248\u672C",filterStatus:"\u6309\u72B6\u6001\u7B5B\u9009",allFiles:"\u5168\u90E8\u6587\u4EF6",previousFile:"\u4E0A\u4E00\u4E2A\u6587\u4EF6",nextFile:"\u4E0B\u4E00\u4E2A\u6587\u4EF6",expandAll:"\u5168\u90E8\u5C55\u5F00",collapseAll:"\u5168\u90E8\u6298\u53E0",revealSelected:"\u5B9A\u4F4D\u5F53\u524D\u6587\u4EF6",reviewPosition:"\u7B2C {index} / {total} \u4E2A\u6587\u4EF6",clearFilters:"\u6E05\u9664\u7B5B\u9009",searchShortcut:"Ctrl / \u2318 + F \u641C\u7D22\uFF1BEsc \u6E05\u7A7A\u641C\u7D22",fileShortcut:"Alt + \u2190 / \u2192 \u5207\u6362\u4E0A\u4E00\u4E2A\u6216\u4E0B\u4E00\u4E2A\u6587\u4EF6",copyPath:"\u590D\u5236\u8DEF\u5F84",copied:"\u5DF2\u590D\u5236",pathCopied:"\u6587\u4EF6\u8DEF\u5F84\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",copyFailed:"\u65E0\u6CD5\u590D\u5236\u6587\u4EF6\u8DEF\u5F84\u3002",binaryComparison:"\uFF08{files}\uFF09",revisionTitle:"\u672C\u5730\u7248\u672C A/B \u6BD4\u8F83",revisionScope:"\u53EF\u9009\u62E9\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4\uFF0C\u6216\u624B\u52A8\u52A0\u8F7D\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E\uFF1B\u76F4\u63A5\u6BD4\u8F83 A \u2192 B\uFF0C\u4E0D\u4F7F\u7528\u5408\u5E76\u57FA\u70B9\u3002",revisionBase:"A\uFF08\u5DE6\u4FA7\uFF09",revisionTarget:"B\uFF08\u53F3\u4FA7\uFF09",revisionSwap:"\u4EA4\u6362 A/B",revisionEmpty:"\u4E24\u4E2A\u7248\u672C\u6CA1\u6709\u6587\u4EF6\u53D8\u66F4\u3002",fileHistory:"\u8DEF\u5F84\u5386\u53F2",fileHistoryScope:"\u56FA\u5B9A\u63D0\u4EA4\u5FEB\u7167\u4E0B\u7684\u7CBE\u786E\u8DEF\u5F84\u5386\u53F2\uFF1B\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u524D\u8DEF\u5F84\uFF0C\u5305\u542B\u540C\u8DEF\u5F84\u5220\u9664\u540E\u91CD\u5EFA\u3002\u70B9\u51FB\u63D0\u4EA4\u540E\uFF0C\u4EC5\u5728\u76F8\u5BF9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF08\u6839\u63D0\u4EA4\u4E3A\u7A7A\u6811\uFF09\u7684\u53D8\u66F4\u4E2D\u552F\u4E00\u5339\u914D\u540C\u8DEF\u5F84\u65F6\u6253\u5F00 Diff\uFF1B\u5426\u5219\u53EA\u663E\u793A\u8BE6\u60C5\u3002",blame:"\u884C\u5F52\u5C5E\uFF08Blame\uFF09",blameNavigation:"\u70B9\u51FB\u5F52\u5C5E\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5\uFF1B\u9ED8\u8BA4\u9009\u62E9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\u5386\u53F2\u6587\u4EF6\u6216\u884C\u53F7\u3002",blameScope:"\u6240\u9009\u63D0\u4EA4\u7684 UTF-8 \u666E\u901A\u6587\u672C\uFF0C\u6700\u591A\u663E\u793A\u524D 500 \u884C\uFF1B\u4E0D\u5305\u542B\u5DE5\u4F5C\u533A\u4FEE\u6539\u3002",blameLimit:"\u4EC5\u663E\u793A\u524D 500 \u884C\uFF0C\u7ED3\u679C\u5DF2\u622A\u65AD\u3002",blameEmpty:"\u6587\u4EF6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u884C\u3002",blameLine:"\u884C\u53F7",blameCommit:"\u5F52\u5C5E\u63D0\u4EA4",blameAuthor:"\u4F5C\u8005",blameSummary:"\u63D0\u4EA4\u6458\u8981",blameSource:"\u6E90\u7801",historicalTree:"\u5386\u53F2\u76EE\u5F55",historicalTreeScope:"\u6240\u9009\u63D0\u4EA4\u7684\u76EE\u5F55\u6761\u76EE\uFF1B\u6BCF\u9875 100 \u9879\u3002\u70B9\u51FB\u666E\u901A\u6587\u4EF6\u53EA\u8BFB\u9884\u89C8\uFF1B\u4E0D\u8DDF\u968F\u7B26\u53F7\u94FE\u63A5\u6216\u5B50\u6A21\u5757\u3002",treePreview:"\u5386\u53F2\u6587\u4EF6\u9884\u89C8",treeClose:"\u5173\u95ED\u6587\u4EF6\u9884\u89C8",treeEmpty:"\u7A7A\u6587\u4EF6\u6216\u65E0\u53EF\u663E\u793A\u7684\u6587\u672C\u3002",treeSearch:"\u7B5B\u9009\u5F53\u524D\u76EE\u5F55\u540D\u79F0",treeBreadcrumbs:"\u5386\u53F2\u76EE\u5F55\u8DEF\u5F84",treeUp:"\u4E0A\u7EA7\u76EE\u5F55",treeEntries:"\u4E2A\u6761\u76EE",treePrevious:"\u4E0A\u4E00\u9875",treeNext:"\u4E0B\u4E00\u9875",historyGraph:"\u5C40\u90E8\u63D0\u4EA4\u56FE",graphScope:"\u4EC5\u5C55\u793A\u5DF2\u52A0\u8F7D\u5386\u53F2\u7684\u524D 200 \u4E2A\u63D0\u4EA4\uFF0C\u6700\u591A 1000 \u6761\u7236\u5B50\u8FB9\uFF1B\u4E0D\u53D7\u6587\u672C\u7B5B\u9009\u5F71\u54CD\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5206\u652F\u56FE\u3002\u8282\u70B9\u70B9\u51FB\u53EF\u67E5\u770B\u8BE6\u60C5\u3002",graphLimit:"\u56FE\u5DF2\u8FBE\u5230\u8282\u70B9\u6216\u8FB9\u4E0A\u9650\uFF0C\u90E8\u5206\u5173\u7CFB\u672A\u5C55\u793A\u3002",graphMissing:"\u7236\u63D0\u4EA4\u672A\u5728\u5F53\u524D\u56FE\u4E2D",graphRelations:"\u7236\u5B50\u5173\u7CFB\uFF08\u6587\u672C\uFF09",graphInvalid:"\u5F53\u524D\u63D0\u4EA4\u987A\u5E8F\u65E0\u6CD5\u7ED8\u56FE\uFF1B\u8BF7\u4F7F\u7528\u5386\u53F2\u5217\u8868\u3002",imageCompare:"PNG \u56FE\u7247\u6BD4\u8F83",imageBefore:"\u6240\u9009\u7236\u63D0\u4EA4",imageAfter:"\u6240\u9009\u63D0\u4EA4",imageAbsent:"\u6B64\u4FA7\u6CA1\u6709\u6587\u4EF6\u3002",imageInvalid:"\u56FE\u7247\u54CD\u5E94\u65E0\u6548\u3002",imageMetadata:"\u9884\u89C8\u5DF2\u79FB\u9664\u9644\u52A0\u5143\u6570\u636E\u3002",imageScope:"\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u4E0E 8 \u4F4D\u5355\u626B\u63CF baseline JPEG \u666E\u901A\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5355\u5757 simple \u9759\u6001 WebP\uFF08\u4E0D\u652F\u6301\u6E10\u8FDB\u5F0F/CMYK JPEG\u3001\u6269\u5C55/\u52A8\u753B WebP\uFF09\uFF1B\u6BCF\u4FA7\u6700\u591A 2 MiB\u30011600 \u4E07\u50CF\u7D20\u3002\u5143\u6570\u636E\u88AB\u79FB\u9664\uFF0C\u4E0D\u9002\u7528\u4E8E\u8272\u5F69\u7CBE\u786E\u6027\u5BA1\u9605\u3002\u652F\u6301\u5386\u53F2\u63D0\u4EA4\u3001\u56FA\u5B9A A/B \u53CA Git \u5DE5\u4F5C\u533A\uFF1B\u6309\u6240\u9009\u6A21\u5F0F\u8BFB\u53D6 HEAD\u3001\u6682\u5B58\u533A\u6216\u5DE5\u4F5C\u6587\u4EF6\u3002\u51B2\u7A81\u56FE\u7247\u4E0D\u652F\u6301\u3002",commitMessageLimit:"\u5B8C\u6574\u63D0\u4EA4\u8BF4\u660E\u8D85\u8FC7 2 MiB \u9884\u89C8\u4E0A\u9650\uFF0C\u5DF2\u7701\u7565\u3002",revisionLoadRefs:"\u52A0\u8F7D / \u5237\u65B0\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsScope:"\u4EC5\u672C\u5730\u5206\u652F\u548C\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\uFF0C\u6700\u591A 1000 \u6761\uFF1B\u4E0D fetch\u3002\u9009\u62E9\u56FA\u5B9A\u4E3A\u52A0\u8F7D\u65F6\u7684\u63D0\u4EA4 OID\uFF1B\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5DF2\u9009\u7248\u672C\u3002",revisionRefsEmpty:"\u6CA1\u6709\u53EF\u7528\u7684\u672C\u5730\u5206\u652F\u6216\u63D0\u4EA4\u6807\u7B7E\u3002",revisionLoadedCommits:"\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4",revisionLocalRefs:"\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{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",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",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow exact renames (first-parent)",fileHistoryFollowScope:"Only Git-detected 100% renames. No identity inference for similarity, copies or merge-parent origins. Stops at creation; output/runtime bounded. Each row uses its historical path.",graphLaneLimit:"At most 32 lanes. Overflow geometry is omitted; loaded nodes and relations remain available as text.",historyBranch:"History tip (local reference)",historyPinned:"Pinned snapshot",historyBranchScope:"Load references manually below. Selection pins that OID; refreshing references does not move the history tip. Selecting HEAD reads current HEAD without checking out.",historyServerSearch:"Full history query",historyServerScope:"Search all history reachable from the pinned snapshot. Message/author use case-insensitive literal matching; path is an exact path or directory, without rename following. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServerApply:"Run query",historyServerClear:"Clear query",historyServerActive:"Submitted query",reviewView:"Review view",workspaceView:"Working changes",workspaceRoot:"Workspace root",title:"VCS changes",readonly:"Read-only preview",refresh:"Refresh",back:"Back to chat",all:"All changes",staged:"Staged",unstaged:"Unstaged",search:"Filter files\u2026",noSession:"Open a project session to inspect its changes.",noRepo:"No Git / SVN repositories discovered. Try a relative subdirectory and rescan.",clean:"No changes",pick:"Select a file to review",loading:"Loading\u2026",side:"Side by side",inline:"Inline",whitespace:"Ignore trim whitespace",wrap:"Word wrap",previous:"Previous change",next:"Next change",content:"Content",properties:"Properties",binary:"Binary or restricted content cannot be compared as text",changes:"changes",files:"files",list:"Flat",tree:"Tree",emptySearch:"No matching files",session:"Session directory",M:"Modified",A:"Added",D:"Deleted",R:"Renamed",C:"Copied",U:"Conflict","?":"Untracked",P:"Property",error:"Failed to read",retry:"Retry",stale:"Content changed. Refresh and try again.",repositories:"Repositories",allRepositories:"All repositories",gitMode:"Git changes",svnBase:"SVN \xB7 BASE \u2194 Working Copy",subdirectory:"Relative subdirectory (optional)",rescan:"Rescan repositories",scanHint:"Scan current directory and immediate children only \xB7 cache expires after 5 minutes",truncated:"Discovery limit reached. Enter a relative subdirectory and rescan to include another location.",fallback:"Advanced editor unavailable. Showing basic side-by-side text comparison.",diagnostics:"Loading diagnostics",approximate:"Large content: approximate line alignment.",textTruncated:"Only the first 2000 lines are displayed.",textBefore:"Before",textAfter:"After",textReadonly:"Read-only text comparison",textEmpty:"Both versions are empty.",commitDetails:"Commit details",commitFileSearch:"Filter files in this commit",commitParent:"Compare parent",commitRoot:"Empty baseline (root commit)",commitNoChanges:"No file changes against this baseline",history:"Commit history",historyAdvanced:"Load advanced read-only diff",historyBasic:"Return to basic text diff",historyListOnly:"Local HEAD history. Select a commit and file to view a read-only text diff.",historyEmpty:"No commits yet",historyRefsScope:"Labels reflect the last manually loaded local refs, not branches at commit creation. Failed refreshes retain the last successful result.",historyRefsLabel:"Loaded local references",historyRefsMore:"Additional references",historySearch:"Filter loaded commits (author / subject / SHA)",historyNoMatch:"No matches in loaded commits; you can load more if available.",historyMore:"Load more commits",historyLimit:"History browsing limit reached; older commits are not shown.",autoRefresh:"Refresh manually or on window focus",comparisonContext:"Comparison context",encoding:"Encoding",before:"Before",after:"After",filterStatus:"Filter by status",allFiles:"All files",previousFile:"Previous file",nextFile:"Next file",expandAll:"Expand all",collapseAll:"Collapse all",revealSelected:"Reveal current file",reviewPosition:"File {index} of {total}",clearFilters:"Clear filters",searchShortcut:"Ctrl / \u2318 + F to search; Esc clears search",fileShortcut:"Alt + \u2190 / \u2192 switches the previous or next file",copyPath:"Copy path",copied:"Copied",pathCopied:"File path copied to the clipboard.",copyFailed:"Unable to copy the file path.",binaryComparison:"({files})",revisionTitle:"Local A/B revision comparison",revisionScope:"Choose loaded commits or manually load local branches and tags. Compare A \u2192 B directly, not via merge-base.",revisionBase:"A (left)",revisionTarget:"B (right)",revisionSwap:"Swap A/B",revisionEmpty:"No file changes between these revisions.",fileHistory:"Path history",fileHistoryScope:"Exact-path history at the pinned commit; no rename following, including deletion and recreation. Selecting a commit opens its Diff only for a unique same-path change against the first parent (empty tree for a root); otherwise only details are shown.",blame:"Blame",blameNavigation:"Select an attributed commit to view details with its first parent selected; no automatic historical file or line navigation.",blameScope:"UTF-8 regular text at the selected commit, first 500 lines at most. Working changes are excluded.",blameLimit:"Only the first 500 lines are shown; result truncated.",blameEmpty:"No source lines to display.",blameLine:"Line",blameCommit:"Commit",blameAuthor:"Author",blameSummary:"Summary",blameSource:"Source",historicalTree:"Historical tree",historicalTreeScope:"Entries at the selected commit; 100 per page. Select regular files for read-only preview; symlinks and submodules are not followed.",treePreview:"Historical file preview",treeClose:"Close file preview",treeEmpty:"Empty file or no displayable text.",treeSearch:"Filter names in this directory",treeBreadcrumbs:"Historical directory path",treeUp:"Parent directory",treeEntries:"entries",treePrevious:"Previous page",treeNext:"Next page",historyGraph:"Local commit graph",graphScope:"First 200 loaded commits, at most 1000 parent edges. Independent of text filtering; not a complete branch graph. Select a node for details.",graphLimit:"Node or edge limit reached; some relationships are omitted.",graphMissing:"Parent outside this graph",graphRelations:"Parent relationships (text)",graphInvalid:"Cannot graph this commit order; use the history list.",imageCompare:"PNG image comparison",imageBefore:"Selected parent",imageAfter:"Selected commit",imageAbsent:"No file on this side.",imageInvalid:"Invalid image response.",imageMetadata:"Ancillary metadata was removed from this preview.",imageScope:"Non-interlaced static PNG or 8-bit single-scan baseline JPEG regular files , or single-chunk simple static WebP (no progressive/CMYK JPEG or extended/animated WebP); at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Supports commits, fixed A/B and Git working changes; HEAD, index or working bytes follow the selected mode. Conflicted images are unsupported.",commitMessageLimit:"Full commit message exceeds the 2 MiB preview limit and was omitted.",revisionLoadRefs:"Load / refresh local branches and tags",revisionRefsScope:"Local branches and commit tags only, at most 1000 refs; no fetch. Selections pin the loaded commit OID; refreshing refs does not move selected versions.",revisionRefsEmpty:"No local branches or commit tags are available.",revisionLoadedCommits:"Loaded commits",revisionLocalRefs:"Local branches and tags",revisionRefsCount:"Selectable references loaded"}};function pr(e,t,o,r){let s=e.target;if(!t?.contains(s)||e.defaultPrevented||e.isComposing||s?.closest?.(".monaco-editor")||s?.closest?.(".vcs-history"))return null;if(e.key==="Escape"&&s===o&&r)return"clear";let a=s?.isContentEditable||s?.closest?.('input,textarea,select,[role="textbox"]');if(a&&s!==o)return null;if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&e.key?.toLowerCase()==="f")return"search";if(!a&&e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){if(e.key==="ArrowLeft")return"previous";if(e.key==="ArrowRight")return"next"}return null}function ur(e,t){let o=t?[...t.querySelectorAll("button[data-vcs-item]")]:[],r=o.indexOf(e.target);if(r<0)return;let s;if(e.key==="ArrowDown")s=o[r+1];else if(e.key==="ArrowUp")s=o[r-1];else if(e.key==="Home")s=o[0];else if(e.key==="End")s=o.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(),s?.focus()}var fr=e=>"dsh-vcs:project:v1:"+e;function mr(e,t){if(!e)return"";try{let o=(t??globalThis.localStorage)?.getItem(fr(e));return typeof o=="string"&&o.length<=1024?o:""}catch{return""}}function hr(e,t,o){if(!(!e||!t))try{(o??globalThis.localStorage)?.setItem(fr(e),t)}catch{}}function gr(e,t=""){return e.find(o=>o.id===t)?.id||e.find(o=>o.relativePath===".")?.id||e[0]?.id||""}var je=(e,t)=>JSON.stringify([e,t]),qe=(e,t=".")=>[e.type.toUpperCase(),e.relativePath==="."?t:e.relativePath||".",e.branch].filter(Boolean).join(" \xB7 "),Xe=(e,t="all")=>e.type==="git"&&["staged","unstaged"].includes(t)?t:"all",vr=(e="",t="")=>e===t?0:e<t?-1:1;function Nt(e=[]){let t={id:"",name:"",directories:new Map,files:[],count:0};for(let r of e){let s=String(r.path||"").split("/").filter(Boolean);if(!s.length)continue;let a=t;for(let p of s.slice(0,-1)){let f=a.id?a.id+"/"+p:p;a.directories.has(p)||a.directories.set(p,{id:f,name:p,directories:new Map,files:[],count:0}),a=a.directories.get(p),a.count++}a.files.push(r)}let o=r=>({...r,directories:[...r.directories.values()].sort((s,a)=>vr(s.name,a.name)).map(o),files:[...r.files].sort((s,a)=>vr(s.path,a.path))});return o(t)}function br(e=[],t){let o=e.findIndex(r=>r.id===t);return{index:o<0?0:o+1,total:e.length}}function yr(e=[],t,o){if(!e.length||!["previous","next"].includes(o))return null;let r=e.findIndex(p=>p.id===t),s=o==="next"?1:-1,a=r<0?o==="next"?-1:0:r;return e[(a+s+e.length)%e.length]||null}function xr(e=""){let t=String(e).split("/").filter(Boolean);return t.slice(0,-1).map((o,r)=>t.slice(0,r+1).join("/"))}function At(e,t=[]){for(let o of e?.directories||[])t.push(o.id),At(o,t);return t}function wr(e=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[e]||e}function Sr(e=[]){return e.reduce((t,o)=>{let r=wr(o.status);return t.all++,t[r]=(t[r]||0)+1,t},{all:0})}function bo(e=[],t="",o="all"){let r=t.toLowerCase();return e.filter(s=>(o==="all"||wr(s.status)===o)&&s.path.toLowerCase().includes(r)).sort((s,a)=>s.path.localeCompare(a.path))}function kr(e,t,o="",r="all"){return e.map(s=>({...t[s.id],repository:s,changes:bo(t[s.id]?.changes,o,r)}))}function Cr(e,t,o=""){if(!o||!e||e.cwd!==t.cwd)return t;let r=new Map(e.repositories.map(s=>[s.id,s]));for(let s of t.repositories)r.set(s.id,s);return{...t,repositories:[...r.values()],truncated:e.truncated||t.truncated,warnings:[...e.warnings||[],...t.warnings||[]]}}var Er={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},Nr=e=>new URL("vcs-assets/"+e,document.baseURI).href;function Ar(){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 yo=["slots","layout","locale","connection","uiSession"];function xo(e){e.effect(()=>e.locale.register("local.vcs",cr));let t=e.locale.bind("local.vcs"),o=ut(2),r=Qt(e.connection,()=>t("error"));function s(f){let d=f.useSessions(i=>Object.values(i.byId).find(c=>(c.retainedBy.mainView??0)>0));return n.default.createElement(a,{key:JSON.stringify([d?.id,d?.cwd])},n.default.createElement(p,{session:d}))}class a 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,pt),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,[i,c]=(0,n.useState)("all"),[m,w]=(0,n.useState)(0),[g,S]=(0,n.useState)(0),[u,y]=(0,n.useState)(null),[v,b]=(0,n.useState)({}),[h,x]=(0,n.useState)(()=>mr(f?.cwd)),[k,O]=(0,n.useState)(0),[N,q]=(0,n.useState)(""),[K,ve]=(0,n.useState)(""),[J,de]=(0,n.useState)(null),[H,ce]=(0,n.useState)(null),[re,Ce]=(0,n.useState)(!1),[ge,Ee]=(0,n.useState)(!1),[se,L]=(0,n.useState)(""),[_,Z]=(0,n.useState)(""),[ee,Lt]=(0,n.useState)(""),[Pt,Ht]=(0,n.useState)(!1),[ue,$e]=(0,n.useState)(""),[Je,Ot]=(0,n.useState)("all"),[be,Dt]=(0,n.useState)(!0),[Bt,Ze]=(0,n.useState)({}),[Ne,Lr]=(0,n.useState)(!0),[Re,Pr]=(0,n.useState)(!1),[et,Hr]=(0,n.useState)(!1),[We,Ae]=(0,n.useState)("content"),[Ft,Mt]=(0,n.useState)(0),[Or,Tt]=(0,n.useState)(!1),[tt,rt]=(0,n.useState)({added:0,deleted:0,count:0}),[oe,jt]=(0,n.useState)(!1),qt=(0,n.useRef)(null),Jt=(0,n.useRef)(null),ye=(0,n.useRef)(null),ot=(0,n.useRef)(null),Ue=(0,n.useRef)(null),st=(0,n.useRef)(null),Wt=(0,n.useRef)(null),Le=(0,n.useRef)(null),it=(0,n.useRef)(null),nt=(0,n.useRef)(null),at=(0,n.useRef)(!1),Ve=(0,n.useRef)(!1),fe=u?.repositories||[],me=fe.filter(l=>l.id===h),ie=Or&&me.some(l=>l.type==="git"),Dr=()=>{Le.current?.abort(),ce(null),de(null),Z(""),Tt(!0)};(0,n.useEffect)(()=>{fe.some(l=>l.id===h)&&hr(f?.cwd,h)},[f?.cwd,h,u]);let Pe=()=>{Wt.current?.abort(),Le.current?.abort(),ce(null),de(null),Z(""),Ae("content"),rt({added:0,deleted:0,count:0})},Ge=()=>{Ve.current=!1,Pe(),it.current?.abort(),nt.current=u,y(null),b({}),ve(N.trim()),O(l=>l+1)},xe=()=>{Ve.current||(Ve.current=!0,Pe(),it.current?.abort(),nt.current=null,y(null),b({}),ve(""),O(l=>l+1))},Ut=(l=!1)=>{l||S(E=>E+1),at.current=l,l||Pe(),l||b({}),w(E=>E+1)};(0,n.useEffect)(()=>{let l=new AbortController;return it.current=l,L(""),Ce(!!d),d&&r("vcs/repositories",{sessionId:d,...K?{subdirectory:K}:{}},l.signal).then(E=>{if(!l.signal.aborted){let j=Cr(nt.current,E,K);Ve.current=!1,x(I=>gr(j.repositories,I)),y(j)}}).catch(E=>{l.signal.aborted||L(E.message)}).finally(()=>{l.signal.aborted||Ce(!1)}),()=>l.abort()},[d,k,K]),(0,n.useEffect)(()=>{let l=new AbortController,E=at.current;Wt.current=l,at.current=!1,E||(b({}),Z(""));for(let j of me){let I=Xe(j,i);o(()=>r("vcs/status",{sessionId:d,repositoryId:j.id,mode:I},l.signal),l.signal).then(te=>{l.signal.aborted||b(ae=>({...ae,[j.id]:{...te,mode:I}}))}).catch(te=>{if(!l.signal.aborted){if(te.code==="vcs/rediscover-required"){xe();return}b(ae=>({...ae,[j.id]:{error:te.message,changes:[],mode:I}}))}})}return()=>l.abort()},[d,u,h,i,m]),(0,n.useEffect)(()=>{let l=E=>{E.target===window&&d&&h&&document.visibilityState==="visible"&&Ut(!0)};return window.addEventListener("focus",l),()=>window.removeEventListener("focus",l)},[d,h,i]);let He=fe.find(l=>l.id===J?.repositoryId),we=J?v[J.repositoryId]:null;(0,n.useEffect)(()=>{let l=new AbortController;return Le.current=l,ce(null),Z(""),rt({added:0,deleted:0,count:0}),Ae("content"),Ee(!!J&&!!we),!ie&&J&&we&&He&&r("vcs/compare",{sessionId:d,repositoryId:J.repositoryId,mode:Xe(He,i),id:J.id},l.signal).then(E=>{l.signal.aborted||ce(E)}).catch(E=>{if(!l.signal.aborted){if(E.code==="vcs/rediscover-required"){xe();return}Z(E.message)}}).finally(()=>{l.signal.aborted||Ee(!1)}),()=>l.abort()},[J,we,d,i,ie]),(0,n.useEffect)(()=>{let l=!1,E,j=new AbortController;jt(!1),Lt("");let I=document.createElement("link");return I.rel="stylesheet",I.href=Nr("editor.css"),document.head.appendChild(I),_e(Nr("editor.js")+"?v="+encodeURIComponent(Ye)+"&retry="+Ft,{signal:j.signal}).then(te=>{l||(E=te.createDiff(Jt.current,{onStats:rt}),ye.current=E,jt(!0))}).catch(te=>{l||Lt(te.message)}),()=>{l=!0,j.abort(),E?.dispose(),ye.current=null,I.remove()}},[Ft]),(0,n.useEffect)(()=>{oe&&H&&!H.binary&&ye.current?.setContent(H,JSON.stringify([d,u?.cwd,J?.repositoryId,i,J?.id,H.path]))},[oe,H,d,u,J,i]),(0,n.useEffect)(()=>{ye.current?.options({sideBySide:Ne,ignoreWhitespace:Re,wrap:et})},[oe,Ne,Re,et]);let Oe=kr(me,v,ue,Je),Se=Oe.flatMap(l=>l.changes),Br=Sr(we?.changes),lt=br(Se,J?.id),Vt=()=>{$e(""),Ot("all")},Fr=async()=>{let l=H?.path||pe?.path;if(l)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{let E=document.createElement("textarea");try{if(E.value=l,E.style.cssText="position:fixed;opacity:0",document.body.appendChild(E),E.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{E.remove()}}Ht(!0),window.setTimeout(()=>Ht(!1),1500)}catch{Z(t("copyFailed"))}};(0,n.useEffect)(()=>{let l=E=>{if(ie)return;let j=pr(E,qt.current,Ue.current,!!ue);j&&(E.preventDefault(),j==="search"?(Ue.current?.focus(),Ue.current?.select()):j==="clear"?$e(""):dt(j))};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[ue,Se,J,ie]);let Gt=l=>Ze(E=>{let j={...E};for(let I of Oe)for(let te of At(Nt(I.changes)))j[I.repository.id+"\0"+te]=!l;return j}),Mr=()=>{let l=pe;!l||!J||(Dt(!0),Vt(),Ze(E=>{let j={...E};for(let I of xr(l.path))j[J.repositoryId+"\0"+I]=!1;return j}),st.current=je(J.repositoryId,l.id))};(0,n.useEffect)(()=>{let l=st.current;if(!l)return;let E=[...ot.current?.querySelectorAll("button[data-vcs-change]")||[]].find(j=>j.dataset.vcsChange===l);E&&(E.scrollIntoView({block:"nearest"}),E.focus(),st.current=null)},[be,ue,Je,Bt,Oe]);let dt=l=>{let E=yr(Se,J?.id,l);E&&(Le.current?.abort(),ce(null),Ae("content"),de({repositoryId:h,id:E.id}))},It=re||me.some(l=>!v[l.id]),pe=we?.changes?.find(l=>l.id===J?.id),he=H?.properties,ct=he?[...new Set([...Object.keys(he.left||{}),...Object.keys(he.right||{})])].filter(l=>he.left?.[l]!==he.right?.[l]):[],De=l=>Er[l?.status]||l?.status?.slice(0,1).toUpperCase()||"M",zt=H?.binary?[H.left.label,H.right.label].filter(Boolean).join(" \u2194 "):"",ke=_||(ge?t("loading"):d?It&&!pe?t("loading"):se||(fe.length?pe?H?.binary?t("binary")+(zt?" "+t("binaryComparison",{files:zt}):""):H?!oe&&!ee?t("loading"):"":t("pick"):t("pick"):t("noRepo")):t("noSession")),Tr=l=>ur(l,ot.current),Kt=({entry:l,compact:E=!1,depth:j=0})=>{let I=l.path.lastIndexOf("/");return n.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":je(h,l.id),"aria-current":J?.repositoryId===h&&J?.id===l.id?"true":void 0,style:{paddingInlineStart:8+j*14},title:(l.oldPath?l.oldPath+" \u2192 ":"")+l.path+" \xB7 "+t(De(l)),onClick:()=>{Le.current?.abort(),ce(null),Ae("content"),de({repositoryId:h,id:l.id})}},n.default.createElement("span",{className:"vcs-status","data-status":De(l)},De(l)),n.default.createElement("span",{className:"vcs-filename"},E?l.path.slice(I+1):l.path,l.oldPath&&n.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",l.oldPath)))},_t=({node:l,repository:E,depth:j=0})=>n.default.createElement(n.default.Fragment,null,l.directories.map(I=>{let te=E.id+"\0"+I.id,ae=!!Bt[te];return n.default.createElement(n.default.Fragment,{key:te},n.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":ae?"closed":"open","aria-expanded":!ae,style:{paddingInlineStart:8+j*14},onClick:()=>Ze(jr=>({...jr,[te]:!ae}))},n.default.createElement("span",{"aria-hidden":"true"},ae?"\u203A":"\u2304"),I.name,n.default.createElement("small",null,I.count)),!ae&&n.default.createElement(_t,{node:I,repository:E,depth:j+1}))}),l.files.map(I=>n.default.createElement(Kt,{key:je(E.id,I.id),entry:I,compact:l.id!=="",depth:j})));return n.default.createElement("section",{ref:qt,className:"vcs-root","aria-label":t("title")},n.default.createElement("style",null,pt),n.default.createElement("header",{className:"vcs-top"},n.default.createElement(Ar,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:h,disabled:re||!fe.length,onChange:l=>{Pe(),b({}),x(l.target.value)}},!fe.length&&n.default.createElement("option",{value:""},t("repositories")),fe.map(l=>n.default.createElement("option",{key:l.id,value:l.id},qe(l,t("workspaceRoot"))))),n.default.createElement("label",{className:"vcs-mode"},t("gitMode")," ",n.default.createElement("select",{"aria-label":t("gitMode"),value:i,disabled:ie||!me.some(l=>l.type==="git"),onChange:l=>{Pe(),b({}),c(l.target.value)}},["all","unstaged","staged"].map(l=>n.default.createElement("option",{key:l,value:l},t(l))))),n.default.createElement("button",{onClick:()=>Ut(!1),disabled:It||!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(),Ge()}},n.default.createElement("input",{"aria-label":t("subdirectory"),placeholder:t("subdirectory"),value:N,onChange:l=>q(l.target.value)}),n.default.createElement("button",{disabled:!d||re},t("rescan")),n.default.createElement("span",null,t("scanHint"))),u?.truncated&&n.default.createElement("div",{className:"vcs-notice"},t("truncated")),(u?.warnings||[]).map((l,E)=>n.default.createElement("div",{className:"vcs-notice",key:E},typeof l=="string"?l:l.message||JSON.stringify(l)))),me.filter(l=>l.type==="svn").map(l=>n.default.createElement(n.default.Fragment,{key:JSON.stringify([d,l.id,k,m])},n.default.createElement(mt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:xe}),n.default.createElement(gt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:xe}))),me.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:()=>Tt(!1)},t("workspaceView")),n.default.createElement("button",{"aria-pressed":ie,"aria-expanded":ie,onClick:Dr},t("history"))),ie&&n.default.createElement(Et,{key:JSON.stringify([d,h,g,k]),sessionId:d,repositoryId:h,rpc:r,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:Ue,"aria-label":t("search"),placeholder:t("search"),title:t("searchShortcut"),value:ue,onChange:l=>$e(l.target.value)}),(ue||Je!=="all")&&n.default.createElement("button",{className:"vcs-clear-filter",onClick:Vt},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":Je===l,onClick:()=>Ot(l)},t(l==="all"?"allFiles":Er[l]||"M")," ",n.default.createElement("small",null,Br[l]||0)))),n.default.createElement("div",{className:"vcs-count"},n.default.createElement("span",null,Se.length," ",t("files")),n.default.createElement("span",{className:"vcs-auto"},t("autoRefresh")),n.default.createElement("button",{"aria-pressed":be,onClick:()=>Dt(!be)},t(be?"tree":"list"))),be&&n.default.createElement("div",{className:"vcs-tree-actions"},n.default.createElement("button",{onClick:()=>Gt(!0)},t("expandAll")),n.default.createElement("button",{onClick:()=>Gt(!1)},t("collapseAll")),n.default.createElement("button",{onClick:Mr,disabled:!pe},t("revealSelected"))),n.default.createElement("nav",{className:"vcs-filelist","aria-label":t("title"),ref:ot,onKeyDown:Tr},Oe.map(l=>{let E=l.repository;return n.default.createElement("section",{className:"vcs-repository",key:E.id,"aria-label":qe(E,t("workspaceRoot"))},n.default.createElement("div",{className:"vcs-repository-heading",title:E.root},n.default.createElement("strong",null,qe(E,t("workspaceRoot"))),n.default.createElement("small",null,E.type==="svn"?t("svnBase"):t(Xe(E,i)))),l.error?n.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},l.error,n.default.createElement("button",{onClick:Ge},t("rescan"))):v[E.id]?be?n.default.createElement(_t,{node:Nt(l.changes),repository:E}):l.changes.map(j=>n.default.createElement(Kt,{key:je(E.id,j.id),entry:j})):n.default.createElement("div",{className:"vcs-message"},t("loading")),!l.error&&v[E.id]&&!l.changes.length&&n.default.createElement("div",{className:"vcs-message"},t(ue?"emptySearch":"clean")))}),!Oe.length&&n.default.createElement("div",{className:"vcs-message"},re?t("loading"):se||t(d?"noRepo":"noSession"),se&&n.default.createElement("button",{onClick:Ge},t("rescan"))))),n.default.createElement("main",{className:"vcs-detail"},n.default.createElement("div",{className:"vcs-filehead"},n.default.createElement("strong",{title:H?.path||pe?.path},He?qe(He,t("workspaceRoot"))+" / ":"",H?.path||pe?.path||t("pick")),n.default.createElement("button",{className:"vcs-copy-path",disabled:!(H?.path||pe?.path),onClick:Fr},t(Pt?"copied":"copyPath")),Pt&&n.default.createElement("span",{className:"vcs-sr-only",role:"status"},t("pathCopied")),n.default.createElement("span",{className:"vcs-spacer"}),H&&!H.binary&&oe&&n.default.createElement(n.default.Fragment,null,n.default.createElement("span",{className:"vcs-add"},"+",tt.added),n.default.createElement("span",{className:"vcs-del"},"\u2212",tt.deleted))),ee&&n.default.createElement("div",{className:"vcs-notice",role:"status"},t("fallback")," ",n.default.createElement("button",{onClick:()=>Mt(l=>l+1)},t("retry")),n.default.createElement("details",null,n.default.createElement("summary",null,t("diagnostics")),ee)),H&&n.default.createElement("div",{className:"vcs-context","aria-label":t("comparisonContext")},n.default.createElement("span",{className:"vcs-context-status","data-status":De(H)},t(De(H))),H.oldPath&&n.default.createElement("span",{className:"vcs-context-rename",title:H.oldPath+" \u2192 "+H.path},H.oldPath," ",n.default.createElement("b",null,"\u2192")," ",H.path),n.default.createElement("span",null,H.left.label||"\u2014"," ",n.default.createElement("b",null,"\u2194")," ",H.right.label||"\u2014"),(H.left.encoding||H.right.encoding)&&n.default.createElement("span",null,t("encoding"),": ",H.left.encoding||"\u2014"," / ",H.right.encoding||"\u2014")),H&&He?.type==="git"&&n.default.createElement(Fe,{key:JSON.stringify([d,u?.cwd,J.repositoryId,i,J.id,m,we]),workspace:!0,sessionId:d,repositoryId:J.repositoryId,mode:i,id:J.id,rpc:r,t,onRediscover:xe}),H?.notice&&n.default.createElement("div",{className:"vcs-notice"},H.notice),ct.length>0&&n.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":We===l,onClick:()=>Ae(l)},t(l),l==="properties"?" ("+ct.length+")":""))),n.default.createElement("div",{className:"vcs-labels"},n.default.createElement("span",null,H?.left.label||"\u2014",H?.left.encoding?" \xB7 "+H.left.encoding:""),n.default.createElement("span",null,H?.right.label||"\u2014",H?.right.encoding?" \xB7 "+H.right.encoding:"")),n.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!ke||We!=="content",style:We==="properties"?{display:"none"}:void 0},n.default.createElement("div",{className:"vcs-editor",ref:Jt,style:ee?{display:"none"}:void 0}),ee&&H&&!H.binary&&!ke&&n.default.createElement(Be,{comparison:H,labels:ze(t)}),ke&&n.default.createElement("div",{className:"vcs-message "+(se||_||ee?"vcs-error":""),role:"status"},ke,(se||_||ee)&&n.default.createElement("button",{onClick:()=>ee?Mt(l=>l+1):Ge()},t(ee?"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,H?.left.label||t("before")),n.default.createElement("th",null,H?.right.label||t("after")))),n.default.createElement("tbody",null,ct.map(l=>n.default.createElement("tr",{key:l},n.default.createElement("th",null,l),n.default.createElement("td",null,he.left?.[l]??"\u2014"),n.default.createElement("td",null,he.right?.[l]??"\u2014")))))),n.default.createElement("footer",{className:"vcs-toolbar"},n.default.createElement("button",{disabled:!oe,"aria-pressed":Ne,onClick:()=>Lr(!Ne)},t(Ne?"side":"inline")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!oe,checked:Re,onChange:l=>Pr(l.target.checked)}),t("whitespace")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!oe,checked:et,onChange:l=>Hr(l.target.checked)}),t("wrap")),n.default.createElement("span",{className:"vcs-spacer"}),oe&&n.default.createElement("span",null,tt.count," ",t("changes")),n.default.createElement("button",{disabled:!oe||!H||!!ke,onClick:()=>ye.current?.navigate("previous")},t("previous")),n.default.createElement("button",{disabled:!oe||!H||!!ke,onClick:()=>ye.current?.navigate("next")},t("next")),lt.index>0&&n.default.createElement("span",{className:"vcs-review-position"},t("reviewPosition",{index:lt.index,total:lt.total})),n.default.createElement("span",{className:"vcs-toolbar-separator"}),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Se.length,onClick:()=>dt("previous")},t("previousFile")),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Se.length,onClick:()=>dt("next")},t("nextFile"))))))}e.slots.inject("main",()=>e.slots.register({name:"main",key:"local-vcs"},s)),e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>t("title"),order:65},Ar))}
|
|
97
97
|
return module.exports; }});
|
package/docs/RELEASING.md
CHANGED
|
@@ -1,65 +1,52 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 维护者发布流程
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文用于维护项目。使用者请阅读[README](<../README.md>)和[安装指南](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/INSTALL.md)。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 发布内容
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
每个新版本必须有独立的中文发布说明,放在 `docs/releases/版本号.md`。按“本版变化、安装、限制、验证”组织,不把自动提交列表、开发轮次或内部恢复记录当作用户说明。没有新增功能时明确写出,不夸大改动。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
更新包版本和锁文件,在变更记录中填写同一版本。核查许可证、第三方声明及公开文件,排除凭据和私人数据。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## 1. 本地检查
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
需要 Node.js 22+、Git、SVN、svnadmin。在干净检出中执行:
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- [ ] 审查待公开文件和 Git 历史,排除个人路径、令牌、用户数据、私人记录和敏感图片。
|
|
15
|
+
npm ci --include=dev
|
|
16
|
+
npm run check
|
|
17
|
+
npm run verify:package
|
|
18
|
+
npm run test:install
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
测试失败或跳过须调查;隔离安装只检查包和宿主注册,不是用户实际 DSH 验收。
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
## 2. 固定版本并验证
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
npm pack
|
|
24
|
+
1. 提交并推送版本修改,创建新标签 `vX.Y.Z`;不移动已有标签。
|
|
25
|
+
2. 等待标签 CI 的 Windows/Ubuntu × Node 22/24 全部成功。
|
|
26
|
+
3. 手动在同一标签运行 **Browser layout checks**,等待成功。
|
|
27
|
+
4. 下载四个 CI 候选 tgz,确认字节大小和 SHA-256 全部一致。
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
分支检查不能代替同标签检查。失败后先定位;需要修改源码或测试时使用新的版本和标签。
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
## 3. 联合发布
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
在 Actions 从 main 运行 **Publish GitHub and npm**,输入已验证的标签。
|
|
36
34
|
|
|
37
|
-
|
|
35
|
+
工作流检出该标签,重新检查并打包。它先上传 npm,再验证公开 npm 元数据与实际下载包,最后创建 GitHub 正式 Release,上传同一个 tgz 和 SHA-256 校验文件。
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
仓库需配置 `NPM_AUTOMATION_TOKEN`,具有该包发布权限并符合 npm 2FA 策略。凭据只用于上传步骤;不要写进源码、发布说明或聊天。
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
## 4. 发布后核验
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
- npm 版本与 latest 正确,实际 tarball 可下载。
|
|
42
|
+
- GitHub Release 非草稿、非预发布,附件可下载。
|
|
43
|
+
- 两端实际包与四候选的字节大小和 SHA-256 一致。
|
|
44
|
+
- 补记最终结论,但不修改已发布标签或替换工件。
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
- [ ] 当前 / 上级仓库、一层子目录发现,以及明确相对子目录的定向发现。
|
|
47
|
-
- [ ] Git 三模式、SVN BASE 与属性;新增、删除、重命名、未跟踪和冲突提示。
|
|
48
|
-
- [ ] UTF-8、GBK、带 BOM 的 UTF-16;二进制与超大文件提示。
|
|
49
|
-
- [ ] 并排 / 行内、空白选项、换行、导航、主题和编辑器加载失败降级。
|
|
50
|
-
- [ ] Session / 仓库切换与重新发现不展示过期内容;预览不修改工作区或暂存区。
|
|
51
|
-
- [ ] 发现授权过期后的手动重新发现,以及取消请求的实际反馈。
|
|
46
|
+
npm 与 GitHub 不是原子发布。若 npm 已接受上传但公开下载暂时 404,**不要再次上传**;先只读确认公开包。确认相同后恢复原失败任务,工作流会核对已有 npm integrity 并跳过上传。不匹配则停止;已有 GitHub Release 不覆盖。
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
## 实机验证与安装边界
|
|
54
49
|
|
|
55
|
-
|
|
50
|
+
自动浏览器测试不等于当前 DSH 实机通过。发布说明须如实写出未确认项;用户明确授权在此边界下发布时,不伪造实机结论。
|
|
56
51
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
CI 会严格校验标签为 `vX.Y.Z` 且与包版本相同。联合发布检查同标签同提交的最新四组合CI和Chrome工作流成功,并下载四候选包比较字节与SHA-256;未运行、失败、尚在运行或包不一致时拒绝发布。公开npm元数据、实际tarball及latest也须验证,再上传同包至GitHub。这不替代真实 DSH 页面人工验收;用户授权发布未实机验收功能时,Release必须明确披露,不自动安装或重启。
|
|
60
|
-
|
|
61
|
-
## 5. 分发
|
|
62
|
-
|
|
63
|
-
确认完整附带许可证及第三方声明,不把本项目标记为标准开源软件。在已确认的仓库中按实际验证结果编写发布说明,附审核过的 tgz 和校验值,注明兼容环境与未验证事项。是否打 tag / 创建 GitHub Release 由维护者决定;不为本次整理虚构日期、历史版本或功能变更。
|
|
64
|
-
|
|
65
|
-
相关约定见 [README](<../README.md>)、[贡献指南](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/CONTRIBUTING.md>)、[变更记录](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/CHANGELOG.md>) 和 [安全说明](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/SECURITY.md>)。
|
|
52
|
+
发布不安装、不升级、不重启运行中的 DSH。用户选择安装后,在原 Web 页面检查入口、仓库发现、差异、历史以及 Session 切换;由用户自行重启。维护者不能启动替代服务器冒充当前页面。
|