AIDAWORK / SEQUENCE

插件视图与双轨闭环:aida_plugin_open_view 远端结算与 Local Workbench 原生视图

独立图页 ↗
机制说明(SoT)图是辅读 · 结论以说明与证据为准

listProjections 给出本机可用工具广告。Agent 的 buildPluginToolRuntime 把广告转换为本轮工具定义;被选中的调用再返回 Host 执行。广告只描述可调用能力,本身不是一次工具执行。

本页可直接往下读完整机制说明,不需要「演示 / 播放故事」。术语不熟先看 术语表。

先读机制说明,结论以说明与证据为准 · 基于固定代码版本核验 · 部署状态另行确认

机制说明(全文)

Plugin Run 投影 · call/receipt

广告、调用与回执是三次交接

listProjections 给出本机可用工具广告。Agent 的 buildPluginToolRuntime 把广告转换为本轮工具定义;被选中的调用再返回 Host 执行。广告只描述可调用能力,本身不是一次工具执行。

结果合同使用 structuredContent 和 ArtifactRef 表达结构化内容及产物引用。时序图只保留实际运行时消息,设计决策说明留在文字中,避免把 ADR 文档误读成参与者之间的消息。

插件视图双向闭环与本地工作台双轨(视图 plugin-view-and-batch)

对应交互图 /topics/plugin-run-projection/plugin-view-and-batch/(analyses/aidawork/plugin-run-projection/plugin-view-and-batch.sequence.json):

  1. aida_plugin_open_view 与视图只读隔离(assertWorkPluginView + readTaskView):
    • 模型调用合成工具 aida_plugin_open_view 时,assertWorkPluginView(run-work-plugin-source.ts L76–99)强制校验:视图声明的 stateToolId 必须存在且 sideEffect === 'read',所有 actionToolIds 的 schema 与 C0 广告投影完全一致;视图按钮只要求工具已声明且允许 UI origin(pluginToolAllowsOrigin(action, 'ui'),可复用普通工具操作,不再错误要求 userActionOnly);
    • 服务端在 runtime_events 中写入封存事实 operationRef = 'plugin_view:<interactionId>'(含 dedupKey = canonicalJsonSha256(sealed)),并创建 plugin_view 交互卡挂起载体;
    • Desktop 打开 PluginMainView 面板后,前端通过 PluginHost.readTaskView(binding) 调 callFromLocal(origin='ui') 拉取视图初始数据:若插件含 mainView.views,callFromLocal 强制要求传入 taskBinding 且核对 contractDigest、pluginVersion、toolId === view.stateToolId 且 effect === 'read'(相反,若 Agent 试图直接调 stateToolId,会在 invokeForRequest 被 PLUGIN_VIEW_ONLY 拦截)。
  2. 远端视图动作提交与血统反查(readWorkPluginActionInTx):
    • 当用户在自定义视图里点击业务按钮时,并非由 Renderer 直接写库,而是作为 plugin_view 交互卡的 answer 提交到 InteractionKernel.settle;
    • 唤醒阶段调用 readWorkPluginActionInTx(run-work-plugin-interaction-source.ts L47–70):先调 readOriginalViewCall 从 runtime_events 和 messages (role='assistant') 中反查最初打开该视图的那次模型 tool-call,验证 buildPluginViewInteractionId(runId, toolCallId, invocationId) === interactionId;
    • 随后合成不可伪造的 SettledPluginAction(绑定 { interactionId, settlementId }),将检查点置为 resume_point = 'plugin_action_ready',再生成 stepId = settlementId 的原生插件待办下发给 Desktop Host。
  3. Local Workbench 原生视图与本地回执闭环(createLocalPluginProvider + LocalPluginTaskInteractions):
    • 本地工作台通过 createLocalPluginProvider(local-plugin-provider.ts L41–334)绑定不可变 Bundle 工具与视图:含 actionToolIds 的 aida_plugin_open_view 先在本地 Store 持久化待决交互事实并等待用户;仅展示视图(actionToolIds: [])不阻断 Run;
    • 原生视图经 LocalPluginTaskInteractions(local-plugin-task-interactions.ts L27–249)读写本地交互事实:拒绝答复强制校验精确 { kind: 'reject' }(活跃期重复拒绝幂等返回原提交,终态后报 LOCAL_WORKBENCH_INTERACTION_UNAVAILABLE);接受答复经 runtime.answer 持久化 answerFactId 后,由 PluginHost.executeLocal 核对 executionDigest 并以 local:executionId 写入 PluginCallJournal 执行;
    • 旧协议中的 directory-output、directory-batch、manual-batch 能力与 Host 目录批任务通道已随 aida.mail 切换一并从协议与 Desktop PluginHost 移除。

证据与范围

  • aida-desktop · apps/desktop/electron/plugin-host/plugin-host.ts L659–689 · listProjections · 4346d79eb364
  • aida-agent · packages/agent/src/gateway/delegated-desktop-capabilities.ts L57–87 · buildPluginToolRuntime · e2adc9a3c325
  • aida-plugins · docs/plugin-v2-contract.md L1–44 · a33ce3733365

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

机制说明

Plugin Run 投影 · call/receipt

广告、调用与回执是三次交接

listProjections 给出本机可用工具广告。Agent 的 buildPluginToolRuntime 把广告转换为本轮工具定义;被选中的调用再返回 Host 执行。广告只描述可调用能力,本身不是一次工具执行。

结果合同使用 structuredContent 和 ArtifactRef 表达结构化内容及产物引用。时序图只保留实际运行时消息,设计决策说明留在文字中,避免把 ADR 文档误读成参与者之间的消息。

