The remote dashboard origin never loads Wails runtime.js, so the official
edge-resize logic never runs; the injected overlay only covered dragging
and double-click maximise. Extend it with the runtime's own strategy:
pure window-event edge detection (5px edges, 12px corners, scrollbar
width excluded), invoking wails:resize:<cursor> - the exact message
HandleMessage in wails v3.0.0-beta.13 dispatches to startResize. Presses
on a resize edge no longer arm title-bar dragging. No overlay elements
are created.
Closes#1656
Co-authored-by: Jay Feng <jayfeng77@outlook.com>
Desktop startup was saving a hardcoded bind address and could launch a second Octop when the preferred port was busy. Chat uploads dropped folders, shared peer experts are no longer offered for delete, and the state backend stays available only for experts that already use it.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Portable in-app upgrades could stay at 85% and fail: pip --target resolves
dependencies again instead of reusing the ones already installed in the target,
so every upgrade re-downloaded the whole tree (194 packages), timed out on every
mirror, and still reported success while the target held the previous version.
- Ship uv==0.12.22 in the online/offline portable archives and prefer the
bundled packages/bin updater, which reuses the dependencies already installed
in the target; start.sh/start.bat declare packages/ as the update target so
standalone installs use it too.
- For archives built before the bundled updater existed, download only the
application wheel and check its dependency closure before modifying the target,
including transitive extras, environment markers and Requires-Python. Install
the validated local wheel offline with --no-deps. Download and local installation
each have a 90-second budget. Incompatible dependencies, installation failures or
failed runtime verification trigger full dependency installation. One 900-second
fallback window starts at the first full install and is shared across mirrors;
subsequent installer timeouts are capped by the remaining window. A dependency
preflight rejection does not overwrite the old application.
- Verify by loading the target's Octop in a fresh interpreter that processes its
.pth files, then exercise `python -m octop --version`. Parse a marked result
line so import output cannot obscure the version. Stale dist-info, new
metadata with old or unloadable code, and a failing CLI entry cannot confirm an
upgrade; the installed version must be newer and match the requested target.
Portable and FPK installations share the rule.
- Read the installed target when validating an explicit request, and reject a
same-or-older version before installing (HTTP 400 before an API task is
created). Localise results and verification errors through the API and CLI.
The launcher-side version comparison (a reinstalled desktop client kept launching
the previous runtime) is handled in #1561.
The numeric comparator treated 1.0.2b4 and 1.0.2b5 as equal, so
replacing the desktop executable kept the persistent older runtime.
Port the existing Python parse_version key instead of adding a
third-party PEP 440 library. Overlay installs can replace b4 with b5;
backup, replacement rollback, and no-downgrade stay unchanged.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
extra stays empty on darwin-arm64, linux-* and windows-amd64 because
write_green_overrides only emits an override file for windows-arm64 and
darwin-amd64. "${extra[@]}" under set -u aborts on the macOS default
/bin/bash before uv ever runs, so `make -f desktop/portable/Makefile
wheels` fails on the host platform. Use the guarded expansion form the
repo already applies in scripts/install.sh.
Improve team streaming visibility (live speakers, generating footer, IM
dispatch/wrap-up), relax ACP tool enable under sandbox while locking
runners, strip channel think tags per show_thinking, and clarify provider
CLI usage in the assistant skill. Includes self-update/UpdateConfig WIP
from the same working tree.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the dead `make docs-cli` target (scripts/regen_cli_docs.py
never existed); point desktop/portable/README.md at the real
octop-desktop.yml workflow and desktop/portable/.gitignore; drop the
non-existent api/jwt_tokens.py from AGENTS.md.
Closes#789
* feat(upgrade): implement portable runtime upgrade with database backup
- Added functionality to upgrade the bundled portable version while ensuring a SQLite database backup is created before the upgrade.
- Introduced tests to verify that the upgrade process correctly handles version comparisons, preserves the current runtime if the backup fails, and maintains the runtime when the new package is incomplete.
- Updated README to reflect changes in the upgrade process and backup management.
This enhances the reliability of the desktop application during updates, ensuring data integrity and a smoother user experience.
* feat(localization): enhance desktop text localization and improve fallback handling
- Refactored the `desktopText` function to utilize a centralized map for localization strings, improving maintainability and readability.
- Added new localization keys for various statuses and messages in both English and Chinese.
- Updated tests to verify correct behavior for different locales and fallback scenarios.
- Adjusted the application to use the new localization structure, ensuring consistent messaging throughout the desktop application.
This update enhances the user experience by providing clearer and more accurate status messages based on the selected locale.
* fix(desktop): build macOS icns with sips + iconutil
wails3's encoder resizes with Mitchell-Netravali, whose negative lobe
overshoots on the logo's high-contrast edges. The R channel clips at 0
while G/B keep mid values, leaving near-opaque dark pixels scattered over
the red tile: 4 in the 64px layer, 13 at 128px, 23 at 256px. It also
emits only 8 layers, missing icon_16x16 and icon_32x32, so Finder has to
downscale a larger layer for small sizes.
Generate the .iconset with sips and pack it with iconutil instead. All 10
layers are present and Core Graphics downsampling leaves no overshoot.
generate:icons is split because sips and iconutil are macOS-only: the
shared task keeps emitting the Windows .ico on every platform, while the
new darwin-only task owns the .icns.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore: update tray and app icon assets for desktop
Replaced existing tray-icon.png and appicon images with updated versions to enhance visual quality and consistency across platforms.
* feat(darwin): implement retry mechanism for hdiutil commands in Taskfile.yml
- Added a `retry_hdiutil` function to handle transient errors when creating and converting disk images with hdiutil, improving reliability during CI builds.
- Updated existing hdiutil commands to utilize the new retry mechanism, ensuring that failures due to resource contention are retried appropriately.
This enhancement aims to reduce failures in the disk image creation process, particularly in CI environments.
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add Didi (滴滴) MCP connector: catalog entry, remote spec builder,
credential validation, and dashboard logo asset.
- Report upgrade progress while the upgrade task runs (backend polls
the task with a timeout loop instead of blocking silently) and
retry the frontend progress poll a few times before surfacing an
error, instead of failing on the first transient fetch error.
- Desktop launcher: detect when the bundled portable runtime is newer
than the installed one and replace it in place (extract to a
side-by-side dir, swap, keep a previous copy for rollback on
failure) instead of only extracting on first launch.
- Fix wording in sync-main-to-develop.yml (sync direction was
described backwards: "develop onto main" -> "main into develop").
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>
* 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.
- 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.
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>
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>
* fix(desktop): restore only the main window on macOS dock click
Wails shows every hidden window on ApplicationShouldHandleReopen, which
also popped the tray settings overlay. Cancel that default and restore
the main window only.
* fix(desktop): polish splash, tray settings, and health-wait copy
Show window controls on the splash and settings shell, open the
macOS menu-bar popover on left click, and replace /api/health
English errors with locale-aware status text.
* fix(desktop): show only close on the settings popover
Minimise and maximise do not apply to the tray settings window.
Close hides that overlay instead of sending the main window to the tray.
---------
The dashboard is loaded from a remote origin, so Wails never injects
runtime.js. Arm wails:drag ourselves, put window controls on the right, and
drop InvisibleTitleBarHeight. Expert profile skill/subagent cards now show
the icon beside the title, with status or slug on the same row.
Co-authored-by: Cursor <cursoragent@cursor.com>
Configure MacWindow.InvisibleTitleBarHeight (32px) on the frameless desktop
window so macOS keeps a draggable region beneath the custom title bar.
Only affects the macOS build; other platforms are unchanged.
- api: answer a missing /assets/<hash>.js with 404 instead of the SPA
shell, so the browser no longer rejects index.html as a module script
("not a valid JavaScript MIME type") and hides a stale shell left
behind by an upgrade.
- dashboard: extend the stale-chunk reload regex to also match MIME
rejection errors surfaced by WebKit / Chrome / Firefox.
- desktop: split the macOS icon onto an 824/1024 canvas (icons.icns) and
add applyAppIcon / applyTrayIcon so the Dock glyph is not oversized.
- agents: hand harness an absolute workspace_dir on Windows, where the
agent-facing /.octop/workspaces/<id> form has no drive letter.
* 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>
* 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>
* 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>