Skip to content

sync: taiji 定制版同步最新基线 8d810b99e(LegionCard 样式统一 + 群聊 P0 修复) - #2262

Closed
1688mengdie wants to merge 4042 commits into
GCWing:mainfrom
BitFun-SIG:custom/taiji-unofficial
Closed

1688mengdie wants to merge 4042 commits into
GCWing:mainfrom
BitFun-SIG:custom/taiji-unofficial

Conversation

@1688mengdie

Copy link
Copy Markdown

同步内容

taiji 定制版(custom/taiji-unofficial)同步最新基线 \8d810b99e\(相对上次合并基线 aa98261 前进,含上游合流 9b05dd0)。

本 PR 新增关键提交

  • \8d810b99e\ feat(UI): unify LegionCard style with CoreAgentCard surface
  • \2ba9a7ecd\ fix(P0): group chat auto-creates Claw session for missing member
  • \5b9999431\ fix(CI): gate local_download_name_key test import to platforms that use it
  • 上游合流 9b05dd0(centralize default feature ownership)+ dmg branding + harmonyos fixes

验证

  • 前端 type-check:web → 0 error
  • 前端 vitest → 3381 tests 全绿
  • cargo check bitfun-core/cli/desktop(--jobs 4)→ 0 error
  • cargo test bitfun-core → 144 passed 0 failed

@GCWing

GCWing commented Aug 19, 2026

Copy link
Copy Markdown
Owner

代码量过于庞大,建议适当拆分

@1688mengdie

Copy link
Copy Markdown
Author

近期会彻底重构,需要一个基线做完整节点,然后分功能拆

t and others added 7 commits August 21, 2026 13:48
实证清单:
1. types.rs:595-597 添加 pub todos: Option<serde_json::Value>(serde default)
2. types.rs:1262 构造点修复(todos: None)
3. save_dialog_turn/load_session_turns 自动序列化/反序列化 todos
4. vitest 四场景全绿(182 tests passed,mock 对齐真实后端)
5. cargo check/clippy 通过(7 预存 warning,无新增)
6. fmt --check 本次改动合规

禁假实现/声称失实,逐行核实。
实证清单:
1. FlowChatStore.ts:9367-9383 getTodos 改为取 latest non-empty turn's todos
2. 禁 concat 所有 turn,确保删除后不残留、多轮替换取最新
3. vitest 新增 2 个 getTodos 聚合用例(删除不残留/多轮取最新)
4. 总计 184 tests passed(含既有 178)

Fix root cause 3: getTodos aggregates all turn todos → takes latest valid turn only
@1688mengdie
1688mengdie force-pushed the custom/taiji-unofficial branch from f9f70be to a7d3a18 Compare August 21, 2026 07:43
bobleer and others added 20 commits August 21, 2026 00:44
…y-config-persistence

fix(config): persist review team concurrency config fields
Run tasklist with /NH for each image separately instead of shelling through cmd.exe with /FI chains, which misdetected compiler activity on some Windows hosts.
…ding

Blur focused startup window controls before hiding the overlay, set inert during the exit animation so it cannot reclaim focus, and keep the splash screen exposed to assistive technology while it is visible.
Treat zero-sized WebView2 viewport geometry as a temporary suspension
instead of a real resize, preventing follow-output, virtualization, and
scroll handlers from rewriting the reader's position while the window is
minimized.

Restore the anchored reading position after valid geometry returns without
crediting host recovery movement as user scrolling. Add focused regression
coverage for invalid viewport rectangles, anchor recovery, measurement
compensation, and follow-output behavior.

Keep low-frequency minimize/restore diagnostics behind the existing
flow_chat_diagnostics switch.
The dropdown anchored on the selector container's left edge, so a wide model
list overflowed the window's right side. The popover helper gains an
alignment option; the model selector anchors on the trigger button and
aligns right edges, with the viewport clamp still guarding narrow windows.
Replace per-frame Turn pinning with a one-shot physical-bottom reveal.

- Cap the input footer and tail spacer at 75% of the viewport
- Let streamed output consume reserved blank at a fixed scroll offset
- Enter normal tail following when content reaches the viewport bottom
- Preserve deferred reveal, user takeover, and collapse behavior
- Update focused tests and viewport documentation
Keep auto-managed completed file cards on the compact preview from
the first completed render through collapse unmount.

