Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
fd45974
feat(mobile): auto-install Docker for Android container backend
miaowmint Aug 31, 2026
c70c063
Merge branch 'develop' into feat/auto-install-docker
jubaoliang Sep 1, 2026
97adaf5
fix(mobile): use posix_compat.geteuid for cross-platform mypy
jubaoliang-tencent Sep 1, 2026
5c2a3d5
Merge pull request #523 from TencentCloud/chore/sync-develop-after-ma…
github-actions[bot] Sep 1, 2026
6fef3d3
feat(mobile): vendor the Docker install script and harden error handling
miaowmint Sep 1, 2026
c40e239
Merge branch 'develop' of https://github.com/TencentCloud/Octop into …
miaowmint Sep 1, 2026
51d5e49
fix(ci): repair FnOS workflow parse error and stop re-running CI per …
jubaoliang-tencent Sep 2, 2026
cea720f
fix(ci): unify desktop and portable release artifact names
jubaoliang-tencent Sep 2, 2026
18cf7ae
fix(ci): attach FnOS fpk to the v* GitHub Release (#531)
jubaoliang Sep 2, 2026
9950f44
fix(ci): fail release cascade, attach desktop from any ref, drop dupl…
jubaoliang Sep 2, 2026
745eba6
fix(logging): cap log size and delaycompress like logrotate
huangcheng Sep 2, 2026
b686d6e
fix(logging): keep default INFO for all loggers including memory
huangcheng Sep 2, 2026
47fe766
fix(tests): write gzip log fixture as bytes for Windows CRLF
huangcheng Sep 2, 2026
a0f34cb
feat: integrate lark-oapi for Feishu bot creation and update QR handling
liukewia Sep 1, 2026
0585ff8
refactor: enhance Feishu bot registration flow and localization
liukewia Sep 1, 2026
36049d2
fix(ChannelDrawer): stop polling before generating QR codes for vario…
liukewia Sep 1, 2026
3f5678c
refactor: update localization and enhance QR code generation flow
liukewia Sep 2, 2026
d1ce5c5
refactor(ChannelDrawer): enhance localization and error handling for …
liukewia Sep 2, 2026
9ac0dd9
fix(desktop): keep dock chrome clear of window controls
jubaoliang-tencent Sep 2, 2026
08680e0
Merge pull request #536 from liukewia/feature/feishu-bot-creator
jubaoliang Sep 2, 2026
c1b7ba3
Merge pull request #533 from huangcheng/fix/log-size-rotate-delaycomp…
jubaoliang-tencent Sep 2, 2026
6f286aa
Merge pull request #511 from miaowmint/feat/auto-install-docker
jubaoliang-tencent Sep 2, 2026
3121595
fix(mobile): write daemon.json and restart Docker via sudo when not root
jubaoliang-tencent Sep 2, 2026
903a958
Update README files to reflect changes in initial admin credentials a…
liukewia Sep 2, 2026
0629253
feat(desktop): add NSIS installer support for Windows packaging
liukewia Sep 2, 2026
e166fef
feat(chat): add turn timeline rail for in-thread navigation
huangcheng Sep 2, 2026
ff16453
docs(changelog): note chat turn timeline rail
huangcheng Sep 2, 2026
0940397
Feature/reload ws polish 0902 (#529)
Bosheng0422 Sep 3, 2026
0149951
docs: 更新默认管理员凭据说明
liukewia Sep 2, 2026
31a24e1
feat(dashboard): add not-found page for unknown routes
liukewia Sep 2, 2026
c305010
feat(cron): add name field to cron jobs and update related interfaces…
liukewia Sep 3, 2026
bd92457
chore: make Playwright Chromium opt-in in installers and images (#537)
liukewia Sep 3, 2026
a2160cd
fix(onnx): disable Hugging Face Xet for snapshot downloads (#547)
liukewia Sep 3, 2026
f3d301f
feat(dashboard): replace antd Spin with OctopSpinner globally
jubaoliang-tencent Sep 3, 2026
064f957
feat(backup): let users choose archive contents and keep omitted data
jubaoliang-tencent Sep 3, 2026
fc03a94
feat(cron): persist scheduled turns and keep gateway transport-only (…
jubaoliang Sep 3, 2026
f810664
feat(chat): show human-readable HITL approval cards
jubaoliang-tencent Sep 3, 2026
6a8914d
feat(release): append templated download links to GitHub Release note…
liukewia Sep 3, 2026
3695bac
feat(dashboard): keep token usage stats on one row
jubaoliang-tencent Sep 3, 2026
8401f89
feat(knowledge): expand document formats, add optional OCR, and show …
jubaoliang-tencent Sep 3, 2026
b67a124
feat(chat): Trajectory drawer with ledger and live stream (#553)
huangcheng Sep 3, 2026
d10df91
feat(desktop): ship macOS DMG with drag-to-Applications install (#554)
liukewia Sep 3, 2026
515f601
perf(trajectory): bound live stream persistence overhead
jubaoliang-tencent Sep 3, 2026
2124c32
Merge pull request #558 from TencentCloud/fix/trajectory-performance
jubaoliang Sep 3, 2026
f587583
style(desktop): apply Ruff formatting to portable launch scripts
jubaoliang-tencent Sep 4, 2026
c712951
fix(admin): pin users table name and actions columns while scrolling
huangcheng Sep 4, 2026
e1c2c50
fix(admin): disable sticky users columns on mobile like experts
huangcheng Sep 4, 2026
75fac60
feat(onnx): race COS with Hugging Face for embedding downloads (#557)
liukewia Sep 4, 2026
9ee27a0
fix(experts): show published snapshot avatar on user-published cards
huangcheng Sep 4, 2026
3d61e9b
feat: add agent trajectory recording + make CronJobs name column non-…
jubaoliang-tencent Sep 4, 2026
91c9e20
chore: bump harness-memory to 0.9.9
Bosheng0422 Sep 4, 2026
032d5cc
proactive care timezone bug fix
Bosheng0422 Sep 4, 2026
3dcb77e
ruff format
Bosheng0422 Sep 4, 2026
118bad5
feat: optimize AskQuestionCard UI and knowledge parsing
jubaoliang-tencent Sep 4, 2026
94b161e
chore: update product identifier from "com.octop.desktop" to "com.ten…
liukewia Sep 4, 2026
668434c
fix(desktop): stamp pyproject version into packaged app metadata
liukewia Sep 4, 2026
fa2f6a7
feat(browser): isolate harness-browser profiles per Octop user
jubaoliang-tencent Sep 4, 2026
61f4ba6
feat(settings): move voice and search settings under models page
jubaoliang-tencent Sep 5, 2026
05b7548
feat(connectors): support multiple connector instances and shared con…
jubaoliang-tencent Sep 6, 2026
1a12948
feat(storage): add OpenSandbox remote sandbox storage backend
jubaoliang-tencent Sep 6, 2026
c62ec8e
feat(plugins): add per-agent plugin toggle, move plugin config to Per…
jubaoliang-tencent Sep 6, 2026
a90388d
feat(experts): add catalog display metadata to bundled skills
jubaoliang-tencent Sep 6, 2026
d9a0e5f
chore: misc unrelated fixes
jubaoliang-tencent Sep 6, 2026
3358d01
fix(backup): restore old archives after schema changes without 500s
jubaoliang-tencent Sep 6, 2026
1c23cc8
chore: release 0.9.32
jubaoliang-tencent Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .github/workflows/auto-tag-on-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ jobs:
# dispatch Release / Docker Publish / Desktop Package (workflow_dispatch
# is exempt). FnOS FPK is cascaded from Release after the GitHub Release
# exists (reuses Release wheel + waits for GHCR image from Docker Publish).
# Desktop builds in parallel; its release job upserts zips onto the same v*.
# Desktop and FnOS upsert their packages onto the same v* GitHub Release
# after it exists (FnOS is dispatched from Release.yml).
- name: Trigger Release, Docker Publish, and Desktop Package
if: steps.check_tag.outputs.should_publish == 'true'
env:
Expand Down
13 changes: 9 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
name: CI

# Pull requests only. GitHub runs PR checks on the merge result, so a push
# build on main would re-test content that the release / feature PR already
# proved green.
on:
push:
branches: [main]
pull_request:

concurrency:
Expand All @@ -13,6 +14,9 @@ jobs:
quality:
name: "Python ${{ matrix.python-version }}"
runs-on: ubuntu-latest
# Post-release main → develop sync PRs carry main's already-tested tree and
# are auto-merged by the bot before checks finish. See sync-main-to-develop.
if: ${{ !startsWith(github.head_ref, 'chore/sync-develop-after-') }}
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -40,6 +44,7 @@ jobs:
test-windows:
name: Windows / Python 3.12
runs-on: windows-latest
if: ${{ !startsWith(github.head_ref, 'chore/sync-develop-after-') }}
steps:
- uses: actions/checkout@v4

Expand All @@ -65,8 +70,8 @@ jobs:
runs-on: ubuntu-latest
# Only the main repo may access secrets; fork PRs get none and must skip.
if: >-
github.event_name == 'push' ||
github.event.pull_request.head.repo.full_name == github.repository
github.event.pull_request.head.repo.full_name == github.repository &&
!startsWith(github.head_ref, 'chore/sync-develop-after-')
steps:
- uses: actions/checkout@v4

Expand Down
67 changes: 22 additions & 45 deletions .github/workflows/fnos-build-fpk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,19 @@ name: Build Octop FPK
# FnOS (飞牛 NAS) 安装包流水线。
#
# 触发:
# - Release 工作流在 GitHub Release 创建成功后自动 dispatch(推荐)
# - 亦可手动 workflow_dispatch(需对应版本镜像已在 GHCR)
# - Release 工作流在 GitHub Release(v*)创建成功后自动 dispatch(推荐)
# - 亦可手动 workflow_dispatch(需对应版本镜像已在 GHCR,且 v* Release 已存在
#
# 制品复用:
# - Docker 镜像:不再重建,等待 docker-publish 推送的
# ghcr.io/tencentcloud/octop:{version|latest}
# - Native wheel:优先从同版本 GitHub Release(v*)下载;
# 缺失时再回退到本仓源码构建
# - 产物挂到同一个 v* GitHub Release(与 wheel / 桌面包并列),不再单独打 fnos-* tag
#
# Jobs:
# version → ensure-image → fpk(Docker 版 .fpk,仅打包 compose)
# ↘ native(本地版 .fpk)→ release(按版本号发布 fnos-<ver>
# ↘ native(本地版 .fpk)→ release(把 .fpk 挂到已有的 v* GitHub Release

on:
workflow_dispatch:
Expand Down Expand Up @@ -48,9 +49,9 @@ jobs:
IMAGE="ghcr.io/$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')"
echo "version=$VER" >> "$GITHUB_OUTPUT"
echo "image=$IMAGE" >> "$GITHUB_OUTPUT"
echo "tag=fnos-${VER}" >> "$GITHUB_OUTPUT"
echo "tag=v${VER}" >> "$GITHUB_OUTPUT"
echo "pkg_ver=${VER}" >> "$GITHUB_OUTPUT"
echo "[version] VER=$VER, TAG=fnos-${VER}"
echo "[version] VER=$VER, TAG=v${VER}"

# 复用 docker-publish 已推送的镜像,不在此重新 build/push。
ensure-image:
Expand Down Expand Up @@ -256,52 +257,28 @@ jobs:
cp artifacts/docker-fpk/*.fpk dist/ || true
cp artifacts/native-fpk/*.fpk dist/ || true
ls -lh dist
if ! ls dist/*.fpk >/dev/null 2>&1; then
echo "::error::No .fpk files to attach."
exit 1
fi

- name: Generate changelog
id: changelog
- name: Require existing v* GitHub Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ needs.version.outputs.tag }}
run: |
VER="${{ needs.version.outputs.version }}"
IMAGE="${{ needs.version.outputs.image }}"
PREV_TAG=""
for t in $(git tag --list "fnos-*" --sort=-creatordate); do
[ "$t" = "fnos-latest" ] && continue
if git merge-base --is-ancestor "$t" HEAD 2>/dev/null; then
PREV_TAG="$t"
break
fi
done
echo "prev_tag=$PREV_TAG" >> "$GITHUB_OUTPUT"
{
echo "## 安装说明"
echo ""
echo "1. 飞牛应用中心 → 设置 → 手动安装应用,选择对应 .fpk。"
echo "2. Docker 版 **Octop-fnos-docker-${VER}.fpk**(约 80KB):飞牛自动从 GHCR 拉取 \`${IMAGE}:latest\`。"
echo "3. 本地版 **Octop-fnos-native-${VER}.fpk**(约 200MB):非 Docker,原生运行在飞牛主机;安装时自动关联系统 Python 3.12 开发工具;浏览器、远程桌面等附加组件在 Octop 应用内按需安装。"
echo ""
echo "---"
echo "按版本号下载对应 .fpk 即可(如 \`Octop-fnos-docker-${VER}.fpk\` / \`Octop-fnos-native-${VER}.fpk\`)。"
echo ""
echo "## 本次更新(v${VER})"
echo ""
if [ -n "$PREV_TAG" ]; then
git log --oneline --no-merges "$PREV_TAG"..HEAD | head -30
else
git log --oneline --no-merges -30 HEAD
fi
} > /tmp/release-body.md
cat /tmp/release-body.md
set -euo pipefail
if ! gh release view "$TAG" --repo "${{ github.repository }}" >/dev/null; then
echo "::error::GitHub Release ${TAG} does not exist yet. Run this after Release.yml creates it."
exit 1
fi

- name: Publish versioned release
- name: Attach fpk to GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.version.outputs.tag }}
target_commitish: ${{ github.sha }}
name: Octop (FnOS) v${{ needs.version.outputs.pkg_ver }}
body_path: /tmp/release-body.md
files: dist/*.fpk
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
fail_on_unmatched_files: true
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
59 changes: 42 additions & 17 deletions .github/workflows/octop-desktop.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
name: Octop Desktop Package

# 正式发版:Auto Tag 在打 v* 后与 Release / Docker Publish 一并 dispatch(GITHUB_TOKEN
# 打的 tag 不会触发 push workflow)。产物由本 workflow 的 release job upsert 到同一
# GitHub Release。workflow_dispatch 保留给手工补包 / 按平台重跑。
# 不要对任意分支 push 跑六平台矩阵。
# pull_request(desktop/**)打 darwin-* + windows-*,不跑 linux。
# 正式发版:Auto Tag 在打 v* 后与 Release / Docker Publish 一并 dispatch。
# 产物 upsert 到同一 GitHub Release。手工补包:workflow_dispatch + release_tag
# (不必跑在 v* ref 上)。attach_from_run 只挂已有 artifact、不重打。

on:
push:
Expand All @@ -22,12 +20,12 @@ on:
default: "all"
type: string
attach_release:
description: "If running on a v* tag, also upload zips to that GitHub Release"
description: "Upload artifacts to a GitHub Release (v* ref, or pass release_tag)"
required: false
default: true
type: boolean
release_tag:
description: "GitHub Release tag to attach to (e.g. v0.9.27). Defaults to the current v* tag ref."
description: "GitHub Release tag to attach to (e.g. v0.9.31). Used when not running on a v* ref."
required: false
default: ""
type: string
Expand All @@ -40,9 +38,15 @@ on:
permissions:
contents: read

# Builds on the same ref cancel each other (PR retrigger / accidental double
# dispatch). Attach-only runs use a different group so they cannot cancel an
# in-flight six-platform package on develop.
concurrency:
group: green-portable-${{ github.ref }}
cancel-in-progress: true
group: >-
green-portable-${{
github.event.inputs.attach_from_run != '' && 'attach' || 'build'
}}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name != 'workflow_dispatch' || github.event.inputs.attach_from_run == '' }}

env:
# Prefer GitHub upstream on Actions runners (npmmirror is for CN local builds).
Expand All @@ -67,7 +71,7 @@ jobs:
- name: Build frontend → src/octop/dashboard
run: make build-frontend

- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v7
with:
name: dashboard-dist
path: src/octop/dashboard/
Expand Down Expand Up @@ -139,7 +143,14 @@ jobs:
steps:
- uses: actions/checkout@v5

- uses: actions/download-artifact@v5
- name: Read package version
run: |
set -euo pipefail
VER=$(sed -nE 's/^version[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/p' pyproject.toml | head -1)
echo "OCTOP_VERSION=${VER}" >> "$GITHUB_ENV"
echo "version=${VER}"

- uses: actions/download-artifact@v8
with:
name: dashboard-dist
path: src/octop/dashboard
Expand Down Expand Up @@ -219,28 +230,39 @@ jobs:
- name: Install Wails v3 CLI
run: go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.13

- name: Install NSIS
if: runner.os == 'Windows'
shell: pwsh
run: |
choco install nsis --yes --no-progress
$nsis = "${env:ProgramFiles(x86)}\NSIS"
if (-not (Test-Path "$nsis\makensis.exe")) {
throw "makensis.exe missing after NSIS install"
}
Add-Content -Path $env:GITHUB_PATH -Value $nsis

- name: Package desktop app with bundled portable runtime
working-directory: desktop/src
run: >-
wails3 task package
ARCH=${{ matrix.arch }}
PORTABLE_ZIP=../portable/release/Octop-${{ matrix.plat }}.zip
VERSION=${{ env.OCTOP_VERSION }}
PORTABLE_ZIP=../portable/release/Octop-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip

# archive: false — upload the prebuilt zip as-is. Default archive=true would
# wrap it again, so Actions UI / "Download artifact" becomes zip-in-zip
# (Octop-<plat>.zip containing another Octop-<plat>.zip). Affects every plat.
# wrap it again, so Actions UI / "Download artifact" becomes zip-in-zip.
# With archive:false, artifact name is the filename (name: is ignored).
- uses: actions/upload-artifact@v7
with:
path: desktop/portable/release/Octop-${{ matrix.plat }}.zip
path: desktop/portable/release/Octop-portable-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.zip
archive: false
if-no-files-found: error
retention-days: 14

- name: Upload bundled desktop package
uses: actions/upload-artifact@v7
with:
path: desktop/src/bin/Octop-Desktop-${{ matrix.plat }}.*
path: desktop/src/bin/Octop-desktop-${{ matrix.plat }}-${{ env.OCTOP_VERSION }}.*
archive: false
if-no-files-found: error
retention-days: 14
Expand All @@ -256,6 +278,9 @@ jobs:
(
(github.event_name == 'workflow_dispatch' &&
github.event.inputs.attach_from_run != '') ||
(github.event_name == 'workflow_dispatch' &&
github.event.inputs.attach_release == 'true' &&
github.event.inputs.release_tag != '') ||
(startsWith(github.ref, 'refs/tags/v') &&
(github.event_name == 'push' ||
(github.event_name == 'workflow_dispatch' &&
Expand All @@ -281,7 +306,7 @@ jobs:
echo "tag=${tag}" >> "$GITHUB_OUTPUT"

# v8 required for archive:false artifacts. skip-decompress keeps the
# uploaded .zip / .tar / .dmg / .exe intact — default unzip turns portable
# uploaded .zip / .tar.gz / .dmg / .exe intact — default unzip turns portable
# zips into directories, so files: release-assets/* would skip them.
- uses: actions/download-artifact@v8
with:
Expand Down
14 changes: 8 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ jobs:
echo '```'
} > .release-notes.md
fi
if ! grep -q '^## Downloads' .release-notes.md; then
python3 scripts/release_download_links.py "$version" >> .release-notes.md
fi

- name: Create release
uses: softprops/action-gh-release@v2
Expand All @@ -134,29 +137,28 @@ jobs:
# started via GITHUB_TOKEN workflow_dispatch (Auto Tag). Explicitly cascade.
#
# This job intentionally has no checkout: pass --repo so `gh` does not need a
# local .git (bare runner → "fatal: not a git repository"). continue-on-error
# keeps a cascade miss from marking PyPI/GitHub release as failed.
# local .git (bare runner → "fatal: not a git repository"). Dispatch failure
# must fail this workflow so a missed sync is visible.
sync-develop:
name: Trigger sync main into develop
needs: github-release
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Dispatch Sync Main Into Develop
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh workflow run sync-main-to-develop.yml \
--repo "${{ github.repository }}" \
--ref main
--ref main \
-f version="${{ github.ref_name }}"

# FnOS FPK:复用本 Release 的 wheel + docker-publish 的 GHCR 镜像。
# 与 sync-develop 并行;失败不阻断发版
# 与 sync-develop 并行。Dispatch 失败必须让本 workflow 变红(PyPI 已发布仍如此)
trigger-fnos:
name: Trigger FnOS FPK build
needs: github-release
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Dispatch Build Octop FPK
env:
Expand Down
Loading
Loading