Files
胡飞 0b15383807 feat(extension): 插件 AI 工具与插件内 AI 侧边栏(plugin-ai-tools M0–M3)
按 docs/extension-resource-plugins/plugin-ai-tools.md 设计稿实现四个里程碑:

M0 契约层(extension-runtime)
- contributes.tools 清单声明:ToolContrib/ToolRisk/ToolAnnotations
- 安装期校验 tools_validation:id 唯一合法、backend 必须在 shellApp.backends、
  连接型必须有非 terminal 连接且 runtime 匹配、inputSchema 受限子集、
  超时/结果上限范围;错误路径统一 /contributes/tools/<id>/<field>
- 注册链 register_tools + catalog 索引 RegisteredToolContribution

M1 执行器(universal-plugins extension_tools)
- ExtensionTool 实现 agent_runtime::Tool:参数校验(受限 schema、未知字段丢弃、
  ≤64KB)→ 连接型资源校验(kind=extension:{ext}:{contribution})→ provider
  租约 RAII → open/invoke/close → ResultRef 解码截断;11 个 EXT_* 错误码
- navop_app agent_runtime_tool_registry 按 tool_exposure.agent.extensions 追加
- 设置加 extensions 开关(默认关)+ disabled_extension_tools 按扩展禁用

M2 插件 AI 侧栏
- NshTab 右侧 PluginAiPanel:每 tab 一个 DefaultAgentChatPanel sidebar 实例,
  默认收起、浮钮打开、宽 320–560 可拖
- 系统指令注入扩展标题/路由/连接/工具列表/页面上下文(带防注入标注)
- 页面 ABI 三通道:navop.ai.context(post 覆盖式 ≤2KB)/ open / ask

M3 外部 MCP
- ExtensionToolHandler 实现 tool_runtime::ToolHandler,连接型工具自动补
  connection 参数(id 或名称)
- McpToolset::Extensions(默认关)+ shell_domain 注册工厂
- 设置页 MCP/Agent 两处加「扩展工具」开关(三语文案)

验证:extension-runtime 227 / one-core settings 148 / universal-plugins(nsh-host)
58 / mcp_host 12 / shell_domain 42 / navop_app 601 测试全绿;RUSTFLAGS="-D
warnings" 全 crate --all-targets check 零告警。
2026-11-04 18:30:15 +08:00
..

Universal Resource Plugins

当前底层机制保持 headless;UI 平面已从 gpui-shell 换成 nsh(AppView + TSX 页面,签名包/能力模型沿用 nsh 的):

  • extension.json 声明 native IPC runtime;
  • 宿主按 namespaced runtime id 惰性启动和监督 provider;
  • provider 通过稳定 RPC 提供 resource、job、event stream、blob 能力;
  • 权限、进程生命周期、重启代数和 host blob 均由宿主管理;
  • shell view 是一个 nsh 应用(ui/pages/<page>/dist/bundle.js),宿主用 AppView 装载;页面通过 host.call("navop.*") 打能力平面;provider 仍不返回 UI tree。

扩展连接复用标准 StoredConnection、工作区、首页和侧边栏生命周期。 contributes.connections 声明宿主表单、IPC runtime 和可选 shellViewId:有 UI 时打开 connection-scoped shell tab,无 UI 时打开宿主 headless 状态 tab。job/event/blob、热更新 drain 和 permission facade 均复用同一 provider runtime。

UI 统一由 nsh 承载:宿主侧是 crates/universal-plugins/src/nsh_host/(页面装载、 租约、host ABI、嵌入页、运行监视),扩展侧是 TSX 页面 + 共享设计系统。

Runtime 生命周期

  1. ExtensionRuntimeCatalog 解析 runtime.ipc。
  2. ActivationManager::activate_runtime 启动或复用 runtime,并返回 activation lease。
  3. 调用方通过 ManagedUniversalPluginClient 使用 resource/job/event/blob 方法。
  4. 调用方释放 lease;最后一个 lease 释放后 provider 关闭。
  5. RuntimeMonitor 检查健康状态并按 manifest 策略执行有限重启。

当前边界

  • 不解析 contributes.declarativePanels。
  • 不提供 ui/action、ui/dialog、ui/window。
  • 不提供 WASM open-view 或 handle-view-action。
  • DB tree extension action 仍可执行无 UI WASM action。
  • extension_view 继续作为 Navop 的扩展安装/管理页面,与插件 UI 无关。

页面接入点

页面怎么写在 nsh-page-guide.zh-CN.md;宿主怎么装、 怎么派发能力的实现在 crates/universal-plugins/src/nsh_host/。旧文档 gpui-shell-extension-design.md 仅供追溯。

后续 ShellPluginHost 负责:

  • 根据 extension.json 中的新 shell contribution 定位脚本入口;
  • 先注册 navop.* HostModule,再实例化脚本视图;
  • 通过 UniversalPluginService::activate_runtime 获取 provider lease;
  • 把 resource/job/event/blob/db capability 暴露给脚本;
  • unload 时释放 host module、脚本 view 和 activation lease。