From 97e5ae50b53d56069d6320a2b171127bf387e8fa Mon Sep 17 00:00:00 2001 From: TommyFang Date: Mon, 17 Aug 2026 00:48:38 +0800 Subject: [PATCH] release: v0.1.2 - bundle dshmarket 1.10.1; drop the duplicate vision settings section (modlens card is the single config surface) - embed the updater signing public key in every build (Makefile / CI / Flatpak); in-app updates now actually run - structured release notes per version: docs/release-notes/v.md feeds GitHub, Gitea and the in-app update panel - gate releases on the notes file; Gitea publish reads/patches the same body --- .github/workflows/release.yml | 24 ++ Cargo.lock | 4 +- Cargo.toml | 2 +- Makefile | 12 +- README.md | 10 +- THIRD_PARTY.md | 3 +- crates/dsh-core/src/modlens.rs | 41 +--- ...o.github.tommyfang.DshDesktop.metainfo.xml | 10 + docs/release-notes/v0.1.1.md | 19 ++ docs/release-notes/v0.1.2.md | 26 +++ docs/screenshots/src/vision.html | 12 +- docs/screenshots/vision.png | Bin 104626 -> 105726 bytes docs/screenshots/vision.webp | Bin 9566 -> 36430 bytes flatpak/io.github.tommyfang.DshDesktop.yml | 3 +- plugins/dsh-desktop-vision/client.js | 209 ------------------ plugins/dsh-desktop-vision/cordis.patch.yml | 4 - plugins/dsh-desktop-vision/index.js | 181 --------------- plugins/dsh-desktop-vision/package.json | 23 -- scripts/publish-gitea-release.sh | 18 +- scripts/release-notes.py | 67 ++++++ src-tauri/tauri.conf.json | 3 +- tests/test_plugins.py | 46 +--- 22 files changed, 204 insertions(+), 513 deletions(-) create mode 100644 docs/release-notes/v0.1.1.md create mode 100644 docs/release-notes/v0.1.2.md delete mode 100644 plugins/dsh-desktop-vision/client.js delete mode 100644 plugins/dsh-desktop-vision/cordis.patch.yml delete mode 100644 plugins/dsh-desktop-vision/index.js delete mode 100644 plugins/dsh-desktop-vision/package.json create mode 100755 scripts/release-notes.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d52d9e..0fce794 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,6 +41,10 @@ jobs: VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1) echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "tag=v$VERSION" >> "$GITHUB_OUTPUT" + test -f "docs/release-notes/v${VERSION}.md" || { + echo "docs/release-notes/v${VERSION}.md is required for a release (see docs/release-notes/v0.1.1.md)" >&2 + exit 1 + } if [ "${GITHUB_REF_TYPE}" = "tag" ] && [ "${GITHUB_REF_NAME}" != "v${VERSION}" ]; then echo "Git tag ${GITHUB_REF_NAME} must match Cargo.toml version v${VERSION}" >&2 exit 1 @@ -125,6 +129,9 @@ jobs: shell: bash run: bash scripts/vendor-native.sh + - name: Export embedded updater public key + run: echo "DSH_DESKTOP_UPDATER_PUBKEY=$(jq -r '.plugins.updater.pubkey' src-tauri/tauri.conf.json)" >> "$GITHUB_ENV" + - uses: tauri-apps/tauri-action@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -207,6 +214,22 @@ jobs: if-no-files-found: error retention-days: 1 + release-notes: + name: Release notes + needs: [version, package, flatpak] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + + - name: Set structured release body + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ needs.version.outputs.tag }} + name: DeepSeek Harness Desktop v${{ needs.version.outputs.version }} + body_path: docs/release-notes/v${{ needs.version.outputs.version }}.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-gitea: name: Publish Gitea mirror needs: [version, package, flatpak] @@ -228,6 +251,7 @@ jobs: --output staged \ --version "$VERSION" \ --pub-date "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + --notes "$(python3 scripts/release-notes.py notes "docs/release-notes/v${VERSION}.md")" \ --package-base-url "https://git.fangsiyuan.top/api/packages/TomHanck4/generic/dsh-easy-desktop-updater" - name: Publish Gitea release and updater feed diff --git a/Cargo.lock b/Cargo.lock index f0c6e02..1f61e56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -949,7 +949,7 @@ dependencies = [ [[package]] name = "dsh-core" -version = "0.1.1" +version = "0.1.2" dependencies = [ "base64 0.22.1", "dirs", @@ -966,7 +966,7 @@ dependencies = [ [[package]] name = "dsh-desktop" -version = "0.1.1" +version = "0.1.2" dependencies = [ "arboard", "dsh-core", diff --git a/Cargo.toml b/Cargo.toml index 4731c3c..6af2deb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["crates/dsh-core", "src-tauri"] resolver = "2" [workspace.package] -version = "0.1.1" +version = "0.1.2" edition = "2021" license = "MIT" authors = ["TommyFang2077"] diff --git a/Makefile b/Makefile index e67dbf1..cb783d5 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PREFIX ?= $(HOME)/.local APP_ID := io.github.tommyfang.DshDesktop DSH_VERSION := 0.1.0-rc.6 MODLENS_VERSION := 3.16.6 -MARKET_VERSION := 1.9.0 +MARKET_VERSION := 1.10.1 ANCHORED_COMMIT := ffb845c5480adc953392a6db6f8a98ede621174b ANCHORED_REPO := https://github.com/xiaobright/dsh-anchored-standard.git VENDOR_DIR := vendor/dsh-prefix @@ -21,6 +21,11 @@ VERSION := $(shell sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -1) BUNDLE := dist/$(APP_ID)-$(VERSION).flatpak BIN := target/release/dsh-desktop +# The shell updater gates the update check on an embedded public key +# (option_env in shell_updater.rs). Single source of truth is the tauri +# config; without it every build silently disables in-app updates. +export DSH_DESKTOP_UPDATER_PUBKEY := $(shell jq -r '.plugins.updater.pubkey' src-tauri/tauri.conf.json) + .PHONY: all run dev test vendor vendor-native vendor-anchored build install uninstall flatpak-build flatpak-export flatpak-install flatpak-bundle flatpak-run clean all: test @@ -89,11 +94,6 @@ install: build mkdir -p $(DESTDIR)$(PREFIX)/share/dsh-desktop; \ cp -R $(MARKET_DIR) $(DESTDIR)$(PREFIX)/share/dsh-desktop/market; \ fi - if [ -f plugins/dsh-desktop-vision/package.json ]; then \ - rm -rf $(DESTDIR)$(PREFIX)/share/dsh-desktop/vision; \ - mkdir -p $(DESTDIR)$(PREFIX)/share/dsh-desktop; \ - cp -R plugins/dsh-desktop-vision $(DESTDIR)$(PREFIX)/share/dsh-desktop/vision; \ - fi if [ -f plugins/dsh-desktop-voice/package.json ]; then \ rm -rf $(DESTDIR)$(PREFIX)/share/dsh-desktop/voice; \ mkdir -p $(DESTDIR)$(PREFIX)/share/dsh-desktop; \ diff --git a/README.md b/README.md index 82c8d4f..3c8c258 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,9 @@ dsh 原本运行在浏览器标签页中;本项目用 Tauri 2 和系统 WebVie ### 视觉模型配置:给 DeepSeek 带上眼睛 -纯文本 DeepSeek 配合视觉桥后,可以直接粘贴截图识别内容。内置的 **设置 → 视觉模型** 页面集中配置 OpenAI 兼容接口、Gemini API、Anthropic API、Antigravity CLI 和 Claude Code 登录;只展示当前引擎需要的字段,密钥保存在本机配置中,相关外链由系统浏览器打开。 +纯文本 DeepSeek 配合视觉桥后,可以直接粘贴截图识别内容。引擎配置在 **设置 → 插件 → 插件配置 → 视觉引擎(ModLens)**:支持 OpenAI 兼容接口、Gemini API、Anthropic API、Antigravity CLI 和 Claude Code 登录,只展示当前引擎需要的字段,密钥保存在本机 `~/.modlens/config.json` 中,相关外链由系统浏览器打开。 -![设置 → 视觉模型:配置 OpenAI 兼容视觉引擎](docs/screenshots/vision.webp) +![设置 → 插件 → 插件配置:视觉引擎(ModLens)](docs/screenshots/vision.webp) ### 锚定模式与原生窗口 @@ -98,9 +98,8 @@ npm install -g @deepseek-ai/dsh | --- | --- | --- | --- | | DeepSeek Harness | `0.1.0-rc.6` | 官方 WebUI;Flatpak 内置,其他安装包调用本机 `dsh` | `~/.dsh` | | 离线语音 | `dsh-desktop-voice 0.4.0` | 麦克风、快捷键、SenseVoice / OpenAI 兼容听写 | 配置 `~/.config/dsh-desktop/voice.json`;模型在系统缓存目录 | -| 插件市场 | `dshmarket 1.9.0` | 社区插件的发现、安装和更新 | `~/.dsh/profiles/web` | -| 视觉配置 | `dsh-desktop-vision 0.1.4` | 配置视觉桥所使用的引擎、接口和模型 | `~/.modlens/config.json` | -| 视觉桥 | `ModLens 3.16.6` | 让纯文本模型读取粘贴的图片;可从市场更新 | `~/.dsh/profiles/web` | +| 插件市场 | `dshmarket 1.10.1` | 社区插件的发现、安装和更新 | `~/.dsh/profiles/web` | +| 视觉桥 | `ModLens 3.16.6` | 让纯文本模型读取粘贴的图片;可从市场更新;引擎配置在「设置 → 插件」 | `~/.dsh/profiles/web`;配置 `~/.modlens/config.json` | | 锚定预设 | `ffb845c5480a` | 锚定式标准与零工具锚定式标准 | `~/.dsh/.agent-presets/` | 应用启动时会同步桌面自带组件,但会保留用户从市场更新到更新版本的 ModLens。捆绑版本固定在 [Makefile](Makefile) 中。 @@ -174,7 +173,6 @@ dsh-desktop/ ├── ui/ # 启动页 + 注入到 WebUI 的标题栏 ├── src-tauri/ # Tauri 窗口、命令、deb/rpm/nsis/dmg ├── crates/dsh-core/ # 启动 / 更新 / ModLens / 预设 / 剪贴板 -├── plugins/dsh-desktop-vision/ # 设置 → 视觉模型 ├── plugins/dsh-desktop-voice/ # 设置 → 语音输入 + 对话框麦克风 ├── data/ # .desktop、图标、AppStream ├── flatpak/ diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md index 5367eac..47c5e1c 100644 --- a/THIRD_PARTY.md +++ b/THIRD_PARTY.md @@ -14,9 +14,8 @@ DeepSeek, liustack, or xiaobright. | DeepSeek Harness (`@deepseek-ai/dsh`) | [deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness) | `0.1.0-rc.6` | MIT, © 2026 DeepSeek | Official WebUI. Not shipped as source. Flatpak vendors the npm package; other packages call a host `dsh`. See `docs/licenses/deepseek-harness.LICENSE`. | | ModLens (`@liustack/modlens`) | [liustack/modlens](https://github.com/liustack/modlens) | `3.16.6` | MIT, © 2026 Leon Liu (liustack) | Copied into `~/.dsh/profiles/web` so text-only models can read images. See `docs/licenses/modlens.LICENSE`. | | Anchored Standard | [xiaobright/dsh-anchored-standard](https://github.com/xiaobright/dsh-anchored-standard) | commit `ffb845c5480adc953392a6db6f8a98ede621174b` | MIT, © 2026 xiaobright; portions © 2026 DeepSeek | Localized as **锚定式标准(实验)** and **零工具锚定式标准(实验)**, written to `~/.dsh/.agent-presets/`. See `docs/licenses/dsh-anchored-standard.LICENSE` and `.NOTICE`. | -| `dsh-desktop-vision` | this repo `plugins/dsh-desktop-vision/` | `0.1.4` | MIT, © 2026 TommyFang2077 | Settings page **设置 → 视觉模型**; writes `~/.modlens/config.json`. | | `dsh-desktop-voice` | this repo `plugins/dsh-desktop-voice/` | `0.4.0` | MIT, © 2026 TommyFang2077 | Settings page **设置 → 语音输入** and composer mic; writes `~/.config/dsh-desktop/voice.json`. | -| dshmarket | [dsh-market/dsh-market](https://github.com/dsh-market/dsh-market) | `1.9.0` | MIT, © 2026 fkysly and dsh-market contributors | Bundled WebUI market for browsing and installing Community plugins. See `docs/licenses/dshmarket.LICENSE`. | +| dshmarket | [dsh-market/dsh-market](https://github.com/dsh-market/dsh-market) | `1.10.1` | MIT, © 2026 fkysly and dsh-market contributors | Bundled WebUI market for browsing and installing Community plugins. See `docs/licenses/dshmarket.LICENSE`. | | SenseVoiceSmall ONNX | [FunAudioLLM/SenseVoice](https://github.com/FunAudioLLM/SenseVoice) via [k2-fsa conversion](https://huggingface.co/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17) | commit `2365baeacb507f821a0c8120fcee3d484dba7a07` | MIT, © 2025 FunASR | Not bundled. Downloaded after the user confirms, then stored in the platform cache. See `docs/licenses/sensevoice.LICENSE`. | | sherpa-onnx WASM | [k2-fsa/sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) | `1.13.5` | Apache-2.0 | Not bundled. Installed with the model to run SenseVoice locally; the npm package carries its upstream license. | diff --git a/crates/dsh-core/src/modlens.rs b/crates/dsh-core/src/modlens.rs index f5e11d2..a4e4fb8 100644 --- a/crates/dsh-core/src/modlens.rs +++ b/crates/dsh-core/src/modlens.rs @@ -7,13 +7,11 @@ use serde_json::{json, Value}; use crate::paths::{copy_tree, dsh_home, replace_symlink, BundledPaths}; pub const PACKAGE: &str = "@liustack/modlens"; -pub const VISION_PACKAGE: &str = "dsh-desktop-vision"; pub const VOICE_PACKAGE: &str = "dsh-desktop-voice"; pub const MARKET_PACKAGE: &str = "dshmarket"; pub const MODLENS_VERSION: &str = "3.16.6"; -const VISION_PLUGIN_VERSION: &str = "0.1.4"; const VOICE_PLUGIN_VERSION: &str = "0.4.0"; -const MARKET_PLUGIN_VERSION: &str = "1.9.0"; +const MARKET_PLUGIN_VERSION: &str = "1.10.1"; const MANAGED_BUNDLES_DIR: &str = ".dsh-desktop/bundles"; pub const HIDE_PLAIN_TWINS_JS: &str = include_str!("../../../ui/inject/hide-twins.js"); @@ -78,13 +76,6 @@ fn bundled_plugin(paths: &BundledPaths, dirs: &[&str]) -> Option { }) } -pub fn bundled_vision_plugin(paths: &BundledPaths) -> Option { - bundled_plugin( - paths, - &["vision", "dsh-desktop-vision", "plugins/dsh-desktop-vision"], - ) -} - fn bundled_voice_plugin(paths: &BundledPaths) -> Option { bundled_plugin( paths, @@ -164,15 +155,6 @@ fn install_profile_plugin( true } -fn install_vision_plugin(paths: &BundledPaths, profile: &Path) -> bool { - install_profile_plugin( - profile, - VISION_PACKAGE, - VISION_PLUGIN_VERSION, - bundled_vision_plugin(paths), - ) -} - fn install_voice_plugin(paths: &BundledPaths, profile: &Path) -> bool { install_profile_plugin( profile, @@ -435,15 +417,8 @@ fn ensure_modlens_inner( version: &str, ) -> std::io::Result { std::fs::create_dir_all(profile)?; - let vision_ok = install_vision_plugin(paths, profile); let voice_ok = install_voice_plugin(paths, profile); let mut packages = BTreeMap::new(); - if vision_ok { - packages.insert( - VISION_PACKAGE.to_string(), - local_plugin_spec(VISION_PACKAGE), - ); - } if voice_ok { packages.insert(VOICE_PACKAGE.to_string(), local_plugin_spec(VOICE_PACKAGE)); } @@ -613,7 +588,7 @@ ui-theme: std::fs::create_dir_all(&market).unwrap(); std::fs::write( market.join("package.json"), - r#"{"name":"dshmarket","version":"1.9.0"}"#, + format!(r#"{{"name":"dshmarket","version":"{MARKET_PLUGIN_VERSION}"}}"#), ) .unwrap(); std::fs::write(market.join("index.js"), "export {}\n").unwrap(); @@ -625,7 +600,10 @@ ui-theme: let manifest: Value = serde_json::from_str(&std::fs::read_to_string(profile.join("package.json")).unwrap()) .unwrap(); - assert_eq!(manifest["dependencies"]["dshmarket"], "1.9.0"); + assert_eq!( + manifest["dependencies"]["dshmarket"], + MARKET_PLUGIN_VERSION + ); assert!(manifest["dsh"]["profile"]["bundles"] .as_array() .unwrap() @@ -639,10 +617,7 @@ ui-theme: #[test] fn bundled_local_plugins_use_file_dependencies() { let tmp = tempfile::TempDir::new().unwrap(); - for (dir, name, version) in [ - ("vision", VISION_PACKAGE, VISION_PLUGIN_VERSION), - ("voice", VOICE_PACKAGE, VOICE_PLUGIN_VERSION), - ] { + for (dir, name, version) in [("voice", VOICE_PACKAGE, VOICE_PLUGIN_VERSION)] { let plugin = tmp.path().join(dir); std::fs::create_dir_all(&plugin).unwrap(); std::fs::write( @@ -661,7 +636,7 @@ ui-theme: let manifest: Value = serde_json::from_str(&std::fs::read_to_string(profile.join("package.json")).unwrap()) .unwrap(); - for name in [VISION_PACKAGE, VOICE_PACKAGE] { + for name in [VOICE_PACKAGE] { assert_eq!( manifest["dependencies"][name], format!("file:.dsh-desktop/bundles/{name}") diff --git a/data/metainfo/io.github.tommyfang.DshDesktop.metainfo.xml b/data/metainfo/io.github.tommyfang.DshDesktop.metainfo.xml index bdf79cd..cc0751d 100644 --- a/data/metainfo/io.github.tommyfang.DshDesktop.metainfo.xml +++ b/data/metainfo/io.github.tommyfang.DshDesktop.metainfo.xml @@ -41,6 +41,16 @@ + + +
    +
  • Bundled plugin market upgraded to dshmarket 1.10.1 (more resilient downloads, safer installs)
  • +
  • In-app updater enabled: the signing public key is now embedded in every build
  • +
  • Removed the duplicate 视觉模型 settings section — the modlens card under Settings → Plugins is the single config surface
  • +
  • Structured release notes for every version
  • +