插件视图双向闭环与本地工作台双轨(视图 plugin-view-and-batch)

对应交互图 /topics/plugin-run-projection/plugin-view-and-batch/(analyses/aidawork/plugin-run-projection/plugin-view-and-batch.sequence.json):

  1. aida_plugin_open_view 与视图只读隔离(assertWorkPluginView + readTaskView):
    • 模型调用合成工具 aida_plugin_open_view 时,assertWorkPluginView(run-work-plugin-source.ts L76–99)强制校验:视图声明的 stateToolId 必须存在且 sideEffect === 'read',所有 actionToolIds 的 schema 与 C0 广告投影完全一致;视图按钮只要求工具已声明且允许 UI origin(pluginToolAllowsOrigin(action, 'ui'),可复用普通工具操作,不再错误要求 userActionOnly);
    • 服务端在 runtime_events 中写入封存事实 operationRef = 'plugin_view:<interactionId>'(含 dedupKey = canonicalJsonSha256(sealed)),并创建 plugin_view 交互卡挂起载体;
    • Desktop 打开 PluginMainView 面板后,前端通过 PluginHost.readTaskView(binding) 调 callFromLocal(origin='ui') 拉取视图初始数据:若插件含 mainView.views,callFromLocal 强制要求传入 taskBinding 且核对 contractDigest、pluginVersion、toolId === view.stateToolId 且 effect === 'read'(相反,若 Agent 试图直接调 stateToolId,会在 invokeForRequest 被 PLUGIN_VIEW_ONLY 拦截)。
  2. 远端视图动作提交与血统反查(readWorkPluginActionInTx):
    • 当用户在自定义视图里点击业务按钮时,并非由 Renderer 直接写库,而是作为 plugin_view 交互卡的 answer 提交到 InteractionKernel.settle;
    • 唤醒阶段调用 readWorkPluginActionInTx(run-work-plugin-interaction-source.ts L47–70):先调 readOriginalViewCall 从 runtime_events 和 messages (role='assistant') 中反查最初打开该视图的那次模型 tool-call,验证 buildPluginViewInteractionId(runId, toolCallId, invocationId) === interactionId;
    • 随后合成不可伪造的 SettledPluginAction(绑定 { interactionId, settlementId }),将检查点置为 resume_point = 'plugin_action_ready',再生成 stepId = settlementId 的原生插件待办下发给 Desktop Host。
  3. Local Workbench 原生视图与本地回执闭环(createLocalPluginProvider + LocalPluginTaskInteractions):
    • 本地工作台通过 createLocalPluginProvider(local-plugin-provider.ts L41–334)绑定不可变 Bundle 工具与视图:含 actionToolIds 的 aida_plugin_open_view 先在本地 Store 持久化待决交互事实并等待用户;仅展示视图(actionToolIds: [])不阻断 Run;
    • 原生视图经 LocalPluginTaskInteractions(local-plugin-task-interactions.ts L27–249)读写本地交互事实:拒绝答复强制校验精确 { kind: 'reject' }(活跃期重复拒绝幂等返回原提交,终态后报 LOCAL_WORKBENCH_INTERACTION_UNAVAILABLE);接受答复经 runtime.answer 持久化 answerFactId 后,由 PluginHost.executeLocal 核对 executionDigest 并以 local:executionId 写入 PluginCallJournal 执行;
    • 旧协议中的 directory-output、directory-batch、manual-batch 能力与 Host 目录批任务通道已随 aida.mail 切换一并从协议与 Desktop PluginHost 移除。

证据与范围

  • aida-desktop · apps/desktop/electron/plugin-host/plugin-host.ts L659–689 · listProjections · 4346d79eb364
  • aida-agent · packages/agent/src/gateway/delegated-desktop-capabilities.ts L57–87 · buildPluginToolRuntime · e2adc9a3c325
  • aida-plugins · docs/plugin-v2-contract.md L1–44 · a33ce3733365

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

代码证据

引用核验检查固定 commit 的文件与范围;实现结论来自代码阅读。自动检查不证明生产环境已启用。

已核验实现

listProjections 广告通过插件投影进入 Agent 的 buildPluginToolRuntime,再由 Host 执行。

aida-desktopapps/desktop/electron/plugin-host/plugin-host.ts:934–9644346d79eb36402355e51118df0edf1f98586880c符号:listProjections
aida-agentpackages/agent/src/gateway/delegated-desktop-capabilities.ts:55–857f2e519936b57902d4907ed8026fe1ecdd146e82符号:buildPluginToolRuntime
已核验实现

MCP 返回 structuredContent 和 ArtifactRef;ADR 说明属于解释,不是运行时消息。

aida-pluginsdocs/plugin-v2-contract.md:1–121a33ce3733365db48413a4b97a0f4f65066856175
已核验实现

本地工作台原生插件视图与工具闭环:createLocalPluginProvider 将已安装 Bundle 工具接入 Local Workbench 并经 host.executeLocal(local:executionId)执行;LocalPluginTaskInteractions 与 LocalPluginView 在本地对话绑定插件视图并驱动 invokeViewAction(旧 directoryBatches 批处理流已移除)。

aida-desktopapps/desktop/electron/plugin-host/local-plugin-provider.ts:23–634346d79eb36402355e51118df0edf1f98586880c符号:createLocalPluginProvider
aida-desktopapps/desktop/electron/plugin-host/local-plugin-task-interactions.ts:25–654346d79eb36402355e51118df0edf1f98586880c符号:LocalPluginTaskInteractions
aida-desktopapps/desktop/src/chat/local-workbench/LocalPluginView.tsx:12–454346d79eb36402355e51118df0edf1f98586880c符号:LocalPluginView