@lynn123411/dsh-chat-translate 1.3.1 → 1.3.2
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 +1 -1
- package/lib/client.js +18 -0
- package/lib/client.js.map +3 -3
- package/lib/index.js +146 -52
- package/lib/index.js.map +4 -4
- package/lib/types/server/pipeline/mask-tokens.d.ts +76 -0
- package/lib/types/server/pipeline/masking.d.ts +20 -0
- package/package.json +2 -3
- package/LICENSE +0 -21
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ DeepSeek Harness Web 界面的工具调用与思考摘要智能翻译插件。
|
|
|
8
8
|
- **AI 翻译通道(OpenAI 兼容协议)**:对接任意 OpenAI 兼容的 `chat/completions` 服务(OpenAI、DeepSeek、通义、Ollama 等),Base URL 与模型可在设置面板配置;API Key 经 DSH 凭据服务读写 `~/.dsh/.credentials.yaml` 的 `TRANSLATE_API_KEY`,填写后立即生效。
|
|
9
9
|
- **Bing 免 Key 兜底通道**:内置微软 Bing 网页翻译(免 Key、国内直连),AI 未配置或请求失败时自动兜底;双通道均有独立开关,同时关闭则不翻译。
|
|
10
10
|
- **非侵入式 DOM 挂载与双语对照**:非侵入式包装保留原始 DOM 节点与 React Fiber 事件系统;点击译文可原地在原文与中文之间切换。
|
|
11
|
-
- **智能内容脱敏与占位符保护**:翻译前对多行代码块、内联代码、URL 链接、文件路径及 CLI
|
|
11
|
+
- **智能内容脱敏与占位符保护**:翻译前对多行代码块、内联代码、URL 链接、文件路径及 CLI 命令行参数进行占位符脱敏与鲁棒还原,杜绝代码与路径被误翻译。占位符采用带随机短码的专用标记,还原时容忍翻译引擎的大小写、空格与分隔符改写;译文中若仍残留占位符(引擎改写或模型幻觉),该结果整条作废并回退显示原文,且绝不写入缓存。
|
|
12
12
|
- **当前会话作用域**:仅翻译当前查看的会话,切换会话自动跟随新内容;视口懒加载(150px 缓冲)与文档顺序排队,译文按阅读顺序出现。
|
|
13
13
|
- **智能调度与熔断保护**:1–100 动态并发限流队列、AI 30s / Bing 2s 超时、连续失败熔断自愈、在途请求合并去重、7 天 LRU 磁盘持久化缓存(`~/.dsh/dsh-chat-translate/cache.json`)。
|
|
14
14
|
- **DSH 原生配置接入**:配置走 DSH `settings` 服务(用户层写入 `~/.dsh/settings.yaml` 的 `dsh-chat-translate` 段)、密钥走 DSH `credentials` 服务、设置面板经 `settingsScope` 与 `credentials` Remote API 读写——无任何自研配置文件。
|
package/lib/client.js
CHANGED
|
@@ -34,6 +34,18 @@ __export(index_exports, {
|
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(index_exports);
|
|
36
36
|
|
|
37
|
+
// src/server/pipeline/mask-tokens.ts
|
|
38
|
+
var MASK_TOKEN_PATTERN_SOURCE = "_*\\s*DSH\\s*_*\\s*MASK\\s*(?:_?\\s*(\\d+)|_*[xX]?[\\s._-]*([a-z]{2,8})\\s*_+\\s*(\\d+))(?:_{0,2}(?=[^\\w]|$))?";
|
|
39
|
+
function hasMaskResidue(text) {
|
|
40
|
+
if (!text) return false;
|
|
41
|
+
return new RegExp(MASK_TOKEN_PATTERN_SOURCE, "i").test(text);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// src/server/pipeline/masking.ts
|
|
45
|
+
function isMaskLeak(translatedText) {
|
|
46
|
+
return hasMaskResidue(translatedText);
|
|
47
|
+
}
|
|
48
|
+
|
|
37
49
|
// src/client/translate/client-cache.ts
|
|
38
50
|
var CACHE_KEY = "dsh-chat-translate:cache";
|
|
39
51
|
var MAX_LOCAL_ENTRIES = 500;
|
|
@@ -69,6 +81,12 @@ var ClientCache = class {
|
|
|
69
81
|
const key = text.trim().toLowerCase();
|
|
70
82
|
const entry = this.memCache.get(key);
|
|
71
83
|
if (entry === void 0) return void 0;
|
|
84
|
+
if (typeof entry.v === "string" && isMaskLeak(entry.v)) {
|
|
85
|
+
this.memCache.delete(key);
|
|
86
|
+
this.dirty = true;
|
|
87
|
+
this.scheduleSave();
|
|
88
|
+
return void 0;
|
|
89
|
+
}
|
|
72
90
|
if (entry.v && entry.v.trim().toLowerCase() === key) {
|
|
73
91
|
this.memCache.delete(key);
|
|
74
92
|
this.dirty = true;
|