sync: taiji 定制版同步最新基线 8d810b99e(LegionCard 样式统一 + 群聊 P0 修复) - #2262
Open
1688mengdie wants to merge 198 commits into
Open
sync: taiji 定制版同步最新基线 8d810b99e(LegionCard 样式统一 + 群聊 P0 修复)#22621688mengdie wants to merge 198 commits into
1688mengdie wants to merge 198 commits into
Conversation
Single commit containing the complete taiji fork on top of upstream/main: - all customizations previously squashed in ea11f78 (108 fixes, configurable thresholds, token/context fixes, legion/task tooling, etc.) - tool-cluster documentation fix (compact/role/legion action docs) - upstream merged: bffe514 .. 5700984 Tree identical to the pre-squash state; commit history flattened to the delivery form requested by the owner (one commit, parent = upstream/main).
…aller signing pubkey + nightly web bindings)
…drop fallbacks; fix web-ui lint
UX-P0-1 root-cause fix: SessionHistory had no authorization gate - any session holding the tool could export any other session's full transcript (including tool_inputs/thinking) by session id alone. - Add resolve_session_read_authorization (session_control_tool.rs) aligned with the R4 shared mutation gate: same-workspace ownership check, owner (Commander/RBAC-off) bypass, created_by match, in-tree ancestor/descendant authorization (memory tree fast path + persisted metadata chain fallback), Warden/daemon caller exemption (R-A.04). - Wire the gate into SessionHistoryTool::call_impl (fail-closed when the caller session or workspace cannot be resolved). - Narrow the toolset: SessionHistory removed from shared_coding_mode_tools / subagent_default_tools; only the Warden template retains it (cross-session audit reads) plus the in-tool authorization gate. - Add attacker-matrix tests: unrelated reject, owner bypass, created_by, ancestor->descendant, descendant->ancestor, sibling reject, cross-workspace reject, warden daemon bypass, fail-closed no-caller.
UX-P1-1: legion thresholds (legion_max_nodes=20 / legion_max_total_nodes=60 / legion_deploy_frequency_per_hour=10) are top-level ai.legion_* keys, not ai.thresholds.* subdomain. Add config-service contract test asserting top-level set/get round-trips and that ai.thresholds.legion.* is not a valid key (set/get fail). 12-legion doc updated out-of-repo.
前端-P1-1: ThresholdsShape.subagent gains max_dispatch_per_parent_window (20) / dispatch_window_secs (3600) / dispatch_cooldown_secs (300) matching backend SubagentThresholds (types.rs:958-989) consumed by coordinator.rs configured_subagent_dispatch_*. Renders in domainSections, adds en/zh-CN/zh-TW i18n keys, and asserts render+persist in ThresholdsConfig.test.tsx. BasicsConfig legion section comment clarifies ai.legion_* top-level-key semantics (UX-P1-1).
…d re-register RBAC roles on storage-path session restore P1-S1: Executor/Reviewer templates no longer rely on empty-allowlist allow-all semantics. Whitelists = subagent_default_tools() plus the deferred-tool gateway pair, GetTime, and the review-shape tools (GetFileDiff/submit_code_review/LaunchReviewAgent/LS), merged with the subagent deny list as a second layer. Newly registered tools are denied by default on subagent sessions, matching the MiniApp whitelist philosophy. Regression test asserts unknown tools are rejected and all nine deny entries still hold. P1-S2: every storage-path and workspace-path restore variant now calls restore_session_role_best_effort after restore, so a process restart no longer silently drops subagent RBAC roles (falling back to the context-level empty allowlist). Covers restore_session_from_storage_path, restore_internal_session_from_storage_path, both with_turns storage-path variants, all session-view storage-path timed/tail variants, the workspace-path view/tail/internal view variants, and the legacy restore_session entry. New assertion test verifies main-session commander re-registration, subagent executor re-registration with landed template, and the view storage-path variant.
P1-S3: a shame-wall registry whose JSON fails to parse is no longer silently overwritten by the next atomic save. load_from_path_quarantining renames the corrupt file to <name>.corrupt-<unix-ts> (preserving the recovery path) and then starts with an empty registry, matching the tombstone corrupt-file philosophy while keeping startup available. WardenRuntime::with_shame_wall_path now uses the quarantining loader. Tests: corrupt file is renamed away, backup preserves original contents, live path is recreated by save and the backup survives; a missing file creates no backup.
Hot append paths (add_message / replace_context_messages) no longer synchronously rewrite the full turn-context snapshot per message, which made long sessions O(N^2) in context length (10MB context -> 10MB clone + serialization + fsync per append). - add_message marks the session dirty via schedule_current_turn_snapshot_flush - a single background flush task drains the dirty set after a 200ms debounce window, coalescing N rapid appends into one atomic write per session per window (shared per-session flush lock) - turn-start / turn-end (complete/fail/cancel) / compression (replace_context_messages) / listing-diff removal now flush synchronously (persist_current_turn_context_snapshot_forced), which also supersedes any pending debounced marker, so crash-recovery semantics are preserved (a crash mid-turn loses at most the last 200ms window of in-memory appends) - compact serialization already in place in JsonFileStore; sanitize was already Cow-based - regression tests: debounced flush coalesces rapid appends; forced turn-end flush supersedes pending debounced flush
…OT at startup (UX-P1-3) CLI startup previously only initialized the global config service; the KnowledgeBaseSearch tool reads BITFUN_KNOWLEDGE_BASE_ROOT at call time, so a configured ai.knowledge_base_root was silently ignored in CLI deployments (L6-P0-1 was desktop-only). Mirror the desktop host injection (desktop/lib.rs:518-548): resolve ai.knowledge_base_root once at startup and inject it into the environment, keeping the explicit-env escape hatch. Adds inject_knowledge_base_root_if_needed + 4 unit tests (configured inject / explicit env wins / unset leaves env absent / blank treated as unset).
export_session_transcript used a bare fs::write over the transcript file; a concurrent reader (SessionHistory export / compression transcript readers) could observe a torn/partial file. create_compression_transcript used create_new + write_all, which is equally non-atomic while holding the lock open during the write. Replace both with the JsonFileStore temp+rename / hard-link publish path: - export_session_transcript -> write_text_atomic (BestEffortReplace) - create_compression_transcript -> write_text_atomic_create_new for the transcript and metadata pair, preserving the unique-name retry semantics of the former create_new reservation (AlreadyExists -> retry with a fresh stem) and removing partial files when the pair reservation fails. Adds two regression tests: transcript_atomic_write_leaves_no_torn_or_temp_artifacts (complete read after re-export, no .tmp droppings) and compression_transcript_pair_is_published_atomically (pair fully readable, no .tmp droppings).
… aggregate cap (UX-P1-4 + UX-P1-5) UX-P1-5: the deployment-frequency limit was a best-effort read-modify-write — two concurrent loads could both read an empty legionDeployTimes history, both pass the cap check, and both deploy. Guard the check-and-reserve with a KeyedAsyncLock keyed by (workspace, creator) so the in-flight deployment is already counted by the next load; the reservation is written before the creation loop and rolled back on every failure path (depth cap, create error, attach rollback, aggregate-cap rejection). A reservation persistence failure now fails the load closed instead of silently deploying without a counter. The cross-deployment aggregate cap is now workspace-dimensional: it counts all persisted legion node sessions in the deployment workspace (via the new SessionManager::count_workspace_legion_node_sessions) instead of the creator subtree, so recursive fission (children deployed as independent creators) can no longer exceed ai.legion_max_total_nodes layer by layer. UX-P1-4: document that max_nodes is resolved once per dispatch and passed into resolve_legion_topology — validate_input stays an early-reject hint and the dispatch-time value is authoritative, so a config hot-update between validate and call cannot make validation and execution disagree. Adds 3 tests: frequency_limit_helper_rejects_only_at_the_cap, rollback_helper_removes_only_the_reserved_timestamp, concurrent_loads_of_the_same_creator_are_serialized_by_the_deploy_lock, sequential_check_reserve_under_lock_counts_inflight_deployments.
…notation (UX-P1-3 + UX-P1-6) UX-P1-3: add a Knowledge Base section to BasicsConfig with an input + save button for ai.knowledge_base_root (injected into BITFUN_KNOWLEDGE_BASE_ROOT by the desktop/CLI hosts at startup). Adds en/zh-CN/zh-TW i18n keys and a vitest spec covering load/render, persist, and clear. UX-P1-6: annotate the legion node role label in CreateLegionPage with a 'display only' badge + tooltip explaining that legionRole is orchestration metadata only — the deployed session's permissions are always resolved by the standard subagent role (Executor), never by this label. Adds en/zh-CN/zh-TW roleAnnotation keys.
UserSteering messages persisted into history could still be re-processed across round/turn boundaries; content-based dedup keys risk prompt-cache prefix drift when matching against the injected payload. - MessageMetadata gains optional steering_id (serde default None, skip_serializing_if none) so the dedup marker persists with the message into snapshots and round-trips through serialization (backwards compatible with legacy snapshots) - execution_engine attaches the injection id to injected UserSteering messages instead of relying on content scanning - SessionRoundInjectionBuffer dedup upgraded to prefer the steering-id metadata key (id:<steering_id>), falling back to the content key for legacy entries without an id; drain/acknowledge/undelivered paths all record the id key; distinct steering events with identical content are no longer collapsed - tests: consumed steering id suppresses reinjection without content scanning; distinct steering ids survive after one is consumed; legacy content-key fallback keeps suppressing; steering_id metadata round-trips and legacy snapshots still load
…act (前端-P2-1/P2-2/P2-3/P2-4/P2-5/P2-6)
P2-S1: document PunishmentExecutor SessionControl scope (list/inspect only,
cancel/delete stay behind resolve_session_mutation_authorization)
P2-S2: Warden template path_policy restricted to .bitfun/warden audit root
(WARDEN_AUDIT_WRITE_ROOT) so prompt injection cannot write arbitrary files
P2-S4: tombstone parent=None now Err-propagates (d4-P1-1 family) in both
list_deleted_session_ids and record_deleted_session_id
P2-S5: warden judgement tool_args embedded as digest summary (param name +
length + sha256 fingerprint), never raw text (prompt-injection surface)
P2-S6: task ACP persist scan distinguishes idle slot (Ok(None) -> append) from
read error (Err -> keep scanning, never overwrite corrupt index)
P2-S7: remote collect_workspace_reader returns (data, timed_out) so callers
can distinguish no-output from truncated output
P2-S8: session tree serialization marks truncated nodes with "truncated": true
(mirrors orphaned marker); + truncation regression test
UX-P2-2: SessionControl list rejects cross-workspace listing unless owner or
warden/daemon audit session
UX-P2-3: transient sessions deny LegionControl (no persistent legion nodes
from throwaway scopes); + deny assertion test
UX-P2-4: session JSON artifacts forced 0o600-equivalent on Unix (best-effort)
before atomic publish
Verification: cargo check 0e0w (core/services-core/services-integrations/
desktop); core 2427 + agent-runtime 325 + desktop 274 + services-core 12 lib
tests green.
… content digest (TOKEN-03)
PERF-02: EventQueue stats switched from async Mutex<QueueStats> to
AtomicU64 counters, removing two async Mutex acquisitions from the
per-delta enqueue path (~thousands of locks per 2k-token reply).
TOKEN-03: User Context cache identity now appends |instr:<sha256> digest of
workspace instruction files (workspace AGENTS.md/CLAUDE.md + external
user sources when enabled), appended AFTER the stable prefix so
unchanged content keeps hitting the cache while an edited instruction
file invalidates it (TTL=None never expires otherwise). Digest failure
falls back to "unreadable" (cache miss, never blocks prompt assembly).
Verification: cargo check 0e0w; core 2427 (incl. user_context_cache_identity
switch-state/remote-layer tests) + agent-runtime 325 (incl. event_queue)
lib tests green.
# Conflicts: # scripts/core-boundaries/rules/feature-rules.mjs # src/crates/assembly/core/Cargo.toml # src/crates/assembly/core/src/agentic/agents/registry/external.rs # src/crates/assembly/core/src/agentic/tools/implementations/mod.rs # src/crates/assembly/core/src/agentic/tools/product_runtime/materialization.rs # src/crates/assembly/core/src/product_runtime/runtime_services.rs
… after upstream sync Upstream added tool_feature_group owner validation for product tool plans; local customization tools (WorkspaceScan/KnowledgeBaseSearch/PlanList/PlanRead/ PlanUpdate/LegionControl/acp_*) were missing from the mapping, breaking the default tool runtime feature closure. Keep them owned by Basic/AgentControl groups (customization preserved).
…basics-config knowledgeBase part, legion font-weight token
…ot scan (平台-P1-2) 根因:resolve_session_workspace_binding 第三查依赖本进程 workspace 注册表, 跨工作区会话(另一 host/runtime scope 创建)不在注册表中,即使元数据已 持久化也扫不到 -> 'Workspace for session could not be resolved'。 修复: 1. 第三查注册表候选从 ? 短路改为安全退化; 2. 新增第四查:扫描 user-level projects_root 下所有含 sessions 目录的 工作区,从会话自身元数据重建绑定(不依赖注册表); 3. session_config_from_persisted_metadata 优先读 stored state 文件恢复 完整 SessionConfig(workspace_id/execution_target),metadata 兜底。 测试:新增 cross_workspace_session_resolves_binding_from_projects_root_scan, bitfun-core lib 2439 全绿,session_manager 模块 131 全绿。
…nused-import warning
- 三项注入改造:会话级注入开关 + 配置体系(global/service/types)+ 前端 SessionConfig - 泄露链 A+C 修复:prompt_builder/prompt_cache/prompt_markup/scheduler 链路 - 子代理 steering 修复 + steering 打断修复:coordinator/execution_engine/session_manager - P2 修复:chat_state/instruction_sources/instruction_context - platform-P1-2 修复:tool_pipeline/agent-runtime
…UI consistency + models.dev reasoning preset)
added 30 commits
August 14, 2026 10:58
群聊 v3 普通会话模型(R-GC-01~12): - 旧 group_chat 工具/存储/契约移除(GroupChatTool/Router/Store/Config、 group_chat_layout/membership/store、12 组桌面 Tauri 命令、前端群聊 UI) - 新群聊 = 普通会话模型:GroupRoomTool 9 action (create/invite/remove/send/history/list/fork/member_status/delete)+ group_room_aliases 别名注册,复用 coordinator/session 机制 - 群聊 9 工具默认可见(shared_coding_mode_tools / subagent_default_tools)、 tool-provider-groups AgentControl 分组、materialization 注册、registry 清单 - 边界规则 local-customization-symbols 同步(仅保留 GroupChatActor 主人标识) - 协调器/scheduler 群聊相关清理(reply ingest、queue_limit 注入移除) 异步回复全文化(R-AR-01~07): - coordinator:SubagentTurnCompleted 事件 output_text 由 None 改为 Some(全文), 与通知 turn 同源组装(同一 background_subagent_follow_up_message,防双路) - scheduler:deliver_background_result 通道复用全文组装源,运行中 turn 注入 完整最终回复(16k 护栏截断),查重键改为 (session_id, agent_type) 元组 - execution_engine / agent-runtime:coalesce 与注入缓冲按 dedupKey 键合并 - frontend_projection:SubagentTurnCompleted 投影 outputText 全文 注:scheduler.rs / coordinator.rs 两链改动交织(同一 import hunk 内 两链符号、测试区交织),拆分会产生中间态编译失败,故合并为单 commit。
Sync upstream dsh (DeepSeek Harness) plugin adapter series. Resolve conflicts per four-principles: plugin_runtime.rs (upstream multi-file refactor + local user/runtime dir), manager.rs (both tests kept).
群聊 v3 前端链四连: - R-GC-13 入口:NavPanel 群聊区块 + CreateGroupChatDialog(复用 Modal/Input/Checkbox,listSessions 过滤 Claw,走 ToolAPI.executeTool camelCase 禁裸 invoke) - R-GC-14 视图:GroupChatView(复用 ModernFlowChatContainer 气泡 + ChatInput + senderBadge,缩进错位 --group-self/--group-other)+ SessionScene isGroupChat 接线 + FlowChatStore.markSessionAsGroupChat - R-GC-15 成员+fork:成员列表 + invite/remove/fork(fork 成功 createSession+markSessionAsGroupChat+openMainSession 跳转子群)+ 2 dialog appearance surface - R-GC-16 验证:全量 vitest 3419 全绿 + tsc 0e + 三连门禁(i18n/theme/appearance)+ core-boundaries 122 - 连带修复:R-GC-13 i18n key 断链 + zh-TW 18 key + CJK 注释全清(R-7)+ appearance 注册(R-11) - 实测修复:CreateGroupChatDialog.scss tokens 引用 5层→4层 + GroupChatView.scss 4层→3层(主人 dev 实测 vite sass 报错)
工具轮黑洞防御链(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 版执行。
…i-source CJK budget=0 零违规,i18n contract/audit 全绿)
…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.
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.
同步内容
taiji 定制版(custom/taiji-unofficial)同步最新基线 \8d810b99e\(相对上次合并基线 aa98261 前进,含上游合流 9b05dd0)。
本 PR 新增关键提交
验证