添加上下文命令操作
桌面插件可以把已注册的命令放到视图标题栏或会话消息旁。宿主负责绘制按钮、安排位置,并向命令传入公开上下文。这些操作用于添加控件,不会替换视图外壳、消息渲染器或原生审批控件。
注册放置位置
Section titled “注册放置位置”调用 registerCommand 时声明 placements:
| 位置 | when、enabled 和点击时的 execute 可用的上下文 |
|---|---|
view.title | contractVersion: 1、target、viewId、viewTypeId、viewPluginId、region |
conversation.message.actions | contractVersion: 1、target、可选的 threadId、turnId 和 item: ConversationItemSnapshotV1 |
SDK 的 PluginCommandActionContext 是可区分联合类型。读取某个位置特有的字段前,先检查 context.target。消息上下文是被点击消息的公开快照,不是选中的文字范围、整段会话或内部线程记录。
title为操作提供标签;可选的icon使用公开语义图标名。order控制插件操作之间的顺序。when(context)控制是否显示。只属于自己视图的操作应同时检查viewPluginId和viewTypeId。enabled(context)控制已显示的操作是否可执行。例如,消息仍在流式输出或文本为空时禁用摘录。- 条件函数同步执行且不应产生副作用,必须返回布尔值。上下文快照不可修改;条件函数失败会记录诊断,不应破坏宿主操作栏。
- 宿主会在执行时重新检查显示条件和启用状态。这些条件表达界面可用性,不会新增安全权限。
未声明 placements 的命令保持原有行为。从命令面板或直接调用命令时,输入仍可能缺失或使用其他结构。execute(input?: unknown) 应校验上下文,不要直接断言类型。消息上下文已标识目标时,不要改用全局状态猜测当前线程。
默认会话界面会同时呈现放置的命令按钮、直接注册到
conversation.message.actions 插槽的贡献以及原生消息操作。
添加或移除放置的命令会保留直接插槽贡献及其本地状态和键盘焦点;
添加或移除直接插槽贡献同样会保留放置的命令控件。两类贡献都不存在时,
界面保持原有的原生操作和空操作栏行为。
试用 Action Notes 示例
Section titled “试用 Action Notes 示例”Action Notes 示例 是仅含桌面入口的插件,提供两个操作:
- Refresh action notes 只出现在它自己的笔记视图标题栏,重新发布该视图的快照并增加刷新计数。
- Save to action notes 把被点击消息的显示文本复制到插件自己的临时列表。同一消息重复点击不会重复添加。
明确加载插件后,可从工作区工具打开该视图。示例不会自动打开视图或启用自身,不读取其他消息、不使用凭据,也不向网络发送数据。笔记只保存在内存中,重载或禁用后清空。如需持久化笔记,请使用现有插件存储契约,并保持单一权威数据源;参见插件配方。
生命周期与恢复
Section titled “生命周期与恢复”命令及其放置的按钮归属于激活它们的插件代。注册操作返回可释放对象。释放注册、卸载或禁用该代后,对应贡献会被移除;旧按钮不能仅凭相同的命令 ID 调用新一代命令。
使用 registerCleanup 清理插件自己的订阅、计时器等资源。React 订阅应返回取消订阅函数。异步工作应绑定插件代,在释放后忽略迟到结果。示例通过宿主 React 的 useSyncExternalStore 订阅本地列表,并在清理时关闭列表。
开发重载会用新一代注册替换旧注册。成功重载会重置此示例的临时笔记和刷新计数。构建或包校验失败会保留上次发布的开发产物;桌面激活错误会单独显示在插件状态中。如果包还带原生运行时,提交后激活失败遵循运行时 generation 契约,不能笼统视为可回滚。不要依赖重载来保留模块变量。
构建并运行示例的契约测试,再通过 wuu plugin dev 明确加载。在桌面端打开 Action notes,保存一条合成消息,刷新视图,并确认其他插件的视图没有此刷新操作。检查空消息、流式消息、键盘操作、窄窗口、明暗主题,以及禁用和重载后的清理。
示例自动测试使用合成数据验证命令行为和清理,不会渲染桌面,也不代表已完成视觉或无障碍验收。wuu plugin test 会校验仅含桌面入口的包,但不会渲染其入口。