+
+

Signed in-app updater from the mainland mirror; HTTPS Gitea distribution; Market install warnings for GitHub-only sources.

diff --git a/docs/release-notes/v0.1.1.md b/docs/release-notes/v0.1.1.md new file mode 100644 index 0000000..f1c193b --- /dev/null +++ b/docs/release-notes/v0.1.1.md @@ -0,0 +1,19 @@ +# DeepSeek Harness Desktop v0.1.1 + +**摘要 / Summary:** 大陆可直达的发行链路上线:Gitea 镜像安装包 + 应用内签名更新(HTTPS 分发、安装前校验 Tauri 签名)。 + +## 新功能 / Features +- 大陆发行镜像:安装包与本应用更新走 Gitea HTTPS,无需额外网络工具即可下载 +- 应用内更新:发现新版本后一键「下载并安装」,安装包下载完成先校验 Tauri 签名再安装 +- Linux 剪贴板图片原生读取:直接粘贴截图即作为图片进输入框(此前部分桌面环境取不到) + +## 修复 / Fixes +- Gitea 发布经过慢速链路时自动重试,不再因网关超时半途失败 +- 壳更新公钥内嵌进打包配置,签名校验始终可用 +- 仓库改名后(dsh-easy-desktop)的镜像与文档地址保持一致 + +## 安装与更新 / Install & Update +- 安装包:Windows NSIS/MSI、macOS DMG(Apple Silicon 与 Intel)、Linux deb/rpm、Flatpak +- 除 Flatpak 外需本机已安装 `dsh`(`npm i -g @deepseek-ai/dsh`),或设置 `DSH_DESKTOP_DSH_BIN` +- macOS 包未公证:首次打开需在「系统设置 → 隐私与安全性」中允许 +- 更新提示出现在启动页:点击「下载并安装」即可(走 Gitea 镜像,签名校验后生效) \ No newline at end of file diff --git a/docs/release-notes/v0.1.2.md b/docs/release-notes/v0.1.2.md new file mode 100644 index 0000000..62da416 --- /dev/null +++ b/docs/release-notes/v0.1.2.md @@ -0,0 +1,26 @@ +# DeepSeek Harness Desktop v0.1.2 + +**摘要 / Summary:** 内置插件市场升级至 dshmarket 1.10.1(下载更稳、安装更安全);应用内更新真正启用(签名公钥内嵌);移除重复的视觉模型设置区;发布说明改为结构化更新日志。 + +## 新功能 / Features +- 内置插件市场 dshmarket 1.9.0 → 1.10.1: + - pnpm 拉取超时自动加重试,弱网下安装/更新不再一次失败就放弃 + - 失败的安装会回收遗留的本地缓存目录,不会越积越多 + - 重复安装防护:同一插件(含别名条目)只保留一个加载项,杜绝下次启动冲突 +- 每个版本提供结构化更新日志(新功能 / 修复 / 变更 / 安装),GitHub 与 Gitea 的发布文案、应用内更新面板自动取同一份 + +## 修复 / Fixes +- **应用内更新此前在所有构建中都静默关闭**:壳更新器要求编译期内嵌签名公钥,而构建流程从未注入(`public_key() → None → 不检查更新`)。现在本地、CI、Flatpak 构建都会从 `tauri.conf.json` 读取公钥注入,「发现壳更新 → 下载并安装」真正可用 +- 消除市场「有新版本」横幅与桌面内嵌市场版本不一致的死结:内嵌市场已同步到上游最新,横幅不再出现;此前该更新提示在桌面版中无法真正落地(每次启动会被内嵌版本还原) +- 插件安装遇到 pnpm 默认拦截构建脚本(如 node-pty)时,放行与重试路径按上游最新逻辑工作,不再被 allowBuilds 占位符卡死 +- Gitea 镜像发布链路重构:由自托管 Actions runner 经局域网直连发布,慢速公网链路超时影响正式发布流程 + +## 变更 / Changes +- 移除独立的「视觉模型」设置区:视觉引擎配置统一由 modlens 自带的「设置 → 插件 → 插件配置 → 视觉引擎(ModLens)」提供(同样读写 `~/.modlens/config.json`,不再有两处重复入口) +- 构建产物不再附带 `plugins/dsh-desktop-vision`(license 列表与 README 同步更新) + +## 安装与更新 / Install & Update +- 安装包:Windows NSIS/MSI、macOS DMG(Apple Silicon 与 Intel)、Linux deb/rpm、Flatpak +- 除 Flatpak 外需本机已安装 `dsh`(`npm i -g @deepseek-ai/dsh`),或设置 `DSH_DESKTOP_DSH_BIN` +- macOS 包未公证:首次打开需在「系统设置 → 隐私与安全性」中允许 +- 更新提示出现在启动页:点击「下载并安装」即可(走 Gitea 镜像,签名校验后生效) \ No newline at end of file diff --git a/docs/screenshots/src/vision.html b/docs/screenshots/src/vision.html index a7f44ef..bb98781 100644 --- a/docs/screenshots/src/vision.html +++ b/docs/screenshots/src/vision.html @@ -2,7 +2,7 @@ - 视觉模型 + 视觉引擎(ModLens)