voice-vibecoder 2.22.0__tar.gz → 2.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/CHANGELOG.md +8 -0
  2. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/audio.py +17 -4
  6. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.github/workflows/ci.yml +0 -0
  7. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.github/workflows/release.yml +0 -0
  8. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.gitignore +0 -0
  9. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/LICENSE +0 -0
  10. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/README.md +0 -0
  11. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/app.py +0 -0
  12. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/index.html +0 -0
  13. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/app_config.py +0 -0
  14. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/cli_serve.py +0 -0
  15. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  16. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/claude.py +0 -0
  17. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  18. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
  19. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/registry.py +0 -0
  20. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/config.py +0 -0
  21. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/instances.py +0 -0
  22. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/server.py +0 -0
  23. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/session.py +0 -0
  24. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/__init__.py +0 -0
  25. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/agent_task.py +0 -0
  26. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/definitions.py +0 -0
  27. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/dispatch.py +0 -0
  28. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/file_tree.py +0 -0
  29. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/handlers.py +0 -0
  30. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/__init__.py +0 -0
  31. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/callbacks.py +0 -0
  32. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/diff_view.py +0 -0
  33. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/help_modal.py +0 -0
  34. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/panels.py +0 -0
  35. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/screen.py +0 -0
  36. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/setup.py +0 -0
  37. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/state.py +0 -0
  38. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/styles.py +0 -0
  39. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/update_modal.py +0 -0
  40. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/wizard.py +0 -0
  41. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  42. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
  43. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  44. {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/worktrees.py +0 -0
@@ -2,6 +2,14 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v2.23.0 (2026-06-30)
6
+
7
+ ### Features
8
+
9
+ - **audio**: Full-duplex barge-in (interrupt the model mid-response)
10
+ ([`0a8d90d`](https://github.com/snokam/voice-vibecoder/commit/0a8d90db88314e4fcdf7aea9bb05d7c393cfc68d))
11
+
12
+
5
13
  ## v2.22.0 (2026-06-30)
6
14
 
7
15
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-vibecoder
3
- Version: 2.22.0
3
+ Version: 2.23.0
4
4
  Summary: Olaf The Vibecoder — a voice-controlled coding assistant using OpenAI Realtime API + Claude Code
5
5
  Project-URL: Homepage, https://github.com/snokam/voice-vibecoder
6
6
  Project-URL: Repository, https://github.com/snokam/voice-vibecoder
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "voice-vibecoder"
7
- version = "2.22.0"
7
+ version = "2.23.0"
8
8
  description = "Olaf The Vibecoder — a voice-controlled coding assistant using OpenAI Realtime API + Claude Code"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -3,7 +3,7 @@
3
3
  A voice-controlled coding assistant using OpenAI Realtime API + Claude Code.
4
4
  """
5
5
 
6
- __version__ = "2.22.0"
6
+ __version__ = "2.23.0"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -20,12 +20,23 @@ class AudioManager:
20
20
  """Manages mic input and speaker output for the Realtime API.
21
21
 
22
22
  Audio format: PCM16, 24 kHz, mono — matches OpenAI Realtime requirements.
23
- Auto-suppresses mic input while playing back audio to prevent
24
- speaker-to-mic feedback from triggering the server VAD.
23
+
24
+ `barge_in` (default True) keeps the mic open during playback so the server
25
+ VAD can hear the user and interrupt the response mid-sentence — the natural
26
+ voice-assistant behaviour. The trade-off is that it requires headphones: on
27
+ open speakers the model's own audio echoes back into the mic and it will
28
+ interrupt itself. Set `barge_in=False` for the old half-duplex mode that
29
+ suppresses the mic while audio is playing (no echo, but no barge-in).
25
30
  """
26
31
 
27
- def __init__(self, on_audio_chunk: Callable[[str], None]) -> None:
32
+ def __init__(
33
+ self,
34
+ on_audio_chunk: Callable[[str], None],
35
+ *,
36
+ barge_in: bool = True,
37
+ ) -> None:
28
38
  self._on_audio_chunk = on_audio_chunk
39
+ self._barge_in = barge_in
29
40
  self._input_stream: sd.InputStream | None = None
30
41
  self._output_stream: sd.OutputStream | None = None
31
42
  self._playback_queue: queue.Queue[bytes] = queue.Queue()
@@ -88,7 +99,9 @@ class AudioManager:
88
99
  break
89
100
 
90
101
  def _mic_callback(self, indata: np.ndarray, frames: int, time_info, status) -> None:
91
- if self._muted or self._playing or not self._running:
102
+ # In half-duplex mode the mic is suppressed while audio plays; in
103
+ # barge-in mode it stays open so the server VAD can interrupt playback.
104
+ if self._muted or not self._running or (self._playing and not self._barge_in):
92
105
  return
93
106
  pcm_bytes = indata.tobytes()
94
107
  encoded = base64.b64encode(pcm_bytes).decode("ascii")