Skip to content

chore: release 0.9.18 - #141

Merged
jubaoliang merged 57 commits into
mainfrom
release/0.9.18
Aug 2, 2026
Merged

chore: release 0.9.18#141
jubaoliang merged 57 commits into
mainfrom
release/0.9.18

Conversation

@jubaoliang

Copy link
Copy Markdown
Collaborator

[0.9.18] - 2026-08-02

新增

修复

  • 已停止或禁用的专家统一返回 AGENT_NOT_RUNNING(不再误报未找到);管理员 Token Usage 支持按用户筛选;聊天会话频道图标与创建用户角色选择优化 (fix: distinguish stopped agents and polish admin/chat usage UX #137)
  • 强化插件安装错误诊断与自定义 MCP 校验;网关流式错误支持本地化
  • 聊天流式错误在界面可见;Token Usage / Memory 图表与空状态展示优化;弹层 Dock 几何与全屏行为修正

变更

Release checklist

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

Made with Cursor

jubaoliang and others added 30 commits July 22, 2026 15:36
Document the branching model for agents and contributors, and align the
publish skill so tags are cut on main only after the release PR merges.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(skills): hot-persist skills_disabled without agent rebuild (#47)

Avoid scheduling a full harness reload when enabling/disabling skills or
finishing SkillHub install, which raced list fetches with AGENT_NOT_FOUND.
Also move the experts template "installed" badge to the card footer.

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

* fix: replace ChatGPT/Codex OAuth PKCE flow with device code flow

The PKCE browser-redirect flow used a dynamically built redirect_uri
(Octop's own callback URL), but OpenAI's shared Codex CLI OAuth client
only whitelists the exact http://localhost:1455/auth/callback used by
the local CLI, so every login attempt failed with
authorize_hydra_invalid_request regardless of deployment domain.

Switch to the device code flow instead: no redirect_uri is involved,
so it works no matter how/where Octop is hosted. The backend now
requests a user_code + verification URL and polls in the background;
the frontend shows the code and lets the user open the verification
page instead of doing a popup + postMessage dance.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* style: format codex OAuth device flow

---------

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* fix(skills): hot-persist skills_disabled without agent rebuild (#47)

Avoid scheduling a full harness reload when enabling/disabling skills or
finishing SkillHub install, which raced list fetches with AGENT_NOT_FOUND.
Also move the experts template "installed" badge to the card footer.

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

* fix(skills): fetch SkillHub rankings over HTTP

* fix(skills): preserve SkillHub display metadata

* feat(skills): use HTTP for SkillHub search and install

* refactor(skills): support source-neutral packages

---------

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: leoxyang <leoxyang@tencent.com>
* feat(browser): support real remote drag with shared canvas pointer

Forward CDP mousedown/mousemove/mouseup (with clickCount) so remote
browser and desktop can drag instead of pan-to-scroll, and share a
connecting indicator while the stream starts.



* fix(chat): restore loading earlier messages on scroll up

Keep the load-older gate armed across virtual list updates, release
the in-flight latch when history declines to start, and expose a
clickable fallback when the list does not overflow.

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

* feat(workspace): clarify path semantics with from_workspace

Add from_workspace so workspace UI keeps leading-slash relative paths
while chat/tool downloads can pass host-absolute send_file paths
through BackendWorkspace, with a host download allowlist.

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

* fix(workspace): preserve chat document path semantics

* fix(workspace): harden file URL and host path checks on Windows

Preserve Unix-style file:// paths instead of url2pathname backslashes,
decode percent-encoded segments, and deny POSIX system roots like /etc
before Path.resolve() on Windows.

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

* fix(workspace): decode Windows file URLs to native paths

Unquote percent-encoded segments in file:///C:/… URLs and normalize
via Path so send_file enrichment matches str(Path.resolve()) on Windows.

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

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(yuanbao): persist default channel endpoints

* chore(deps): require harness-gateway 0.8.7

* docs: note Yuanbao channel update

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
Keep deepagents conversation offloads in the agent workspace via
harness-agent≥0.9.12, map catalog context_window into model caps for
UI/summarization, and make /compact force summarization on the current
thread instead of resetting it.
Resolve CHANGELOG.md conflicts by keeping the released 0.9.13 notes
and combining duplicate issue references.

Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: PostgreSQL dual-backend for control plane

Add SqlitePool|PostgresPool behind DatabasePool, parallel PG migrations,
setup wizard defer/bind, pg_dump backups with cross-engine refusal, and
memory defaulting to the control-plane DSN when using PostgreSQL.

* fix(chat): delete checkpoint data when a conversation thread is deleted

Deleting a thread only removed Octop's own metadata row; the actual
message history stayed in the agent's LangGraph checkpointer forever,
making "delete conversation" cosmetic. Also confirm before deleting a
session in the UI, since the action is now genuinely destructive.

Checkpoint deletion runs before the metadata row is removed: if it
fails outright (not just "nothing to delete"), the thread stays
visible/retryable instead of orphaning data with no remaining handle.

* fix(memory): stop suggesting pg_dump for portable export of postgres memory

The 501 hint told users to "use pg_dump on the memory schema instead".
That advice predates the shared-table layout: memory for ALL agents now
lives in one harness_memory schema isolated by a namespace column, so a
schema-level pg_dump would export every agent's memory, not just the
requester's — a cross-agent data exposure if followed on a multi-user
install.

Document the two migration models where the refusal is implemented:
sqlite memory is per-agent files moved via pack/adopt; postgres memory
is shared, and the supported way to use it from another host (e.g.
OpenClaw's harness-memory bridge with --backend postgres) is pointing
that host at the same DSN and namespace — shared, not migrated.

* fix(test): update test_slash_compact to renamed SqlitePool

The /compact test module still imported the pre-rename DBPool, which
broke collection (ImportError) on this branch after develop's compact
feature was merged in — DBPool was renamed to SqlitePool (the concrete
class) with DatabasePool now the Protocol.

DBPool -> SqlitePool at all three sites: the import, the _agent_manager
type hint, and the fixture's DBPool(path) instantiation. SqlitePool is
the byte-for-byte successor of DBPool and matches how every other test
constructs a pool; DatabasePool cannot be used at the instantiation
site (a Protocol is not instantiable).

pytest -m live now collects cleanly (31 selected, 0 errors);
test_slash_compact 3 tests pass.

* fix(test): make memory_backend db_path assertion separator-agnostic

test_explicit_sqlite_overrides_postgresql_control_plane compared the
resolved db_path against the literal "/tmp/ws/memory.sqlite", which the
code never produces on Windows: it builds the path with pathlib, so the
Windows CI job got "\tmp\ws\memory.sqlite" and the string equality failed.

Compare as Path objects so the assertion holds on every OS separator,
matching the .as_posix() discipline already used in test_config.py.
…UX (#78)

Prevent stale thread URLs when switching experts, stabilize streaming Markdown, fill Memory/Token Usage layouts without nested scroll, and document the WeCom customer group QR.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the manual post-merge tagging step from /publish by letting
GitHub Actions push v* on main after release/* or hotfix/* merges.
Trees already match after #85; this merge commit makes main an
ancestor of develop so future syncs can fast-forward cleanly.
Recover from post-deploy hashed-asset mismatches that leave a white screen until a manual soft refresh, with a sessionStorage guard against reload loops.

Co-authored-by: Cursor <cursoragent@cursor.com>
126/yeah were incorrectly pointed at imap.163.com, and NetEase requires
an IMAP ID before mailbox access. Centralize mail host presets and harden
login/probe for QQ, NetEase, and Gmail.

Co-authored-by: Cursor <cursoragent@cursor.com>
fix(connectors): NetEase IMAP host resolution and IMAP ID
…load

fix(dashboard): auto-reload once on stale chunk load failures
…stem-paths

fix(browser): stop chmod on profiles; use shared ~/.octop/browser-profiles
Unify custom/preset/config provider dialogs around a shared draft-model editing flow so users can fetch remote OpenAI-compatible models, manage them consistently, and only persist changes on explicit save.
jubaoliang and others added 27 commits July 28, 2026 18:07
* fix: import complete GitHub skill bundles

Preserve full skill directories when importing from GitHub URLs so referenced files and scripts are not silently dropped. Harden archive fetching for branch names, file-count limits, and download size safety to make imports reliable.
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>
…viders

feat: add OpenCode Zen/Go preset providers + fix i18n placeholders
* 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.


* change initial passwd format same as ace
#108)

* feat: add global skill packages with local ZIP import and personalization layout

Introduce instance-level skill packages (DB + disk), mount them on agents, and
support SkillHub/URL/ZIP import. Merge related schema into migration v2 and
cover the zip import path with frontend and API tests.


* fix: hot-sync skill package mounts and dark-mode package cards

Avoid full agent rebuild when mounting packages so Experts UI no longer
hits AGENT_NOT_FOUND; accept workspace-scoped local backends on Windows;
use theme token for package list card background.
Update the "faster downloads" mirror examples in docker docs and
install scripts to use Tencent Cloud's PyPI/APT/NPM mirrors
(mirrors.cloud.tencent.com), so the documented defaults match what
scripts/install.sh and self_update.py already try first at runtime.

Affected: docker/Dockerfile, docker/docker_build.sh,
docker/README.md, docker/README_CN.md, scripts/README.md,
scripts/install.sh (--help).
…119)

* feat: Feishu/WeCom CLI connectors with chat generating UX and themed toasts

Add gateway adapters for official Feishu and WeCom CLIs (install, device-code
user auth, isolated CONFIG_DIR keys), unify chat generating/scroll helpers,
and bind antd message through App.useApp for theme-aware toasts.


* docs+test: Windows-safe connector mocks and install-hooks guidance

Use pathlib-based fake_bin_path for CLI mocks, assert CONFIG_DIR under
OCTOP_HOME via Path joins, and document make install-hooks plus cross-
platform test rules in AGENTS.md and CONTRIBUTING.md.
* 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


---------
#124 squash-landed 0.9.17 content but left main outside develop's
ancestor graph; this empty merge restores merge-base checks for Sync.
merge: reconnect main ancestry into develop
Unify file list / file viewer / browser into closable dock tabs with a
PR-style path tree and path dedupe; polish account popover and rail UX;
harden install mirrors and bump harness-agent.

Co-authored-by: Cursor <cursoragent@cursor.com>
feat(dashboard): tabbed chat dock file tree and account UX polish
…ples

docs(mirrors): optimize default China mirror examples to Tencent Cloud
Map disabled experts to AGENT_NOT_RUNNING instead of not-found, share
session channel icons in chat chrome, improve create-user role picking,
and let admins filter token usage by user.

Co-authored-by: Cursor <cursoragent@cursor.com>
Map disabled experts to AGENT_NOT_RUNNING instead of not-found, share
session channel icons in chat chrome, improve create-user role picking,
and let admins filter token usage by user.
…urce-hint

feat: expose the active search source in search settings (#109)
…2-alignment

chore: align Python target and refresh dependencies
…am i18n

Improve plugin manager/CLI diagnostics, custom MCP checks, and gateway stream
error localization; ship demo plugins and drop local editable harness-memory.

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

Fix popup dock geometry and fullscreen, surface chat stream errors, tighten
Token Usage and Memory turns charts, and share Octop empty-state mascot.

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

Align settings tabs, custom MCP and search providers, plugins admin, and
admin users role legend into the shared dashboard layout language.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@jubaoliang
jubaoliang merged commit 0dab523 into main Aug 2, 2026
5 checks passed
@jubaoliang
jubaoliang deleted the release/0.9.18 branch August 2, 2026 09:15
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