@jingyi0605/codingns4dsh 0.2.1-beta.10 → 0.2.1-beta.11
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.en.md +3 -3
- package/README.md +6 -4
- package/data/build/dist/client/bundle.js +8958 -7380
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-slots.d.ts +11 -2
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +67 -16
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.assistant-configuration-view.js +8 -7
- package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -1
- package/data/build/dist/client/client.moss-voice-output.js +581 -0
- package/data/build/dist/client/client.moss-voice-output.js.map +1 -0
- package/data/build/dist/client/client.native-workspace-store.js +1 -1
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
- package/data/build/dist/client/client.react-dom.js +0 -570
- package/data/build/dist/client/client.react-dom.js.map +1 -1
- package/data/build/dist/client/client.session-translation.js +97 -2
- package/data/build/dist/client/client.session-translation.js.map +1 -1
- package/data/build/dist/client/client.transport.js +57 -11
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +57 -11
- package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
- package/data/build/dist/client/features/cli-adapters.js +3 -1
- package/data/build/dist/client/features/cli-adapters.js.map +1 -1
- package/data/build/dist/client/features/session-translation.d.ts.map +1 -1
- package/data/build/dist/client/features/session-translation.js +43 -48
- package/data/build/dist/client/features/session-translation.js.map +1 -1
- package/data/build/dist/client/locales/panels.d.ts.map +1 -1
- package/data/build/dist/client/locales/panels.js +57 -11
- package/data/build/dist/client/locales/panels.js.map +1 -1
- package/data/build/dist/client/native-model-translation-menu.d.ts +6 -0
- package/data/build/dist/client/native-model-translation-menu.d.ts.map +1 -0
- package/data/build/dist/client/native-model-translation-menu.js +57 -0
- package/data/build/dist/client/native-model-translation-menu.js.map +1 -0
- package/data/build/dist/client/native-translation-default.d.ts +6 -0
- package/data/build/dist/client/native-translation-default.d.ts.map +1 -0
- package/data/build/dist/client/native-translation-default.js +30 -0
- package/data/build/dist/client/native-translation-default.js.map +1 -0
- package/data/build/dist/client/session-translation-chat.d.ts +15 -0
- package/data/build/dist/client/session-translation-chat.d.ts.map +1 -1
- package/data/build/dist/client/session-translation-chat.js +109 -41
- package/data/build/dist/client/session-translation-chat.js.map +1 -1
- package/data/build/dist/client/session-translation-interactions.d.ts +31 -0
- package/data/build/dist/client/session-translation-interactions.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-interactions.js +158 -0
- package/data/build/dist/client/session-translation-interactions.js.map +1 -0
- package/data/build/dist/client/session-translation-model-pool.d.ts +16 -0
- package/data/build/dist/client/session-translation-model-pool.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-model-pool.js +246 -0
- package/data/build/dist/client/session-translation-model-pool.js.map +1 -0
- package/data/build/dist/client/session-translation-pending-dom.d.ts +8 -0
- package/data/build/dist/client/session-translation-pending-dom.d.ts.map +1 -0
- package/data/build/dist/client/session-translation-pending-dom.js +58 -0
- package/data/build/dist/client/session-translation-pending-dom.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts +30 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js +102 -0
- package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts +12 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js +181 -0
- package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts +20 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.js +65 -0
- package/data/build/dist/dsh-capabilities/client/question-history-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts +30 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js +62 -0
- package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js.map +1 -0
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +1 -0
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +3 -0
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +17 -8
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +252 -39
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +2 -2
- package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/registry.js +2 -0
- package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
- package/data/build/dist/host/features/interaction-translation.d.ts +9 -0
- package/data/build/dist/host/features/interaction-translation.d.ts.map +1 -0
- package/data/build/dist/host/features/interaction-translation.js +168 -0
- package/data/build/dist/host/features/interaction-translation.js.map +1 -0
- package/data/build/dist/host/features/session-translation-protection.d.ts +11 -0
- package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-protection.js +165 -0
- package/data/build/dist/host/features/session-translation-protection.js.map +1 -0
- package/data/build/dist/host/features/session-translation-runtime.d.ts +16 -0
- package/data/build/dist/host/features/session-translation-runtime.d.ts.map +1 -0
- package/data/build/dist/host/features/session-translation-runtime.js +85 -0
- package/data/build/dist/host/features/session-translation-runtime.js.map +1 -0
- package/data/build/dist/host/features/session-translation-service.d.ts +10 -3
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-service.js +159 -197
- package/data/build/dist/host/features/session-translation-service.js.map +1 -1
- package/data/build/dist/host/features/session-translation.js +1 -1
- package/data/build/dist/host/features/session-translation.js.map +1 -1
- package/data/build/dist/host/native-session-bridge.js +2 -2
- package/data/build/dist/host/native-session-bridge.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +6 -2
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/shared/contracts/interaction-presentation.d.ts +32 -0
- package/data/build/dist/shared/contracts/interaction-presentation.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/interaction-presentation.js +2 -0
- package/data/build/dist/shared/contracts/interaction-presentation.js.map +1 -0
- package/data/build/dist/shared/contracts/interaction-translation.d.ts +53 -0
- package/data/build/dist/shared/contracts/interaction-translation.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/interaction-translation.js +44 -0
- package/data/build/dist/shared/contracts/interaction-translation.js.map +1 -0
- package/data/build/dist/shared/contracts/session-translation.d.ts +62 -7
- package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/session-translation.js +122 -2
- package/data/build/dist/shared/contracts/session-translation.js.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +1 -1
- package/data/build/dist/shared/contracts/version.js +1 -1
- package/data/build/dist/shared/index.d.ts +1 -1
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js +1 -1
- package/data/build/dist/shared/index.js.map +1 -1
- package/data/build/dist/shared/translation-indicator.d.ts +26 -0
- package/data/build/dist/shared/translation-indicator.d.ts.map +1 -0
- package/data/build/dist/shared/translation-indicator.js +29 -0
- package/data/build/dist/shared/translation-indicator.js.map +1 -0
- package/package.json +1 -1
- package/profile/README.md +2 -2
- package/profile/package.json +2 -2
- package/profile/version.json +1 -1
- package/version.json +1 -1
|
@@ -25,15 +25,92 @@ window.__ModuleLoader__.load({
|
|
|
25
25
|
"antigravity",
|
|
26
26
|
"doubao"
|
|
27
27
|
];
|
|
28
|
+
const SESSION_TRANSLATION_LANGUAGES = [
|
|
29
|
+
"en",
|
|
30
|
+
"fr",
|
|
31
|
+
"de",
|
|
32
|
+
"ja",
|
|
33
|
+
"zh"
|
|
34
|
+
];
|
|
28
35
|
const DEFAULT_SESSION_TRANSLATION_SETTINGS = {
|
|
29
36
|
inputLanguage: "en",
|
|
30
37
|
outputLanguage: "zh",
|
|
31
|
-
bilingual: false
|
|
38
|
+
bilingual: false,
|
|
39
|
+
nativeEnabled: false
|
|
32
40
|
};
|
|
33
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* 外部 Agent 适配器判定。
|
|
43
|
+
*
|
|
44
|
+
* 只表示「会话由插件的外部 CLI 驱动接管」,因此 DSH 原生 Agent 不在其中:该判定
|
|
45
|
+
* 还被用来把外部 Agent 的虚拟 Provider 排除在翻译模型目录之外,混入 `dsh` 会污染
|
|
46
|
+
* 这一语义。会话是否可翻译统一使用 {@link supportsSessionTranslation}。
|
|
47
|
+
*/
|
|
34
48
|
function isSessionTranslationAdapter(adapterId) {
|
|
35
49
|
return SESSION_TRANSLATION_ADAPTER_IDS.includes(adapterId);
|
|
36
50
|
}
|
|
51
|
+
/** 外部 Agent 与 DSH 原生 Agent 都支持会话翻译。 */
|
|
52
|
+
function supportsSessionTranslation(adapterId) {
|
|
53
|
+
return adapterId === "dsh" || isSessionTranslationAdapter(adapterId);
|
|
54
|
+
}
|
|
55
|
+
/** 判断任意字符串是否为受支持的翻译语言。 */
|
|
56
|
+
function isSessionTranslationLanguage(value) {
|
|
57
|
+
return typeof value === "string" && SESSION_TRANSLATION_LANGUAGES.includes(value);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 归一化翻译设置:旧设置快照可能缺少 `nativeEnabled`,非法语言回落到默认值。
|
|
61
|
+
*
|
|
62
|
+
* 与 `session-translation-service.ts` 的内部归一化保持同一语义,供客户端设置页在
|
|
63
|
+
* 写入前补齐字段,避免旧快照把新字段写丢。
|
|
64
|
+
*/
|
|
65
|
+
function normalizeSessionTranslationSettings(value) {
|
|
66
|
+
const fallback = DEFAULT_SESSION_TRANSLATION_SETTINGS;
|
|
67
|
+
if (value === void 0) return fallback;
|
|
68
|
+
const translationModel = normalizeTranslationModel(value.translationModel);
|
|
69
|
+
const translationModels = Array.isArray(value.translationModels) ? normalizeTranslationModels(value.translationModels) : void 0;
|
|
70
|
+
return {
|
|
71
|
+
inputLanguage: isSessionTranslationLanguage(value.inputLanguage) ? value.inputLanguage : fallback.inputLanguage,
|
|
72
|
+
outputLanguage: isSessionTranslationLanguage(value.outputLanguage) ? value.outputLanguage : fallback.outputLanguage,
|
|
73
|
+
bilingual: value.bilingual === true,
|
|
74
|
+
nativeEnabled: value.nativeEnabled === true,
|
|
75
|
+
...translationModel === void 0 ? {} : { translationModel },
|
|
76
|
+
...translationModels === void 0 ? {} : { translationModels }
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function normalizeTranslationModels(values) {
|
|
80
|
+
const models = [];
|
|
81
|
+
const seen = /* @__PURE__ */ new Set();
|
|
82
|
+
for (const value of values) {
|
|
83
|
+
const model = normalizeTranslationModel(value);
|
|
84
|
+
if (model === void 0) continue;
|
|
85
|
+
const key = JSON.stringify([model.provider, model.model]);
|
|
86
|
+
if (seen.has(key)) continue;
|
|
87
|
+
seen.add(key);
|
|
88
|
+
models.push(model);
|
|
89
|
+
}
|
|
90
|
+
return models;
|
|
91
|
+
}
|
|
92
|
+
function normalizeTranslationModel(value) {
|
|
93
|
+
if (value === void 0 || value === null || typeof value.provider !== "string" || typeof value.model !== "string") return void 0;
|
|
94
|
+
const provider = value.provider.trim();
|
|
95
|
+
const model = value.model.trim();
|
|
96
|
+
return provider === "" || model === "" ? void 0 : {
|
|
97
|
+
provider,
|
|
98
|
+
model
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Preserve available metrics while accepting records saved before metrics existed. */
|
|
102
|
+
function readSessionTranslationMetrics(value) {
|
|
103
|
+
const record = asRecord(value);
|
|
104
|
+
const durationMs = record?.durationMs;
|
|
105
|
+
const totalTokens = record?.totalTokens;
|
|
106
|
+
return {
|
|
107
|
+
...typeof durationMs === "number" && Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {},
|
|
108
|
+
...typeof totalTokens === "number" && Number.isSafeInteger(totalTokens) && totalTokens >= 0 ? { totalTokens } : {}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function asRecord(value) {
|
|
112
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
|
|
113
|
+
}
|
|
37
114
|
//#endregion
|
|
38
115
|
Object.defineProperty(exports, "DEFAULT_SESSION_TRANSLATION_SETTINGS", {
|
|
39
116
|
enumerable: true,
|
|
@@ -47,6 +124,24 @@ window.__ModuleLoader__.load({
|
|
|
47
124
|
return isSessionTranslationAdapter;
|
|
48
125
|
}
|
|
49
126
|
});
|
|
127
|
+
Object.defineProperty(exports, "normalizeSessionTranslationSettings", {
|
|
128
|
+
enumerable: true,
|
|
129
|
+
get: function() {
|
|
130
|
+
return normalizeSessionTranslationSettings;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
Object.defineProperty(exports, "readSessionTranslationMetrics", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
get: function() {
|
|
136
|
+
return readSessionTranslationMetrics;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
Object.defineProperty(exports, "supportsSessionTranslation", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
get: function() {
|
|
142
|
+
return supportsSessionTranslation;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
50
145
|
return module.exports;
|
|
51
146
|
}
|
|
52
147
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.session-translation.js","names":[],"sources":["../../../../src/shared/contracts/session-translation.ts"],"sourcesContent":["/** 会话翻译中间件支持的语言。 */\nexport type SessionTranslationLanguage = 'en' | 'fr' | 'de' | 'ja' | 'zh'\n\n/** 输出内容类别;工具调用、命令和路径不属于可翻译内容。 */\nexport type SessionTranslationOutputKind = 'reasoning' | 'assistant'\n\n/** 翻译请求使用的 DSH 原生模型;不保存密钥,只保存 provider/model 标识。 */\nexport interface SessionTranslationModel {\n readonly provider: string\n readonly model: string\n}\n\n/** 会话翻译中间件的持久化设置。 */\nexport interface SessionTranslationSettings {\n /** 用户输入送入外部 Agent 的目的语言。 */\n readonly inputLanguage: Exclude<SessionTranslationLanguage, 'zh'>\n /** 输出翻译语言;默认中文。 */\n readonly outputLanguage: SessionTranslationLanguage\n /** 是否在 UI 和历史回看中同时保留原文与译文。 */\n readonly bilingual: boolean\n /** 翻译模型;缺省时跟随 DSH 当前默认模型。 */\n readonly translationModel?: SessionTranslationModel\n}\n\nexport const SESSION_TRANSLATION_ADAPTER_IDS = [\n 'command-code', 'claude-code', 'kimi', 'gemini', 'pi', 'codex', 'opencode', 'grok',\n 'mcode', 'zcode', 'codebuddy', 'workbuddy', 'cursor-cli', 'kiro-cli', 'qoder', 'qoder-cn',\n 'antigravity', 'doubao',\n] as const\n\nexport const DEFAULT_SESSION_TRANSLATION_SETTINGS: SessionTranslationSettings = {\n inputLanguage: 'en',\n outputLanguage: 'zh',\n bilingual: false,\n}\n\n/** 所有内置外部 Agent 均可在会话模型选择器中开启翻译;DSH 原生 Agent 不在其中。 */\nexport function isSessionTranslationAdapter(adapterId: string): boolean {\n return (SESSION_TRANSLATION_ADAPTER_IDS as readonly string[]).includes(adapterId)\n}\n\nexport interface SessionTranslationRecord {\n readonly original: string\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 回复文本所在的 DSH 内容块类型,供界面将原文入口放回对应内容块。 */\n readonly outputKind?: SessionTranslationOutputKind\n readonly bilingual: boolean\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 本次尝试失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n}\n\n/** 用户输入的原文、实际送出的译文和翻译模型,作为 DSH 历史元数据保存。 */\nexport interface SessionTranslationInputRecord {\n readonly original: string\n /** 包含附件提示等不翻译内容的最终 Provider prompt。 */\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: Exclude<SessionTranslationLanguage, 'zh'>\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 翻译失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n}\n\n/** 外部 Agent 的历史上下文使用实际发送的译文;DSH 用户消息正文保留用户原文。 */\nexport function formatSessionTranslationInput(record: SessionTranslationInputRecord): string {\n return record.translated\n}\n\n/** DSH 的回复正文只保留译文;详情入口从元数据读取原文和模型。 */\nexport function formatSessionTranslationOutput(record: SessionTranslationRecord): string {\n return record.translated\n}\n"],"mappings":";;;;;;;EAwBA,MAAa,kCAAkC;GAC7C;GAAgB;GAAe;GAAQ;GAAU;GAAM;GAAS;GAAY;GAC5E;GAAS;GAAS;GAAa;GAAa;GAAc;GAAY;GAAS;GAC/E;GAAe;EACjB;EAEA,MAAa,uCAAmE;GAC9E,eAAe;GACf,gBAAgB;GAChB,WAAW;EACb;;EAGA,SAAgB,4BAA4B,WAA4B;GACtE,OAAQ,gCAAsD,SAAS,SAAS;EAClF"}
|
|
1
|
+
{"version":3,"file":"client.session-translation.js","names":[],"sources":["../../../../src/shared/contracts/session-translation.ts"],"sourcesContent":["/** 会话翻译中间件支持的语言。 */\nexport type SessionTranslationLanguage = 'en' | 'fr' | 'de' | 'ja' | 'zh'\n\n/** 输出内容类别;工具调用、命令和路径不属于可翻译内容。 */\nexport type SessionTranslationOutputKind = 'reasoning' | 'assistant'\n\n/** 翻译请求使用的 DSH 原生模型;不保存密钥,只保存 provider/model 标识。 */\nexport interface SessionTranslationModel {\n readonly provider: string\n readonly model: string\n}\n\n/** 会话翻译中间件的持久化设置。 */\nexport interface SessionTranslationSettings {\n /** 用户输入送入 Agent 的目的语言。 */\n readonly inputLanguage: SessionTranslationLanguage\n /** 输出翻译语言;默认中文。 */\n readonly outputLanguage: SessionTranslationLanguage\n /** 是否在 UI 和历史回看中同时保留原文与译文。 */\n readonly bilingual: boolean\n /** 翻译模型;缺省时跟随 DSH 当前默认模型。 */\n readonly translationModel?: SessionTranslationModel\n /** Models in priority order. An empty pool follows the DSH default; absent pools use the legacy selection. */\n readonly translationModels?: readonly SessionTranslationModel[]\n /**\n * DSH 原生会话是否参与翻译;缺省关闭。\n *\n * 原生会话的回复由 DSH 自己写入 `assistant/message`,开启输出翻译后正文会变成\n * 译文、原文只留在块元数据里,因此不能默认改变既有行为。\n */\n readonly nativeEnabled?: boolean\n}\n\nexport const SESSION_TRANSLATION_ADAPTER_IDS = [\n 'command-code', 'claude-code', 'kimi', 'gemini', 'pi', 'codex', 'opencode', 'grok',\n 'mcode', 'zcode', 'codebuddy', 'workbuddy', 'cursor-cli', 'kiro-cli', 'qoder', 'qoder-cn',\n 'antigravity', 'doubao',\n] as const\n\n/** DSH 内置 Agent 的适配器标识;它没有外部驱动,但同样支持会话翻译。 */\nexport const DSH_NATIVE_SESSION_ADAPTER_ID = 'dsh' as const\n\nexport const SESSION_TRANSLATION_LANGUAGES = ['en', 'fr', 'de', 'ja', 'zh'] as const\n\nexport const DEFAULT_SESSION_TRANSLATION_SETTINGS: SessionTranslationSettings = {\n inputLanguage: 'en',\n outputLanguage: 'zh',\n bilingual: false,\n nativeEnabled: false,\n}\n\n/**\n * 外部 Agent 适配器判定。\n *\n * 只表示「会话由插件的外部 CLI 驱动接管」,因此 DSH 原生 Agent 不在其中:该判定\n * 还被用来把外部 Agent 的虚拟 Provider 排除在翻译模型目录之外,混入 `dsh` 会污染\n * 这一语义。会话是否可翻译统一使用 {@link supportsSessionTranslation}。\n */\nexport function isSessionTranslationAdapter(adapterId: string): boolean {\n return (SESSION_TRANSLATION_ADAPTER_IDS as readonly string[]).includes(adapterId)\n}\n\n/** 外部 Agent 与 DSH 原生 Agent 都支持会话翻译。 */\nexport function supportsSessionTranslation(adapterId: string): boolean {\n return adapterId === DSH_NATIVE_SESSION_ADAPTER_ID || isSessionTranslationAdapter(adapterId)\n}\n\n/** 判断任意字符串是否为受支持的翻译语言。 */\nexport function isSessionTranslationLanguage(value: unknown): value is SessionTranslationLanguage {\n return typeof value === 'string' && (SESSION_TRANSLATION_LANGUAGES as readonly string[]).includes(value)\n}\n\n/**\n * 归一化翻译设置:旧设置快照可能缺少 `nativeEnabled`,非法语言回落到默认值。\n *\n * 与 `session-translation-service.ts` 的内部归一化保持同一语义,供客户端设置页在\n * 写入前补齐字段,避免旧快照把新字段写丢。\n */\nexport function normalizeSessionTranslationSettings(value: SessionTranslationSettings | undefined): SessionTranslationSettings {\n const fallback = DEFAULT_SESSION_TRANSLATION_SETTINGS\n if (value === undefined) return fallback\n const translationModel = normalizeTranslationModel(value.translationModel)\n const translationModels = Array.isArray(value.translationModels) ? normalizeTranslationModels(value.translationModels) : undefined\n return {\n inputLanguage: isSessionTranslationLanguage(value.inputLanguage) ? value.inputLanguage : fallback.inputLanguage,\n outputLanguage: isSessionTranslationLanguage(value.outputLanguage) ? value.outputLanguage : fallback.outputLanguage,\n bilingual: value.bilingual === true,\n nativeEnabled: value.nativeEnabled === true,\n ...(translationModel === undefined ? {} : { translationModel }),\n ...(translationModels === undefined ? {} : { translationModels }),\n }\n}\n\nfunction normalizeTranslationModels(values: readonly SessionTranslationModel[]): readonly SessionTranslationModel[] {\n const models: SessionTranslationModel[] = []\n const seen = new Set<string>()\n for (const value of values) {\n const model = normalizeTranslationModel(value)\n if (model === undefined) continue\n const key = JSON.stringify([model.provider, model.model])\n if (seen.has(key)) continue\n seen.add(key)\n models.push(model)\n }\n return models\n}\n\nfunction normalizeTranslationModel(value: SessionTranslationModel | undefined): SessionTranslationModel | undefined {\n if (value === undefined || value === null || typeof value.provider !== 'string' || typeof value.model !== 'string') return undefined\n const provider = value.provider.trim()\n const model = value.model.trim()\n return provider === '' || model === '' ? undefined : { provider, model }\n}\n\nexport interface SessionTranslationFailure {\n readonly code: 'timeout' | 'cancelled' | 'rate-limit' | 'network' | 'unavailable' | 'invalid-response' | 'configuration' | 'provider'\n readonly retryable: boolean\n}\n\nexport interface SessionTranslationMetrics {\n /** Elapsed translation time, including model selection and fallback attempts. */\n readonly durationMs?: number\n /** Reported token consumption across model attempts, including cached input. */\n readonly totalTokens?: number\n}\n\n/** Preserve available metrics while accepting records saved before metrics existed. */\nexport function readSessionTranslationMetrics(value: unknown): SessionTranslationMetrics {\n const record = asRecord(value)\n const durationMs = record?.durationMs\n const totalTokens = record?.totalTokens\n return {\n ...(typeof durationMs === 'number' && Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {}),\n ...(typeof totalTokens === 'number' && Number.isSafeInteger(totalTokens) && totalTokens >= 0 ? { totalTokens } : {}),\n }\n}\n\nexport interface SessionTranslationRecord extends SessionTranslationMetrics {\n readonly original: string\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 回复文本所在的 DSH 内容块类型,供界面将原文入口放回对应内容块。 */\n readonly outputKind?: SessionTranslationOutputKind\n readonly bilingual: boolean\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 本次尝试失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n /** Structured failure details; absent in older translation records. */\n readonly failure?: SessionTranslationFailure\n}\n\n/** 用户输入的原文、实际送出的译文和翻译模型,作为 DSH 历史元数据保存。 */\nexport interface SessionTranslationInputRecord extends SessionTranslationMetrics {\n readonly original: string\n /** 包含附件提示等不翻译内容的最终 Provider prompt。 */\n readonly translated: string\n readonly sourceLanguage?: SessionTranslationLanguage\n readonly targetLanguage: SessionTranslationLanguage\n /** 源语言与目标语言一致,因此未调用翻译模型。 */\n readonly alreadyTargetLanguage?: boolean\n /** 实际执行本次翻译的 DSH 原生模型;旧历史可能没有该字段。 */\n readonly model?: SessionTranslationModel\n /** 翻译失败并回退原文;前端显示警告状态。 */\n readonly failed?: boolean\n}\n\n/**\n * 从 DSH 原生用户消息的 source 元数据读取输入翻译记录。\n *\n * 该字段由 `agent/pre-step` 写入并随 `user/message` 持久化;未知或不完整的历史\n * 结构一律返回 undefined,调用方按「没有翻译」处理。\n */\nexport function readNativeTranslationRecord(source: unknown): SessionTranslationInputRecord | undefined {\n const record = asRecord(source)\n const candidate = asRecord(record?.codingnsTranslationInput)\n if (candidate === null) return undefined\n if (typeof candidate.original !== 'string' || typeof candidate.translated !== 'string') return undefined\n if (candidate.original.trim() === '' || candidate.translated.trim() === '') return undefined\n const targetLanguage = isSessionTranslationLanguage(candidate.targetLanguage) ? candidate.targetLanguage : undefined\n if (targetLanguage === undefined) return undefined\n const model = normalizeTranslationModel(asRecord(candidate.model) as SessionTranslationModel | undefined)\n const sourceLanguage = isSessionTranslationLanguage(candidate.sourceLanguage) ? candidate.sourceLanguage : undefined\n return {\n original: candidate.original,\n translated: candidate.translated,\n targetLanguage,\n ...(sourceLanguage === undefined ? {} : { sourceLanguage }),\n ...(candidate.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(candidate.failed === true ? { failed: true } : {}),\n ...(model === undefined ? {} : { model }),\n ...readSessionTranslationMetrics(candidate),\n }\n}\n\n/** 输入记录转换为详情弹层使用的通用记录;`outputKind` 缺省表示输入方向。 */\nexport function toSessionTranslationRecord(\n record: SessionTranslationInputRecord,\n options: { readonly outputKind?: SessionTranslationOutputKind; readonly bilingual?: boolean } = {},\n): SessionTranslationRecord {\n return {\n original: record.original,\n translated: record.translated,\n targetLanguage: record.targetLanguage,\n bilingual: options.bilingual === true,\n ...(options.outputKind === undefined ? {} : { outputKind: options.outputKind }),\n ...(record.sourceLanguage === undefined ? {} : { sourceLanguage: record.sourceLanguage }),\n ...(record.alreadyTargetLanguage === true ? { alreadyTargetLanguage: true } : {}),\n ...(record.failed === true ? { failed: true } : {}),\n ...(record.model === undefined ? {} : { model: record.model }),\n ...readSessionTranslationMetrics(record),\n }\n}\n\nfunction asRecord(value: unknown): Record<string, any> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, any> : null\n}\n\n/** 外部 Agent 的历史上下文使用实际发送的译文;DSH 用户消息正文保留用户原文。 */\nexport function formatSessionTranslationInput(record: SessionTranslationInputRecord): string {\n return record.translated\n}\n\n/** Return the output translation; native DSH history keeps the original and the client reads this record. */\nexport function formatSessionTranslationOutput(record: SessionTranslationRecord): string {\n return record.translated\n}\n"],"mappings":";;;;;;;EAiCA,MAAa,kCAAkC;GAC7C;GAAgB;GAAe;GAAQ;GAAU;GAAM;GAAS;GAAY;GAC5E;GAAS;GAAS;GAAa;GAAa;GAAc;GAAY;GAAS;GAC/E;GAAe;EACjB;EAKA,MAAa,gCAAgC;GAAC;GAAM;GAAM;GAAM;GAAM;EAAI;EAE1E,MAAa,uCAAmE;GAC9E,eAAe;GACf,gBAAgB;GAChB,WAAW;GACX,eAAe;EACjB;;;;;;;;EASA,SAAgB,4BAA4B,WAA4B;GACtE,OAAQ,gCAAsD,SAAS,SAAS;EAClF;;EAGA,SAAgB,2BAA2B,WAA4B;GACrE,OAAO,cAAA,SAA+C,4BAA4B,SAAS;EAC7F;;EAGA,SAAgB,6BAA6B,OAAqD;GAChG,OAAO,OAAO,UAAU,YAAa,8BAAoD,SAAS,KAAK;EACzG;;;;;;;EAQA,SAAgB,oCAAoC,OAA2E;GAC7H,MAAM,WAAW;GACjB,IAAI,UAAU,KAAA,GAAW,OAAO;GAChC,MAAM,mBAAmB,0BAA0B,MAAM,gBAAgB;GACzE,MAAM,oBAAoB,MAAM,QAAQ,MAAM,iBAAiB,IAAI,2BAA2B,MAAM,iBAAiB,IAAI,KAAA;GACzH,OAAO;IACL,eAAe,6BAA6B,MAAM,aAAa,IAAI,MAAM,gBAAgB,SAAS;IAClG,gBAAgB,6BAA6B,MAAM,cAAc,IAAI,MAAM,iBAAiB,SAAS;IACrG,WAAW,MAAM,cAAc;IAC/B,eAAe,MAAM,kBAAkB;IACvC,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;IAC7D,GAAI,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB;GACjE;EACF;EAEA,SAAS,2BAA2B,QAAgF;GAClH,MAAM,SAAoC,CAAC;GAC3C,MAAM,uBAAO,IAAI,IAAY;GAC7B,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,QAAQ,0BAA0B,KAAK;IAC7C,IAAI,UAAU,KAAA,GAAW;IACzB,MAAM,MAAM,KAAK,UAAU,CAAC,MAAM,UAAU,MAAM,KAAK,CAAC;IACxD,IAAI,KAAK,IAAI,GAAG,GAAG;IACnB,KAAK,IAAI,GAAG;IACZ,OAAO,KAAK,KAAK;GACnB;GACA,OAAO;EACT;EAEA,SAAS,0BAA0B,OAAiF;GAClH,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,OAAO,MAAM,aAAa,YAAY,OAAO,MAAM,UAAU,UAAU,OAAO,KAAA;GAC3H,MAAM,WAAW,MAAM,SAAS,KAAK;GACrC,MAAM,QAAQ,MAAM,MAAM,KAAK;GAC/B,OAAO,aAAa,MAAM,UAAU,KAAK,KAAA,IAAY;IAAE;IAAU;GAAM;EACzE;;EAeA,SAAgB,8BAA8B,OAA2C;GACvF,MAAM,SAAS,SAAS,KAAK;GAC7B,MAAM,aAAa,QAAQ;GAC3B,MAAM,cAAc,QAAQ;GAC5B,OAAO;IACL,GAAI,OAAO,eAAe,YAAY,OAAO,SAAS,UAAU,KAAK,cAAc,IAAI,EAAE,WAAW,IAAI,CAAC;IACzG,GAAI,OAAO,gBAAgB,YAAY,OAAO,cAAc,WAAW,KAAK,eAAe,IAAI,EAAE,YAAY,IAAI,CAAC;GACpH;EACF;EAkFA,SAAS,SAAS,OAA4C;GAC5D,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,QAA+B;EAC/G"}
|
|
@@ -1198,26 +1198,49 @@ window.__ModuleLoader__.load({
|
|
|
1198
1198
|
"lan.fieldMustBeInteger": "{field} must be an integer from {minimum} to 65535",
|
|
1199
1199
|
"workspace.sessionSettingsSaved": "Workspace session settings saved",
|
|
1200
1200
|
"feature.sessionTranslation.label": "Session translation",
|
|
1201
|
-
"feature.sessionTranslation.description": "Translate selected external Agent requests and replies while keeping tools, commands, paths, and original history unchanged.",
|
|
1201
|
+
"feature.sessionTranslation.description": "Translate selected external Agent requests and replies while keeping tools, commands, paths, and original history unchanged. Control DSH native session translation using the switch in the conversation model selector.",
|
|
1202
1202
|
"translation.inputTitle": "Translate requests before sending",
|
|
1203
1203
|
"translation.inputLanguage": "Request language",
|
|
1204
|
-
"translation.outputTitle": "Translate
|
|
1204
|
+
"translation.outputTitle": "Translate the AI’s reasoning and final messages into the language specified below",
|
|
1205
1205
|
"translation.outputLanguage": "Reply language",
|
|
1206
|
-
"translation.modelTitle": "Translation model",
|
|
1206
|
+
"translation.modelTitle": "Translation model pool",
|
|
1207
1207
|
"translation.modelFollowDefault": "Use the default DSH model",
|
|
1208
|
+
"translation.modelResetTitle": "Use the default DSH model?",
|
|
1209
|
+
"translation.modelResetHelp": "This will clear all {count} models and their priority order from the pool, then follow the default DSH model. Continue?",
|
|
1210
|
+
"translation.modelResetConfirm": "Clear pool and use default",
|
|
1208
1211
|
"translation.modelUnavailable": "Saved model is unavailable",
|
|
1209
1212
|
"translation.modelLoading": "Loading available DSH models…",
|
|
1210
1213
|
"translation.modelEmpty": "No DSH text models are available.",
|
|
1211
|
-
"translation.modelHelp": "
|
|
1214
|
+
"translation.modelHelp": "Drag to set priority; the first model is tried first. If all models fail, the original text is kept.",
|
|
1215
|
+
"translation.modelDefaultActive": "No models selected; using the default DSH model.",
|
|
1216
|
+
"translation.modelPriority": "Priority {priority}",
|
|
1217
|
+
"translation.modelPoolCount": "{count} models · ordered by priority",
|
|
1218
|
+
"translation.modelPoolEmpty": "Add models to set up automatic fallback.",
|
|
1219
|
+
"translation.modelAdd": "Add models",
|
|
1220
|
+
"translation.modelRemove": "Remove {model}",
|
|
1221
|
+
"translation.modelDrag": "Reorder {model}",
|
|
1222
|
+
"translation.modelDragHelp": "Drag to reorder, or use the Up and Down arrow keys.",
|
|
1223
|
+
"translation.modelReordered": "{model} moved to priority {priority}",
|
|
1224
|
+
"translation.modelPickerTitle": "Add translation models",
|
|
1225
|
+
"translation.modelPickerHelp": "Select models to add to the end of the pool. Drag them to adjust priority after adding.",
|
|
1226
|
+
"translation.modelSearch": "Search models or providers",
|
|
1227
|
+
"translation.modelPickerCount": "{count} selected",
|
|
1228
|
+
"translation.modelAddSelected": "Add selected ({count})",
|
|
1229
|
+
"translation.modelCancel": "Cancel",
|
|
1230
|
+
"translation.modelNoMatches": "No matching models.",
|
|
1231
|
+
"translation.modelAllAdded": "All available models are already in the pool.",
|
|
1212
1232
|
"translation.detailsTitle": "Translation details",
|
|
1213
1233
|
"translation.viewDetails": "View translation details",
|
|
1214
1234
|
"translation.statusTranslated": "Translated",
|
|
1235
|
+
"translation.statusTranslating": "Translating…",
|
|
1236
|
+
"translation.progressHelp": "Preparing and translating your message. The translation result will be available when this finishes.",
|
|
1215
1237
|
"translation.statusFailed": "Translation failed; original kept",
|
|
1216
1238
|
"translation.statusNotNeeded": "Already in the target language; translation skipped",
|
|
1217
1239
|
"translation.detectedLanguage": "Detected language",
|
|
1218
1240
|
"translation.modelNotUsed": "Not used; translation was unnecessary",
|
|
1219
1241
|
"translation.originalText": "Original text",
|
|
1220
|
-
"translation.translatedText": "
|
|
1242
|
+
"translation.translatedText": "Translation",
|
|
1243
|
+
"translation.actualSentText": "Actual sent text:",
|
|
1221
1244
|
"translation.modelUsed": "Model used",
|
|
1222
1245
|
"translation.modelUnknown": "Model information unavailable",
|
|
1223
1246
|
"translation.modelOfficial": "DeepSeek official",
|
|
@@ -1253,27 +1276,50 @@ window.__ModuleLoader__.load({
|
|
|
1253
1276
|
"lan.fieldMustBeInteger": "{field} 必须是 {minimum} 到 65535 的整数",
|
|
1254
1277
|
"workspace.sessionSettingsSaved": "工作区会话设置已保存",
|
|
1255
1278
|
"feature.sessionTranslation.label": "会话翻译",
|
|
1256
|
-
"feature.sessionTranslation.description": "为选定的外部 Agent
|
|
1279
|
+
"feature.sessionTranslation.description": "为选定的外部 Agent 翻译请求和回复,同时保留工具、命令、路径与原始历史;DSH 原生会话翻译由对话框模型选择器中的会话翻译开关控制。",
|
|
1257
1280
|
"translation.inputTitle": "发送前翻译请求",
|
|
1258
1281
|
"translation.inputLanguage": "请求目标语言",
|
|
1259
|
-
"translation.outputTitle": "
|
|
1282
|
+
"translation.outputTitle": "AI的思考内容和正式消息翻译为以下指定语言",
|
|
1260
1283
|
"translation.outputLanguage": "回复语言",
|
|
1261
|
-
"translation.modelTitle": "
|
|
1284
|
+
"translation.modelTitle": "翻译模型池",
|
|
1262
1285
|
"translation.modelFollowDefault": "跟随 DSH 默认模型",
|
|
1286
|
+
"translation.modelResetTitle": "确认跟随 DSH 默认模型?",
|
|
1287
|
+
"translation.modelResetHelp": "这将清空模型池中的全部 {count} 个模型及其优先级顺序,并改为跟随 DSH 默认模型。是否继续?",
|
|
1288
|
+
"translation.modelResetConfirm": "清空并跟随默认模型",
|
|
1263
1289
|
"translation.modelUnavailable": "已保存的模型当前不可用",
|
|
1264
1290
|
"translation.modelLoading": "正在加载可用的 DSH 模型…",
|
|
1265
1291
|
"translation.modelEmpty": "当前没有可用的 DSH 文本模型。",
|
|
1266
|
-
"translation.modelHelp": "
|
|
1292
|
+
"translation.modelHelp": "拖拽调整优先级,优先使用列表首个模型;全部失败时保留原文。",
|
|
1293
|
+
"translation.modelDefaultActive": "未选择模型,当前跟随 DSH 默认模型。",
|
|
1294
|
+
"translation.modelPriority": "优先级 {priority}",
|
|
1295
|
+
"translation.modelPoolCount": "{count} 个模型 · 按优先级排列",
|
|
1296
|
+
"translation.modelPoolEmpty": "添加模型,配置自动回退顺序。",
|
|
1297
|
+
"translation.modelAdd": "添加模型",
|
|
1298
|
+
"translation.modelRemove": "移除 {model}",
|
|
1299
|
+
"translation.modelDrag": "调整 {model} 的顺序",
|
|
1300
|
+
"translation.modelDragHelp": "拖拽调整顺序,也可使用上下方向键。",
|
|
1301
|
+
"translation.modelReordered": "{model} 已移至优先级 {priority}",
|
|
1302
|
+
"translation.modelPickerTitle": "添加翻译模型",
|
|
1303
|
+
"translation.modelPickerHelp": "选择模型后添加到模型池末尾,添加后可拖拽调整优先级。",
|
|
1304
|
+
"translation.modelSearch": "搜索模型或供应商",
|
|
1305
|
+
"translation.modelPickerCount": "已选择 {count} 个",
|
|
1306
|
+
"translation.modelAddSelected": "添加所选({count})",
|
|
1307
|
+
"translation.modelCancel": "取消",
|
|
1308
|
+
"translation.modelNoMatches": "没有匹配的模型。",
|
|
1309
|
+
"translation.modelAllAdded": "所有可用模型均已添加到模型池。",
|
|
1267
1310
|
"translation.detailsTitle": "翻译详情",
|
|
1268
1311
|
"translation.viewDetails": "查看翻译详情",
|
|
1269
1312
|
"translation.statusTranslated": "已翻译",
|
|
1313
|
+
"translation.statusTranslating": "正在翻译…",
|
|
1314
|
+
"translation.progressHelp": "正在准备并翻译消息,完成后可查看翻译结果。",
|
|
1270
1315
|
"translation.statusFailed": "翻译失败,已保留原文",
|
|
1271
1316
|
"translation.statusNotNeeded": "原文已是目标语言,无需翻译",
|
|
1272
1317
|
"translation.detectedLanguage": "检测到的语言",
|
|
1273
1318
|
"translation.modelNotUsed": "未调用,原文无需翻译",
|
|
1274
1319
|
"translation.originalText": "原文",
|
|
1275
|
-
"translation.translatedText": "译文
|
|
1276
|
-
"translation.
|
|
1320
|
+
"translation.translatedText": "译文",
|
|
1321
|
+
"translation.actualSentText": "实际发送文本:",
|
|
1322
|
+
"translation.modelUsed": "翻译模型",
|
|
1277
1323
|
"translation.modelUnknown": "暂无模型信息",
|
|
1278
1324
|
"translation.modelOfficial": "DeepSeek 官方",
|
|
1279
1325
|
"translation.modelThirdParty": "第三方",
|