Skip to content

chore: release 0.9.27 - #433

Merged
jubaoliang merged 31 commits into
mainfrom
release/0.9.27
Aug 26, 2026
Merged

chore: release 0.9.27#433
jubaoliang merged 31 commits into
mainfrom
release/0.9.27

Conversation

@jubaoliang

Copy link
Copy Markdown
Collaborator

[0.9.27] - 2026-08-26

新增

  • 内置插件随包装分发(默认关闭,卸载后升级不重建)
  • 可配置上传上限(max_upload_mb / OCTOP_MAX_UPLOAD_MB,默认 100MB)
  • Dashboard 推送通知(定时任务与主动关怀 toast)
  • 聊天音视频附件预览播放,并扩展 inbound 附件 MIME
  • 火山方舟 Seedream / Seedance 生成模型配置、测试与结果展示
  • 连接器:Ardot、滴答清单;远程 MCP OAuth 改为 catalog 驱动
  • 单工具开关热更新与插件工具目录
  • ACP 内置 Runner:Kimi Code、Cursor CLI、Pi
  • 知识库文件夹重命名
  • ONNX 模型下载竞速 Hugging Face 与 hf-mirror
  • 远程手机 ADB shell(旋转与分屏布局)
  • FnOS NAS 应用打包(Docker / native .fpk
  • 专家模板扩充(通用、Karpathy、临床来源策略)
  • 中文子智能体约 49 个(HR / 法务 / 供应链)
  • Dashboard 剪贴板回退与聊天 UI 打磨

修复

  • 知识库文件夹操作按钮误开文件夹
  • 工具预期失败不再误报为 stream_error
  • 连接器 OAuth 公网回调 / HTTPS / 自动保存;npm 不可写时回退用户级 prefix
  • SSO ID token issuer 校验
  • Dashboard:SW 激活后再 reload、Firefox 无限刷新、选择器 popover、文案全球化
  • 浏览器 runtime 目录在 Windows 上可写探测

变更

  • FnOS 打包拆分为 docker/native/

Release checklist

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

Made with Cursor

github-actions Bot and others added 30 commits August 23, 2026 03:47
…nual

chore: sync develop onto main after manual
…tool catalog (#387)

- Add server-wide plugin enable/disable (PATCH /plugins/{id}) and a
  reload endpoint to pick up CLI installs without a full restart.
- Serve read-only plugin UI assets with traversal checks.
- Persist per-agent plugin tool enable flags and hot-sync the harness
  denylist so disables take effect on the next turn (no full reload).
- Add a tool catalog and plugin market UI plus a tool settings API.
- Ship demo plugins: ui-card, server-status, bilibili-anime.
- Update i18n bundles and API docs.

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: CodeBuddy <noreply@codebuddy.ai>
Firefox spuriously fires error events on modulepreload links even when assets
return 200, which triggered stale-chunk recovery and an infinite reload loop.
Only recover on stylesheet link failures, add reload scheduling guards, and
delay clearing the one-shot flag until lazy chunks settle.
Register the three ACP runners in Octop until harness-agent ships them on PyPI, with dashboard cards, icons, docs, and settings merge fallback.
- ConfigProvider 增加 locale 跟随界面语言切换(zhCN/enUS),修复英文界面下
  OK/Cancel、Refresh、Create 等 antd 内置文案仍显示英文
- 静态 Modal.confirm 显式补 okText/cancelText(不继承 ConfigProvider locale)
- 迁移硬编码按钮/提示文案到 i18n:记忆树/列表、向量检索、弃用确认、错误页、
  PWA 更新横幅、SkillHub、渠道扫码、KnowledgeBases 重建确认、Providers 页
- 补 en/zh 缺失 key(含 memory.tree.* 等 en.json 存量缺失)
- ErrorBoundary 单测改用 mock i18n,回归全绿
…t copying

- Added the `copy-to-clipboard` package to streamline clipboard operations across various components.
- Refactored multiple components (e.g., CopyableResourceId, Markdown, DockerEnvFooter) to utilize the new `copyText` utility, enhancing error handling and user feedback during copy actions.
- Updated package-lock and package.json to reflect the new dependency.

This change improves the reliability of text copying functionality throughout the dashboard.
* fix(auth): update issuer handling in SSO service and enhance ID token verification tests

- Refactor the issuer parameter in the SsoService to use a dynamic endpoint method instead of stripping trailing slashes.
- Add tests to verify ID token acceptance with trailing slashes and rejection for mismatched issuers.
- Enhance callback tests to ensure ID token verification aligns with the discovery issuer.

* fix(tests): streamline SSO service login test for clarity

- Consolidate the parameters in the `start_login` method call within the ID token verification test to enhance readability and maintainability.
- _runtime_dir_for_uid / _relocated_profiles_root_for_uid: use
  tempfile.gettempdir() on non-Linux platforms instead of hardcoding
  /tmp, which resolves to a drive-root path on Windows where ordinary
  users get PermissionError during mkdir.
- _probe_dir_writable: only probe symlink creation on Linux. Windows
  users without SeCreateSymbolicLinkPrivilege (no Developer Mode) hit
  OSError WinError 1314, causing writable directories to be flagged as
  unwritable and Chrome profiles to be recreated repeatedly.
Adds four self-contained expert templates (SOUL.md + manifest.json + skills),
following the existing experts/library conventions:

- ai-coding-coach: coding guidance & review coach with a cheatsheet skill
- ai-safety-guardian: AI safety reviewer with a security guide skill
- multi-agent-orchestrator: multi-agent planning & delegation methodology
- superpowers-methodology: engineering workflow methodology

Each expert is installable via the expert market UI and keeps its skills
fully self-contained (no external dependencies).
…-chain divisions

Expands the Chinese subagent library with 49 new agent definitions covering
human resources, legal, and supply-chain domains (plus divisions.json entries
for the three new divisions). Each agent follows the existing library format
with frontmatter and a full markdown body in Chinese.

New divisions added to zh/divisions.json:
- hr (人力资源)
- legal (法务)
- supply-chain (供应链)

All existing divisions and agents are untouched.
Remote Phone gets a WebSocket-backed adb shell, honest display rotation verification, and a VS Code-style collapsible shell pane on desktop with resizable split and mobile tab switching.
…s not writable

Octop often runs as a non-root user on NAS/container hosts where the npm
global prefix (/usr/local) is not writable, so `npm install -g @wecom/cli`
fails with EACCES (exit 243). This change:

- Detects the configured npm global prefix and its writability before
  installing connector CLIs (wecom-cli / lark-cli)
- Falls back to a user-level prefix (~/.npm-global) with --prefix when the
  global dir is not writable, without touching the user's npmrc
- Injects the user-level npm bin dir into the in-process PATH at server
  startup and on status checks, so shutil.which and CLI subprocess calls
  find the binaries
- Adds unit tests covering the fallback, the writable-path behavior and
  the PATH injection (cross-platform, honors USERPROFILE on Windows)
* 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>
…#409)

* refactor: replace hardcoded media type mappings with INBOUND_EXTENSION_MEDIA_TYPES

- Removed the _EXTENSION_MEDIA_TYPES dictionary from uploads.py and replaced it with INBOUND_EXTENSION_MEDIA_TYPES imported from inbound_store.py.
- Updated the _resolve_media_type and validate_inbound_media_type functions to utilize the new mapping for determining media types based on file extensions.
- Added unit tests to ensure that unknown MIME types correctly fall back to their respective extensions and that unsupported types raise appropriate errors.

* fix(api): improve error handling for upload requests

- Refactored error rejection in requestUpload to provide clearer error messages, including response text when available.
- Updated error handling in WorkspaceDrawer and useChatAttachments to utilize a new utility function for consistent API error messaging.

* feat: add error handling for unsupported and oversized attachments

- Introduced new error codes for unsupported file types and oversized attachments in the API.
- Updated localization files for English and Chinese to include messages for these new error codes.
- Enhanced the inbound media validation logic to raise appropriate errors when attachments exceed size limits or are of unsupported types.
- Added unit tests to verify the new error handling for attachment validation.

* feat: expand allowed inbound media types and improve validation logic

- Added a comprehensive list of allowed inbound media types and their corresponding file extensions to enhance file type validation.
- Introduced new test cases to ensure that various file extensions and MIME types are correctly validated, including support for additional programming and document formats.
- Updated the existing validation logic to accommodate new media types and ensure proper fallback mechanisms for unknown MIME types.
* feat: add codex-style task execution experience

* fix: narrow projected task item status

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
…#420)

* 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.

* feat(dashboard,backend): native clipboard fallback and chat UI polish

Replace the copy-to-clipboard dependency in the dashboard with a native
navigator.clipboard + execCommand fallback (copyText), and refine the chat
UI components (ChatInputActionsRow, MessageBubble, ScrollToBottomButton).

Backend: adjust mobile shell_ws, browser setup, and connector cli_install,
with accompanying unit tests.

---------

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

* 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>
Co-authored-by: leoxyang <leoxyang@tencent.com>
#426)

* 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.

* fix(tests): allow monkeypatching absent os.getuid on Windows

monkeypatch.setattr(..., raising=True) fails when getuid is missing on
Windows; use raising=False so the USERNAME fallback path is covered.

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

---------

Co-authored-by: jubaoliang <jubaoliang@tencent.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(onnx): implement model download racing and enhance metadata handling

- Introduced a new module `onnx_download.py` to handle racing between Hugging Face and hf-mirror for model downloads, improving download efficiency.
- Added a helper function `_hf_repo_from_sources` to streamline Hugging Face repository ID extraction from model metadata.
- Updated `get_onnx_model_meta` and `list_onnx_catalog_models` to utilize the new helper function for cleaner code and better handling of source metadata.
- Added unit tests for the new download functionality and metadata handling to ensure reliability and correctness.

* feat(onnx): enhance model download logging and path management

- Introduced a logging mechanism for ONNX model downloads, redirecting progress output to a log file instead of stdout/stderr.
- Added a new method `ensure_log` in `PathLayout` to create and return the log file path.
- Updated unit tests to verify that download progress messages are correctly logged.
- Improved the `_download_hf_snapshot` function to utilize the new logging functionality, enhancing traceability during model downloads.

* feat(onnx): enhance download progress tracking and error handling

- Added a new `on_progress` callback to the `download_model_raced` function to report download progress.
- Implemented a `_ui_progress_from_bytes` function to calculate the fraction of downloaded bytes for better UI feedback.
- Updated the `OnnxDownloadManager` to utilize the new progress tracking during model downloads.
- Enhanced unit tests to verify the correct reporting of download progress and ensure that the new functionality works as intended.

* fix(onnx): remove unnecessary delay for Hugging Face probes

- Eliminated the 10-second sleep for URLs starting with the Hugging Face official endpoint, streamlining the probe process.
- This change enhances the efficiency of the `probe_source` function by reducing unnecessary wait times during model downloads.
* feat(connectors): catalog-driven MCP OAuth for Ardot and Dida365

Unify Notion-style remote MCP OAuth behind catalog fields so new issuers
are mostly config, and add 腾讯设计 Ardot plus 滴答清单 with one-click
auth, manual token paste, and shared HTTPS callback handling.

Also align the Chrome runtime-dir unit test with non-Linux temp paths so
macOS pre-commit stays green.

* fix(tests): skip getuid monkeypatch when absent on Windows

setattr(os, "getuid") fails on Windows where the attribute does not
exist; only replace it on platforms that already have getuid.

---------

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
* feat(knowledge): 支持文件夹重命名

- repo: 新增 rename_document,使用 path_parent + normalize_kb_path 计算新路径,
  对文件夹执行基于 substr 的精确前缀匹配(替代 LIKE,避免 _/% 通配符误匹配),
  同步重写所有后代文档的 path 字段
- service: 新增 rename_document,处理权限、名称校验、幂等性与重名冲突,
  同名重命名直接返回避免无谓写库
- api: 新增 POST /{kb_id}/documents/{doc_id}/rename,新增 KNOWLEDGE_NAME_INVALID
  错误码(400)与 KNOWLEDGE_NAME_TAKEN 错误码(409)路由映射
- 前端: KnowledgeBases 文件夹行删除按钮左侧新增重命名按钮(type=text size=small),
  弹窗复用 Modal + Input,名称未变时直接关闭、不发请求
- i18n/locales: 新增 KNOMEDGE_NAME_INVALID 错误消息及重命名成功/失败提示
- tests: 新增 4 个 repo 测试、5 个 service 测试、2 个 api 错误映射测试,
  覆盖后代路径改写、跨根/嵌套文件夹、重名冲突、含分隔符拒绝、幂等、ACL 拒绝

* fix(knowledge): remove stray SKILL_DETAILS_PROTECTED error code

The folder-rename PR accidentally carried SKILL_DETAILS_PROTECTED from an
unrelated feature branch into ErrorCode and _DEFAULT_STATUS without its
i18n entries, failing test_dashboard_api_errors_match_backend and
test_every_error_code_has_i18n_entry in CI. Drop it here; the
published-expert skill-details feature ships it separately with locales.
* feat(media): add generation model management and feedback

* chore: document media generation and restore quality gates

* test(browser): support missing getuid on Windows

---------

Co-authored-by: leoxyang <leoxyang@tencent.com>
把 bundled 插件打进 wheel 并在启动时按需种植;上传大小走 config/env;聊天支持音视频预览,定时任务通过 WS toast 推到 Dashboard。

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
monkeypatch.setattr(mod.httpx, "Client", _RecordingClient)
items = mod._weibo(5)
assert "weibo.com/ajax/side/hotSearch" in _RecordingClient.last_url
assert _RecordingClient.last_headers.get("Referer", "").startswith("https://weibo.com")
@jubaoliang
jubaoliang merged commit a4d49eb into main Aug 26, 2026
4 of 5 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.

10 participants