@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 CHANGED
@@ -1,75 +1,97 @@
1
1
  # DSH VCS
2
2
 
3
- DeepSeek Harness(DSH)Web 的只读 Git / SVN 审阅插件,包名 **@feng0531/dsh-vcs**。最新正式版本 **0.3.65**;第七批 SVN HTTPS 历史已正式发布至 npm/GitHub,两端实际工件与候选摘要一致,范围与证据见 [SVN 冻结结论](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/SVN-RUNTIME-SCOPE.md>)。自动验证不等于当前 DSH GUI 实机验收;非商业许可证不变。
3
+ 在 DeepSeek Harness(DSH)Web 中查看 Git / SVN 文件变更和提交历史的**只读插件**。
4
4
 
5
- > 项目仓库:https://github.com/f-e-n-g-0531/dsh-vcs 。采用 [DSH VCS 非商业源码公开许可证 1.0](<LICENSE>):允许非商业使用、修改与分发,禁止商业使用(包括公司内部用于商业项目的开发、测试与维护),商业用途须另行书面授权。分发须保留许可证和版权,修改版须注明修改。第三方组件保持原许可。这是源码公开项目,不是 OSI 认可的开源软件。
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
- - Git 固定快照全历史搜索(说明/作者/路径)、本地分支导航与有界泳道、提交详情、父提交及 A/B Diff、跨重命名文件历史、精确 Blame 行定位与有界分页;历史目录预览和大文件 UTF-8 正文分段。文本比较默认高级只读 Diff,单版本预览默认高级只读编辑器;基础仅可选或失败回退。
10
- - 安全静态 PNG、基线单扫描 JPEG、单 VP8 WebP 的工作区及 A/B 图片比较;格式结构与浏览器解码双重检查。
11
- - 第七批:HTTPS SVN 固定工作副本修订日志、历史 r-1/r Diff 与止于复制边界的追溯。必须已发现仓库、手动审阅并勾选网络同意;未授权不联网。仅支持无需额外认证的 HTTPS 服务,不提供凭据或证书配置。
11
+ ## 能做什么
12
12
 
13
- - 顶部下拉选择仓库,一次展示一个仓库;插件内没有额外的左侧仓库导航栏,文件列表仍在比较区左侧。
14
- - Git 全部 / 已暂存 / 未暂存变更;SVN 本地 BASE 与工作副本、属性差异。
15
- - Monaco 只读差异视图:并排 / 行内、忽略行尾空白、自动换行、差异导航;编辑器加载失败时提供简化文本比较。
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
- 发现范围来自当前 Session 的服务端工作目录,浏览器不能指定任意绝对目录。宿主使用 maxDepth: 1、shallow: true:检查当前目录与直接子目录,并查找包含当前目录的上级 Git / SVN 仓库,不递归扫描整棵项目树。
25
+ ## 安装
22
26
 
23
- 更深层项目可在界面输入相对当前 Session 目录的子目录(例如 packages/example)重新发现;目标同样采用浅层扫描。绝对路径、.. 越界与经符号链接 / junction 的定向扫描会被拒绝。定向发现补充已有项目,清空输入重新发现则回到默认范围。
27
+ 需要:
24
28
 
25
- **包含仓库可能大于 Session 目录。** Session 位于仓库子目录时,预览范围可以覆盖整个已发现仓库,而不只该子目录。
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
- | Git 全部 | HEAD | 工作区 |
32
- | Git 已暂存 | HEAD | Index |
33
- | Git 未暂存 | Index | 工作区 |
34
- | SVN | 本地 BASE | 工作副本 |
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
- 新增、未跟踪或没有 HEAD 的文件按适用情况使用空白基线。Git 冲突降级为 HEAD 对工作区,不提供三方合并;SVN 替换节点可能没有可用的本地 BASE,会提示并使用空白基线,不为此连接服务器。
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
- 需要 Node.js **22 或更新版本**、npm、兼容插件接口的 DSH Web 宿主,以及 PATH 中可用的 Git 或 SVN。完整后端测试还需要 git、svn、svnadmin;缺少工具时应检查跳过项,不能把部分测试视为完整验收。
47
+ ## 开始使用
41
48
 
42
- 在项目根目录执行:
49
+ 1. 在 DSH 中选择一个 Session,确认它的工作目录在项目内。
50
+ 2. 打开 VCS 页面,发现仓库,再从顶部下拉框选择仓库。
51
+ 3. 点击文件查看差异,或进入历史视图浏览提交。
52
+ 4. 外部工具修改了项目后,手动刷新;可见窗口重新获得焦点时也会刷新。没有定时轮询。
43
53
 
44
- npm ci && npm run check
45
- npm pack
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
- check 构建并运行测试;npm pack 经 prepack 再次执行检查,生成含前端资源的安装包。推荐安装本地构建的 tgz,而不是让正式运行环境临时构建源码:
67
+ 新增文件可能使用空白左侧。冲突文件只供查看,不提供三方合并或冲突解决。
48
68
 
49
- dsh plugin --profile web add <absolute-tgz>
69
+ ### SVN 历史需要单独同意
50
70
 
