28 Commits
Author SHA1 Message Date
jayandJay Feng b84dbf357c fix(desktop): add frameless edge and corner resize handles for Linux (#1657)
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>
2026-10-19 16:26:35 +08:00
LouisChenandchqcjq 31510ec9b7 fix(portable): propagate bundled packages to Python subprocesses (#2044)
Co-authored-by: chqcjq <3361008+chqcjq@users.noreply.github.com>
2026-10-19 16:26:16 +08:00
7f19f9222e fix: preserve desktop listen config and accept folder drops in chat (#1874)
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>
2026-10-10 14:42:37 +08:00
e9deb58206 fix: harden Docker bootstrap, Bridge sessions, and desktop/provider UX (#1825)
Avoid silent random admin passwords, keep Bridge links alive under load,
and stop custom providers from sending stream_options that MindIE rejects.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 07:04:56 +08:00
lymerin 956e789643 fix(update): install portable upgrades without re-resolving dependencies
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.
2026-10-05 15:59:32 +08:00
f2bc6bec2d fix(desktop): compare portable versions with parse_version rules (#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>
2026-10-04 11:52:54 +08:00
lihongyuan99 e8be6571b1 fix(desktop): expand the optional wheel overrides under bash 3.2 (#1363)
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.
2026-09-30 15:12:37 +08:00
jubaoliangandCursor 4c3bf76479 fix: team chat/IM UX, ACP sandbox, channel thinking, and related polish
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>
2026-09-25 23:59:46 +08:00
jubaoliangandCursor 49bceee5d2 fix(desktop): write NSIS version defines via Python, avoid PowerShell $vars
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 02:34:07 +00:00
jubaoliangandCursor f6a20b713f fix: NSIS pep440 VI version, experts empty guide, CodeQL URL hostname checks
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-23 01:09:27 +00:00
Louisss ecc2c84f13 docs: fix references to non-existent files (#821)
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
2026-09-19 20:44:55 +08:00
liukewia 8116d077a1 feat(desktop): upgrade bundled portable runtime with SQLite backup (#598)
* 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.
2026-09-09 19:41:33 +08:00
liukewiaandCursor 64a96346b0 fix(desktop): build macOS icns with sips + iconutil (#596)
* 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>
2026-09-08 17:12:21 +08:00
jubaoliang 2fd3a5de7a feat: add Didi connector, improve upgrade progress reliability
- 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").
2026-09-07 09:04:29 +08:00
liukewiaandCursor 668434c457 fix(desktop): stamp pyproject version into packaged app metadata
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>
2026-09-05 08:34:29 +08:00
liukewia 94b161e61f chore: update product identifier from "com.octop.desktop" to "com.tencent.octop" in configuration files 2026-09-04 17:26:50 +08:00
jubaoliangandCursor f5875837a3 style(desktop): apply Ruff formatting to portable launch scripts
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 11:13:47 +08:00
liukewia d10df912a6 feat(desktop): ship macOS DMG with drag-to-Applications install (#554)
* 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.
2026-09-03 20:42:08 +08:00
liukewia 0629253d4e feat(desktop): add NSIS installer support for Windows packaging
- 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.
2026-09-02 19:12:36 +08:00
jubaoliangandCursor 9ac0dd962f fix(desktop): keep dock chrome clear of window controls
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>
2026-09-02 17:15:54 +08:00
jubaoliangandCursor cea720fcbb fix(ci): unify desktop and portable release artifact names
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>
2026-09-02 11:19:20 +08:00
jubaoliang f6bcfd94c7 fix(desktop): macOS 点程序坞只恢复主窗口 (#512)
* 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.


---------
2026-09-01 15:25:14 +08:00
jubaoliangandCursor b92d3ed8b2 fix(desktop): restore frameless window drag without blocking title-bar clicks
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>
2026-08-31 21:34:44 +08:00
jubaoliang d7a09f0c58 fix(desktop): set macOS invisible title bar height for frameless window
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.
2026-08-31 17:12:58 +08:00
jubaoliang 3f2aec191a fix: serve 404 for stale hashed assets and harden desktop shell
- 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.
2026-08-31 04:47:45 +00:00
b984ba84a0 chore: sync develop onto main after accidental main merges (#473)
* 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>
2026-08-29 10:44:00 +08:00
liukewiaandCursor a6d9caafc3 ci: run desktop packaging on PRs (macOS + Windows) (#469)
* 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>
2026-08-29 09:50:35 +08:00
94375d12f7 chore: sync develop onto main after accidental main merges (#464)
* 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>
2026-08-27 19:50:13 +08:00