This prevents transient expanded diff height from advancing the
tail-follow target and moving earlier chat content upward. Preserve
the full diff preview for manually expanded cards and cover both
completion and collapse transitions in tests.
Keep TodoWrite cards collapsed while tasks stream or change status.
Preserve expansion only after an explicit user toggle and cover the
behavior with focused interaction tests.
Keep the output frame and footer mounted across streaming and automatic
collapse transitions so the card height remains stable.

- Preserve parameter-receiving and no-output states
- Keep xterm rendering lazy while avoiding layout jumps
- Keep completed auto-collapse on the compact output preview
- Align the footer with the expanded card bottom edge
- Add focused regression coverage for lifecycle transitions
Display the first task in the collapsed TodoWrite header when every task is pending, while preserving the in-progress task priority. Add focused coverage for the all-pending state.
Treat streaming thinking and text rounds as provisional until they expose
a hard boundary. This keeps a later collapsible tool in the existing
explore group without collapsing and reopening the live tail.

Derive automatic collapse from the critical-boundary state instead of
persisting it as explicit user intent, so provisional rounds can safely
rejoin the group.

Add coverage for thinking-only, streaming narrative, and AgentWait
transitions.
- Collapse explore groups by default and preserve explicit user state
- Keep active rounds as standalone model-round items
- Merge collapsible rounds only after terminal status
- Update height estimation and grouping tests
Keep the resolved reasoning projection and its catalog binding together
with the model draft when applying reasoning preset changes.

Reuse the matching projection for summaries, subsequent edits, and save
validation so models.dev defaults are not rejected as unknown presets.

Extend the reasoning panel test to cover applying an updated models.dev
projection.
Keep inactive scene viewports mounted with stable geometry while hiding them
from interaction. Remember session-scoped history presentation, viewport intent,
and semantic scroll snapshots so scene and session switches can restore the
previous reading position instead of reopening at the tail.

Add focused viewport-boundary tests, diagnostics, and verification notes.
Preserve reading positions across session switches by preventing
provisional mount snapshots and automatic tail placement from taking
over while a saved viewport is being restored.

- Anchor snapshots to exact virtual-item identity with a Turn fallback
- Require restored geometry to remain stable across painted frames
- Publish the final snapshot only after restoration completes
- Add focused regression coverage and update viewport documentation
`fix(flowchat): stabilize ExecCommand card collapse layout` made the card
render `data-bf-state="active"` and `data-bf-state="completed"`, but the
owning Appearance descriptor never declared either state, so
`pnpm run appearance:contract-audit` rejected both reads at
`ExecProcessToolCardView.tsx:473`.

Declare the two states alongside the `cancelled`, `waiting` and `error`
entries they sit next to. Backported from the `cf35b901b` portion that
applies here; that commit's agent-registry and ChatInput expectations
track `1.0.0-explore`-only behaviour and stay out.

Co-Authored-By: Claude <noreply@anthropic.com>
三重断链根治 + CodeBuddy 思考档位支持:
1. 数据源:RemoteModelInfo 增加 supports_reasoning 字段,map_model_entries 保留
   CodeBuddy 的 supportsReasoning(全仓审计所有构造点补 None)
2. 前端:syncSelectedModelDrafts 按 supports_reasoning=true 为模型 draft 设置
   reasoning 默认 default_preset=on;offering 模型透传 supports_reasoning
3. 后端兜底+档位:adapter 识别 copilot.tencent.com,生成 on/off toggle +
   high/max effort 档位 preset;compile_chat_reasoning_action 对 CodeBuddy
   注入 enable_thinking + reasoning_effort(CodeBuddy 思考为档位可调)

验证:cargo check/clippy/fmt 全绿,ai-adapters 245 tests,前端 type-check +
3893 vitest 全绿
wsp1911 and others added 27 commits August 31, 2026 10:50
Previously, POSIX-prefixed Windows drive paths (e.g. /C:/foo/main.py) could resolve as
drive-relative paths and write files under the process working
directory. Missing-marker fallbacks also led agents to resend
payloads unnecessarily.

Update Write handling to:
- Normalize malformed Windows drive paths while preserving remote
  POSIX path semantics
- Report corrected paths and provide platform-specific examples
- Direct agents to move preserved fallback files instead of
  resubmitting content
