Skip to content

Fix/docker apt cache - #2039

Closed
1961767103 wants to merge 42 commits into
TencentCloud:mainfrom
1961767103:fix/docker-apt-cache
Closed

1961767103 wants to merge 42 commits into
TencentCloud:mainfrom
1961767103:fix/docker-apt-cache

Conversation

@1961767103

Copy link
Copy Markdown

问题

fonts-noto-cjk 安装在 COPY src/ 之后的最终 RUN 层(原 docker/Dockerfile:128)。任何源码改动都会使该层缓存失效并重跑,而层内的 apt-get update && apt-get install fonts-noto-cjk 没有挂载 apt 缓存,导致每次改代码重建镜像都重新下载约 67MB(~10MB Debian 索引 + 56.7MB 字体包)。

变更内容

  • docker/Dockerfile:97:把 fonts-noto-cjk 移入第一个 apt 安装层(位于 COPY pyproject.toml 之前,不受源码改动影响,且挂载了 apt 缓存)
  • docker/Dockerfile:129:从最终 RUN 层删除 apt-get update && apt-get install -y --no-install-recommends fonts-noto-cjk
  • docker/Dockerfile:131:rm -rf /var/lib/apt/lists/* /tmp/* 简化为 rm -rf /tmp/*(apt lists 已在前置层清理)
  • CHANGELOG.md:[Unreleased] 段补充一条说明

验证(两次 docker compose build 对比)

改一行 src/ 代码后重建镜像:

指标 修复前 修复后
apt 下载项 6 项(索引 ~10MB + 字体 56.7MB) 0 项
最终 RUN 层耗时 17.45s(含等待 56.7MB 下载) 4.0s
dpkg -s fonts-noto-cjk install ok installed install ok installed(--auto-remove purge 未误删)

最终镜像内容不变,仅构建缓存行为改善。

seed30 and others added 30 commits October 12, 2026 20:44
Importing a SkillHub skillset failed the whole package when one skill zip returned 404. Missing skills are skipped, and the import still fails when every skill is missing.
Revoke sends api_key null, and the patch treated null as leave unchanged, so the provider stayed authorized. Explicit null now clears only that field.
A history response that lands after send used to replace the list, so the new message disappeared while the task still ran. Long threads also treated that append as a prepend and opened a blank gap.
The live connector probe treated a Tencent News billing error (4007, insufficient credits) as a product failure. Skip that upstream usage limit the same way network failures are skipped, and still fail on bad credentials.
…elop-after-1.0.2b7

chore: sync main into develop after 1.0.2b7
…-kb-chat-anydoc

feat(knowledge): support .wps/.doc via firecrawl-anydoc (TencentCloud#1345)
Keep the skill-package import fix in Unreleased and take the 1.0.2b7 notes from develop.
Keep the provider revoke fix in Unreleased and take the 1.0.2b7 notes from develop.
…evoke-api-key

fix(providers): clear the API key when authorization is revoked
Keep the in-flight chat turn fix in Unreleased and take the 1.0.2b7 notes from develop.
…inflight-turn

fix(chat): keep a turn sent while history is still loading
Keep the skill-package import fix in Unreleased alongside the chat and provider notes already on develop.
…kip-missing-package

fix(skills): skip a skillset skill whose package is not published
…dge-memory-guard

fix: bound local knowledge indexing memory and service restarts
TencentCloud#1986)

Distinct logins to the same account were collapsed onto one socket, and remote expert uploads never matched the tunnel allowlist. Inbound names stay local, and larger files split across frames once both sides negotiate it.
…ert defaults (TencentCloud#1989)

A knowledge base with max documents set to 0 was blocked as already full. The chat composer now shows the expert default model and refreshes when that model, knowledge bases, or connectors change.
Operators can limit which numeric user IDs may talk to a Telegram bot in private chats and groups. An empty list still allows anyone who finds the bot.
Telegram allowed user IDs only filter messages once this gateway release is installed.
v1.0.2b7 already advertised it, but the code was missing until this branch.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ncentCloud#1994)

Default installs all advertise http://127.0.0.1:8088, so the inbound
self-connect check closed legitimate /api/bridge/ws handshakes with 4004.
…am-allowed-user-ids

fix(channels): restore Telegram allowed user IDs
…Cloud#1997)

Uvicorn reports close-before-accept as an empty HTTP 403. Accept the
socket first, dial the peer directly, and refresh the token once.
…ud#1300) (TencentCloud#1988)

Let users redirect an in-flight agent turn without stopping it.

Backend (`src/octop/infra/gateway/steer/` + WS channel + chat WS router):
- Per-thread steer queue with server-authoritative admission: idle input
  starts a normal turn; busy input queues against the active turn with
  optimistic binding (`expected_turn_id`), depth/byte caps, idempotent
  retries, and structured reject reasons; HITL-paused turns reject new
  steers.
- The queue drains only at provider-safe boundaries: after a completed
  tool batch, the first model output preempts the stream (clean
  checkpoint tail) and the queued steers continue the same logical turn
  as a real persisted user message; a pure-text answer is never
  interrupted and drains at the natural turn end.
- Lifecycle events on the thread socket: turn.started/resumed/ended,
  steer.queued/drained/discarded/removed/rejected and queue snapshots on
  subscribe; Stop and failures discard undrained items; steers parked
  across an HITL approval pause drain after the approval resumes
  (bounded by a 30-minute park TTL).
- Peer bridge relays the new user_turn fields so cross-instance turns
  keep steer semantics.

Dashboard:
- While a turn streams, Enter parks the draft as a numbered chip above
  the composer; the ↵ button on the chip commits it (immediate user row
  in the transcript, settled by server frames), ✎ reclaims the full text
  into the composer, ✕ removes it.
- The chip panel holds only uncommitted drafts; committed steers are
  represented by their transcript row and settle to the canonical
  server bubble at drain.
- Intermediate harness completion frames no longer close the live
  socket or clear the active turn while a steer turn is in flight.

Docs: `docs/api.md` gains a Mid-turn steering section (frames, delivery
fields, drain-boundary rules); CHANGELOG entry under Unreleased.

Tests: unit coverage for admission/drain/discard/park semantics and the
WS channel boundary behavior; integration coverage for rebind and
multi-subscriber streaming with the new protocol frames.

Co-authored-by: jubaoliang <jubaoliang@gmail.com>
Put the Tencent Cloud one-click deploy options ahead of the existing Zenith Hosting button.

Co-authored-by: Cursor <cursoragent@cursor.com>
…encentCloud#1991)

Every download in the dashboard fetches the file with the JWT, wraps it
in a `blob:` URL and clicks an `<a download>`. WeChat and similar chat-app
WebViews (WeCom, QQ, DingTalk, Feishu, Weibo, Alipay) refuse to save
`blob:` downloads and only say "可在浏览器打开此网页来下载文件", while the
system browser they point to has no Octop session for the API URL.

In those WebViews `saveBlobAsFile` now hands the bytes it already
fetched to `POST /api/downloads/link`, which keeps them in a temp file
behind a random token for 10 minutes, and shows the link with a copy
button. `GET /api/downloads/link/{token}` serves the file as an
attachment without login; the token is the only credential. Uploads are
capped at `max_upload_mb`, links of disabled users stop working, and
expired files are removed on the next create/get. Normal browsers and
the desktop shell are unchanged.
alison-xx and others added 12 commits October 14, 2026 14:22
…er (TencentCloud#1285)

Chinese / Japanese input methods confirm a candidate with Enter. On macOS
that keydown still arrives as `key === "Enter"` (Safari even clears
`isComposing` first but keeps keyCode 229), and Ant Design's
`onPressEnter` (rc-input 1.8) fires on it without a composition check.
The main composer already guards this, but other Enter-to-submit inputs
did not:

- "edit and resend" on a user message resent half-typed pinyin, which
  truncates the conversation at that message and re-runs it
- conversation rename (title bar, session list, minimal nav) saved
  pinyin as the title
- workspace new file/folder and rename, root directory rename,
  knowledge-base folder create/rename and Markdown find

Escape pressed to dismiss the candidate window also cancelled the edit.

Add `isImeComposing()` (same check the composer uses:
`nativeEvent.isComposing || keyCode === 229`) and skip Enter / Escape
handling while composing.

Co-authored-by: Alison <20137720+alison-xx@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ck to (TencentCloud#2025)

`octop models active` prints " / " when no global default model is set:
the provider/model separator with nothing on either side and no hint.
`octop agent list` leaves the model cell empty for every agent without
its own model, which reads as "this agent has no model" and hides that
an agent with its own model overrides the global default.

When no default is set, `models active` now says so and shows the
command that sets one. `agent list` fills empty model cells with
"(global: provider/model)", or "(not set)" when there is no global
default either; agents with their own model are unchanged. Both strings
come from the zh/en bundles. JSON output (`--json`) is unchanged.

Refs TencentCloud#1930, TencentCloud#1931
TencentCloud#2024)

Connection actions no longer replace the whole list, and inbound and outbound cards share the same peer-account label.
- Updated README files to include instructions for using a domestic mirror when the official GHCR is unreachable.
- Introduced a new `docker-compose.cn.yml` file for pulling images from the Nanjing University GHCR source without local builds.
- Enhanced documentation to clarify the usage of the new Docker configuration for users in China.
…ntCloud#2037)

Parked steers survive a follow-up approval, session bypass only auto-approves tools that allow it, and a withdrawn steer returns to the composer after the server confirms it is still queued. Stream errors stay in their own bubbles and follow the selected theme color.
)

* 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>
@1961767103 1961767103 closed this Oct 14, 2026
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.

8 participants