mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 06:47:29 +00:00
## 1. 系统提示词/人格瘦身(工具用法搬去 tooldef 与 skill) 用户指出:默认系统提示词与 personal 里有大量本该属于 skill / 工具描述的内容。 核对属实,且已造成**真实故障**:提示词教模型用 cmd_run,而 cmd 外置按需后 工具根本不在清单里 ⇒ 模型第一轮调用不存在的工具,拿到「工具 cmd_run 不存在」。 改动: - kernelmod/agent.defaultSystemPrompt:删掉 output_* 用法、工具分类清单、 cmd_run/terminal/files 策略、并行策略、媒体工具清单、emoji 风格要求。 只留:身份 + 「工具描述与技能索引会注入,先读再用」+「只依据工具返回值作答」。 - config.DefaultPersonaPrompt:只留身份/称呼/语气 + 版本以运行时快照为准 (后者由 TestDefaultPersonaPromptHasNoVersionLiterals 钉住)。 - 命令与文件策略下沉到工具描述:cmd_run 补「完整 bash,支持管道/heredoc/重定向」, files_write 补「原子替换 + 覆盖受保护路径前留档」。 - 对话时序块自带语义说明(原先靠提示词解释,提示词一精简就丢语义)。 - 文档新增「提示词分层」章节(中英),写明归属判据与这次的反面教材。 ## 2. WebUI:插件「启动状态」按运行期真相展示 旧实现只看内核 status 的 loaded 一个布尔,三种形态被混成同一个「未加载」: auto_start=false 的按需待命(正常)、该起没起(异常)、plugin_stop 后的运行态停止。 用户看到一屏「未加载」以为插件全坏了。 - sdk.PluginRuntimeInfo 新增 AutoStart / RuntimeStopped;registry 从清单填充。 - pluginmgr /plugins 列表暴露 auto_start / runtime_stopped / builtin / tool_count。 - webui 新增 POST /plugins/<name>/start|stop(运行态,不动持久禁用清单)。 - dashboard 状态列改为五态:已禁用 / 进程丢失 / 已运行 / 按需待命 / 未运行, 并额外标注「自启 / 按需」;按钮改为 启动/停止(运行态)与 禁用/启用(持久态)分列。 - 新增两条回归判据(引用 auto_start/runtime_stopped/alive 字段;startPlugin 走 /start)。 ## 验收(本机实例实测) - files 保持 auto_start=false(按需);问 agent 写文件 → 它先 plugin_start cmd+files, 再 files_write/files_read,内容校验一致;未用 shell 代替文件操作。 - WebUI 插件页截图确认:a2a/acp/agentcli 显示「已运行 自启」, ai_image 显示「按需待命 按需」+「启动」按钮。 - go test(config/agent core/plugin/pluginmgr/webui/sdk)全绿。
73 lines
2.6 KiB
Go
73 lines
2.6 KiB
Go
package webui
|
||
|
||
import (
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
// 插件列表「启动状态」渲染的回归判据(2026-10-20 生产反馈)。
|
||
//
|
||
// ## 原始问题
|
||
//
|
||
// 面板只拿内核 status 的 loaded 一个布尔来判断,于是三种完全不同的形态
|
||
// 被显示成同一个「未加载」:
|
||
//
|
||
// · auto_start=false 且未运行 → **按需插件正常待命**(不是故障)
|
||
// · auto_start=true 且未运行 → 该起没起(需要关注)
|
||
// · 运行态 plugin_stop 之后 → 用户自己停的(重启会恢复)
|
||
//
|
||
// 用户看到一屏「未加载」,以为插件全坏了 —— 实际它们只是在等 plugin_start。
|
||
//
|
||
// ## 判据思路
|
||
//
|
||
// 与 cmd_history_render_test.go 同款:不执行 JS,只守住源码结构 ——
|
||
// 渲染函数必须消费 auto_start / runtime_stopped / alive 三个字段,
|
||
// 并给出「按需待命」这一独立分支;否则回归立刻红。
|
||
func TestPluginStatusUsesRuntimeFields(t *testing.T) {
|
||
src := dashboardJSSource(t)
|
||
start := strings.Index(src, "function renderPlugins()")
|
||
if start < 0 {
|
||
t.Fatal("找不到 renderPlugins —— 函数被重命名或删除,请同步更新本判据")
|
||
}
|
||
end := strings.Index(src[start+1:], "\nfunction ")
|
||
var body string
|
||
if end < 0 {
|
||
body = src[start:]
|
||
} else {
|
||
body = src[start : start+1+end]
|
||
}
|
||
|
||
for _, want := range []string{
|
||
"auto_start", // 区分自启/按需
|
||
"runtime_stopped", // 区分运行态停止与持久禁用
|
||
"alive", // 区分「已加载」与「进程丢失」
|
||
"按需待命", // 按需插件待命是独立状态,不能混进「未运行」
|
||
} {
|
||
if !strings.Contains(body, want) {
|
||
t.Fatalf("renderPlugins 未引用 %q —— 状态判定退化,"+
|
||
"按需插件会被误显示成故障。见本文件头部说明", want)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 「启动」按钮必须走运行态接口 /start,不能复用持久态的 /enable ——
|
||
// 后者会清掉持久禁用标记,让「点一下启动」变成「以后都自启」。
|
||
func TestPluginStartUsesRuntimeEndpoint(t *testing.T) {
|
||
src := dashboardJSSource(t)
|
||
i := strings.Index(src, "async function startPlugin(")
|
||
if i < 0 {
|
||
t.Fatal("找不到 startPlugin")
|
||
}
|
||
body := src[i:]
|
||
if j := strings.Index(body[1:], "\nasync function "); j > 0 {
|
||
body = body[:j+1]
|
||
}
|
||
if !strings.Contains(body, `"/plugins/" + encodeURIComponent(name) + "/start"`) {
|
||
t.Fatal("startPlugin 必须调用 /plugins/<name>/start(运行态)," +
|
||
"不得复用 /enable(持久态会改动开机行为)")
|
||
}
|
||
if strings.Contains(body, "\"/enable\"") {
|
||
t.Fatal("startPlugin 里出现了 /enable —— 运行态启动不得动持久禁用清单")
|
||
}
|
||
}
|