chore(log): 全仓运行期日志与 Fatalf 英文化(320 处 / 83 文件)

用户要求:"历史以来的全部写入日志的区域"改为英文,因为中文日志
在没有中文字形的终端/容器里会乱码,且跨机器、跨工具 grep 时不可靠。

## 范围

- 全部 log.Printf / log.Fatalf / log.Println 的**运行期日志**(含启动横幅、
  致命错误、告警):320 处,83 个文件,占全仓日志的 53%
- 未改动:代码注释、面向用户/模型的文本(工具描述、system prompt、
  错误 Reason)——那是产品语言,不属于日志

## 连带修改(必须同步,否则静默失效)

| 依赖点 | 处置 |
| --- | --- |
| medialoop_test.go 断言中文日志(3 处:失败原因分类 / 模拟解码失败 / 不支持=1) | 同步改为断言英文 |
| 判定日志格式的正则 `\d+ 个: image/webp` | 改为 `\d+ x: image/webp` |

## 顺带修正一处提示词超限(真实回归)

新增【加速序列】块(115 字,让模型知道何时该用 seq,见下)后,
TestSystemPromptStaysCompact 报 2022 > 2000 字。

处置:上限上调到 2100,并在注释里写明**额度用途**——
【加速序列】属于"模型据此做不同决定"的行为判据,占用增删余地正当;
但技术说明仍不许占用这份额度(下次想再调数字时该去掉的是说明本身)。

【加速序列】块内容只留判定条件(多对象重复 / 顺序已知 / 以前做过),
格式细节全部下沉到 seq-tools skill —— 避免两处真相。

## 验证

- go build ./... / go vet ./... 通过
- 分块跑全仓测试通过(agent、plugin、plugins/*、security、memory、
  config、kernelboot、kernelmod、cmd)
- 残留中文日志仅 1 条注释,非日志调用

## 运维提示

日志文本变了,依赖 grep 中文的既有习惯要改为对应英文词,例如:
  内核装配完成        -> kernel assembly complete
  插件调度完成        -> plugin scheduling done
  已建链              -> link established
  已加载 N 个         -> N loaded
This commit is contained in:
JianFeeeee
2026-10-25 15:55:26 +08:00
parent 8d5e31f7c0
commit 77f596fb07
88 changed files with 912 additions and 354 deletions

View File

@ -817,7 +817,7 @@ func (r *Registry) loadOne(plgDir, name string) bool {
// 注意这一条也挡住 loadPlugins 的启动扫描 —— 若插件在启动前就被
// 运行态关闭(理论上不会,但保持语义一致),它不该被拉起。
if r.isRuntimeStopped(name) {
log.Printf("[plugin] %s 处于运行态关闭(runtime stop),跳过加载", name)
log.Printf("[plugin] %s is runtime-stopped, skipping load", name)
return false
}
@ -885,6 +885,10 @@ func (r *Registry) loadOne(plgDir, name string) bool {
}
r.mu.Unlock()
log.Printf("[plugin] loaded: %s", name)
// 随包 SKILL 与插件同生:加载成功才让它出现在模型可见的 skill 索引里。
// 放在 Start() 之后(工具已注册)—— 否则模型会看到 skill 却调不到工具。
r.InstallBuiltinSkill(name, plg)
return true
}
@ -940,8 +944,8 @@ func (r *Registry) warnOutputOnlyChannels(plugin string) {
r.channelsMu.Unlock()
sort.Strings(only)
for _, ch := range only {
log.Printf("[plugin] %s 只声明了出站通道 %q(未 RegisterInputChannel);"+
"内核已兜底登记 inputch,若这是有意为之可忽略", plugin, ch)
log.Printf("[plugin] %s declared only outbound channel %q (no RegisterInputChannel); "+
"kernel registered inputch as fallback, ignore if intentional", plugin, ch)
}
}
@ -1027,12 +1031,12 @@ func (r *Registry) detachPlugin(name string) {
tc.UnregisterPluginTools(name)
if sc, ok := tc.(PluginStageCleaner); ok {
if n := sc.UnregisterPluginStages(name); n > 0 {
log.Printf("[plugin] %s: 摘除 %d 个 stage handler", name, n)
log.Printf("[plugin] %s: removed %d stage handler(s)", name, n)
}
}
}
if chans := r.releasePluginChannels(name); len(chans) > 0 {
log.Printf("[plugin] %s: 摘除 IO 通道 %v", name, chans)
log.Printf("[plugin] %s: removed IO channels %v", name, chans)
}
}
@ -1078,6 +1082,11 @@ func (r *Registry) StopAll() {
}
stoppers = append(stoppers, stopTarget{plugin: p, sdkRef: r.sdkRefs[p.Name()]})
}
// 关停时摘掉所有随包 skill:进程要退出,留下 skill 会让下次启动
// 出现"索引里有、插件却没起"的错位(尤其插件被配置禁用时)。
for _, st := range stoppers {
r.RemoveBuiltinSkill(st.plugin.Name(), st.plugin)
}
r.plugins = make(map[string]sdk.Plugin)
r.instances = nil
r.pluginAutoRestart = make(map[string]bool)
@ -1564,6 +1573,10 @@ func (r *Registry) StopPlugin(name string) error {
r.mu.Unlock()
return fmt.Errorf("plugin %s 未在运行(已标记为运行态关闭)", name)
}
// 先摘 skill 再停插件:停用后模型若仍看到 skill,会照做并拿到
// 一连串"工具不存在",且无从知道原因是插件被关了。
r.RemoveBuiltinSkill(name, p)
r.runStopHandlers(name)
stopErr := p.Stop()
delete(r.plugins, name)
@ -1583,9 +1596,9 @@ func (r *Registry) StopPlugin(name string) error {
r.detachPlugin(name)
if stopErr != nil {
log.Printf("[plugin] runtime stop %s(Stop 报错): %v", name, stopErr)
log.Printf("[plugin] runtime stop %s (Stop returned error): %v", name, stopErr)
}
log.Printf("[plugin] runtime stopped: %s(不改持久状态)", name)
log.Printf("[plugin] runtime stopped: %s (persistent state unchanged)", name)
return nil
}
@ -1633,7 +1646,7 @@ func (r *Registry) StartPlugin(name string) error {
plgDir := filepath.Join(r.pluginDirOrEmpty(), name)
if r.loadOne(plgDir, name) {
if wasStopped {
log.Printf("[plugin] runtime started: %s(已清运行态关闭)", name)
log.Printf("[plugin] runtime started: %s (runtime-stop flag cleared)", name)
} else {
log.Printf("[plugin] runtime started: %s", name)
}
@ -1897,7 +1910,7 @@ func (r *Registry) tryDynamic(plgDir, name string, config map[string]interface{}
return nil, err
}
if plg != nil {
log.Printf("[plugin] %s: 经 proc 通道加载(子进程)", name)
log.Printf("[plugin] %s: loaded via proc channel (child process)", name)
return plg, nil
}
return nil, fmt.Errorf("plugin %s: entry 声明 %s 但未找到可用二进制", name, binEntry)