refactor: sync main runtime and CI changes to 1.0.0-explore - #2490
Merged
limityan merged 45 commits intoAug 25, 2026
Conversation
limityan
force-pushed
the
yanzhn/sync-main-to-1.0.0-explore
branch
from
August 25, 2026 11:54
9e58c18 to
ce5651c
Compare
limityan
force-pushed
the
yanzhn/sync-main-to-1.0.0-explore
branch
from
August 25, 2026 13:10
ce5651c to
0ec4aec
Compare
(cherry picked from commit 024b083)
An IDE session over the dsh bridge had no way to change models: the bridge published only the mode option, so a client's model dropdown had nothing to render and every session ran whatever `agent-default-model` resolved at creation time. ACP 0.25 carries no model state of its own, so the picker has to BE a session config option. The bridge now publishes a `model` select alongside the mode, built from `ctx.llm`'s catalog and grouped by provider — the pair is the identity, because the same model id can be served by two routes. A pick is validated through `resolveCallConfig` (which also materializes adapter defaults such as `reasoningEffort`) and applied to a per-session `ModelSelectionRef` installed via `installModelSelection` on both the create and the resume path, so it routes the next turn and nothing earlier. It is session-scoped on purpose: unlike the apiproxy host, an IDE session never writes back the dsh default. Unlike the mode the model is never locked — swapping which model answers the next step leaves every logged turn valid — and a reopened session comes back on the provider/model its own turns were logged under rather than on whatever the default has moved to since. The catalog is advisory, so the model in force is offered even when no adapter advertised it; a picker whose current value is missing from its options renders blank, which is the same broken dropdown as having none. When nothing can name a current model the picker is withheld instead of naming one the session does not run. Model switches share the preset switch queue (`presetSwitch` -> `configSwitch`) because every publication replaces the whole option set: an unordered reply would drop the other picker or carry a stale one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit 3016ec2)
Two provider ids serving the same models is a real deployment, not a mistake: a second route to the same vendor, mounted under its own id so it can carry its own key. The picker listed the catalog per provider, so a user with such a route saw every model twice — same name, same vendor, nothing to choose between, and only the value prefix telling the rows apart. Publish one row per model id. The provider carrying the session's current model owns the shared ids, so the list stays on the route that actually answers, and the checked row keeps its provider even when that provider's listing failed. A provider left with no models of its own drops out of the picker; one that has models nobody else serves keeps its group. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit 30b3f65)
An ACP agent publishes its modes as a `mode`-category config option, and they were rendered inside the model dropdown, under the model list and above the fast-mode switch. Two unrelated choices shared one button: the trigger named the model, so nothing on the composer said which mode was in force, and opening the model list to change the permission mode read as the wrong menu. Split the mode into its own trigger beside the model, built on the same dropdown, keyboard, and positioning code as the reasoning preset picker, so the composer now reads model, mode, reasoning. The trigger shows the mode name. Protocol behaviour is untouched: the same `session/set_config_option` call, the same lock semantics once a conversation has started, the same option ids and test hooks. An agent that publishes a mode and no models keeps a full picker — the mode trigger takes over the context-usage badge and the tooltip that the model trigger would have carried, so nothing is lost when the model button is not rendered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit adf1d3c)
(cherry picked from commit 5b66e36)
Use structured workspace identity before the legacy path registry fallback so a local session remains rollback-capable when an SSH workspace shares its absolute path. Add Desktop, Peer Host, contract, frontend, and isolated E2E regression coverage. (cherry picked from commit 3c3d4f8)
(cherry picked from commit 9549fc8)
(cherry picked from commit a96684f)
saveDefaultReviewTeamConfig already sends max_parallel_reviewers, max_retries_per_role, max_queue_wait_seconds, allow_provider_capacity_queue, allow_bounded_auto_retry, and auto_retry_elapsed_guard_seconds, but ReviewTeamConfig did not declare them, so the ConfigService round-trip silently dropped them and the persisted default (2) came back after restart. (cherry picked from commit 9839785)
(cherry picked from commit c8e466d)
(cherry picked from commit 6cbb62d)
(cherry picked from commit fa682ad)
(cherry picked from commit b5869b8)
…page A .bfminiapp package is inert without the desktop client, so a visitor who lands on a shared listing link had no way to act on it. The catalog hero and every listing now carry the same callout to https://openbitfun.com/download. (cherry picked from commit 43486ea)
The catalog masthead and every appearance page pointed at the GitHub releases list, which is not where a new user should land. Both now carry the same callout to https://openbitfun.com/download, and the detail page keeps the "Settings > Appearance" import hint as a plain line for people who already run BitFun. (cherry picked from commit 000f169)
(cherry picked from commit 672cab0)
(cherry picked from commit e0c0fda)
(cherry picked from commit 295c3f5)
(cherry picked from commit 53f2587)
…ar on restore P1: Session branching now copies evidence ledger events for inherited turns, rewriting session_id to the fork target. Previously the fork lost all inherited evidence (checkpoints, failed commands, partial subagent results). P2: Session restore now converges the evidence sidecar to surviving turns when there is no staged undo marker, preventing stale events from re-entering memory on the next evidence append. The append path also projects persisted events to the session's visible turns before publishing to memory. Added regression tests for both fixes. (cherry picked from commit 318e059)
Require one process-lifetime model configuration, keep its credentials runtime-only, and exercise the same SDK build through Node and Bun against the native Host. (cherry picked from commit a10728f)
(cherry picked from commit 07e6375)
(cherry picked from commit e0a9a1b)
Persist explicit SDK sessions across managed Host restarts and restore them through the existing Agent Runtime. Keep transient query behavior unchanged and preserve same-session writer exclusion. (cherry picked from commit 3cc50c1)
(cherry picked from commit bbe07ad)
GitCode returns pull request files as a single response truncated at 3,000 entries without pagination or a total header. Replace the per-page fetch for review targets, file diffs, and the detail Files section with one bounded request, slice pages client-side, and avoid claiming an exact total when the response is truncated. Also prefer old_path and new_file/deleted_file/renamed_file flags when mapping files, and accept a nested patch.diff payload. (cherry picked from commit 5101de3)
The review-target path replaced the provider change counts with sums over the first 1,000 mapped files, so a pull request with more changed files than that budget reported a file count equal to the budget and an omitted count of 1. Reuse the shared GitCode change-stats rule, which reads the whole files response, keeps the provider count when it is larger, and already refuses to claim truncated totals. Size the GitCode files request against the documented 3,000-entry single response instead of the pull request detail budget. The 4 MB detail limit turned file lists that previously loaded under the 16 MB default into a hard failure. Co-authored-by: Bob Lee <liwenbo628@gmail.com> (cherry picked from commit 7e1d0eb)
Drive WebView recovery restart cleanup on the Tauri async runtime. Mark shutdown clean and request restart only after cleanup completes. Reuse the unified desktop exit flow for recovery dialog exits.
limityan
force-pushed
the
yanzhn/sync-main-to-1.0.0-explore
branch
from
August 25, 2026 14:21
d505796 to
a31df55
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
将 main 截至
eadedaded的适用提交同步到1.0.0-explore。提交前已变基到最新1.0.0-explore@74af3ac62;main 在原同步点之后新增的两项 PR #2497 变更也已覆盖:配置兼容修复与本分支42d52026apatch-equivalent,macOS dispatch 修复由最新 Explore 基线74af3ac62直接提供。本次同步覆盖 Plugin Host、Runtime/产品能力边界、SDK 图片输入与 turn usage、App Server/SDK/CLI、GitCode Review 修复、Evidence Ledger、CI/发布、0.2.19 版本和 4+1 架构文档等变更。
冲突处理与规格选择
本轮复核修复
reason传给窗口状态保存,修复三平台E0061。settings/models.json和settings/application.json,重新生成三个 locale 输出。BitFun-Installer/src-tauri/Cargo.lock,增加精确 ignore 与 repo hygiene 防回归门禁;根 workspace lockfile 仍保持跟踪。AcpModeSelectorPortal 接入 Explore 的统一floating-surface样式契约,交互逻辑保持不变。验证
cargo check --locked -p bitfun-desktop --libpnpm --dir BitFun-Installer run sync:i18npnpm --dir BitFun-Installer run type-checkpnpm run check:webpnpm run check:github-configpnpm run check:repo-hygienepnpm run check:core-boundariespnpm run i18n:auditpnpm run theme:color-audit:allgit diff --checklimityan,无 Codex 作者三路独立只读复核均未发现 blocker。内容等价的上一版代码树已通过全部 13 项 PR CI;本次 rebase 与作者归属修正后的 exact-head CI 继续作为最终交付门禁,如有失败将继续定位并修复。
CI failure follow-up
0ec4aec60的 Frontend Build 在 Web overlay surface contract 失败:main 新增的AcpModeSelectorPortal 未消费 Explore 的统一浮层样式契约。floating-surface,并删除重复维护的背景、边框、圆角和阴影定义;定向 overlay contract35/35与四端 theme color audit 均通过。