Skip to content

chore: release 0.9.30 - #483

Merged
jubaoliang merged 32 commits into
mainfrom
release/0.9.30
Aug 31, 2026
Merged

chore: release 0.9.30#483
jubaoliang merged 32 commits into
mainfrom
release/0.9.30

Conversation

@jubaoliang

@jubaoliang jubaoliang commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

[0.9.30] - 2026-08-31

新增

  • 腾讯云 Token Plan 企业版与 Hy 套餐
  • WeKnora、Dify 连接器,以及自定义 MCP 的 OAuth
  • 备份/恢复、聊天工具栏、SSO 预设与更友好的供应商错误提示
  • 技能展示本地化;知识库可配置文档数量上限;钉钉扫码注册
  • 对话接入 ask-user-question 人机确认流程

修复

  • 专家根目录、连接器排序、飞牛图标及主题确认对话框等界面问题
  • 聊天中文语音识别跟随界面语言
  • MCP OAuth 刷新失败需重新授权;渠道异常 thinking 输出过滤
  • 数据库 v10 迁移遗漏 thread projection 表
  • 飞牛 FPK 无效在线升级与原生版启动加载;长会话相关问题
  • 通道弹框文案统一为「通道」,新建默认实时过程
  • octop acp 启动即崩溃(CLI 注册表属性应对齐 acp_cmd

Release checklist

  • CI green
  • Merge this PR into main
  • After merge, GitHub Action auto-pushes v0.9.30 tag on main tip

github-actions Bot and others added 30 commits August 26, 2026 13:22
…nual

chore: sync develop onto main after manual
* 长session卡死优化

* chore: cut 0.9.29b0 and pin harness-agent 0.9.27

Long-session testers pull this branch from source; bump above 0.9.28 and
lock vacuum-safe harness-agent / harness-memory so Codex installs pick them up.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: retag beta as 0.9.27b0 so PyPI 0.9.28 still looks newer

Lets non-editable installs click Update to leave the long-session trial.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: cut 0.9.29 for merge (drop beta tag)

Current main is 0.9.28; this branch ships as the next stable version.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(experts): restore clinical 037330c routing

* feat(dashboard): integrate modal utility for consistent confirmation dialogs

- Added `modal` utility from `antdModal` to replace direct `Modal` calls across various components, ensuring a unified approach to confirmation dialogs.
- Updated components to utilize the new `modal.confirm` method, enhancing maintainability and consistency in user interactions.
- Removed direct imports of `Modal` from `antd` in favor of the new utility, streamlining the codebase.

This change improves the user experience by standardizing modal behavior and appearance throughout the application.

* refactor(dashboard): unify App.useApp() integration across components

- Replaced direct imports of `message` and `modal` from utility files with `App.useApp()` in various components, promoting a consistent approach to accessing application-wide functionalities.
- Updated components to utilize the new structure, enhancing maintainability and reducing redundancy in imports.

This change streamlines the codebase and improves the overall architecture of the dashboard components.

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
macOS/Windows cannot use bubblewrap; treat ensure-bwrap skipped as silent
so saving a scoped root_dir no longer shows a useless warning.

Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(fnos): 镜像命名空间改为 ghcr.io/jubaoliang/octop

- fnos-build-fpk.yml / fnos/README.md / fnos/docker/Dockerfile / docker-compose.yaml / manifest 的镜像引用从 ghcr.io/TencentCloud/octop 改为 ghcr.io/jubaoliang/octop(Docker 仓库名必须小写,原大写 T 的 tag 无法通过 buildx)
- workflow 镜像 tags 增加 ghcr.io/jubaoliang/octop:latest(Docker 版 FPK 的 docker-compose 按 :latest 拉取,此前只推 :vanilla 会导致飞牛拉不到镜像)

* fix(fnos): 镜像发布目标改为 Docker Hub jubaoliang/octop(非 ghcr.io)

根据反馈,镜像仓库位于 hub.docker.com:
- 镜像名从 ghcr.io/jubaoliang/octop 改为 jubaoliang/octop(docker pull jubaoliang/octop 无前缀即 Docker Hub)
- workflow 登录从 GHCR/GITHUB_TOKEN 改为 Docker Hub 的 DOCKERHUB_USERNAME/DOCKERHUB_TOKEN(与 docker-publish.yml 同一套凭据)

* fix(fnos): FPK 部署禁止无效内置在线升级,修复原生版启动加载 common.sh

- self_update.py:run_upgrade() 检测到 OCTOP_INSTALL_MODE=fpk-* 时直接返回失败并提示
  经飞牛应用中心安装新版 FPK 完成升级。FPK 部署下在线安装到系统 Python 的版本
  永远不会被 launcher 加载(PYTHONPATH 指向应用中心托管的 site-packages),
  重启后仍是旧版且界面提示成功,升级形同虚设。
- fnos/native launcher(octop/octop-cli):设置 OCTOP_INSTALL_MODE=fpk-native 触发守卫;
  并补充 common.sh 回退路径 /var/apps/octop-native/cmd/common.sh——FPK 解包后 cmd/ 落在
  管理目录,$0/../cmd 指向载荷内不存在的位置,原 launcher 会因 find_python312 未定义
  而启动失败(0.9.27 原生版复现)。
- fnos/docker compose:注入 OCTOP_INSTALL_MODE=fpk-docker,容器内同样禁止无效在线升级,
  应用中心更新 FPK 时会重新拉取镜像。

* fix(fnos): FPK 在线升级安装到 launcher 实际加载的 site-packages,升级真正生效

上一版把 FPK 部署下的内置在线升级直接禁止,体验不可接受(发现新版本却无法
一键升级)。重新实现:

- self_update.py:OCTOP_FPK_SITE_PACKAGES 非空时走 _run_fpk_upgrade(),用
  pip install --target 把新版安装到 launcher 通过 PYTHONPATH 实际加载的打包
  site-packages,重启服务后即加载新版;此前安装到系统 Python 的版本永远不会
  被加载,导致「升级成功但重启无效」。
- fnos/native launcher(octop/octop-cli):导出 OCTOP_FPK_SITE_PACKAGES 指向打包
  目录;octop-cli 在 sudo -u octop-native 时透传该变量与 OCTOP_INSTALL_MODE。
- compose:移除上一版的 OCTOP_INSTALL_MODE=fpk-docker(Docker 版在线升级本就
  安装到容器内环境、重启容器生效,无需 FPK 分支,不应被禁止)。

* fix(fnos): FPK 在线升级安装到 launcher 实际加载的 site-packages,升级真正生效

上一版把 FPK 部署下的内置在线升级直接禁止,体验不可接受(发现新版本却无法
一键升级)。重新实现:

- self_update.py:OCTOP_FPK_SITE_PACKAGES 非空时走 _run_fpk_upgrade(),用
  pip install --target 把新版安装到 launcher 通过 PYTHONPATH 实际加载的打包
  site-packages,重启服务后即加载新版;此前安装到系统 Python 的版本永远不会
  被加载,导致「升级成功但重启无效」。
- fnos/native launcher(octop/octop-cli):导出 OCTOP_FPK_SITE_PACKAGES 指向打包
  目录;octop-cli 在 sudo -u octop-native 时透传该变量与 OCTOP_INSTALL_MODE。
- compose:移除上一版的 OCTOP_INSTALL_MODE=fpk-docker(Docker 版在线升级本就
  安装到容器内环境、重启容器生效,无需 FPK 分支,不应被禁止)。

* fix(fnos): FPK 在线升级安装到 launcher 实际加载的 site-packages,升级真正生效

上一版把 FPK 部署下的内置在线升级直接禁止,体验不可接受(发现新版本却无法
一键升级)。重新实现:

- self_update.py:OCTOP_FPK_SITE_PACKAGES 非空时走 _run_fpk_upgrade(),用
  pip install --target 把新版安装到 launcher 通过 PYTHONPATH 实际加载的打包
  site-packages,重启服务后即加载新版;此前安装到系统 Python 的版本永远不会
  被加载,导致「升级成功但重启无效」。
- fnos/native launcher(octop/octop-cli):导出 OCTOP_FPK_SITE_PACKAGES 指向打包
  目录;octop-cli 在 sudo -u octop-native 时透传该变量与 OCTOP_INSTALL_MODE。
- compose:移除上一版的 OCTOP_INSTALL_MODE=fpk-docker(Docker 版在线升级本就
  安装到容器内环境、重启容器生效,无需 FPK 分支,不应被禁止)。
- schema v10: knowledge_bases 新增 max_documents 列(默认 100,0=不限制,上限 10000)
- 上传时按 KB 自身上限在 SQL 事务内原子拦截,第 N+1 个文档被拒绝
- 前端编辑模态框在"描述"与"图标"之间新增"文档数量上限"输入项,保存即同步
- 详情面板"X/Y 文档"文本、上限 Alert、上传按钮均改用该 KB 自身上限
- SQLite 通过启动兜底加列,PostgreSQL 使用 ADD COLUMN IF NOT EXISTS 幂等迁移
* fix(db): resolve duplicate schema v10 migrations skipping projection tables

Two 010_*.sql files raced: kb_max_documents bumped the watermark first and
skipped thread_message_projection. Keep a single 010 and repair missing tables.

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(agents): disable memory in harness create/close unit tests on Windows

Avoid Windows access-violation when memory GC races HarnessAgentManager.close
under pytest-xdist; unrelated to the schema v10 fix but was failing PR CI.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* ci: publish Docker to GHCR+Hub and auto-build FnOS after Release

Cascade FnOS FPK from Release (reuse GHCR image and release wheel), keep
Docker Hub sync, and fix workflow_dispatch version tags for Auto Tag.

Co-authored-by: Cursor <cursoragent@cursor.com>

* ci: cascade desktop package with release and tighten triggers

Stop running the six-platform desktop matrix on every branch push.
Auto Tag dispatches Octop Desktop alongside Release and Docker so
artifacts attach to the same v* GitHub Release.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(desktop): Octop 桌面客户端 (#462)

* feat: add multi-platform green portable packaging

Ship relocatable Octop-<plat>.zip via scripts/green (portable CPython,
frozen uv.lock deps, Windows pywin32 DLL fix) and octop-portable.yml.
No OOB overlay or product trimming; first run uses upstream setup.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* feat(desktop): Wails v3 shell with green portable under ~/.octop

Move green packaging to desktop/portable, add a Wails v3 client that
downloads Octop-<plat>.zip, spawns launch.py with OCTOP_HOME=~/.octop,
and exposes locale/theme/autostart/tray/macOS caffeinate settings.
Green upgrades install into packages via OCTOP_GREEN_PACKAGES.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* fix(desktop): add Wails v3 Taskfile and build/config.yml

wails3 build/dev look for Taskfile.yml and build/config.yml in
desktop/src. Un-ignore that tree from the repo-wide build/ gitignore.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* 初始化桌面客户端

* add drag and toggle

* add prevent sleep

* update

* change dock icon

* clean package/useless files

* add Attach zips to GitHub Release

* pack file into windows bin-file

* Packages a production app

* chanage workflow name

* chanage workflow name

* linux package in single ifle

* linux package in single ifle

* 在浏览器中打开_blank 的链接

* upgrade python to 3.12

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Harry <forcemeter@users.noreply.github.com>
Co-authored-by: 杨树海 <yangshuhai@pdnews.cn>

* ci: cascade desktop package on release and stop all-branch builds (#463)

Auto Tag dispatches Octop Desktop with Release/Docker. Restrict
octop-desktop.yml to v* tags + workflow_dispatch only.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>

---------

Co-authored-by: Harry <56063441+forcemeter@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Harry <forcemeter@users.noreply.github.com>
Co-authored-by: 杨树海 <yangshuhai@pdnews.cn>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
…ovider errors (#465)

* feat: harden backup/restore UX, chat tool dock, SSO presets, and friendly provider errors

Make backup ops resumable across refresh, dock plugin tool UIs beside chat, polish admin SSO setup, fix mobile table scrolling, and map balance/auth probe failures to localized guidance.

Co-authored-by: Cursor <cursoragent@cursor.com>

* test: accept locale kwarg in provider probe endpoint mock

Align integration fake_probe with probe_provider_row locale parameter added for localized error messages.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(cli): close init DB pool and isolate OCTOP_HOME in init tests

Release SQLite before --force rmtree so repeated in-process init (CliRunner) cannot flake, and pin OCTOP_HOME plus clear leaked OCTOP_DATABASE_* in init CLI tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Probe-driven OAuth discovery from MCP URL, unified oauth/start API,
encrypted token storage, and Custom Connectors UI for save-then-probe
and one-click authorization.

Fixes #337
* chore: update octop-desktop workflow to limit PR builds and refine platform selection

- Adjusted the GitHub Actions workflow to trigger builds for pull requests affecting the `desktop/` directory, limiting them to `darwin-arm64` and `darwin-amd64` platforms only.
- Enhanced platform selection logic to differentiate between pull request and tag dispatch events, ensuring appropriate builds are executed based on the event type.
- Updated README to reflect changes in CI behavior and clarify build processes for different scenarios.

* chore: enhance octop-desktop workflow with dynamic platform selection

- Introduced a new job to dynamically select platforms based on the event type, allowing for more flexible builds.
- Updated the matrix configuration to utilize the output from the platform selection step, streamlining the build process.
- Removed redundant build decision steps, simplifying the workflow and improving clarity.

* ci: build darwin and windows on desktop PRs

PR packaging should cover all macOS and Windows arches; keep Linux for tags/dispatch only.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: leoxyang <leoxyang@tencent.com>
* feat(desktop): Octop 桌面客户端 (#462)

* feat: add multi-platform green portable packaging

Ship relocatable Octop-<plat>.zip via scripts/green (portable CPython,
frozen uv.lock deps, Windows pywin32 DLL fix) and octop-portable.yml.
No OOB overlay or product trimming; first run uses upstream setup.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* feat(desktop): Wails v3 shell with green portable under ~/.octop

Move green packaging to desktop/portable, add a Wails v3 client that
downloads Octop-<plat>.zip, spawns launch.py with OCTOP_HOME=~/.octop,
and exposes locale/theme/autostart/tray/macOS caffeinate settings.
Green upgrades install into packages via OCTOP_GREEN_PACKAGES.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* fix(desktop): add Wails v3 Taskfile and build/config.yml

wails3 build/dev look for Taskfile.yml and build/config.yml in
desktop/src. Un-ignore that tree from the repo-wide build/ gitignore.

Co-authored-by: Harry <forcemeter@users.noreply.github.com>

* 初始化桌面客户端

* add drag and toggle

* add prevent sleep

* update

* change dock icon

* clean package/useless files

* add Attach zips to GitHub Release

* pack file into windows bin-file

* Packages a production app

* chanage workflow name

* chanage workflow name

* linux package in single ifle

* linux package in single ifle

* 在浏览器中打开_blank 的链接

* upgrade python to 3.12

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Harry <forcemeter@users.noreply.github.com>
Co-authored-by: 杨树海 <yangshuhai@pdnews.cn>

* ci: cascade desktop package on release and stop all-branch builds (#463)

Auto Tag dispatches Octop Desktop with Release/Docker. Restrict
octop-desktop.yml to v* tags + workflow_dispatch only.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>

* 优化客户端升级逻辑,支持页面自动重载 (#468)

Co-authored-by: 杨树海 <yangshuhai@pdnews.cn>

---------

Co-authored-by: Harry <56063441+forcemeter@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Harry <forcemeter@users.noreply.github.com>
Co-authored-by: 杨树海 <yangshuhai@pdnews.cn>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Expired tokens that cannot be refreshed now prompt the dashboard to re-authorize. Cache OAuth discovery for an hour, and localize callback and start-error copy.
Co-authored-by: leoxyang <leoxyang@tencent.com>
Browser STT was using navigator.language and settling on onend before
results, which dropped Chinese transcripts or forced English gibberish.
* chore: bump orcakit-harness-agent to 1.0.0

Raise the minimum harness-agent constraint and refresh lockfiles after
the local sync that accompanied recent dashboard work.

* fix(tests): align bwrap jail execute test with harness-agent 1.0

Non-jail scoped shells now rewrite virtual paths via _execute_on_host;
patch that path and stub env mapping so CI PATH PermissionErrors do not fail.
Wire ChannelManager.probe_channel live cases into CI so real iLink and
Feishu app credentials are verified when LIVE_* secrets are configured.
* feat(skills): localize skill presentation from metadata.octop

Read bilingual label/summary and icons from SKILL.md, keep slug identity
for disable/chat matching, and show market icons in the chat skill picker.

* chore: bump harness-agent to 1.0.1 and skip Weixin live timeouts

Pin orcakit-harness-agent>=1.0.1 now that 1.0.1 is on PyPI, and treat
iLink getUpdates timeouts as environment skips like other live probes.
…481)

* fix(ui): polish expert root-dir UX, connector order, and FnOS icons

Clarify sandbox/skill-package copy, lock root_dir on edit, move WeKnora/Dify
to the end of the catalog, drop their open-console buttons, and refresh FnOS
icons from the PWA logo.

* fix(tests): expect WeKnora/Dify at end of connector catalog

Update catalog order assertion after moving those connectors behind the CLI entries.

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* feat(providers): integrate Tencent Token Plan presets

* test(providers): loosen Tencent token-plan preset assertions

harness-agent bumps its bundled provider catalog over time, so pin the
model families (prefix / subset) instead of exact id sets.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(chat): integrate ask-user-question HITL flow

* test(onnx): isolate nested weights from optional catalog

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
Drawer titles now match the page term 通道, and new channels default
to stream response mode while existing invoke configs stay unchanged.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Lazy CLI lookup used getattr(..., "acp") but the Click command is
acp_cmd, so every `octop acp` invocation crashed before help parsing.

Fixes #486
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Comment thread src/octop/api/routers/connectors.py Fixed
Comment thread src/octop/infra/gateway/hitl/format.py Fixed
Co-authored-by: Cursor <cursoragent@cursor.com>
@jubaoliang
jubaoliang merged commit daa3e7f into main Aug 31, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants