mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 14:57:38 +00:00
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 包全绿
83 lines
2.9 KiB
Go
83 lines
2.9 KiB
Go
package webui
|
||
|
||
// 数据目录一致性端点。
|
||
//
|
||
// ## 为什么需要它
|
||
//
|
||
// 内核有**两处**数据目录来源,且不等价:
|
||
//
|
||
// -data <dir> ← systemd 单元,决定 ks.DataDir
|
||
// core.daemon.data_dir ← 数据库,决定 ks.Cfg.Daemon.DataDir
|
||
//
|
||
// 不一致时数据会**分裂**:图记忆(memory/graph.db)在 -data 那个目录,
|
||
// 而文本/知识/文档在 DB 那个目录 ⇒ 检索跨目录、备份会漏。
|
||
//
|
||
// 生产当前两者一致,所以从没暴露;但 WebUI 允许改 core.daemon.data_dir
|
||
// 而**没有任何提示** —— 用户改完重启就会发现"数据丢了"。
|
||
//
|
||
// ## 只读 + 给命令,绝不自动改
|
||
//
|
||
// 本端点只返回诊断与**可直接粘贴执行的修复命令**(里面已内联 sed 替换)。
|
||
// 不代用户改 systemd 单元:静默改单元比不提示更危险 —— 改错了服务起不来,
|
||
// 而用户不知道是谁改的。修复必须由人执行。
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
"github.com/JianFeeeee/HologramAgent/internal/systemd"
|
||
)
|
||
|
||
// dataDirs 取两个数据目录来源。
|
||
//
|
||
// runtime ← SettingsAPI.DataDir()(= -data,systemd 单元给的那个)
|
||
// config ← ConfigAPI.Get().Daemon.DataDir(= DB 里 core.daemon.data_dir)
|
||
//
|
||
// 任一不可用就返回空串 —— 调用方据此判断"无法判定",而不是拿空串
|
||
// 去比出"不一致"的假警报。
|
||
func (h *Handler) dataDirs() (runtimeDir, configDir string) {
|
||
if h.settings != nil {
|
||
runtimeDir = h.settings.DataDir()
|
||
}
|
||
if h.config != nil {
|
||
if cfg := h.config.Get(); cfg != nil {
|
||
configDir = cfg.Daemon.DataDir
|
||
}
|
||
}
|
||
return runtimeDir, configDir
|
||
}
|
||
|
||
// handleDataDirStatus 处理 GET /api/v1/system/data-dir
|
||
//
|
||
// 返回:
|
||
//
|
||
// runtime_dir 当前进程实际用的(-data)
|
||
// config_dir 数据库里 core.daemon.data_dir
|
||
// in_sync 两者是否一致
|
||
// describe 人读的一句话说明
|
||
// sync_command 不一致时的修复命令(内联 sed,可直接复制执行)
|
||
func (h *Handler) handleDataDirStatus(w http.ResponseWriter, r *http.Request) {
|
||
if r.Method != http.MethodGet {
|
||
writeJSONError(w, http.StatusMethodNotAllowed, "只接受 GET")
|
||
return
|
||
}
|
||
runtimeDir, configDir := h.dataDirs()
|
||
st := systemd.State{
|
||
RuntimeDataDir: runtimeDir,
|
||
ConfigDataDir: configDir,
|
||
}
|
||
out := map[string]interface{}{
|
||
"runtime_dir": runtimeDir,
|
||
"config_dir": configDir,
|
||
"in_sync": st.InSync(),
|
||
"describe": st.Describe(),
|
||
"under_systemd": systemd.IsUnderSystemd(),
|
||
}
|
||
if !st.InSync() {
|
||
// 只在真正不一致时给命令 —— 一致时给命令会让人以为该做点什么
|
||
out["sync_command"] = st.SyncCommand(configDir)
|
||
out["warning"] = "数据目录不一致:图记忆在 runtime_dir,文本/知识/文档在 config_dir。" +
|
||
"不修复则检索跨目录、备份会漏。请执行 sync_command(勿手改单元,生产用 drop-in 覆盖 ExecStart)。"
|
||
}
|
||
writeJSON(w, http.StatusOK, out)
|
||
}
|