mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 06:47:29 +00:00
refactor(terminal): 终端逻辑回归 agentcli,内核不再编码终端语义
按用户指正调整架构:终端是 agentcli 的职责,内核不该有终端逻辑;插件与
agentcli 的联动应走事件总线,而不是内核内部组件。
## 删掉内核里的终端语义
`internal/agent/core/terminal_registry.go`(280 行)整体删除。它做了两件不该
内核做的事:定义「什么是终端会话」、从 EventToolCall 的 Go map 文本里解析
terminal id / command 并归并会话与命令历史。连带移除:
- Agent 的 terminalReg 字段、构造、subscribeTerminalRegistry 订阅
- StatusAPI 上的 ListTerminals / CmdHistory
- sdk.TerminalAPI + PluginSDK.Terminal() + Registry.SetTerminalAPI 及接线
- 对应测试(迁到插件侧视图包)
保留 `sdk.TerminalStatus` / `CmdExecStatus`:它们只是线上 JSON 格式,WebUI/CLI
返回给前端时口径一致。
## 插件侧订阅事件总线自攒视图
新增 `internal/pluginview`(TerminalView):把原先内核那份归并逻辑原样搬过来,
由插件自己持有。数据源仍是两条总线事件:
EventTerminalOutput(agentcli 发)→ 会话输出 + 生命周期
EventToolCall (内核发) → cmd_run 历史、terminal_create/close 归并
WebUI 在 NewHandler 订阅、Close 退订;CLI 在 Start 订阅、Stop 退订。
两边共用同一实现,避免历史上「两份推导各踩一次 Go map 文本」的坑。
视图不是权威:真值在 agentcli,插件晚于会话启动会缺早期会话(注释写明)。
## agentcli 保持内置
它现在仍需要 `Publish`(进程内事件总线写入)——外部插件没有上行事件通道
(`EventPublish` 在 withheldCapabilities 里,proc 只有 events.subscribe)。
按判定标准留内置;将来要外置,须先开一条受控的插件→内核上行事件通道,
本次刻意不开(用户决定:先保持内置)。
## 文档
中英 ARCHITECTURE 新增「终端归属」小节:说明职责边界、两条事件、视图非权威、
以及 agentcli 为何仍内置;内置判定表里 cli/webui 去掉 TerminalAPI 一项。
## 验收(本机实例实测)
- 内核编译通过,删除后 `go build ./... && go vet ./...` 干净,`go test ./internal/...` 全绿
- 实例重启后:让 agent 开终端跑 `echo term-view-test` →
WebUI `GET /api/v1/terminals` 返回 term_1(output 正确、running=false)
CLI `/terminals`(unix socket)返回同一份;
两处都是从事件总线自攒,内核侧无终端代码参与
- cmd 历史分支由迁过来的单测覆盖(Go map 文本解析、生命周期、上限裁剪)
This commit is contained in:
@ -327,7 +327,7 @@ Lua 脚本插件加载:`internal/plugin/` → gopher-lua 解释器执行 `main
|
||||
**只有必须使用内部 SDK 能力(公开 SDK 没有的接口面)的插件,才留在编译期内置清单。**
|
||||
|
||||
内部 SDK(`internal/sdk`)比公开 SDK(third_party/homeagent-sdk)多出一批
|
||||
**不对外授予**的能力面:`TerminalAPI` / `TrackerAPI` / `StatusAPI` /
|
||||
**不对外授予**的能力面:`TrackerAPI` / `StatusAPI` /
|
||||
`SupervisorAPI` / `AdapterAPI` / `SelftestAPI` / `ToolAPI`,以及 **`Publish`
|
||||
(事件发布)**。外部插件走 proc 桥的收窄能力集,这些接口在类型层就不存在
|
||||
(权威清单见 `internal/plugin/proc/capability.go` 的 `withheldCapabilities`)。
|
||||
@ -343,7 +343,7 @@ Lua 脚本插件加载:`internal/plugin/` → gopher-lua 解释器执行 `main
|
||||
|
||||
| 插件 | 依赖的内部能力 |
|
||||
|---|---|
|
||||
| cli / webui | TerminalAPI(/terminal 与终端面板)、TrackerAPI、StatusAPI、SupervisorAPI、AdapterAPI |
|
||||
| cli / webui | TrackerAPI、StatusAPI、SupervisorAPI、AdapterAPI |
|
||||
| agentcli | **EventPublish**:靠 `Publish(EventTerminalOutput)` 上报终端输出与生命周期,公开 SDK 无 Publish |
|
||||
| healthcheck | SelftestAPI(能构造虚拟内核实例做自检) |
|
||||
| pluginmgr | failback 恢复链必需(`core.agent.failback_plugins` 默认 webui/pluginmgr/recoverydiag) |
|
||||
@ -371,6 +371,26 @@ Lua 脚本插件加载:`internal/plugin/` → gopher-lua 解释器执行 `main
|
||||
> ⇒ 内置版永远赢,外部版**装了也不生效**。外置一个插件时,必须同时把它从
|
||||
> `internal/plugins/all.go` 移除(该文件是唯一权威清单)。
|
||||
|
||||
### 终端归属:agentcli 全权,内核不碰(2026-10-20 调整)
|
||||
|
||||
终端逻辑只归 `agentcli`(PTY、会话生命周期、输出缓冲、历史)。内核**不再**维护
|
||||
终端语义:曾经的 `internal/agent/core/terminal_registry.go` 已删除 —— 那是在内核里
|
||||
编码「什么是终端、怎么从工具调用里归并会话」,属于职责错位。
|
||||
|
||||
插件侧(WebUI / CLI)需要终端面板时,**订阅事件总线自己攒视图**:
|
||||
|
||||
| 事件 | 发布者 | 用途 |
|
||||
|---|---|---|
|
||||
| `EventTerminalOutput` | agentcli | 会话输出、创建/关闭/超时(`running` 翻转) |
|
||||
| `EventToolCall` | 内核 | `cmd_run` 历史、`terminal_create/close` 归并 |
|
||||
|
||||
WebUI 与 CLI 共用 `internal/pluginview` 的实现(同一解析口径,避免历史上两份
|
||||
推导各踩一次「工具 result 是 Go map 文本」的坑)。视图不是权威:状态真值在
|
||||
agentcli,插件晚于会话启动时会缺早期会话。
|
||||
|
||||
agentcli 因此需要 `Publish`(外部插件无此能力),按判定标准保持内置;
|
||||
将来若要外置,需要先给外部插件开一条**受控的上行事件**通道(当前刻意不开)。
|
||||
|
||||
### 内置插件 vs 外部插件
|
||||
|
||||
| 维度 | 内置插件 | 外部插件 |
|
||||
|
||||
Reference in New Issue
Block a user