51
- 将占位符替换为生成包的绝对路径;路径有空格时加引号。安装会改变目标 profile,请先核对环境。**需要重新加载宿主时,由用户自行重启 DSH**,再刷新已有 Web 页面;不要启动另一台服务器代替现有 GUI。
71
+ 本地 SVN 变更比较不连接服务器。打开远程历史前,需要审阅服务器与路径范围并勾选同意;授权约 5 分钟后过期,须重新手动同意。
52
72
 
53
- 从 Git 安装依赖 prepare 构建,需要构建依赖及生命周期脚本执行权限。pnpm 宿主可能还需显式批准构建(allowBuilds);按实际 pnpm 版本仅授权可信包,不要全局放行脚本。建议从本仓库检出后构建 tgz 安装。
73
+ 目前仅支持系统信任、**无需额外认证的 HTTPS SVN 服务**。不提供用户名/密码、自定义证书或其他协议。历史范围固定在本地工作副本的修订,不自动获取服务器最新版本。
54
74
 
55
- ## 限制与排错
75
+ ## 目前的限制
56
76
 
57
- - 单侧文本预览上限 2 MiB;二进制、超大文件和目录 / 特殊文件显示提示,不保证内容比较。
58
- - 编码自动识别:UTF-16 LE / BE BOM 优先;其余先严格 UTF-8,再尝试 GBK。带 UTF-8 BOM 的损坏文本不会回退 GBK。无 BOM 的 UTF-16 不保证支持;自动识别并非任意编码检测器。
59
- - 发现有时间、目录数和仓库数限制;警告或截断不等于没有其他仓库。Git 子模块和 SVN externals 不提供专门的递归管理界面。
60
- - 工具不可用时检查 PATH;发现授权约 5 分钟后过期,需要手动重新发现。状态已变或 Session 工作目录变化时刷新 / 重新发现。
61
- - 取消界面请求不保证立即停止正在执行的状态 / 比较子进程;命令仍受各自超时与输出上限约束。
62
- - 编辑器资源不可用时检查构建与安装包。简化文本比较不等价于 Monaco 的完整功能。
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
- 见 [安装、升级与回滚](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/INSTALL.md>) 和 [兼容性与验收矩阵](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/COMPATIBILITY.md>)。发布包必须通过 `npm run verify:package` 和 `npm run test:install`;后者验证生产依赖安装,不代表真实 DSH 浏览器验收。正式发布统一从 GitHub Actions 手动触发,使用 NPM_AUTOMATION_TOKEN 先发布 npm,再公开 GitHub Release;普通提交和标签 CI 不自动发布。
86
+ - **找不到仓库**:检查 Session 工作目录和 Git/SVN 的 PATH;更深项目使用相对子目录发现。
87
+ - **提示重新发现**:目录变了或发现授权过期,手动重新发现即可。
88
+ - **高级编辑器加载失败**:确认安装了完整正式包并重新加载宿主;失败时仍可使用基础比较。
89
+ - **SVN 历史连接失败**:先确认是受信任 HTTPS 服务,且不要求本插件未支持的额外认证。
68
90
 
69
- ## 项目资料
91
+ 正式版本通过自动测试、Windows/Linux 检查和隔离浏览器回归。**这些不证明你的当前 DSH 页面已加载新版,也不代替你的实际环境验证。**
70
92
 
71
- [文档导航](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/README.md>)按使用、架构、验证与历史材料分类。
93
+ ## 开发与更多资料
72
94
 
