voice-vibecoder 2.17.1__tar.gz → 2.17.2__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.1 → voice_vibecoder-2.17.2}/CHANGELOG.md +8 -0
  2. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/code_providers/openclaw.py +12 -8
  6. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/.github/workflows/ci.yml +0 -0
  7. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/.github/workflows/release.yml +0 -0
  8. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/.gitignore +0 -0
  9. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/LICENSE +0 -0
  10. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/README.md +0 -0
  11. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/app.py +0 -0
  12. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/index.html +0 -0
  13. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/app_config.py +0 -0
  14. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/audio.py +0 -0
  15. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/cli_serve.py +0 -0
  16. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  17. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/code_providers/claude.py +0 -0
  18. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  19. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/code_providers/registry.py +0 -0
  20. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/config.py +0 -0
  21. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/instances.py +0 -0
  22. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/server.py +0 -0
  23. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/session.py +0 -0
  24. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/__init__.py +0 -0
  25. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/agent_task.py +0 -0
  26. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/definitions.py +0 -0
  27. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/dispatch.py +0 -0
  28. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/file_tree.py +0 -0
  29. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/tools/handlers.py +0 -0
  30. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/__init__.py +0 -0
  31. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/callbacks.py +0 -0
  32. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/diff_view.py +0 -0
  33. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/help_modal.py +0 -0
  34. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/panels.py +0 -0
  35. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/screen.py +0 -0
  36. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/setup.py +0 -0
  37. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/state.py +0 -0
  38. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/styles.py +0 -0
  39. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/update_modal.py +0 -0
  40. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/ui/wizard.py +0 -0
  41. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  42. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
  43. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  44. {voice_vibecoder-2.17.1 → voice_vibecoder-2.17.2}/src/voice_vibecoder/worktrees.py +0 -0
@@ -2,6 +2,14 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v2.17.2 (2026-02-22)
6
+
7
+ ### Bug Fixes
8
+
9
+ - **openclaw**: Properly split buffered text into lines on flush
10
+ ([`4c65bc6`](https://github.com/snokam/voice-vibecoder/commit/4c65bc693054e03e58df552d1d8a6df195b4d32f))
11
+
12
+
5
13
  ## v2.17.1 (2026-02-22)
6
14
 
7
15
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-vibecoder
3
- Version: 2.17.1
3
+ Version: 2.17.2
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.1"
7
+ version = "2.17.2"
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.1"
6
+ __version__ = "2.17.2"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -249,13 +249,21 @@ class OpenClawRunner:
249
249
  prev_text_len = 0 # Track streamed text length for delta extraction
250
250
  line_buffer = "" # Buffer tokens until we have a complete line
251
251
 
252
- def _flush_lines(buf: str) -> str:
253
- """Emit complete lines from buffer, return the remaining partial line."""
252
+ def _flush_lines(buf: str, final: bool = False) -> str:
253
+ """Emit complete lines from buffer, return the remaining partial line.
254
+
255
+ When *final* is True, also emit whatever remains in the buffer.
256
+ """
254
257
  while "\n" in buf:
255
258
  line, buf = buf.split("\n", 1)
256
259
  line = line.strip()
257
260
  if line and on_output:
258
261
  on_output(AgentOutput(category="text", content=line))
262
+ if final:
263
+ remainder = buf.strip()
264
+ if remainder and on_output:
265
+ on_output(AgentOutput(category="text", content=remainder))
266
+ return ""
259
267
  return buf
260
268
 
261
269
  while True:
@@ -287,9 +295,7 @@ class OpenClawRunner:
287
295
 
288
296
  elif stream == "tool":
289
297
  # Flush any buffered text before showing tool output
290
- if line_buffer.strip() and on_output:
291
- on_output(AgentOutput(category="text", content=line_buffer.strip()))
292
- line_buffer = ""
298
+ line_buffer = _flush_lines(line_buffer, final=True)
293
299
  # Reset stream position so next assistant text starts fresh
294
300
  prev_text_len = len(result_text)
295
301
  name = agent_data.get("name", "")
@@ -312,9 +318,7 @@ class OpenClawRunner:
312
318
  state = payload.get("state")
313
319
  if state == "final":
314
320
  # Flush remaining buffered text
315
- if line_buffer.strip() and on_output:
316
- on_output(AgentOutput(category="text", content=line_buffer.strip()))
317
- line_buffer = ""
321
+ line_buffer = _flush_lines(line_buffer, final=True)
318
322
  # Get final message
319
323
  msg_content = payload.get("message", {})
320
324
  if isinstance(msg_content, dict) and "content" in msg_content: