mirror of
https://github.com/feigeCode/navop.git
synced 2026-11-06 08:07:31 +00:00
按 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 零告警。
Universal Resource Plugins
- 扩展页面开发指南(nsh / TSX) —— 当前,写 UI 页面看这篇
- nsh 迁移方案 —— 这轮重构的方案与实施记录
- 通用资源扩展开发指南 —— provider / runtime / 清单机制(仍然有效)
gpui-shell 扩展设计—— 已废弃:UI 平面整体换成 nsh
当前底层机制保持 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 生命周期
ExtensionRuntimeCatalog解析runtime.ipc。ActivationManager::activate_runtime启动或复用 runtime,并返回 activation lease。- 调用方通过
ManagedUniversalPluginClient使用 resource/job/event/blob 方法。 - 调用方释放 lease;最后一个 lease 释放后 provider 关闭。
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。