Skip to content

chore: release 0.9.32 - #576

Merged
jubaoliang merged 65 commits into
mainfrom
release/0.9.32
Sep 6, 2026
Merged

chore: release 0.9.32#576
jubaoliang merged 65 commits into
mainfrom
release/0.9.32

Conversation

@jubaoliang

Copy link
Copy Markdown
Collaborator

[0.9.32] - 2026-09-06

新增

  • 聊天运行轨迹抽屉与回合时间轴;人机确认以可读审批卡片展示
  • 知识库支持更多文档格式与可选 OCR,上传显示进度
  • 定时任务支持名称,计划回合持久化
  • 备份可选择归档内容;连接器支持多实例与共享;插件可按智能体开关
  • OpenSandbox 远程沙箱;工作台浏览器按用户隔离 profile
  • 飞书扫码创建应用;远程手机可自动安装 Docker
  • 桌面端 Windows NSIS 安装包与 macOS DMG;未知路由 404 页

修复

  • 旧备份在 schema 变更后可恢复;桌面打包版本与应用元数据对齐
  • 主动关怀时区、专家卡片头像、用户表固定列
  • 运行轨迹写库开销、日志轮转、通道二维码轮询与远程 Docker 安装权限

变更

  • 语音与搜索设置迁到模型页;控制台改用 OctopSpinner
  • 默认管理员凭据改为首次运行写入 ~/octop-login.txt

Release checklist

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

Made with Cursor

miaowmint and others added 30 commits September 1, 2026 00:14
- New docker_install.py: latency-race install sources (official
  download.docker.com + CN mirrors, no geo detection; official wins →
  no DOWNLOAD_URL override), run official get.docker.com script,
  probe Tencent Cloud registry mirror reachability and merge
  registry-mirrors into /etc/docker/daemon.json (backup kept) only
  after a fresh install.
- install_mobile_stream: when Docker is missing on Linux with
  root/passwordless sudo, attempt the automatic install first and
  continue with the container install when the daemon is ready;
  otherwise fall back to the manual-install error.
- i18n (backend en/zh + dashboard locales) and install-guide copy
  updated; CHANGELOG entry added.
- Unit tests for source selection, daemon.json merge, probe, and the
  install stream branches (auto-install ok / fail / no-sudo).
os.geteuid() does not exist on Windows, breaking mypy in CI. Reuse the existing octop.infra.utils.posix_compat.geteuid() shim like the rest of the codebase.
…nual

