feat(cli): /runtime 接上(runtime 本就经 KernelStatus 对内部插件开放)

纠正上一轮的判断:runtime 不是“SDK 未暴露”。s.Status().GetKernelStatus()
里的 Scheduler / Residents / Channels / InputChannels 就是 WebUI /runtime
的数据源,内部插件同样拿得到——CLI 只是漏接了这条命令。

- CLI 插件新增 /runtime,输出与 GET /api/v1/runtime 同口径。
- waiter 侧 /runtime 在 local(发 CLI 插件)与 remote(走 REST)两条路都接上,/help 补齐。
This commit is contained in:
JianFeeeee
2026-09-15 14:29:29 +08:00
parent bcaa8f3f31
commit 91c25fa536
2 changed files with 41 additions and 0 deletions

View File

@ -315,6 +315,8 @@ func (p *Plugin) handleBuiltin(conn net.Conn, line string, s *sdk.PluginSDK) boo
p.cmdAdapters(conn, parts, s)
case "/network":
p.cmdNetwork(conn, s)
case "/runtime":
p.cmdRuntime(conn, s)
default:
return false
}
@ -351,6 +353,7 @@ func (p *Plugin) cmdHelp(conn net.Conn) {
/adapters 列出已加载的 Lua 适配器
/adapters remove <name> 卸载适配器
/network 网络状态与 LLM 端点
/runtime 调度器/驻留子/通道拓扑快照
/agents 当前 Agent 信息
其他文本直接发送给 Agent 处理。`,
@ -823,6 +826,34 @@ func (p *Plugin) cmdAdapters(conn net.Conn, parts []string, s *sdk.PluginSDK) {
writeJSONContent(conn, map[string]interface{}{"adapters": ad.List()})
}
// ======== /runtime ========
// cmdRuntime 与 WebUI 的 GET /api/v1/runtime 同口径。
//
// 数据来自 SDK 已经对内部插件开放的 KernelStatuss.Status().GetKernelStatus()
// 不是 WebUI 专属Scheduler / Residents / Channels / InputChannels 都在里面。
// 之前 CLI 没接这一条,是漏接,不是没开放。
func (p *Plugin) cmdRuntime(conn net.Conn, s *sdk.PluginSDK) {
st := s.Status()
if st == nil {
writeLine(conn, map[string]interface{}{"type": "error", "error": "status provider not available"})
return
}
ks := st.GetKernelStatus()
if ks == nil {
writeLine(conn, map[string]interface{}{"type": "error", "error": "kernel status not available"})
return
}
writeJSONContent(conn, map[string]interface{}{
"uptime": ks.Uptime,
"agent_id": ks.AgentID,
"scheduler": ks.Scheduler,
"residents": ks.Residents,
"channels": ks.Channels,
"input_channels": ks.InputChannels,
})
}
// ======== /network ========
// cmdNetwork 与 WebUI 的 GET /api/v1/network 同口径:网络状态 + LLM 端点。