| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
refactor(module): 核心仓 Go module 路径改为 github.com/JianFeeeee/HologramAgent 批 1,不含 SDK 仓与目录改名。 - go.mod 第 1 行 module 路径 - 366 个 .go 文件的完整前缀 github.com/JianFeeeee/HomeAgent 机械替换 (857 处,仅完整前缀;展示名/注释里的 HomeAgent 字样留给批 5) - 未改:third_party 目录名、SDK 自身 go.mod module、go.mod replace 目标、 homed/waiter 可执行名、.hmap 后缀 | 7 天前 | |
feat(persona): 首启人格门禁跨通道化 + 内核 persona_set 工具 WebUI 首启向导只覆盖 WebUI 这一条通道,而「人格该问一次」是所有通道的事: 走 QQ / CLI / ACP / 邮件来的人永远见不到那个向导,人格就永远是没确认过。 - 门禁移到 buildSystemPrompt(每轮重建 → WebUI/QQ/CLI/ACP/邮件全覆盖), 以 core.internal.persona_initialized 为准:未确认时要求模型主动询问用户 (默认 / 自定义 / 以后再说),确认后该段消失;personaStore 为 nil 时静默关闭。 - 新增内核内置工具 persona_set(mode=default|custom|later[, content]), 落库逻辑与 WebUI 向导**共用 internal/config**(一个实现 + 两个薄入口: ConfigRegistry 直连 / 插件侧 SettingsAPI),避免两套语义各自漂移。 - AgentConfig 增加 PersonaStore 接口,cmd/homed 用 RegistryPersonaStore 实现。 - 非法输入(未知 mode / custom 空内容)在打标记**之前**拒绝:否则标记置位、 向导被跳过,用户再没机会设。 E2E(隔离实例 + 真实 LLM 往返走 /v1/chat/completions,/var/tmp/persona/e2e.sh)9/9 PASS: 未确认时模型主动询问 → 用户答「用默认的」→ 模型调用 persona_set 落库并置位标记 → 之后不再追问;反向对照(清标记 + 清会话上下文 + 重启)重新开始询问, 排除了「同一段对话里已问过」这一混淆。 | 1 个月前 | |
feat(persona): 首启人格门禁跨通道化 + 内核 persona_set 工具 WebUI 首启向导只覆盖 WebUI 这一条通道,而「人格该问一次」是所有通道的事: 走 QQ / CLI / ACP / 邮件来的人永远见不到那个向导,人格就永远是没确认过。 - 门禁移到 buildSystemPrompt(每轮重建 → WebUI/QQ/CLI/ACP/邮件全覆盖), 以 core.internal.persona_initialized 为准:未确认时要求模型主动询问用户 (默认 / 自定义 / 以后再说),确认后该段消失;personaStore 为 nil 时静默关闭。 - 新增内核内置工具 persona_set(mode=default|custom|later[, content]), 落库逻辑与 WebUI 向导**共用 internal/config**(一个实现 + 两个薄入口: ConfigRegistry 直连 / 插件侧 SettingsAPI),避免两套语义各自漂移。 - AgentConfig 增加 PersonaStore 接口,cmd/homed 用 RegistryPersonaStore 实现。 - 非法输入(未知 mode / custom 空内容)在打标记**之前**拒绝:否则标记置位、 向导被跳过,用户再没机会设。 E2E(隔离实例 + 真实 LLM 往返走 /v1/chat/completions,/var/tmp/persona/e2e.sh)9/9 PASS: 未确认时模型主动询问 → 用户答「用默认的」→ 模型调用 persona_set 落库并置位标记 → 之后不再追问;反向对照(清标记 + 清会话上下文 + 重启)重新开始询问, 排除了「同一段对话里已问过」这一混淆。 | 1 个月前 | |
feat(security,device): security 成为独立内核模块(闸门+策略+限式),device 接管内置工具路由 security(新模块 internal/kernelmod/security) - 凭据闸门:出向拦截成 @{别名}、入向清洗、执行前回填(internal/security/{gate,runtime}.go) - 工具黑白名单 + 沙箱(读写根、网络、.. 逃逸):internal/security/policy.go - 敏感词过滤 + 提示词注入预警(Finding 不带原文):internal/security/content.go - 按主体授权(hard-private 对非内部主体永久拒绝):internal/security/principal.go - 插件命名限式(可选档位,插件声明/内核执行,只能收窄):internal/security/profile.go - 启动装配从 cmd/homed 迁入模块;启动顺序判据改盯真实装配点 device(新模块) - 正式内核模块,Provides FacDevice,KernelState.Device - 内置工具路由表下沉到 internal/toolroute(避免 core↔kernelboot 环), device 保留对外入口;agent 未挂载时退化本地 switch - Agent 侧只留 api.ToolHost/DeviceSurface 适配层 SDK - InjectOptions.SecurityProfile:插件按 inputch 声明本轮安全档位(可选) - InjectOptions.TurnHint:插件注入**本轮事实**,内核以独立 system 消息注入, 不混进用户正文(人设负责怎么说话,TurnHint 只放这一轮成立的事实) - FacilitySecurity / FacilityDevice 提示词 - 内核自带 prompt/skill/工具返回全面英文化(中文提示会让模型行为漂移) - 机制解释下沉到 4 个内置 skill(memory/output/tool-order/plugins), skill 描述压到 80 runes 内(原来 94–108 全被索引截断) - 默认人格模板英文化;[Voice] 段删除,规则并入 persona 块(单一段落) - 历史记忆工具改名 coldcontext_query/commit,图记忆语义改称 stable memory 修复 - tracker: exec mount → unix.Mount(降权运行 + AmbientCapabilities 下才能挂)、 区分 EPERM 与不支持;启动日志说明后果与恢复方式 - healthcheck_kernel 输出瘦身:status.Tools 只给摘要(原 98,989 tokens/151% 预算) - plugin_list 描述讲清 auto_start(按需)与 alive(此刻是否在跑), 明确不能由 alive=false 推断能力不存在 - pluginmgr/webui 去掉写死的 /home/newqqagent 回退路径(env → pluginDir 反推 → 报错) - lua: 盘上适配器与内置版本不一致且无基线时响亮告警(deepseek 流式丢失 tool_calls 导致'模型不调工具'的真因) 测试:go build ./... 通过;go test ./... 60 包全绿 | 2 天前 | |
fix(config): 播种时不再把版本号写进人格文本 + 存量实例一次性去版本化 用户发现:agent 自报版本 **1.0.3**,内核早已 1.3.x。 根因(两层): 1. SeedDefaults 当年用 fmt.Sprintf("…HΔ-Kernel v%s…", meta.Version) **在播种时** 就把版本写进了 core.agent.system_prompt —— 装完即冻住,之后每次升级都不会 去改配置里的文本,于是实例终生自称装机那天的版本。默认模板用 meta.Version 插值本是"不写死"的做法,但**播种 = 把插值结果固化**,等于写死。 2. core.agent.personal_prompt(新人格机制)本身是对的(DefaultPersonaPrompt 无版本字面量,由 TestDefaultPersonaPromptHasNoVersionLiterals 钉住), 但旧键仍在系统提示词里说话,模型就照抄旧键的版本。 改动: - **不再播种** core.agent.system_prompt:留空 → 组装时取 cmd/homed 的内置底座 提示词;人格由 personal_prompt 承载。全新安装不再预置会腐坏的文本。 - 新增 migrateSeededSystemPrompt()(在 SeedDefaults 最前,故不被播种标记早退): 只对"当年那段播种模板"(前缀 + HΔ-Kernel v<数字> 字面量双判据)做 v<数字> → v{{kernel_version}};用户自己写的人格卡一律不碰。 一次性标记 core.internal.system_prompt_deversion_v1 守住幂等 —— 幂等语句不等于语义幂等,重复执行会把用户后来手写的版本号也改掉。 - 与 v1.3.5 的占位符展开配套:占位符在组装系统提示词时按真实构建展开。 回归判据 4 条(prompt_migration_test.go):存量卡被去版本化且正文不动 / 迁移只跑一次 / 用户自写卡不动 / 全新安装不播种该键。 | 1 个月前 | |
feat(security,device): security 成为独立内核模块(闸门+策略+限式),device 接管内置工具路由 security(新模块 internal/kernelmod/security) - 凭据闸门:出向拦截成 @{别名}、入向清洗、执行前回填(internal/security/{gate,runtime}.go) - 工具黑白名单 + 沙箱(读写根、网络、.. 逃逸):internal/security/policy.go - 敏感词过滤 + 提示词注入预警(Finding 不带原文):internal/security/content.go - 按主体授权(hard-private 对非内部主体永久拒绝):internal/security/principal.go - 插件命名限式(可选档位,插件声明/内核执行,只能收窄):internal/security/profile.go - 启动装配从 cmd/homed 迁入模块;启动顺序判据改盯真实装配点 device(新模块) - 正式内核模块,Provides FacDevice,KernelState.Device - 内置工具路由表下沉到 internal/toolroute(避免 core↔kernelboot 环), device 保留对外入口;agent 未挂载时退化本地 switch - Agent 侧只留 api.ToolHost/DeviceSurface 适配层 SDK - InjectOptions.SecurityProfile:插件按 inputch 声明本轮安全档位(可选) - InjectOptions.TurnHint:插件注入**本轮事实**,内核以独立 system 消息注入, 不混进用户正文(人设负责怎么说话,TurnHint 只放这一轮成立的事实) - FacilitySecurity / FacilityDevice 提示词 - 内核自带 prompt/skill/工具返回全面英文化(中文提示会让模型行为漂移) - 机制解释下沉到 4 个内置 skill(memory/output/tool-order/plugins), skill 描述压到 80 runes 内(原来 94–108 全被索引截断) - 默认人格模板英文化;[Voice] 段删除,规则并入 persona 块(单一段落) - 历史记忆工具改名 coldcontext_query/commit,图记忆语义改称 stable memory 修复 - tracker: exec mount → unix.Mount(降权运行 + AmbientCapabilities 下才能挂)、 区分 EPERM 与不支持;启动日志说明后果与恢复方式 - healthcheck_kernel 输出瘦身:status.Tools 只给摘要(原 98,989 tokens/151% 预算) - plugin_list 描述讲清 auto_start(按需)与 alive(此刻是否在跑), 明确不能由 alive=false 推断能力不存在 - pluginmgr/webui 去掉写死的 /home/newqqagent 回退路径(env → pluginDir 反推 → 报错) - lua: 盘上适配器与内置版本不一致且无基线时响亮告警(deepseek 流式丢失 tool_calls 导致'模型不调工具'的真因) 测试:go build ./... 通过;go test ./... 60 包全绿 | 2 天前 | |
perf(webui)+feat(config): 聊天记录写盘节流 + 配置库空闲页回收 两条都是我上一封里点出、你说继续的问题。 ① 聊天记录:每条消息都整段重写 → 节流合并写 原来 persistChatLocked 每次变更就整段重写记录文件,而一轮对话会触发多次 (用户消息、每个工具事件、收尾消息)。200 条上限下文件可达数 MB,单轮就能 放大出几十 MB 写。文件里还留着一个 chatSaveThrottle=3s 常量——声明了但从未 被使用(疑似上次 revert 的遗留),等于节流从来没生效。 现在:persistChatLocked 只置脏 + 唤醒写盘协程;chatPersistLoop 去抖 chatSaveThrottle(3s)、并以 chatSaveMaxDelay(10s) 兜底(持续输出也不会无限拖延); 写盘前把快照拷出来,**不持 chatMu 做文件 IO**;写失败重新标脏下轮重试。 插件 Stop 里调 Handler.Close():停协程 + 强制落最后一次(幂等),否则丢最后一轮。 实测(临时实例,连发 3 条消息):3s 窗口内记录文件**尚未创建**(节流生效); SIGTERM 后文件出现且 6 条(3 用户 + 3 助手,无 LLM key 故为错误回复)全在 ——关停落盘没丢。 ② config.db:SQLite 的 DELETE 不缩文件 → 空闲页够多时 VACUUM 新增 ConfigRegistry.MaybeCompact(minFreeBytes, minRatio):空闲页 >= 1MB 且 占页数 >= 25% 才做一次 VACUUM,避免每次启动都重写整库。库里是 WAL 模式, VACUUM 之后必须再 wal_checkpoint(TRUNCATE),否则主库文件看着没变小。 调用点放在插件加载**之后**(大值的搬走/删除发生在插件 Start 里,之前调没意义)。 实测(一个刚被搬走 5MB 聊天记录的实例): freelist 1288 页 × 4096B;启动日志「配置库已压缩: 5394432 -> 118784 字节」 config.db 5,394,432 → 118,784 字节;记录文件 5,279,491 字节完好未动。 测试:TestChatPersistenceIsThrottled(节流窗口内不写盘 + Close 必落盘 + Close 幂等)、 TestMaybeCompactReclaimsFreePages(删大值后文件确实变小 + 数据完好 + 阈值不达标时不白做功)。 | 1 个月前 | |
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 | 3 天前 | |
refactor(module): 核心仓 Go module 路径改为 github.com/JianFeeeee/HologramAgent 批 1,不含 SDK 仓与目录改名。 - go.mod 第 1 行 module 路径 - 366 个 .go 文件的完整前缀 github.com/JianFeeeee/HomeAgent 机械替换 (857 处,仅完整前缀;展示名/注释里的 HomeAgent 字样留给批 5) - 未改:third_party 目录名、SDK 自身 go.mod module、go.mod replace 目标、 homed/waiter 可执行名、.hmap 后缀 | 7 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 7 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 3 天前 | ||
| 7 天前 |