voice-vibecoder 2.9.4__tar.gz → 2.9.5__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 (43) hide show
  1. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/CHANGELOG.md +8 -0
  2. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/code_providers/openclaw.py +30 -20
  6. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/.github/workflows/ci.yml +0 -0
  7. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/.github/workflows/release.yml +0 -0
  8. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/.gitignore +0 -0
  9. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/LICENSE +0 -0
  10. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/README.md +0 -0
  11. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/app.py +0 -0
  12. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/index.html +0 -0
  13. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/app_config.py +0 -0
  14. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/audio.py +0 -0
  15. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/cli_serve.py +0 -0
  16. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  17. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/code_providers/claude.py +0 -0
  18. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  19. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/code_providers/registry.py +0 -0
  20. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/config.py +0 -0
  21. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/instances.py +0 -0
  22. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/server.py +0 -0
  23. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/session.py +0 -0
  24. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/__init__.py +0 -0
  25. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/agent_task.py +0 -0
  26. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/definitions.py +0 -0
  27. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/dispatch.py +0 -0
  28. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/file_tree.py +0 -0
  29. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/tools/handlers.py +0 -0
  30. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/__init__.py +0 -0
  31. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/callbacks.py +0 -0
  32. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/diff_view.py +0 -0
  33. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/help_modal.py +0 -0
  34. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/panels.py +0 -0
  35. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/screen.py +0 -0
  36. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/setup.py +0 -0
  37. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/state.py +0 -0
  38. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/styles.py +0 -0
  39. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/update_modal.py +0 -0
  40. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/ui/wizard.py +0 -0
  41. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  42. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  43. {voice_vibecoder-2.9.4 → voice_vibecoder-2.9.5}/src/voice_vibecoder/worktrees.py +0 -0
@@ -2,6 +2,14 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v2.9.5 (2026-02-21)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Use chat.send method for gateway streaming
10
+ ([`a955747`](https://github.com/snokam/voice-vibecoder/commit/a955747a793514463f932376f0866cb140e364c6))
11
+
12
+
5
13
  ## v2.9.4 (2026-02-21)
6
14
 
7
15
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-vibecoder
3
- Version: 2.9.4
3
+ Version: 2.9.5
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.9.4"
7
+ version = "2.9.5"
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.9.4"
6
+ __version__ = "2.9.5"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -68,11 +68,7 @@ def _build_auth_payload(
68
68
  token: str | None,
69
69
  nonce: str | None,
70
70
  ) -> str:
71
- """Build the payload to sign for device auth.
72
-
73
- Format (v2 with nonce):
74
- v2|deviceId|clientId|clientMode|role|scopes|signedAtMs|token|nonce
75
- """
71
+ """Build the payload to sign for device auth."""
76
72
  scopes_str = ",".join(scopes)
77
73
  token_str = token or ""
78
74
 
@@ -235,19 +231,21 @@ class OpenClawRunner:
235
231
  """Run agent via WebSocket for streaming output."""
236
232
  try:
237
233
  req_id = str(uuid.uuid4())
238
- agent_req = {
234
+ idempotency_key = f"voice-{uuid.uuid4().hex[:16]}"
235
+
236
+ # Use chat.send method
237
+ chat_req = {
239
238
  "type": "req",
240
239
  "id": req_id,
241
- "method": "agent.run",
240
+ "method": "chat.send",
242
241
  "params": {
243
- "sessionId": session_id,
242
+ "sessionKey": session_id,
244
243
  "message": message,
245
- "cwd": cwd,
246
- "local": True
244
+ "idempotencyKey": idempotency_key,
247
245
  }
248
246
  }
249
247
 
250
- await ws.send(json.dumps(agent_req))
248
+ await ws.send(json.dumps(chat_req))
251
249
 
252
250
  result_text = ""
253
251
 
@@ -255,31 +253,41 @@ class OpenClawRunner:
255
253
  msg = await asyncio.wait_for(ws.recv(), timeout=300.0)
256
254
  data = json.loads(msg)
257
255
 
256
+ # Handle events (streaming output)
258
257
  if data.get("type") == "event":
259
258
  event = data.get("event", "")
260
259
  payload = data.get("payload", {})
261
260
 
262
- if event == "agent.output":
261
+ if event == "chat.chunk":
263
262
  text = payload.get("text", "")
264
263
  if text and on_output:
265
264
  on_output(AgentOutput(category="text", content=text))
266
- elif event == "agent.tool":
267
- tool = payload.get("tool", "")
265
+ result_text += text
266
+ elif event == "chat.tool":
267
+ tool = payload.get("name", payload.get("tool", ""))
268
268
  if on_output:
269
269
  on_output(AgentOutput(category="tool_call", content=f"[{tool}]"))
270
+ elif event == "chat.done":
271
+ # Final result
272
+ final_text = payload.get("text", "")
273
+ if final_text:
274
+ result_text = final_text
275
+ break
276
+ elif event == "chat.error":
277
+ error = payload.get("message", "Unknown error")
278
+ raise RuntimeError(f"Chat error: {error}")
270
279
 
280
+ # Handle response (initial ack)
271
281
  elif data.get("type") == "res" and data.get("id") == req_id:
272
- if data.get("ok"):
273
- result_text = data.get("payload", {}).get("result", "")
274
- else:
282
+ if not data.get("ok"):
275
283
  error = data.get("error", {}).get("message", "Unknown error")
276
- raise RuntimeError(f"Agent error: {error}")
277
- break
284
+ raise RuntimeError(f"Chat send error: {error}")
285
+ # Continue listening for events
278
286
 
279
287
  return AgentResult(text=result_text.strip(), session_id=session_id)
280
288
 
281
289
  except Exception as e:
282
- logger.warning("WebSocket agent run failed: %s", e)
290
+ logger.warning("WebSocket chat failed: %s", e)
283
291
  return None
284
292
 
285
293
  async def _run_via_cli(
@@ -342,6 +350,8 @@ class OpenClawRunner:
342
350
  ws = await self._connect_websocket()
343
351
  if ws:
344
352
  try:
353
+ if on_output:
354
+ on_output(AgentOutput(category="text", content="🦞 Connected! Streaming..."))
345
355
  result = await self._run_via_websocket(ws, message, cwd, effective_session, on_output)
346
356
  if result:
347
357
  return result
File without changes
File without changes