dsh-git-changes 0.0.0-stage → 0.1.1

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.
Files changed (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +119 -0
  3. package/README.md +137 -2
  4. package/THIRD_PARTY_NOTICES.md +12 -0
  5. package/assets/vendor/monaco/LICENSE +21 -0
  6. package/assets/vendor/monaco/ThirdPartyNotices.txt +448 -0
  7. package/assets/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  8. package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.js +7 -0
  9. package/assets/vendor/monaco/vs/base/common/worker/simpleWorker.nls.zh-cn.js +7 -0
  10. package/assets/vendor/monaco/vs/base/worker/workerMain.js +26 -0
  11. package/assets/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
  12. package/assets/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
  13. package/assets/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
  14. package/assets/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
  15. package/assets/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
  16. package/assets/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
  17. package/assets/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
  18. package/assets/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
  19. package/assets/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
  20. package/assets/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
  21. package/assets/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
  22. package/assets/vendor/monaco/vs/basic-languages/css/css.js +12 -0
  23. package/assets/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
  24. package/assets/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
  25. package/assets/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  26. package/assets/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
  27. package/assets/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
  28. package/assets/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
  29. package/assets/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  30. package/assets/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
  31. package/assets/vendor/monaco/vs/basic-languages/go/go.js +10 -0
  32. package/assets/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
  33. package/assets/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
  34. package/assets/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
  35. package/assets/vendor/monaco/vs/basic-languages/html/html.js +10 -0
  36. package/assets/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
  37. package/assets/vendor/monaco/vs/basic-languages/java/java.js +10 -0
  38. package/assets/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
  39. package/assets/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
  40. package/assets/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
  41. package/assets/vendor/monaco/vs/basic-languages/less/less.js +11 -0
  42. package/assets/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
  43. package/assets/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
  44. package/assets/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
  45. package/assets/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
  46. package/assets/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
  47. package/assets/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
  48. package/assets/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
  49. package/assets/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
  50. package/assets/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
  51. package/assets/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
  52. package/assets/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
  53. package/assets/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  54. package/assets/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
  55. package/assets/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
  56. package/assets/vendor/monaco/vs/basic-languages/php/php.js +10 -0
  57. package/assets/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
  58. package/assets/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
  59. package/assets/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
  60. package/assets/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
  61. package/assets/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
  62. package/assets/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
  63. package/assets/vendor/monaco/vs/basic-languages/python/python.js +10 -0
  64. package/assets/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
  65. package/assets/vendor/monaco/vs/basic-languages/r/r.js +10 -0
  66. package/assets/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
  67. package/assets/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
  68. package/assets/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
  69. package/assets/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  70. package/assets/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
  71. package/assets/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
  72. package/assets/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
  73. package/assets/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
  74. package/assets/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
  75. package/assets/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
  76. package/assets/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
  77. package/assets/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
  78. package/assets/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
  79. package/assets/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
  80. package/assets/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
  81. package/assets/vendor/monaco/vs/basic-languages/st/st.js +10 -0
  82. package/assets/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
  83. package/assets/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  84. package/assets/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
  85. package/assets/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
  86. package/assets/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
  87. package/assets/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
  88. package/assets/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
  89. package/assets/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
  90. package/assets/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
  91. package/assets/vendor/monaco/vs/editor/editor.main.css +6 -0
  92. package/assets/vendor/monaco/vs/editor/editor.main.js +744 -0
  93. package/assets/vendor/monaco/vs/editor/editor.main.nls.js +28 -0
  94. package/assets/vendor/monaco/vs/editor/editor.main.nls.zh-cn.js +30 -0
  95. package/assets/vendor/monaco/vs/language/css/cssMode.js +13 -0
  96. package/assets/vendor/monaco/vs/language/css/cssWorker.js +81 -0
  97. package/assets/vendor/monaco/vs/language/html/htmlMode.js +13 -0
  98. package/assets/vendor/monaco/vs/language/html/htmlWorker.js +453 -0
  99. package/assets/vendor/monaco/vs/language/json/jsonMode.js +15 -0
  100. package/assets/vendor/monaco/vs/language/json/jsonWorker.js +36 -0
  101. package/assets/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
  102. package/assets/vendor/monaco/vs/language/typescript/tsWorker.js +37016 -0
  103. package/assets/vendor/monaco/vs/loader.js +10 -0
  104. package/cordis.patch.yml +3 -0
  105. package/docs/images/git-changes-diff.png +0 -0
  106. package/docs/regression-checklist.md +47 -0
  107. package/icon.svg +10 -0
  108. package/lib/client.js +9418 -0
  109. package/lib/host/assets.js +161 -0
  110. package/lib/host/commit-message.js +158 -0
  111. package/lib/host/files-index.js +206 -0
  112. package/lib/host/git-write.js +194 -0
  113. package/lib/host/git.js +1147 -0
  114. package/lib/host/lsp.js +842 -0
  115. package/lib/host/routes.js +976 -0
  116. package/lib/host/session.js +84 -0
  117. package/lib/host/util.js +107 -0
  118. package/lib/index.js +33 -0
  119. package/licenses/dsh-vscode-mode-LICENSE +21 -0
  120. package/licenses/vscode-theme-seti-LICENSE +21 -0
  121. package/licenses/vscode-theme-seti-ThirdPartyNotices.txt +32 -0
  122. package/locale/en.json +6 -0
  123. package/locale/zh.json +6 -0
  124. package/package.json +65 -4
  125. package/src/client/00-const.js +79 -0
  126. package/src/client/05-utils.js +277 -0
  127. package/src/client/10-i18n.js +548 -0
  128. package/src/client/12-vscode-icons.js +460 -0
  129. package/src/client/15-theme.js +509 -0
  130. package/src/client/20-monaco.js +1404 -0
  131. package/src/client/22-lsp.js +592 -0
  132. package/src/client/25-tree.js +563 -0
  133. package/src/client/28-changes.js +1163 -0
  134. package/src/client/30-page.js +2259 -0
  135. package/src/client/35-pill.js +185 -0
  136. package/src/client/40-commands.js +248 -0
  137. package/src/client/45-css.js +357 -0
  138. package/src/client/47-pickers.js +457 -0
  139. package/src/client/50-apply.js +207 -0
  140. package/src/client/99-footer.js +62 -0
@@ -0,0 +1,548 @@
1
+ /* dsh-git-changes client half — Chinese/English dictionaries. */
2
+
3
+ /** zh-CN copy (primary). */
4
+ const ZH = {
5
+ 'tab.title': 'Git 审查',
6
+ 'tab.description': '查看改动、暂存 / 提交 / 推送,并在内联或左右并排 diff 中审查代码',
7
+
8
+ 'pill.changes': '本轮修改 {count} 文件',
9
+ 'pill.stats': '+{added} −{deleted}',
10
+ 'pill.open': '查看差异',
11
+ 'pill.none': '本轮没有文件改动',
12
+ 'pill.unavailable': '本轮对比不可用',
13
+ 'pill.tooltip': '点击在右侧栏打开「代码审查」',
14
+
15
+ 'mode.turn': 'Agent 本轮',
16
+ 'mode.turn.desc': '本轮对话里 Agent 改了什么(与开始时对比)',
17
+ 'mode.turn.emptyToGit': '本轮没有可审查的改动,已切换到「Git 未提交」',
18
+ 'mode.git.desc': '本地还没提交的改动(暂存看 HEAD,未暂存看索引)',
19
+ 'mode.commit.desc': '最近一次提交改了什么',
20
+ 'mode.revision.desc': '选任意提交作为对比基准',
21
+ 'mode.code.desc': '只看当前文件,不显示差异',
22
+ 'mode.turn.withTurn': 'Agent 本轮 #{turn}',
23
+ 'mode.git': 'Git 未提交',
24
+ 'mode.code': '仅代码',
25
+ 'mode.git.phase2': 'Git 模式将在 Phase 2 提供',
26
+ 'mode.turn.unavailable': '本轮对比已不可用(Host 重启后失效)',
27
+
28
+ 'action.refresh': '刷新',
29
+ 'action.toggleTree': '文件树',
30
+ 'action.exitRevision': '退出历史版本',
31
+ 'action.exitRevision.hint': '返回 Git 未提交改动',
32
+ 'action.more': '更多',
33
+ 'action.copyPath': '复制相对路径',
34
+ 'action.copyAbsolutePath': '复制绝对路径',
35
+ 'action.closeTab': '关闭标签',
36
+ 'action.fontLarger': '增大字号',
37
+ 'action.fontSmaller': '减小字号',
38
+ 'action.fontReset': '重置字号',
39
+ 'action.openInPreview': '用 DSH 内置预览打开',
40
+
41
+ 'toolbar.loading': '加载中…',
42
+ 'toolbar.tree.changedOnly': '仅看改动',
43
+ 'toolbar.tree.all': '全部文件',
44
+
45
+ // Phase 2: git / pickers
46
+ 'mode.git.unavailable': '当前工作区不是 git 仓库',
47
+ 'action.quickOpen': '快速打开文件…',
48
+ 'tree.hide': '隐藏文件树',
49
+ 'tree.show': '显示文件树',
50
+ 'action.search': '工作区搜索…',
51
+ 'action.commands': '命令面板…',
52
+ 'action.files': '文件',
53
+ 'mode.git.badge': 'Git 未提交',
54
+ 'picker.quickOpen.title': '快速打开文件',
55
+ 'picker.quickOpen.placeholder': '输入文件名(支持模糊匹配)…',
56
+ 'picker.search.title': '工作区搜索',
57
+ 'picker.search.placeholder': '输入要搜索的文本,回车搜索…',
58
+ 'picker.commands.title': '命令面板',
59
+ 'picker.commands.placeholder': '输入命令名…',
60
+ 'picker.empty': '没有匹配结果',
61
+ 'picker.loading': '加载中…',
62
+ 'picker.hint.navigate': '↑↓ 选择 · Enter 打开 · Esc 关闭',
63
+ 'picker.search.scanning': '搜索中…',
64
+ 'picker.search.results': '{count} 个结果(已扫描 {scanned} 个文件)',
65
+ 'picker.search.none': '没有找到匹配文本',
66
+ 'picker.files.truncated': '文件索引已截断(工作区过大)',
67
+ 'status.git': 'Git 未提交 · {count} 个文件',
68
+ 'status.hunks': '改动 {count} 处',
69
+ 'status.git.unavailable': 'Git 不可用',
70
+ 'status.git.deleted': '该文件已在工作区删除',
71
+ 'cmd.quickOpen': '快速打开文件',
72
+ 'cmd.search': '工作区搜索',
73
+ 'cmd.commands': '命令面板',
74
+ 'cmd.gotoLine': '跳转到行',
75
+ 'action.shortcuts': '快捷键',
76
+ 'picker.keys.title': '快捷键',
77
+ 'picker.keys.placeholder': '搜索命令或按键…',
78
+ 'keys.unbound': '(默认键被系统占用,未绑定,可在设置中改绑)',
79
+ 'keys.failed': '(注册失败)',
80
+ 'picker.line.title': '跳转到行',
81
+ 'picker.line.placeholder': '输入行号后回车(例如 120)',
82
+ 'picker.line.hint': '当前文件共 {lines} 行',
83
+ 'picker.line.invalid': '请输入有效行号',
84
+
85
+ // Phase 3: arbitrary git version comparison
86
+ 'mode.commit': '最新提交',
87
+ 'mode.commit.hint': '查看最近一次提交的改动',
88
+ 'mode.revision.pick': 'Git 版本…',
89
+ 'mode.revision.with': 'Git {ref}',
90
+ 'mode.revision.pick.hint': '选择任意 git 版本查看该版本或自该版本以来的改动',
91
+ 'mode.revision.unavailable': 'Git 版本不可用',
92
+ 'picker.revisions.title': 'Git 版本对比',
93
+ 'picker.revisions.placeholder': '搜索提交(sha / 说明 / 分支),或输入任意版本引用…',
94
+ 'picker.revisions.loading': '加载提交历史…',
95
+ 'picker.revisions.none': '仓库还没有提交',
96
+ 'picker.revisions.empty': '没有匹配的提交',
97
+ 'picker.revisions.raw': '使用输入的版本 “{query}”',
98
+ 'picker.revisions.resolving': '正在解析版本…',
99
+ 'picker.revisions.resolveFailed': '无法解析该版本:{message}',
100
+ 'picker.revisions.scope.commit': '该版本改动',
101
+ 'picker.revisions.scope.since': '自该版本以来',
102
+ 'picker.revisions.scope.commit.hint': '与上一版本(第一父提交)比较,展示该次提交引入的改动',
103
+ 'picker.revisions.scope.since.hint': '与当前工作区比较,包含未提交改动',
104
+ 'picker.revisions.head': '当前版本 {ref}',
105
+ 'picker.revisions.branch': '分支 {branch}',
106
+ 'picker.revisions.branchUpstream': '分支 {branch} · 上游 {upstream}',
107
+ 'picker.revisions.detached': '游离 HEAD',
108
+ 'picker.revisions.ahead': '{count} 个未推送提交',
109
+ 'status.revision.commit': '{base} → {ref} · {count} 个文件',
110
+ 'status.revision.since': '自 {base} 以来 · {count} 个文件',
111
+ 'status.revision.loading': '加载版本对比…',
112
+ 'status.revision.unavailable': 'Git 版本对比不可用',
113
+ 'status.revision.historical': '历史版本',
114
+ 'status.revision.worktree': '工作区',
115
+ 'tree.noChanges': '没有文件改动',
116
+ 'error.hostOutdated': '插件 Host 端仍是旧版本(缺少 Git 版本对比):请重启 DSH 后再试',
117
+
118
+ 'status.lines': 'Ln {line}, Col {column}',
119
+ 'status.mode.turn': '本轮 #{turn}({seq})',
120
+ 'status.mode.turn.stale': '本轮对比已不可用',
121
+ 'status.mode.git': 'HEAD ↔ 工作区(Phase 2)',
122
+ 'status.mode.code': '仅代码(无 diff)',
123
+ 'status.treeWidth': '树宽 {width}px',
124
+ 'status.fileInfo': '{lines} 行 · {language}',
125
+ 'status.binary': '二进制文件,无法显示源码',
126
+ 'status.oversized': '文件过大(>{size}),未加载',
127
+ 'status.loadingFile': '读取文件中…',
128
+ 'status.diffLoading': '计算差异中…',
129
+ 'status.diffOversized': '差异超过显示上限;当前仅显示源码',
130
+
131
+ 'empty.title': '选择一个文件开始审查',
132
+ 'empty.body': '左侧是完整源码;本轮有改动的文件会显示行级内联差异。也可以从聊天输入框上方的「本轮修改」入口打开。',
133
+ 'empty.error': '加载失败',
134
+ 'empty.retry': '重试',
135
+
136
+ 'handoff.title': '非代码文件',
137
+ 'handoff.body': '本窗口 v1 只读代码。{name} 可交给 DSH 内置预览或系统应用打开,不会显示空白页。',
138
+
139
+ 'error.noSession': '没有可用的会话。',
140
+ 'error.sidebarUnavailable': '右侧栏服务不可用,已降级到中央视图。',
141
+ 'error.openFailed': '打开审查页失败:{message}',
142
+ 'error.sessionGone': '会话已不在当前 Host 进程中(重启后 TURN 数据失效)。',
143
+
144
+ 'hint.turnMulti': '提示:本轮改动 {count} 个文件,可在右侧树中切换。',
145
+
146
+ 'cmd.openReview': '打开代码审查',
147
+ 'cmd.nextChange': '下一处改动',
148
+ 'cmd.prevChange': '上一处改动',
149
+ 'cmd.nextTab': '下一个标签页',
150
+ 'cmd.prevTab': '上一个标签页',
151
+ 'cmd.closeTab': '关闭标签页',
152
+ 'cmd.navBack': '导航后退',
153
+ 'cmd.navForward': '导航前进',
154
+ 'cmd.toggleTree': '显示/隐藏文件树',
155
+ 'cmd.refresh': '刷新审查页',
156
+ 'cmd.copyPath': '复制当前文件相对路径',
157
+ 'cmd.openInPreview': '用 DSH 内置预览打开当前文件',
158
+ 'cmd.outline': '文档大纲',
159
+ 'lsp.missing': '语言服务器未安装({language})。安装后可使用跳转定义 / 查找引用 / 悬停提示 / 诊断',
160
+ 'lsp.copyInstall': '复制安装命令',
161
+ 'lsp.install': '安装',
162
+ 'lsp.recheck': '重新检测语言服务器',
163
+ 'picker.definitions.title': '定义位置',
164
+ 'lsp.sent': '已发送安装请求给 Agent,正在安装…',
165
+ 'lsp.toastTitle': '未检测到语言服务器({language})',
166
+ 'lsp.toastBody': '安装后本页即可使用跳转定义、查找引用、悬停提示与诊断。',
167
+ 'lsp.unsupported': '当前文件语言({language})暂不支持语言服务器功能。支持:TypeScript/JavaScript、Python、JSON、Go、Rust。',
168
+ 'lsp.askAgent': '让 DSH Agent 安装',
169
+ 'lsp.copied': '已复制,可粘贴到聊天框让 Agent 安装',
170
+ 'lsp.inserted': '已填入聊天输入框,按回车发送即可让 Agent 安装',
171
+ 'lsp.noSymbols': '没有可显示的大纲(或语言服务器不可用)',
172
+ 'lsp.historicalCrossFile': '历史版本:已打开目标文件在该版本中的内容;行号取自当前工作区,可能略有偏移',
173
+ 'picker.locations.title': '引用位置',
174
+ 'picker.locations.placeholder': '筛选位置…',
175
+ 'picker.outline.title': '文档大纲',
176
+ 'picker.outline.placeholder': '筛选大纲…',
177
+
178
+
179
+ // Git CHANGES panel
180
+ 'changes.title': '更改',
181
+ 'changes.mode.changes': '更改',
182
+ 'changes.mode.tree': '项目',
183
+ 'changes.message': '提交信息',
184
+ 'changes.messagePlaceholder': '消息(⌘↩ 在 “{branch}” 提交)',
185
+ 'changes.commit': '提交',
186
+ 'changes.commitPush': '提交并推送',
187
+ 'changes.committing': '提交中…',
188
+ 'changes.moreCommitActions': '更多提交操作',
189
+ 'changes.staged': '暂存的更改',
190
+ 'changes.unstaged': '更改',
191
+ 'changes.stage': '暂存',
192
+ 'changes.stageFolder': '暂存该目录下的全部更改',
193
+ 'changes.unstage': '取消暂存',
194
+ 'changes.unstageFolder': '取消暂存该目录下的全部更改',
195
+ 'changes.stageAll': '暂存所有更改',
196
+ 'changes.unstageAll': '取消暂存所有更改',
197
+ 'changes.stagedToast': '已暂存',
198
+ 'changes.unstagedToast': '已取消暂存',
199
+ 'changes.committed': '已提交',
200
+ 'changes.committedPushed': '已提交并推送',
201
+ 'changes.refresh': '刷新更改',
202
+ 'changes.branchUnknown': '未知分支',
203
+ 'changes.sectionEmpty': '没有文件',
204
+ 'changes.loading': '读取 Git 状态…',
205
+ 'changes.noChanges': '没有更改',
206
+ 'changes.notGit': '当前工作区不是 Git 仓库',
207
+ 'changes.noGit': '未安装 Git',
208
+ 'changes.unavailable': 'Git 状态不可用',
209
+ 'changes.copied': '已复制相对路径',
210
+ 'changes.copyFailed': '复制失败(剪贴板不可用)',
211
+ 'changes.openDiff': '打开更改',
212
+ 'changes.openFile': '打开文件(不进 diff)',
213
+ 'changes.discard': '放弃更改',
214
+ 'changes.discardStaged': '放弃暂存中的更改(回到 HEAD)',
215
+ 'changes.discardAll': '放弃全部更改',
216
+ 'changes.discardConfirmTitle': '放弃更改?',
217
+ 'changes.discardConfirmBody': '将放弃 {count} 个文件的改动,此操作不可撤销。',
218
+ 'changes.discardConfirmOk': '放弃更改',
219
+ 'changes.discardCancel': '取消',
220
+ 'changes.discarded': '已放弃更改',
221
+ 'changes.error.discard-failed': '放弃更改失败,请检查是否有未跟踪的文件或权限不足',
222
+ 'changes.copyPath': '复制相对路径',
223
+ 'changes.error.invalid-body': '请求格式不正确',
224
+ 'changes.error.invalid-coordinates': '缺少会话信息',
225
+ 'changes.error.session-not-live': '会话已不在当前 Host 进程中',
226
+ 'changes.error.no-cwd': '会话没有工作目录',
227
+ 'changes.error.empty-selection': '没有选择文件',
228
+ 'changes.error.invalid-path': '文件路径不在工作区内',
229
+ 'changes.error.invalid-message': '提交信息需为 1–5000 字符且不能以 - 开头',
230
+ 'changes.error.write-failed': 'Git 操作失败',
231
+ 'changes.error.nothing-staged': '没有已暂存的更改',
232
+ 'changes.error.identity-missing': '缺少 git 用户身份(请配置 user.name / user.email)',
233
+ 'changes.error.no-git': '未安装 Git',
234
+ 'changes.error.not-git': '不是 Git 仓库',
235
+ 'changes.error.detached-head': '游离 HEAD 无法推送',
236
+ 'changes.error.no-upstream': '当前分支没有上游分支',
237
+ 'changes.error.push-failed': '推送失败',
238
+ 'changes.error.generic': '操作失败',
239
+ 'changes.view.tree': '以树形式查看',
240
+ 'changes.view.list': '以列表形式查看',
241
+ 'changes.aiGenerate': 'AI 生成提交信息',
242
+ 'changes.aiGenerated': '已生成提交信息',
243
+ 'changes.aiFailed': '生成提交信息失败',
244
+ 'changes.graph': '提交图谱',
245
+ 'changes.graphEmpty': '暂无提交',
246
+ 'changes.error.llm-unavailable': '当前 Host 未提供模型服务',
247
+ 'changes.error.model-unavailable': '没有可用的默认模型',
248
+ 'changes.error.no-changes': '没有可生成的改动',
249
+ 'changes.error.generate-failed': '生成提交信息失败',
250
+ 'changes.error.diff-failed': '读取改动失败',
251
+ 'changes.error.log-failed': '读取提交历史失败',
252
+ 'changes.tag.staged': '暂存',
253
+ 'changes.tag.unstaged': '未暂存',
254
+ 'diff.layout': 'Diff 布局',
255
+ 'diff.inline': '内联',
256
+ 'diff.side': '左右并排',
257
+ 'diff.auto': '自动',
258
+ 'commands.switchGit': '切换到 Git 未提交',
259
+ 'commands.switchTurn': '切换到本轮对话改动',
260
+ 'commands.switchHead': '查看最新提交的改动',
261
+ 'commands.switchRevision': '选择 Git 版本…',
262
+ 'commands.switchCode': '仅代码查看(不显示差异)',
263
+ 'blame.justNow': '刚刚',
264
+ 'blame.minutesAgo': '{count} 分钟前',
265
+ 'blame.hoursAgo': '{count} 小时前',
266
+ 'blame.daysAgo': '{count} 天前',
267
+ 'blame.uncommitted': '未提交',
268
+ 'blame.copySha': '复制提交号',
269
+ 'blame.copyFailed': '复制失败',
270
+ 'blame.copied': '已复制',
271
+ 'common.close': '关闭',
272
+ 'common.copied': '已复制',
273
+ 'common.loading': '加载中',
274
+ }
275
+
276
+ /** English fallback. */
277
+ const EN = {
278
+ 'tab.title': 'Git Review',
279
+ 'tab.description': 'Review changes, stage / unstage, commit and push, with inline or side-by-side diffs',
280
+
281
+ 'pill.changes': '{count} files changed this turn',
282
+ 'pill.stats': '+{added} −{deleted}',
283
+ 'pill.open': 'Review diff',
284
+ 'pill.none': 'No file changes this turn',
285
+ 'pill.unavailable': 'Turn comparison unavailable',
286
+ 'pill.tooltip': 'Open Code Review in the right sidebar',
287
+
288
+ 'mode.turn': 'Agent turn',
289
+ 'mode.turn.desc': 'What the agent changed this turn (vs the turn start)',
290
+ 'mode.turn.emptyToGit': 'No conversation changes to review; switched to uncommitted changes',
291
+ 'mode.git.desc': 'Uncommitted local changes (staged vs HEAD, unstaged vs index)',
292
+ 'mode.commit.desc': 'What the latest commit changed',
293
+ 'mode.revision.desc': 'Pick any commit as the comparison baseline',
294
+ 'mode.code.desc': 'Plain file view without diff',
295
+ 'mode.turn.withTurn': 'Agent turn #{turn}',
296
+ 'mode.git': 'Git uncommitted',
297
+ 'mode.code': 'Code only',
298
+ 'mode.git.phase2': 'Git mode arrives in Phase 2',
299
+ 'mode.turn.unavailable': 'Turn comparison unavailable (lost after Host restart)',
300
+
301
+ 'action.refresh': 'Refresh',
302
+ 'action.toggleTree': 'File tree',
303
+ 'action.exitRevision': 'Exit history view',
304
+ 'action.exitRevision.hint': 'Back to uncommitted changes',
305
+ 'action.more': 'More',
306
+ 'action.copyPath': 'Copy relative path',
307
+ 'action.copyAbsolutePath': 'Copy absolute path',
308
+ 'action.closeTab': 'Close tab',
309
+ 'action.fontLarger': 'Increase font size',
310
+ 'action.fontSmaller': 'Decrease font size',
311
+ 'action.fontReset': 'Reset font size',
312
+ 'action.openInPreview': 'Open in DSH preview',
313
+
314
+ 'toolbar.loading': 'Loading…',
315
+ 'toolbar.tree.changedOnly': 'Changes only',
316
+ 'toolbar.tree.all': 'All files',
317
+
318
+ // Phase 2: git / pickers
319
+ 'mode.git.unavailable': 'This workspace is not a git repository',
320
+ 'action.quickOpen': 'Quick open file…',
321
+ 'tree.hide': 'Hide file tree',
322
+ 'tree.show': 'Show file tree',
323
+ 'action.search': 'Search workspace…',
324
+ 'action.commands': 'Command palette…',
325
+ 'action.files': 'Files',
326
+ 'mode.git.badge': 'Git uncommitted',
327
+ 'picker.quickOpen.title': 'Quick open file',
328
+ 'picker.quickOpen.placeholder': 'Type a file name (fuzzy match)…',
329
+ 'picker.search.title': 'Search workspace',
330
+ 'picker.search.placeholder': 'Type text to search, Enter to run…',
331
+ 'picker.commands.title': 'Command palette',
332
+ 'picker.commands.placeholder': 'Type a command…',
333
+ 'picker.empty': 'No matching results',
334
+ 'picker.loading': 'Loading…',
335
+ 'picker.hint.navigate': '↑↓ select · Enter open · Esc close',
336
+ 'picker.search.scanning': 'Searching…',
337
+ 'picker.search.results': '{count} results ({scanned} files scanned)',
338
+ 'picker.search.none': 'No matching text',
339
+ 'picker.files.truncated': 'File index truncated (large workspace)',
340
+ 'status.git': 'Git uncommitted · {count} files',
341
+ 'status.hunks': '{count} changes',
342
+ 'status.git.unavailable': 'Git unavailable',
343
+ 'status.git.deleted': 'This file is deleted in the working tree',
344
+ 'cmd.quickOpen': 'Quick open file',
345
+ 'cmd.search': 'Search workspace',
346
+ 'cmd.commands': 'Command palette',
347
+ 'cmd.gotoLine': 'Go to line',
348
+ 'action.shortcuts': 'Keyboard shortcuts',
349
+ 'picker.keys.title': 'Keyboard shortcuts',
350
+ 'picker.keys.placeholder': 'Search commands or keys…',
351
+ 'keys.unbound': ' (default key occupied by the system; unbound — rebind in Settings)',
352
+ 'keys.failed': ' (registration failed)',
353
+ 'picker.line.title': 'Go to line',
354
+ 'picker.line.placeholder': 'Type a line number and press Enter (e.g. 120)',
355
+ 'picker.line.hint': 'This file has {lines} lines',
356
+ 'picker.line.invalid': 'Enter a valid line number',
357
+
358
+ // Phase 3: arbitrary git version comparison
359
+ 'mode.commit': 'Latest commit',
360
+ 'mode.commit.hint': "Review the latest commit's diff",
361
+ 'mode.revision.pick': 'Git version…',
362
+ 'mode.revision.with': 'Git {ref}',
363
+ 'mode.revision.pick.hint': 'Pick any git version to review its diff or changes since it',
364
+ 'mode.revision.unavailable': 'Git versions unavailable',
365
+ 'picker.revisions.title': 'Git version comparison',
366
+ 'picker.revisions.placeholder': 'Search commits (sha / subject / branch) or type any revision…',
367
+ 'picker.revisions.loading': 'Loading commit history…',
368
+ 'picker.revisions.none': 'This repository has no commits yet',
369
+ 'picker.revisions.empty': 'No matching commits',
370
+ 'picker.revisions.raw': 'Use typed revision “{query}”',
371
+ 'picker.revisions.resolving': 'Resolving revision…',
372
+ 'picker.revisions.resolveFailed': 'Could not resolve that revision: {message}',
373
+ 'picker.revisions.scope.commit': "This version's diff",
374
+ 'picker.revisions.scope.since': 'Changes since this version',
375
+ 'picker.revisions.scope.commit.hint': 'Compare with the previous version (first parent)',
376
+ 'picker.revisions.scope.since.hint': 'Compare with the current worktree, including uncommitted changes',
377
+ 'picker.revisions.head': 'Current version {ref}',
378
+ 'picker.revisions.branch': 'Branch {branch}',
379
+ 'picker.revisions.branchUpstream': 'Branch {branch} · upstream {upstream}',
380
+ 'picker.revisions.detached': 'Detached HEAD',
381
+ 'picker.revisions.ahead': '{count} unpushed commits',
382
+ 'status.revision.commit': '{base} → {ref} · {count} files',
383
+ 'status.revision.since': 'Since {base} · {count} files',
384
+ 'status.revision.loading': 'Loading version comparison…',
385
+ 'status.revision.unavailable': 'Version comparison unavailable',
386
+ 'status.revision.historical': 'Historical version',
387
+ 'status.revision.worktree': 'Worktree',
388
+ 'tree.noChanges': 'No file changes',
389
+ 'error.hostOutdated': 'The plugin Host half is outdated (Git version comparison missing): restart DSH and try again',
390
+
391
+ 'status.lines': 'Ln {line}, Col {column}',
392
+ 'status.mode.turn': 'Turn #{turn} ({seq})',
393
+ 'status.mode.turn.stale': 'Turn comparison unavailable',
394
+ 'status.mode.git': 'HEAD ↔ worktree (Phase 2)',
395
+ 'status.mode.code': 'Code only (no diff)',
396
+ 'status.treeWidth': 'Tree {width}px',
397
+ 'status.fileInfo': '{lines} lines · {language}',
398
+ 'status.binary': 'Binary file; source cannot be shown',
399
+ 'status.oversized': 'File too large (>{size}); not loaded',
400
+ 'status.loadingFile': 'Reading file…',
401
+ 'status.diffLoading': 'Computing diff…',
402
+ 'status.diffOversized': 'Diff exceeds the display limit; showing source only.',
403
+
404
+ 'empty.title': 'Pick a file to review',
405
+ 'empty.body': 'The left side shows the full source; changed files render line-level inline diffs. You can also open this page from the “this turn” pill above the composer.',
406
+ 'empty.error': 'Failed to load',
407
+ 'empty.retry': 'Retry',
408
+
409
+ 'handoff.title': 'Not a code file',
410
+ 'handoff.body': 'This window only handles code in v1. {name} can open in the DSH preview or a system app — never a blank page.',
411
+
412
+ 'error.noSession': 'No session available.',
413
+ 'error.sidebarUnavailable': 'Right sidebar unavailable; degraded to the central view.',
414
+ 'error.openFailed': 'Could not open the review page: {message}',
415
+ 'error.sessionGone': 'The session is no longer live on this Host (turn data does not survive a restart).',
416
+
417
+ 'hint.turnMulti': 'This turn changed {count} files; switch them in the tree on the right.',
418
+
419
+ 'cmd.openReview': 'Open code review',
420
+ 'cmd.nextChange': 'Next change',
421
+ 'cmd.prevChange': 'Previous change',
422
+ 'cmd.nextTab': 'Next tab',
423
+ 'cmd.prevTab': 'Previous tab',
424
+ 'cmd.closeTab': 'Close tab',
425
+ 'cmd.navBack': 'Navigate back',
426
+ 'cmd.navForward': 'Navigate forward',
427
+ 'cmd.toggleTree': 'Toggle file tree',
428
+ 'cmd.refresh': 'Refresh review page',
429
+ 'cmd.copyPath': 'Copy current relative path',
430
+ 'cmd.openInPreview': 'Open current file in DSH preview',
431
+ 'cmd.outline': 'Document outline',
432
+ 'lsp.missing': 'No language server installed ({language}); install one to enable go-to-definition, references, hover and diagnostics',
433
+ 'lsp.copyInstall': 'Copy install command',
434
+ 'lsp.install': 'Install',
435
+ 'lsp.recheck': 'Detect language server again',
436
+ 'picker.definitions.title': 'Definition locations',
437
+ 'lsp.sent': 'Install request sent to the Agent — installing…',
438
+ 'lsp.toastTitle': 'No language server found ({language})',
439
+ 'lsp.toastBody': 'Install one to enable go-to-definition, references, hover and diagnostics in this page.',
440
+ 'lsp.unsupported': 'Language servers are not supported for this language ({language}). Supported: TypeScript/JavaScript, Python, JSON, Go, Rust.',
441
+ 'lsp.askAgent': 'Ask DSH Agent to install',
442
+ 'lsp.copied': 'Copied — paste it into the chat to let the Agent install it',
443
+ 'lsp.inserted': 'Inserted into the chat composer — press Enter to let the Agent install it',
444
+ 'lsp.noSymbols': 'No outline available (or the language server is unavailable)',
445
+ 'lsp.historicalCrossFile': 'Historical version: opened the target file at that version; the line number comes from the current worktree and may be off',
446
+ 'picker.locations.title': 'Reference locations',
447
+ 'picker.locations.placeholder': 'Filter locations…',
448
+ 'picker.outline.title': 'Document outline',
449
+ 'picker.outline.placeholder': 'Filter outline…',
450
+
451
+
452
+ // Git CHANGES panel
453
+ 'changes.title': 'Changes',
454
+ 'changes.mode.changes': 'Changes',
455
+ 'changes.mode.tree': 'Project',
456
+ 'changes.message': 'Commit message',
457
+ 'changes.messagePlaceholder': 'Message (⌘↩ to commit on "{branch}")',
458
+ 'changes.commit': 'Commit',
459
+ 'changes.commitPush': 'Commit & Push',
460
+ 'changes.committing': 'Committing…',
461
+ 'changes.moreCommitActions': 'More commit actions',
462
+ 'changes.staged': 'Staged Changes',
463
+ 'changes.unstaged': 'Changes',
464
+ 'changes.stage': 'Stage',
465
+ 'changes.stageFolder': 'Stage all changes in this folder',
466
+ 'changes.unstage': 'Unstage',
467
+ 'changes.unstageFolder': 'Unstage all changes in this folder',
468
+ 'changes.stageAll': 'Stage All Changes',
469
+ 'changes.unstageAll': 'Unstage All Changes',
470
+ 'changes.stagedToast': 'Staged',
471
+ 'changes.unstagedToast': 'Unstaged',
472
+ 'changes.committed': 'Committed',
473
+ 'changes.committedPushed': 'Committed and pushed',
474
+ 'changes.refresh': 'Refresh changes',
475
+ 'changes.branchUnknown': 'Unknown branch',
476
+ 'changes.sectionEmpty': 'No files',
477
+ 'changes.loading': 'Reading Git status…',
478
+ 'changes.noChanges': 'No changes',
479
+ 'changes.notGit': 'This workspace is not a Git repository',
480
+ 'changes.noGit': 'Git is not installed',
481
+ 'changes.unavailable': 'Git status unavailable',
482
+ 'changes.copied': 'Relative path copied',
483
+ 'changes.copyFailed': 'Copy failed (clipboard unavailable)',
484
+ 'changes.openDiff': 'Open Changes',
485
+ 'changes.openFile': 'Open File (no diff)',
486
+ 'changes.discard': 'Discard Changes',
487
+ 'changes.discardStaged': 'Discard staged changes (back to HEAD)',
488
+ 'changes.discardAll': 'Discard All Changes',
489
+ 'changes.discardConfirmTitle': 'Discard changes?',
490
+ 'changes.discardConfirmBody': 'This will discard changes in {count} file(s) and cannot be undone.',
491
+ 'changes.discardConfirmOk': 'Discard',
492
+ 'changes.discardCancel': 'Cancel',
493
+ 'changes.discarded': 'Changes discarded',
494
+ 'changes.error.discard-failed': 'Discard failed; check for untracked files or permissions',
495
+ 'changes.copyPath': 'Copy Relative Path',
496
+ 'changes.error.invalid-body': 'Malformed request body',
497
+ 'changes.error.invalid-coordinates': 'Missing session information',
498
+ 'changes.error.session-not-live': 'The session is no longer live on this Host',
499
+ 'changes.error.no-cwd': 'The session has no working directory',
500
+ 'changes.error.empty-selection': 'No files selected',
501
+ 'changes.error.invalid-path': 'The path is outside the workspace',
502
+ 'changes.error.invalid-message': 'Commit message must be 1–5000 characters and must not start with -',
503
+ 'changes.error.write-failed': 'Git operation failed',
504
+ 'changes.error.nothing-staged': 'Nothing is staged',
505
+ 'changes.error.identity-missing': 'Missing git identity (configure user.name / user.email)',
506
+ 'changes.error.no-git': 'Git is not installed',
507
+ 'changes.error.not-git': 'Not a Git repository',
508
+ 'changes.error.detached-head': 'Cannot push from a detached HEAD',
509
+ 'changes.error.no-upstream': 'The current branch has no upstream',
510
+ 'changes.error.push-failed': 'Push failed',
511
+ 'changes.error.generic': 'Operation failed',
512
+ 'changes.view.tree': 'View as Tree',
513
+ 'changes.view.list': 'View as List',
514
+ 'changes.aiGenerate': 'Generate commit message with AI',
515
+ 'changes.aiGenerated': 'Commit message generated',
516
+ 'changes.aiFailed': 'Could not generate a commit message',
517
+ 'changes.graph': 'Commit Graph',
518
+ 'changes.graphEmpty': 'No commits yet',
519
+ 'changes.error.llm-unavailable': 'The Host does not expose a model service',
520
+ 'changes.error.model-unavailable': 'No default model is available',
521
+ 'changes.error.no-changes': 'There is nothing to describe',
522
+ 'changes.error.generate-failed': 'Could not generate a commit message',
523
+ 'changes.error.diff-failed': 'Could not read the diff',
524
+ 'changes.error.log-failed': 'Could not read the commit history',
525
+ 'changes.tag.staged': 'Staged',
526
+ 'changes.tag.unstaged': 'Unstaged',
527
+ 'diff.layout': 'Diff layout',
528
+ 'diff.inline': 'Inline',
529
+ 'diff.side': 'Side by Side',
530
+ 'diff.auto': 'Automatic',
531
+ 'commands.switchGit': 'Switch to uncommitted changes',
532
+ 'commands.switchTurn': "Switch to this turn's changes",
533
+ 'commands.switchHead': 'Review the latest commit',
534
+ 'commands.switchRevision': 'Select a git version…',
535
+ 'commands.switchCode': 'Code only (no diff)',
536
+ 'blame.justNow': 'just now',
537
+ 'blame.minutesAgo': '{count} min ago',
538
+ 'blame.hoursAgo': '{count} h ago',
539
+ 'blame.daysAgo': '{count} d ago',
540
+ 'blame.uncommitted': 'uncommitted',
541
+ 'blame.copySha': 'Copy SHA',
542
+ 'blame.copyFailed': 'Copy failed',
543
+ 'blame.copied': 'Copied',
544
+ 'common.close': 'Close',
545
+ 'common.copied': 'Copied',
546
+ 'common.loading': 'Loading',
547
+ }
548
+