- Cover path normalization and fallback guidance with focused tests
Expose stable MCP invocation parameters in a nested details section so
users can inspect requests without crowding the default card view.

- Keep parameter details collapsed by default and reset them when the
  parent card closes
- Allow failed and result-less calls to expose available input
- Auto-expand each MCP App once while preserving later user collapse
- Add focused coverage for input parsing and expansion behavior
Keep the WriteStdin card display limited to the provided chars when
append_enter is enabled, while preserving its execution semantics.

Add regression coverage for the displayed and copied input text.
- Detect CodeBuddy model by provider/base_url in save_new_model
- Call list_models() to fetch dynamic catalog when adding CodeBuddy
- Register all dynamic models to runtime_ai_models
- Fallback to single model if dynamic fetch fails
- After successful CodeBuddy PAT login, call list_models() to get dynamic catalog
- Register all dynamic models to runtime_ai_models
- Fallback gracefully if dynamic fetch fails or returns empty
Evidence: app.log:264 parse codebuddy /v3/config response -> empty model list.
Parsing contract is data.models.data (V3ConfigData/V3ModelsData) but the CLI
side uses data.data.models. Capture the live shape (truncated 800 chars, no
credentials) before changing the parser, per the 0830 no-sample-no-fix rule.

Not a fix: evidence-gathering only.
Root cause: app.log:264 'parse codebuddy /v3/config response' -> empty list.
The parser only accepted data.models.data, but the gateway also serves
data.data.models, so a valid authenticated response failed to deserialize and
fell through to an empty catalog.

- V3ConfigData accepts models.data and data.models; documented shape wins
- model_entries() resolves either shape, unauthenticated -> empty (no error)
- parse failures keep a truncated credential-free body sample for diagnosis
- tests: legacy shape, shape precedence, unauthenticated resolution

Verified: cargo check + 25 codebuddy unit tests pass (EXITCODE=0).
Evidence: app.log:298 real response is {data:{agents:[{models:[hy4-preview,...]}]}}.
The gateway serves model IDs as a string array, not CodeBuddyModelEntry objects.

- V3ConfigData accepts models.data (CodeBuddyModelEntry[]) and agents[].models (String[])
- model_entries() prefers documented shape, falls back to string ID conversion
- parse failures keep a truncated credential-free body sample for diagnosis
- tests: agents.models shape, shape precedence, unauthenticated resolution

Verified: cargo test → 5 parse_v3_config tests pass
… KB)

Knowledge base ground truth (CW3-SEC-0828/执行-CB-MODELS-FULL-0830.md:45):
CLI reads ed?.data?.data ?? {} -> ep.models (top-level array), so the live
/v3/config shape is data.data.models = String[].

- V3ConfigData accepts models.data (CodeBuddyModelEntry[]) and data.models (String[])
- model_entries() prefers documented shape, falls back to string ID conversion
- tests: live shape, precedence, unauthenticated resolution

Verified: cargo test -> 25 codebuddy tests pass (EXITCODE=0).
The gateway has changed the model-list shape over time: documented
data.models.data (object entries), data.data.models (string IDs), and
data.agents[].models (string IDs, observed live 2026-09-01). Fixed struct
deserialization kept failing whenever the shape drifted, silently emptying
the catalog.

Replace struct-based parsing with lenient serde_json::Value extraction that
accepts every known shape, deduplicates IDs, and prefers object entries for
fidelity. Unknown/absent shapes resolve to an empty list instead of an error.

Network-dependent tests (no_enterprise_id_dynamic_failure_returns_empty_list,
enterprise_id_missing_logs_warning) assumed the gateway is unreachable; on a
network-enabled machine the live gateway now responds with real models, so
they are marked #[ignore] with the parse-level empty-list path covered by
unit tests instead.

Tests: 25 pass / 0 fail / 2 ignored (network-dependent).
…cial

# Conflicts:
#	src/crates/execution/tool-contracts/src/lib.rs
…te path

CI repo-hygiene rejects machine-specific absolute paths
(C:/Users/...); the qoder-wasm-extract default bundle path was the only
violation. Resolve the global install via npm root -g (ComSpec on
Windows) with QODER_BUNDLE / --bundle overrides, and fail with a clear
message when the package is not installed.

Verified: node --check, real extraction run, check-repo-hygiene passed.
…-0187)

Cargo Deny advisories fail on lopdf 0.41.0 (stack overflow via deeply
nested PDF objects, fixed in 0.42.0). Mirrors upstream PR GCWing#2588:
cargo update -p pdf-inspector. Verified: cargo deny check advisories ok,
cargo check -p tool-runtime ok.
…ates

Upstream main moved session_control_tool behind tools-git and stopped
enabling local git from agent-runtime (core-boundaries CI contract).
Custom code kept unconditional references, breaking the agent-runtime build.

- agent-runtime: drop both local git feature hacks (services-core worktree
  is reachable via tools-git at product level, matching upstream)
- session_control_tool: gate git/worktree deps behind feature=git; keep
  session auth helpers (R-26 orphan/authorization gates) unconditional so
  security checks stay on in all builds
- session_message_tool / coordinator: gate worktree paths behind git;
  authorization calls remain unconditional
- materialization: SessionControl registration behind tools-git (upstream)
- coordinator: emit standalone pub use DialogTriggerSource (contract)

Verified: check-core-boundaries passed, cargo check agent-runtime and
agent-runtime+git+tools-git (0e0w), cargo test -p bitfun-core --lib 165 pass.
…form cfg contracts

Upstream PR2262 CI run 33515144543 failed 8 jobs; root causes fixed:

- Cargo Deny licenses: bitfun-agent-workflows missing license field (C-9)
- theme audit: GCWing#2534 in a comment was parsed as a 4-digit hex color
  (App UI scope baseline 0); reword the PR reference
- session_manager: idle_eviction test fn missing #[test] (dead_code under
  RUSTFLAGS=-D warnings in the bitfun-core lib test profile)
- desktop non-Windows builds: window_state_support chain and app_data_dir
  only referenced by cfg(windows) callers; gate them with
  cfg(any(target_os = "windows", test)) mirroring webview_recovery.rs
- agent_registry_contracts: specs[18] -> specs[19] after group/Legion
  insertion (CodeReview moved to index 19; ReviewFixer at 18 is hidden
  from agentic parents)
- exec_cli_contracts: retry-count assertions aligned with the upstream
  retry-category contract (403/TTFT terminal, transport drops retried):
  http_403 10->1, combined provider+patch 10->1, disconnect_then_403
  10->2, malformed_sse reworked into a disconnect-then-immediate mock
  (stream_json_transient_503_retries_then_completes -> renamed
  stream_json_reconnect_retries_then_completes) and expects 2 requests
- rustfmt: fix pre-existing merge-fallout formatting in coordinator.rs,
  group_room_tools.rs, session_message_tool.rs, tool-contracts lib.rs

Verified locally (RUSTFLAGS=-D warnings):
- cargo check -p bitfun-desktop --lib / -p bitfun-core: 0e0w
- cargo test -p bitfun-core --lib: 165 passed
- cargo test -p bitfun-desktop --lib: 294 passed
- cargo test -p bitfun-agent-runtime --test agent_definition_contracts: 93 passed
- cargo test -p bitfun-cli --test cli_command_contracts exec_cli_contracts: 16 passed
- cargo fmt --check: clean; theme:color-audit: no baseline failures; tsc --noEmit: 0 error
…, and ports

CI run 33594675251 (head a28b44e) failed 6 jobs; root causes fixed:

- Frontend lint (--max-warnings=0):
  - ToolsScene: route get_all_tools_info through api.invoke (ApiClient)
    instead of a dynamic @tauri-apps/api/core import
  - AssistantDefaultsPage: add userSelectableTools to the effect deps
  - NodePalette/WorkflowDiagram: split pure model exports (option
    enumeration, DAG layout) into NodePalette.model.ts /
    WorkflowDiagram.model.ts so component files only export components
    (react-refresh/only-export-components); tests import the model modules
- core lib (product-full): ProductFull assembly plan now carries the
  custom Legion/group agents in CODE_AGENT_IDS so the profile registry
  preserves the complete builtin catalog
- core lib (product-full): readonly tool manifest expectation includes
  TodoWrite (registered readonly by the product runtime)
- sdk-host tests: AgentSessionSummary initializer gains the new
  parent_session_id/status/display_state/is_daemon fields (E0063)
- cli dispatch: queued_job_spawn_claim recovery poll now retries briefly
  because BSD flock can release the descriptor lock asynchronously right
  after close (flaked on macos-15 between identical product code runs)

Verified locally (RUSTFLAGS=-D warnings):
- eslint . --max-warnings=0: clean; tsc --noEmit: 0 error
- vitest NodePalette/WorkflowDiagram: 12 passed
- cargo test -p bitfun-sdk-host -p bitfun-sdk-host-app: all ok
- cargo test -p bitfun-cli --bin bitfun: 685 passed
- cargo test -p bitfun-core -p bitfun-desktop --lib: 2703+294 passed;
  sole local failure (btw_session baseline probe) is confined to this
  machine's C:\ vs E:\C_Link path aliasing and passes on CI runners
- cargo fmt --check: clean
Preserve repository ownership failures as a stable error code across review platform commands and reuse the shared trust classifier.

Translate that code into localized, actionable copy in the review panel and route user-initiated retries through the existing trust recovery flow.

Add backend and frontend coverage for trust classification and localized error handling.
Translate dialog-turn start failures in the Review action bar while preserving specific backend reasons.

Allow multiline error details to wrap without truncation and cover formatting, localization, component wiring, and layout behavior.
Resolve explicit file and directory scopes against the active local or remote workspace before starting Review.

Return localized missing-target feedback and cover desktop path routing, target resolution, service handling, and API forwarding with regression tests.
Run web UI tests had never executed in prior PR runs (earlier steps failed
first); this run surfaced 11 latent failures in two files, plus one lint
directive misplacement. All predate this branch's fixes (verified against
the parent commit via worktree):

- AssistantDefaultsPage: keep the refill effect off the userSelectableTools
  dep (a dep entry refetches the catalog it just loaded and loops) and pin
  the intent with an eslint-disable directive on the deps line; move the
  tool-catalog stub from @tauri-apps/api/core (no longer reached — commands
  route through the ApiClient adapter) to api.invoke at the ApiClient
  boundary
- AgentsScene: the standalone create-legion entry button was folded into
  saved-preset cards (LegionCard onOpenDetails), leaving the entry-click
  prologue dead; render CreateLegionPage directly with AgentsScene's
  scene-root wrapper and keep guarding the page contracts (save enabled,
  radiogroup semantics, aria-live, DAG canvas, scene-root, back label)
- AgentsScene: legions gallery zone testid follows the production rename
  agents-legions-zone -> agents-workflow-zone

Verified locally: vitest run = 529 files / 3991 tests passed; eslint .
--max-warnings=0 clean; tsc --noEmit clean
The test hardcoded "expires_at": "2026-09-01T00:00:00+00:00" and asserted
the parsed expiry is still in the future (ms > now_ms()); the date went
stale on 2026-09-02, turning the assertion into a permanent failure on the
subscription-auth step (ubuntu Rust Build Check). Generate both response
expiries (30d / 60d ahead) from the current clock instead.

Verified: cargo test -p bitfun-ai-adapters --features subscription-auth
--lib subscription_auth = 102 passed / 0 failed (CI saw 101+1F); cargo fmt
--check clean
fix(review): localize repository and launch failures
Resolves the only conflict in ReviewPlatformPanel.tsx: upstream added
`userInitiated: true` to two loadSnapshot calls while the customization had
replaced the literal "Refresh" / "Retry" labels with i18n keys. Keeps both
sides — i18n keys (web-ui-source CJK budget is 0) plus the upstream
userInitiated flag (gitTrustService suppresses quiet-window prompts unless
the call is user initiated).

Verified locally: eslint --max-warnings=0 = 0, tsc --noEmit = 0,
i18n:audit (BITFUN_I18N_CONTRACT_TEST_PROFILE=ci) = 0 warning.
@GCWing

GCWing commented Sep 5, 2026

Copy link
Copy Markdown
Owner

Thank you for your contribution.

The main branch has been replaced with the 1.0.0 codebase from 1.0.0-explore. As part of this migration and Git history cleanup, the affected pull requests have been temporarily closed.

If your changes are still needed, please reapply them on a fresh branch based on the new main, then open a new PR against main or update and reopen this PR. Please link any replacement PR to this one so we can retain the discussion and review context.

We apologize for the disruption and appreciate your understanding.

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.