@lynn123411/dsh-chat-translate 1.5.0 → 1.7.0

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
@@ -5,18 +5,19 @@ DeepSeek Harness Web 界面的工具调用与思考链智能翻译插件。自
5
5
  ## 特性
6
6
 
7
7
  - **工具调用标题自动翻译**:仅在渲染层将工具调用动作描述(如 `Locate DSH home directory structure`)翻译为中文,回答正文永不翻译。
8
- - **思考链翻译(按钮触发,仅 AI 通道)**:每张思考卡的「Think」右侧有一个 18px 按钮,点击才翻译这条思考正文,**不会自动翻译**;折叠时按钮排在标题与折叠摘要之间。三态:未翻译=描边「译」字,翻译中=圈内圆环旋转(系统开启「减弱动态效果」时改为静态高亮),已翻译=实心高亮,再点一次整条切回原文(正文里的点击不再切换,思考链一律靠这个按钮变更)。思考还在流式输出(`data-state="running"`)时按钮置灰;折叠状态下点击会先自动展开这张卡片;翻译中再点忽略;失败时按钮停止动画、回到可翻译状态,可以再点重试。
9
- - **缓存与显示规则**:展开卡片时若整条思考的段落都已命中本地缓存,直接显示中文(不发请求);只命中一部分时展开仍是原文,点按钮时已命中的立刻出现、其余才发请求;翻译中途折叠卡片,本次翻译会跑完并进缓存,再展开点一下即可显示。思考卡折叠起来的那一行摘要永不翻译;代码块原样保留;混合块(列表项文字加子列表或代码块)只翻行内文字,嵌套结构留在原位。
8
+ - **实时行整条扣留(按阅读顺序逐行放行)**:当前 turn 里新追加的工具调用行(以及命令行等所有被翻译的行)在标题译文就绪前整条 `display: none`,原文不上屏,也**不占任何位置**——不只是看不见:参与布局的条目会带上会话流的兄弟间距,积压几行就是屏幕底部一条几十像素的空白,所以藏的是整个盒子,等待期间屏幕上是零。**排在它后面的会话流条目整条一起藏**:揭示队列照常积压、一帧都不提交,样式上整条移出布局——不翻译的行(例如读写文件的行,它们摘要渲染成文件链接、从来不在翻译范围内)、宿主直接落盘的正文、已经逐字reveal了一半的正文,都得等轮到它。所以不会有内容先占住待出现行的位置、等它出现时再被顶下去,也不会有积压在被按住期间悄悄排空、放行时一次性砸出来。队首就绪才轮到它:先把译文挂上、再让整行出现,中文照旧逐字 + 对数淡入打出,屏幕上只会出现译文;随后按阅读顺序**一步一行**放出后面的行,每一步补一段行入场淡入,一次全放会让整屏同时淡入。解锁时后面可能已经积了一长串行,所以放行步长随队伍长度收缩(总时长约 0.9 秒封顶),既逐行可见也不会让长队拖住屏幕。命中本地缓存的行即时显示、不扣留;历史回放、已结束的 turn、加载更早历史、插在已知末尾之前的行、切到另一个会话时那个会话里已有的内容、以及两条通道都关闭时不扣留。明确失败(降级 / 通道关闭 / 空译文 / 与原文相同)立即放行原文;等待上限 5 秒,超时先显示原文,译文之后到达再原地替换。已显示译文的行若原文被上游改写(如 ask_user 的「已回答 n/m」、失败摘要、todo 完成计数),保留当前译文并在新译文就绪后原地替换,行不消失、不出现英文。
9
+ - **思考链翻译(按钮触发,仅 AI 通道)**:展开的思考卡在「Think」右侧有一个 18px 按钮,点击才翻译这条思考正文,**不会自动翻译**;折叠的卡片没有按钮,展开后按钮才出现。三态:未翻译=描边「译」字,翻译中=圈内圆环旋转(系统开启「减弱动态效果」时改为静态高亮),已翻译=实心高亮,再点一次整条切回原文(正文里的点击不再切换,思考链一律靠这个按钮变更)。思考还在流式输出(`data-state="running"`)时按钮置灰;翻译中再点忽略;失败时按钮停止动画、回到可翻译状态,可以再点重试。
10
+ - **缓存与显示规则**:展开卡片时若整条思考的段落都已命中本地缓存,直接显示中文(不发请求);只命中一部分时展开仍是原文,点按钮时已命中的立刻出现、其余才发请求;翻译中途折叠卡片,本次翻译会跑完并进缓存,再展开时整条命中缓存就直接显示中文。思考卡折叠起来的那一行摘要永不翻译;代码块原样保留;混合块(列表项文字加子列表或代码块)只翻行内文字,嵌套结构留在原位。
10
11
  - **按块翻译与打包**:正文按 markdown 块级元素切分,相邻块打包成一个请求,输入上限 4096 估算 token、输出上限 8192 token;单个块超过输入上限时按空行、单行、句末依次切分,译回后拼回;客户端按 2048 估算 token 分块,逐块请求、逐块挂载,中文一段一段出现。请求走独立串行队列,同时最多一个在途,超时独立(默认 600 秒,可调至 900 秒),译文进独立缓存池(客户端与磁盘各 300 条),与工具标题互不挤占。
