Skip to content

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

Open
1688mengdie wants to merge 425 commits into
GCWing:mainfrom
1688mengdie:custom/taiji-unofficial
Open

sync: taiji 定制版同步最新基线 8d810b99e(LegionCard 样式统一 + 群聊 P0 修复)#2262
1688mengdie wants to merge 425 commits into
GCWing:mainfrom
1688mengdie: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

t added 30 commits August 14, 2026 15:58
工具轮黑洞防御链(P0 积分止损):
- R-MR-01:DEFAULT_MAX_ROUNDS 200→50(types.rs:2203 + 定标注释)
- R-MR-02/05b:连续工具轮预算 20 + 搜索专用 3(round_executor + execution_engine)
- R-MR-07:ai.thresholds.execution.* 配置域(max_rounds=50/consecutive_tool_rounds=20/consecutive_search_rounds=3/duplicate_tool_calls=5/no_progress_results=5/tool_calls_per_turn=30/empty_input_guard=true)+ 前端 ThresholdsConfig execution 区 + i18n 三语
- R-MR-10:消息重复闸门(messages_sequence_fingerprint + is_duplicate_message_fingerprint 窗口3 + 主循环闸门 duplicate_messages break 0请求 + 本地合成 final response + duplicate_message_enabled/window 配置)
- R-MR-11:读取/搜索重复拦截(REPEATED_READ_TOOL_NAMES 6 工具 + 指纹归一化 + RepeatedReadSessionState 连续计数 + 本地拦截零请求 + 交叉引用重置 + 碎片化/小文件<200行提示 + repeated_read_enabled/limit/small_file_line_threshold 配置)
- R-MR-12:单子代理续接熔断(频率门限 60/h + 24h turn 300 + 24h token 3000万 + ai.thresholds.subagent.* 5键 + session_end_cleanup 清 ledger + 熔断明确错误提示)
- R-MR-15:压缩阈值调低(ai.thresholds.compression.* + compression_trigger_budget output_reserve+ratio,60万前触发)

测试:execution 133/0 + duplicate_message 8/8 + repeated_read 6/6 + tool_pipeline 55/55 + config 45/45 + coordinator 熔断 8/8 + subagent 13 零回归。check 0e0w。
空请求积分黑洞修复:
- R-FE-01:feishu 入口空文本拦截(双守卫 + 6 测试)——空 content 不发请求不计费
- R-FE-02:共享层治本(command_router parse_command 空输入 → BotCommand::Empty + dispatch 兜底 + handle_chat/execute_forwarded_turn 空 content 不构造/不提交)+ weixin/telegram 入口双保险守卫

remote_connect::bot 43 测试全绿,check 0e0w。
…(CI 修复)

CI Frontend Build eslint 步骤失败:GroupChatView.tsx :568/:579 使用 GroupMemberPickerDialog/GroupForkDialog 但定义在 :607+ 之后,@typescript-eslint/no-use-before-define(variables:true)命中 ×2。
最小改动:两组件 const React.FC → function 声明(配置 functions:false 豁免),内部逻辑零改动。
验证:全量 eslint --max-warnings=0 0e0w + tsc 0e + 群聊 vitest 13/13 + cargo check 0e0w。
主人 dev 实测反馈修复:
- R-GC-17 建群 workspace 双端兜底:后端 resolve_create_workspace 三优先级(入参→context.workspace_root→default_assistant_workspace_dir)+ 前端 workspace: workspacePath||undefined + MainNav fallback workspace + 对话框去条件渲染
- R-GC-18 建群后 UI 空白:GroupChatView.scss 编译产物误提交(扁平 CSS + 死 sourceMappingURL)→ 重写真 SCSS 源码(全布局类)
- R-GC-19 Claw 成员识别失败(回归):成员源按当前项目 workspace 过滤但 Claw 在 assistant workspace → 复用旧版 W2 union(real Claw ∪ assistant presets inactive 标记)+ useRef 防死循环 + MainNav 传 assistantWorkspacesList + 3 locale inactiveBadge
- R-GC-20 UI 定标:邀请/裂变改 IconButton(component-library 现成)+ UserPlus/GitBranch(lucide)右上图标,复用零手搓

