refactor(timer): 从内核内置插件迁为外部插件,移除编译期注册

老大要求「把 timer 移到外部插件,移除内核的内置 timer」。本次只做内核侧
的**摘除**,插件本体在外部工程(plugins/timer → .hmap 安装)。

timer 原先由 internal/plugins/timer 的 init() 注册进编译期工厂表。
后果是改一行定时器逻辑要重编整个 homed(87MB)并重启内核——而它恰是
最该独立演进的部件:有自己的持久化状态、触发语义、并发模型,却被绑死
在主进程的发版节奏上。

搬出来后:换实现只需重装插件 + 重启单个插件进程;插件崩了自己被拉起,
不影响 agent 主循环。

1. 删除 internal/plugins/timer(plugin.go + plugin_test.go)
2. internal/plugins/all.go 去掉该 import,并写明**不要加回去**的原因
3. internal/plugins/integration_test.go 的 expectedTools 去掉 timer_set

TestIntegrationAllPluginsRegister 的语义是「编译期内置插件是否都注册了工具」,
它走的是本地装配(setupIntegration 只加载 internal/plugins 下的内置包)。
timer 搬走后不再参与这个进程的装配,留在列表里只会造出永远绿不了的假失败。

真正不该省的是验证:外部插件的工具是否真注册成功,靠装完 .hmap 后实调
timer_set / timer_list / timer_cancel 来确认(见交付报告)。

- 配置表:外部插件同用 config_<name> ⇒ config_timer,老值 max_duration /
  pending_timers 直接读回,老大已设的定时器无需迁移
- 工具名:timer_set / timer_list / timer_cancel 不变,模型侧零感知
- 注入源与通道:source/channel 仍是 "timer"
- 注入级别:内置插件可声明 L4,外部插件被夹到 L3;本插件本就要 L3,
  故行为等价

StageHost.RegisterTool 对同名工具返回 `already registered`,而插件注册是
批量失败(新实例的工具一个都注不上)。所以必须**先装新内核**(不含内置
timer)再装外部 timer 插件,反之会撞名。

(cherry picked from commit f584776f23c3bfd8fb2892155e6018a1ec57eac0)
This commit is contained in:
JianFeeeee
2026-10-19 14:11:20 +08:00
committed by JianFeeeee
parent c53d1da2a6
commit 6b64d69b10
3 changed files with 32 additions and 144 deletions

View File

@ -165,7 +165,17 @@ func TestIntegrationAllPluginsRegister(t *testing.T) {
"terminal_create", "terminal_write", "terminal_read",
"terminal_resize", "terminal_close", "terminal_list",
"healthcheck", "healthcheck_plugins", "healthcheck_tools", "healthcheck_memory", "healthcheck_perf",
"timer_set",
// ⚠️ timer_set **不在**这里(2026-10-19 起)。
//
// 本用例的语义是「编译期内置插件是否都注册了工具」,set 走的是本地
// 装配(setupIntegration 只加载 internal/plugins 下的内置包)。
// timer 已搬为**外部插件**(plugins/timer,.hmap),不参与本进程装配,
// 所以它出现在这个列表里只会造出「永远绿不了」的假失败。
//
// 外部插件的工具是否真的注册成功,由另一层负责:装完 .hmap 后
// 用 timer_list / timer_set 实调一次(见交付报告里的现网验证)。
// 别为了「让它绿」把 timer 加回 all.go —— 那会让内置与外部两份
// 同时存在,工具重名而胜者取决于加载顺序。
}
defs := env.stageHost.GetToolDefs()