胡飞
|
efe6688082
|
chore(release): 发布 v0.23.0-beta.6 测试版
v0.23.0-beta.6
|
2026-11-05 21:56:56 +08:00 |
|
胡飞
|
c4921306e9
|
fix(extensions): 语言扩展只以语言包形式展示
- 扩展管理页移除独立语言扩展,语言包卡片直接展示支持的语言(前 6 个 + 总数)
- 语言包详情弹窗新增“支持语言”一行;市场目录加载时用已安装语言包补全语言列表
- 单独安装语言扩展会被拒绝并提示改用语言包,市场目录中的旧 Language 条目不再展示
- 语言包描述优先读取 manifest.description,缺省回退为“<name> language bundle”
- 同步更新扩展文档与相关单测
|
2026-11-05 19:37:08 +08:00 |
|
胡飞
|
7e2ed0678e
|
test(i18n): 退出/关闭弹窗文案加输出级回归测试
契约测试只校验 yml 里的 `%{name}` 拼写,不验证 rust-i18n 真的把参数替换
进去。补一组直接对渲染结果断言的单测:三个语言的 `Quit.confirm_*_app` 与
`Tray.close_*_app` 渲染后既不能残留 `%{` / `{app}`,也必须带上产品名。
把 `Quit.confirm_title_app` 的 en 改回 `Quit {app}?` 实测会失败(报
「占位符没有被替换:Quit {app}?」),恢复后通过。
|
2026-11-05 17:33:37 +08:00 |
|
胡飞
|
811055c22d
|
fix(i18n): 退出弹窗的 %{app} 插值没生效,关闭提示顺手补上产品名
退出应用时的确认弹窗直接显示字面量 `{app}`:rust-i18n 的占位符语法是
`%{name}`,单花括号不会被替换。579da7841 引入 `Quit.confirm_*_app` 时写成
`{app}`,所以文案里的产品名一直没插进去,还顺带把原先「不带产品名」的三条
`Quit.confirm_*` 变成死键。
- `Quit.confirm_title_app / confirm_message_app / confirm_action_app` 的
`{app}` 改为 `%{app}`;删掉已无引用的 `Quit.confirm_*`。
- `Tray.close_title / close_message` 三个语言里硬编码 `Navop`,独立产品
(navop-shell / navop-data)会报错名字:改名为 `Tray.close_*_app` 并带
`%{app}`,调用点传产品名。
- `app_kit` 新增 `display_name()`,托盘与两个弹窗共用一个产品名来源,未
bootstrap 时回退 `AppIdentity::FULL`,不再各处 `unwrap_or("Navop")`。
- 按同一类问题审计了一遍全仓 `t!` 调用,一并修掉:terminal_view 的
`vi_mode_disabled` 补 `%{shortcut}`(用户此前看不到重新进入的快捷键);
one_ui 的两个 placeholder 删掉 rust-i18n 不认的 `default = …` 死参数;
ai_chat_view 的 `connect_acp_failed` 删掉文案里没有的 `error = …`。
- 新增契约测试 `every_t_interpolation_argument_matches_its_template`:
双向校验每个 `t!` 的命名参数与文案 `%{name}` 占位符(参数没被文案引用
会被静默丢弃,文案要的参数没传会露出 `%{参数}`),当前覆盖 5789 个调用。
验证(均带 `RUSTFLAGS="-D warnings"`):
- `cargo test -p navop_app --test i18n_locale_keys_contract`:2 passed;
另把 `Quit.confirm_title_app` 改回 `{app}` 实测测试会失败,确认能拦住回归。
- `cargo check -p one-ui -p ai_chat_view -p terminal_view -p app_kit --all-targets`。
- `cargo test -p one_ui --lib`(129 passed)、
`cargo test -p ai_chat_view --test acp_connection`(12 passed)、
`cargo test -p navop_app --lib close_choice`、
`cargo test -p terminal_view --lib vi_mode` 定向通过。
|
2026-11-05 17:29:07 +08:00 |
|
胡飞
|
c29d8c1f4c
|
test(windows_rdp_host): 契约测试跟进 CI gate 新增 webview-check job
|
2026-11-05 17:10:17 +08:00 |
|
胡飞
|
790a753e25
|
ci: wasm-tools 缓存路径兼容 Windows 的 .exe 后缀
|
2026-11-05 16:45:16 +08:00 |
|
胡飞
|
314f18dab1
|
ci: PR 跑快车道,完整三平台测试留在 main
PR 反馈太慢:三个平台各跑一遍 `cargo test --all`,全量编译 + 链接
是主要耗时,且 macOS / Windows 与 Linux 的测试覆盖高度重复。
- Linux 保留 `cargo test --all`,是 PR 唯一真正跑测试的 runner。
- macOS / Windows 在 PR 上只跑
`cargo check --workspace --all-targets`:编译库与测试目标、抓平台相关的
cfg / feature 编译错误,但不链接、不执行;完整测试改为只在 push main
与 workflow_dispatch 时跑。
- 把 Linux 的 `embedded-webview` opt-in check 从测试 job 里拆成独立的
`webview-check` job,和全量测试并行,不再串在关键路径后面多等几分钟。
- wasm-tools 缓存二进制(按版本 + runner OS 作 key),命中时省掉一次
`cargo install`;PR 上只有 Linux 需要它。
- Windows RDP 探针只在 main / 手动触发时跑,PR 阶段由 product-check 覆盖
打包形态。
预计 PR 关键路径从「最长 30+ 分钟」降到 17 分钟左右。
|
2026-11-05 16:44:36 +08:00 |
|
胡飞
|
1d52ba8141
|
refactor(app_kit): 新建连接去掉「扩展」类目,扩展连接归入中间件
- 侧栏类目从 8 个减为 7 个:全部 / 数据库 / 国产数据库 / 时序数据库 /
NoSQL / 中间件 / 终端,「扩展」入口不再单独成类。
- 扩展贡献的连接(group = Extension,或清单声明 category 为
extension/extensions)统一归入「中间件」,与「带连接的扩展就是中间件」
的归类一致。
- 补单测覆盖扩展种类 → 中间件,以及清单声明 extensions 时仍落中间件。
|
2026-11-05 16:09:24 +08:00 |
|
胡飞
|
d240c3cec1
|
fix(db): beta 构建也能加载外部驱动(预发布版本匹配)
SemVer 规定带预发布标识的版本不满足不含预发布标识的范围,
`0.23.0-beta.5` 因此不被驱动清单的 `>=0.10.0` 匹配,导致所有 beta /
dev 构建把已安装的外部驱动全部跳过(国产数据库类目为空,TDengine /
ClickHouse 这两个改由驱动提供的类型也一起失效)。
- `check_host_compatibility` 增加 `host_version_satisfies`:宿主是预发布
版本时先按原范围匹配,再退回 release 三元组匹配一次。
- 范围自身带预发布标识时不做回退(`>=0.23.0-beta.6` 不会被放宽成
`>=0.23.0`),保持 SemVer 严格语义。
- 单测覆盖 beta 宿主 + `>=0.10.0`、以及预发布范围不被回退绕过两种场景。
|
2026-11-05 16:04:11 +08:00 |
|
胡飞
|
a3f420d1de
|
fix(app_kit): 新建连接第 1 步默认三列,安装入口不再出现在「全部」
- 卡片网格由固定 280px 宽的 flex_wrap 改为 grid 三列等宽:默认一行三张
(752px 内容宽下每列约 242px),列数固定、不随卡片数量变化。
- 「更多中间件 / 更多时序数据库」安装入口只在自己的类目下出现,「全部」
只保留一个「更多连接」,避免同一页出现两个「更多」卡片。
- 删除不再使用的固定卡宽常量。
|
2026-11-05 15:58:17 +08:00 |
|
胡飞
|
06ad4bd9ea
|
fix(app_kit): 新建连接空类目保持旧版空白,不再显示占位文案
|
2026-11-05 14:30:30 +08:00 |
|
胡飞
|
ede63eb0d8
|
fix(app_kit): 新建连接第 1 步按旧版结构重排,恢复底部按钮
对照旧版 NewConnectionWindow::render() 逐项还原:
- 去掉内容区自造表头(标题 + 「第 1 步 / 共 2 步」+ 关闭按钮):旧版弹窗
只用窗口标题栏,内容区从类目栏 / 卡片区直接开始。同步删掉不再使用的
close / step_indicator 三语键。
- 底部「取消 / 下一步」改为根节点全宽 footer,与侧栏并列而不是塞进右侧
列:之前被内容高度挤出可视区,底部按钮直接看不见。
- 卡片区恢复旧版两层结构:外层 flex_1/h_full/min_w_0/overflow_hidden,
内层 size_full 滚动 + bg muted + p_6;避免卡片把窗口撑高、footer 被顶走。
- 侧栏恢复 flex_none、gap_2(原来 0.5)与旧版间距。
- 卡片补 relative,选中态才加左侧 3px 边,与旧版一致。
验证:cargo check -p app_kit --all-targets 无告警;cargo build -p navop 通过。
|
2026-11-05 14:29:26 +08:00 |
|
胡飞
|
7c0d104d34
|
chore(release): 发布 v0.23.0-beta.5 测试版
v0.23.0-beta.5
|
2026-11-05 11:17:33 +08:00 |
|
xiaofei
|
f8a8ea02fe
|
Merge pull request #512 from feigeCode/refactor/nsh-host
feat(extension): nsh 页面走 host ABI v2 + 插件 AI 工具与侧边栏(M0–M3)
|
2026-11-05 11:14:10 +08:00 |
|
胡飞
|
9475328efd
|
test: 发布契约跟上 nsh-host feature 新增的侧栏依赖
plugin-ai-tools M2 给 universal-plugins 的 nsh-host feature 追加了三个
可选依赖(ai_chat_view/one-ui/serde,插件 AI 侧边栏用)。CI 的
script/test-release-packaging.mjs 把 feature 数组写成字面量断言,元素
间不容差异,linux job 十秒就红。断言改成元素间允许空白分隔的形式。
验证:node --test script/test-release-packaging.mjs 46 passed 0 failed。
|
2026-11-04 19:07:25 +08:00 |
|
胡飞
|
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 |
|
胡飞
|
4fe4122c22
|
Merge remote-tracking branch 'cnb/dev' into refactor/nsh-host
|
2026-11-04 18:21:34 +08:00 |
|
胡飞
|
43eee0e467
|
feat(data_domain): 已安装的外部数据库驱动接回新建连接
产品分离后 data_domain 只注册内置数据库与 Redis/MongoDB,驱动清单里的
外部驱动(国产数据库等)既不出现在新建入口,表单也拿不到驱动 ID。这次把
它接回新架构,并保持各产品仍由 registry 驱动。
- domain_api:ConnectionKindDescriptor 增加可选的运行时元数据——标签覆盖、
卡片描述、旧版类目(如 domestic_database)与图标来源(随包资产 / 磁盘
文件),都用构建器方法按需填充,既有构造点无需改动。
- data_domain:kind_descriptors() 追加已安装驱动(跳过 ui.show_in_new_connection
为 false 的、以及由内置类型代表的 duckdb / oracle-go / tdengine / clickhouse),
ID 为 db:external:{driver_id},标签/描述/类目/图标取自驱动清单;resolve_kind
认这个 ID 并还原成 DatabaseType::external;kind_for 把外部数据库连接映射回
同一种类;数据库表单对 External 传入 external_driver_id。
- app_kit:向导按 descriptor 的类目、描述、图标渲染;驱动清单里的
domestic_database 归入「国产数据库」,未识别的类目仍按分组回退。
测试:新增域契约与向导类目单测(data_domain 9 个、app_kit 3 个);
cargo check -p domain_api/data_domain/app_kit/navop_app、cargo build -p navop、
i18n 契约测试均通过。
|
2026-11-04 16:57:03 +08:00 |
|
胡飞
|
5074b02f19
|
feat(app_kit): 新建连接第 1 步恢复旧版八类目与「更多连接」入口
- 类目侧栏恢复旧版 8 项:全部 / 数据库 / 国产数据库 / 时序数据库 /
NoSQL / 中间件 / 终端 / 扩展,标签与图标对齐旧版(NoSQL、Extensions
沿用英文固有名,其余走 i18n)。
- 「全部」内的卡片顺序恢复旧版 rank:ssh / rdp / vnc / redis / mongodb /
serial / telnet / ftp / port_forwarding 在前,数据库类型按注册顺序在后,
保证各产品(全量、数据库、终端)仍由 registry 动态提供类型。
- 空类目安装入口与「更多连接」卡片:中间件 / 时序数据库无类型时插入
「更多中间件 / 更多时序数据库」入口,全部类目末尾固定「更多连接」;
点击直接关闭向导并切到扩展管理 tab,双击 / 回车 / 下一步同样触发。
- 新增 app_kit::host::ExtensionsHost 桥(open_extensions),navop_app 用
GlobalHomePage 实现并注册,避免 app_kit 反向依赖扩展运行时。
- app_kit 语言包补齐 7 个三语键,删除不再使用的 remote / extension 类目键。
验证:cargo check -p app_kit --all-targets、cargo check -p navop_app --lib、
cargo build -p navop、cargo test -p navop_app --test i18n_locale_keys_contract
均通过;本次改动无新增 clippy 告警。
|
2026-11-04 16:21:05 +08:00 |
|
胡飞
|
d88d2c236a
|
feat(app_kit): 新建连接恢复两步向导(类目 + 卡片选择)
- 第 1 步整页选择连接类型:左侧类目(全部/数据库/终端与文件/远程桌面与转发/扩展)加右侧卡片网格,卡片带彩色图标、名称与描述
- 第 2 步渲染连接表单,左下角提供「上一步」返回;编辑/复制仍直达表单
- 支持上下左右 + Enter 键盘导航,双击卡片可直接进入表单
- 类型清单继续由领域 registry 提供,保留多产品/多版本构建能力
- 文案迁入 app_kit 语言包(中英繁三语),新增 one-assets 依赖提供类型图标
|
2026-11-04 15:30:07 +08:00 |
|
胡飞
|
a46bb4b995
|
feat(extension)!: 页面走 host ABI v2,扩展收成一个 nsh app
页面与宿主的接口换到 v2 四通道:
- host.params 承载启动事实(apiVersion / extension / backends / connection /
route),首帧同步可读,删掉 navop.context.current 启动 RPC;
- host.on("navop.event") 承接资源事件(批次 <= 64、溢出带 EVENT_OVERFLOW 与
since 续订),删掉 navop.event.read 轮询;
- host.call 只留动作(resource / job / blob / event.subscribe / runtime.info /
dev),host.post 只留 navop.log;
- 错误走 nsh 的 JsError::Fields(code / retryable / details),删掉
__NAVOP_ERROR__ base64 信封;nsh 依赖随之 bump 到 fc4c88e6。
权限收成单层:declared = granted = grant(modules ∩ permissions),harden 恒开,
未声明模块仍然注册 handler 但在调用时回 PERMISSION_DENIED(details.module),
dev 模块只给 com.navop.devtools。
扩展形态从「一页一个 nsh 包」收成「一个扩展一个 app」:contributes.shellApp
取代 shellViews,宿主一个 app 一个 tab,页面由 app 内部路由组织,host.params
多一个 route。文档新增 host-abi-v2.md / plugin-app.md,page-guide、
development-guide、migration-plan 同步。
验证:cargo test -p extension-runtime --lib 212 passed;
cargo test -p universal-plugins --features nsh-host 33 passed;
cargo check -p navop_app;7 个页面 app 的 nsh build/test 全绿;
子仓 node --test tests/scripts.test.mjs 141 passed。
|
2026-11-04 12:33:55 +08:00 |
|
胡飞
|
da8e238376
|
Revert "chore(release): 发布 v0.23.0-beta.5 测试版"
This reverts commit a65fd44be8.
|
2026-11-03 20:27:46 +08:00 |
|
胡飞
|
a65fd44be8
|
chore(release): 发布 v0.23.0-beta.5 测试版
插件引擎换代(gpui-shell → nsh)之后的第一版 beta:26 个插件页面重写、
原生组件内嵌、剪贴板写权限;另外带 Shell/Data 独立图标、设置页顺序、
迁移包层级修复。扩展包这版不发,市场里仍是旧包,说明里已注明。
|
2026-11-03 20:13:10 +08:00 |
|
xiaofei
|
c88409e311
|
Merge pull request #507 from feigeCode/refactor/nsh-host
refactor(extension)!: 扩展 UI 平面迁移到 nsh,插件机制收敛为「一个 tab + 最小 API」
|
2026-11-03 19:01:25 +08:00 |
|
胡飞
|
b1ceab97f2
|
chore: 子模块 navop-extensions 指向 nsh 页面重写合并后的 main (#16)
|
2026-11-03 18:04:27 +08:00 |
|
胡飞
|
419a91e734
|
fix: 32 位 Windows 的构建形态要能编过
i686 的 Build shape 用 `--no-default-features --features
wasm-components,windows-native-rdp`,没有 `nsh-host`,但 `shell` 在场:
`home_strategy.rs` 里 `TabItem` 的导入被挂在 `all(shell, nsh-host)` 上,
于是终端型连接那条路径引用了一个未导入的类型(E0433)。
`TabItem` 实际上只被 `#[cfg(feature = "shell")]` 的两个分支用到(终端型
连接、nsh 页面 tab),所以门就开 `shell` 一个。两种形态都验过:
`cargo check -p navop_app --no-default-features --features
"wasm-components,windows-native-rdp"` 与默认 `cargo check -p navop_app`
都零错误。
|
2026-11-03 17:07:52 +08:00 |
|
胡飞
|
30ce9a2cff
|
build: gpu-allocator 的 windows 边钉到 wgpu-hal 用的 0.62
上一版钉成 0.61.3 还是对不上:wgpu-hal 30.0.1 自己依赖 windows 0.62
(不是 0.61)。gpu-allocator 的区间是 ">=0.53, <=0.62",钉到 0.62.2
才是同一个类型。cargo check --locked -p navop 通过。
|
2026-11-03 16:46:15 +08:00 |
|
胡飞
|
07a30eba17
|
build: wgpu-hal 与 gpu-allocator 统一到 windows 0.61
Windows 的 Build shape 挂在 `wgpu-hal-30.0.1/src/dx12/suballocation.rs`:
`ID3D12Device` 类型对不上。原因是 `gpu-allocator 0.28` 把 windows 依赖写成
**版本区间** `>=0.53, <=0.62`,解析器给它挑了 0.58(gpui-base /
gpui-component 正好用 0.58),而 wgpu-hal 30 自己用的是 0.61.3 —— 两边
`ID3D12Device` 不是同一个类型。
修法:把 lock 里 gpu-allocator 指向的 windows 边改成 0.61.3(区间允许),
这样它和 wgpu-hal 对同一份 windows 编译。`cargo check --locked -p navop`
与三个产品的 check 都通过,说明解析结果自洽。
这条是 lock 级别的钉法:下次 `cargo update` 可能把 gpu-allocator 又拉回
0.58(因为区间自由)。更稳的长期方案是让 nsh 的 GPUI 后端把 `shader`
特性做成可选(navop 不需要 wgpu 的 `<Shaders>`),那一并解决「两份 wgpu /
一份 wgpu 的编译成本」——已记进迁移方案的待办。
|
2026-11-03 16:28:55 +08:00 |
|
胡飞
|
173e1087c4
|
fix: 修干净不带 shell 的构建形态与 CI 的 -D warnings
CI 的 Build shape 三个产品一起红,暴露的是「nsh-host 开、shell 关」这个
组合(navop-data / 部分 navop-shell 配置)从没被本地验证过:
- `dev_host_ops` 依赖 `dev_extension_registry`,后者是 `shell` feature 的
模块。前者只挂了 `nsh-host`,于是 `crate::dev_extension_registry` 找不到。
现在两者用同一组 cfg:`all(nsh-host, shell)`。
- `home_strategy` 里 `TabItem` 只在终端型连接那条路径用,`shell` 关掉时是
未使用导入;改成 `all(nsh-host, shell)` 下才导入。
- `dev_extension_registry` 的 `Ordering`、`dev_host_ops` 的 `Context as _`
与 `DevOps` 都是重构后残留的未使用导入,删掉。
- `extension-plugin-adapter` 的 `ResourceSessionHandle::client()` 唯一消费者
是已删除的 workbench dispatch,删掉(默认集不带 nsh-host 时它是 dead code,
CI 的 `-D warnings` 直接判死)。
验证:`cargo check -p navop / navop-data / navop-shell --target aarch64-apple-darwin`
三个产品零告警零错误;`cargo test -p universal-plugins --features nsh-host` 29 passed、
`-p navop_app --lib` 597 passed。
|
2026-11-03 16:16:35 +08:00 |
|
胡飞
|
7802bce480
|
test: 发布契约跟上 nsh-host 的 feature 改名
CI 的 `script/test-release-packaging.mjs` 把「默认集里必须有 shell-plugins」
写成了字面量断言,改名成 nsh-host 之后第一个 job 十秒就红了。这次一起把
契约改成新形态,并顺带把 nsh 后端自己的 webview 也纳入同一条规则:
- 默认集断言改成 `["wasm-components","windows-native-rdp","nsh-host","database","shell"]`;
- `universal-plugins` 断言从 `gpui-shell` 换成 `nsh-platform-gpui/nsh-core/nsh-engine`,
并新增一条:workspace 里 `nsh-platform-gpui` 必须是
`default-features = false, features = ["js"]` —— 它的 `webview` 特性会拖进
wry/WebKitGTK,和原来的 embedded-webview 一样不能进默认集。
(`.github/workflows/` 里两处注释还写着 shell-plugins:本机 token 没有
workflow scope,推不了 workflow 文件的改动,留到有权限时顺手改。)
验证:`node --test script/test-release-packaging.mjs` 45 passed;
`cargo test -p navop_app --test i18n_locale_keys_contract` 1 passed。
|
2026-11-03 15:44:28 +08:00 |
|
胡飞
|
1a5fa0bb75
|
refactor(extension)!: 删掉工作台清单类型的残留
上一提交把 `contributes.resourceWorkbenches` 字段删了,但类型定义还躺着:
`ResourceWorkbench*`(675 行的 `contributes/resource_workbench.rs`、
`types/resource_workbench.rs`、`types/workbench_operation_catalog.rs`)、
只测这些校验器的 `tree_children_tests` 模块、以及 `InvalidResourceWorkbench`
错误变体。清单里已经没有字段能往里装东西,这些类型没有任何读取者。
一起清掉之后 `catalog.rs` 的工具箱过滤也不再有「工作台页体」这个例外分支
——那条例外的前提(`pages[*].renderer.viewId`)已经不存在了。
同时把 docker 的容器终端页(原生组件 `navop.terminal`)接进清单:
`shellViews` 加 `container-terminal`,权限沿用扩展级的 `shell:exec`。
验证:`cargo test -p extension-runtime` 204 passed、`-p extension-plugin-adapter`
82 passed、`-p universal-plugins --features nsh-host` 29 passed、
`-p navop_app --lib` 597 passed、`cargo check -p navop_app --all-targets` 0 error。
(`db_tree_action_runs_registered_wasm_component` 仍是既有 wasm fixture 未构建的
失败,基线同样失败。)
|
2026-11-03 15:12:14 +08:00 |
|
胡飞
|
545e2504de
|
feat(extension)!: 原生组件(nativeComponent)+ 删掉终端宿主旧契约
页面是 TSX,终端这种「必须是 Rust 实体」的东西界面里没处放。这次给
nsh 宿主补上原生组件,并把为它存在的旧机制整条删掉。
注入方向是「注册表在扩展宿主、实现在应用层」:`nsh_host/native.rs` 只有
`register_native_component` 与 `NativeViewContext{extension_id, view_id,
allow_process}`;`NshTab` 建视图时用 `components_for(&contribution)` 拼出
**本页面**的 `Components` 交给 `AppOptions.components`(不是进程级
`set_ui_sets` —— 那样一页注册的名字会漏给所有页面)。实现放在
`shell_domain::native_terminal`,扩展宿主因此不用依赖 `terminal_view`。
权限:`allow_process` 只看扩展清单有没有 `shell:exec`。终端起的是宿主本地
进程、命令与参数必须由页面显式给出;没有权限时组件渲染一行错误,不静默
失败。「重新连接」= 改 `env` 让宿主重开一个 pty;只改 `title` 不重开。
组件 drop 时主线程拿不到 `App`,所以走一条回收队列,主线程补
`shutdown_embedded`(否则 pty 与连接占用要留到进程退出)。
删掉的旧机制(都是这次才真正无人调用的):
- `crates/resource_view` 整个 crate(3228 行原生工作台 + `TerminalHost`);
- `extension_plugin_adapter::workbench_dispatch`(`dispatch_invoke*/job*`、
`BindingContext`);
- `extension-runtime::registration` 的 workbench 校验簇与它唯一的测试模块;
- `shell_domain::workbench_terminal` 的 `NativeTerminalHost`(保留 AI 工作台
的终端面板提供者)。
顺带:`navop.resource.invoke` 现在会把 provider 在 invoke 响应里交出的事件流
登记进 EventActivationManager(原来只有 workbench dispatch 做这件事,删掉
dispatch 后不补的话,页面拿到的流第一次读就会被拒)。
验证:`cargo test -p extension-runtime` 207 passed(唯一失败
`db_tree_action_runs_registered_wasm_component` 是既有 wasm fixture 未构建,
基线同失败);`-p universal-plugins --features nsh-host` 29 passed;
`-p navop_app --lib` 597 passed;`cargo check -p navop` 通过;clippy 对新代码
零告警。docker 新增 `container-terminal` 页(`nsh check/build/test` 5 用例全过)。
|
2026-11-03 14:57:51 +08:00 |
|
胡飞
|
2daa7c51d6
|
feat(branding): 独立产品图标改成「N + 领域脚标」
上一版把 N 换成了终端/数据库字形,产品看起来像另一个牌子。改成保留品牌
N 主图,只在右下角压一枚圆形脚标:Shell 是终端提示符,Data 是数据库柱体。
- 品牌主图取 Navop.icns 里最大的 1024 版本,落到 resources/branding/navop-1024.png,
三个尺寸都从它缩,细节不糊。
- 脚标按画布比例定位(圆心 0.792、半径 0.158),外圈深色描边把脚标和主图
背景分开,缩到 32px 仍能看出「N + 一个亮圆点」。
- 生成脚本去掉按产品重绘主图的分支,只剩「主图 + 脚标」合成;斜向渐变改用
「横条渐变逐行偏移」,避免旋转补出的黑角把脚标啃掉一块。
|
2026-11-03 13:59:42 +08:00 |
|
胡飞
|
a701121637
|
feat(branding): Shell 与 Data 换成各自的图标,三个产品不再共用一套
之前三个产品共用 resources/windows/navop.ico、macOS 的 Navop.icns 与 Linux 的
三张 navop png(Shell/Data 的 png 只是复制品),装在一起几乎分不出来。
- 新增 script/generate-product-icons.py:同一套视觉语言(深蓝圆角底 + 青蓝渐变
前景),Shell 用终端提示符、Data 用数据库柱体,输出 Linux PNG(128/256/512)、
macOS ICNS、Windows ICO(16~256)。
- macOS:bundle-macos.sh 按产品选 Navop / NavopShell / NavopData 的 icns,
Info.plist 的 CFBundleIconFile 仍是 Navop,拷贝时统一重命名。
- Windows:apps/navop-shell|navop-data/build.rs 嵌入各自的 ico;独立产品的
MSI/卸载项通过 build-product-installer.ps1 的 -IconPath 传入产品图标。
- Linux:package-linux-product.sh 本来就读 <product>-<size>.png,把复制的
png 换成新绘制的一套。
- 打包测试补「每个产品都有自己的图标」:build.rs 的 ico 路径、macOS icns 映射、
Linux 三尺寸 png、独立产品安装包 -IconPath。
|
2026-11-03 13:50:22 +08:00 |
|
胡飞
|
f36c46d5f6
|
fix(import): 迁移包保留工作区层级,全量产品的父子结构不再被拍平
从全量 navop 导入到 Shell / Data 时,所有工作区都落到顶层:迁移包格式里只有
name/color/icon,规划阶段按名字重建,落库时 parent_id 写死 None。
- 迁移包升到 v2:BundleWorkspace 增加 id / parent(都是可选字段,v1 包照旧按
平铺导入);sqlite 读取端把 workspaces.parent_id 转成包内 `w<id>` 标识。
- 规划阶段新增 parent_key,按「父在前」拓扑展开后解析父级;父级已被复用、
缺失、自指向或父子成环时都不会卡住导入(成环只断一条边)。
- 落库时把 parent_key 换成父工作区的本地 id,写入 Workspace.parent_id。
- 测试:层级读取、嵌套排序、复用已有父级、成环兜底各一条。
|
2026-11-03 13:50:08 +08:00 |
|
胡飞
|
3780a0a95d
|
refactor(settings): 设置页把数据库与终端提到前面,账户与关于收尾
设置侧栏原来的顺序是通用 → Agent/ACP/MCP/同步/快捷键/LLM 提供商 →
账户/关于 → 数据库/SQL 格式化/终端,日常最常用的数据库与终端被挤到最后。
现在改成:
通用 → 数据库、SQL 格式化、终端(领域页)→ Agent、ACP、MCP、同步、
快捷键、LLM 提供商 → 账户、关于。
领域页由领域注册表按 order 提供,数量随参与编译的领域变化,所以「同步」页
的绝对下标不能写死常量:改为在拼接页面时按「通用 + 领域页」的数量现算,
`SettingsPanel` 也由存下标改为存「默认打开哪一页」,同步冲突入口仍能直接
跳到同步页。
|
2026-11-03 13:28:18 +08:00 |
|
胡飞
|
471a2d4d0c
|
docs(extension): 记录「组件体常量冻结」这个坑 + 修一条过期断言
`nsh-page-guide` 补第 10 条坑:组件体只跑一次,把 props 算成常量就是挂载值
(按钮永久点不动 / 进度条不动 / 空态不消失),只有 JSX 属性表达式与子节点
绑定按帧求值。这是这次改页面时踩到的最贵的坑,写进指南比写在提交里有用。
`bundle.rs` 的试点页断言还要求页面声明 `navop.workbench.*`——工作台已经删了,
改成要求 `navop.resource.*` 且不得残留 workbench 命名空间。
|
2026-11-03 13:21:26 +08:00 |
|
胡飞
|
8cf0e8ca3f
|
docs(extension): 插件机制收敛为「一个 tab + 最小 API」
|
2026-11-03 13:05:20 +08:00 |
|
胡飞
|
e6791f447c
|
refactor(extension)!: 只保留「一个 tab 视图 + 最小 API」
原生资源工作台整套删掉:声明式表格 UI、工作台清单、`navop.workbench.*`
通道、headless 连接 tab 全部不再存在。一条扩展连接现在只有一个形态——
扩展自己的页面。页面想看什么、怎么排版,都由页面决定。
为什么删:工作台是"宿主替扩展画 UI"的第二套机制,它的存在让每条连接
都有两条路(有工作台走原生、没有才开页面),页面因此被迫依赖
`workbench.dispatch` 才能拿到数据,扩展作者也无法真的自由发挥。
保留下来的能力面:context / resource / job / event / blob / runtime / log /
dev;theme 与 i18n 仍由宿主推送(页面 token 依赖)。`resource.invoke` 现在
由宿主自己解码 provider 的 `ResultRef`(inline 直接给值、blob 走分片读并按
8 MiB 上限拼回 JSON、事件流给句柄),页面拿到就是普通数据。
清单侧:`contributes.resourceWorkbenches` 字段删除(旧清单里的这个键会被
serde 忽略),连接必须用 `shellViewId` 指到自己的页面。
验证:`cargo test -p extension-runtime` 217 passed(唯一失败
`db_tree_action_runs_registered_wasm_component` 是既有 wasm fixture 未构建,
基线同样失败);`cargo test -p universal-plugins --features nsh-host` 28
passed;`cargo test -p navop_app --lib` 597 passed;clippy 对本 crate 无新增告警。
|
2026-11-03 13:02:06 +08:00 |
|
胡飞
|
4e9fbd7d69
|
chore(extension): 指向扩展仓的旧页面清理提交
|
2026-11-03 11:47:26 +08:00 |
|
胡飞
|
94001a6187
|
build: 依赖图收敛为单份 wgpu 30
nsh fork 的 navop/gpui-0.1.12 已把 wgpu 从 29 升到 30(e2a57dd3),这里跟着
`cargo update -p nsh-engine/nsh-core/nsh-platform-gpui`:锁文件里 wgpu 只剩
30.0.1,wgpu-core / wgpu-hal / wgpu-types / wgpu-core-deps-apple|emscripten|
windows-linux-android / wgpu-naga-bridge 的 29.0.4 一整套全部移除。
验证:`cargo test -p universal-plugins --features nsh-host` 39 passed(含
`every_built_page_in_the_extension_repo_loads`,顺带覆盖了旧页面删除后的扩展仓)。
|
2026-11-03 11:47:22 +08:00 |
|
胡飞
|
76886f3818
|
docs(extension): nsh 页面开发指南 + 迁移方案实施记录
`nsh-page-guide.zh-CN.md` 是扩展作者写页面的唯一入口:页面工程结构、
`navop.*` 命名空间表、tab 与工作台嵌入两种形态、共享设计系统、10 条
nsh/TSX 坑、测试写法、交付清单。
同时把旧文档定性:`gpui-shell-extension-design.md` 标为废弃(只留追溯),
`development-guide.zh-CN.md` 只在顶部注明"provider/runtime/清单仍然有效,
UI 部分已过期"——它的权限与 runtime 章节现在还是准的,删掉不如标注。
迁移方案补 §14.5,告诉接手的人:加能力改哪、加页面形态改哪、别再加回
gpui-shell。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
64640e33a4
|
feat(extension): 页面可申请剪贴板写权限
Elasticsearch mapping 页要「复制字段名」,但宿主的能力上限里没有
clipboard,`Clipboard.writeText` 只会 warn 后静默失败 —— 看起来能用,
实际什么都没复制。
上限这里放行 clipboard,页面仍要自己在 nsh.json 里声明 `"clipboard":
true` 才生效(nsh 拿声明与上限取交集)。写剪贴板只影响用户下一次粘贴,
且必须由页面在一次按键/点击里发起,风险低于 fs/net,所以不默认拒绝。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
765b2f6763
|
refactor(extension)!: 删掉 engines.gpui_shell 版本门
宿主已经没有 gpui-shell 那条渲染路径了,再接受这个门只会让扩展以为
自己能跑:清单声明 `engines.gpui_shell` 就能注册成功,打开页面却装载
失败。现在 shellView 只认 `engines.nsh`,缺了就在清单校验阶段报
`/engines/nsh`。
连带删掉 `RegisteredShellViewContribution::required_gpui_shell_version`
与 `GPUI_SHELL_VERSION` 常量;docs 里的 reference 扩展(elasticsearch)
改成声明 `engines.nsh: "0.3.0"`。
另外修 `navop.dev.openView` 的入参优先级:它认扩展 id,其余 dev 操作认
项目根路径,之前一律先读 `root`,页面按 `{extensionId, viewId}` 传会拿到
`view not found: <root>/<viewId>`。
验证:`cargo test -p extension-runtime` 234 passed(唯一失败是既有的
wasm fixture 未构建,基线同样失败);`cargo test -p universal-plugins
--features nsh-host` 39 passed;`cargo check -p navop_app` 通过。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
1ed8a71b54
|
test(extension): 扫扩展仓验证每个已迁移页面都能装载
M8 要一页页重写,谁也不该记着往测试清单里补一行。这条用例直接扫
`extensions/*/*/ui/pages/*/dist/bundle.js`:每多一页产物就自动多覆盖
一页,产物缺失(子模块没初始化)时跳过。
断言三件事:产物里的 `app.json` 能给出 app_id、程序是 JS 形态、
`capabilities.json` 里声明了至少一个 host 能力 —— 最后一条最容易漏,
而漏了页面在运行时调什么都会被拒。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
75221f007e
|
chore(extension): 收尾 M7 遗留的 gpui-shell 措辞
- 开发扩展的测试清单 fixture 改用 `engines.nsh`(旧门仍能装载,但新
建的开发扩展没有理由再声明一个已经不存在的宿主)。
- 提示文案与注释里的 "shell-plugins build" 统一改成 nsh 构建;这些字
串会出现在用户可见的错误提示里,不该再提一个删掉的平面。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
8a8cfc65df
|
refactor(extension)!: 删除 gpui-shell UI 平面(迁移 M7)
扩展页面的 UI 平面只剩 nsh。`gpui-shell` 从依赖图里彻底消失
(`cargo tree -i gpui-shell` 报 "did not match any packages",
`Cargo.lock` 里已无该包),`shell_plugin_host` / `shell_plugin_tab` /
`shell_page_host` 三个模块文件一并删除,`shell-plugins` feature 换成
`nsh-host`。
删除前补齐了三处 gpui-shell 在做、nsh 侧还没有的事,否则删掉是减功能
而不是换实现:
- **连接型页面**:`NshHost::open_connection` 按保存的连接配置打开
provider 资源,句柄归页面所有(`owned: true`),tab id 固定为
`extension-connection:{id}` —— 同一条连接只开一份资源。
- **扩展退役**:`close_extension` 恢复 gpui-shell 的完整流程
(`begin_extension_retire` → 关掉脚本页与 headless 连接 tab →
`deactivate_extension` → `finish_extension_retire`),装不干净时也会
把扩展从"退役中"状态放出来,免得它永远打不开。
- **provider 重启**:移植监视桥。事件带完整语义(generation、session
是否关闭),页面按 `decide_runtime_change` 分三种处理:瞬时抖动忽略、
换进程就重装页面、被移除就停在错误页并提示重开。连接型页面无法重放
启动参数(连接配置已交给 provider),所以换进程时提示重新打开连接。
另外:界面语言变化改走 `set_locale`(页面重渲染取词条),不再重跑脚本;
`navop_proof` 之外没有任何调用方还知道 gpui-shell 的存在。
验证:`cargo test -p universal-plugins --features nsh-host` 38 passed;
`cargo check -p navop_app`(默认已含 nsh-host)通过;`cargo check -p navop`
通过;clippy 对本仓 crate 零告警;nightly fmt。
|
2026-11-02 23:41:55 +08:00 |
|
胡飞
|
260ba3b40d
|
feat(extension): 主线程桥 + 能力上限(迁移 M7 第一批)
两件事,都是"删 gpui-shell 之前必须先补上的缝":
1. **主线程桥**。nsh 页面跑在引擎线程上,而 `navop.dev` 这些操作要碰 GPUI
全局(dev 工程注册表、窗口、文件选择器)。加了 `dispatch::MainThread`:
引擎线程把 `FnOnce(&mut App)` 投到主线程队列并等结果,闭包要求 `Send`,
所以只能带字符串/JSON 过去 —— 主线程上再取 Global。
2. **能力上限**。之前页面不写 `capabilities` 就等于拿到 `Capabilities::all()`:
nsh 的 `Policy::access()` 在 `declared` 缺失时退回全集,而宿主没设
`granted`。现在按 manifest 的 `permissions`(fs/net/spawn)与
`shellViews[].modules`(宿主函数命名空间)组装 granted 上限,页面的声明
只能落在里面。无法翻译的权限(`*` 通配、展开不了的环境变量路径)记为
skipped 并告警,不静默放权。
`navop.dev` 的操作集同时改写成 JSON 形态(`DevOps`,每个函数 `&mut App`
上执行),main 层注入;`install_dev_host_ops` 只负责装 Global 与调用注入。
验证:`cargo test -p universal-plugins --features nsh-host` 38 passed(新增
grant 的三条用例:模块→命名空间、spawn 取 basename、`*` 通配被丢弃);
`--features shell-plugins` 67 passed;`cargo check -p navop_app --features
nsh-host` 通过;nightly fmt。
|
2026-11-02 23:41:54 +08:00 |
|
胡飞
|
7301da8e6c
|
feat(extension): 页面产物布局 + 试点页接入(迁移 M6 第二批)
发布出去的页面目录里没有 `nsh.json`(那是构建输入),只有 `nsh build` 的
产物:`bundle.js` + `app.json`(app id)+ `capabilities.json`(能力声明)。
所以装载顺序改成先读产物、再回落到源目录形态,能力仍按声明收窄。
试点页(docker 引擎概览)落在扩展仓 `ui/pages/overview/`,产物入库,
`entry` 指向产物。加一条用例用**真实产物**验证这条路径:app id 来自
`app.json`、`capabilities.json` 里的 `navop.workbench.*` 成为声明上限。
扩展仓没检出产物时用例跳过 —— 和旧渲染底座测试同样的处理。
|
2026-11-02 23:41:54 +08:00 |
|
胡飞
|
4c52e62595
|
feat(extension): nsh 嵌入资源工作台页面(迁移 M5 第二批)
Docker / MQTT 这些真实扩展的页面不是独立 tab:它们声明
`modules: ["context","workbench"]`,从资源工作台里嵌进来,主资源是外层
连接会话开好的那一个。所以只做 tab 路径的话,M8 重写的页面根本跑不起来。
补齐三块:
- 借来的资源(`owned: false`):页面能 invoke 它,但关闭时**不**调
provider 的 close —— 那是外层连接的东西,关掉就把别人的连接掐了。
- `navop.workbench.current / dispatch`:`current()` 纯读页面上下文,
`dispatch` 按 operation 的 mode 走 invoke 或 job 分派。`BindingContext`
原样取自 `page_context`(route/selection/paging/connection),与原生
工作台同源——两边解析 `source: connection` 必须得到同一个值。
- `CustomPageHost` 实现:嵌入页仍走同一套 session/ABI,只是多一个借来的
句柄和 workbench 通道。黑名单与 gpui-shell 版逐条对齐:原始
resource/job/event/blob/runtime/dev 模块一律挡住,i18n/theme 放行
(它们读的是宿主自己的语言和主题,不带资源访问)。
验证:`cargo test -p universal-plugins --features nsh-host` 34 passed,
新增两条用例覆盖嵌入页的模块门(缺 context / 缺 workbench / 混入原始
资源模块);`--features shell-plugins` 67 passed 未回归;clippy 与本
crate 零告警;nightly fmt;`cargo check -p navop_app --features nsh-host`。
|
2026-11-02 23:41:54 +08:00 |
|