From 6bea130639f7a839355f5d3dd0059d5cdf73699e Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Thu, 22 Oct 2026 20:37:05 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(memory):=20=E5=9B=9E=E5=A1=AB=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=BF=85=E9=A1=BB=E7=85=A7=E5=B8=B8=E5=BD=92=E6=A1=A3?= =?UTF-8?q?=20=E2=80=94=E2=80=94=20=E7=BA=A0=E6=AD=A3=20NoMemory=20?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E8=A2=AB=E9=94=99=E8=AF=AF=E6=89=A9=E5=A4=A7?= =?UTF-8?q?=E5=88=B0=E5=AD=98=E5=82=A8=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户指出:doc 召回部分需要回填记忆,因为 doc 召回后原文在 doc 层已经删除了。 ## 我上一轮的错误(PR #22) 把「工具输出不进记忆」与「回填事件不归档」塞进了同一个 NoMemory 标记: doc_query → Consume(L2 副本删除)→ 回填 L1(标记 NoMemory) → L1 裁掉它 → Prune 跳过归档(错误实现) → 三层都不在 ⇒ 内容永久丢失 Consume 已经把 L2 副本删掉,**L1 是唯一副本**。裁掉时不归档 = 丢数据。 这不是自激防护,这是把数据丢掉当成防护。 ## 正确区分(两件事不能共用一个标记) | 对象 | 进计算层 | 进归档 | 理由 | |---|---|---|---| | doc_query 的**工具返回值**(正文摘录) | ❌ | ❌ | 它是事件的摘录副本,再向量化 = 重复注入 ⇒ 自激 | | **回填的事件本身**(原文) | ❌ | ✅ **必须** | L2 副本已删,L1 是唯一副本;不归档即丢失 | ## 修法 ContextEvent.NoMemory 语义定为「**不参与计算,照常归档**」, 与 ToolDef.NoMemory 一致:只影响计算层,不影响存储层。 自激的入口在"重新计算向量"那一侧(textForVector 返回空), 不在"归档"这一侧 —— 删掉 Prune 里的跳过逻辑。 ## 判据(改写了那条断言错误行为的判据) TestSelfExcite_RestoredEventsNotReArchived 现在断言三件事: 1. 回填事件带 NoMemory 标记且未被向量化(不参与计算) 2. 前提成立:L2 里确实已无该事件(Consume 删掉了) 3. ★ 被裁掉后必须能落回 L2(否则内容永久丢失) 变异验证: - Prune 重新跳过 NoMemory ⇒ 红,报「三层都不在,内容永久丢失」 - restoreDocEvents 不置 NoMemory ⇒ 红(会重复加权) ## 验证 - go build ./... / go vet ./... 干净 - go test ./... -count=1:58 包 0 失败 --- internal/agent/core/context.go | 47 ++++++++++------------ internal/agent/core/selfexcite_test.go | 54 +++++++++++++++++++------- internal/agent/core/toolcall.go | 32 ++++++++++----- internal/agent/core/tooldefs.go | 26 ++++++++++++- 4 files changed, 108 insertions(+), 51 deletions(-) diff --git a/internal/agent/core/context.go b/internal/agent/core/context.go index 3aa32f6c..8ab48792 100644 --- a/internal/agent/core/context.go +++ b/internal/agent/core/context.go @@ -35,18 +35,19 @@ type ContextEvent struct { ToolsUsed []string `json:"tools_used,omitempty"` ToolResults []ToolResultItem `json:"tool_results,omitempty"` - // NoMemory 标记这条事件**不参与记忆计算与再归档**。 + // NoMemory 标记这条事件**不参与记忆计算**(不向量化、不提关键词、不蒸馏), + // 但**照常参与归档**(离开 L1 时会写回 L2)。 // - // ★ 为 doc_query 的回填而设(2026-10-22)。回填是把 L2 的历史事件 - // 按原时间戳放回 L1 —— 它们**已经**在记忆体系里了。若不加标记: + // ★ 与 ToolDef.NoMemory 语义一致:只影响计算层,不影响存储层。 // - // ① 计算层:它们会被重新向量化、参与 Prune 打分 ⇒ 因为与当前输入 - // 相关而倾向被保留,挤掉真正的新事件; - // ② 归档层:Prune 会把它们**再次**归档回 L2 ⇒ 下次 doc_query - // 又召回同一批 ⇒ 块在 L1↔L2 之间反复搬迁,自激震荡。 + // ★★ 为什么不能顺手把归档也关掉(2026-10-22 踩过的坑): // - // 语义与 ToolDef.NoMemory / ChannelDef.NoMemory 一致: - // **原文保留在上下文里可读**,只是不进计算、不再产生新记忆。 + // doc_query 的 Consume 已经**从 L2 删除**了原文。若回填事件在 L1 + // 被裁掉时又不归档,它就**三层都不在**了 —— 内容被永久丢弃。 + // L1 是它最后的落脚点,必须能落回去。 + // + // 所以"回填事件不再归档"是错的。它确实该重新归档(那才是迁移闭环), + // 该抑制的只是"重新计算向量/再次进蒸馏"—— 那才是自激的入口。 NoMemory bool `json:"no_memory,omitempty"` // --- 原生多模态记忆 --- // 一等记忆块:块本身随事件在层间迁移,身份不变,不建引用计数。 @@ -231,7 +232,9 @@ func (c *RelevanceContext) load() { func textForVector(evt *ContextEvent, toolDefLookup func(name string) *sdk.ToolDef, channelDefLookup func(name string) (sdk.ChannelDef, bool)) string { // 事件自带 NoMemory(doc_query 回填的历史事件):不进计算层。 - // 原文仍在上下文里可读,只是不参与向量化/关键词/蒸馏。 + // + // 为什么回填事件不参与计算:它们的内容刚刚在 L2 里被向量化过一次, + // 再算一次只会让"同一内容"在向量空间里被重复加权。但它们**照常归档**。 if evt.NoMemory { return "" } @@ -538,24 +541,14 @@ func (c *RelevanceContext) PruneWithProtected(currentInput string, topK int, doc archived := 0 if docStore != nil && len(archive) > 0 { - // ★ 回填事件(NoMemory)**不再归档回 L2**。 + // ★ 回填事件(NoMemory)**照常归档** —— 这是数据不丢的关键。 // - // 这是自激震荡的根:doc_query 把事件从 L2 取到 L1,Prune 又把它们 - // 归档回 L2 —— 下一轮 doc_query 再召回同一批,块在两层间反复搬迁。 - // 它们本来就在记忆体系里(来源可能是 L2 或 L3),无需重新落库。 - filtered := archive[:0] - skippedNoMemory := 0 - for _, s := range archive { - if s.event != nil && s.event.NoMemory { - skippedNoMemory++ - continue - } - filtered = append(filtered, s) - } - archive = filtered - if skippedNoMemory > 0 { - log.Printf("[agent] prune: 跳过 %d 条回填事件(NoMemory,它们在记忆体系里已有归属)", skippedNoMemory) - } + // 曾经在这里跳过它们(理由是"防自激"),那是错的: + // doc_query 的 Consume 已经把 L2 副本删掉了,L1 是唯一副本。 + // 跳过归档 = 裁掉即丢失(L1、L2、L3 三层都不在)。 + // + // 自激的入口不在"归档"这一侧,而在"重新计算向量"那一侧 —— + // 那已经由 textForVector 里 `if evt.NoMemory { return "" }` 挡住。 } if docStore != nil && len(archive) > 0 { entries := make([]document.ContextEntry, len(archive)) diff --git a/internal/agent/core/selfexcite_test.go b/internal/agent/core/selfexcite_test.go index 8cfecd81..8f4d6f35 100644 --- a/internal/agent/core/selfexcite_test.go +++ b/internal/agent/core/selfexcite_test.go @@ -52,21 +52,30 @@ func TestSelfExcite_DocQueryDeclaresNoMemory(t *testing.T) { } } -// ② 回填事件必须带 NoMemory,且不得被 Prune 再次归档回 L2。 +// ② 回填事件必须带 NoMemory(不参与计算),但**必须照常归档**(数据不丢)。 // -// 变异:restoreDocEvents 不置 NoMemory ⇒ 红(Prune 会把它归档回 L2)。 +// ★ 这里曾经写反过:要求"不得被 Prune 再归档回 L2"。 +// +// doc_query 的 Consume 已经把 L2 副本删掉,L1 是唯一副本 —— +// 不归档就等于三层都不在,内容永久丢失。 +// +// 变异: +// +// · restoreDocEvents 不置 NoMemory ⇒ 它会参与计算(重复加权) +// · Prune 跳过 NoMemory 事件 ⇒ 内容丢失(本判据要抓这个) func TestSelfExcite_RestoredEventsNotReArchived(t *testing.T) { a := newToolTestAgent(t) + const marker = "自激测试:这条会被归档" // 先归档一条事件到 L2 archiveEvents(t, a, []ContextEvent{{ Timestamp: time.Now().Add(-2 * time.Hour), Source: "webui", - Input: "自激测试:这条会被归档", + Input: marker, Response: "然后被 doc_query 取回", }}) - // 召回 + // 召回(Consume 会把 L2 副本删掉) out := a.executeDocTool(agentAPI.ToolCall{ Name: "doc_query", Arguments: map[string]interface{}{"query": "自激测试 归档", "top_k": float64(3)}, @@ -75,13 +84,16 @@ func TestSelfExcite_RestoredEventsNotReArchived(t *testing.T) { t.Fatalf("未召回:%s", out) } - // 回填的事件必须带 NoMemory 标记 + // ① 回填事件必须带 NoMemory(不参与计算) restored := 0 for _, e := range a.context.Recent(0) { - if e.Source == "webui" && strings.Contains(e.Input, "自激测试") { + if e.Source == "webui" && strings.Contains(e.Input, marker) { restored++ if !e.NoMemory { - t.Error("回填事件没有 NoMemory 标记 —— Prune 会把它再归档回 L2,形成自激回路") + t.Error("回填事件没有 NoMemory 标记 —— 它会再被向量化/蒸馏,同一内容重复加权") + } + if len(e.Vector) > 0 { + t.Error("回填事件被向量化了(NoMemory 未生效)") } } } @@ -89,10 +101,20 @@ func TestSelfExcite_RestoredEventsNotReArchived(t *testing.T) { t.Fatal("没有回填任何事件") } - // ③ 真实验证回路:再 Prune 一次。 - // - // 关键不是"文档数不变"(filler 本身也会被归档),而是 - // **L2 里不得出现含回填事件内容的新文档**。 + // ② L1 是唯一副本(L2 已被 Consume 删除)——确认这一点 + for _, d := range a.docStore.RecentDocs(1000) { + if !d.HasEvents() { + continue + } + for _, ev := range d.Events { + in, _, _ := ev.InOut() + if strings.Contains(in, marker) { + t.Fatalf("L2 里仍有该事件(%s)—— 前提不成立,本判据失去意义", d.ID) + } + } + } + + // ③ ★ 关键:裁掉它时**必须能落回 L2**,否则内容永久丢失 for i := 0; i < 14; i++ { a.context.Append(ContextEvent{ Timestamp: time.Now(), @@ -103,18 +125,22 @@ func TestSelfExcite_RestoredEventsNotReArchived(t *testing.T) { } a.context.Prune("当前输入", 2, a.docStore) + var foundInL2 bool for _, d := range a.docStore.RecentDocs(1000) { if !d.HasEvents() { continue } for _, ev := range d.Events { in, _, _ := ev.InOut() - if strings.Contains(in, "自激测试") { - t.Errorf("回填事件被 Prune 又归档回了 L2(doc=%s)—— 自激回路成立:\n"+ - "下次 doc_query 会再召回同一批,块在 L1↔L2 之间反复搬迁", d.ID) + if strings.Contains(in, marker) { + foundInL2 = true } } } + if !foundInL2 { + t.Error("回填事件被裁掉后没有归档回 L2 —— Consume 已删除原副本," + + "L1 是唯一副本,不归档就是内容永久丢失(三层都不在)") + } } // ④ 回填事件不得参与 Prune 的相关性打分(否则会挤掉真正的新事件)。 diff --git a/internal/agent/core/toolcall.go b/internal/agent/core/toolcall.go index edf9eff7..28943eab 100644 --- a/internal/agent/core/toolcall.go +++ b/internal/agent/core/toolcall.go @@ -327,9 +327,21 @@ func (a *Agent) executeToolCallInner(tc agentAPI.ToolCall, channel string, turnS // 工具是动态注册的,"不存在"是常态而非异常(插件未加载/已卸载/崩溃)。 // 文案必须让模型知道该做什么,而不是含糊的"执行失败"—— // 后者会让模型反复重试同一个不存在的名字。 - return toolOutcome{Text: fmt.Sprintf("工具 %s 不存在或未注册:它可能属于未加载/已崩溃的插件。"+ - "先调 get_plugin_tools(\"\") 看当前可用工具,或 output_list_channels 看通道;"+ - "确认名称无误后再调用", tc.Name)} + // ★ 提示必须**先指向 skill**(2026-10-22)。 + // + // 按需插件(auto_start=false)的工具不在初始清单里,而它的 + // skill 正是"这个插件是什么、要怎么用、需要先启动什么"的唯一 + // 说明(SDK autostart.go 的 OnDemandNeedsSkill 就是这条契约)。 + // + // 此前这里只提 get_plugin_tools / output_list_channels, + // 一个字没提 skill —— 模型调用了、失败了,提示却不告诉它去 + // 看说明书,于是只能盲目试工具名。 + return toolOutcome{Text: fmt.Sprintf("工具 %s 不存在或未注册(它可能属于未加载的插件)。按这个顺序处理:\n"+ + "1. 先看【可用技能】里有没有相关的:有就先 skill_info(\"技能名\") 读全文 —— "+ + "skill 里写着该插件的正确用法、已知坑,以及需要先启动哪个插件;\n"+ + "2. 没有相关 skill 就调 get_plugin_tools(\"\") 查当前可用的插件与工具;\n"+ + "3. 通道相关的不确定时用 output_list_channels 看有哪些通道。\n"+ + "确认之后再调用,不要反复重试同一个名字。", tc.Name)} } return toolOutcome{Text: fmt.Sprintf("工具 %s 执行失败: %v", tc.Name, err)} } @@ -1305,13 +1317,15 @@ func (a *Agent) restoreDocEvents(d *document.Doc) int { Source: ev.Source, Input: input, Response: response, - // ★ 回填事件**不参与记忆计算、不再归档回 L2**。 + // ★ 回填事件**不参与记忆计算**,但**照常参与归档**。 // - // 它们本来就在记忆体系里(来自 L2,可能已蒸馏进 L3)。 - // 不标记的后果是自激震荡: - // doc_query 从 L2 取出 → Prune 因相关而保留它们、 - // 把真正的新事件挤掉 → 下一轮 Prune 又归档回 L2 → - // 再被 doc_query 召回 ⇒ 块在 L1↔L2 之间反复搬迁。 + // 为什么要标记:它们的内容刚在 L2 里被向量化过一次, + // 再算一次会让同一内容在向量空间里被重复加权(自激)。 + // + // ★★ 为什么仍要归档(不能顺手关掉): + // Consume 已经把 L2 副本删了,L1 是**唯一副本**。 + // 裁掉时不归档 = 三层都不在 = 内容永久丢失。 + // (这个错犯过:曾用同一个 NoMemory 同时关掉计算与归档。) NoMemory: true, ToolsUsed: append([]string(nil), ev.ToolsUsed...), ToolResults: func() []ToolResultItem { diff --git a/internal/agent/core/tooldefs.go b/internal/agent/core/tooldefs.go index 0c76b8f2..d500b7e1 100644 --- a/internal/agent/core/tooldefs.go +++ b/internal/agent/core/tooldefs.go @@ -251,7 +251,19 @@ func (a *Agent) buildSystemPrompt(memContext string, userInput string) string { // 主动 skill_info 拉取全文按文档执行 if a.skillIndex != nil { if idx := a.skillIndex.SkillIndex(); idx != "" { - prompt = appendPromptBlock(prompt, "【可用技能】以下是已安装的原生技能。当用户请求与某技能描述匹配时,\n先用 skill_info(\"技能名\") 拉取全文,再严格按文档步骤执行:\n"+idx) + // ★ 措辞从"用户请求匹配某技能时"改成"**调用插件工具之前**"。 + // + // 旧措辞把人带偏成"只有用户点名要某个技能才去读",而 skill 的真实 + // 用途是**工具的使用说明**:里面写着参数怎么填、有哪些已知坑 + // (例如 QQ 的"拉私聊历史只传 user_id,不要传 group_id")、 + // 以及按需插件要先 plugin_start 拉起。 + // + // 不看 skill 就直接调工具,是这个仓库反复吃过亏的一类错误。 + prompt = appendPromptBlock(prompt, "【可用技能】这些是插件配套的**使用说明书**,不是可选装饰。\n"+ + "**规则**:准备调用某个插件的工具(或工具调用失败、参数不确定)时,**先看这里有没有同名技能的**"+ + "(如 file-tools / cmd-tools / qq-tools),用 skill_info(\"技能名\") 读全文,"+ + "再严格按其中步骤与坑位说明执行。技能里通常会写明:工具该怎么调、需要先启动哪个插件、常见报错怎么读。\n"+ + "用户明确要求用某技能时同样先 skill_info 读全文,不要凭名字猜做法。\n\n"+idx) } } @@ -328,6 +340,18 @@ func (a *Agent) buildToolCatalog() string { var sb strings.Builder sb.WriteString("\n\n【可用工具能力】\n") sb.WriteString("工具按插件分组注册。需要某个插件的具体工具时,调用 get_plugin_tools(\"{插件名}\") 获取该插件的完整工具定义(名称/参数/用途)。\n") + // ★ 说明"按需插件"这回事(2026-10-22)。 + // + // 插件有两种启动形态(SDK autostart.go): + // 常驻(auto_start 缺省/true)—— 工具一开始就在清单里 + // 按需(auto_start=false) —— 初始不在清单里,要靠 plugin_start 拉起 + // + // 不说清这件事的后果:模型看到"清单里没有某能力"就断定"没有这个能力", + // 于是绕道去用别的工具硬凑,或者干脆告诉用户做不到。 + sb.WriteString("★ **工具清单里没有 ≠ 没有这个能力**:部分插件是**按需加载**的," + + "它们的工具一开始不在清单里。需要时先 get_plugin_tools(\"插件名\") 看它有哪些工具、" + + "再 plugin_start(\"插件名\") 把它拉起来,工具就会出现。对应的 skill(同类名字或同名技能)" + + "会说明这个插件是常驻还是按需、以及拉起后怎么用。\n") for _, plg := range order { sb.WriteString(fmt.Sprintf("- %s (%d 个工具)", plg, byPlugin[plg])) if d := pluginDesc[plg]; d != "" { From f256098c9f69b4b920c8141be58406e5b05d341d Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Thu, 22 Oct 2026 20:49:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=E5=85=A8=E9=9D=A2=E6=94=B9?= =?UTF-8?q?=E5=90=8D=E4=B8=BA=20HologramAgent=20+=20=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=8D=E6=8A=80=E6=9C=AF=E5=86=85=E5=AE=B9=E4=B8=8B=E6=B2=89?= =?UTF-8?q?=E5=88=B0=20skill/=E5=B7=A5=E5=85=B7=E6=8F=8F=E8=BF=B0=20+=20?= =?UTF-8?q?=E4=BF=AE=2021=20=E5=A4=84=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## ① 全面改名 HomeAgent → HologramAgent 仓库已改名,但代码与文档里仍有大量旧名。本次按"用户能看到的优先"全量替换: - 用户可见:登录页标题/页脚、默认人格第一句、CLI 状态输出、启动日志、 plugin_install 的工具描述、AI 图片插件的 User-Agent - 文档与脚本:README、assets/docs、docs/zh、deploy/*.sh、.github/workflows - 鸿蒙工程:cmd/ohos/HomeAgent → cmd/ohos/HologramAgent(git mv) 目录内的 module/app 描述同步;**证书路径原样保留** (default_HomeAgent_xxx.cer/p7b/p12 是签名材料的实际文件名,改了会找不到证书) - 插件元数据:plugin.json 的 author ★ 必须保持原样的两处(改了会坏): · legacySeededPromptSignature = "你是 HomeAgent 的看板娘「小宅」…" —— 那是识别历史播种人格卡的**原文锚点**,改了就识别不出旧数据 · 公开 SDK 的 ProxyAuthHomeAgent = "homeagent" —— 那是 SDK 契约里的值,属独立仓库,本仓不改 ## ② 修 21 处乱码(U+FFFD) 这些是历史编辑留下的编码破坏,全在注释里,例如: 「赌注重下���遍」→「赌注重下一遍」 「「不��滤」」 →「「不过滤」」 「**待��退场**」→「**待退场**」 ★ 保留 providers/chineseclip/tokenizer.go 里的 2 处:那是**故意**用 U+FFFD 演示"非法 UTF-8 字节被归一成 U+FFFD",不是乱码。 ## ③ 提示词技术内容下沉(用户:技术性内容应该收敛到 skill 与 -help 中) 实测系统提示词 2309 字,其中两段几乎全是**模型无法据以行动的实现细节**: 【工具执行顺序】1272 字(ParallelSafe 声明、批内降级、batchRunnable 判据…) 【三层记忆】 1069 字(L1/L2/L3 编号、消费式删除、向量空间、指纹…) 收敛后 **2309 → 1723 字(-25%)**,保留的全是"模型据此做什么不同的事": 工具顺序:默认并行 / 不要依赖先后 / 同通道保序 / 写类工具可能串行 三层记忆:时序里能看最近 / doc_query 把历史事件按原始时间戳插回时序 / 关系用 memory_recall / 成文知识用 knowledge_search 判断口径写进判据:新加一段提示词前先问"模型会据此做什么不同的事", 答不上来就该进 skill 或工具描述。 ## 判据 prompt_memory_test.go 新增 2 条: - TestSystemPromptHasNoImplementationJargon 黑名单:ParallelSafe / batchRunnable / 消费式 / DenseCosine / fingerprint / 向量空间 / 批内降级 / 自激 - TestSystemPromptStaysCompact:上限 2000 字(当前 1723) 变异:把 "ParallelSafe 声明、批内降级" 加回工具顺序段 ⇒ 第一条立刻红。 ## 验证 - go build ./... / go vet ./... 干净 - go test ./... -count=1:58 包 0 失败 - make check-client-versions:客户端与内核版本一致 --- .github/workflows/ci.yml | 8 +-- .github/workflows/release.yml | 8 +-- .../homeagent_architecture/content.md | 4 +- assets/skills/commondev-discipline/SKILL.md | 4 +- assets/skills/commondev-discipline/skill.json | 2 +- assets/skills/knowledge-base/SKILL.md | 14 ++--- .../skills/knowledge-base/scripts/kb_tree.sh | 4 +- assets/skills/knowledge-base/skill.json | 4 +- cmd/gui/DESIGN-NOTES.md | 14 ++--- cmd/gui/endpoint-align.test.mjs | 2 +- cmd/gui/main.js | 28 +++++----- cmd/gui/package.json | 4 +- cmd/gui/renderer/app.js | 24 ++++----- cmd/gui/renderer/index.html | 8 +-- cmd/gui/silent-start.test.mjs | 2 +- cmd/mock-server/main.go | 6 +-- cmd/mock-server/ws.go | 4 +- .../{HomeAgent => HologramAgent}/.gitignore | 0 .../AppScope/app.json5 | 2 +- .../resources/base/element/string.json | 2 +- .../resources/base/media/app_icon.png | Bin .../resources/base/media/background.png | Bin .../resources/base/media/foreground.png | Bin .../resources/base/media/layered_image.json | 0 .../resources/dark/media/background.png | Bin .../build-profile.json5.example | 0 .../entry/hvigorfile.ts | 0 .../entry/oh-package-lock.json5 | 0 .../entry/oh-package.json5 | 2 +- .../entry/src/main/ets/common/ApiClient.ets | 0 .../entry/src/main/ets/common/AppVersion.ets | 0 .../src/main/ets/common/AttachmentImage.ets | 0 .../src/main/ets/common/AttachmentMeta.ets | 0 .../entry/src/main/ets/common/BridgeCaps.ets | 0 .../src/main/ets/common/BridgeProtocol.ets | 0 .../src/main/ets/common/BridgeRouter.ets | 0 .../entry/src/main/ets/common/ChatFormat.ets | 0 .../entry/src/main/ets/common/ChatHistory.ets | 0 .../entry/src/main/ets/common/ChatSession.ets | 0 .../entry/src/main/ets/common/ChatSse.ets | 2 +- .../entry/src/main/ets/common/ChatStore.ets | 0 .../entry/src/main/ets/common/ConnStore.ets | 0 .../entry/src/main/ets/common/Constants.ets | 0 .../src/main/ets/common/DeviceBridge.ets | 4 +- .../main/ets/common/DeviceBridgeSession.ets | 2 +- .../entry/src/main/ets/common/DeviceModel.ets | 0 .../src/main/ets/common/MarkdownParser.ets | 0 .../src/main/ets/common/NavBarController.ets | 0 .../src/main/ets/common/NavStackRegistry.ets | 0 .../entry/src/main/ets/common/PluginApi.ets | 0 .../src/main/ets/common/PluginStatus.ets | 0 .../src/main/ets/common/ScreensueHtml.ets | 0 .../src/main/ets/common/SettingsModel.ets | 0 .../entry/src/main/ets/common/SseClient.ets | 0 .../entry/src/main/ets/common/StageTrail.ets | 0 .../entry/src/main/ets/common/StatusStore.ets | 2 +- .../entry/src/main/ets/common/UserError.ets | 4 +- .../main/ets/components/AppearancePane.ets | 0 .../src/main/ets/components/Attachment.ets | 0 .../ets/components/BackendSettingsPane.ets | 0 .../src/main/ets/components/ChatAttachBar.ets | 0 .../src/main/ets/components/ChatBubble.ets | 0 .../src/main/ets/components/ChatComposer.ets | 0 .../src/main/ets/components/ChatStream.ets | 0 .../src/main/ets/components/ChatToolCard.ets | 0 .../main/ets/components/ConnectionsPane.ets | 2 +- .../src/main/ets/components/DevicePanes.ets | 2 +- .../main/ets/components/DeviceRootEntries.ets | 0 .../ets/components/GradientBackground.ets | 6 +-- .../src/main/ets/components/MarkdownView.ets | 0 .../src/main/ets/components/MotionBase.ets | 0 .../src/main/ets/components/PageTopBar.ets | 0 .../main/ets/components/PluginDetailPane.ets | 0 .../main/ets/components/PluginListView.ets | 0 .../main/ets/components/PluginsOverlays.ets | 0 .../src/main/ets/components/RuntimePanel.ets | 0 .../src/main/ets/components/ScreensuePage.ets | 0 .../main/ets/components/SettingsEditor.ets | 0 .../main/ets/components/SettingsEntryCard.ets | 0 .../src/main/ets/components/SettingsHome.ets | 0 .../ets/components/SettingsRootEntries.ets | 0 .../main/ets/components/StaticMarkdown.ets | 0 .../src/main/ets/components/StatusCards.ets | 0 .../entry/src/main/ets/components/SubPage.ets | 0 .../src/main/ets/components/ToastBar.ets | 0 .../main/ets/entryability/EntryAbility.ets | 18 +++---- .../entry/src/main/ets/model/Model.ets | 2 +- .../entry/src/main/ets/pages/ChatPage.ets | 0 .../entry/src/main/ets/pages/DevicePage.ets | 0 .../entry/src/main/ets/pages/Index.ets | 0 .../entry/src/main/ets/pages/PluginsPage.ets | 0 .../entry/src/main/ets/pages/SettingsPage.ets | 0 .../entry/src/main/module.json5 | 4 +- .../main/resources/base/element/color.json | 0 .../main/resources/base/element/string.json | 2 +- .../main/resources/base/media/app_icon.png | Bin .../resources/base/media/ic_arrow_back.svg | 0 .../src/main/resources/base/media/ic_bolt.svg | 0 .../main/resources/base/media/ic_check.svg | 0 .../resources/base/media/ic_chevron_down.svg | 0 .../resources/base/media/ic_chevron_right.svg | 0 .../main/resources/base/media/ic_close.svg | 0 .../resources/base/media/ic_devices_multi.svg | 0 .../main/resources/base/media/ic_error.svg | 0 .../src/main/resources/base/media/ic_file.svg | 0 .../main/resources/base/media/ic_gateway.svg | 0 .../main/resources/base/media/ic_image.svg | 0 .../src/main/resources/base/media/ic_link.svg | 0 .../main/resources/base/media/ic_offline.svg | 0 .../main/resources/base/media/ic_phone.svg | 0 .../src/main/resources/base/media/ic_plug.svg | 0 .../src/main/resources/base/media/ic_plus.svg | 0 .../main/resources/base/media/ic_pulse.svg | 0 .../main/resources/base/media/ic_refresh.svg | 0 .../main/resources/base/media/ic_reload.svg | 0 .../src/main/resources/base/media/ic_send.svg | 0 .../main/resources/base/media/ic_sparkle.svg | 0 .../src/main/resources/base/media/ic_stop.svg | 0 .../main/resources/base/media/ic_tab_chat.svg | 0 .../resources/base/media/ic_tab_devices.svg | 0 .../resources/base/media/ic_tab_plugins.svg | 0 .../resources/base/media/ic_tab_settings.svg | 0 .../resources/base/media/ic_tab_status.svg | 0 .../main/resources/base/media/ic_theme.svg | 0 .../src/main/resources/base/media/ic_tool.svg | 0 .../src/main/resources/base/media/ic_tune.svg | 0 .../main/resources/base/media/start_icon.png | Bin .../resources/base/profile/main_pages.json | 0 .../base/profile/network_config.json | 0 .../main/resources/dark/element/color.json | 0 .../hvigor/hvigor-config.json5 | 0 .../hvigorfile.ts | 0 .../oh-package-lock.json5 | 0 .../oh-package.json5 | 2 +- cmd/ohos/README.md | 8 +-- cmd/waiter/device.go | 18 +++---- cmd/waiter/gateway_discover.go | 4 +- cmd/waiter/gateway_discover_test.go | 2 +- cmd/waiter/main.go | 6 +-- cmd/waiter/tui.go | 2 +- deploy/packaging/package-windows.sh | 2 +- deploy/packaging/packaging_test.go | 4 +- deploy/scripts/sync-client-versions.sh | 4 +- docs/zh/ci-cd-runbook.md | 12 ++--- internal/agent/core/argvalidate.go | 2 +- internal/agent/core/builtin_toolapi.go | 2 +- internal/agent/core/overflow_test.go | 6 +-- internal/agent/core/plugins.go | 2 +- internal/agent/core/prompt_memory_test.go | 50 ++++++++++++++++++ internal/agent/core/resident_test.go | 2 +- internal/agent/core/spawn.go | 2 +- internal/agent/core/toolcall.go | 2 +- internal/agent/core/tooldefs.go | 44 ++++++++------- internal/agent/io/channel.go | 2 +- internal/agent/personal_test.go | 4 +- internal/config/registry.go | 2 +- internal/kernelmod/agent/mod.go | 2 +- internal/knowledge/import_test.go | 2 +- internal/memory/abstain_test.go | 2 +- internal/memory/distill/drift.go | 2 +- internal/memory/fusion_test.go | 2 +- .../memory/legacy_retire_precondition_test.go | 2 +- internal/memory/migrate_entities_test.go | 2 +- internal/meta/meta.go | 6 +-- internal/plugin/manifest.go | 4 +- internal/plugin/manifest_timeout_test.go | 2 +- internal/plugin/proc/shm.go | 4 +- internal/plugin/proc/shmalloc_windows.go | 6 +-- internal/plugins/ai_image/plugin.go | 2 +- .../plugins/clawhubadapter/manager/main.js | 8 +-- internal/plugins/clawhubadapter/registry.go | 4 +- .../clawhubadapter/simulator/openclaw_cli.js | 10 ++-- internal/plugins/cli/plugin.go | 2 +- internal/plugins/kbtree/plugin.go | 6 +-- internal/plugins/kbtree/scope.go | 2 +- internal/plugins/localuse/plugin.go | 8 +-- internal/plugins/pluginmgr/plugin.go | 2 +- internal/plugins/remotedevice/binary_test.go | 4 +- internal/plugins/remotedevice/device.go | 2 +- internal/plugins/remotedevice/plugin.go | 2 +- internal/plugins/seq/plugin_test.go | 2 +- internal/plugins/webui/auth_hardening_test.go | 2 +- internal/plugins/webui/dashboard.html | 8 +-- internal/plugins/webui/dashboard.js | 6 +-- internal/plugins/webui/handler.go | 6 +-- internal/plugins/webui/handler_openai.go | 2 +- .../webui/handler_sse_protocol_test.go | 6 +-- internal/plugins/webui/handler_test.go | 2 +- internal/plugins/webui/openai_compat_test.go | 2 +- internal/plugins/webui/plugin.go | 2 +- internal/plugins/webui/proxy.go | 8 +-- internal/plugins/webui/starmap_vendor_test.go | 2 +- internal/sdk/status.go | 2 +- internal/supervisor/daemon.go | 2 +- internal/systemd/migrate.go | 2 +- pkg/embedding/embedding.go | 2 +- pkg/generation/generation.go | 2 +- providers/ollama/generator.go | 2 +- providers/qwen3vl/embedder.go | 2 +- scripts/capability-bench/PLAN.md | 14 ++--- scripts/capability-bench/README.md | 6 +-- scripts/capability-bench/tasks.example.json | 2 +- scripts/capability-bench/tasks.zerobasis.json | 6 +-- scripts/verify_deploy.sh | 4 +- 204 files changed, 310 insertions(+), 252 deletions(-) rename cmd/ohos/{HomeAgent => HologramAgent}/.gitignore (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/app.json5 (92%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/base/element/string.json (65%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/base/media/app_icon.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/base/media/background.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/base/media/foreground.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/base/media/layered_image.json (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/AppScope/resources/dark/media/background.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/build-profile.json5.example (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/hvigorfile.ts (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/oh-package-lock.json5 (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/oh-package.json5 (73%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ApiClient.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/AppVersion.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/AttachmentImage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/AttachmentMeta.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/BridgeCaps.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/BridgeProtocol.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/BridgeRouter.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ChatFormat.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ChatHistory.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ChatSession.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ChatSse.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ChatStore.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ConnStore.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/Constants.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/DeviceBridge.ets (98%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/DeviceBridgeSession.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/DeviceModel.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/MarkdownParser.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/NavBarController.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/NavStackRegistry.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/PluginApi.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/PluginStatus.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/ScreensueHtml.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/SettingsModel.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/SseClient.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/StageTrail.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/StatusStore.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/common/UserError.ets (98%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/AppearancePane.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/Attachment.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/BackendSettingsPane.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ChatAttachBar.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ChatBubble.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ChatComposer.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ChatStream.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ChatToolCard.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ConnectionsPane.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/DevicePanes.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/DeviceRootEntries.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/GradientBackground.ets (94%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/MarkdownView.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/MotionBase.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/PageTopBar.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/PluginDetailPane.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/PluginListView.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/PluginsOverlays.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/RuntimePanel.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ScreensuePage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/SettingsEditor.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/SettingsEntryCard.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/SettingsHome.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/SettingsRootEntries.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/StaticMarkdown.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/StatusCards.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/SubPage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/components/ToastBar.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/entryability/EntryAbility.ets (88%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/model/Model.ets (99%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/pages/ChatPage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/pages/DevicePage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/pages/Index.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/pages/PluginsPage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/ets/pages/SettingsPage.ets (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/module.json5 (92%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/element/color.json (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/element/string.json (86%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/app_icon.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_arrow_back.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_bolt.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_check.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_chevron_down.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_chevron_right.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_close.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_devices_multi.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_error.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_file.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_gateway.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_image.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_link.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_offline.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_phone.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_plug.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_plus.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_pulse.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_refresh.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_reload.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_send.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_sparkle.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_stop.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tab_chat.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tab_devices.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tab_plugins.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tab_settings.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tab_status.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_theme.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tool.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/ic_tune.svg (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/media/start_icon.png (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/profile/main_pages.json (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/base/profile/network_config.json (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/entry/src/main/resources/dark/element/color.json (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/hvigor/hvigor-config.json5 (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/hvigorfile.ts (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/oh-package-lock.json5 (100%) rename cmd/ohos/{HomeAgent => HologramAgent}/oh-package.json5 (84%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6fe5b34b..eb5bc3ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -# HomeAgent 主仓 CI。 +# HologramAgent 主仓 CI。 # # 设计原则:**CI 里跑的每一条命令,都是本地已实测通过的命令**。 # 不写「应该有用来试试」的步骤 —— 未验证的 CI 步骤会把假红灯变成常态, @@ -235,11 +235,11 @@ jobs: # # 取值依据(实测 2026-10-21,直连不带代理,非推测): # https://gitcode.com/JianFeeeee/HologramAgent → 200 ← 当前用这个 - # https://gitcode.com/JianFeeeee/HomeAgent → 301 ← 旧名,跳转到上面 + # https://gitcode.com/JianFeeeee/HologramAgent → 301 ← 旧名,跳转到上面 # https://gitcode.com/JianFeeeee/hologramagentsdk → 200(SDK 仓,另一对象) # https://gitcode.com/JianFeeeee/homeagentsdk → 404 # - # 背景:gitcode 侧镜像仓已由 HomeAgent 改名为 HologramAgent(与 GitHub + # 背景:gitcode 侧镜像仓已由 HologramAgent 改名为 HologramAgent(与 GitHub # 主仓同名)。旧地址仍 301 跳转,跟随后也能到达,但走重定向 ⇒ 别再用它。 # 判定两仓同一对象:两地址 git ls-remote 的 refs 列表 md5 相同。 # @@ -263,7 +263,7 @@ jobs: with: # 必须取完整历史:镜像可能在任意旧提交上,快进需要共同祖先。 fetch-depth: 0 - # ★ 改名(HomeAgent → HologramAgent)后的必然过渡态:gitcode 上的镜像仓 + # ★ 改名(HologramAgent → HologramAgent)后的必然过渡态:gitcode 上的镜像仓 # 是**另一个账号下的独立仓库**,改 GitHub 仓名不会自动建出它。 # 若不在这里显式探测,缺少目标仓时只会得到 git 的原始报错 # ("repository not found" 混在 push 输出里),看不出是「仓没建」。 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3806e5b0..ccbfc63e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -308,7 +308,7 @@ jobs: [ "$PRE" = "true" ] && FLAGS+=(--prerelease) gh release create "$TAG" \ --title "$TAG" \ - --notes "HomeAgent $VERSION + --notes "HologramAgent $VERSION 产物清单与校验见 SHA256SUMS。 - \`hologramagent_${VERSION}_linux_amd64.tar.gz\` — 内核 + CLI + GUI 打包 @@ -361,11 +361,11 @@ jobs: # # 取值依据(实测 2026-10-21,直连不带代理,非推测): # https://gitcode.com/JianFeeeee/HologramAgent → 200 ← 当前用这个 - # https://gitcode.com/JianFeeeee/HomeAgent → 301 ← 旧名,跳转到上面 + # https://gitcode.com/JianFeeeee/HologramAgent → 301 ← 旧名,跳转到上面 # https://gitcode.com/JianFeeeee/hologramagentsdk → 200(SDK 仓,另一对象) # https://gitcode.com/JianFeeeee/homeagentsdk → 404 # - # 背景:gitcode 侧镜像仓已由 HomeAgent 改名为 HologramAgent(与 GitHub + # 背景:gitcode 侧镜像仓已由 HologramAgent 改名为 HologramAgent(与 GitHub # 主仓同名)。旧地址仍 301 跳转,跟随后也能到达,但走重定向 ⇒ 别再用它。 # 判定两仓同一对象:两地址 git ls-remote 的 refs 列表 md5 相同。 # @@ -390,7 +390,7 @@ jobs: name: linux-amd64 path: dist # ★ 前置检查:gitcode 镜像仓是否存在。 - # 改名(HomeAgent → HologramAgent)后 gitcode 目标仓需要**人工新建**, + # 改名(HologramAgent → HologramAgent)后 gitcode 目标仓需要**人工新建**, # 不探的话失败会埋在 push/curl 的原始输出里,看不出是「仓没建」。 # 语义:token 未配 = 可选项跳过(上一步);token 有但仓不存在 = 硬失败。 # diff --git a/assets/knowledge/homeagent_architecture/content.md b/assets/knowledge/homeagent_architecture/content.md index 62ec3d9a..b7c17a4b 100644 --- a/assets/knowledge/homeagent_architecture/content.md +++ b/assets/knowledge/homeagent_architecture/content.md @@ -1,8 +1,8 @@ -HomeAgent 是完全独立自研的新一代 Agent 框架。 +HologramAgent 是完全独立自研的新一代 Agent 框架。 ## 架构总览 -HomeAgent 采用内核 + 插件双层架构: +HologramAgent 采用内核 + 插件双层架构: ``` 外部输入(QQ/Web/CLI) diff --git a/assets/skills/commondev-discipline/SKILL.md b/assets/skills/commondev-discipline/SKILL.md index 952bff6f..ba5353e3 100644 --- a/assets/skills/commondev-discipline/SKILL.md +++ b/assets/skills/commondev-discipline/SKILL.md @@ -2,7 +2,7 @@ name: commondev-discipline description: commondev 主管式多仓库开发流水线的使用与开发纪律。当你要为某个工程开一条分支、把工程派给一个下属 agent、或用 pi 拉起执行 agent 干活时必读。核心动作:为每个工程对话新建驻留式子 agent 并把该工程的一对通道划给它(否则所有工程都挤在根 agent 上)。**git 托管平台的操作(Gitea/GitHub/GitLab)不在插件里,而在本文** —— 用 enc_shell + 保存的凭据调 curl/CLI 完成。也含 hmap 插件开发与部署纪律。 version: 2.0.0 -author: HomeAgent +author: HologramAgent --- # commondev 纪律(主管模式 · 工程对话 · 平台操作) @@ -176,7 +176,7 @@ enc_shell(command="curl -s -X POST -H \"Authorization: token @{t}\" -H 'Content- | 角色 | 是谁 | 干什么 | |---|---|---| | **人** | 老板 | 只与主管对接 | -| **主管** | 你(长期驻留的 HomeAgent 主 agent) | 拆任务、**定义判据**、复审、决定合入 | +| **主管** | 你(长期驻留的 HologramAgent 主 agent) | 拆任务、**定义判据**、复审、决定合入 | | **执行 agent** | 按工程拉起的一个 pi / dsh 实例 | 在某棵工作树里干活 | | **commondev 插件** | 外部独立插件 | 仓库/凭据/分支/PR/测试,全部机械化操作 | diff --git a/assets/skills/commondev-discipline/skill.json b/assets/skills/commondev-discipline/skill.json index 362a271c..5459d972 100644 --- a/assets/skills/commondev-discipline/skill.json +++ b/assets/skills/commondev-discipline/skill.json @@ -2,5 +2,5 @@ "name": "commondev-discipline", "description": "commondev 主管式多仓库开发流水线的使用与开发纪律:为每个工程对话新建驻留子并划入其通道、投递必须落同一 session、复核必须含变异阶段;以及 hmap 插件开发纪律(plg.json、SDK 版本、产物形态、Serial/ParallelSafe、外部插件能力边界、凭据与孤儿清理)", "version": "1.0.0", - "author": "HomeAgent" + "author": "HologramAgent" } diff --git a/assets/skills/knowledge-base/SKILL.md b/assets/skills/knowledge-base/SKILL.md index 993a29a8..8fa2c461 100644 --- a/assets/skills/knowledge-base/SKILL.md +++ b/assets/skills/knowledge-base/SKILL.md @@ -1,16 +1,16 @@ --- name: knowledge-base -description: 按分类树检索 HomeAgent 知识库。当需要查阅项目知识、架构约定、历史决策,或用户提到"知识库/knowledge/知识库有哪些/这个项目的约定是什么"时使用。支持树形导航、分类内检索、以图搜知识。 +description: 按分类树检索 HologramAgent 知识库。当需要查阅项目知识、架构约定、历史决策,或用户提到"知识库/knowledge/知识库有哪些/这个项目的约定是什么"时使用。支持树形导航、分类内检索、以图搜知识。 version: 1.1.0 -author: HomeAgent +author: HologramAgent --- ## Usage -先看树定位分类,再做定向检索。接口由 HomeAgent 的 `kbtree` 插件提供, +先看树定位分类,再做定向检索。接口由 HologramAgent 的 `kbtree` 插件提供, 只读、需 token。详见下方"接入"。 -HomeAgent 知识库按**分类树**组织(`tech/go/并发`、`life/sleep` …)。 +HologramAgent 知识库按**分类树**组织(`tech/go/并发`、`life/sleep` …)。 ### 何时用 @@ -102,7 +102,7 @@ curl -s -H "$AUTH" "$BASE/search?q=goroutine&limit=5" 若知识条目挂了图片,它在**多模态统一空间**里有向量,能被图片本身检索到。 前提是宿主已接入多模态向量 provider(否则只是记录了媒体,不参与召回)。 -判断是否就绪:HomeAgent 自身的知识库接口会返回稠密路状态 +判断是否就绪:HologramAgent 自身的知识库接口会返回稠密路状态 (`dense.enabled` / `dense.ready` / `dense.total`)。若为未启用, **不要承诺"能以图搜"**。 @@ -132,13 +132,13 @@ curl -s -H "$AUTH" "$BASE/search?q=goroutine&limit=5" - **分类不存在返回 404**,并在 `categories` 字段里附上现有分类 —— 用它自查 拼写。 - **`items=0` 只是不要正文**,`total_count` 仍准确,可用于判断规模。 -- **本服务只读**。写方法返回 405。要写知识请用 HomeAgent 主 agent 的 +- **本服务只读**。写方法返回 405。要写知识请用 HologramAgent 主 agent 的 `knowledge_create`(或 WebUI 界面),不要试图绕过它直接写这个接口。 - 知识名里不能有 `..`、空格(会被规范成 `_`)、点开头的段。 ### 写入 -本服务不提供写入。若你在 HomeAgent 主 agent 内部,写入用内核工具: +本服务不提供写入。若你在 HologramAgent 主 agent 内部,写入用内核工具: ``` knowledge_create name="tech/go/调度" content="正文..." diff --git a/assets/skills/knowledge-base/scripts/kb_tree.sh b/assets/skills/knowledge-base/scripts/kb_tree.sh index ddbdf845..43c4d44d 100755 --- a/assets/skills/knowledge-base/scripts/kb_tree.sh +++ b/assets/skills/knowledge-base/scripts/kb_tree.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# kbtree 客户端:按分类树检索 HomeAgent 知识库。 +# kbtree 客户端:按分类树检索 HologramAgent 知识库。 # # 由 knowledge-base skill 调用(agent 读 SKILL.md 后按需调本脚本)。 # 也可人工使用: @@ -88,7 +88,7 @@ if ! (exec 3<>"/dev/tcp/${HOSTPORT%%:*}/${HOSTPORT##*:}") 2>/dev/null; then cat >&2 < { parent: mainWindow, modal: true, autoHideMenuBar: true, - title: "HomeAgent - 网关联机登录", + title: "HologramAgent - 网关联机登录", webPreferences: { contextIsolation: true, nodeIntegration: false }, }); const u = encodeURIComponent(username || ""); @@ -1456,7 +1456,7 @@ async function connectDeviceBridgeOnce(cfg) { op: "hello", device: { device_id: deviceBridgeId, - name: "HomeAgent GUI", + name: "HologramAgent GUI", kind: "computer", authorized: authorized, caps: [ @@ -1986,8 +1986,8 @@ function executeHomeagentCmd(capability, reqId) { const h = Math.min(parseInt(area.height || 600, 10) - 40, 560); const html = /<\/?[a-z][\s\S]*>/i.test(raw) ? raw - : "

