@deepseek-ai/dsh-experimental-client-ui-forge 0.0.0-stage → 0.2.2-alpha.3
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/LICENSE +21 -0
- package/README.i18n.yaml +37 -0
- package/README.md +142 -2
- package/README.zh.md +143 -0
- package/lib/client.js +11802 -0
- package/lib/index.js +3238 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +2502 -0
- package/lib/typert.remote-client.d.ts +85 -0
- package/lib/typert.remote-client.js +1538 -0
- package/lib/types/client/ActionToast.d.ts +14 -0
- package/lib/types/client/ChangeRequestCard.d.ts +56 -0
- package/lib/types/client/ChangedFiles.d.ts +36 -0
- package/lib/types/client/ChangesTab.d.ts +59 -0
- package/lib/types/client/ChangesTabTitle.d.ts +13 -0
- package/lib/types/client/DiffFile.d.ts +76 -0
- package/lib/types/client/FileLabel.d.ts +20 -0
- package/lib/types/client/FileTreePane.d.ts +15 -0
- package/lib/types/client/ForgeTab.d.ts +57 -0
- package/lib/types/client/ForgeTabTitle.d.ts +11 -0
- package/lib/types/client/HeaderButton.d.ts +27 -0
- package/lib/types/client/LocalChangesCard.d.ts +29 -0
- package/lib/types/client/RefreshGlyph.d.ts +18 -0
- package/lib/types/client/ReviewComposer.d.ts +40 -0
- package/lib/types/client/ReviewThread.d.ts +26 -0
- package/lib/types/client/SessionHoverForge.d.ts +20 -0
- package/lib/types/client/SessionRowForge.d.ts +39 -0
- package/lib/types/client/SubmitReview.d.ts +22 -0
- package/lib/types/client/WorktreeProgress.d.ts +44 -0
- package/lib/types/client/WorktreeToggle.d.ts +43 -0
- package/lib/types/client/changes-address.d.ts +70 -0
- package/lib/types/client/changes-store.d.ts +39 -0
- package/lib/types/client/checkout.d.ts +34 -0
- package/lib/types/client/code-selection.d.ts +23 -0
- package/lib/types/client/diff-rows.d.ts +96 -0
- package/lib/types/client/file-tree.d.ts +33 -0
- package/lib/types/client/format.d.ts +21 -0
- package/lib/types/client/glyphs.d.ts +33 -0
- package/lib/types/client/index.d.ts +25 -0
- package/lib/types/client/locales.d.ts +282 -0
- package/lib/types/client/mount.d.ts +17 -0
- package/lib/types/client/review-queue.d.ts +136 -0
- package/lib/types/client/review.d.ts +56 -0
- package/lib/types/client/session-list.d.ts +46 -0
- package/lib/types/client/source.d.ts +146 -0
- package/lib/types/client/status.d.ts +99 -0
- package/lib/types/diff.d.ts +32 -0
- package/lib/types/git.d.ts +93 -0
- package/lib/types/index.d.ts +296 -0
- package/lib/types/local-diff.d.ts +100 -0
- package/lib/types/panel.d.ts +135 -0
- package/lib/types/parse.d.ts +57 -0
- package/lib/types/patch-cache.d.ts +33 -0
- package/lib/types/states.d.ts +95 -0
- package/lib/types/types.d.ts +399 -0
- package/lib/types/worktree.d.ts +225 -0
- package/locale/de.json +6 -0
- package/locale/en.json +6 -0
- package/locale/es.json +6 -0
- package/locale/fr.json +6 -0
- package/locale/ja.json +6 -0
- package/locale/pt.json +6 -0
- package/locale/ru.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +123 -3
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/** Forge panel copy owned by the locale dictionaries. */
|
|
2
|
+
/** Locale namespace of the forge panel. */
|
|
3
|
+
export declare const NS = "forgePanel";
|
|
4
|
+
/** Chinese copy; its keys define {@link ForgePanelKey}. */
|
|
5
|
+
export declare const zh: {
|
|
6
|
+
readonly 'review.startReview': "开始评审";
|
|
7
|
+
readonly 'review.githubActions': "GitHub 评论选项";
|
|
8
|
+
readonly 'review.publishing': "发布中…";
|
|
9
|
+
readonly 'review.submitting': "提交中…";
|
|
10
|
+
readonly 'review.close': "关闭";
|
|
11
|
+
readonly 'review.pending': "待提交";
|
|
12
|
+
readonly 'review.quoted': "已添加到输入框";
|
|
13
|
+
readonly 'review.yourComment': "你的评论";
|
|
14
|
+
readonly 'review.outdated': "代码已更新";
|
|
15
|
+
readonly 'review.done': "完成";
|
|
16
|
+
readonly 'review.addComment': "添加评论";
|
|
17
|
+
readonly 'diff.resizeFileTree': "调整文件树宽度";
|
|
18
|
+
readonly 'diff.fileTree': "文件树";
|
|
19
|
+
readonly 'diff.showFileTreeLeft': "在左侧显示文件树";
|
|
20
|
+
readonly 'diff.moveFileTreeRight': "将文件树移到右侧";
|
|
21
|
+
readonly 'guide.title': "代码审查和变更";
|
|
22
|
+
readonly 'guide.description': "查看代码变更与本会话的变更请求";
|
|
23
|
+
readonly 'diff.hideFileTree': "隐藏文件树";
|
|
24
|
+
readonly 'review.range': "评论 {range}";
|
|
25
|
+
readonly 'review.comment': "留下评论…";
|
|
26
|
+
readonly 'review.cancel': "取消";
|
|
27
|
+
readonly 'review.addToInput': "添加到输入框";
|
|
28
|
+
readonly 'review.publish': "发布单条评论";
|
|
29
|
+
readonly 'review.queue': "加入评审";
|
|
30
|
+
readonly 'review.selectLine': "选择第 {line} 行";
|
|
31
|
+
readonly 'review.inputFailed': "输入框暂时无法添加引用,请稍后重试";
|
|
32
|
+
readonly 'review.saveFailed': "无法保存评审草稿,请检查浏览器存储后重试";
|
|
33
|
+
readonly 'review.unknown': "无法确认提交结果。请先在 GitHub 核对,避免重复发布";
|
|
34
|
+
readonly 'review.submit': "提交评审";
|
|
35
|
+
readonly 'review.summary': "评审总结…";
|
|
36
|
+
readonly 'review.approve': "批准";
|
|
37
|
+
readonly 'review.requestChanges': "请求更改";
|
|
38
|
+
readonly 'review.summaryRequired': "请求更改时,请填写评审总结";
|
|
39
|
+
readonly 'review.commentOnly': "评论";
|
|
40
|
+
readonly 'review.drafts': "待提交评论({count})";
|
|
41
|
+
readonly 'review.edit': "编辑";
|
|
42
|
+
readonly 'review.remove': "删除";
|
|
43
|
+
readonly 'review.stale': "PR 已有新提交,请刷新并重新选择评论行";
|
|
44
|
+
readonly 'review.published': "已发布到 GitHub";
|
|
45
|
+
readonly 'review.submitted': "已提交评审";
|
|
46
|
+
readonly 'review.failed': "提交失败:{message}";
|
|
47
|
+
readonly 'review.unsupported': "此代码托管服务不支持提交评审";
|
|
48
|
+
readonly 'review.loadFailed': "无法读取评审草稿,请检查浏览器存储";
|
|
49
|
+
readonly 'review.recheck': "在 GitHub 查看";
|
|
50
|
+
readonly 'review.confirmRetry': "已核对,允许重新提交";
|
|
51
|
+
readonly 'tab.title': "变更请求";
|
|
52
|
+
readonly 'header.label': "本会话的变更请求";
|
|
53
|
+
readonly 'header.attention': "本会话的变更请求需要处理";
|
|
54
|
+
readonly 'checkout.worktree': "工作树";
|
|
55
|
+
readonly 'checkout.worktreeFrom': "工作树 · 基于 {base}";
|
|
56
|
+
readonly 'checkout.project': "项目目录";
|
|
57
|
+
readonly 'checkout.detached': "未在分支上";
|
|
58
|
+
readonly 'checkout.restore': "恢复";
|
|
59
|
+
readonly 'checkout.copyWorktreePath': "复制工作树路径";
|
|
60
|
+
readonly 'checkout.copyProjectPath': "复制项目目录路径";
|
|
61
|
+
readonly 'checkout.none': "当前目录不是 Git 仓库";
|
|
62
|
+
readonly 'checkout.failed': "无法读取 Git 信息";
|
|
63
|
+
readonly 'changes.title': "本会话的变更请求 · {count}";
|
|
64
|
+
readonly 'changes.empty': "本会话还没有变更请求";
|
|
65
|
+
readonly 'changes.emptyHint': "本会话关联的变更请求(创建、查看、编辑或检出的,以及所在分支或推送分支上的)会显示在这里";
|
|
66
|
+
readonly 'changes.local.title': "本地变更";
|
|
67
|
+
readonly 'changes.local.refs': "{head} → {base}";
|
|
68
|
+
readonly 'changes.local.files': "{count} 个文件";
|
|
69
|
+
readonly 'changes.local.viewAria': "查看本会话的变更:{count} 个文件,新增 {added} 行,删除 {deleted} 行";
|
|
70
|
+
readonly 'changes.local.create': "创建变更请求";
|
|
71
|
+
readonly 'changes.local.prompt': "为本会话的变更创建变更请求";
|
|
72
|
+
readonly 'signin.title': "登录 {host} 后才能显示变更请求状态";
|
|
73
|
+
readonly 'signin.copy': "复制登录命令";
|
|
74
|
+
readonly 'signin.unavailable': "无法读取 {host} 上的变更请求:{message}";
|
|
75
|
+
readonly refresh: "刷新状态";
|
|
76
|
+
readonly retry: "重试";
|
|
77
|
+
readonly 'stream.failed': "无法加载变更请求面板";
|
|
78
|
+
readonly 'change.number': "#{number}";
|
|
79
|
+
readonly 'change.stateAria': "变更请求状态:{state}";
|
|
80
|
+
readonly 'change.state.open': "打开";
|
|
81
|
+
readonly 'change.state.blocked': "需要处理";
|
|
82
|
+
readonly 'change.state.draft': "草稿";
|
|
83
|
+
readonly 'change.state.merged': "已合并";
|
|
84
|
+
readonly 'change.state.closed': "已关闭";
|
|
85
|
+
readonly 'change.state.unknown': "未知";
|
|
86
|
+
readonly 'list.worktree': "在自己的工作树中";
|
|
87
|
+
readonly 'list.stateChecks': "{state} · {checks}";
|
|
88
|
+
readonly 'list.more': "还有 {count} 个变更请求";
|
|
89
|
+
readonly 'change.expand': "展开 {name}";
|
|
90
|
+
readonly 'change.collapse': "收起 {name}";
|
|
91
|
+
readonly 'change.ci.none': "没有检查";
|
|
92
|
+
readonly 'change.ci.running': "检查中";
|
|
93
|
+
readonly 'change.ci.passed': "检查通过";
|
|
94
|
+
readonly 'change.ci.failed': "{count} 项检查失败";
|
|
95
|
+
readonly 'change.ci.cancelled': "已取消 {count} 项检查";
|
|
96
|
+
readonly 'change.ci.failedUnlisted': "检查失败";
|
|
97
|
+
readonly 'change.checks.failed': "{count} 项失败";
|
|
98
|
+
readonly 'change.checks.running': "{count} 项进行中";
|
|
99
|
+
readonly 'change.checks.passed': "{count} 项通过";
|
|
100
|
+
readonly 'change.checks.cancelled': "{count} 项已取消";
|
|
101
|
+
readonly 'change.checks.other': "其他 {count} 项";
|
|
102
|
+
readonly 'change.checks.truncated': "已加载 {count} 项检查,仍有更多";
|
|
103
|
+
readonly 'change.checks.loading': "正在加载更多检查";
|
|
104
|
+
readonly 'change.checks.loadFailed': "更多检查加载失败:{message}";
|
|
105
|
+
readonly 'change.checks.retry': "重试加载检查";
|
|
106
|
+
readonly 'change.check.running': "进行中";
|
|
107
|
+
readonly 'change.check.queued': "排队中";
|
|
108
|
+
readonly 'change.flag.changesRequested': "要求修改";
|
|
109
|
+
readonly 'change.flag.conflicting': "有冲突";
|
|
110
|
+
readonly 'change.flag.draft': "草稿";
|
|
111
|
+
readonly 'change.failure.unavailable': "无法读取变更请求状态";
|
|
112
|
+
readonly 'change.failure.notFound': "变更请求不存在或没有访问权限";
|
|
113
|
+
readonly 'change.failure.unauthenticated': "登录后才能读取状态";
|
|
114
|
+
readonly 'change.unserved': "暂不支持读取该平台的变更请求状态";
|
|
115
|
+
readonly 'change.view': "在浏览器中打开";
|
|
116
|
+
readonly 'change.copy': "复制变更请求链接";
|
|
117
|
+
readonly 'change.viewChangesAria': "查看 {name} 的变更:新增 {added} 行,删除 {deleted} 行";
|
|
118
|
+
readonly 'change.remove': "从本会话移除";
|
|
119
|
+
readonly 'change.removeAria': "从本会话移除 {name}";
|
|
120
|
+
readonly 'change.row.checks': "检查";
|
|
121
|
+
readonly 'change.row.review': "评审";
|
|
122
|
+
readonly 'change.row.merge': "合并";
|
|
123
|
+
readonly 'change.row.changes': "变更";
|
|
124
|
+
readonly 'change.review.approved': "已批准";
|
|
125
|
+
readonly 'change.review.changesRequested': "要求修改";
|
|
126
|
+
readonly 'change.review.required': "等待评审";
|
|
127
|
+
readonly 'change.review.none': "尚未请求评审";
|
|
128
|
+
readonly 'change.review.threads': "{review} · {count} 条未解决讨论";
|
|
129
|
+
readonly 'change.merge.mergeable': "无冲突";
|
|
130
|
+
readonly 'change.merge.conflicting': "与 {base} 有冲突";
|
|
131
|
+
readonly 'change.merge.unknown': "正在检查冲突";
|
|
132
|
+
readonly 'change.mergedTo': "已合并到 {base}";
|
|
133
|
+
readonly 'change.markReady': "标记为可评审";
|
|
134
|
+
readonly 'change.merge': "合并";
|
|
135
|
+
readonly 'change.mergeTitle': "将 {name} 合并到 {base}";
|
|
136
|
+
readonly 'change.mergeMethod.squash': "压缩合并";
|
|
137
|
+
readonly 'change.mergeMethod.merge': "创建合并提交";
|
|
138
|
+
readonly 'change.mergeMethod.rebase': "变基合并";
|
|
139
|
+
readonly 'change.mergeNote.squash': "把全部提交压缩成一个提交";
|
|
140
|
+
readonly 'change.mergeNote.merge': "保留全部提交,并新增一个合并提交";
|
|
141
|
+
readonly 'change.mergeNote.rebase': "把提交逐个变基到 {base}";
|
|
142
|
+
readonly 'change.mergeConfirm': "确认合并";
|
|
143
|
+
readonly 'change.mergeChanged': "提交已更新,请重新检查后再打开合并菜单";
|
|
144
|
+
readonly 'diff.tab': "变更";
|
|
145
|
+
readonly 'diff.tabNumbered': "#{number} 的变更";
|
|
146
|
+
readonly 'diff.scope.branch': "分支";
|
|
147
|
+
readonly 'diff.scope.uncommitted': "未提交";
|
|
148
|
+
readonly 'diff.scope.unstaged': "未暂存";
|
|
149
|
+
readonly 'diff.scope.staged': "已暂存";
|
|
150
|
+
readonly 'diff.scopeNote.branch': "与 {base} 比较,包含未提交的修改";
|
|
151
|
+
readonly 'diff.scopeNote.uncommitted': "与 HEAD 比较,包含未跟踪的文件";
|
|
152
|
+
readonly 'diff.scopeNote.unstaged': "与暂存区比较,包含未跟踪的文件";
|
|
153
|
+
readonly 'diff.scopeNote.staged': "暂存区与 HEAD 比较";
|
|
154
|
+
readonly 'diff.allFiles': "全部 {count} 个文件";
|
|
155
|
+
readonly 'diff.filterFiles': "筛选文件…";
|
|
156
|
+
readonly 'diff.noMatchingFiles': "没有匹配的文件";
|
|
157
|
+
readonly 'diff.refresh': "刷新变更";
|
|
158
|
+
readonly 'diff.expandAll': "全部展开";
|
|
159
|
+
readonly 'diff.collapseAll': "全部折叠";
|
|
160
|
+
readonly 'diff.split': "切换为左右对比";
|
|
161
|
+
readonly 'diff.unified': "切换为单栏对比";
|
|
162
|
+
readonly 'diff.splitAria': "左右对比";
|
|
163
|
+
readonly 'diff.wrap': "开启自动换行";
|
|
164
|
+
readonly 'diff.nowrap': "关闭自动换行";
|
|
165
|
+
readonly 'diff.wrapAria': "自动换行";
|
|
166
|
+
readonly 'diff.unchanged': "{count} 行未变更";
|
|
167
|
+
readonly 'diff.unchangedRest': "其余未变更的行";
|
|
168
|
+
readonly 'diff.newFile': "新文件";
|
|
169
|
+
readonly 'diff.deletedFile': "已删除";
|
|
170
|
+
readonly 'diff.renamed': "由 {from} 重命名";
|
|
171
|
+
readonly 'diff.renamedPath': "{from} → {path}";
|
|
172
|
+
readonly 'diff.badgeUncommitted': "未提交";
|
|
173
|
+
readonly 'diff.binary': "二进制文件,无法显示变更";
|
|
174
|
+
readonly 'diff.binaryLabel': "二进制";
|
|
175
|
+
readonly 'diff.largeCollapsed': "文件较大,{count} 行变更已收起";
|
|
176
|
+
readonly 'diff.fileTooLarge': "文件太大,无法显示变更";
|
|
177
|
+
readonly 'diff.error': "无法读取变更";
|
|
178
|
+
readonly 'diff.tooLarge': "变更太大,无法在这里显示";
|
|
179
|
+
readonly 'diff.filterConfigFailed': "无法完整读取 Git 过滤器配置,尚未执行比较。请检查 Git 配置和读取上限后重试";
|
|
180
|
+
readonly 'diff.viewInBrowser': "在浏览器中查看";
|
|
181
|
+
readonly 'diff.noForkPoint': "找不到本分支的分叉点,请选择其他范围";
|
|
182
|
+
readonly 'diff.empty': "没有变更";
|
|
183
|
+
readonly 'diff.omitted': "另有 {count} 个未跟踪的文件没有列出";
|
|
184
|
+
readonly 'diff.stale': "本地有 {count} 个提交尚未推送,这里显示的是变更请求上的变更";
|
|
185
|
+
readonly 'diff.moreActions': "{name} 的更多操作";
|
|
186
|
+
readonly 'diff.copyPath': "复制路径";
|
|
187
|
+
readonly 'diff.openFileInBrowser': "在浏览器中查看文件";
|
|
188
|
+
readonly 'diff.openFileInSidebar': "在侧边栏打开整个文件";
|
|
189
|
+
readonly 'time.now': "刚刚";
|
|
190
|
+
readonly 'time.minutes': "{n} 分钟前";
|
|
191
|
+
readonly 'time.hours': "{n} 小时前";
|
|
192
|
+
readonly 'time.days': "{n} 天前";
|
|
193
|
+
readonly 'time.months': "{n} 个月前";
|
|
194
|
+
readonly 'time.years': "{n} 年前";
|
|
195
|
+
readonly 'time.finished': "{state} · {time}";
|
|
196
|
+
readonly 'duration.seconds': "{seconds} 秒";
|
|
197
|
+
readonly 'duration.minutes': "{minutes} 分 {seconds} 秒";
|
|
198
|
+
readonly 'duration.hours': "{hours} 小时 {minutes} 分";
|
|
199
|
+
readonly 'worktree.label': "新建工作树";
|
|
200
|
+
readonly 'worktree.hint': "在独立的工作树中运行本会话:发送后基于所选分支新建分支,修改和提交不影响项目目录";
|
|
201
|
+
readonly 'worktree.blocked.outside-writable-root': "这个工作区的 Git 数据不在可写目录中(例如工作区本身就是工作树),暂不支持使用工作树";
|
|
202
|
+
readonly 'worktree.blocked.read-only': "只读模式下无法使用工作树";
|
|
203
|
+
readonly 'worktree.base': "基于 {branch}";
|
|
204
|
+
readonly 'worktree.baseHead': "基于当前 HEAD";
|
|
205
|
+
readonly 'worktree.baseMenu': "选择基准分支";
|
|
206
|
+
readonly 'worktree.currentBranch': "当前分支";
|
|
207
|
+
readonly 'worktree.currentBranchTip': "当前分支:{branch}";
|
|
208
|
+
readonly 'worktree.detachedTip': "未在分支上 · {commit}";
|
|
209
|
+
readonly 'creation.title': "正在创建工作树";
|
|
210
|
+
readonly 'creation.failed': "创建工作树失败";
|
|
211
|
+
readonly 'creation.prepare': "创建分支";
|
|
212
|
+
readonly 'creation.checkout': "检出文件";
|
|
213
|
+
readonly 'creation.details': "更多详情";
|
|
214
|
+
readonly 'creation.branch': "分支";
|
|
215
|
+
readonly 'creation.base': "基于";
|
|
216
|
+
readonly 'creation.head': "当前 HEAD";
|
|
217
|
+
readonly 'creation.error': "原因";
|
|
218
|
+
readonly 'creation.skip': "不使用工作树";
|
|
219
|
+
readonly 'creation.cancel': "取消";
|
|
220
|
+
readonly 'creation.stopped': "已停止创建工作树";
|
|
221
|
+
readonly 'creation.retry': "重试";
|
|
222
|
+
readonly 'creation.waiting': "消息会在工作树建好后发送";
|
|
223
|
+
readonly 'missing.title': "工作树不可用";
|
|
224
|
+
readonly 'missing.unknown': "工作树恢复尚未完成,暂时无法确认分支 {branch} 的状态。请排除恢复错误后重试,或在项目目录继续";
|
|
225
|
+
readonly 'missing.kept': "可以在原位置恢复分支 {branch} 的工作树。删除前未提交的修改无法恢复";
|
|
226
|
+
readonly 'missing.recreated': "分支 {branch} 也已删除。恢复时会从创建时的提交重建分支,之后的提交和未提交的修改无法恢复";
|
|
227
|
+
readonly 'missing.restore': "恢复工作树";
|
|
228
|
+
readonly 'missing.leave': "在项目目录继续";
|
|
229
|
+
readonly 'missing.waiting': "恢复工作树或在项目目录继续后,消息会接着发送";
|
|
230
|
+
readonly 'restoration.title': "正在恢复工作树";
|
|
231
|
+
readonly 'restoration.prepare': "准备工作树";
|
|
232
|
+
readonly 'branch.worktree': "工作树(基于 {base}):{path}";
|
|
233
|
+
readonly 'branch.linked': "工作树:{path}";
|
|
234
|
+
readonly 'branch.project': "项目目录:{path}";
|
|
235
|
+
readonly 'branch.missing': "工作树不可用:{path}";
|
|
236
|
+
readonly 'toast.removed': "已从本会话移除 {name}";
|
|
237
|
+
readonly 'toast.undo': "撤销";
|
|
238
|
+
readonly 'toast.undoFailed': "撤销失败";
|
|
239
|
+
readonly 'toast.removeFailed': "移除失败";
|
|
240
|
+
readonly 'toast.refreshFailed': "刷新失败";
|
|
241
|
+
readonly 'toast.copied': "已复制链接";
|
|
242
|
+
readonly 'toast.copyFailed': "复制失败";
|
|
243
|
+
readonly 'toast.branchesFailed': "无法读取分支";
|
|
244
|
+
readonly 'toast.worktreeFailed': "无法更改工作树选项";
|
|
245
|
+
readonly 'toast.worktreeStarted': "会话已开始,无法再改用工作树";
|
|
246
|
+
readonly 'toast.restored': "工作树已恢复";
|
|
247
|
+
readonly 'toast.restoreFailed': "无法恢复工作树:{message}";
|
|
248
|
+
readonly 'toast.leaveFailed': "无法切换到项目目录,请稍后重试";
|
|
249
|
+
readonly 'toast.markedReady': "已将 {name} 标记为可评审";
|
|
250
|
+
readonly 'toast.markReadyFailed': "标记失败:{message}";
|
|
251
|
+
readonly 'toast.merged': "已合并 {name}";
|
|
252
|
+
readonly 'toast.mergeFailed': "合并失败:{message}";
|
|
253
|
+
readonly 'toast.mergeStale': "{name} 有新的提交,确认后再合并";
|
|
254
|
+
readonly 'toast.pathCopied': "已复制路径";
|
|
255
|
+
readonly 'toast.expandFailed': "无法显示未变更的行:{message}";
|
|
256
|
+
readonly 'toast.expandStale': "文件在读取变更后又有修改,刷新后再展开";
|
|
257
|
+
readonly 'toast.prompted': "已发送:{text}";
|
|
258
|
+
readonly 'toast.promptFailed': "无法发送消息";
|
|
259
|
+
};
|
|
260
|
+
/** Key of the forge panel dictionaries. */
|
|
261
|
+
export type ForgePanelKey = keyof typeof zh;
|
|
262
|
+
/** English copy with the same keys. */
|
|
263
|
+
export declare const en: Record<ForgePanelKey, string>;
|
|
264
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
265
|
+
interface LocaleNamespaceMap {
|
|
266
|
+
/** Forge panel tab, changes view, header button, worktree option and creation card, and action notices. */
|
|
267
|
+
forgePanel: ForgePanelKey;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/** Japanese copy with the same keys. */
|
|
271
|
+
export declare const ja: Record<ForgePanelKey, string>;
|
|
272
|
+
/** Spanish copy with the same keys. */
|
|
273
|
+
export declare const es: Record<ForgePanelKey, string>;
|
|
274
|
+
/** French copy with the same keys. */
|
|
275
|
+
export declare const fr: Record<ForgePanelKey, string>;
|
|
276
|
+
/** German copy with the same keys. */
|
|
277
|
+
export declare const de: Record<ForgePanelKey, string>;
|
|
278
|
+
/** Russian copy with the same keys. */
|
|
279
|
+
export declare const ru: Record<ForgePanelKey, string>;
|
|
280
|
+
/** Portuguese copy with the same keys. */
|
|
281
|
+
export declare const pt: Record<ForgePanelKey, string>;
|
|
282
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Remote contribution and slot registrations of the forge panel. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol';
|
|
4
|
+
/** Services required before the Remote contribution mounts. */
|
|
5
|
+
export declare const inject: string[];
|
|
6
|
+
/** Registry id of the forge tab type, also its slot key. */
|
|
7
|
+
export declare const TAB_ID = "@deepseek-ai/dsh-experimental-client-ui-forge";
|
|
8
|
+
/** Kind of the forge tab. */
|
|
9
|
+
export declare const TAB_KIND = "forge-panel";
|
|
10
|
+
/**
|
|
11
|
+
* Mount the forge panel Remote, then the UI that calls it; the UI is withdrawn before the Remote.
|
|
12
|
+
* @param ctx - client plugin lifetime.
|
|
13
|
+
* @param contribution - generated forge panel Remote definitions.
|
|
14
|
+
* @returns the disposer that removes both contributions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mountForgePanel(ctx: Context, contribution: TypertRemoteContribution): Promise<() => Promise<void>>;
|
|
17
|
+
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/** Browser-persisted review drafts and the write whose outcome still needs confirmation. */
|
|
2
|
+
import type { ForgeReviewRequest } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
3
|
+
import type { ReviewSelection, ReviewSource } from './review.ts';
|
|
4
|
+
/** A comment retained after adding its reference or receiving a publication receipt. */
|
|
5
|
+
export type ReviewRecord = {
|
|
6
|
+
readonly kind: 'agent';
|
|
7
|
+
readonly selection: ReviewSelection;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'published';
|
|
10
|
+
readonly selection: ReviewSelection;
|
|
11
|
+
readonly url: string;
|
|
12
|
+
};
|
|
13
|
+
/** One inline record; its numeric key belongs only to the retained browser store. */
|
|
14
|
+
export type ReviewThread = {
|
|
15
|
+
readonly key: number;
|
|
16
|
+
} & (ReviewRecord | {
|
|
17
|
+
readonly kind: 'pending';
|
|
18
|
+
readonly selection: ReviewSelection;
|
|
19
|
+
});
|
|
20
|
+
/** File-scoped snapshot that does not change while unrelated comments or the summary are edited. */
|
|
21
|
+
export interface FileReviewState {
|
|
22
|
+
readonly threads: readonly ReviewThread[];
|
|
23
|
+
readonly locked: boolean;
|
|
24
|
+
readonly error: ReviewQueueState['error'];
|
|
25
|
+
}
|
|
26
|
+
/** Stable snapshot for a file without a comment store. */
|
|
27
|
+
export declare const EMPTY_FILE_REVIEW: FileReviewState;
|
|
28
|
+
/** Immutable queue snapshot; errors leave the original stored bytes untouched. */
|
|
29
|
+
export interface ReviewQueueState {
|
|
30
|
+
readonly comments: readonly ReviewSelection[];
|
|
31
|
+
readonly records: readonly ReviewRecord[];
|
|
32
|
+
readonly body: string;
|
|
33
|
+
readonly event: 'comment' | 'approve' | 'request-changes';
|
|
34
|
+
readonly uncertain: ForgeReviewRequest | null;
|
|
35
|
+
readonly error: 'load' | 'save' | null;
|
|
36
|
+
}
|
|
37
|
+
/** Initial state of a newly opened review tab. */
|
|
38
|
+
export declare const EMPTY_REVIEW: ReviewQueueState;
|
|
39
|
+
/** One review tab's drafts and records, retained until its occurrence closes. */
|
|
40
|
+
export declare class ReviewQueue {
|
|
41
|
+
private readonly key;
|
|
42
|
+
private closed;
|
|
43
|
+
private state;
|
|
44
|
+
private readonly listeners;
|
|
45
|
+
private readonly keys;
|
|
46
|
+
private nextKey;
|
|
47
|
+
private readonly files;
|
|
48
|
+
/** @param key - browser storage key including Session and tab identity. */
|
|
49
|
+
constructor(key: string);
|
|
50
|
+
/** Current queue snapshot, stable between edits and storage failures. */
|
|
51
|
+
readonly getSnapshot: () => ReviewQueueState;
|
|
52
|
+
/**
|
|
53
|
+
* Clear this tab's records and refuse later completions from its outgoing requests.
|
|
54
|
+
* @returns whether its browser storage was cleared; the in-memory state always closes.
|
|
55
|
+
*/
|
|
56
|
+
close(): boolean;
|
|
57
|
+
/** Summary subscribed by the surrounding diff; editing draft text does not invalidate its file rows. */
|
|
58
|
+
readonly getStatus: () => string;
|
|
59
|
+
/**
|
|
60
|
+
* Read stable inline records for one path and review source.
|
|
61
|
+
* @param path - repository-relative file path.
|
|
62
|
+
* @param source - PR or local scope; older head commits remain available as outdated comments.
|
|
63
|
+
* @returns records and edit availability, reusing the snapshot when these values are unchanged.
|
|
64
|
+
*/
|
|
65
|
+
fileComments(path: string, source: ReviewSource): FileReviewState;
|
|
66
|
+
/**
|
|
67
|
+
* Retain an Agent reference at its original code location.
|
|
68
|
+
* @param selection - reference already accepted by the main composer.
|
|
69
|
+
* @returns whether the record was saved.
|
|
70
|
+
*/
|
|
71
|
+
recordAgent(selection: ReviewSelection): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Retain a published comment and settle its outgoing write atomically in browser storage.
|
|
74
|
+
* @param selection - published comment's frozen code location.
|
|
75
|
+
* @param url - confirmed publication URL.
|
|
76
|
+
* @returns whether the receipt and comment were saved.
|
|
77
|
+
*/
|
|
78
|
+
published(selection: ReviewSelection, url: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Observe queue edits and storage failures.
|
|
81
|
+
* @param listener - snapshot invalidation.
|
|
82
|
+
* @returns unsubscribe.
|
|
83
|
+
*/
|
|
84
|
+
readonly subscribe: (listener: () => void) => (() => void);
|
|
85
|
+
/**
|
|
86
|
+
* Save a frozen PR comment unless a write needs reconciliation.
|
|
87
|
+
* @param selection - frozen PR comment.
|
|
88
|
+
* @returns whether it was saved.
|
|
89
|
+
*/
|
|
90
|
+
add(selection: ReviewSelection): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Edit or remove a pending comment without changing its captured lines.
|
|
93
|
+
* @param index - comment position.
|
|
94
|
+
* @param body - replacement text, or null to remove.
|
|
95
|
+
* @returns whether saved.
|
|
96
|
+
*/
|
|
97
|
+
edit(index: number, body: string | null): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Edit the currently pending occurrence addressed by an inline record.
|
|
100
|
+
* @param key - browser-store identity from fileComments.
|
|
101
|
+
* @param body - replacement text, or null to remove.
|
|
102
|
+
* @returns whether the occurrence still exists and the edit was saved.
|
|
103
|
+
*/
|
|
104
|
+
editThread(key: number, body: string | null): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Save the summary and decision for the pending review.
|
|
107
|
+
* @param body - review summary.
|
|
108
|
+
* @param event - review decision.
|
|
109
|
+
* @returns whether saved.
|
|
110
|
+
*/
|
|
111
|
+
summarize(body: string, event: ReviewQueueState['event']): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Persist the outgoing request before network dispatch.
|
|
114
|
+
* @param request - exact write.
|
|
115
|
+
* @returns whether dispatch may start.
|
|
116
|
+
*/
|
|
117
|
+
begin(request: ForgeReviewRequest): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Clear the write after a known result or explicit reconciliation.
|
|
120
|
+
* @param submitted - whether a batch review was published.
|
|
121
|
+
* @param url - confirmed publication URL when retaining submitted comments.
|
|
122
|
+
* @returns whether saved.
|
|
123
|
+
*/
|
|
124
|
+
finish(submitted: boolean, url?: string): boolean;
|
|
125
|
+
private keyOf;
|
|
126
|
+
private save;
|
|
127
|
+
private emit;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Compare review identity while allowing records from an older PR head to remain visible.
|
|
131
|
+
* @param left - recorded source.
|
|
132
|
+
* @param right - displayed source.
|
|
133
|
+
* @returns whether the sources name the same PR or local scope.
|
|
134
|
+
*/
|
|
135
|
+
export declare function sameReviewSource(left: ReviewSource, right: ReviewSource): boolean;
|
|
136
|
+
//# sourceMappingURL=review-queue.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Frozen line selections shared by the diff UI, composer references, and review submission. */
|
|
2
|
+
import type { ForgeDiffFile } from '../types.ts';
|
|
3
|
+
/** A comment on consecutive lines of one side of one displayed hunk. */
|
|
4
|
+
export interface ReviewComment {
|
|
5
|
+
/** Repository-relative destination path, including for renamed files. */
|
|
6
|
+
readonly path: string;
|
|
7
|
+
/** Old or new side of the displayed diff. */
|
|
8
|
+
readonly side: 'L' | 'R';
|
|
9
|
+
/** First selected line, inclusive. */
|
|
10
|
+
readonly startLine: number;
|
|
11
|
+
/** Last selected line, inclusive. */
|
|
12
|
+
readonly endLine: number;
|
|
13
|
+
/** Complete displayed hunk captured before subsequent file changes. */
|
|
14
|
+
readonly hunk: string;
|
|
15
|
+
/** User's plain-text comment. */
|
|
16
|
+
readonly body: string;
|
|
17
|
+
}
|
|
18
|
+
/** The immutable source from which a comment was selected. */
|
|
19
|
+
export type ReviewSource = {
|
|
20
|
+
readonly kind: 'local';
|
|
21
|
+
readonly scope: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'change';
|
|
24
|
+
readonly url: string;
|
|
25
|
+
readonly headSha: string;
|
|
26
|
+
};
|
|
27
|
+
/** One selected range and the source the user saw. */
|
|
28
|
+
export interface ReviewSelection {
|
|
29
|
+
readonly source: ReviewSource;
|
|
30
|
+
readonly comment: ReviewComment;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Capture a range only when both endpoints belong to the same displayed hunk.
|
|
34
|
+
* @param file - loaded diff file.
|
|
35
|
+
* @param side - selected side.
|
|
36
|
+
* @param from - first gesture endpoint.
|
|
37
|
+
* @param to - current gesture endpoint.
|
|
38
|
+
* @returns a frozen selection, or undefined for unchanged gaps or cross-hunk ranges.
|
|
39
|
+
*/
|
|
40
|
+
export declare function selectReviewLines(file: ForgeDiffFile, side: 'L' | 'R', from: number, to: number): ReviewComment | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Format a frozen reference for the ordinary, logged user message.
|
|
43
|
+
* @param selection - source, range, displayed patch, and user comment.
|
|
44
|
+
* @param index - one-based reference number in the composer.
|
|
45
|
+
* @returns Markdown content for an atomic composer quote.
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatReviewComment(selection: ReviewSelection, index: number): string;
|
|
48
|
+
/**
|
|
49
|
+
* Check whether the current diff still contains the captured range and hunk.
|
|
50
|
+
* @param selection - saved comment source and patch.
|
|
51
|
+
* @param source - currently displayed review source.
|
|
52
|
+
* @param file - current diff file.
|
|
53
|
+
* @returns whether an inline record can retain its original line placement.
|
|
54
|
+
*/
|
|
55
|
+
export declare function reviewMatches(selection: ReviewSelection, source: ReviewSource, file: ForgeDiffFile): boolean;
|
|
56
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** The forge facts a Session row shows, from the Session list and the change request states every row shares. */
|
|
2
|
+
import type { HostObservable, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots';
|
|
3
|
+
import type { UseSessions } from '@deepseek-ai/dsh-client-ui-session/client';
|
|
4
|
+
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
5
|
+
import type { SessionProjectionSummaryValues } from '@deepseek-ai/dsh-session-projection/types';
|
|
6
|
+
import type { ForgeChangeRequestListState, ForgeSessionWorktree } from '../types.ts';
|
|
7
|
+
import type { StreamSnapshot } from './source.ts';
|
|
8
|
+
import { type ChangeRequestTone } from './status.ts';
|
|
9
|
+
/** Change request states by URL as the Host streams them. */
|
|
10
|
+
export type ChangeRequestStates = StreamSnapshot<ReadonlyMap<string, ForgeChangeRequestListState>>;
|
|
11
|
+
/** Business face of the Session row entries: the change request states every row shares. */
|
|
12
|
+
export interface SessionListInjected {
|
|
13
|
+
readonly hooks: {
|
|
14
|
+
/** States by URL; the renderer binds it as `useStates`. */
|
|
15
|
+
readonly states: HostObservable<ChangeRequestStates>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** One visible change request of a Session with its last polled state, when known. */
|
|
19
|
+
export interface SessionListChangeRequest {
|
|
20
|
+
readonly url: string;
|
|
21
|
+
readonly state: ForgeChangeRequestListState | undefined;
|
|
22
|
+
readonly tone: ChangeRequestTone;
|
|
23
|
+
}
|
|
24
|
+
/** What a Session row and its hover card show. */
|
|
25
|
+
export interface SessionForgeFacts {
|
|
26
|
+
/** The worktree the panel created for the Session, while the Session works in it. */
|
|
27
|
+
readonly worktree: ForgeSessionWorktree | null;
|
|
28
|
+
/** Visible change requests, most urgent first; equally urgent ones keep their binding order. */
|
|
29
|
+
readonly changeRequests: readonly SessionListChangeRequest[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Derive a Session's facts from its listed projection values.
|
|
33
|
+
* @param values - the Session's projection values in the Session list, undefined before it is listed.
|
|
34
|
+
* @param states - change request states by URL.
|
|
35
|
+
* @returns the facts; a Session without a worktree or change requests shares one empty value.
|
|
36
|
+
*/
|
|
37
|
+
export declare function sessionForgeFacts(values: Readonly<Partial<SessionProjectionSummaryValues>> | undefined, states: ReadonlyMap<string, ForgeChangeRequestListState>): SessionForgeFacts;
|
|
38
|
+
/**
|
|
39
|
+
* Read one Session's facts, recomputed only when its listed values or the shared states change.
|
|
40
|
+
* @param useSessions - selector hook over the Session list.
|
|
41
|
+
* @param useStates - selector hook over the change request states.
|
|
42
|
+
* @param sessionId - the row's Session.
|
|
43
|
+
* @returns the facts.
|
|
44
|
+
*/
|
|
45
|
+
export declare function useSessionForgeFacts(useSessions: UseSessions, useStates: SnapshotSelectorHook<ChangeRequestStates>, sessionId: SessionId): SessionForgeFacts;
|
|
46
|
+
//# sourceMappingURL=session-list.d.ts.map
|