mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-07 01:37:34 +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:
@ -1,23 +1,8 @@
|
||||
package sdk
|
||||
|
||||
// TerminalAPI 是内核开放的终端会话与命令历史接口(「内核开,两个插件接」)。
|
||||
//
|
||||
// 为什么单开接口而不是塞进 KernelStatus:KernelStatus 是**全量运行态快照**,
|
||||
// /api/v1/kernel 与前端总览页每 3 秒轮询一次;把每个终端最多 64KB 的输出
|
||||
// 缓冲塞进去,会让每次轮询都背一份终端全屏内容。终端输出属于**按需拉取**的
|
||||
// 明细,只该在 /terminals 被访问时取。
|
||||
//
|
||||
// 权威状态由内核维护(internal/agent/core/terminal_registry.go):内核订阅
|
||||
// 自己的事件总线,归并 EventToolCall(terminal_create/close、cmd_run)与
|
||||
// EventTerminalOutput(agentcli 生命周期 + 输出),产出唯一真相。
|
||||
// WebUI 与 CLI 都从这里读,不再各自订阅推导。
|
||||
type TerminalAPI interface {
|
||||
// ListTerminals 返回终端会话快照(含输出缓冲与运行状态)。
|
||||
ListTerminals() []TerminalStatus
|
||||
// CmdHistory 返回命令执行历史快照(cmd_run,最近 100 条)。
|
||||
CmdHistory() []CmdExecStatus
|
||||
}
|
||||
|
||||
// 终端 DTO(TerminalStatus / CmdExecStatus)保留:它们只是**线上格式**,
|
||||
// WebUI 与 CLI 用同一口径返回给前端。终端语义(谁在跑、历史怎么归并)
|
||||
// 已归属 agentcli 与插件侧视图(internal/pluginview),内核不再有 TerminalAPI。
|
||||
// TerminalStatus 与 WebUI termState / CLI cliTermState 同一 JSON 口径。
|
||||
type TerminalStatus struct {
|
||||
ID string `json:"id"`
|
||||
|
||||
Reference in New Issue
Block a user