验证:tsc 0e + vitest 15/15(CreateGroupChatDialog 6 + GroupChatView 9)+ group_room 20/20 + check 0e0w + i18n/appearance/theme 三连绿
主人 dev 实测 vite 报「Can't find stylesheet to import」:GroupChatView.scss:12 @use '../../../../component-library/styles/tokens.scss'(4 级)→ 实际 tokens 在 src/web-ui/src/component-library/styles/tokens,同目录兄弟文件(AgentsScene.scss:1)为 3 级无后缀。
修正为 @use '../../../component-library/styles/tokens'(3 级 + 去 .scss,与兄弟文件对齐)。
验证:vite dev 实测编译过(无 SCSS 错误)+ sass 编译过 + tsc 0e + vitest 15/15。
沉淀:SCSS @use 路径改动必须 dev 实测(vitest 走别名/transform 掩盖真实路径错误,同款坑第二次)。
主人 dev 实测反馈修复 + 根因级:
- R-GC-22 邀请菜单用 component-library Select(multiple+searchable+showSelectAll),自造 Checkbox 列表删除
- R-GC-23 空 content 气泡前端防御(modernFlowChatStore 构造层过滤)+ turnCompletionNotice NORMAL_FINISH_REASONS 加 'completed'
- R-GC-24 布局回归:自建 header/members 栏全删,顶部=FlowChatHeader 内建(headerLeftActionsContent 现成左动作槽位)+ 底部=原 ChatInput,逐区复用零手搓
- R-GC-25 群主对话模型(根因级):建群=创建群主会话+欢迎 turn(finish_reason=complete)+ send 统一 write_group_turn_with_metadata(与普通会话同口径)→ 空字符串/异常结束提示消失;群主 agent_type=AgentRegistry::default_agent_type(零硬编码配置驱动)

验证:group_room 24 passed + 前端 vitest 451/451 + tsc 0e + check 0e0w + 三连合约 0
…pstream rollback semantics (run 31793668009/31794281916)

Upstream f4c3abc (fix(flow-chat)!: make session rollback transactional,
U-12) removed the snapshot.rs production caller, leaving
drain_session_turns / session_tree_keys /
remove_completed_background_sources_for_session referenced only by tests.
Per upstream BREAKING semantics the session-level turn cleanup moved into
the Agent Runtime rollback path, so these PeerTurnTracker helpers and the
four tests that exclusively exercised drain_session_turns are removed.
No allow(dead_code); cargo check --workspace -D warnings and
cargo test -p bitfun-cli verified green.
主人 UI 定标:单独群聊栏没必要(创建对话本来就跑到对应工作区)。
- 删 NavPanel 独立群聊区块(MainNav -125 行,loadGroupChats/群聊列表全删)
- 群聊入口并入 AssistantSessionCreateMenu 创建菜单(onCreateGroupChat prop + Users 图标 + 「创建群聊」选项,复用现成菜单项)
- 点击 → 打开现有 CreateGroupChatDialog
- 建群后在会话列表正常显示(对应工作区)

验证:tsc 0e + AssistantSessionCreateMenu 5/5 全绿
- dispatch.rs 新增:Narrow detached-dispatch capability for Server Host(平台中立 controller 复用 Desktop,SSH profiles + observer-only outbound index,单测钉契约;browser-direct ACP-over-WS 下暂时 dead 代码,为后续 app-server schema 批次保留能力管线)
- main.rs:DispatchHostState + AppState.dispatch_host 接线
- provision.rs / embedded_relay_host.rs:warning 清理(unused import / unused_assignments)

验证:cargo check -p bitfun-server 0e0w
…ixes

- send_group_message routes into the group-owner session real dialog turn
  (coordinator.start_dialog_turn) so the group master actually responds;
  history returns only user messages (MessageRole::User)
- create_group workspace = Claw default assistant workspace
  (resolve_create_workspace drops context.workspace_root; MainNav passes
  defaultAssistantWorkspace, never the current project workspace)
- GroupChatView drops local optimistic injection (backend turn events drive UI)
- provision.rs: restore use super::ensure_private_request_file (9e6880e
  warning cleanup removed it, CLI tests failed)
- group_room integration test: fallback-create segment -> lightweight
  resolve_create_workspace(None) assertion (CI ubuntu env-sensitive)
- remove stray CreateGroupChatDialog.scss.map
…unique UUID + Claw type/name), never reuse existing ids

- add create_member_session: fresh unique-UUID member session with default agent
  type (config-driven) + registry agent name (Claw name) + group workspace;
  eliminates 'Session ID already exists' (old invite reused caller-provided
  existing session id -> create_session_with_workspace collided,
  session_manager.rs:513)
- invite_member / create_group members / fork_group members all route through
  create_member_session (zero reuse of caller ids)
- add default_group_agent_name: AgentRegistry::get_agent(default).name() (no
  hardcoded 'Claw'/'Group member' strings)
- frontend: member pickers (create/invite/fork) switch from listing existing
  Claw sessions to a member-count input; send N placeholder ids, backend
  creates N fresh UUID sessions (list_sessions no longer a member source)
