| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5] Close MCP sessions on shutdown, preserve explicit chat-completion endpoints, align RAM-A tool arguments, and surface accurate local and remote memory health in the TUI. | 14 天前 | |
feat(gateway): Integrate the dyn-sandbox execution backend on linux Co-Authored-By: DeepSeek v4 | 9 天前 | |
style: apply cargo fmt across endside TUI and e2b filesystem Pure formatting pass (line wrapping, import ordering, struct-literal reformatting) plus a trivial let mut -> let cleanup in the e2b filesystem. No semantic change. | 11 天前 | |
perf(tui): incremental transcript cache rebuild to eliminate per-tick visual_lines clone Replace the per-tick full-clone render path with an incremental rebuild: non-dirty messages move their visual_lines (and lines, logical_to_visual_offset, etc.) from the previous tick's cache into the new one with zero Line cloning; only dirty messages re-wrap. - app_state.rs: replace CachedMessageLayout with MessageVisualBlock and restructure TranscriptRenderCache around message_blocks + flat logical_line_visual_starts / line_texts / line_is_header / visual_line_backgrounds indices (rebuilt each tick from the blocks, cheap since they are usize/String/bool/Color, not Line trees). Add helpers visual_line / logical_line / collect_visible_visual_lines / logical_line_count. Replace RenderState::message_renders with message_render_revisions: Vec<Option<u64>> plus last_render_width / last_render_theme for global dirty detection. - transcript.rs: new build_transcript_cache(prev, renders) where each render is Option<CachedMessageRender> (Some = dirty/re-wrap, None = non-dirty/move prev block via Option::take). render_chat now computes per-message dirtiness from render_revision + width + theme instead of cloning every render every tick. Message-count decrease triggers a full rebuild; increase extends revision slots with None and preserves the cache (incremental append); switch clears it. Selection rendering and the visible window now go through the new cache helpers; the only remaining Line clone per frame is the inner_height-bounded collect_visible_visual_lines window. - event_mouse.rs: mouse_to_line_col adapted to cache.visual_line() / total_lines instead of the removed flat visual_lines vec. - Drop now-vestigial CachedMessageRender fields (revision, theme) and the dead Theme::for_test helper; extract magic values in the bench/regression tests into named constants with comments. Bench coverage (transcript.rs tests): - build_transcript_cache_bench: the single-scenario microbenchmark (50 msgs, 1 dirty) with move-verification assertions. - build_transcript_cache_scalability: a 4-axis matrix (message count 10/50/200, dirty count 1/10%/50%/100%, width 40/80/120, content shape short/long). Reports full vs incremental-step µs and the speedup ratio per scenario. At 50 msgs/1 dirty the pure incremental step is ~45-65us vs ~185us full rebuild (4x); at 200 msgs the ratio rises to ~3.7x, and short (no-wrap) content hits ~15x. Also fix two WIP regressions in root.rs that surfaced during end-to-end perf capture: - fix(panic): the PERF ui: probe computed phase durations with a.elapsed() - b.elapsed() (Duration Sub), which panics on underflow. When a guarded render is skipped during loading the paired Instants are nearly back-to-back and the second elapsed() can exceed the first by a few ns, underflowing. Switched to Instant::duration_since (saturates to zero) and Duration::saturating_sub. dialogs phase uses Instant::now().duration_since(_t5) so phases sum to total. - fix(render): restore unconditional rendering of header, sidebar, status bar and pending-turns during loading. A WIP !is_loading gate blanked the surrounding chrome during every assistant stream, leaving only the chat area on a black background. Reverted to the base behavior (always render). Also fix a layout-cache staleness bug: the cached body split depends on plan_state.is_some() (at terminal widths 60..=71), so a Some<->None transition must invalidate cached_area. apply_todo_snapshot (runtime_stream.rs) now invalidates only on a presence transition (content-only plan updates keep the cache). Includes a regression test covering None->Some, Some->Some, Some->None. Performance probes (all #[cfg(debug_assertions)] — release binary is probe-free, verified via strings grep on the release binary): - core.rs: PERF_PROBES_ACTIVE on startup; PERF terminal_draw (>500us); PERF event_loop_tick (>15ms while loading). - root.rs: PERF ui: total+phases+loading (>100us). Phase durations use Instant::duration_since / Duration::saturating_sub (saturating, no underflow panic). dialogs phase uses Instant::now().duration_since(_t5) so phases sum to total. - transcript.rs: PERF render_chat: total+dirty+build+collect+render (>500us). dirty = render_message_entry for dirty msgs; build = build_transcript_cache; collect = collect_visible_visual_lines; render = Paragraph::render + scrollbar + region scan. End-to-end capture (834 streaming frames, 50-msg session): render_chat p50=1615us render=1138us(60%) dirty=472us(36%) build=41us(4%) build_transcript_cache stays ~40us p50 (4x vs ~185us full rebuild); the remaining bottleneck is render_message_entry (O(n^2) per-tick re-parse of the streaming message) and Paragraph::render, both outside build_transcript_cache's scope. Co-Authored-By: DeepSeek V4 Flash | 15 天前 | |
fix(tui): update key bindings for subagent view navigation - Changed the key binding for leaving the subagent view from Shift+Up to plain Left. - Updated related UI messages to reflect the new key binding. - Added tests to verify the new key binding behavior. These changes enhance the user experience by simplifying navigation in the subagent view. | 19 天前 | |
feat:拆分xiaoo-app的文件目录,拆分为端侧、服务侧两套体系 | 2 个月前 | |
feat(mcp): add /mcp command and integrate MCP service - Introduced a new slash command /mcp to list current MCP server configurations. - Integrated MCP service into the application, allowing for better management of MCP-related functionalities. - Updated event handling to respond to the /mcp command by rendering the MCP overview. - Refactored debug logging to use tracing for performance-related messages across the application. Co-authored-by: Fable5 | 11 天前 | |
optimize(tui): render completed plan task with check mark Co-Authored-By: GLM-5.2 | 1 个月前 | |
fix(mcp): harden RAM-A lifecycle and operator status [AI: Codex GPT-5] Close MCP sessions on shutdown, preserve explicit chat-completion endpoints, align RAM-A tool arguments, and surface accurate local and remote memory health in the TUI. | 14 天前 | |
perf(tui): incremental transcript cache rebuild to eliminate per-tick visual_lines clone Replace the per-tick full-clone render path with an incremental rebuild: non-dirty messages move their visual_lines (and lines, logical_to_visual_offset, etc.) from the previous tick's cache into the new one with zero Line cloning; only dirty messages re-wrap. - app_state.rs: replace CachedMessageLayout with MessageVisualBlock and restructure TranscriptRenderCache around message_blocks + flat logical_line_visual_starts / line_texts / line_is_header / visual_line_backgrounds indices (rebuilt each tick from the blocks, cheap since they are usize/String/bool/Color, not Line trees). Add helpers visual_line / logical_line / collect_visible_visual_lines / logical_line_count. Replace RenderState::message_renders with message_render_revisions: Vec<Option<u64>> plus last_render_width / last_render_theme for global dirty detection. - transcript.rs: new build_transcript_cache(prev, renders) where each render is Option<CachedMessageRender> (Some = dirty/re-wrap, None = non-dirty/move prev block via Option::take). render_chat now computes per-message dirtiness from render_revision + width + theme instead of cloning every render every tick. Message-count decrease triggers a full rebuild; increase extends revision slots with None and preserves the cache (incremental append); switch clears it. Selection rendering and the visible window now go through the new cache helpers; the only remaining Line clone per frame is the inner_height-bounded collect_visible_visual_lines window. - event_mouse.rs: mouse_to_line_col adapted to cache.visual_line() / total_lines instead of the removed flat visual_lines vec. - Drop now-vestigial CachedMessageRender fields (revision, theme) and the dead Theme::for_test helper; extract magic values in the bench/regression tests into named constants with comments. Bench coverage (transcript.rs tests): - build_transcript_cache_bench: the single-scenario microbenchmark (50 msgs, 1 dirty) with move-verification assertions. - build_transcript_cache_scalability: a 4-axis matrix (message count 10/50/200, dirty count 1/10%/50%/100%, width 40/80/120, content shape short/long). Reports full vs incremental-step µs and the speedup ratio per scenario. At 50 msgs/1 dirty the pure incremental step is ~45-65us vs ~185us full rebuild (4x); at 200 msgs the ratio rises to ~3.7x, and short (no-wrap) content hits ~15x. Also fix two WIP regressions in root.rs that surfaced during end-to-end perf capture: - fix(panic): the PERF ui: probe computed phase durations with a.elapsed() - b.elapsed() (Duration Sub), which panics on underflow. When a guarded render is skipped during loading the paired Instants are nearly back-to-back and the second elapsed() can exceed the first by a few ns, underflowing. Switched to Instant::duration_since (saturates to zero) and Duration::saturating_sub. dialogs phase uses Instant::now().duration_since(_t5) so phases sum to total. - fix(render): restore unconditional rendering of header, sidebar, status bar and pending-turns during loading. A WIP !is_loading gate blanked the surrounding chrome during every assistant stream, leaving only the chat area on a black background. Reverted to the base behavior (always render). Also fix a layout-cache staleness bug: the cached body split depends on plan_state.is_some() (at terminal widths 60..=71), so a Some<->None transition must invalidate cached_area. apply_todo_snapshot (runtime_stream.rs) now invalidates only on a presence transition (content-only plan updates keep the cache). Includes a regression test covering None->Some, Some->Some, Some->None. Performance probes (all #[cfg(debug_assertions)] — release binary is probe-free, verified via strings grep on the release binary): - core.rs: PERF_PROBES_ACTIVE on startup; PERF terminal_draw (>500us); PERF event_loop_tick (>15ms while loading). - root.rs: PERF ui: total+phases+loading (>100us). Phase durations use Instant::duration_since / Duration::saturating_sub (saturating, no underflow panic). dialogs phase uses Instant::now().duration_since(_t5) so phases sum to total. - transcript.rs: PERF render_chat: total+dirty+build+collect+render (>500us). dirty = render_message_entry for dirty msgs; build = build_transcript_cache; collect = collect_visible_visual_lines; render = Paragraph::render + scrollbar + region scan. End-to-end capture (834 streaming frames, 50-msg session): render_chat p50=1615us render=1138us(60%) dirty=472us(36%) build=41us(4%) build_transcript_cache stays ~40us p50 (4x vs ~185us full rebuild); the remaining bottleneck is render_message_entry (O(n^2) per-tick re-parse of the streaming message) and Paragraph::render, both outside build_transcript_cache's scope. Co-Authored-By: DeepSeek V4 Flash | 15 天前 | |
perf(lsp): cache find_root results with TTL LspServerManager gains an in-process root_cache keyed by (file, server_id) with a 300s TTL, avoiding the ancestor walk on every LSP action. All results are cached unconditionally, including the fallback to the file's parent; staleness is bounded by the TTL so markers added or removed during the window are picked up after expiry. The earlier "only cache when root != file.parent()" heuristic skipped the case where the marker sits in the file's direct parent (e.g. main.rs next to Cargo.toml), since find_root returns that same parent both on a hit (marker in parent) and on a miss (fallback), making them indistinguishable and defeating the cache for that common layout. Matching configs are collected into an owned Vec before the await so no borrow of self.configs is held across cached_find_root. Co-Authored-By: GLM-5.2 | 11 天前 | |
fix: align mouse mapping and total_lines with actual wrapped visual lines Co-Authored-By: GLM-5.2 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 14 天前 | ||
| 9 天前 | ||
| 11 天前 | ||
| 15 天前 | ||
| 19 天前 | ||
| 2 个月前 | ||
| 11 天前 | ||
| 1 个月前 | ||
| 14 天前 | ||
| 15 天前 | ||
| 11 天前 | ||
| 1 个月前 |