11
12
  - **AI 翻译通道(OpenAI 兼容协议)**:对接任意 OpenAI 兼容的 `chat/completions` 服务(OpenAI、DeepSeek、通义、Ollama、本地 vLLM 等),Base URL 与模型可在设置面板配置;API Key 经 DSH 凭据服务读写 `~/.dsh/.credentials.yaml` 的 `TRANSLATE_API_KEY`,填写后立即生效。工具标题与思考链都由它承接。
12
13
  - **Bing 免 Key 兜底通道**:内置微软 Bing 网页翻译(免 Key、国内直连),只用于工具调用标题的兜底;AI 未配置或请求失败时自动降级,思考链翻译永远不走这条通道。双通道均有独立开关,同时关闭则不翻译。
13
14
  - **非侵入式 DOM 挂载与双语对照**:非侵入式包装保留原始 DOM 节点与 React Fiber 事件系统;工具标题点击译文原地切换单条,思考链只由标题右侧的按钮在原文与中文之间整条切换,正文里的点击不改变原文与译文。
14
15
  - **智能内容脱敏与占位符保护**:翻译前对多行代码块、内联代码、URL 链接、文件路径及 CLI 命令行参数进行占位符脱敏与鲁棒还原,杜绝代码与路径被误翻译。占位符为 `⟦<随机短码><序号>⟧` 形式的独立片段,构建时会在紧邻拉丁字母的一侧补一个空格,避免译回时与相邻单词粘连。译文只有在每个占位符都按原顺序被完整还原时才被采用:占位符被改写、遗失或多个重复时整条译文作废并换通道,退回原文,且绝不写入缓存;升级前旧格式写入的污染译文在读取时被驱逐。
15
- - **当前会话作用域**:仅翻译当前查看的会话,切换会话自动跟随新内容;视口懒加载(150px 缓冲)与文档顺序排队,译文按阅读顺序出现。
16
+ - **当前会话作用域**:仅翻译当前查看的会话,切换会话自动跟随新内容;视口懒加载(150px 缓冲)与文档顺序排队,译文按阅读顺序出现;被扣留的实时行不等视口,与同批行一起请求。
16
17
  - **智能调度与熔断保护**:工具标题走 1–100 动态并发限流队列、AI 30s / Bing 2s 超时、连续失败熔断自愈、在途请求合并去重、7 天 LRU 磁盘持久化缓存(工具标题 `~/.dsh/dsh-chat-translate/cache.json`,思考链 `~/.dsh/dsh-chat-translate/think-cache.json`)。
17
18
  - **DSH 原生配置接入**:配置走 DSH `settings` 服务(用户层写入 `~/.dsh/settings.yaml` 的 `dsh-chat-translate` 段)、密钥走 DSH `credentials` 服务、设置面板经 `settingsScope` 与 `credentials` Remote API 读写——无任何自研配置文件。
18
19
  - **设置面板集成**:设置面板挂在与 `dsh-smooth-stream` 共用的「设置 - 阅读体验」共享页(本插件贡献其中一张卡片),页内提供总开关、AI/Bing 通道开关、「显示思考链翻译按钮」(默认打开)与思考链超时、Base URL 与模型配置、通道测试与并发数调节。按钮的显示还要求 AI 通道打开且已配置(Key / Base URL / 模型齐全),缺任何一条都不注入按钮并还原已翻译内容。
19
- - **与 dsh-smooth-stream 协同**:该插件的思考卡即使折叠也把正文留在 DOM 里,本插件因此能在思考流式期间就地翻译定型段落;它挂载的译文容器沿用 `dsh-tidy-translated-block`,会由 smooth-stream 的逐字显示机制按字符显现。
20
+ - **与 dsh-smooth-stream 协同**:该插件渲染的思考卡沿用同一套正文容器标记,正文定位与译文挂载对两套渲染器一视同仁;挂载的译文容器沿用 `dsh-tidy-translated-block`,由 smooth-stream 的逐字显示机制按字符显现并按对数曲线由淡变实。扣留契约也走 DOM:本插件在会话流条目上打 `data-dsh-reveal-hold`,smooth-stream 只读它、据此暂停条目内的揭示队列;放行时重放 smooth-stream 自己的行入场门控(`data-entrance`),而那段入场就是同一条 240ms 对数曲线的整行淡入,所以扣留放行的行与随挂载入场的行看到的是同一种淡入,没有区别对待。
20
21
 
21
22
  ## 安装
22
23
 
@@ -28,12 +28,12 @@
28
28
 
29
29
  > 从 1.2 起,插件不再读写独立的 `~/.dsh/dsh-chat-translate-config.json`:升级后首次加载会自动把旧文件的值迁移进上面的 settings 段并删除旧文件(若你已在 UI 中改过设置,则以你的设置为准)。
30
30
 
31
- 3. **思考链翻译按钮**:AI 卡片里的「显示思考链翻译按钮」默认打开;按钮的显示还要求总开关打开、AI 通道打开且已配置(Key / Base URL / 模型齐全),缺任何一条都不注入按钮并还原已翻译内容。按钮在每张思考卡的「Think」右侧(折叠时排在标题与折叠摘要之间),点击才翻译这条思考正文,不会自动翻译。
31
+ 3. **思考链翻译按钮**:AI 卡片里的「显示思考链翻译按钮」默认打开;按钮的显示还要求总开关打开、AI 通道打开且已配置(Key / Base URL / 模型齐全),缺任何一条都不注入按钮并还原已翻译内容。按钮只在展开的思考卡上出现,位于「Think」右侧;折叠的卡片没有按钮,展开后才插入。点击才翻译这条思考正文,不会自动翻译。
32
32
 
33
33
  - 三态:未翻译=描边「译」字,翻译中=圈内圆环旋转(系统开启「减弱动态效果」时为静态高亮),已翻译=实心高亮;再点一次整条切回原文;正文里的点击不再改变原文与译文,思考链一律靠这个按钮变更。
34
- - 思考还在流式输出(`data-state="running"`)时按钮置灰;折叠状态下点击会先自动展开卡片;翻译中再点忽略;失败时按钮停止动画并回到可翻译状态,可以再点重试。
34
+ - 思考还在流式输出(`data-state="running"`)时按钮置灰;翻译中再点忽略;失败时按钮停止动画并回到可翻译状态,可以再点重试。
35
35
  - 缓存规则:展开时若整条思考的段落都命中本地缓存就直接显示中文(不发请求);只命中一部分时展开仍是原文,点按钮时已命中的立刻出现、其余才发请求;翻译中途折叠卡片,本次翻译会跑完并进缓存。
36
36
  - 翻译范围:展开的思考正文;折叠起来的那一行摘要永不翻译,代码块原样保留,混合块只翻行内文字、嵌套子列表留在原位。只走 AI 通道,Bing 从不参与。
37
37
  - 请求方式:客户端按 2048 估算 token 分块,宿主按块打包(输入上限 4096 估算 token、输出上限 8192 token),走独立串行队列(同时最多一个在途请求),超时由 `thinkTimeoutMs` 控制(默认 600000 毫秒,范围 500–900000)。译文进独立缓存池(客户端与磁盘各 300 条),与工具标题互不挤占。
38
38
 
39
- 4. **通道行为**:AI 开启且已配置 → 工具标题 AI 优先、失败降级 Bing;AI 开启但未配置 + Bing 开启 → Bing 翻译;AI 未配置 + Bing 关闭 → 不翻译;AI 关闭 + Bing 开启 → 直接 Bing;双关 → 不翻译。思考链翻译与此表无关,它只认 AI 通道与自己的开关。
39
+ 4. **通道行为**:AI 开启且已配置 → 工具标题 AI 优先、失败降级 Bing;AI 开启但未配置 + Bing 开启 → Bing 翻译;AI 未配置 + Bing 关闭 → 不翻译;AI 关闭 + Bing 开启 → 直接 Bing;双关 → 不翻译(此时没有译文可等,实时行也就不再整行扣留)。思考链翻译与此表无关,它只认 AI 通道与自己的开关。