- remove stale inactiveBadge appearance part; add memberCount/inviteCount/
  forkMemberCount locale keys (zh-CN/en-US/zh-TW)
- tests: 2 new backend tests (registry-driven name), roundtrip adapted to
  fresh-UUID members, frontend count-driven invite/fork tests
- 7 份已跟踪 pr-docs 报告 + F6 报告 + R-GC09 报告 + 4 份 sync-record:E:/finance-trading、E:/taiji-lvpa 等内部路径
  脱敏为 <TAIJI_DEV_ROOT>/<PRIVATE_PATH> 占位(S-56)
- .git/config 复核无敏感(remote=公开 GitHub URL,user=t/t@t),记录不改
- 9527 RPC 交由 R-DC-01 解耦移除(本 commit 不涉量化代码)
- 量化接入报告(报告-W1-4-strategen)含内部路径,归 R-DC-01 移档,不在本 commit
- cargo check -p bitfun-core --features product-full 0e0w
…A 代码暂不合并,核心内容撤出,开发版只留 bitfun 原生改造)

解耦范围(6 项全做):
1. quant 工具族:quant_tools.rs(2975 行)移除 + implementations/mod.rs 注销
2. gbrain 工具:gbrain_tool.rs 移除 + 注销
3. ACP taiji-quant 客户端:builtin_clients.rs taiji-quant preset 移除 + acp_cli.rs TaijiQuant 枚举注销(保留通用 ACP 框架)
4. 注册/白名单接线:materialization.rs 14 工具 + registry.rs manifest/deferred/readonly + restrictions.rs 白名单 + tool-provider-groups quant/gbrain 映射全清
5. 量化文档:docs/pr-docs 11 份(rad06/W1-*/W2-*)移档
6. 常量配置:DEFAULT_TAIJI_RPC_ADDR(127.0.0.1:9527)/TAIJI_QUANT_RPC_URL/TAIJI_QUANT_CLIENT_ID 随文件移除(9527 不再鉴权绑定)

核心资产禁删:量化代码已存档 decouple/quant-archive 分支(完整历史)+ taiji-private/lvpa(插件包形态)+ 知识库归档区(三保险可恢复)

保留:bitfun 原生改造全部保留(群聊/防御链等)

验证:cargo check -p bitfun-core --features product-full 0e0w;bitfun-core 2467 测试全绿(含群聊 25/防御链);tool-provider-groups 11 测试全绿
…ult_group_agent_type 改引 coordinator::ASSISTANT_BOOTSTRAP_AGENT_TYPE(pub const, 单一权威源零硬编码),修复主人实测成员类型显示「智能体」问题
R-GC-29 建群提示重复(主人实测):
- 根因:建群提示有两条 — ① 前端 toast
  CreateGroupChatDialog.tsx:84 notificationService.success('群聊「{{name}}」已创建')
  ② 后端欢迎 turn group_room_tools.rs:375
  write_group_turn("群聊「X」已创建。我是群主,成员消息将汇聚于此。"),该 turn 作为
  群聊首条消息被 GroupChatView loadHistory 读回渲染(GroupChatView.tsx:197-199
  + groupMessageToDialogTurn user_dialog 气泡)。两者文本高度相似 = 观感重复两次。
- 修复:后端欢迎 turn 文案精简为「群聊「{name}」已创建。」,删除「我是群主,
  成员消息将汇聚于此。」冗余描述;宿主 turn 本体保留(R-GC-25 结构依赖)。
- 单测 welcome 断言从 contains("已创建") 改为精确等于新文案,锁定防回归。

R-GC-30 建群成员 = 可选 Claw 多选(主人纠正方向,R-GC-28 数量选择是误加):
- CreateGroupChatDialog:删成员数量输入(R-GC-28 误加,b38d9bf2c 引入),
  改回 R-GC-19(ac0987172)的 Checkbox 多选形态 — 群聊名称 + Claw 成员多选
  + 创建。成员源 = 运行时获取:sessionAPI.listSessions 过滤 agentType==='Claw'
  ∪ assistantWorkspaces 预设(无真实会话标 inactive)。零硬编码成员列表。
- MainNav.tsx:传 assistantWorkspacesList 给对话框(R-GC-19 现成数据源)。
- GroupChatView 邀请/裂变:删数量输入,改回 R-GC-22(50fea6a29)的
  component-library Select multiple + searchable + showSelectAll 形态,成员源 =
  运行时 listSessions 过滤 Claw(群 workspace = Claw 默认 assistant workspace,
  R-GC-26,天然是完整 Claw 候选列表)。
- 后端语义不变:成员 id = 选择来源占位,create/invite/fork 仍新建唯一 UUID
  Claw 成员会话(create_member_session,R-GC-28b)。
- locale:删废弃 memberCount/inviteCount/forkMemberCount key(3 语言)。
- 测试:CreateGroupChatDialog 5/5(含多选 + preset inactive 用例)、
  GroupChatView 9/9(invite/fork 改 Select 多选断言)、NavPanel+session 81/81;
  group_room_tools 23/23;cargo check -p bitfun-core --features product-full 0e0w;
  tsc --noEmit 0e。
R-GC-31 (P0 建群提示重复): 删前端建群成功 toast(CreateGroupChatDialog),
建群提示单条 = 后端 welcome turn 气泡(group_room_tools.rs:382 保留,R-GC-25
结构依赖)。R-GC-29 只精简后端文案未实测 = 真 double,教训:验收必须实测验证。

R-GC-32 (P0 邀请成员源不一致): GroupMemberPickerDialog/GroupForkDialog 成员源
与建群统一(复用 R-GC-19 union 方案 + assistantWorkspaces 传入链
SessionScene → GroupChatView)。

R-GC-33 (P0 成员数据源根因): 删 presets 伪造 SessionMetadata(R-GC-19 inactive
假条目:sessionId=workspace.id + 硬编码 agentType 'Claw' + 假值)——三处成员源
(建群/邀请/裂变)统一遍历全部 assistant workspace rootPath 调
sessionAPI.listSessions 读真实持久化会话(含未打开),agentType 从真实会话
元数据读取,零硬编码;后端复用现成 list_persisted_sessions + discover_assistant_workspaces,
零新存储。locale 删废弃 created/inactiveBadge key。

验证: cargo check 0e0w / group_room_tools 23/23 / tsc 0e / vitest 3452 全绿(含
R-GC-31/32/33 新增断言)。GUI 实测由主人 release 版执行。
…elf{} sites

Upstream 2abb21c added the active_turn_permission_modes field. The merge
left two Self{} constructors missing the field (spawn_cleanup_task and the
cfg(test) clone_for_tombstone_test), so the merged HEAD failed to compile
(E0063). Add the missing field to both constructors.
# Conflicts:
#	scripts/core-boundaries/self-test.mjs
#	src/crates/assembly/core/src/agentic/coordination/coordinator.rs
#	src/crates/assembly/core/src/agentic/coordination/scheduler.rs
#	src/crates/assembly/core/src/agentic/execution/execution_engine.rs
#	src/crates/assembly/core/src/agentic/session/session_manager.rs
#	src/crates/execution/agent-runtime/src/event_queue.rs
#	src/crates/execution/agent-runtime/src/scheduler.rs
#	src/web-ui/src/flow_chat/services/AgenticEventListener.ts
#	src/web-ui/src/flow_chat/services/flow-chat-manager/EventHandlerModule.ts
…on 根因修复

- P0-1 (coordinator.rs): register_session_tree_edge_idempotent 补缺失 } + DialogTurnStopDisposition 前空行 + trigger_source 字段补 None + 未使用 import 清理
- P0-2 (scheduler.rs): 补 ActiveDialogTurnTakeResult::Matched 分支 notify_waiters(active_turn_retired 通知缺失)+ goal_continuation match 非穷尽补 AbortForInterrupted 分支
- P1-1 (scheduler.rs): active_turn_retired.notify_waiters() 补发(Matched 分支)
- P1-2 (scheduler.rs): GoalContinuationAfterTurnAction::AbortForInterrupted 处理(interrupted turn 保持 goal 不继续)
- P1-3 (scheduler.rs): goal continuation 完整版实现(Evaluate 分支:prepare_goal_continuation_after_turn + submit_with_prepended_messages 重试循环 + MAX_THREAD_GOAL_AUTO_CONTINUATIONS)
- 重复字段清理 (execution_engine.rs/types.rs): ExecutionResult 移除 total_tools/duration_ms 重复字段
- DialogTurnData 补 recovery/recovery_epoch 字段 (group_room_tools.rs)
- turn admission 根因修复 (coordinator.rs): update_session_agent_binding 后刷新本地 session 快照,修复 TurnAdmissionSessionFacts 与 re-read session 不一致导致的 'Session execution settings changed during turn admission'(上游 1540b8a turn admission 重构引入)
- 测试注入修复: TEST_MODEL_RESOLUTION_AI_CONFIG.scope 注入(scheduler.rs 3 测试 + group_room_tools.rs 1 集成测试),适配上游 resolve_model_id_for_turn 需 config service

验证: cargo check -p bitfun-core --features product-full 0e0w (清缓存) + cargo check -p bitfun-sdk-host-app 0e0w + cargo check --workspace 0e0w + bitfun-core 2498 passed/0 failed + sdk-host 62 passed/0 failed
@GCWing

GCWing commented Aug 19, 2026

Copy link
Copy Markdown
Owner

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

t and others added 4 commits August 19, 2026 09:39
- auto_index.rs: route 3 git spawns through process_manager::create_command (CREATE_NO_WINDOW)
- cli dispatch git probe / workspace git_command: same helper
- external_editor: hide cmd.exe / editor process windows (bitfun-core re-export path, TUI boundary compliant)
- exec verification: create_tokio_command for cmd/sh
- dispatch_host: create_tokio_command for bitfun.exe child
- Cargo.lock: h2 0.4.15 -> 0.4.16 (RUSTSEC-2026-0258)
@1688mengdie

Copy link
Copy Markdown
Author

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

t added 17 commits August 19, 2026 18:06
- outer let builder (no mut)
- cfg(debug_assertions|devtools) block shadows mut builder, returns via let binding
- release/dev/devtools all compile 0 warning
…CLI-FLAKY)

On macOS kill(-pgid, 0) returns ESRCH for an orphaned process group whose
only remaining members are TERM-resistant children, while Linux reports the
group alive while any member lives. The old probe made wait_for_process_group_exit
believe the group had exited, so terminate_worker returned Ok(true) and the
cancellation_does_not_escalate_after_term_exits_the_verified_leader test failed
(SIGKILL must not follow a vanished leader).

macOS branch now enumerates the group with pgrep -g (Apple's ps -g is a no-op
unless unix2003 compat mode is active) and requires at least one live non-zombie
member via ps -o stat=. Linux path unchanged.
Sync upstream 0825520 (PR GCWing#2384 fix(peer): route Tauri events once) - tauri-adapter.ts + test, zero conflicts
# Conflicts:
#	src/apps/desktop/src/api/browser_api.rs
…tEventSource import, include_hidden field, total_tokens field)
…re-existing app-server negotiation test fixed (context reload port wired in test runtime)
…isting failures)

- opencode instruction_source/tool_source_contracts: anchor workspace .git so find_project_root cannot escape into a host git checkout (e.g. user home dir that is a git repo)
- git trust: GIT_CEILING_DIRECTORIES bounds upward discovery in the plain-directory test
- git utils: invalid lexical .git marker assertion made robust to host repository ancestors (strict on CI, robust on developer machines)
- terminal exec: drop inner quotes from powershell -Command test scripts (cmd /C strips them on Windows; upstream CI never runs cargo test on windows)
- environment: uv python 3.11 reinstalled (shim pointed at missing interpreter); host C:\Users\Administrator\nul reserved-name leftover removed
…ent-reply-01)

R-ASYNC-01 suppression suppressed injected-turn auto-reply unconditionally,
but the UserSteering injection channel has no reply-delivery capability, so
urgent-injected turns never reported back. Fix (scheme B): mark carries the
injector session id; suppress only when the turn reply_route points to a
different session (duplicate-reply scenario), and forward normally when it
points back to the injector.
- resolve returns request_url (/v2/chat/completions) and format=openai so the
  subscription override layer takes effect (previously None -> URL derived
  without /v2 prefix -> wrong endpoint)
- suggested default model glm-5.2 (real model, not the literal 'codebuddy')
- static model table for copilot.tencent.com (no public OpenAI /models)
- inference endpoint gateway.qoder.com.cn/model/v1/chat/completions (owner
  machine endpoint-cache verified; OpenAI-compatible, matches existing pipeline)
- PAT login flow: exchange PAT at openapi.qoder.com.cn/api/v1/jobToken/exchange
  for short-lived job token (qoderclicn source-verified); PAT stored as refresh
  marker pat|... and re-exchanged on expiry
- keep OAuth device flow as second channel (dual-channel)
- static CN model table (qoder-cn-proxy verified) for model discovery since
  api2-v2 has no public OpenAI /models
- remove Cosy-* headers (pi-free: api2-v2 is pure Bearer; CN gateway likewise)
- frontend PAT input + i18n (en/zh-CN/zh-TW)
…allback

react-hooks/exhaustive-deps error blocked CI zero-warning gate.
Model list discovery broke after the CN migration: the static Qoder model
catalog branch only matched api2-v2.qoder.sh, but the China-region gateway
is gateway.qoder.com.cn, so discovery fell through to a real /models request
that 404s. Match both gateways.
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.

2 participants