feat: 适配 kimi-code 0.40.1 —— flag 清单/优先级语义/危险命令守卫
- flag 清单 9→10:新增 file_history、search_worker;secondary-model 0.40.1 起默认开启(defaultEnabled) - env 探测补齐为 12 项元组(10 flag + master + legacy),修正此前 tower/subagent_fork/wait_for/auto_session_title 四项漏探 - 优先级语义跟随上游 flagService:单 flag env > [experimental] 显式值 > master env(仅强制开)> 默认。master env 不再锁定 UI;setExperimentalFlag 增加 explicitFalse 路径,关闭默认开/master 强开的 flag 时写字面 false - 权限设置新增 dangerous_command_guard 开关(默认开,写 [permission] 蛇形键;env KIMI_CODE_DANGEROUS_COMMAND_GUARD 运行时覆盖 config) - 新增 11 个测试(注册表/写语义/守卫读写)
This commit is contained in:
1 parent
6a7c8f5393
commit
86a128efea
10 files changed
+339
-47
No files matched your search
@@ -1,8 +1,12 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
EXPERIMENTAL_FLAGS,
|
||||
getExperimentalFlags,
|
||||
getSecondaryModel,
|
||||
getSubagentModelPool,
|
||||
isExperimentalFlagSet,
|
||||
removeSubagentPoolEntry,
|
||||
setExperimentalFlag,
|
||||
setSecondaryModelOnly,
|
||||
setSubagentDefault,
|
||||
setSubagentForce,
|
||||
@@ -449,3 +453,76 @@ describe("validateSubagentPool", () => {
|
||||
expect(errors).toContainEqual({ key: "forceExcludesModels" });
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// [experimental] — flag registry (kimi-code 0.40.1) + write semantics
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe("experimental flag registry", () => {
|
||||
it("mirrors the 0.40.1 v2 registry (10 flags incl. file_history)", () => {
|
||||
expect(EXPERIMENTAL_FLAGS.map((f) => f.id)).toEqual([
|
||||
"secondary-model",
|
||||
"tool-select",
|
||||
"persistence_minidb_readmodel",
|
||||
"tower",
|
||||
"subagent_fork",
|
||||
"wait_for",
|
||||
"auto_session_title",
|
||||
"remote-control",
|
||||
"search_worker",
|
||||
"file_history",
|
||||
]);
|
||||
const fh = EXPERIMENTAL_FLAGS.find((f) => f.id === "file_history");
|
||||
expect(fh?.envVar).toBe("KIMI_CODE_EXPERIMENTAL_FILE_HISTORY");
|
||||
expect(fh?.defaultEnabled).toBeUndefined();
|
||||
});
|
||||
|
||||
it("secondary-model is on by default since 0.40.1", () => {
|
||||
expect(
|
||||
EXPERIMENTAL_FLAGS.find((f) => f.id === "secondary-model")?.defaultEnabled
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("setExperimentalFlag", () => {
|
||||
const rawExp = (section: Record<string, unknown>) => ({
|
||||
experimental: section,
|
||||
});
|
||||
|
||||
it("enabling writes true; disabling a default-off flag deletes the key", () => {
|
||||
const on = setExperimentalFlag({}, "tool-select", true) as {
|
||||
experimental: Record<string, unknown>;
|
||||
};
|
||||
expect(on.experimental["tool-select"]).toBe(true);
|
||||
const off = setExperimentalFlag(on, "tool-select", false) as Record<
|
||||
string,
|
||||
unknown
|
||||
>;
|
||||
expect(off).not.toHaveProperty("experimental"); // empty section dropped
|
||||
});
|
||||
|
||||
it("disabling a default-on flag with explicitFalse writes a literal false", () => {
|
||||
const next = setExperimentalFlag(
|
||||
rawExp({ wait_for: true }),
|
||||
"wait_for",
|
||||
false,
|
||||
{ explicitFalse: true }
|
||||
) as { experimental: Record<string, unknown> };
|
||||
expect(next.experimental.wait_for).toBe(false);
|
||||
expect(isExperimentalFlagSet(next, "wait_for")).toBe(true);
|
||||
expect(getExperimentalFlags(next).wait_for).toBe(false);
|
||||
});
|
||||
|
||||
it("an explicit false coexists with other flags and keeps the section", () => {
|
||||
const next = setExperimentalFlag(
|
||||
rawExp({ "secondary-model": false }),
|
||||
"tower",
|
||||
true,
|
||||
{ explicitFalse: true }
|
||||
) as { experimental: Record<string, unknown> };
|
||||
expect(next.experimental).toEqual({
|
||||
"secondary-model": false,
|
||||
tower: true,
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user