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:
 

Reply via email to