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

@ -512,10 +512,10 @@ func main() {
addr := ":9099"
log.Printf("=== HologramAgent Mock Server ====")
log.Printf("监听地址: http://0.0.0.0%s", addr)
log.Printf("API 基础路径: http://0.0.0.0%s/api/v1/", addr)
log.Printf("SSE 端点: http://0.0.0.0%s/api/v1/chat/events", addr)
log.Printf("设备桥 WS: ws://0.0.0.0%s/api/v1/device/ws", addr)
log.Printf("listening on: http://0.0.0.0%s", addr)
log.Printf("API base path: http://0.0.0.0%s/api/v1/", addr)
log.Printf("SSE endpoint: http://0.0.0.0%s/api/v1/chat/events", addr)
log.Printf("device bridge WS: ws://0.0.0.0%s/api/v1/device/ws", addr)
log.Printf("==============================")
log.Fatal(http.ListenAndServe(addr, server.middleware(mux)))
}

View File

@ -235,7 +235,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
}
defer ws.Close()
log.Printf("[ws] 新设备连接")
log.Printf("[ws] new device connected")
// 处理 hello/bind/cmd 协议
var device *MockDevice
@ -303,7 +303,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
"op": "hello_ack",
"code": 0,
})
log.Printf("[ws] 设备登记: %s (%s) caps=%v", devMeta.DeviceID, devMeta.Name, devMeta.Caps)
log.Printf("[ws] device registered: %s (%s) caps=%v", devMeta.DeviceID, devMeta.Name, devMeta.Caps)
case "bind":
if msg.DeviceID == "" || msg.Token == "" {
@ -327,14 +327,14 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
"op": "bind_ack",
"code": 0,
})
log.Printf("[ws] 设备授权: %s", msg.DeviceID)
log.Printf("[ws] device authorized: %s", msg.DeviceID)
// 绑定成功后,发送全量能力测试命令序列
go func() {
time.Sleep(500 * time.Millisecond)
// 测试 1: screensee 截图
log.Printf("[ws] 发命令 1/7: homeagent-screensee")
log.Printf("[ws] send command 1/7: homeagent-screensee")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_1_screensee_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -345,7 +345,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 2: clipboardsue 写入剪贴板
log.Printf("[ws] 发命令 2/7: homeagent-clipboardsue")
log.Printf("[ws] send command 2/7: homeagent-clipboardsue")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_2_clipboardsue_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -356,7 +356,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 3: clipboardsee 读取剪贴板
log.Printf("[ws] 发命令 3/7: homeagent-clipboardsee")
log.Printf("[ws] send command 3/7: homeagent-clipboardsee")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_3_clipboardsee_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -367,7 +367,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 4: computeruse 鼠标移动(使用非标准 JSON 格式测试兼容性)
log.Printf("[ws] 发命令 4/7: homeagent-computeruse move")
log.Printf("[ws] send command 4/7: homeagent-computeruse move")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_4_computeruse_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -378,7 +378,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 4b: computeruse 鼠标点击(标准 JSON 格式)
log.Printf("[ws] 发命令 4b/7: homeagent-computeruse click")
log.Printf("[ws] send command 4b/7: homeagent-computeruse click")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_4b_click_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -389,7 +389,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 5: speakeruse TTS 播报
log.Printf("[ws] 发命令 5/7: homeagent-speakeruse")
log.Printf("[ws] send command 5/7: homeagent-speakeruse")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_5_speakeruse_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -400,7 +400,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 6: screensue 弹窗显示
log.Printf("[ws] 发命令 6/7: homeagent-screensue(HTML)")
log.Printf("[ws] send command 6/7: homeagent-screensue (HTML)")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_6_screensue_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -411,7 +411,7 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
time.Sleep(800 * time.Millisecond)
// 测试 7: omniparse 解析当前窗口 UI 元素
log.Printf("[ws] 发命令 7/7: homeagent-omniparse")
log.Printf("[ws] send command 7/7: homeagent-omniparse")
ws.WriteJSON(client.CmdMsg{
Op: "cmd",
ReqID: "test_7_omniparse_" + fmt.Sprintf("%d", time.Now().UnixMilli()),
@ -421,40 +421,40 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
}()
case "cmd_result":
log.Printf("[ws] 命令结果: req=%s status=%s", msg.ReqID, msg.Status)
log.Printf("[ws] command result: req=%s status=%s", msg.ReqID, msg.Status)
if msg.Output != "" {
output := msg.Output
if len(output) > 100 {
output = output[:100] + "..."
}
log.Printf("[ws] 输出: %s", output)
log.Printf("[ws] output: %s", output)
}
if msg.Error != "" {
log.Printf("[ws] 错误: %s", msg.Error)
log.Printf("[ws] error: %s", msg.Error)
}
case "data_start":
var ds client.DataStart
json.Unmarshal(msg.Payload, &ds)
log.Printf("[ws] 二进制数据开始: req=%s kind=%s mime=%s total=%d", ds.ReqID, ds.Kind, ds.MIME, ds.Total)
log.Printf("[ws] binary data start: req=%s kind=%s mime=%s total=%d", ds.ReqID, ds.Kind, ds.MIME, ds.Total)
case "data_end":
log.Printf("[ws] 二进制数据结束: req=%s status=%s", msg.ReqID, msg.Status)
log.Printf("[ws] binary data end: req=%s status=%s", msg.ReqID, msg.Status)
case "speech_start":
log.Printf("[ws] TTS 音频开始: req=%s", msg.ReqID)
log.Printf("[ws] TTS audio start: req=%s", msg.ReqID)
case "speech_end":
log.Printf("[ws] TTS 音频结束: req=%s", msg.ReqID)
log.Printf("[ws] TTS audio end: req=%s", msg.ReqID)
case "status":
log.Printf("[ws] 状态上报: %s -> %s", msg.DeviceID, msg.Status)
log.Printf("[ws] status report: %s -> %s", msg.DeviceID, msg.Status)
case "event":
log.Printf("[ws] 事件上报: %s type=%s", msg.DeviceID, string(msg.Payload))
log.Printf("[ws] event report: %s type=%s", msg.DeviceID, string(msg.Payload))
default:
log.Printf("[ws] 未知消息类型: %s", msg.Op)
log.Printf("[ws] unknown message type: %s", msg.Op)
}
}
@ -468,5 +468,5 @@ func (s *MockServer) handleDeviceWS(w http.ResponseWriter, r *http.Request) {
}
s.mu.Unlock()
}
log.Printf("[ws] 设备断开")
log.Printf("[ws] device disconnected")
}