feat: 适配 kimi-code 0.41.0 —— 移除 file_history 镜像 + 守卫文案更新

- file_history flag 上游已移除(turn-level file history 恒开):
  从 EXPERIMENTAL_FLAGS / env 探测 / FLAG_LABELS / i18n 全链路删除,
  清单回至 9 个;用户 config 残留键被上游静默忽略
- 危险命令守卫行为更新:auto 模式自 0.41.0 起不再拦截危险命令,
  仅 Manual/YOLO 强制询问——开关描述文案(中英)与类型注释同步
This commit is contained in:
KimiSwitch Dev committed 2026-09-05 16:04:21 +08:00
1 parent 4de13ad353
commit 81699e757d
8 files changed
+23 -27

No files matched your search

+3 -4
View File
@@ -690,8 +690,8 @@ pub async fn query_provider_usage(
let base_url = resolve_base_url(provider); let base_url = resolve_base_url(provider);
// NewAPI template: query the gateway's own /api/user/self with the // NewAPI template: query the gateway's own usage endpoints with its
// web-console access token, bypassing usage_kinds entirely. // dedicated credentials, bypassing usage_kinds entirely.
if let Some(cfg) = &provider.usage_config { if let Some(cfg) = &provider.usage_config {
if cfg.template_type == UsageConfig::TEMPLATE_NEWAPI { if cfg.template_type == UsageConfig::TEMPLATE_NEWAPI {
// Err = transient (network) → propagate for retry, same semantics // Err = transient (network) → propagate for retry, same semantics
@@ -1355,7 +1355,7 @@ pub async fn kimi_oauth_poll(
/// the raw values are returned and the truthy check happens on the frontend. /// the raw values are returned and the truthy check happens on the frontend.
#[tauri::command] #[tauri::command]
pub fn get_experimental_env_status() -> HashMap<String, String> { pub fn get_experimental_env_status() -> HashMap<String, String> {
const VARS: [(&str, &str); 12] = [ const VARS: [(&str, &str); 11] = [
("secondary-model", "KIMI_CODE_EXPERIMENTAL_SECONDARY_MODEL"), ("secondary-model", "KIMI_CODE_EXPERIMENTAL_SECONDARY_MODEL"),
("tool-select", "KIMI_CODE_EXPERIMENTAL_TOOL_SELECT"), ("tool-select", "KIMI_CODE_EXPERIMENTAL_TOOL_SELECT"),
( (
@@ -1368,7 +1368,6 @@ pub fn get_experimental_env_status() -> HashMap<String, String> {
("auto_session_title", "KIMI_CODE_EXPERIMENTAL_AUTO_SESSION_TITLE"), ("auto_session_title", "KIMI_CODE_EXPERIMENTAL_AUTO_SESSION_TITLE"),
("remote-control", "KIMI_CODE_EXPERIMENTAL_REMOTE_CONTROL"), ("remote-control", "KIMI_CODE_EXPERIMENTAL_REMOTE_CONTROL"),
("search_worker", "KIMI_CODE_EXPERIMENTAL_SEARCH_WORKER"), ("search_worker", "KIMI_CODE_EXPERIMENTAL_SEARCH_WORKER"),
("file_history", "KIMI_CODE_EXPERIMENTAL_FILE_HISTORY"),
// Non-flag probes consumed by the frontend: // Non-flag probes consumed by the frontend:
("master", "KIMI_CODE_EXPERIMENTAL_FLAG"), ("master", "KIMI_CODE_EXPERIMENTAL_FLAG"),
("legacy", "KIMI_CODE_LEGACY_FLAG"), ("legacy", "KIMI_CODE_LEGACY_FLAG"),
+5 -2
View File
@@ -157,10 +157,13 @@ export function AgentSettingsPanel({ rawOther, onChange }: AgentSettingsPanelPro
</Card> </Card>
<Card title={t("permissionRules")}> <Card title={t("permissionRules")}>
{/* kimi-code 0.40.1 `[permission] dangerous_command_guard`. The env {/* kimi-code `[permission] dangerous_command_guard`. The env
var KIMI_CODE_DANGEROUS_COMMAND_GUARD (literal "true"/"false") var KIMI_CODE_DANGEROUS_COMMAND_GUARD (literal "true"/"false")
outranks this config at runtime; no env-lock UI here (deliberate outranks this config at runtime; no env-lock UI here (deliberate
minimal scope). Absent key = upstream default on. */} minimal scope). Absent key = upstream default on. Since
kimi-code 0.41.0 the guard only gates Manual/YOLO modes —
Auto (never-ask) mode no longer intercepts dangerous
commands. */}
<Checkbox <Checkbox
label={t("permissionDangerousGuard")} label={t("permissionDangerousGuard")}
checked={settings.permission?.dangerous_command_guard ?? true} checked={settings.permission?.dangerous_command_guard ?? true}
-1
View File
@@ -58,7 +58,6 @@ const FLAG_LABELS: Record<string, { name: TranslationKey; desc: TranslationKey }
}, },
"remote-control": { name: "flagRemoteControl", desc: "flagRemoteControlDesc" }, "remote-control": { name: "flagRemoteControl", desc: "flagRemoteControlDesc" },
search_worker: { name: "flagSearchWorker", desc: "flagSearchWorkerDesc" }, search_worker: { name: "flagSearchWorker", desc: "flagSearchWorkerDesc" },
file_history: { name: "flagFileHistory", desc: "flagFileHistoryDesc" },
}; };
/** Validation-error i18n key per engine rule, for the pre-write self-check. */ /** Validation-error i18n key per engine rule, for the pre-write self-check. */
+1 -4
View File
@@ -153,7 +153,7 @@ export const enTranslations: Record<TranslationKey, string> = {
permissionAsk: "Ask", permissionAsk: "Ask",
permissionDangerousGuard: "Dangerous Command Guard", permissionDangerousGuard: "Dangerous Command Guard",
permissionDangerousGuardDesc: permissionDangerousGuardDesc:
"When on (default): Auto mode refuses dangerous commands (rm -rf, shutdown, dd of=, ...) and other modes always prompt; turning it off restores the previous behavior. Env KIMI_CODE_DANGEROUS_COMMAND_GUARD overrides this config", "When on (default): Manual/YOLO modes force a prompt for dangerous commands (rm -rf, shutdown, dd of=, ...) and commands that cannot be statically analyzed; Auto (never-ask) mode no longer intercepts them since kimi-code 0.41.0. Turning it off restores the previous behavior. Env KIMI_CODE_DANGEROUS_COMMAND_GUARD overrides this config",
addRule: "+ Add rule", addRule: "+ Add rule",
addCommonRules: "Add common rules", addCommonRules: "Add common rules",
hooks: "Lifecycle Hooks", hooks: "Lifecycle Hooks",
@@ -482,9 +482,6 @@ export const enTranslations: Record<TranslationKey, string> = {
flagRemoteControlDesc: "Enable the experimental remote control feature", flagRemoteControlDesc: "Enable the experimental remote control feature",
flagSearchWorker: "Search Worker", flagSearchWorker: "Search Worker",
flagSearchWorkerDesc: "Run the kap-server global search backend in a background worker host", flagSearchWorkerDesc: "Run the kap-server global search backend in a background worker host",
flagFileHistory: "File History",
flagFileHistoryDesc:
"Snapshot edited files before/after each turn (last 5 turns across 30 sessions, stored in the session data dir) for real whole-file diffs",
flagDefaultOn: "On by default", flagDefaultOn: "On by default",
lockedByEnv: "Locked by env var", lockedByEnv: "Locked by env var",
masterEnvOnHint: masterEnvOnHint:
+1 -4
View File
@@ -151,7 +151,7 @@ export const zhTranslations = {
permissionAsk: "询问", permissionAsk: "询问",
permissionDangerousGuard: "危险命令防护", permissionDangerousGuard: "危险命令防护",
permissionDangerousGuardDesc: permissionDangerousGuardDesc:
"开启(默认)时:Auto 模式直接拒绝危险命令(rm -rf、shutdown、dd of= 等),其它模式强制询问;关闭后回归旧行为。环境变量 KIMI_CODE_DANGEROUS_COMMAND_GUARD 会覆盖本配置", "开启(默认)时:Manual/YOLO 模式下,危险命令(rm -rf、shutdown、dd of= 等)和无法静态分析的命令会强制询问;自动(永不询问)模式自 kimi-code 0.41.0 起不再拦截。关闭后回归旧行为。环境变量 KIMI_CODE_DANGEROUS_COMMAND_GUARD 会覆盖本配置",
addRule: "+ 添加规则", addRule: "+ 添加规则",
addCommonRules: "添加常用规则", addCommonRules: "添加常用规则",
hooks: "生命周期钩子", hooks: "生命周期钩子",
@@ -477,9 +477,6 @@ export const zhTranslations = {
flagRemoteControlDesc: "启用实验性远程控制功能", flagRemoteControlDesc: "启用实验性远程控制功能",
flagSearchWorker: "搜索 Worker", flagSearchWorker: "搜索 Worker",
flagSearchWorkerDesc: "kap-server 全局搜索的后台 worker 宿主服务", flagSearchWorkerDesc: "kap-server 全局搜索的后台 worker 宿主服务",
flagFileHistory: "文件历史",
flagFileHistoryDesc:
"记录每轮编辑文件的前后快照(最近 30 个会话×最近 5 轮,存于会话数据目录),用于真实的整文件 diff",
flagDefaultOn: "默认开启", flagDefaultOn: "默认开启",
lockedByEnv: "被环境变量锁定", lockedByEnv: "被环境变量锁定",
masterEnvOnHint: masterEnvOnHint:
+5 -6
View File
@@ -455,11 +455,11 @@ describe("validateSubagentPool", () => {
}); });
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// [experimental] — flag registry (kimi-code 0.40.1) + write semantics // [experimental] — flag registry (kimi-code 0.41.0) + write semantics
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
describe("experimental flag registry", () => { describe("experimental flag registry", () => {
it("mirrors the 0.40.1 v2 registry (10 flags incl. file_history)", () => { it("mirrors the 0.41.0 v2 registry (9 flags, file_history removed)", () => {
expect(EXPERIMENTAL_FLAGS.map((f) => f.id)).toEqual([ expect(EXPERIMENTAL_FLAGS.map((f) => f.id)).toEqual([
"secondary-model", "secondary-model",
"tool-select", "tool-select",
@@ -470,11 +470,10 @@ describe("experimental flag registry", () => {
"auto_session_title", "auto_session_title",
"remote-control", "remote-control",
"search_worker", "search_worker",
"file_history",
]); ]);
const fh = EXPERIMENTAL_FLAGS.find((f) => f.id === "file_history"); // Upstream removed the flag in 0.41.0 (turn-level file history is
expect(fh?.envVar).toBe("KIMI_CODE_EXPERIMENTAL_FILE_HISTORY"); // always on), so the adapter must not mirror it either.
expect(fh?.defaultEnabled).toBeUndefined(); expect(EXPERIMENTAL_FLAGS.some((f) => f.id === "file_history")).toBe(false);
}); });
it("secondary-model is on by default since 0.40.1", () => { it("secondary-model is on by default since 0.40.1", () => {
+3 -3
View File
@@ -37,8 +37,9 @@ export interface ExperimentalFlagDef {
* (the per-feature flag.ts files under packages/agent-core-v2/src: * (the per-feature flag.ts files under packages/agent-core-v2/src:
* secondary-model, tool-select, persistence_minidb_readmodel, tower, * secondary-model, tool-select, persistence_minidb_readmodel, tower,
* subagent_fork, wait_for, auto_session_title, remote-control, * subagent_fork, wait_for, auto_session_title, remote-control,
* search_worker, file_history). `acp-v2` was removed upstream and is * search_worker). `acp-v2` was removed upstream and is dropped here;
* dropped here. Keep the env-var list in sync with * `file_history` was removed in kimi-code 0.41.0 (turn-level file
* history is always on, no flag). Keep the env-var list in sync with
* `get_experimental_env_status` in src-tauri/src/commands.rs. */ * `get_experimental_env_status` in src-tauri/src/commands.rs. */
export const EXPERIMENTAL_FLAGS: ExperimentalFlagDef[] = [ export const EXPERIMENTAL_FLAGS: ExperimentalFlagDef[] = [
{ {
@@ -69,7 +70,6 @@ export const EXPERIMENTAL_FLAGS: ExperimentalFlagDef[] = [
envVar: "KIMI_CODE_EXPERIMENTAL_SEARCH_WORKER", envVar: "KIMI_CODE_EXPERIMENTAL_SEARCH_WORKER",
defaultEnabled: true, defaultEnabled: true,
}, },
{ id: "file_history", envVar: "KIMI_CODE_EXPERIMENTAL_FILE_HISTORY" },
]; ];
export const EXPERIMENTAL_MASTER_ENV = "KIMI_CODE_EXPERIMENTAL_FLAG"; export const EXPERIMENTAL_MASTER_ENV = "KIMI_CODE_EXPERIMENTAL_FLAG";
+5 -3
View File
@@ -151,9 +151,11 @@ export interface AgentSettings {
background?: BackgroundConfig; background?: BackgroundConfig;
permission?: { permission?: {
rules?: PermissionRule[]; rules?: PermissionRule[];
/** kimi-code 0.40.1 `[permission]` key. Default true when the key is /** kimi-code `[permission]` key. Default true when the key is
* absent: Auto mode refuses dangerous commands (rm -rf, shutdown, * absent: since 0.41.0 the guard only gates Manual/YOLO modes —
* dd of=, …) and other modes always prompt; false restores the * dangerous commands (rm -rf, shutdown, dd of=, …) and commands
* that cannot be statically analyzed force a prompt, while Auto
* (never-ask) mode no longer intercepts them; false restores the
* previous behavior. Env KIMI_CODE_DANGEROUS_COMMAND_GUARD (literal * previous behavior. Env KIMI_CODE_DANGEROUS_COMMAND_GUARD (literal
* "true"/"false" only) outranks this config. */ * "true"/"false" only) outranks this config. */
dangerous_command_guard?: boolean; dangerous_command_guard?: boolean;