feat(sdk): 受限事件总线的内核实现 + clawhubadapter 改用它

- internal/sdk/events.go:实现 pubsdk.EventsAPI
  · publishAllowed:白名单精确匹配 或 本插件命名空间 plugin.<name>.<后缀>
  · subscribeAllowed:只开只读事件(tools_ready/security_ready/device_ready)
  · 载荷出向经 security.PrepareOutbound(明文→@{别名}),入向经 ScrubInbound
  · 键数上限 64;越界**报错**不静默
  · Source 由 SDK 固定成插件名(插件不能冒名)
- PluginSDK.Events() 访问器
- clawhubadapter 的 skill_detected 改走 s.Events().Publish,不再 import internal/events
  ⇒ 它为外部化的唯一阻塞项(事件发布)已消除

判据(internal/sdk/events_test.go,6 条):
白名单放行 / 越界拒绝(raw_input、agent_output、update_request、stage、system、
别的插件命名空间、空类型)/ 自己命名空间放行 / 订阅越界拒绝 / 载荷凭据被替换成别名 / 键数上限
This commit is contained in:
JianFeeeee
2026-10-27 11:16:40 +08:00
parent ffffb94005
commit 981b969f58
4 changed files with 313 additions and 9 deletions

View File

@ -179,6 +179,7 @@ type PluginSDK struct {
iom *agentIO.IOManager
eventBus *events.Bus
events pubsdk.EventsAPI
logger *log.Logger
pluginMgr PluginManager
@ -198,7 +199,13 @@ func (s *PluginSDK) PluginMgr() PluginManager { return s.pluginMgr }
// 以下访问器遮蔽公共 SDK 的同名方法,返回内置插件可用的全量接口。
func (s *PluginSDK) Settings() SettingsAPI { return s.settings }
func (s *PluginSDK) Settings() SettingsAPI { return s.settings }
// Events 返回**受限**事件总线(可 nil:未接总线时)。
//
// 与直接拿 *events.Bus 的区别:只能发布白名单类型或自己的命名空间
// (`plugin.<name>.*`),载荷出向经 security 过闸,订阅只开只读事件。
func (s *PluginSDK) Events() pubsdk.EventsAPI { return s.events }
func (s *PluginSDK) Memory() MemoryAPI { return s.memory }
func (s *PluginSDK) TextMemory() TextMemoryAPI { return s.textMem }
func (s *PluginSDK) DocMemory() DocMemoryAPI { return s.docMem }
@ -383,6 +390,7 @@ func New(name string, cfg SDKConfig) *PluginSDK {
iom: cfg.IOManager,
eventBus: cfg.EventBus,
events: newEventsAPI(name, cfg.EventBus),
logger: log.Default(),
pluginMgr: cfg.PluginMgr,