Files
HomeAgent/internal/kernelmod/agent
JianFeeeee 9b2c74bc49 refactor(config): 默认值单一来源 —— ConfigDef.Default,不再各调用点重复硬编码
## 起因(用户质疑)

我把 offload 的触发阈值从 5 分钟改成 1 分钟时,同一个默认值散落在四处:

	defaultOffloadBusyAfter = 5 * time.Minute     (agent/core 常量)
	set("core.agent.offload_busy_after", "5m")    (seedDBValues 播种)
	reg(ConfigDef{... Default: "5m" ...})         (seedCoreDefs 定义)
	GetDuration("...", 5*time.Minute)             (kernelmod 读取点)

用户问:「为什么不是单一从配置读取,而是硬编码在源码中?」

答:这不是合理的分层,是重复。同一份默认值四处字面量,改一处漏两处
就是**静默的行为漂移** —— 不报错,只是某些路径用 5m、另一些用 1m。

## 改动

**① 默认值的唯一来源 = ConfigDef.Default**

	GetInt/GetDuration/GetBool/GetString 新增 defDefault():
	DB 里查不到行时,从已注册的 ConfigDef.Default 取,而不是用调用方传的字面量。
	调用点现在写 GetDuration(key, 0) —— 那个 0 只是「连 ConfigDef 都没注册」
	时的兜底,正常路径永远用不到。

**② 删掉 seedDBValues 里 54 行重复的 set(),改由 reg() 落库**

	reg() 原本只 `r.defs[k]=&d`(只登记不落库),默认值另由 set() 写一遍。
	现在 reg() = registerDefLocked(登记 + 落库)。
	为此抽出 registerDefLocked:SeedDefaults 已持 r.mu,直接调 RegisterDef
	会自死锁(sync.Mutex 不可重入)。

**③ 8 个键必须「只登记、不播种」,新增 regMeta()**

	core.agent.system_prompt              播种会把版本号冻死在 DB 里
	core.defaults.llm_endpoints           空默认值
	core.memory.multimodal_space.options.*  provider 私有选项

	第一版没有区分,一改就红了两条既有判据:
	  TestSeedDefaultsDoesNotSeedSystemPrompt
	  TestSeedDefaultsDoesNotInjectIntoLegacyInstall
	后者尤其重要:老安装升级被注入新默认值 = 静默加载 1.8GB 向量模型。

**④ seeded 集合:回退只对「本次真播种过」的键生效**

	这是修 ③ 过程中暴露的更根本的问题。GetXxx 无条件回退到
	ConfigDef.Default 会让**老安装**读到新版本的默认值 —— 即使 DB 里
	根本没有那一行。加了 seeded map 区分:
	  全新安装 → 键已播种 → 回退 ConfigDef.Default(正常)
	  老安装   → 新键没播种 → 返回零值(不注入)

## 顺带修的

offload_busy_after 的 Type 从 "string" 改成 "duration" —— 它本来就是时长,
用 string 时 WebUI 只能给文本框,拿不到时长控件。

## 判据

沿用既有判据,不新增。新写的 offload_threshold_test.go 已删除 ——
它断言「四处默认值必须一致」,方向是**鼓励重复**,与本次目标相反。
2026-10-18 10:16:53 +08:00
..