Plugin Lifecycle
理解 Agent plugin 的注册、卸载,以及 lifecycle.start / lifecycle.stop 什么时候执行
Plugin Lifecycle
Plugin 只属于 Agent。
它的生命周期可以简化成两件事:
- 注册:plugin 成功进入
agent.plugins - 卸载:plugin 成功从
agent.plugins移除
宿主直接调用 agent.plugins 时会立即看到新的 configured registry。已有 Session 的 plugin action 与 metadata 执行视图在下一个 Session step 检查点切换;execution lease 会保证旧 plugin lifecycle 持续到当前 step 及其工具调用结束。如果当前 Session turn 没有后续 step,则在下一个 Session turn 开始时切换。Session 的 system 在第一次生成后固定,不会随 plugin registry 变化;新 Session 才会从最新 registry 收集 plugin system。
不再需要单独理解 start、stop、restart 或项目级 enabled 开关。
注册就是启用
Agent 构造时传入的 plugin 会自动注册:
import { Agent, Workspace } from "@downcity/agent";
import { PlaywrightBrowserProvider, WebPlugin } from "@downcity/plugins/web";
const agent = new Agent({
id: "agent",
workspace: new Workspace({ path: process.cwd() }),
plugins: [new WebPlugin({
browser: new PlaywrightBrowserProvider({ cdp_url: "http://127.0.0.1:9222" }),
})],
});
await agent.ready();Agent 实例化之后,也可以继续注册 plugin:
await agent.plugins.register(new SkillPlugin());同名 plugin 再次注册表示替换。Runtime 会先卸载旧实例,再注册新实例。
卸载就是停用
await agent.plugins.unregister("skill");卸载后:
agent.plugins.get("skill")返回nullagent.plugins.run_action({ plugin: "skill", ... })会返回 unknown plugin- 这个 plugin 的 hooks、resolves 和 action 不会再参与后续运行;已有 Session 已固定的 system 不会被回溯删除
lifecycle.start / lifecycle.stop
Plugin 仍然可以声明 lifecycle:
lifecycle.startlifecycle.stoplifecycle.command
但它们不再是公开状态机。
规则很简单:
register(plugin)时自动调用plugin.lifecycle?.start(context)unregister(name)会立即从 configured registry 移除 plugin;活跃 Session step 的 lease 释放后再调用plugin.lifecycle?.stop(context)agent.dispose()时会卸载全部 plugin
适合 lifecycle 的场景包括:
- workers
- poll loops
- 长连接
- 内存 runtime state
- 可恢复的 runtime engines
查看注册状态
agent.plugins.snapshots();
agent.plugins.status("skill");
agent.plugins.has("skill");状态只保留:
readyerror
未注册的 plugin 不需要状态,因为它已经不在 registry 里。
ActionSchedule
ActionSchedule 不是 plugin。
它是 Agent 级 action 调度 loop,跟随 Agent runtime 启动。到期任务会重新调用已注册 plugin 的 action。