Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package mistral-vibe for openSUSE:Factory checked in at 2026-07-08 17:35:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mistral-vibe (Old) and /work/SRC/openSUSE:Factory/.mistral-vibe.new.1982 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mistral-vibe" Wed Jul 8 17:35:43 2026 rev:11 rq:1364154 version:2.19.0 Changes: -------- --- /work/SRC/openSUSE:Factory/mistral-vibe/mistral-vibe.changes 2026-06-22 17:28:55.668676540 +0200 +++ /work/SRC/openSUSE:Factory/.mistral-vibe.new.1982/mistral-vibe.changes 2026-07-08 17:37:49.196157959 +0200 @@ -1,0 +2,104 @@ +Sat Jul 4 20:37:09 UTC 2026 - Matej Cepl <[email protected]> + +- Update to 2.19.0: + - Added + - --worktree NAME option to create or reuse a git worktree + and run inside it + - Rewind support over ACP for both the agent and the host + - Changed + - Teleport URL in the CLI is now clickable + - Raised the Leanstral context limit + - Sentry auto integrations are now disabled + - Fixed + - Path prompt work is now offloaded from the UI thread + - StopIteration crash in QuestionApp when submitting an empty + multi-select + - User message index now accounts for the deferred system + prompt + - No longer reports benign Sentry noise (KeyboardInterrupt + and destroyed pending tasks) +- Update to 2.18.4: + - Changed + - Whole-line content now shown in the edit diff + - Declined or skipped tool calls now render as a muted square + - Auto-approve now works in lean mode + - Fixed + - Session resume with --continue now matches the resolved + working directory + - Long tool call titles now wrap instead of being cropped + - Duplicate mcp_servers names in config are now rejected + - MarkupError crash when a tool error contained square + brackets + - Teleport now uses the matched GitHub remote + - Raw compaction user messages are now preserved + - ACP now honors default_agent on new and resumed sessions + - Ambiguous teleport session creates are now retried + +------------------------------------------------------------------- +Tue Jun 30 09:07:09 UTC 2026 - Matej Cepl <[email protected]> + +- Update to 2.18.3: + - Added + - j/k navigation in selectable lists across the TUI + (questions, theme picker, rewind, voice, MCP panels) + - ask_confirmation_on_exit config option to prompt before + quitting + - Project-level .vibe/config.toml now persists config option + changes + - Changed + - Consistent styling and casing for keyboard shortcut hints + across the TUI + - ask_user_question now supports more than 4 options and + questions + - Fixed + - No longer prompts to log in for disabled MCP servers + - Teleport diff no longer mutates the real git index +- Update to 2.18.2: + - Added + - Sentry crash reporting for unhandled exceptions in the TUI + (gated by enable_telemetry; off when telemetry is disabled) + - Changed + - Recoverable tool-call errors are now muted in the UI; only + terminal errors render as a hard failure + - Fixed + - MarkupError crash when tool output contained square + brackets + - OpenTelemetry chat/LLM spans missing after Mistral Python + SDK 2.4.10+ telemetry opt-in gate +- Update to 2.18.1: + - Added + - /mcp add slash command for adding OAuth MCP servers + - Petit chat animation idle pauses + - Changed + - Bare exit synonyms (exit, quit, :q, :quit) now treated as + slash commands instead of prompts + - Fixed + - MCP OAuth login crash when keyring backend is un-loadable +- Modified: + - no_terminal.patch + +------------------------------------------------------------------- +Sat Jun 27 16:17:53 UTC 2026 - Matej Cepl <[email protected]> + +- Update to 2.18.0: + - Added + - Clickable URLs in web fetch and web search tool output + - Context window usage display in tokens at the bottom of the + TUI + - Clipboard image paste support in the TUI (macOS) + - Max generated tokens set_config_option in ACP + - Changed + - MCP OAuth authentication UX improvements in /mcp panel + - Diff gutter and body split into separate widgets + - Faster UI startup with lazy heavy imports + - Improved connector performance with bootstrap caching + - Fixed + - macOS keychain access for Vibe credentials + - Standalone denylist incorrectly blocking commands with + heredocs + - Copy selected text from prompt input and text areas + - Repeated keyring requests in Vibe Code + - Brew upgrade now always runs even when uv upgrade succeeds + - Terminal kill/release bounding for ACP to prevent hangs + +------------------------------------------------------------------- @@ -32,2 +135,0 @@ -- Add no_terminal.patch for building in OBS, where /dev/tty is - not available. Old: ---- mistral_vibe-2.17.1.tar.gz New: ---- mistral-vibe-2.19.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mistral-vibe.spec ++++++ --- /var/tmp/diff_new_pack.u38nV2/_old 2026-07-08 17:37:50.644208424 +0200 +++ /var/tmp/diff_new_pack.u38nV2/_new 2026-07-08 17:37:50.644208424 +0200 @@ -16,20 +16,20 @@ # Name: mistral-vibe -Version: 2.17.1 +Version: 2.19.0 Release: 0 Summary: Minimal CLI coding agent by Mistral License: Apache-2.0 URL: https://github.com/mistralai/mistral-vibe -Source0: https://files.pythonhosted.org/packages/source/m/mistral_vibe/mistral_vibe-%{version}.tar.gz +Source0: https://github.com/mistralai/mistral-vibe/archive/refs/tags/v%{version}.tar.gz#/mistral-vibe-%{version}.tar.gz # PATCH-FIX-OPENSUSE build-tests.patch [email protected] # make tests pass Patch0: build-tests.patch # PATCH-FIX-UPSTREAM fix_tests.patch gh#mistralai/mistral-vibe!796 [email protected] # Fix test failures in build environments Patch1: fix_tests.patch -# PATCH-FIX-OPENSUSE no_terminal.patch bugno [email protected] -# we don't have access to /dev/tty +# PATCH-FIX-UPSTREAM no_terminal.patch gh#mistralai/mistral-vibe!884 [email protected] +# Stabilize the tests to work on slow build environments Patch2: no_terminal.patch BuildRequires: fdupes BuildRequires: python-rpm-macros @@ -38,20 +38,33 @@ BuildRequires: python3-hatch-vcs BuildRequires: python3-hatchling BuildRequires: python3-pip -Requires: python3-GitPython >= 3.1.47 +Requires: python3-GitPython >= 3.1.50 Requires: python3-Jinja2 Requires: python3-PyYAML >= 6.0.3 Requires: python3-agent-client-protocol >= 0.10.1 +Requires: python3-annotated-types >= 0.7.0 Requires: python3-attrs >= 26.1.0 +Requires: python3-beautifulsoup4 >= 4.14.3 Requires: python3-cachetools >= 7.0.6 +# Requires: python3-certifi >= 2026.6.17 +Requires: python3-certifi >= 2026.5.20 +Requires: python3-cffi >= 2.0.0 +Requires: python3-charset-normalizer >= 3.4.7 Requires: python3-click >= 8.3.3 -Requires: python3-cryptography >= 47.0.0 +Requires: python3-cryptography >= 48.0.1 +Requires: python3-eval-type-backport >= 0.3.1 Requires: python3-gitdb >= 4.0.12 -Requires: python3-giturlparse >= 0.14.0 +Requires: python3-giturlparse >= 0.15.0 Requires: python3-google-auth >= 2.49.2 Requires: python3-googleapis-common-protos >= 1.74.0 +Requires: python3-h11 >= 0.16.0 +Requires: python3-httpcore >= 1.0.9 Requires: python3-httpx >= 0.28.1 +Requires: python3-httpx-sse >= 0.4.3 +# Requires: python3-humanize >= 4.16.0 Requires: python3-humanize >= 4.15.0 +Requires: python3-idna >= 3.18 +Requires: python3-importlib-metadata >= 8.7.1 Requires: python3-jaraco.classes >= 3.4.0 Requires: python3-jaraco.context >= 6.1.2 Requires: python3-jaraco.functools >= 4.4.0 @@ -65,32 +78,62 @@ Requires: python3-linkify-it-py >= 2.1.0 Requires: python3-markdown-it-py >= 4.0.0 Requires: python3-markdownify >= 1.2.2 -Requires: python3-mcp >= 1.27.1 +Requires: python3-mcp >= 1.28.1 Requires: python3-mdit-py-plugins >= 0.5.0 Requires: python3-mdurl >= 0.1.2 -Requires: python3-mistralai >= 2.4.4 +Requires: python3-mistralai >= 2.5.0 Requires: python3-more-itertools >= 11.0.2 Requires: python3-opentelemetry-api >= 1.39.1 Requires: python3-opentelemetry-exporter-otlp-proto-http >= 1.39.1 +Requires: python3-opentelemetry-proto >= 1.39.1 Requires: python3-opentelemetry-sdk >= 1.39.1 Requires: python3-opentelemetry-semantic-conventions >= 0.60b1 +Requires: python3-packaging >= 26.2 Requires: python3-pexpect >= 4.9.0 -Requires: python3-pydantic >= 2.13.3 -Requires: python3-pydantic-settings >= 2.14.0 +Requires: python3-platformdirs >= 4.9.6 +Requires: python3-protobuf >= 6.33.6 +Requires: python3-ptyprocess >= 0.7.0 +Requires: python3-pyasn1 >= 0.6.3 +Requires: python3-pyasn1-modules >= 0.4.2 +Requires: python3-pycparser >= 3.0 +Requires: python3-pydantic >= 2.13.4 +Requires: python3-pydantic-settings >= 2.14.2 +Requires: python3-pygments >= 2.20.0 +Requires: python3-PyJWT >= 2.13.0 Requires: python3-pyperclip >= 1.11.0 +Requires: python3-python-dateutil >= 2.9.0.post0 Requires: python3-python-dotenv >= 1.2.2 +Requires: python3-python-multipart >= 0.0.32 +Requires: python3-referencing >= 0.37.0 +Requires: python3-requests >= 2.34.2 Requires: python3-rich >= 15.0.0 +Requires: python3-rpds-py >= 0.30.0 +Requires: python3-SecretStorage >= 3.5.0 +# Requires: python3-sentry-sdk >= 2.64.0 +Requires: python3-sentry-sdk >= 2.63.0 +Requires: python3-six >= 1.17.0 +Requires: python3-smmap >= 5.0.3 Requires: python3-sounddevice >= 0.5.5 +Requires: python3-soupsieve >= 2.8.3 +Requires: python3-sse-starlette >= 3.4.1 +Requires: python3-starlette >= 1.0.0 Requires: python3-syrupy +# Requires: python3-textual >= 8.2.8 Requires: python3-textual >= 8.2.7 Requires: python3-textual-speedups >= 0.2.1 Requires: python3-tomli-w >= 1.2.0 Requires: python3-tomlkit -Requires: python3-tree-sitter >= 0.25.2 -Requires: python3-tree-sitter-bash >= 0.25.1 Requires: python3-truststore >= 0.10.4 +Requires: python3-typing-extensions >= 4.15.0 +Requires: python3-typing-inspection >= 0.4.2 +Requires: python3-uc-micro-py >= 2.0.0 +Requires: python3-urllib3 >= 2.7.0 +# Requires: python3-uvicorn >= 0.46.0 +Requires: python3-uvicorn >= 0.41.0 +# Requires: python3-watchfiles >= 1.2.0 Requires: python3-watchfiles >= 1.1.1 Requires: python3-websockets >= 16.0 +Requires: python3-zipp >= 3.23.1 Requires: python3-zstandard >= 0.25.0 Obsoletes: python312-mistral-vibe < %{version} Provides: python312-mistral-vibe = %{version} @@ -102,19 +145,33 @@ # SECTION test requirements BuildRequires: ca-certificates BuildRequires: ca-certificates-mozilla -BuildRequires: python3-GitPython >= 3.1.47 +BuildRequires: python3-GitPython >= 3.1.50 BuildRequires: python3-Jinja2 BuildRequires: python3-PyYAML >= 6.0.3 BuildRequires: python3-agent-client-protocol >= 0.10.1 +BuildRequires: python3-annotated-types >= 0.7.0 BuildRequires: python3-attrs >= 26.1.0 +BuildRequires: python3-beautifulsoup4 >= 4.14.3 BuildRequires: python3-cachetools >= 7.0.6 +# BuildRequires: python3-certifi >= 2026.6.17 +BuildRequires: python3-certifi >= 2026.5.20 +BuildRequires: python3-cffi >= 2.0.0 +BuildRequires: python3-charset-normalizer >= 3.4.7 BuildRequires: python3-click >= 8.3.3 +BuildRequires: python3-cryptography >= 48.0.1 +BuildRequires: python3-eval-type-backport >= 0.3.1 BuildRequires: python3-gitdb >= 4.0.12 -BuildRequires: python3-giturlparse >= 0.14.0 +BuildRequires: python3-giturlparse >= 0.15.0 BuildRequires: python3-google-auth >= 2.49.2 BuildRequires: python3-googleapis-common-protos >= 1.74.0 +BuildRequires: python3-h11 >= 0.16.0 +BuildRequires: python3-httpcore >= 1.0.9 BuildRequires: python3-httpx >= 0.28.1 +BuildRequires: python3-httpx-sse >= 0.4.3 +# BuildRequires: python3-humanize >= 4.16.0 BuildRequires: python3-humanize >= 4.15.0 +BuildRequires: python3-idna >= 3.18 +BuildRequires: python3-importlib-metadata >= 8.7.1 BuildRequires: python3-jaraco.classes >= 3.4.0 BuildRequires: python3-jaraco.context >= 6.1.2 BuildRequires: python3-jaraco.functools >= 4.4.0 @@ -128,28 +185,49 @@ BuildRequires: python3-linkify-it-py >= 2.1.0 BuildRequires: python3-markdown-it-py >= 4.0.0 BuildRequires: python3-markdownify >= 1.2.2 -BuildRequires: python3-mcp >= 1.27.1 +BuildRequires: python3-mcp >= 1.28.1 BuildRequires: python3-mdit-py-plugins >= 0.5.0 BuildRequires: python3-mdurl >= 0.1.2 -BuildRequires: python3-mistralai >= 2.4.4 +BuildRequires: python3-mistralai >= 2.5.0 BuildRequires: python3-more-itertools >= 11.0.2 BuildRequires: python3-opentelemetry-api >= 1.39.1 BuildRequires: python3-opentelemetry-exporter-otlp-proto-http >= 1.39.1 +BuildRequires: python3-opentelemetry-proto >= 1.39.1 BuildRequires: python3-opentelemetry-sdk >= 1.39.1 BuildRequires: python3-opentelemetry-semantic-conventions >= 0.60b1 +BuildRequires: python3-packaging >= 26.2 BuildRequires: python3-pexpect >= 4.9.0 -BuildRequires: python3-pydantic >= 2.13.3 -BuildRequires: python3-pydantic-settings >= 2.14.0 +BuildRequires: python3-platformdirs >= 4.9.6 +BuildRequires: python3-protobuf >= 6.33.6 +BuildRequires: python3-ptyprocess >= 0.7.0 +BuildRequires: python3-pyasn1 >= 0.6.3 +BuildRequires: python3-pyasn1-modules >= 0.4.2 +BuildRequires: python3-pycparser >= 3.0 +BuildRequires: python3-pydantic >= 2.13.4 +BuildRequires: python3-pydantic-settings >= 2.14.2 +BuildRequires: python3-pygments >= 2.20.0 +BuildRequires: python3-PyJWT >= 2.13.0 BuildRequires: python3-pyperclip >= 1.11.0 BuildRequires: python3-pytest BuildRequires: python3-pytest-asyncio >= 1.2.0 BuildRequires: python3-pytest-textual-snapshot >= 1.1.0 BuildRequires: python3-pytest-timeout >= 2.4.0 +BuildRequires: python3-python-dateutil >= 2.9.0.post0 BuildRequires: python3-python-dotenv >= 1.2.2 +BuildRequires: python3-python-multipart >= 0.0.32 +BuildRequires: python3-referencing >= 0.37.0 BuildRequires: python3-respx >= 0.22.0 BuildRequires: python3-rich >= 15.0.0 +BuildRequires: python3-rpds-py >= 0.30.0 +BuildRequires: python3-SecretStorage >= 3.5.0 +# BuildRequires: python3-sentry-sdk >= 2.64.0 +BuildRequires: python3-sentry-sdk >= 2.63.0 BuildRequires: python3-sounddevice >= 0.5.5 +BuildRequires: python3-soupsieve >= 2.8.3 +BuildRequires: python3-sse-starlette >= 3.4.1 +BuildRequires: python3-starlette >= 1.0.0 BuildRequires: python3-syrupy +# BuildRequires: python3-textual >= 8.2.8 BuildRequires: python3-textual >= 8.2.7 BuildRequires: python3-textual-speedups >= 0.2.1 BuildRequires: python3-tomli-w >= 1.2.0 @@ -157,9 +235,17 @@ BuildRequires: python3-tree-sitter >= 0.25.2 BuildRequires: python3-tree-sitter-bash >= 0.25.1 BuildRequires: python3-truststore >= 0.10.4 +BuildRequires: python3-typing-extensions >= 4.15.0 +BuildRequires: python3-typing-inspection >= 0.4.2 +BuildRequires: python3-uc-micro-py >= 2.0.0 +BuildRequires: python3-urllib3 >= 2.7.0 BuildRequires: python3-uv +# BuildRequires: python3-uvicorn >= 0.46.0 +BuildRequires: python3-uvicorn >= 0.41.0 +# BuildRequires: python3-watchfiles >= 1.2.0 BuildRequires: python3-watchfiles >= 1.1.1 BuildRequires: python3-websockets >= 16.0 +BuildRequires: python3-zipp >= 3.23.1 BuildRequires: python3-zstandard >= 0.25.0 # /SECTION @@ -170,7 +256,7 @@ with your projects through a powerful set of tools. %prep -%autosetup -p1 -n mistral_vibe-%{version} +%autosetup -p1 %build %python3_pyproject_wheel @@ -180,6 +266,7 @@ %fdupes %{buildroot}%{python3_sitelib} %check +export PYTHONTRACEMALLOC=20 PYTEST_ADDOPTS="--ignore=tests/audio_player/test_audio_player.py --timeout=60" export PYTEST_ADDOPTS+=" --ignore=tests/audio_recorder/test_audio_recorder.py" export PYTEST_ADDOPTS+=" --ignore=tests/snapshots" ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.u38nV2/_old 2026-07-08 17:37:50.692210097 +0200 +++ /var/tmp/diff_new_pack.u38nV2/_new 2026-07-08 17:37:50.696210237 +0200 @@ -1,5 +1,5 @@ -mtime: 1781959588 -commit: 88142f6781329576fcd2ea14cacf231afde6487984a7756803d24d8482291710 +mtime: 1783372975 +commit: 42b0f1df6985e78456979ce67db9e449ebd9a77fa7d05b0930f5e479232c39b0 url: https://src.opensuse.org/AI/mistral-vibe.git revision: factory ++++++ build-tests.patch ++++++ --- /var/tmp/diff_new_pack.u38nV2/_old 2026-07-08 17:37:50.708210655 +0200 +++ /var/tmp/diff_new_pack.u38nV2/_new 2026-07-08 17:37:50.712210794 +0200 @@ -11,10 +11,10 @@ tests/test_install_script.py | 3 +++ 10 files changed, 21 insertions(+), 1 deletion(-) -Index: mistral_vibe-2.15.0/pyproject.toml +Index: mistral_vibe-2.18.0/pyproject.toml =================================================================== ---- mistral_vibe-2.15.0.orig/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/pyproject.toml 2026-06-12 17:37:46.207098733 +0200 +--- mistral_vibe-2.18.0.orig/pyproject.toml 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/pyproject.toml 2026-06-27 18:19:01.065915152 +0200 @@ -254,8 +254,11 @@ ignore_decorators = ["@*"] @@ -28,10 +28,10 @@ filterwarnings = [ # (e2e) streaming mock server is started in a thread; and the cli is spawn in a fork "ignore:This process \\(pid=.*\\) is multi-threaded, use of forkpty\\(\\) may lead to deadlocks in the child\\.:DeprecationWarning", -Index: mistral_vibe-2.15.0/tests/acp/test_acp.py +Index: mistral_vibe-2.18.0/tests/acp/test_acp.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/acp/test_acp.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/acp/test_acp.py 2026-06-12 17:37:46.207534464 +0200 +--- mistral_vibe-2.18.0.orig/tests/acp/test_acp.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/acp/test_acp.py 2026-06-27 18:19:01.066429231 +0200 @@ -39,6 +39,7 @@ RESPONSE_TIMEOUT = 2.0 MOCK_ENTRYPOINT_PATH = "tests/mock/mock_entrypoint.py" @@ -40,10 +40,10 @@ def deep_merge(target: dict, source: dict) -> None: -Index: mistral_vibe-2.15.0/tests/acp/test_acp_entrypoint_smoke.py +Index: mistral_vibe-2.18.0/tests/acp/test_acp_entrypoint_smoke.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/acp/test_acp_entrypoint_smoke.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/acp/test_acp_entrypoint_smoke.py 2026-06-12 17:37:46.208093366 +0200 +--- mistral_vibe-2.18.0.orig/tests/acp/test_acp_entrypoint_smoke.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/acp/test_acp_entrypoint_smoke.py 2026-06-27 18:19:01.066873128 +0200 @@ -21,6 +21,8 @@ "Sign into Mistral Vibe through your Mistral AI Studio account." ) @@ -53,10 +53,10 @@ class _AcpSmokeClient(Client): def on_connect(self, conn: Any) -> None: -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_fresh_install.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_fresh_install.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_fresh_install.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_fresh_install.py 2026-06-12 17:37:46.208268065 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_fresh_install.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_fresh_install.py 2026-06-27 18:19:01.067175929 +0200 @@ -62,6 +62,7 @@ return _venv_executable(venv_path, "vibe") @@ -65,10 +65,10 @@ @pytest.mark.timeout(90) def test_fresh_wheel_install_can_spawn_cli_and_complete_happy_path( streaming_mock_server: StreamingMockServer, -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_hooks.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_hooks.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_hooks.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_hooks.py 2026-06-12 17:37:46.208452002 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_hooks.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_hooks.py 2026-06-27 18:19:01.067438023 +0200 @@ -19,6 +19,8 @@ ) from tests.e2e.mock_server import StreamingMockServer @@ -78,10 +78,10 @@ def _enable_hooks(vibe_home: Path, invocation_path: Path) -> None: config_path = vibe_home / "config.toml" -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_onboarding.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_onboarding.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_onboarding.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_onboarding.py 2026-06-12 17:37:46.208591665 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_onboarding.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_onboarding.py 2026-06-27 18:19:01.067643300 +0200 @@ -7,6 +7,8 @@ from tests.e2e.common import SpawnedVibeProcessFixture, ansi_tolerant_pattern @@ -91,10 +91,10 @@ @pytest.mark.timeout(15) def test_spawn_cli_shows_onboarding_when_api_key_missing( -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_session_exit.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_session_exit.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_session_exit.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_session_exit.py 2026-06-12 17:37:46.208755223 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_session_exit.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_session_exit.py 2026-06-27 18:19:01.067849499 +0200 @@ -23,6 +23,8 @@ from tests.e2e.mock_server import StreamingMockServer from vibe.core.utils.io import read_safe @@ -104,10 +104,10 @@ def _usage_by_run_factory( request_index: int, _payload: object -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_streaming.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_streaming.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_streaming.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_streaming.py 2026-06-12 17:37:46.208915956 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_streaming.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_streaming.py 2026-06-27 18:19:01.068003840 +0200 @@ -14,6 +14,8 @@ ) from tests.e2e.mock_server import StreamingMockServer @@ -117,10 +117,10 @@ @pytest.mark.timeout(15) def test_spawn_cli_to_send_and_receive_message( -Index: mistral_vibe-2.15.0/tests/e2e/test_cli_tui_tool_approval.py +Index: mistral_vibe-2.18.0/tests/e2e/test_cli_tui_tool_approval.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/e2e/test_cli_tui_tool_approval.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/e2e/test_cli_tui_tool_approval.py 2026-06-12 17:37:46.209054767 +0200 +--- mistral_vibe-2.18.0.orig/tests/e2e/test_cli_tui_tool_approval.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/e2e/test_cli_tui_tool_approval.py 2026-06-27 18:19:01.068158321 +0200 @@ -14,6 +14,8 @@ ) from tests.e2e.mock_server import ChatCompletionsRequestPayload, StreamingMockServer @@ -130,10 +130,10 @@ PREDICTABLE_OUTPUT = "__E2E_BASH_OK__" TOOL_ARGUMENTS = f'{{"command":"printf \\"{PREDICTABLE_OUTPUT}\\\\n\\""}}' -Index: mistral_vibe-2.15.0/tests/test_install_script.py +Index: mistral_vibe-2.18.0/tests/test_install_script.py =================================================================== ---- mistral_vibe-2.15.0.orig/tests/test_install_script.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.15.0/tests/test_install_script.py 2026-06-12 17:37:46.209215450 +0200 +--- mistral_vibe-2.18.0.orig/tests/test_install_script.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/test_install_script.py 2026-06-27 18:19:01.068321579 +0200 @@ -6,6 +6,8 @@ import subprocess from textwrap import dedent ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-07-06 23:22:55.000000000 +0200 @@ -0,0 +1,8 @@ +.assets +_build.* +*.obscpio +*.obsinfo +*.osc +.pbuild +_service:* +mistral-vibe-*-build/ ++++++ fix_tests.patch ++++++ --- /var/tmp/diff_new_pack.u38nV2/_old 2026-07-08 17:37:50.904217486 +0200 +++ /var/tmp/diff_new_pack.u38nV2/_new 2026-07-08 17:37:50.908217626 +0200 @@ -3,10 +3,10 @@ vibe/core/tools/builtins/grep.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) -Index: mistral_vibe-2.17.1/tests/core/test_build_ssl_context.py +Index: mistral_vibe-2.18.0/tests/core/test_build_ssl_context.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/core/test_build_ssl_context.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/core/test_build_ssl_context.py 2026-06-20 13:00:25.136425289 +0200 +--- mistral_vibe-2.18.0.orig/tests/core/test_build_ssl_context.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/tests/core/test_build_ssl_context.py 2026-06-27 18:19:04.204793481 +0200 @@ -28,6 +28,7 @@ mock_ctx = MagicMock(spec=ssl.SSLContext) @@ -15,10 +15,10 @@ patch("vibe.core.utils.http.certifi.where", return_value="/certifi.pem"), patch( "vibe.core.utils.http.ssl.create_default_context", return_value=mock_ctx -Index: mistral_vibe-2.17.1/vibe/core/tools/builtins/grep.py +Index: mistral_vibe-2.18.0/vibe/core/tools/builtins/grep.py =================================================================== ---- mistral_vibe-2.17.1.orig/vibe/core/tools/builtins/grep.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/vibe/core/tools/builtins/grep.py 2026-06-20 13:00:25.136894533 +0200 +--- mistral_vibe-2.18.0.orig/vibe/core/tools/builtins/grep.py 2020-02-02 01:00:00.000000000 +0100 ++++ mistral_vibe-2.18.0/vibe/core/tools/builtins/grep.py 2026-06-27 18:19:04.205111190 +0200 @@ -241,7 +241,7 @@ "--no-heading", "--with-filename", ++++++ no_terminal.patch ++++++ --- /var/tmp/diff_new_pack.u38nV2/_old 2026-07-08 17:37:50.928218323 +0200 +++ /var/tmp/diff_new_pack.u38nV2/_new 2026-07-08 17:37:50.932218462 +0200 @@ -1,16 +1,23 @@ --- - pyproject.toml | 1 + - tests/e2e/agent_loop_characterization/test_resume.py | 1 + - tests/e2e/agent_loop_characterization/test_subagents.py | 1 + - tests/e2e/agent_loop_characterization/test_tool_execution.py | 4 +++- - tests/e2e/agent_loop_characterization/test_tool_permissions.py | 2 ++ - tests/e2e/agent_loop_characterization/test_user_interaction.py | 1 + - 6 files changed, 9 insertions(+), 1 deletion(-) + pyproject.toml | 1 + tests/cli/test_ui_clipboard_notifications.py | 1 + tests/cli/test_ui_session_incremental_renderer.py | 2 + tests/cli/textual_ui/test_manual_command_output_cap.py | 2 + tests/cli/textual_ui/test_message_queue_ui.py | 1 + tests/e2e/agent_loop_characterization/test_resume.py | 1 + tests/e2e/agent_loop_characterization/test_subagents.py | 1 + tests/e2e/agent_loop_characterization/test_tool_execution.py | 3 + tests/e2e/agent_loop_characterization/test_tool_permissions.py | 2 + tests/e2e/agent_loop_characterization/test_user_interaction.py | 1 + tests/onboarding/test_ui_onboarding.py | 69 ++++++---- + tests/tools/test_ui_bash_execution.py | 2 + tests/vscode_extension_promo/test_ui_vscode_extension_promo.py | 2 + 13 files changed, 61 insertions(+), 27 deletions(-) -Index: mistral_vibe-2.17.1/pyproject.toml +Index: mistral-vibe-2.19.0/pyproject.toml =================================================================== ---- mistral_vibe-2.17.1.orig/pyproject.toml 2026-06-20 14:13:38.663411326 +0200 -+++ mistral_vibe-2.17.1/pyproject.toml 2026-06-20 14:13:38.691643681 +0200 +--- mistral-vibe-2.19.0.orig/pyproject.toml 2026-07-04 23:28:25.172425175 +0200 ++++ mistral-vibe-2.19.0/pyproject.toml 2026-07-04 23:28:25.198714447 +0200 @@ -258,6 +258,7 @@ timeout = 10 markers = [ @@ -19,10 +26,75 @@ ] filterwarnings = [ # (e2e) streaming mock server is started in a thread; and the cli is spawn in a fork -Index: mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_resume.py +Index: mistral-vibe-2.19.0/tests/cli/test_ui_clipboard_notifications.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/e2e/agent_loop_characterization/test_resume.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_resume.py 2026-06-20 14:42:17.250159252 +0200 +--- mistral-vibe-2.19.0.orig/tests/cli/test_ui_clipboard_notifications.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/cli/test_ui_clipboard_notifications.py 2026-07-04 23:28:25.198981511 +0200 +@@ -23,6 +23,7 @@ + return (self._selected_text, "\n") + + [email protected] + @pytest.mark.asyncio + async def test_ui_clipboard_notification_does_not_crash_on_markup_text( + monkeypatch: pytest.MonkeyPatch, vibe_app: VibeApp +Index: mistral-vibe-2.19.0/tests/cli/test_ui_session_incremental_renderer.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/cli/test_ui_session_incremental_renderer.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/cli/test_ui_session_incremental_renderer.py 2026-07-04 23:28:25.199254867 +0200 +@@ -86,6 +86,7 @@ + assert "(" in str(label) + + [email protected] + @pytest.mark.asyncio + async def test_ui_session_incremental_loader_load_more_shows_remaining_count( + vibe_config: VibeConfig, +@@ -119,6 +120,7 @@ + ) + + [email protected] + @pytest.mark.asyncio + async def test_ui_session_incremental_loader_load_more_batches_until_done( + vibe_config: VibeConfig, +Index: mistral-vibe-2.19.0/tests/cli/textual_ui/test_manual_command_output_cap.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/cli/textual_ui/test_manual_command_output_cap.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/cli/textual_ui/test_manual_command_output_cap.py 2026-07-04 23:28:25.199457850 +0200 +@@ -116,13 +116,13 @@ + chat_input.value = cmd + await pilot.press("enter") + +- deadline = time.monotonic() + 2.0 ++ deadline = time.monotonic() + 5.0 + while time.monotonic() < deadline: +- if next(iter(app.query(BashOutputMessage)), None): ++ if (msg := next(iter(app.query(BashOutputMessage)), None)) and not msg._pending: + break + await pilot.pause(0.05) + +- injected = app.agent_loop.messages[-1] ++ injected = next(m for m in reversed(app.agent_loop.messages) if m.injected and m.role == Role.user) + assert injected.role == Role.user + assert injected.injected is True + assert injected.content is not None +Index: mistral-vibe-2.19.0/tests/cli/textual_ui/test_message_queue_ui.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/cli/textual_ui/test_message_queue_ui.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/cli/textual_ui/test_message_queue_ui.py 2026-07-04 23:28:25.199730475 +0200 +@@ -13,6 +13,7 @@ + WarningMessage, + ) + ++pytestmark = pytest.mark.terminal + + @pytest.fixture + def vibe_app() -> VibeApp: +Index: mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_resume.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/e2e/agent_loop_characterization/test_resume.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_resume.py 2026-07-04 23:28:25.199951823 +0200 @@ -138,6 +138,7 @@ return assistant_text_chunks(RESUME_RESUMED_TURN_RESPONSE, created=60) @@ -31,10 +103,10 @@ @pytest.mark.timeout(35) @pytest.mark.parametrize( "streaming_mock_server", -Index: mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_subagents.py +Index: mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_subagents.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/e2e/agent_loop_characterization/test_subagents.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_subagents.py 2026-06-20 14:22:22.132524977 +0200 +--- mistral-vibe-2.19.0.orig/tests/e2e/agent_loop_characterization/test_subagents.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_subagents.py 2026-07-04 23:28:25.200214628 +0200 @@ -43,6 +43,7 @@ return assistant_text_chunks("Parent used the subagent result.", created=110) @@ -43,10 +115,10 @@ @pytest.mark.timeout(30) @pytest.mark.parametrize( "streaming_mock_server", -Index: mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_tool_execution.py +Index: mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_tool_execution.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/e2e/agent_loop_characterization/test_tool_execution.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_tool_execution.py 2026-06-20 14:24:03.441495019 +0200 +--- mistral-vibe-2.19.0.orig/tests/e2e/agent_loop_characterization/test_tool_execution.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_tool_execution.py 2026-07-04 23:28:25.200437940 +0200 @@ -74,6 +74,7 @@ return assistant_text_chunks("Both todo reads completed.", created=170) @@ -60,22 +132,21 @@ [email protected] - @pytest.mark.timeout(25) + @pytest.mark.timeout(40) @pytest.mark.parametrize( "streaming_mock_server", -@@ -165,7 +167,7 @@ - expected=FAILING_BASH_STDERR, +@@ -166,6 +168,7 @@ ) -- + [email protected] @pytest.mark.timeout(25) @pytest.mark.parametrize( "streaming_mock_server", -Index: mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_tool_permissions.py +Index: mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_tool_permissions.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/e2e/agent_loop_characterization/test_tool_permissions.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_tool_permissions.py 2026-06-20 14:13:38.692301200 +0200 +--- mistral-vibe-2.19.0.orig/tests/e2e/agent_loop_characterization/test_tool_permissions.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_tool_permissions.py 2026-07-04 23:28:25.200622118 +0200 @@ -81,6 +81,7 @@ ) @@ -92,10 +163,10 @@ @pytest.mark.timeout(40) @pytest.mark.parametrize( "streaming_mock_server", -Index: mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_user_interaction.py +Index: mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_user_interaction.py =================================================================== ---- mistral_vibe-2.17.1.orig/tests/e2e/agent_loop_characterization/test_user_interaction.py 2020-02-02 01:00:00.000000000 +0100 -+++ mistral_vibe-2.17.1/tests/e2e/agent_loop_characterization/test_user_interaction.py 2026-06-20 14:13:38.692467975 +0200 +--- mistral-vibe-2.19.0.orig/tests/e2e/agent_loop_characterization/test_user_interaction.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/e2e/agent_loop_characterization/test_user_interaction.py 2026-07-04 23:28:25.200790996 +0200 @@ -60,6 +60,7 @@ return assistant_text_chunks("The selected mode was Fast.", created=80) @@ -104,4 +175,163 @@ @pytest.mark.timeout(25) @pytest.mark.parametrize( "streaming_mock_server", +Index: mistral-vibe-2.19.0/tests/onboarding/test_ui_onboarding.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/onboarding/test_ui_onboarding.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/onboarding/test_ui_onboarding.py 2026-07-04 23:28:25.201073209 +0200 +@@ -7,6 +7,7 @@ + import tomllib + from typing import cast + ++from unittest.mock import patch + import keyring + from keyring.errors import KeyringError + import pytest +@@ -308,9 +309,9 @@ + await _pass_welcome_screen(pilot) + await _pass_theme_selection_screen(pilot) + await _wait_for(lambda: isinstance(pilot.app.screen, ApiKeyScreen), pilot) ++ # Directly set the input widget's value to avoid typing 30 individual keys + input_widget = app.screen.query_one("#key", Input) +- await pilot.press(*api_key_value) +- assert input_widget.value == api_key_value ++ input_widget.value = api_key_value + await pilot.press("enter") + await _wait_for(lambda: app.return_value is not None, pilot, timeout=2.0) + +@@ -363,8 +364,9 @@ + await _show_auth_method(pilot) + await pilot.press("down", "enter") + await _wait_for(lambda: isinstance(pilot.app.screen, ApiKeyScreen), pilot) ++ # Directly set the input widget's value to avoid typing 30 individual keys + input_widget = app.screen.query_one("#key", Input) +- await pilot.press(*api_key_value) ++ input_widget.value = api_key_value + await pilot.press("enter") + await _wait_for(lambda: app.return_value is not None, pilot, timeout=2.0) + assert input_widget.value == api_key_value +@@ -477,7 +479,7 @@ + ) + app = _build_browser_onboarding_app( + browser_sign_in_service_factory=browser_sign_in_service_factory, +- browser_sign_in_url_help_delay=0.3, ++ browser_sign_in_url_help_delay=10.0, + ) + + async with app.run_test() as pilot: +@@ -493,6 +495,10 @@ + ) + assert _browser_sign_in_url_text(app.screen) == "" + ++ # Manually trigger the helper timer to display the sign-in URL help ++ screen = app.screen ++ screen._show_sign_in_url_help(screen._attempt_number, screen.state.sign_in_url) ++ + await _wait_for( + lambda: "copy this URL" in _browser_sign_in_url_text(app.screen), pilot + ) +@@ -745,31 +751,43 @@ + ) + app = _build_browser_onboarding_app( + browser_sign_in_service_factory=browser_sign_in_service_factory, +- browser_sign_in_success_delay=0.5, ++ browser_sign_in_success_delay=10.0, + ) + +- async with app.run_test() as pilot: +- await _show_browser_sign_in(pilot) +- await _wait_for( +- lambda: ( +- "Sign-in complete" +- in _browser_sign_in_step_text( +- _active_browser_sign_in_step_card(app.screen) +- ) +- ), +- pilot, +- ) +- assert isinstance(app.screen, BrowserSignInScreen) +- assert app.screen.state.variant == "success" +- hint = str(app.screen.query_one("#browser-sign-in-hint").render()) +- assert "Finishing setup..." in hint +- assert "Press m to enter API key manually - Esc to cancel" not in hint +- assert app.return_value is None +- assert "sk-browser-onboarding-test-key" in _saved_env_contents() +- await pilot.press("m", "escape") +- assert isinstance(app.screen, BrowserSignInScreen) +- assert app.return_value is None +- await _wait_for(lambda: app.return_value is not None, pilot, timeout=2.0) ++ sleep_event = asyncio.Event() ++ real_sleep = asyncio.sleep ++ ++ async def mock_sleep(delay, *args, **kwargs): ++ if delay == 10.0: ++ await sleep_event.wait() ++ else: ++ await real_sleep(delay, *args, **kwargs) ++ ++ with patch("vibe.setup.onboarding.screens.browser_sign_in.asyncio.sleep", new=mock_sleep): ++ async with app.run_test() as pilot: ++ await _show_browser_sign_in(pilot) ++ await _wait_for( ++ lambda: ( ++ "Sign-in complete" ++ in _browser_sign_in_step_text( ++ _active_browser_sign_in_step_card(app.screen) ++ ) ++ ), ++ pilot, ++ ) ++ assert isinstance(app.screen, BrowserSignInScreen) ++ assert app.screen.state.variant == "success" ++ hint = str(app.screen.query_one("#browser-sign-in-hint").render()) ++ assert "Finishing setup..." in hint ++ assert "Press m to enter API key manually - Esc to cancel" not in hint ++ assert app.return_value is None ++ assert "sk-browser-onboarding-test-key" in _saved_env_contents() ++ await pilot.press("m", "escape") ++ assert isinstance(app.screen, BrowserSignInScreen) ++ assert app.return_value is None ++ ++ sleep_event.set() ++ await _wait_for(lambda: app.return_value is not None, pilot, timeout=2.0) + + assert app.return_value == "completed" + assert "sk-browser-onboarding-test-key" in _saved_env_contents() +@@ -1055,7 +1073,9 @@ + assert "Finished setup" in _browser_sign_in_step_text(step_cards[2]) + await pilot.press("m") + await _wait_for(lambda: isinstance(pilot.app.screen, ApiKeyScreen), pilot) +- await pilot.press(*api_key_value) ++ # Directly set the input widget's value to avoid typing 30 individual keys ++ input_widget = app.screen.query_one("#key", Input) ++ input_widget.value = api_key_value + await pilot.press("enter") + await _wait_for(lambda: app.return_value is not None, pilot, timeout=2.0) + +Index: mistral-vibe-2.19.0/tests/tools/test_ui_bash_execution.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/tools/test_ui_bash_execution.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/tools/test_ui_bash_execution.py 2026-07-04 23:28:25.201569475 +0200 +@@ -13,6 +13,8 @@ + from vibe.cli.textual_ui.widgets.messages import BashOutputMessage, ErrorMessage + from vibe.core.types import Role + ++# Failing in OBS ++pytestmark = pytest.mark.terminal + + async def _wait_for_bash_output_message( + vibe_app: VibeApp, pilot, timeout: float = 1.0 +Index: mistral-vibe-2.19.0/tests/vscode_extension_promo/test_ui_vscode_extension_promo.py +=================================================================== +--- mistral-vibe-2.19.0.orig/tests/vscode_extension_promo/test_ui_vscode_extension_promo.py 2026-07-03 16:15:05.000000000 +0200 ++++ mistral-vibe-2.19.0/tests/vscode_extension_promo/test_ui_vscode_extension_promo.py 2026-07-04 23:28:25.201956335 +0200 +@@ -51,7 +51,7 @@ + ) + + +-async def _wait_for(predicate: Callable[[], bool], pilot, timeout: float = 1.0) -> None: ++async def _wait_for(predicate: Callable[[], bool], pilot, timeout: float = 10.0) -> None: + loop = asyncio.get_running_loop() + deadline = loop.time() + timeout + while loop.time() < deadline:
