Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
fd5b056
feat(voice): add Tencent Cloud realtime (streaming) speech recognition
Yourdaylight Sep 22, 2026
02a6e28
Merge pull request #1079 from TencentCloud/chore/sync-develop-after-1…
github-actions[bot] Sep 23, 2026
dfd7fd0
fix(plugins): keep wiki_summary requests under *.wikipedia.org (#1027)
lihongyuan99 Sep 24, 2026
5bb827f
fix(auth): OCTOP_CAPTCHA_V3_MIN_SCORE 只接受 [0, 1] 内的有限值 (#1087) (#1088)
sxh313 Sep 24, 2026
de0f7a8
fix(workspace): PUT /file 与 POST /upload 补上 _builtin_skills 写保护 (#110…
sxh313 Sep 24, 2026
62218f6
fix(backup): 导入工作区 zip 时跳过 Octop 自有的 _builtin_skills 条目 (#1104) (#1105)
sxh313 Sep 24, 2026
309db11
fix(users): 角色与禁用状态改为读库,多 worker 下撤权不再滞后 (#1102) (#1103)
sxh313 Sep 24, 2026
0559b0c
fix(agents): HITL 会话跳过策略不再按进程缓存 (#1090)
sxh313 Sep 24, 2026
aeb486c
fix(security): keep IPv6 brackets and path params when rebuilding pin…
lihongyuan99 Sep 24, 2026
af2c742
fix(api): bound the thread-list limit before it reaches SQL LIMIT (#1…
sxh313 Sep 24, 2026
02b807f
fix(knowledge): keep the suffix that keys a renamed document (#1108)
sxh313 Sep 24, 2026
4e09aeb
fix(knowledge): map per-base document cap to KNOWLEDGE_DOC_LIMIT (#1013)
sxh313 Sep 24, 2026
689216e
feat: admin user batch policies, token UX, default FS root, and media…
jubaoliang Sep 24, 2026
44023b1
docs: point README at TencentCloud octop-harness repos
jubaoliang-tencent Sep 24, 2026
5e34c8a
fix: connectors empty layout and restore prior control-plane behaviors
jubaoliang-tencent Sep 24, 2026
2209cdc
chore(deps): switch runtime packages to octop-* 1.0.0 (#1136)
jubaoliang Sep 24, 2026
1d2b255
feat(chat): team artifacts, fan-in tool trail, and host wrap-up context
jubaoliang-tencent Sep 25, 2026
7617133
feat(connectors): 恢复企查查一键 OAuth,保留 internal HTTP 工具加载 (#1106)
duhu2000 Sep 25, 2026
347dee5
refactor(infra): group agents modules and clarify package ownership (…
jubaoliang Sep 25, 2026
bd73bb6
fix(plugins): offload oversized octop_ui payloads to ToolMessage.arti…
huangcheng Sep 25, 2026
4c3bf76
fix: team chat/IM UX, ACP sandbox, channel thinking, and related polish
jubaoliang-tencent Sep 25, 2026
1711bd2
docs(cn): sync README_CN CLI reference with memory commands
yc2bgr8 Sep 23, 2026
eb007ee
fix(api): bound the audit-log limit before it reaches SQL LIMIT
huiq777 Sep 24, 2026
f2d0bae
fix(config): bound OCTOP_PORT and --port to a bindable range (#1150)
Lesereingrape Sep 26, 2026
09d72e6
feat(dashboard): add remember-me checkbox on the login page
jubaoliang-tencent Sep 26, 2026
0322d09
fix(chat): default-collapse thinking in team rooms only (#1179)
jubaoliang Sep 26, 2026
0c57dbc
test(chat): cover member live bit across tool gaps after host unlock …
jubaoliang Sep 26, 2026
ac8c233
feat(users): add role templates, invite snapshots, and profile avatar…
jubaoliang Sep 26, 2026
8082add
fix(chat): show generic “calling tools” status instead of tool names …
jubaoliang Sep 26, 2026
95a669b
fix(dashboard): add lock icons to account change-password fields (#1184)
jubaoliang Sep 26, 2026
04ed764
docs(fnos): name the fpk packages the release actually ships (#1145)
lihongyuan99 Sep 26, 2026
6cf61fa
fix(db): apply schema v18 via idempotent helper for old restores (#1183)
jubaoliang Sep 26, 2026
9be32b0
feat(connectors): 企查查同时支持一键 OAuth 与 API Key (#1186)
jubaoliang Sep 26, 2026
9a13f53
fix(chat): dedupe duplicate team live-across-tool-gap test (#1187)
jubaoliang Sep 26, 2026
b03978d
chore: release 1.0.2b3
jubaoliang-tencent Sep 26, 2026
6e10ba1
fix: identify pypi.org by hostname and keep PKCE S256 out of tests
jubaoliang-tencent Sep 27, 2026
349aec6
fix: add trailing newline to PKCE test
jubaoliang-tencent Sep 27, 2026
a3851ea
fix: check workspace root isdir only after a host-prefix guard
jubaoliang-tencent Sep 27, 2026
739c03f
Merge pull request #1188 from TencentCloud/release/1.0.2b3
jubaoliang Sep 27, 2026
f441045
Merge pull request #1209 from TencentCloud/chore/sync-develop-after-1…
github-actions[bot] Sep 27, 2026
efa1cd1
docs: refresh README roadmap, anchors, and product sync (#1211)
jubaoliang Sep 27, 2026
c8217c1
docs: refresh README roadmap, anchors, and product sync (#1212)
jubaoliang Sep 27, 2026
ec70e5f
fix(dashboard): define missing --fn-bg-container theme variable (#1216)
dangzitou Sep 27, 2026
b920ed9
feat(dashboard): let each account customize the sidebar (#1218)
jubaoliang Sep 27, 2026
51c937f
style(dashboard): apply Prettier to files that drifted from the forma…
jubaoliang Sep 27, 2026
5b59b03
feat: store role-template id on users.role and harden mobile composer…
jubaoliang Sep 27, 2026
4667bd7
docs: use product names for sibling project links in the README (#1225)
jubaoliang Sep 27, 2026
9d9a36e
Merge branch 'develop' into feature/tencent-realtime-asr
jubaoliang Sep 27, 2026
232030f
chore: release 1.0.2b4 (#1226)
jubaoliang Sep 27, 2026
3608c78
docs(publish): bump version badges in all localized READMEs (#1229)
jubaoliang Sep 29, 2026
6f2bc50
fix: load plugins that still import harness_agent (#1260)
jubaoliang Sep 29, 2026
686dac7
fix(backup): skip the Octop-owned _builtin_skills prefix on zip impor…
dangzitou Sep 29, 2026
a0e876e
fix(dashboard): define the missing --fn-* design tokens (#1240)
dangzitou Sep 29, 2026
a8d42fd
feat(ollama): allow configuring local model download directory (#1279)
Master-Frank Sep 29, 2026
768e907
feat(skills): let octop-assistant answer product and help questions (…
jubaoliang Sep 29, 2026
6c38449
fix(ollama): list local models even when Octop service is off (#1316)
Master-Frank Sep 29, 2026
e6e6328
fix(mobile): stop the JPEG stream after a run of failed captures (#1309)
c020627 Sep 29, 2026
4400702
fix(cli): read and write cli_state.json through the shared JSON helpe…
c020627 Sep 29, 2026
4722ee2
fix(gateway): preserve IM attachment metadata in history (#1276)
locip123 Sep 29, 2026
15dca98
fix(docker): ship the langfuse env var the client actually reads (#1258)
lihongyuan99 Sep 29, 2026
c477263
fix(api): sandbox media preview responses (#1243)
dangzitou Sep 29, 2026
f5e46c9
feat: add Octop↔Octop cloud collab for remote experts (#1281)
jubaoliang Sep 29, 2026
e473dd3
chore: release 1.0.2b5 (#1321)
jubaoliang Sep 29, 2026
2635dd3
chore: sync main into develop after 1.0.2b5
jubaoliang-tencent Sep 29, 2026
91fae28
Merge pull request #1323 from TencentCloud/chore/sync-develop-after-1…
jubaoliang Sep 29, 2026
ded7add
fix: beta upgrade notes and fnpack download resilience (#1327)
jubaoliang Sep 29, 2026
0215b48
feat(experts): add default conversation mode (Ask/Plan/Craft) to expe…
dangzitou Sep 30, 2026
aef2191
feat(skills): per-package copy policy for skill packages (#770) (#1336)
vicfei Sep 30, 2026
0c8a6c3
fix(httpx): honor CIDR entries in NO_PROXY (#1354)
Master-Frank Sep 30, 2026
f5b6eb2
fix(qq-mail): 修复裸非 ASCII 邮件头导致 search_emails/read_email JSON 崩溃 (#1343)
miaowmint Sep 30, 2026
e8be657
fix(desktop): expand the optional wheel overrides under bash 3.2 (#1363)
lihongyuan99 Sep 30, 2026
1ba1155
fix(dashboard): gate SkillPackagesTab detail and copy requests (#1333)
c020627 Sep 30, 2026
98793fb
fix(wechat-ops): scope the publisher token cache to its AppID (#1332)
c020627 Sep 30, 2026
d43bad4
fix(history): bound trajectory events written to the v2 archive (#1331)
c020627 Sep 30, 2026
b693ddf
fix(connectors): retry a transient streamable-HTTP MCP probe once (#1…
c020627 Sep 30, 2026
4bb0414
fix(dashboard): do not cache the timezone fallback when the fetch fai…
c020627 Sep 30, 2026
9114ea7
fix(mobile): settle the install stream exactly once (#1325)
c020627 Sep 30, 2026
a02e3e1
fix(skills): fetch SkillHub rankings through the shared capped HTTP c…
c020627 Sep 30, 2026
b84c12d
feat(memory): configurable distillation call limits (budget, timeouts)
haiyu614 Sep 30, 2026
4aab10a
fix(dashboard): add the missing locale entries for t() keys (#1241)
dangzitou Oct 2, 2026
02241f0
fix(agents): propagate exhausted model retries as failures (#1012)
dangzitou Oct 2, 2026
fb35284
fix(dashboard): browse every drive in the storage-root picker on Wind…
zhilangtaosha Oct 2, 2026
83b2ae2
feat(auth): add LDAP directory login (#1123)
zsuroy Oct 2, 2026
34e6cb9
feat(dashboard): tuck composer extras into a plus-menu flyout (#1513)
jubaoliang Oct 3, 2026
28b64af
feat(fnos): harden App Center install and native startup (#1539)
jubaoliang Oct 3, 2026
f1c94b9
fix(dashboard): center the empty-chat model prompt (#1542)
jubaoliang Oct 3, 2026
82784d2
fix: give the model a concrete retry failure instead of a generic toa…
jubaoliang Oct 3, 2026
709f998
chore: keep infra off api and tidy post-b3 leftovers (#1550)
jubaoliang Oct 3, 2026
c928ddc
fix(fnos): stop native leftover on 8089 so App Center can start again…
jubaoliang Oct 4, 2026
b5a27ff
fix: adapt S3/Postgres backends and restore admin storage browse (#1565)
jubaoliang Oct 4, 2026
f2bc6be
fix(desktop): compare portable versions with parse_version rules (#1561)
MakerFlyFly Oct 4, 2026
2ad1579
feat(connectors): support Agent Mail auth, tools and new-mail tasks (…
dangzitou Oct 4, 2026
95860cc
feat(dashboard): show teams in the memory and channels agent picker (…
jubaoliang Oct 4, 2026
1076044
fix: keep hung remote backends from blocking boot (#1586)
jubaoliang Oct 4, 2026
e2de0de
feat(hitl): hide approval surfaces unless tools can actually pause (#…
jubaoliang Oct 4, 2026
e08730c
fix: restore ask_user_question cards after LangGraph v2 interrupt mov…
jubaoliang Oct 4, 2026
fb28894
fix: stop false stream errors, TLS internal MCP, and overlong tool na…
jubaoliang Oct 4, 2026
d1966d9
feat(connectors): add official Agent Mail logo (#1608)
jubaoliang Oct 4, 2026
7364e7a
fix(dashboard): let the PWA debug page scroll on mobile (#1603)
jubaoliang Oct 4, 2026
0568fdd
fix(hitl): honor allow-all session bypass for later tool approvals (#…
jubaoliang Oct 4, 2026
f873abc
chore: sync main into develop after 1.0.2b6 (#1637)
github-actions[bot] Oct 5, 2026
c869081
fix(ci): stop stripping Docker Hub name from publish outputs (#1642)
jubaoliang Oct 5, 2026
956e789
fix(update): install portable upgrades without re-resolving dependencies
lymerin Oct 3, 2026
75c274a
fix(dashboard): tunnel peer expert edits and refresh dashboard visual…
jubaoliang Oct 5, 2026
b768944
add bridge cli (#1658)
jubaoliang Oct 5, 2026
7dfbcb7
fix(dashboard): update Yuanbao channel logo (#1670) (#1678)
locip123 Oct 6, 2026
862f43d
feat(dashboard): show thread work status in the chat history rail (#1…
jubaoliang Oct 6, 2026
2571a04
feat(dashboard): show model name on assistant trajectory summaries (#…
jubaoliang Oct 6, 2026
8ac64be
fix(ci): produce advertised FnOS native ARM64 fpk (#1723)
jubaoliang Oct 6, 2026
6ad4bb0
feat(plugins): add arXiv paper search (#1718)
locip123 Oct 6, 2026
11f6d3f
fix(dashboard): raise composer picker panel height and inline knowled…
ChinaSiro Oct 6, 2026
b3b89c0
Merge branch 'develop' into codex/fix-portable-in-app-upgrade
lymerin Oct 7, 2026
ee60e28
feat(dashboard): Telegram allowed user IDs field
nattiini45 Oct 7, 2026
bfb4f21
docs: record audit remediation in CHANGELOG, fix stale schema claim
pt-act Oct 7, 2026
6dbe278
Merge remote-tracking branch 'upstream/develop' into feature/tencent-…
Yourdaylight Oct 8, 2026
d8d2621
Merge pull request #1576 from lymerin/codex/fix-portable-in-app-upgrade
liukewia Oct 8, 2026
6dfb076
fix(dashboard): localize remaining hardcoded Chinese UI strings (#1799)
fengyue-xve Oct 8, 2026
25233a4
fix(dashboard): follow app light/dark mode in Monaco editors (#1356)
dangzitou Oct 8, 2026
e9deb58
fix: harden Docker bootstrap, Bridge sessions, and desktop/provider U…
jubaoliang Oct 8, 2026
32bf23a
docs: add Octop Pet to Related projects in README (#1168)
jubaoliang Oct 9, 2026
cc52ef2
docs: update readme banner image (#1838)
lulinzhi37-alt Oct 9, 2026
dfa6c26
chore: require octop-gateway 1.0.1
Bosheng0422 Oct 9, 2026
f043a38
Merge pull request #1773 from nattiini45/feature/telegram-allowed-users
Bosheng0422 Oct 9, 2026
020f2ef
fix(chat): delete checkpoint data when a conversation or user is removed
Bosheng0422 Oct 9, 2026
2bc28ca
test(agents): exercise plan-path rewrite without Windows drive paths
Bosheng0422 Oct 9, 2026
9ba836e
delete conversation and expert data
Bosheng0422 Oct 9, 2026
d135549
Merge pull request #1844 from TencentCloud/chore/octop-gateway-1.0.1
Bosheng0422 Oct 10, 2026
38c79c8
update octop-harness 和 octop-memory
Bosheng0422 Oct 10, 2026
d3ef021
Merge branch 'develop' into fix/delete-persisted-conversation-data
Bosheng0422 Oct 10, 2026
5708981
Merge branch 'develop' into fix/1360-memory-extract-options
Bosheng0422 Oct 10, 2026
7f19f92
fix: preserve desktop listen config and accept folder drops in chat (…
jubaoliang Oct 10, 2026
d13614d
Merge pull request #1003 from Yourdaylight/feature/tencent-realtime-asr
seed30 Oct 10, 2026
69f2419
fix(chat): shrink the database after a conversation is deleted
Bosheng0422 Oct 10, 2026
d1eeaaa
test(agents): exercise plan-path rewrite without Windows drive paths
Bosheng0422 Oct 10, 2026
b5b3d49
merge develop into fix/delete-persisted-conversation-data
Bosheng0422 Oct 10, 2026
af688ec
test(docker): skip image boot checks when docker info hangs
Bosheng0422 Oct 10, 2026
148dddc
Merge pull request #1855 from TencentCloud/fix/delete-persisted-conve…
Bosheng0422 Oct 10, 2026
544ea75
Merge pull request #1382 from haiyu614/fix/1360-memory-extract-options
Bosheng0422 Oct 10, 2026
451a8f9
Merge pull request #2 from ra-co88/chore/audit-docs-and-changelog
ra-co88 Oct 10, 2026
d4a93cd
Merge upstream/develop into develop
pt-act Oct 10, 2026
50a743c
chore(make): parallelise the testmon gate used by the pre-commit hook
pt-act Oct 10, 2026
0910831
test(dashboard): guard AgentSelector against hook-order regression
pt-act Oct 10, 2026
eb1544c
docs(changelog): scope the audit entries to the work actually in the …
pt-act Oct 10, 2026
d0da6b9
Merge pull request #3 from ra-co88/chore/parallel-test-affected
ra-co88 Oct 10, 2026
7a55c00
Merge pull request #4 from ra-co88/test/agent-selector-hooks-guard
ra-co88 Oct 10, 2026
a352808
fix(dashboard): re-arm the 401 redirect latch and survive blocked web…
pt-act Oct 10, 2026
9195d6e
Merge pull request #5 from ra-co88/fix/auth-redirect-latch-and-storage
ra-co88 Oct 10, 2026
950f999
revert(dashboard): finish dropping the dropped half of the audit
pt-act Oct 10, 2026
0b658b7
Merge pull request #6 from ra-co88/fix/complete-frontend-drop
ra-co88 Oct 10, 2026
ee69172
chore(release): 1.0.2b7
pt-act Oct 10, 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
  •  
  •  
  •  
71 changes: 61 additions & 10 deletions .cursor/skills/publish/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ disable-model-invocation: true
| `CHANGELOG_FILE` | `CHANGELOG.md` | 相对于仓库根目录的路径,文件不存在则跳过 |
| `VERSION_FILE` | `pyproject.toml` | 包含版本号的文件 |
| `VERSION_PATTERN` | `^\s*version\s*=\s*"[^"]+"` | 匹配版本行的正则表达式 |
| `README_FILE` | `README.md` | 含 shields.io 版本徽标的文件(badge 版本号同步升级) |
| `README_GLOB` | `README*.md` | 含 shields.io 版本徽标的 README(含多语言变体,如 `README.md`、`README_CN.md`);全部同步升级 |
| `INIT_VERSION_FILE` | `src/octop/__init__.py` | 含运行时常量 `__version__` 的文件(缺失则跳过并提示) |
| `TAG_PREFIX` | `v` | Git tag 前缀;工作流监听 `v*`,生成 `v0.1.14` 风格标签 |
| `REMOTE` | `origin` | Git 远程仓库名 |
Expand Down Expand Up @@ -175,27 +175,76 @@ git checkout -B {RELEASE_BRANCH_PREFIX}{version} {REMOTE}/{INTEGRATION_BRANCH}

如果 `## [Unreleased]` 标题不存在,在 `# Changelog` 标题行之后插入新条目(若无标题则插入到文件顶部)。

**4b. 升级版本号(同步所有版本来源):**
**4b. 升级版本号(把旧号 X.Y.Z 全部换成当前号 A.B.C):**

发布版本号必须保持多文件一致。依次升级以下位置:
表示「当前发布版本」的钉死号必须一致,**不得只改 `pyproject.toml`**。
把旧版本 `X.Y.Z` 换成目标版本 `A.B.C`。缺文件则提示并继续(不中止)。

必改清单(按顺序,用 Edit 工具精确替换,勿用会误伤 CHANGELOG 历史条目的全局 replace):

1. `VERSION_FILE`(`pyproject.toml`)— wheel / PyPI 的唯一版本源:
```bash
grep -n '^\s*version\s*=\s*"[^"]+"' pyproject.toml
# 用 Edit 工具将该行的 "X.Y.Z" 替换为 "A.B.C"
# "X.Y.Z" → "A.B.C"
```
2. `README_FILE`(`README.md`)— shields.io 版本徽标:
2. 所有匹配 `README_GLOB` 且含 shields.io 版本徽标的 README(含多语言):
```bash
grep -n 'shields.io/badge/version-' README.md
# 用 Edit 工具将 `version-X.Y.Z-orange` 替换为 `version-A.B.C-orange`
grep -l 'shields.io/badge/version-' README.md README_*.md 2>/dev/null
grep -n 'shields.io/badge/version-' {file}
# `version-X.Y.Z-orange` → `version-A.B.C-orange`
```
文件不存在则跳过并提示(不中止)。
当前仓库至少包括 `README.md` 与 `README_CN.md`。全部未命中则提示并继续。
3. `INIT_VERSION_FILE`(`src/octop/__init__.py`)— 运行时常量 `__version__`:
```bash
grep -n '__version__' src/octop/__init__.py
# 用 Edit 工具将 `__version__ = "X.Y.Z"` 替换为 `"A.B.C"`
# `__version__ = "X.Y.Z"` → `"A.B.C"`
```
4. 飞牛 FnOS 两个 manifest 的 `version=`(`scripts/build-fpk.sh` 打包时会再注入,但仓库源文件必须先改):
```bash
grep -n '^version=' fnos/docker/manifest fnos/native/manifest
# `version=X.Y.Z` → `version=A.B.C`(两个文件都要改)
```
5. 飞牛 Docker compose 镜像标签(与本包版本相同,供 FPK 拉取 GHCR):
```bash
grep -n 'ghcr.io/tencentcloud/octop:' fnos/docker/app/docker/docker-compose.yaml
# `ghcr.io/tencentcloud/octop:X.Y.Z` → `:A.B.C`
# 不得改成 `:latest`(测试禁止 latest)
```
文件不存在则跳过并提示(不中止)。
6. `uv.lock` 里可编辑包 `octop` 的版本(漏改会导致 lock 与 pyproject 不一致):
```bash
grep -n -A2 'name = "octop"' uv.lock | head -5
# 将该包的 `version = "X.Y.Z"` 改为 `"A.B.C"`
# 或在改完 pyproject.toml 后执行 `uv lock`,只接受 octop 版本行变化
```

**扫尾(必做):** 全库搜索旧号,把漏网的「当前版本钉死」一并改掉:

```bash
git grep -n --fixed-strings "X.Y.Z"
```

对每一处命中:

| 类型 | 处理 |
|------|------|
| 当前版本钉死(compose / badge / manifest / lock / `__version__` / 文档里「当前版本」) | 换成 `A.B.C` |
| 测试里断言「等于当前发布号」的硬编码 | 改成读 `_pyproject_version()`(或同步为 `A.B.C`) |
| `CHANGELOG.md` 已发布章节(`## [X.Y.Z]` 及正文) | **保留**,不要改历史 |
| 测试夹具里拿旧号做比较(如 `1.0.2b4` vs `1.0.2b5`、解析示例) | **保留** |
| workflow / 注释里的示例旧号(如 `0.9.28`) | **保留**(不是当前钉死) |

提交前再扫必改清单,必须已经没有旧号:

```bash
git grep -n --fixed-strings "X.Y.Z" -- \
pyproject.toml src/octop/__init__.py \
README.md README_CN.md \
fnos/docker/manifest fnos/native/manifest \
fnos/docker/app/docker/docker-compose.yaml \
uv.lock
```

任一文件仍命中旧号:**补改后再提交**,不得带着半套版本号推 release。

**4c. 提交:**

Expand Down Expand Up @@ -317,4 +366,6 @@ git checkout {original_branch}
- 发版后删除 `release/*`;`main → develop` 由 `sync-main-to-develop.yml` 自动同步(失败时再手动补)
- 中止前展示完整错误输出
- 插入新版本条目后保持 `[Unreleased]` 为空
- 把旧版本号 `X.Y.Z` 换成 `A.B.C`:`pyproject.toml`、`__version__`、多语言 README 徽标、`fnos/*/manifest`、`fnos/docker/app/docker/docker-compose.yaml` 镜像标签、`uv.lock` 的 octop 包版本;提交前 `git grep` 必改清单确认无旧号
- 勿改 CHANGELOG 历史章节、测试夹具里的旧版本比较、workflow 示例号
- 推送 tag 后提示用户关注 GitHub Actions 的发布结果
13 changes: 10 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ OCTOP_BIND_HOST=0.0.0.0

# Docker first-run bootstrap (only used when ~/.octop/octop.db is absent)
# Password must be ≥8 chars with letters and digits (same policy as change-password).
# Future: first boot may randomize this and write it to credential.txt instead.
# Set a valid password to create the admin via `octop init`. Leave empty (or set a
# password the policy rejects) to start the web setup wizard instead; the wizard
# unlock password is written to ~/.octop/octop-login.txt.
OCTOP_ADMIN_USERNAME=admin
# First-run admin password; leave empty to auto-generate a random one (written to ~/.octop/credential.txt)
# First-run admin password; empty / rejected → setup wizard (not a silent random admin)
OCTOP_DEFAULT_PASSWORD=
OCTOP_ADMIN_DISPLAY_NAME=Admin

Expand All @@ -37,7 +39,12 @@ OPENAI_API_KEY=
DASHSCOPE_API_KEY=

# Langfuse observability (optional)
OCTOP_LANGFUSE_ENABLED=false
# Octop's on/off switch is the admin setting in Dashboard → Settings →
# Observability (stored as the settings key `observability_langfuse_enabled`);
# there is no OCTOP_LANGFUSE_ENABLED variable. LANGFUSE_TRACING_ENABLED=false
# is the SDK-level kill switch, honoured by the langfuse client along with the
# public / secret key and base URL below.
LANGFUSE_TRACING_ENABLED=true

# Optional login captcha (boot snapshot; restart after changing).
# Default slider is dashboard-only. Strong providers need both keys.
Expand Down
155 changes: 129 additions & 26 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,19 @@ name: Docker Publish
# 文档与对外引用统一使用:ghcr.io/tencentcloud/octop
# (Hub 仍用 DOCKERHUB_* secrets 同步推送。)
#
# 架构:ubuntu-latest 打 linux/amd64,ubuntu-24.04-arm 打 linux/arm64,
# 再合并为 :{version} / :latest 多架构清单。飞牛 Docker 版 FPK 共用一份,
# NAS 按本机架构拉取对应镜像层。
#
# 触发路径:
# 1. 人工推送 v* tag → on.push.tags
# 2. Auto Tag 用 GITHUB_TOKEN 推 tag 后显式 workflow_dispatch(token push 不会触发 push 工作流)
# 3. 在任意分支 Run workflow,填 tag=vX.Y.Z(用该分支的 workflow 文件,checkout 指定 tag)
#
# 注意:workflow_dispatch 下 metadata-action 的 type=semver 不可靠,
# 必须从 GITHUB_REF_NAME 显式解析版本号。
# 必须从 tag / 输入显式解析版本号。
# 不要把 DOCKERHUB_USERNAME 放进 job outputs:跨 job 传递会被抹成空,
# 导致只推 GHCR,合并清单时再对空 Hub 名失败。
#
# FnOS FPK 由 Release 成功后自动 dispatch,并等待本工作流推送的 :{version} 就绪。
#
Expand All @@ -21,43 +28,84 @@ on:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: "v* tag to publish (e.g. v1.0.2b6). Required when not running on a tag."
required: false
type: string

permissions:
contents: read
packages: write

jobs:
docker:
name: Build and push image
prepare:
name: Resolve version
runs-on: ubuntu-latest
# 拒绝在非 v* ref 上误跑(例如 UI 里对 main 点 Run workflow)
if: startsWith(github.ref, 'refs/tags/v')
# 拒绝在非 v* ref 上误跑(例如 UI 里对 main 点 Run workflow 且未填 tag)
if: >-
startsWith(github.ref, 'refs/tags/v')
|| (github.event_name == 'workflow_dispatch' && startsWith(inputs.tag, 'v'))
outputs:
version: ${{ steps.ver.outputs.version }}
tag: ${{ steps.ver.outputs.tag }}
ghcr: ${{ steps.image.outputs.ghcr }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Resolve version from tag ref
id: ver
env:
DISPATCH_TAG: ${{ inputs.tag }}
run: |
set -euo pipefail
ref="${GITHUB_REF_NAME}"
if [ -n "${DISPATCH_TAG:-}" ]; then
ref="$DISPATCH_TAG"
else
ref="${GITHUB_REF_NAME}"
fi
case "$ref" in
v*)
echo "version=${ref#v}" >> "$GITHUB_OUTPUT"
echo "tag=$ref" >> "$GITHUB_OUTPUT"
;;
*)
echo "::error::Expected refs/tags/v*, got ref_name=$ref"
echo "::error::Expected v* tag, got ref=$ref"
exit 1
;;
esac

- name: Image names
id: image
run: |
echo "ghcr=ghcr.io/$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"

build:
name: Build ${{ matrix.arch }}
needs: prepare
runs-on: ${{ matrix.runner }}
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USERNAME }}
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-latest
platform: linux/amd64
arch: amd64
- runner: ubuntu-24.04-arm
platform: linux/arm64
arch: arm64
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ needs.prepare.outputs.tag }}
fetch-depth: 0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
if: env.DOCKERHUB_USER != ''
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
Expand All @@ -70,32 +118,87 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Image names
id: image
run: |
echo "ghcr=ghcr.io/$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_OUTPUT"
echo "hub=${{ secrets.DOCKERHUB_USERNAME }}/octop" >> "$GITHUB_OUTPUT"

- name: Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ steps.image.outputs.hub }}
${{ steps.image.outputs.ghcr }}
# 显式 raw tag:兼容 push.tags 与 Auto Tag 的 workflow_dispatch
${{ env.DOCKERHUB_USER != '' && format('{0}/octop', env.DOCKERHUB_USER) || '' }}
${{ needs.prepare.outputs.ghcr }}
# 单架构中间 tag;:{version} / :latest 由 merge 合成多架构清单
tags: |
type=raw,value=${{ steps.ver.outputs.version }}
type=raw,value=latest
type=raw,value=${{ needs.prepare.outputs.version }}-${{ matrix.arch }}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./docker/Dockerfile
push: true
platforms: linux/amd64
platforms: ${{ matrix.platform }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
cache-from: type=gha,scope=docker-${{ matrix.arch }}
cache-to: type=gha,mode=max,scope=docker-${{ matrix.arch }}

merge:
name: Multi-arch manifest
needs: [prepare, build]
# ARM runner 偶发失败时仍发布已有架构,避免卡住 :{version} 与 Docker FPK。
if: always() && needs.prepare.result == 'success' && !cancelled()
runs-on: ubuntu-latest
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USERNAME }}
steps:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
if: env.DOCKERHUB_USER != ''
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Create and push multi-arch manifests
env:
VER: ${{ needs.prepare.outputs.version }}
GHCR: ${{ needs.prepare.outputs.ghcr }}
HUB: ${{ env.DOCKERHUB_USER != '' && format('{0}/octop', env.DOCKERHUB_USER) || '' }}
run: |
set -euo pipefail
any_multi=0
for REG in "$GHCR" "$HUB"; do
[ -n "$REG" ] || continue
sources=()
for arch in amd64 arm64; do
if docker buildx imagetools inspect "${REG}:${VER}-${arch}" >/dev/null 2>&1; then
sources+=("${REG}:${VER}-${arch}")
else
echo "::warning::missing ${REG}:${VER}-${arch}"
fi
done
if [ "${#sources[@]}" -eq 0 ]; then
echo "::error::No platform images published for ${REG}:${VER}"
exit 1
fi
if [ "${#sources[@]}" -ge 2 ]; then
any_multi=1
fi
docker buildx imagetools create \
-t "${REG}:${VER}" \
-t "${REG}:latest" \
"${sources[@]}"
echo "=== ${REG}:${VER} ==="
docker buildx imagetools inspect "${REG}:${VER}"
done
if [ "$any_multi" -eq 0 ]; then
echo "::warning:::${VER} is not multi-arch (ARM image missing). Docker FPK on ARM NAS will not run."
fi
Loading
Loading