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.
Files changed (44) hide show
  1. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/CHANGELOG.md +16 -0
  2. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/config.py +12 -0
  6. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/server.py +13 -2
  7. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.github/workflows/ci.yml +0 -0
  8. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.github/workflows/release.yml +0 -0
  9. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/.gitignore +0 -0
  10. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/LICENSE +0 -0
  11. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/README.md +0 -0
  12. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/app.py +0 -0
  13. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/index.html +0 -0
  14. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/app_config.py +0 -0
  15. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/audio.py +0 -0
  16. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/cli_serve.py +0 -0
  17. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  18. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/claude.py +0 -0
  19. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  20. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
  21. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/code_providers/registry.py +0 -0
  22. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/instances.py +0 -0
  23. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/session.py +0 -0
  24. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/__init__.py +0 -0
  25. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/agent_task.py +0 -0
  26. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/definitions.py +0 -0
  27. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/dispatch.py +0 -0
  28. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/file_tree.py +0 -0
  29. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/tools/handlers.py +0 -0
  30. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/__init__.py +0 -0
  31. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/callbacks.py +0 -0
  32. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/diff_view.py +0 -0
  33. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/help_modal.py +0 -0
  34. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/panels.py +0 -0
  35. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/screen.py +0 -0
  36. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/setup.py +0 -0
  37. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/state.py +0 -0
  38. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/styles.py +0 -0
  39. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/update_modal.py +0 -0
  40. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/ui/wizard.py +0 -0
  41. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  42. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
  43. {voice_vibecoder-2.17.4 → voice_vibecoder-2.17.6}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  44. {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.4
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.4"
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"
@@ -3,7 +3,7 @@
3
3
  A voice-controlled coding assistant using OpenAI Realtime API + Claude Code.
4
4
  """
5
5
 
6
- __version__ = "2.17.4"
6
+ __version__ = "2.17.6"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -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"} request full state sync from backend
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: