voice-vibecoder 2.17.4__tar.gz → 2.17.6__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.17.4 → voice_vibecoder-2.17.6}/CHANGELOG.md +16 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/PKG-INFO +1 -1
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/pyproject.toml +1 -1
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/__init__.py +1 -1
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/config.py +12 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/server.py +13 -2
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.github/workflows/ci.yml +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.github/workflows/release.yml +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.gitignore +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/LICENSE +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/README.md +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/app.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/index.html +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/app_config.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/audio.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/cli_serve.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/__init__.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/claude.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/cursor.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/registry.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/instances.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/session.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/__init__.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/agent_task.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/definitions.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/dispatch.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/file_tree.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/handlers.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/__init__.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/callbacks.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/diff_view.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/help_modal.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/panels.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/screen.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/setup.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/state.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/styles.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/update_modal.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/wizard.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/openai.py +0 -0
- {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/worktrees.py +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v2.17.6 (2026-02-23)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **server**: Make audio responses opt-in to reduce bandwidth
|
|
10
|
+
([`5816035`](https://github.com/snokam/voice-vibecoder/commit/5816035f2590ed92297c83e1a59c65ec92578b07))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v2.17.5 (2026-02-23)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- **server**: Make ui_command messages opt-in to reduce bandwidth
|
|
18
|
+
([`d1e3589`](https://github.com/snokam/voice-vibecoder/commit/d1e358932f07a52feded5458996d2f51f9f7e4d9))
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v2.17.4 (2026-02-22)
|
|
6
22
|
|
|
7
23
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voice-vibecoder
|
|
3
|
-
Version: 2.17.
|
|
3
|
+
Version: 2.17.6
|
|
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.17.
|
|
7
|
+
version = "2.17.6"
|
|
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"
|
|
@@ -48,6 +48,10 @@ med beskrivende navn.
|
|
|
48
48
|
- Si aldri "jeg sender dette til en agent" — si heller "Ser på det!" / "Et øyeblikk."
|
|
49
49
|
- Videresend brukerens ord NØYAKTIG til agenten. Ikke omskriv.
|
|
50
50
|
|
|
51
|
+
Hold samtalen i gang mens du venter — ikke la det bli stille. \
|
|
52
|
+
Småprat, kommentarer, humor — hva som helst som føles naturlig. \
|
|
53
|
+
Hvis en forespørsel tar tid, forklar kort hva du tenker eller gjør (uten å nevne agenter).
|
|
54
|
+
|
|
51
55
|
Når agenten er ferdig, lever resultatet som om DU fant svaret. \
|
|
52
56
|
Oppsummer kort i én-to setninger.
|
|
53
57
|
|
|
@@ -97,6 +101,10 @@ with a descriptive name.
|
|
|
97
101
|
- Never say "I'm sending this to an agent" — say "Looking into it!" / "One moment."
|
|
98
102
|
- Forward the user's words EXACTLY to the agent. Don't rewrite.
|
|
99
103
|
|
|
104
|
+
Keep the conversation going while you wait — never let it go silent. \
|
|
105
|
+
Small talk, comments, humor — whatever feels natural. \
|
|
106
|
+
If a request takes time, briefly explain what you're thinking or doing (without mentioning agents).
|
|
107
|
+
|
|
100
108
|
When the agent finishes, deliver the result as if YOU found the answer. \
|
|
101
109
|
Summarize briefly in one or two sentences.
|
|
102
110
|
|
|
@@ -146,6 +154,10 @@ med beskrivande namn.
|
|
|
146
154
|
- Säg aldrig "jag skickar detta till en agent" — säg hellre "Kollar på det!" / "Ett ögonblick."
|
|
147
155
|
- Vidarebefordra användarens ord EXAKT till agenten. Skriv inte om.
|
|
148
156
|
|
|
157
|
+
Håll samtalet igång medan du väntar — låt det aldrig bli tyst. \
|
|
158
|
+
Småprat, kommentarer, humor — vad som helst som känns naturligt. \
|
|
159
|
+
Om en förfrågan tar tid, förklara kort vad du tänker eller gör (utan att nämna agenter).
|
|
160
|
+
|
|
149
161
|
När agenten är klar, leverera resultatet som om DU hittade svaret. \
|
|
150
162
|
Sammanfatta kort i en till två meningar.
|
|
151
163
|
|
|
@@ -6,7 +6,7 @@ The browser sends/receives JSON frames — never talks to OpenAI directly.
|
|
|
6
6
|
|
|
7
7
|
Protocol (client -> server):
|
|
8
8
|
{"type": "auth", "token": "<JWT>"} — must be the first message when auth is enabled
|
|
9
|
-
{"type": "sync_state"}
|
|
9
|
+
{"type": "sync_state", "audio": true, "ui_commands": true} — full state sync (audio/ui_commands opt in)
|
|
10
10
|
{"type": "audio", "data": "<base64 PCM16 24kHz>"}
|
|
11
11
|
{"type": "audio.commit"}
|
|
12
12
|
{"type": "update_settings", "settings": {...}} — partial settings update, reconnects provider
|
|
@@ -109,6 +109,8 @@ class WebSocketBridge:
|
|
|
109
109
|
self._user_email = user_email
|
|
110
110
|
self._user_jwt = user_jwt
|
|
111
111
|
self._messages_task: asyncio.Task | None = None
|
|
112
|
+
self._ui_commands_enabled = False
|
|
113
|
+
self._audio_enabled = False
|
|
112
114
|
|
|
113
115
|
async def run(self) -> None:
|
|
114
116
|
provider = create_provider(self._settings)
|
|
@@ -179,7 +181,12 @@ class WebSocketBridge:
|
|
|
179
181
|
elif msg_type == "update_settings":
|
|
180
182
|
await self._handle_settings_update(msg.get("settings", {}))
|
|
181
183
|
elif msg_type == "sync_state":
|
|
182
|
-
# Frontend requests full state sync from backend
|
|
184
|
+
# Frontend requests full state sync from backend.
|
|
185
|
+
# Opt-in to ui_command messages (file_tree, show_diff, etc.)
|
|
186
|
+
if msg.get("ui_commands"):
|
|
187
|
+
self._ui_commands_enabled = True
|
|
188
|
+
if msg.get("audio"):
|
|
189
|
+
self._audio_enabled = True
|
|
183
190
|
self._send({"type": "status", "status": "syncing"})
|
|
184
191
|
await self._sync_state_to_frontend()
|
|
185
192
|
self._send({"type": "status", "status": "ready"})
|
|
@@ -286,6 +293,8 @@ class WebSocketBridge:
|
|
|
286
293
|
logger.warning("Failed to send WS frame", exc_info=True)
|
|
287
294
|
|
|
288
295
|
def _on_audio(self, base64_chunk: str) -> None:
|
|
296
|
+
if not self._audio_enabled:
|
|
297
|
+
return
|
|
289
298
|
self._send({"type": "audio", "data": base64_chunk})
|
|
290
299
|
|
|
291
300
|
def _on_transcript(self, role: str, text: str) -> None:
|
|
@@ -315,6 +324,8 @@ class WebSocketBridge:
|
|
|
315
324
|
self._send({"type": "tool_call", "name": name, "arguments": arguments})
|
|
316
325
|
|
|
317
326
|
def _on_ui_command(self, instance_id: str, action: str, data: Any) -> None:
|
|
327
|
+
if not self._ui_commands_enabled:
|
|
328
|
+
return
|
|
318
329
|
self._send({"type": "ui_command", "instanceId": instance_id, "action": action, "data": data})
|
|
319
330
|
|
|
320
331
|
def _on_interrupt(self) -> None:
|
|
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.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/claude.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/cursor.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/openclaw.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/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
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/gemini.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/openai.py
RENAMED
|
File without changes
|
|
File without changes
|