Skip to content

refactor: sync main runtime and CI changes to 1.0.0-explore - #2490

Merged
limityan merged 45 commits into
GCWing:1.0.0-explorefrom
limityan:yanzhn/sync-main-to-1.0.0-explore
Aug 25, 2026
Merged

refactor: sync main runtime and CI changes to 1.0.0-explore#2490
limityan merged 45 commits into
GCWing:1.0.0-explorefrom
limityan:yanzhn/sync-main-to-1.0.0-explore

Conversation

@limityan

@limityan limityan commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

概要

将 main 截至 eadedaded 的适用提交同步到 1.0.0-explore。提交前已变基到最新 1.0.0-explore@74af3ac62;main 在原同步点之后新增的两项 PR #2497 变更也已覆盖:配置兼容修复与本分支 42d52026a patch-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 架构文档等变更。

冲突处理与规格选择

区域 处理结果 影响
Plugin Host 同步 main 的 Bun/Node Host、Rust adapter、IPC/HTTP bridge 和进程生命周期;保留 Explore 的 ManagedPluginSourceService、PluginActivationAuthority 与 ActivationGatedPluginRuntimeClient Host 代码完整同步。Desktop/CLI launch policy 仍为 Disabled,当前不会自动启动插件进程;后续启用需接入产品启动策略和现有 activation authority
Headless 能力 CLI/ACP/SDK 采用 main 的 CodeAgent-only product capability;Agent catalog 和工具集合沿用 Explore 不恢复 Explore 已拒绝的 debug/FileFinder;保留 minimal、Ultra、Swarm、Product Control、Agent 协作工具和当前 LSP retirement 规格
Harness SDK 保留 Explore 的 generic Harness registry、注入与查询 API;Headless 内建 provider 集为空 现有 SDK 兼容性保留,未把 catalog-only 能力描述为已交付的生产执行能力
SDK 版本 Runtime SDK 7 -> 8,Host protocol 4 -> 5 v8 对应图片输入与 turn usage;保留 Explore Harness API,因此不采用 main 删除 Harness 后的 v9 编号
前端冲突 以 Explore 为准,只同步 IME、Markdown 流式图片等关键交互修复 未覆盖 Explore 页面、Appearance、provider grouping、场景常驻和交互规格
Windows 外部编辑器 保留 Explore“仅非交互子进程隐藏控制台”的约束 交互式外部编辑器继续继承控制台,避免终端型或批处理 editor 的输入行为变化
CI 以 Explore predictive CI 为基线,叠加 Plugin Host resource build、stdin truth table 和同步新增 owner Installer 投影/Tauri 对齐继续只在 Nightly 验证;PR CI 不重复执行。Linux binaries 的 Node setup 已去重并加入唯一性门禁

本轮复核修复

  • Desktop 退出链继续把 Explore 的 reason 传给窗口状态保存,修复三平台 E0061
  • Installer model/theme i18n 投影适配 Explore 的 settings/models.jsonsettings/application.json,重新生成三个 locale 输出。
  • 删除误跟踪的 BitFun-Installer/src-tauri/Cargo.lock,增加精确 ignore 与 repo hygiene 防回归门禁;根 workspace lockfile 仍保持跟踪。
  • 删除 rebase 产生的 Linux binaries 重复 Node setup,并增加只能出现一次的工作流测试。
  • AcpModeSelector Portal 接入 Explore 的统一 floating-surface 样式契约,交互逻辑保持不变。
  • Extension Host 的 Bun 构建已保留在 PR/发布工作流;本机无 Bun,交由 exact-head CI 验证。

验证

检查 结果
cargo check --locked -p bitfun-desktop --lib 通过;仅 1 个既有 unused-variable warning
pnpm --dir BitFun-Installer run sync:i18n 通过,重复运行输出幂等
pnpm --dir BitFun-Installer run type-check 通过
pnpm run check:web 通过;19 个既有 Appearance warning,无新增失败
pnpm run check:github-config 通过,21/21
pnpm run check:repo-hygiene 通过
pnpm run check:core-boundaries 通过
pnpm run i18n:audit 通过,0 warning
pnpm run theme:color-audit:all 通过
git diff --check 通过
提交作者归属审计 通过;同步与冲突适配提交保留对应源作者,纯新增提交为 limityan,无 Codex 作者

三路独立只读复核均未发现 blocker。内容等价的上一版代码树已通过全部 13 项 PR CI;本次 rebase 与作者归属修正后的 exact-head CI 继续作为最终交付门禁,如有失败将继续定位并修复。

CI failure follow-up

  • 早期 head 0ec4aec60 的 Frontend Build 在 Web overlay surface contract 失败:main 新增的 AcpModeSelector Portal 未消费 Explore 的统一浮层样式契约。
  • 修复提交将该菜单接入 Explore floating-surface,并删除重复维护的背景、边框、圆角和阴影定义;定向 overlay contract 35/35 与四端 theme color audit 均通过。

@limityan
limityan force-pushed the yanzhn/sync-main-to-1.0.0-explore branch from 9e58c18 to ce5651c Compare August 25, 2026 11:54
@limityan limityan changed the title chore: sync compatible main changes to 1.0.0-explore refactor: sync main runtime and CI changes to 1.0.0-explore Aug 25, 2026
@limityan
limityan force-pushed the yanzhn/sync-main-to-1.0.0-explore branch from ce5651c to 0ec4aec Compare August 25, 2026 13:10
QZQ-go and others added 27 commits August 25, 2026 22:18
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)
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)
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)
…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)
pnpm hashes every patch named by the workspace lockfile, so a build context
without `patches/` fails `pnpm install --frozen-lockfile` before any web
source is copied. Same fix as 55a7dc0 did for the MiniApp image.

(cherry picked from commit f3fa4f9)
…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)
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)
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)
cursoragent and others added 18 commits August 25, 2026 22:18
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
limityan force-pushed the yanzhn/sync-main-to-1.0.0-explore branch from d505796 to a31df55 Compare August 25, 2026 14:21
@limityan
limityan merged commit ea6d1d2 into GCWing:1.0.0-explore Aug 25, 2026
12 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.

9 participants