chore: sync develop onto main after manual
- Vendor install-docker.sh (official get.docker.com script with
  TencentOS / OpenCloudOS releasever mapping and mirror-domain rewrites)
  into scripts/linux/v1.0/ so unsupported-by-online-script distros still
  install and we never pipe the network straight into sh; wheel ships
  it via the existing **/*.sh package rule.
- auto_install_docker_stream runs the bundled script with the raced
  DOWNLOAD_URL env var instead of curl|sh (curl pipe used to swallow
  download failures).
- Error compatibility: classify script output tail against known
  failure modes (unsupported distro, no root, network/curl, package
  manager lock, GPG key, disk full, existing docker) and append a
  localized fix hint; dedicated messages for spawn failure, stalled
  output (read watchdog), and missing bundled script; restart-failure
  message now tells how to start Docker manually.
- Tests: error classification, bundled-script presence, missing-script
  stream, friendly-hint emission; full mobile suite green (57).
…release

The FnOS FPK workflow kept a stray env block when the rolling-release step was
removed, so GitHub rejected the whole file and Release's dispatch failed with
"'env' is already defined" — silently, because that job is continue-on-error.

CI also ran the full suite three times per release (release PR, main push, sync
PR) on identical trees. Drop the main push build, since PR checks already run on
the merge result, and skip the post-release sync PR, which is auto-merged before
its checks even start.

Release now passes the tag to the sync workflow so the branch is named after the
version instead of the constant "manual", which every release force-pushed over.

Co-authored-by: Cursor <cursoragent@cursor.com>
GitHub Release assets mixed unversioned Octop-<plat>.zip with Octop-Desktop-*
and PEP wheels. Name public files Octop-<kind>-<os>-<arch>-<version>.<ext>,
gzip the Linux desktop tarball, and keep the zip payload directory plus the
macOS .app Resources name stable so the Wails shell still unpacks them.

Co-authored-by: Cursor <cursoragent@cursor.com>
Stop publishing a separate fnos-<ver> release. After the main Release exists,
upsert Octop-fnos-{docker,native}-<ver>.fpk onto the same v* tag as wheels and
desktop packages, and leave the release notes untouched.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…icate sync triggers (#532)

Dispatching FnOS or develop-sync must fail the Release workflow when gh workflow
run fails, instead of continue-on-error hiding a missed cascade. Desktop package
attaches whenever release_tag is set, so a develop rebuild does not need a
second attach_from_run hop, and attach-only runs use a separate concurrency
group. Sync listens only to workflow_dispatch so it cannot double-fire.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent multi-GB daily octop.log growth with size-based rotation, suppress noisy memory maintenance INFO, and gzip prior rotated files on the next cycle (Python gzip works on Windows).
Drop the special WARNING override for harness_agent.middleware.memory so non-debug environments stay at the normal INFO root level.
Path.write_text expands \\n to \\r\\n on win32, which broke the decompress equality assert in CI.
- Added lark-oapi dependency for enhanced Feishu bot creation via scan-to-create flow.
- Updated QR token handling to use QR URL instead, improving the user experience during bot setup.
- Enhanced localization strings for better user guidance in both English and Chinese.
- Refactored related functions and tests to accommodate the new flow and ensure reliability.

This change streamlines the bot creation process and aligns with the latest API standards.
- Updated localization strings in English and Chinese for improved clarity in the Feishu bot registration process.
- Refactored the bot creation logic to streamline the registration flow, removing unnecessary parameters and ensuring credentials are handled correctly.
- Added error handling for cases where the registration result is empty, improving robustness.

These changes enhance user experience and align with the latest API requirements.
…us platforms

- Added `stopPolling()` calls in the QR generation functions for QQ, WeCom, Weixin, Dingtalk, Feishu, and Yuanbao to ensure polling is halted before initiating the QR code generation process.
- Updated button click handlers to directly invoke the respective QR generation functions, improving user interaction and flow.

These changes enhance the user experience by preventing potential conflicts during QR code generation.
- Modified localization strings in English and Chinese for improved clarity in QR code generation instructions across various platforms (WeChat, DingTalk, Feishu, YuanBao).
- Enhanced the styling of QR code display elements in the UI for better user experience.
- Refactored QR code generation logic in the ChannelDrawer component to ensure smoother transitions and prevent conflicts during the process.

These changes aim to improve user guidance and streamline the QR code generation experience.
…QR code flows

- Updated localization strings in English and Chinese for improved clarity in QR code generation and binding instructions across various platforms (WeCom, WeChat, YuanBao).
- Integrated translation functions to dynamically handle error messages and prompts, enhancing user experience during the QR code generation process.
- Refactored error handling in the ChannelDrawer component to provide more informative feedback to users in case of failures.

These changes aim to streamline the user experience and ensure consistent messaging across the application.
Reserve a toolbar spacer so right-dock and popup actions no longer sit
under frameless caption buttons, hide the PWA install entry inside the
Wails shell, restyle the splash as a card with a progress bar, and add
Windows settings-window height so DWM does not clip the bottom inset.

Co-authored-by: Cursor <cursoragent@cursor.com>
feat(channels): create Feishu bots via lark-oapi scan-to-create
…ress

fix(logging): size-cap rotation and logrotate delaycompress

Co-authored-by: Cursor <cursoragent@cursor.com>
feat(mobile): auto-install Docker for Android container backend

Co-authored-by: Cursor <cursoragent@cursor.com>
Passwordless sudo can install the engine, but /etc/docker/daemon.json and
systemctl restart still need elevation; otherwise the Tencent mirror step
silently skips.

Co-authored-by: Cursor <cursoragent@cursor.com>
…nd password handling. The default password is no longer hardcoded; first-run credentials are now written to `~/octop-login.txt`. Updated password policy to clarify requirements and options for setting a custom initial password using `OCTOP_DEFAULT_PASSWORD`.
- Integrated NSIS installation into the CI workflow for Windows, ensuring `makensis.exe` is available.
- Updated `package-release.sh` to check for `makensis` and provide installation instructions if missing.
- Enhanced documentation to clarify the need for NSIS in Windows packaging.
- Added NSIS project files to facilitate the creation of a Windows installer that includes shortcuts and the WebView2 runtime.

This change improves the Windows packaging process by providing a proper installer experience.
Add a left-side user-turn rail with hover preview, scroll-spy, and jump-to-turn so long chats are easier to scan without changing the session sidebar.
* fix: schedule proactive care for agents that never saved config

Proactive care defaults to on, but the scheduler only listed persisted
enabled rows, so most experts never entered the push loop.


* fix: attach gateway connector tools without rebuilding the agent

prepare_chat_mcp rebuilt the agent whenever a builtin MCP server was
missing from the live runtime. For gateway-mode connectors that rebuild
is pure loss: they carry no HTTP transport, their tools are built
in-process from stored credentials, and _post_start_agent runs the very
same injection at the end anyway. Meanwhile the rebuild drops the
harness instance and with it the checkpointer pool an in-flight turn is
still writing to.

Split the missing names on connector mode: gateway ones refresh their
credentials and inject into the running agent, the rest keep the
existing reload path.

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

* fix: await cancellation on scheduler shutdown, and keep its sleeps out of tests

ProactiveCareScheduler.shutdown() cancelled each task and returned
without awaiting it, so a loop parked in a multi-hour sleep could
outlive the shutdown that was supposed to end it. It now gathers the
cancelled tasks before returning.

Proactive care defaults to on, so creating an agent starts one of those
sleeps. pytest-asyncio waits for leftover tasks before fixture teardown,
which hangs the suite. octop_client shuts the scheduler down and calls
the new suspend() so nothing reschedules; an autouse fixture covers
tests that boot OctopServer another way. The scheduler's own unit tests
opt out.

suspend() exists for the tests. The alternative — every test remembering
to tear the scheduler down — is the arrangement that produced the hang.


* refactor: drive websockets on one event loop and drop the cross-loop workaround

starlette's sync TestClient runs the app on its own anyio portal loop.
That left the process with two loops over one OctopServer, so primitives
bound to a loop and shared by both — AgentManager._lock — deadlocked or
raised "bound to a different event loop". The tests worked around it by
running the ws session in a worker thread.

tests.support.http now speaks ASGI directly, so the handler, the gateway
workers and the test all share one loop, the way uvicorn runs it in
production.

That removes the reason the production handlers marshalled every
outbound frame across loops with run_coroutine_threadsafe + wrap_future.
The comment on that code named the cause outright — "this handler may
run on a different loop (e.g. starlette's TestClient portal)" — so it
was test-shaped machinery sitting on the path of every frame the
dashboard receives. Both handlers now await the send directly.


* update harness-agent & harness-memory

---------
liukewia and others added 28 commits September 3, 2026 19:38
#548)

* feat(release): add download links generation for GitHub releases

- Introduced a new script `release_download_links.py` to generate markdown for download links based on version tags.
- Updated the release workflow to append download links to the release notes if not already present.

* refactor(release): update download section headings and links for consistency

- Changed section titles in the release notes from Chinese to English for clarity.
- Updated download link labels in the `release_download_links.py` script to use English terms.
- Adjusted unit tests to reflect the updated headings in the download section.
Hide overflowing metric cards behind a more menu on desktop so the summary row no longer wraps.

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

Parse more text and spreadsheet types, add optional local/remote OCR for images and scanned PDFs, and surface upload progress so indexing no longer appears stuck.

Co-authored-by: Cursor <cursoragent@cursor.com>
Synthesize tool-call-only parents, stamp turn/duration metadata, and fall
back to content-size estimates so Turns/Calls/Duration toggles work on
legacy and burst-stamped events. Gather harness turn context and rename
conflicting trajectory unit test modules.
* fix(deskop): update DMG packaging instructions for macOS to clarify drag-and-drop installation

* feat(darwin): enhance DMG installer with custom background and layout adjustments

Added a custom background image for the DMG installer and adjusted the layout settings for better visual presentation. The background image is copied to the staging area if it exists, and the window dimensions and icon positions have been updated for improved aesthetics.

* chore(workflows): update upload and download artifact actions to latest versions

Updated the GitHub Actions in the octop-desktop workflow to use the latest versions of the upload-artifact and download-artifact actions, improving compatibility and security.

* refactor(darwin): remove old DMG creation script and update Taskfile for new background image

Deleted the outdated create-installer-dmg.sh script and replaced it with an inline script in Taskfile.yml that utilizes dmg-background.png for the DMG installer. This change streamlines the DMG creation process and enhances the visual presentation with the new background image.

* chore(.gitignore): clean up ignored files and directories

Updated the .gitignore file to remove unnecessary entries and ensure that build artifacts are properly ignored, while preserving the build directory for the desktop application. This change enhances the clarity and organization of ignored files.

* feat(darwin): replace DMG background image and enhance detachment logic

Introduced a new JPEG background image for the DMG installer, replacing the previous PNG file. Updated the Taskfile to improve the device detachment process with a dedicated function, ensuring smoother handling during DMG creation. Adjusted layout settings for better visual presentation in the installer window.
Co-authored-by: Cursor <cursoragent@cursor.com>
perf(trajectory): bound live stream persistence overhead
Co-authored-by: Cursor <cursoragent@cursor.com>
Match the experts table sticky columns so operations stay visible on
horizontal scroll, and drop container overflow that broke Ant Design fixed cells.
* feat(onnx_download): add COS support for model downloads

- Updated the download logic to include a new COS endpoint alongside existing Hugging Face and hf-mirror sources.
- Introduced functions for constructing COS URLs and handling COS-specific downloads.
- Enhanced the candidate building process to include COS as a source.
- Added tests to verify COS integration and ensure proper handling of manifest files and download paths.

This change expands the model download capabilities to include models hosted on COS, improving flexibility and access to resources.

* fix(onnx_download): update COS endpoint description for clarity

- Revised the comment for the COS endpoint to clarify that objects are organized under /models/embedding/{model_id}/.
- This change enhances the documentation within the code, improving understanding of the COS structure for future development.

* fix(dashboard): adjust modal properties for improved behavior

- Updated the zIndex of the feature modal in KnowledgeBasesPage to ensure it stacks above other modals.
- Changed the property from destroyOnClose to destroyOnHidden in both KnowledgeBasesPage and ProviderConfigModal for consistent modal behavior when closing.
List/detail expose icon_url from the baked snapshot avatar, and the card loads it with auth so publish no longer falls back to the Lucide icon when a custom avatar exists.
Release packaging now writes the package version into Info.plist, Windows VERSIONINFO, and NSIS instead of leaving stale hardcoded copies in the shipped app.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the legacy shared/default Playwright session router with
per-user harness-browser profiles (`user-<id>`) so concurrent users no
longer share one Chrome session, cookie jar, or recording. The backend
now always derives the profile from the authenticated user (or the IM
thread's agent owner) instead of trusting client-supplied profile/session
ids, and a BrowserProfileMiddleware pins tool-selected profiles to the
same boundary. Also dedupes ThreadRegistry's session-refresh logic.
- Relocate voice and search engine settings from Advanced to Models
  page/permission category (nav, routes, permission gates).
- Add /admin/voice/providers/test-configuration endpoint and
  VoiceManager.test_configuration() to probe unsaved provider values
  before saving.
- Redirect legacy /admin/advanced?tab=voice|search links to the new
  Models page location.
Migrate immediately after overlay and repair folded v13 connectors schema so existing backups stay usable. Refuse newer schema versions with BACKUP_SCHEMA_INCOMPATIBLE. Also drop the knowledge-bases Beta nav badge.

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

@router.get("/browser/env-status")
async def env_status(_: Any = Depends(current_user)) -> dict[str, Any]:
return _probe_env()
yield f"data: {json.dumps({'done': True, 'success': False, 'error': str(exc)})}\n\n"

return StreamingResponse(
_event_stream(),
@jubaoliang
jubaoliang merged commit deb7ac8 into main Sep 6, 2026
11 of 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.

7 participants