73
- 见 [贡献指南](<https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/CONTRIBUTING.md>)、[发布清单](<docs/RELEASING.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>)。
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
- 界面交互参考 [Fork](https://fork.dev/)。这仅说明设计灵感,不表示与 Fork 官方有关联、获得背书或继承其代码许可。
97
+ 界面设计参考 [Fork](https://fork.dev/),不代表与 Fork 官方有关联或获得背书。
@@ -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
- 当前包名 @feng0531/dsh-vcs;正式发布统一走 GitHub Actions,不在本地 npm publish。公开下载不改变非商业许可证。
3
+ 本文用于维护项目。使用者请阅读[README](<../README.md>)和[安装指南](https://github.com/f-e-n-g-0531/dsh-vcs/blob/main/docs/INSTALL.md)。
4
4
 
5
- ## GitHub + npm 联合发布
5
+ ## 发布内容
6
6
 
7
- 在 GitHub 仓库 Settings → Secrets and variables → Actions 添加 NPM_AUTOMATION_TOKEN。该令牌必须有 @feng0531/dsh-vcs 发布权限,并满足 npm 的 2FA 策略(需要时启用 bypass 2FA);名字叫 AUTOMATION_TOKEN 不会自动赋予权限。不要在聊天、源码或日志中公开值。
7
+ 每个新版本必须有独立的中文发布说明,放在 `docs/releases/版本号.md`。按“本版变化、安装、限制、验证”组织,不把自动提交列表、开发轮次或内部恢复记录当作用户说明。没有新增功能时明确写出,不夸大改动。
8
8
 
9
- 对应标签 CI 全绿及人工验收后,从 main 手动运行 Publish GitHub and npm 工作流,填写已有版本标签。构建、验证和打包步骤不注入 npm 凭据;仅 npm 发布步骤使用 NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }},且禁用生命周期脚本。同一 tgz 先发布 npm,再作为 GitHub 正式 Release 附件上传并附 SHA-256。
9
+ 更新包版本和锁文件,在变更记录中填写同一版本。核查许可证、第三方声明及公开文件,排除凭据和私人数据。
10
10
 
11
- 两平台不支持原子事务:npm 失败则不发布 GitHub;npm 成功而 GitHub 失败时,重跑仅在已发布 npm integrity 与当前包完全一致时继续,否则拒绝覆盖。GitHub 已存在 Release 时也拒绝覆盖,需先检查现场。新版本不移动旧标签。
11
+ ## 1. 本地检查
12
12
 
13
- ## 1. 公开发布前的决定
13
+ 需要 Node.js 22+、Git、SVN、svnadmin。在干净检出中执行:
14
14
 
15
- - [x] 仓库地址已确认:https://github.com/f-e-n-g-0531/dsh-vcs 。
16
- - [x] 正式采用 [非商业源码公开许可证 1.0](<../LICENSE>),禁止商用,允许非商业修改和分发。
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
- ## 2. 干净环境验证
20
+ 测试失败或跳过须调查;隔离安装只检查包和宿主注册,不是用户实际 DSH 验收。
22
21
 
23
- 使用 Node.js 22 或更新版本,在干净检出目录中执行:
22
+ ## 2. 固定版本并验证
24
23
 
25
- npm ci && npm run check
26
- npm run verify:package
27
- npm run test:install
28
- npm pack --dry-run
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
- 确认锁文件安装、构建和测试成功,记录失败与跳过项。完整 Git / SVN 测试需要 git、svn、svnadmin。npm pack 的 prepack 会执行 check;审查包内容是否包含客户端、编辑器、CSS、worker、宿主入口、适配器、语言文件与插件 patch。
29
+ 分支检查不能代替同标签检查。失败后先定位;需要修改源码或测试时使用新的版本和标签。
32
30
 
33
- 构建会复制 Monaco 的许可证与第三方声明进入分发资源;仍应核查最终包中的声明及其他依赖义务。排除测试数据、依赖目录与私人材料。
31
+ ## 3. 联合发布
34
32
 
35
- Git 来源安装依赖 prepare 构建,需要另行验证生命周期和构建依赖。pnpm 可能需要 allowBuilds 审批;拒绝脚本的环境应优先使用已构建 tgz,不应直接关闭安全策略。
33
+ 在 Actions 从 main 运行 **Publish GitHub and npm**,输入已验证的标签。
36
34
 
37
- ## 3. 安装与真实页面验收
35
+ 工作流检出该标签,重新检查并打包。它先上传 npm,再验证公开 npm 元数据与实际下载包,最后创建 GitHub 正式 Release,上传同一个 tgz 和 SHA-256 校验文件。
38
36
 
39
- dsh plugin --profile web add <absolute-tgz>
37
+ 仓库需配置 `NPM_AUTOMATION_TOKEN`,具有该包发布权限并符合 npm 2FA 策略。凭据只用于上传步骤;不要写进源码、发布说明或聊天。
40
38
 
41
- 替换为包的绝对路径,必要时加引号。先确认目标 profile 和宿主兼容性;安装改变运行配置,不是无副作用检查。
39
+ ## 4. 发布后核验
42
40
 
43
- **宿主重启只能由用户执行。** 用户重启后刷新现有 DSH Web 地址,在真实 Session 中验证:
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
- ## 4. 标签 CI 与发布工作流
50
+ 自动浏览器测试不等于当前 DSH 实机通过。发布说明须如实写出未确认项;用户明确授权在此边界下发布时,不伪造实机结论。
56
51
 
57
- 普通分支 push、PR 和日常脚本修改不自动触发 CI;可手动对分支运行四组合CI作冻结前验证。维护者主动推送版本标签(`vX.Y.Z`)会触发 Windows/Linux × Node22/24矩阵;手动分支结果不能替代同标签CI。完成本地检查后,确认包版本并执行 `git tag vX.Y.Z`、`git push origin vX.Y.Z`(替换成真实版本,标签须指向包含新 CI 规则的提交)。不要移动已经发布的标签。等待该标签的 CI 全部通过并完成真实页面验收后再进行发布。在 Actions 手动运行 Release workflow 并填写已有 tag:工作流验证版本、重新构建与测试、检查包并生成 SHA256SUMS.txt,随后先发布 npm 再公开 GitHub Release。手动触发即授权两平台正式发布。未通过的真实页面验收不得勾选完成。
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 切换;由用户自行重启。维护者不能启动替代服务器冒充当前页面。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng0531/dsh-vcs",
3
- "version": "0.3.67",
3
+ "version": "0.3.68",
4
4
  "private": false,
5
5
  "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
6
6
  "type": "module",