HomeAgent

" + - String(raw || "HomeAgent 远程屏幕提示").replace(/

HologramAgent

" + + String(raw || "HologramAgent 远程屏幕提示").replace(/

"; try { if (screensueWin && !screensueWin.isDestroyed()) screensueWin.destroy(); @@ -1999,7 +1999,7 @@ function executeHomeagentCmd(capability, reqId) { alwaysOnTop: true, frame: false, resizable: true, - title: "HomeAgent · screensue", + title: "HologramAgent · screensue", webPreferences: { nodeIntegration: false, contextIsolation: true }, }); screensueWin.setAlwaysOnTop(true, "screen-saver"); @@ -3223,7 +3223,7 @@ async function setDeviceAuthorized(authorized) { op: "hello", device: { device_id: deviceBridgeId, - name: "HomeAgent GUI", + name: "HologramAgent GUI", kind: "computer", authorized: !!authorized, caps: [ @@ -3291,7 +3291,7 @@ function buildTrayMenuTemplate() { const electron = require("electron"); const TMenu = electron.Menu; const tpl = []; - tpl.push({ label: "HomeAgent", enabled: true }); + tpl.push({ label: "HologramAgent", enabled: true }); tpl.push({ type: "separator" }); // 远程连接状态(缓存避免每次读文件) const connLabel = trayConnCache.connLabel || "未连接"; @@ -3404,7 +3404,7 @@ function initTray() { img = nImg.createEmpty(); } tray = new Tray(img); - tray.setToolTip("HomeAgent - 个人智能管家"); + tray.setToolTip("HologramAgent - 个人智能管家"); rebuildTrayMenu(); tray.on("double-click", () => showMainWindow()); console.log("[tray] READY: " + (tray ? "tray-created" : "null")); @@ -3525,7 +3525,7 @@ app.whenReady().then(async () => { // 「启动时不显示主窗口,驻留托盘后台运行」,但主进程从来没读过它 —— // whenReady 无条件 createWindow(),于是必然弹窗。 // - // 实测(本机,prefs.silentStart=true):窗口标题 HomeAgent 照样出现。 + // 实测(本机,prefs.silentStart=true):窗口标题 HologramAgent 照样出现。 // // 与 applyAutoLaunch 里的 openAsHidden 是两回事:那个是告诉 OS「开机自启 // 时如何启动」(仅 Windows/macOS 生效),这里是本进程自己决定要不要显示, @@ -3605,7 +3605,7 @@ let notifSeq = 0; ipcMain.handle("notify:show", (_, payload) => { try { const p = payload || {}; - const title = String(p.title || "HomeAgent"); + const title = String(p.title || "HologramAgent"); const body = String(p.body || ""); if (!body) return { ok: false, error: "empty body" }; if (!Notification.isSupported()) return { ok: false, error: "unsupported" }; @@ -3721,10 +3721,10 @@ function saveGuiPrefs(p) { } // Electron LoginItem 写入的注册表项名是「electron.app.」。 -// 产物改名过(HomeAgent.exe → homeagent-gui.exe)就会多出一条旧项, +// 产物改名过(HologramAgent.exe → homeagent-gui.exe)就会多出一条旧项, // 且 setLoginItemSettings 不会清理它们 ⇒ 开机启动两次同一个 exe。 // 实测本机 Run 键里确实同时存在: -// electron.app.HomeAgent = "E:\program\homeagent\...\homeagent-gui.exe" +// electron.app.HologramAgent = "E:\program\homeagent\...\homeagent-gui.exe" // electron.app.homeagent-gui = E:\program\homeagent\...\homeagent-gui.exe // 两条指向同一 exe,所以表面看是两个自启动,实际是同一份的重复。 // diff --git a/cmd/gui/package.json b/cmd/gui/package.json index 7059aa34..5c2c7077 100644 --- a/cmd/gui/package.json +++ b/cmd/gui/package.json @@ -3,7 +3,7 @@ "version": "1.4.0", "author": "JianFeeeee ", "homepage": "https://github.com/JianFeeeee/HologramAgent", - "description": "HomeAgent Desktop GUI - Multi-connection management dashboard", + "description": "HologramAgent Desktop GUI - Multi-connection management dashboard", "main": "main.js", "scripts": { "start": "electron . --no-sandbox", @@ -25,7 +25,7 @@ }, "build": { "appId": "com.homeagent.gui", - "productName": "HomeAgent", + "productName": "HologramAgent", "linux": { "target": [ "deb", diff --git a/cmd/gui/renderer/app.js b/cmd/gui/renderer/app.js index 11313c69..f4b45f2d 100644 --- a/cmd/gui/renderer/app.js +++ b/cmd/gui/renderer/app.js @@ -741,7 +741,7 @@ async function api(p, o) { // 从服务端发现设备网关地址(自动链接的权威来源)。 // -// 失败不报错:老版本 HomeAgent 没有这个端点,回退到本地推导即可 +// 失败不报错:老版本 HologramAgent 没有这个端点,回退到本地推导即可 // (见 renderDeviceChannel 里的 state.discoveredGateway || 旧口径)。 // // 优先 url_portal(门户同源形态):GUI 主进程连 WS 走系统解析器, @@ -1083,7 +1083,7 @@ async function refreshAll() { // 服务端列表未含本机(可能离线),仍展示本地状态 state.devices.push({ device_id: dbinfo.deviceId, - name: "HomeAgent GUI", + name: "HologramAgent GUI", kind: "computer", authorized: dbinfo.authorized, online: false, @@ -1555,7 +1555,7 @@ function renderOverview() { b.commit && b.commit !== "unknown" ? String(b.commit).slice(0, 7) : ""; return ( "v" + escHtml(v) + - '
' + escHtml(b.kernel_name || "HomeAgent") + + '
' + escHtml(b.kernel_name || "HologramAgent") + (sha ? " · " + escHtml(sha) : "") + "
" ); })(), @@ -1819,8 +1819,8 @@ function buildChatLayout() { "" + "

" + __( - "连接 HomeAgent 服务端后即可开始对话。请在设置中添加后端连接。", - "Connect to a HomeAgent server to start chatting. Add a backend connection in Settings.", + "连接 HologramAgent 服务端后即可开始对话。请在设置中添加后端连接。", + "Connect to a HologramAgent server to start chatting. Add a backend connection in Settings.", ) + "

" + '