* feat(workflows): add COS upload functionality for release assets
- Implemented a new workflow to upload GitHub Release assets to COS.
- Updated existing workflows to trigger the upload process after release creation.
- Enhanced documentation within workflows to clarify asset handling and upload procedures.
* fix(workflows): update COS upload paths in workflows and scripts
- Changed asset upload paths in multiple workflow files to use the new format: `octop/release/<version>/`.
- Updated documentation comments to reflect the new upload structure for clarity.
- Adjusted the upload script to align with the updated path conventions.
* fix(workflows): upload to COS after skipped package jobs
GitHub skips a later reusable workflow when an earlier job in the chain was skipped, even if the release job succeeded. Attach-only desktop runs and FnOS native skips hit that path.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): pin the published coscli v1.0.9 checksum
The linux-amd64 asset hash no longer matches the value baked into the upload script, so COS uploads stop before any object is sent.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): upload release files to COS concurrently
A sequential coscli loop left each multi-hundred-megabyte package waiting on the previous one. Start every file at once and fail the job if any upload fails.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): stream coscli process logs during release upload
Process logs were disabled, so a running upload showed no throughput. Write one log per file and follow it on stdout.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): keep per-file coscli configs named .yaml
coscli rejects a config path that does not end in .yaml. Parallel uploads appended the package name after that suffix, so every file failed before transfer.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): keep Python wheel and sdist off COS
Those packages already go to PyPI and the GitHub Release. COS should only receive desktop installers and FnOS packages.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): read COS release settings from secrets
Reusable workflows only see secrets that callers pass explicitly. Bucket, region, and endpoint now travel with the existing COS credentials.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): build FnOS native ARM64 fpk when deps have no wheel
esdk-obs-python is sdist-only, so --only-binary :all: skipped the advertised
Octop-fnos-native-arm64 asset and left a 404 on the release notes.
* fix(ci): do not require mcp.__version__ in FnOS native smoke check
Pinned mcp 1.28.1 has no module __version__; pipefail now surfaces that
and was blocking both native FPK jobs after install already succeeded.
* fix(fnos): use fnpack platform=arm for native ARM64 packages
fnpack only accepts x86/arm/loongarch/risc-v/all; platform=arm64
failed packing and blocked Octop-fnos-native-arm64-*.fpk.
Keep the Docker/native wizards on an account-only flow, fail native start
when 8089 never comes up, and vendor harness storage_errors so current
Octop can boot against PyPI harness 1.0.0.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Digits-only sed left VER as the whole pyproject line for 1.0.2b1, so
native upload and GHCR wait both failed and no .fpk was attached.
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").
* 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.
* 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.
- 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.
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>
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>
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>
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>
- scripts/build-fpk.sh: emit Octop-fnos-docker-<ver>.fpk / Octop-fnos-native-<ver>.fpk (variant in the name, not a bare -native suffix).
- fnos-build-fpk.yml: FPK_NAME_PREFIX is now Octop-fnos; stop passing FPK_ITER; the release tag is fnos-<ver> (no -NN iteration, no -vanilla) and the rolling fnos-vanilla-latest release is no longer produced.
- fnos/README.md: document the new versioned artifact names.
* 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>
* 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>
* fix(tests): align subagent catalog division count with bundled library
The bundled subagent catalog now loads 19 divisions (272 agents), but two
tests still hard-coded an expected count of 16. Update the assertions so the
pre-commit suite is green.
* refactor(fnos): split fnos packaging into docker/ and native/ variants
Restructure the FnOS package layout so the Docker build and the native
installer live under separate directories (fnos/docker and fnos/native)
instead of a single fnos/ tree plus a parallel fnos-native/. Update the
FPK build workflow, build-fpk.sh and fnos/common.sh to source from the
new paths, and refresh fnos/README.md accordingly.
Follow-up to PR #407.
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* feat(fnos): add FnOS (飞牛 NAS) app packaging for Docker and native installs
Adds the packaging tree to build Octop as a FnOS app center package (.fpk):
- fnos/: Docker-deployable FPK (thin wrapper that runs the Octop image
via docker-compose on the NAS)
- fnos-native/: native FPK that runs Octop directly on the FnOS host with
the system Python 3.12 runtime (no Docker required)
- scripts/build-fpk.sh: generic FPK build helper using the official fnpack
CLI (injects the version from pyproject.toml into the manifest)
Both packages share the same app version as pyproject.toml. Container image
name is referenced as ghcr.io/TencentCloud/octop:latest — maintainers can
republish under their own namespace; the per-repo CI (image build + release
workflow) is intentionally left out of this PR.
* feat(fnos): first-use guide — fixed initial credentials admin/Octop123 with docs
- The previous default password 'octop' does not satisfy the password
policy (>=8 chars incl. letters and digits) enforced by 'octop init',
so the bootstrap admin could not be created
- Switch the default to Octop123, identical to the official Docker image
- Manifest install text now prints the initial account/password and tells
users to change it after first login
- fnos/README.md gains a 'First use' section (credentials table + change
password guidance) so users never need to dig into data directories
* ci(fnos): add FnOS packaging pipeline as a fork-maintainer template
Provides a complete CI template that builds the Octop Docker image,
the Docker .fpk and the native .fpk, then publishes GitHub releases
(fixed version + rolling latest):
- Trigger: workflow_dispatch only, so it never auto-runs on upstream
- Image namespace referenced as ghcr.io/TencentCloud/octop (placeholder;
fork maintainers replace with their own)
- Iteration numbering, changelog generation (install-first, no-merges,
capped at 30 entries) and rolling release management included
* refactor(fnos): dedupe lifecycle scripts into scripts/fnos/common.sh; tighten process kill
Addresses review feedback:
- Extract find_python312 / fix_ownership_and_perms / free_octop_ports into a
single shared library scripts/fnos/common.sh (injected into both packages'
cmd/common.sh by build-fpk.sh at package time) instead of duplicating them
across 7 docker/native lifecycle scripts
- Tighten the leftover-process cleanup: only kill processes under this
install dir (TRIM_APPDEST), no more broad 'pgrep -f octop' that could kill
other users' / other installs' processes
- Root README: add an 'FnOS Installation' section pointing to fnos/README.md
and noting the initial credentials + the #406 dependency for non-root CLI
installs
* feat(fnos): transparent app icons (512/256/64) — remove white background for dark/light themes
---------
Co-authored-by: veenyi <veenyi@users.noreply.github.com>
* feat: add drag and drop upload for skills zip import
- Add drag & drop upload zone in SkillImportModal
- Style matches reference image with dashed border
- Add i18n strings for drag hint and selected file display
- Update test to handle two remove buttons gracefully
- Keep original file selector button intact
* chore: anti spam bot
---------
Co-authored-by: Georgyhongbo <2280628443@qq.com>
GitHub-hosted runners have no committer name/email, so merge commits
failed before conflicts could be handled. Abort only when MERGE_HEAD exists.
Co-authored-by: Cursor <cursoragent@cursor.com>
Document no develop→main bulk merges and no squash on release PRs.
Update sync workflow to rebuild on conflict and open chore/sync PRs
when develop branch protection blocks direct push.
Co-authored-by: Cursor <cursoragent@cursor.com>
Bring v0.9.18 version files/CHANGELOG from main; resolve uv.lock.
Also fix Release sync-develop to pass --repo so gh works without checkout.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): trigger Sync Main Into Develop via workflow_run
GITHUB_TOKEN-created GitHub Releases do not fire sibling release workflows.
Listen for Release workflow completion instead, and allow manual dispatch.
* chore: release 0.9.17 (#120)
* fix: align sync paths with main and keep Release→Sync dispatch
---------
Auto Tag starts Release with GITHUB_TOKEN workflow_dispatch; in that
chain, workflow_run and release:published never started Sync. Cascade
explicitly after GitHub Release is created.
GITHUB_TOKEN-created GitHub Releases do not fire sibling release workflows.
Listen for Release workflow completion instead, and allow manual dispatch.
Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve provider-modal conflicts in favor of the shipped main tip, and fix
Sync Main Into Develop to trigger via workflow_run (GITHUB_TOKEN releases do
not fire sibling release workflows).
Co-authored-by: Cursor <cursoragent@cursor.com>
GITHUB_TOKEN tag pushes do not cascade to other workflows. After
pushing v*, explicitly workflow_dispatch Release and Docker Publish.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: workspace file preview, browser workspace, and tooling updates
Consolidate the in-progress workspace changes:
- In-browser preview for PDF/Word/Excel documents (DocumentPreview)
- Harness /workspace/ path normalization for chat file downloads
- Browser workspace UI and remote browser panels
- Docker packaging and CI publish workflow updates
- Dependency bumps (pyproject/uv.lock, dashboard package deps)
* feat(chat): docked file preview, HTML preview, and history pull-refresh
Polish workspace/chat file viewing with dock modes and shared resize,
sandboxed HTML preview, overscroll history refresh for incomplete WS
replies, and a compact input when the chat panel is narrow.
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor: delegate context usage to harness-agent 0.9.10
Bump orcakit-harness-agent and replace local token estimation with
HarnessAgent.aget_context_usage snapshots, keeping a stream-token
fallback for older wheels. Refresh the dashboard ring for the new
segment shape.
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor: pass BackendWorkspace paths through without rewriting
Replace extract/normalize helpers with backend_workspace_path so absolute
and relative sources stay as-is. Unify workspace download/read/write on
_workspace_io_path and update dashboard media URL helpers to match.
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(chat): unify browser and file panels into ChatDock
Replace separate FilePanel/ChatBrowserPanels/modal paths with a shared
ChatDock shell and useChatDockPanel state. Extract pointer-drag resize,
polish workspace file/media preview, and slim BrowserViewer for the
docked layout.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore: release 0.9.10
* fix: CI warnings/failures for skillhub subprocess and Windows media preview
Kill and drain timed-out skillhub CLI children so asyncio transports close
on a live loop, and restore workspace-relative plus host-file fallbacks so
Windows drive-letter paths still resolve for media preview/import.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(test): use platform default backend for virtual_mode media import
Hard-coding root_dir='/' breaks Windows CI: virtual-mode uploads resolve
outside the process drive root. Match default_agent_backend_spec instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: tolerate connector kind drift when resolving chat popup logos
getConnectorLogo now falls back to a normalized kind (lower-case,\nunderscore/hyphen unified) so connector instances created before the\ncatalog kind was finalized still resolve their logo in the chat picker\ninstead of showing a placeholder.
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* chore: release 0.9.8
* fix: align dashboard tool labels with backend; bump harness-agent to 0.9.8
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
* feat(connectors): add gateway connectors and drop baidu-netdisk/figma
Expand the catalog with QQ Music, Fliggy, Baidu Map, Ctrip Wendao, Meituan Travel, and Yuandian; migrate Tencent News to API key; unify gateway credential probes; remove Baidu Netdisk/Figma OAuth paths.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(install): ship Playwright by default and harden install scripts
Make browser tooling a core dependency, drop obsolete optional extras, and improve glibc/Playwright system-deps handling across install.sh/ps1/bat.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(desktop): install build deps before Python packages on Linux
Add a build-deps-only path so remote desktop setup can compile extension wheels when system headers are missing.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(dashboard): cache update-status checks in localStorage
Deduplicate concurrent PyPI probes across mounts and persist the last known update status with a short TTL.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test(live): add OSS probes, secret helpers, and CI live job
Centralize require_env skipping, document live credentials in .env.example, and wire a secrets-gated live-tests workflow.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(tests): rename chat WS integration test and drop dead cases
Align the chat transport test name with WebSocket usage and remove a skipped bootstrap harness test.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): unblock typecheck, CodeQL, and drifted live tests
Align mypy with requires-python 3.12 so numpy stubs parse; clarify Fliggy
SHA-256 use for request signing; update live expert/backend assertions
to the lazy Expert catalog and DEFAULT_BACKEND_SPEC with root_dir.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(ci): news Skill-Request-Id, workspace live reads, CodeQL FP
Add Tencent News CLI headers required by error 4010; assert expert
seeds via agent.workspace instead of host-rooted backend paths; ignore
Fliggy signing digests in CodeQL (protocol SHA-256, not password KDF).
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(tests): allow newline-only __init__.py in expert live checks
Office-automation skill packages ship empty package markers; strip()-based
emptiness assertions should not treat those as copy failures.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(tests): compare expert seeds via adownload_bytes
Harness aread_text replaces empty/whitespace file bodies with a system
reminder, which broke live office-automation __init__.py checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
CI:
- Drop Python 3.11 from the test matrix (package requires >=3.12); the
3.11 jobs failed at `uv sync`. Linux and Windows now test Python 3.12.
- Rename tests/unit/infra/setup/tls/test_store.py -> test_tls_store.py to
fix the pytest import collision (duplicate basename) that aborted
collection on the 3.12 job.
Source bugs uncovered by the suite:
- Move ACTOR_SYSTEM to a runtime import in infra/cron/job.py (was wrongly
placed under TYPE_CHECKING, causing NameError at runtime).
- Add missing users-table columns (login_failed_count, login_locked_until,
preferences_json) in infra/db/migrate.py for legacy schema repair.
- Make auth.update_me honor explicit nulls via model_dump(exclude_unset=True).
- Relax skills hub endpoints to existence/ownership checks (require_agent_row)
instead of requiring the agent to be running.
- Marshal WebSocket frames onto the owning event loop in chat/ws.py so the
starlette TestClient portal does not deadlock.
- Include error details in the browser session 503 response.
Tests:
- Update tests to match current source APIs (harness async create/remove/
rebuild, FakeHarnessAgent skill methods, workspace nested layout, JWT
middleware, CLI surface, proactive config defaults, general-assistant
template manifest).
- Migrate WebSocket tests to starlette TestClient(...).websocket_connect
(httpx 0.28 removed AsyncClient.websocket_connect).
- Skip memory API tests when the optional harness_memory dependency is absent
via pytest.importorskip.
- Remove the invalid diagnostic test tests/integration/test_diag_e2e.py
(no assertions; inspected private internals only).
Also includes the pre-existing uncommitted orca -> Octop rename across docs,
README, LICENSE, Dockerfile and docker assets, as requested.