From e9a9217cc80930c09c35c351b93893c6c98b9622 Mon Sep 17 00:00:00 2001 From: Mathias Gesbert Date: Thu, 9 Apr 2026 18:40:46 +0200 Subject: [PATCH] v2.7.4 (#579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Clément Sirieix Co-authored-by: Kim-Adeline Miguel Co-authored-by: Lucas Marandat <31749711+lucasmrdt@users.noreply.github.com> Co-authored-by: Michel Thomazo <51709227+michelTho@users.noreply.github.com> Co-authored-by: Paul Cacheux Co-authored-by: Peter Evers Co-authored-by: Pierre Rossinès Co-authored-by: Pierre Rossinès Co-authored-by: Quentin Co-authored-by: Simon Van de Kerckhove Co-authored-by: Val <102326092+vdeva@users.noreply.github.com> Co-authored-by: Vincent G <10739306+VinceOPS@users.noreply.github.com> Co-authored-by: Mistral Vibe --- .gitignore | 3 + .vscode/launch.json | 2 +- CHANGELOG.md | 30 + CONTRIBUTING.md | 26 + README.md | 2 + distribution/zed/extension.toml | 14 +- pyproject.toml | 5 +- scripts/install.sh | 55 +- tests/acp/test_acp_entrypoint_smoke.py | 26 + tests/acp/test_bash.py | 32 +- tests/acp/test_initialize.py | 4 +- tests/acp/test_load_session.py | 36 + tests/acp/test_read_file.py | 14 +- tests/acp/test_search_replace.py | 10 +- tests/acp/test_write_file.py | 10 +- .../test_ui_chat_autocompletion.py | 14 + tests/backend/test_backend.py | 67 -- tests/backend/test_reasoning_adapter.py | 12 - tests/browser_sign_in/stubs.py | 113 +++ tests/browser_sign_in/test_browser_sign_in.py | 325 +++++++++ .../test_browser_sign_in_http.py | 654 ++++++++++++++++++ tests/cli/test_clipboard.py | 26 +- tests/cli/test_commands.py | 50 +- tests/cli/test_mcp_app.py | 156 +++++ tests/cli/test_ui_clipboard_notifications.py | 2 +- .../textual_ui/test_debug_console_resize.py | 44 ++ .../test_manual_command_output_cap.py | 132 ++++ tests/conftest.py | 6 + tests/core/test_agents.py | 26 + tests/core/test_config_otel.py | 37 +- tests/core/test_file_logging.py | 67 +- tests/core/test_log_reader.py | 430 ++++++++++++ tests/core/test_teleport_nuage.py | 12 + tests/core/test_teleport_service.py | 25 + tests/core/test_watcher.py | 50 ++ tests/core/tools/builtins/test_read_file.py | 2 +- .../test_snapshot_debug_console_close.svg | 200 ++++++ ...est_snapshot_debug_console_live_append.svg | 204 ++++++ .../test_snapshot_debug_console_open.svg | 203 ++++++ ...shot_mcp_backspace_returns_to_overview.svg | 203 ++++++ .../test_snapshot_mcp_broken_server.svg | 203 ++++++ ..._snapshot_mcp_enter_drills_into_server.svg | 203 ++++++ .../test_snapshot_mcp_escape_closes.svg | 201 ++++++ .../test_snapshot_mcp_no_servers.svg | 201 ++++++ .../test_snapshot_mcp_overview.svg | 203 ++++++ ...st_snapshot_mcp_overview_navigate_down.svg | 203 ++++++ .../test_snapshot_mcp_server_arg.svg | 203 ++++++ ...ot_model_picker_select_different_model.svg | 2 +- tests/snapshots/conftest.py | 8 + .../test_ui_snapshot_debug_console.py | 90 +++ .../snapshots/test_ui_snapshot_mcp_command.py | 159 +++++ tests/stubs/fake_mcp_registry.py | 50 ++ .../test_agent_override_resolve_permission.py | 111 +++ tests/test_agent_tool_call.py | 6 +- tests/test_agents.py | 21 + tests/test_history_manager.py | 5 +- tests/test_install_script.py | 198 ++++++ tests/test_tracing.py | 8 +- tests/tools/test_ask_user_question.py | 2 +- tests/tools/test_bash.py | 14 +- tests/tools/test_exit_plan_mode.py | 4 +- tests/tools/test_granular_permissions.py | 29 +- tests/tools/test_grep.py | 8 +- tests/tools/test_invoke_context.py | 2 +- tests/tools/test_skill.py | 2 +- tests/tools/test_task.py | 10 +- tests/tools/test_ui_bash_execution.py | 39 ++ tests/tools/test_webfetch.py | 7 +- tests/tools/test_websearch.py | 4 +- uv.lock | 46 +- vibe/__init__.py | 2 +- vibe/acp/acp_agent_loop.py | 108 +-- vibe/acp/entrypoint.py | 6 +- vibe/cli/clipboard.py | 11 +- vibe/cli/commands.py | 30 +- vibe/cli/history_manager.py | 2 +- vibe/cli/profiler.py | 81 +++ vibe/cli/textual_ui/app.py | 247 +++++-- vibe/cli/textual_ui/app.tcss | 50 +- .../widgets/chat_input/completion_popup.py | 5 +- .../widgets/chat_input/container.py | 32 +- vibe/cli/textual_ui/widgets/debug_console.py | 244 +++++++ vibe/cli/textual_ui/widgets/mcp_app.py | 157 +++++ vibe/core/__init__.py | 14 +- vibe/core/agent_loop.py | 68 +- vibe/core/agents/manager.py | 16 +- vibe/core/agents/models.py | 2 +- .../autocompletion/file_indexer/watcher.py | 4 + vibe/core/config/__init__.py | 4 +- vibe/core/config/_settings.py | 21 +- vibe/core/llm/backend/generic.py | 22 +- vibe/core/llm/backend/mistral.py | 16 +- vibe/core/llm/backend/reasoning_adapter.py | 4 +- vibe/core/llm/message_utils.py | 8 - vibe/core/log_reader.py | 224 ++++++ vibe/core/logger.py | 15 +- vibe/core/paths/_local_config_walk.py | 55 +- vibe/core/programmatic.py | 16 +- vibe/core/teleport/nuage.py | 4 +- vibe/core/teleport/teleport.py | 3 + vibe/core/tools/base.py | 16 +- vibe/core/tools/builtins/prompts/webfetch.md | 1 + vibe/core/tools/builtins/search_replace.py | 3 +- vibe/core/tools/builtins/task.py | 37 +- vibe/core/tools/builtins/webfetch.py | 46 +- vibe/core/tools/manager.py | 12 +- vibe/core/tools/mcp/tools.py | 35 +- vibe/core/tracing.py | 2 +- vibe/setup/auth/__init__.py | 21 + vibe/setup/auth/browser_sign_in.py | 147 ++++ vibe/setup/auth/browser_sign_in_gateway.py | 55 ++ .../auth/http_browser_sign_in_gateway.py | 319 +++++++++ vibe/whats_new.md | 7 +- 113 files changed, 7202 insertions(+), 541 deletions(-) create mode 100644 tests/browser_sign_in/stubs.py create mode 100644 tests/browser_sign_in/test_browser_sign_in.py create mode 100644 tests/browser_sign_in/test_browser_sign_in_http.py create mode 100644 tests/cli/test_mcp_app.py create mode 100644 tests/cli/textual_ui/test_debug_console_resize.py create mode 100644 tests/cli/textual_ui/test_manual_command_output_cap.py create mode 100644 tests/core/test_log_reader.py create mode 100644 tests/core/test_watcher.py create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_debug_console/test_snapshot_debug_console_close.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_debug_console/test_snapshot_debug_console_live_append.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_debug_console/test_snapshot_debug_console_open.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_backspace_returns_to_overview.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_broken_server.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_enter_drills_into_server.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_escape_closes.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_no_servers.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_overview.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_overview_navigate_down.svg create mode 100644 tests/snapshots/__snapshots__/test_ui_snapshot_mcp_command/test_snapshot_mcp_server_arg.svg create mode 100644 tests/snapshots/test_ui_snapshot_debug_console.py create mode 100644 tests/snapshots/test_ui_snapshot_mcp_command.py create mode 100644 tests/stubs/fake_mcp_registry.py create mode 100644 tests/test_agent_override_resolve_permission.py create mode 100644 tests/test_install_script.py create mode 100644 vibe/cli/profiler.py create mode 100644 vibe/cli/textual_ui/widgets/debug_console.py create mode 100644 vibe/cli/textual_ui/widgets/mcp_app.py create mode 100644 vibe/core/log_reader.py create mode 100644 vibe/setup/auth/__init__.py create mode 100644 vibe/setup/auth/browser_sign_in.py create mode 100644 vibe/setup/auth/browser_sign_in_gateway.py create mode 100644 vibe/setup/auth/http_browser_sign_in_gateway.py diff --git a/.gitignore b/.gitignore index f32ab67..1eef366 100644 --- a/.gitignore +++ b/.gitignore @@ -199,3 +199,6 @@ result-* # Tests run the agent in the playground, we don't need to keep the session files tests/playground/* . + +# Profiler HTML reports (generated by vibe.cli.profiler) +*-profile.html diff --git a/.vscode/launch.json b/.vscode/launch.json index 17f8834..2b05eb1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,5 +1,5 @@ { - "version": "2.7.3", + "version": "2.7.4", "configurations": [ { "name": "ACP Server", diff --git a/CHANGELOG.md b/CHANGELOG.md index 68a99ec..d4796cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.7.4] - 2026-04-09 + +### Added + +- Console View for enhanced debugging and monitoring +- `/mcp` command to display MCP servers and their status +- Manual command output forwarding to agent context + +### Changed + +- Improved web_fetch content truncation for better readability +- Lazily load heavy dependencies to improve startup time +- Optimized folder parsing at startup using scandir +- Include file name in search_replace result display + +### Fixed + +- Stale configurations from subagent switch +- ValueError on OTEL context detach in agent_span +- Clipboard toast preview replaced with fixed text +- Only agents with type "agent" are loadable with --agent flag +- Made chat_url nullable in ChatAssistantPublicData +- Normalized OTEL span exporter endpoint +- Removed redundant permission prompts for parallel tool calls needing the same permission +- Removed bottom margin issue in UI +- Never crash before ACP server starts +- Use skill in recent commands via the up-arrow navigation +- Fixed loading order issues in vibe initialization + + ## [2.7.3] - 2026-04-03 ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c72a639..aac0ce3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,6 +88,8 @@ Example: LOG_LEVEL=DEBUG uv run vibe ``` +You can also view logs in real-time within the application by pressing `Ctrl+\` to open the debug console. + ### Running Tests Run all tests: @@ -108,6 +110,30 @@ Run a specific test file: uv run pytest tests/test_agent_tool_call.py ``` +### Profiling + +Vibe ships a lightweight profiler module (`vibe.cli.profiler`) that wraps [pyinstrument](https://github.com/joerick/pyinstrument). It silently no-ops when pyinstrument is not installed or the `VIBE_PROFILE` env var is unset, so instrumentation can stay in the code with zero overhead in normal use. + +**1. Add profiling calls** around the code you want to measure: + +```python +from vibe.cli import profiler + +profiler.start("startup") +# ... code to measure ... +profiler.stop_and_print() +``` + +Only one profiler can run at a time. The label passed to `start()` is used to name the output file. Each call to `stop_and_print` writes an HTML report (`