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.
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/CHANGELOG.md +8 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/PKG-INFO +1 -1
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/pyproject.toml +1 -1
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/__init__.py +1 -1
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/audio.py +17 -4
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.github/workflows/ci.yml +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.github/workflows/release.yml +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/.gitignore +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/LICENSE +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/README.md +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/app.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/index.html +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/app_config.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/cli_serve.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/__init__.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/claude.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/cursor.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/registry.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/config.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/instances.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/server.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/session.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/__init__.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/agent_task.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/definitions.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/dispatch.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/file_tree.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/tools/handlers.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/__init__.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/callbacks.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/diff_view.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/help_modal.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/panels.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/screen.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/setup.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/state.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/styles.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/update_modal.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/ui/wizard.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
- {voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/openai.py +0 -0
- {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.
|
|
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.
|
|
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"
|
|
@@ -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
|
-
|
|
24
|
-
|
|
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__(
|
|
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
|
-
|
|
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")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/claude.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/cursor.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/openclaw.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/code_providers/registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/gemini.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.22.0 → voice_vibecoder-2.23.0}/src/voice_vibecoder/voice_providers/openai.py
RENAMED
|
File without changes
|
|
File without changes
|