voice-vibecoder 2.9.0__tar.gz → 2.9.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 (43) hide show
  1. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/CHANGELOG.md +16 -0
  2. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/openclaw.py +6 -14
  6. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.github/workflows/ci.yml +0 -0
  7. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.github/workflows/release.yml +0 -0
  8. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.gitignore +0 -0
  9. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/LICENSE +0 -0
  10. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/README.md +0 -0
  11. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/app.py +0 -0
  12. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/index.html +0 -0
  13. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/app_config.py +0 -0
  14. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/audio.py +0 -0
  15. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/cli_serve.py +0 -0
  16. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  17. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/claude.py +0 -0
  18. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  19. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/registry.py +0 -0
  20. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/config.py +0 -0
  21. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/instances.py +0 -0
  22. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/server.py +0 -0
  23. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/session.py +0 -0
  24. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/__init__.py +0 -0
  25. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/agent_task.py +0 -0
  26. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/definitions.py +0 -0
  27. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/dispatch.py +0 -0
  28. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/file_tree.py +0 -0
  29. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/handlers.py +0 -0
  30. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/__init__.py +0 -0
  31. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/callbacks.py +0 -0
  32. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/diff_view.py +0 -0
  33. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/help_modal.py +0 -0
  34. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/panels.py +0 -0
  35. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/screen.py +0 -0
  36. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/setup.py +0 -0
  37. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/state.py +0 -0
  38. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/styles.py +0 -0
  39. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/update_modal.py +0 -0
  40. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/wizard.py +0 -0
  41. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  42. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  43. {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/worktrees.py +0 -0
@@ -2,6 +2,22 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v2.9.2 (2026-02-21)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Use mode=cli for gateway connect
10
+ ([`2606052`](https://github.com/snokam/voice-vibecoder/commit/2606052c59b7c6f2bd98f60c9e531d1838e9af3c))
11
+
12
+
13
+ ## v2.9.1 (2026-02-21)
14
+
15
+ ### Bug Fixes
16
+
17
+ - Correct connect params for gateway protocol
18
+ ([`89589e2`](https://github.com/snokam/voice-vibecoder/commit/89589e2d732d21f2f3225b005eff7c33b8f18d77))
19
+
20
+
5
21
  ## v2.9.0 (2026-02-21)
6
22
 
7
23
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-vibecoder
3
- Version: 2.9.0
3
+ Version: 2.9.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.9.0"
7
+ version = "2.9.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.9.0"
6
+ __version__ = "2.9.2"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -8,11 +8,9 @@ from __future__ import annotations
8
8
 
9
9
  import asyncio
10
10
  import base64
11
- import hashlib
12
11
  import json
13
12
  import logging
14
13
  import os
15
- import time
16
14
  import uuid
17
15
  from typing import Any, Awaitable, Callable
18
16
 
@@ -20,7 +18,6 @@ from voice_vibecoder.code_providers import AgentOutput, AgentResult
20
18
 
21
19
  logger = logging.getLogger(__name__)
22
20
 
23
- # Try to import cryptography for Ed25519 signing
24
21
  try:
25
22
  from cryptography.hazmat.primitives import serialization
26
23
  from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
@@ -87,7 +84,6 @@ class OpenClawRunner:
87
84
  self._task: asyncio.Task | None = None
88
85
  self._ws = None
89
86
 
90
- # Load device identity
91
87
  self._device_id, self._private_key, self._device_token = _load_device_keys(self._state_dir)
92
88
 
93
89
  async def _connect_websocket(self) -> Any:
@@ -130,7 +126,7 @@ class OpenClawRunner:
130
126
  )
131
127
  public_key_b64 = base64.urlsafe_b64encode(public_key_bytes).decode().rstrip("=")
132
128
 
133
- # Send connect request
129
+ # Send connect request - match CLI format exactly
134
130
  connect_req = {
135
131
  "type": "req",
136
132
  "id": str(uuid.uuid4()),
@@ -139,17 +135,19 @@ class OpenClawRunner:
139
135
  "minProtocol": 3,
140
136
  "maxProtocol": 3,
141
137
  "client": {
142
- "id": "voice-server",
138
+ "id": "cli", # Must be "cli" for operator role
143
139
  "version": "1.0.0",
144
140
  "platform": "linux",
145
- "mode": "backend"
141
+ "mode": "cli" # Must be "operator"
146
142
  },
147
143
  "role": "operator",
148
144
  "scopes": ["operator.read", "operator.write"],
149
145
  "caps": [],
150
146
  "commands": [],
151
147
  "permissions": {},
152
- "auth": {"deviceToken": self._device_token} if self._device_token else {},
148
+ "auth": {"token": self._device_token} if self._device_token else {},
149
+ "locale": "en-US",
150
+ "userAgent": "voice-server/1.0.0",
153
151
  "device": {
154
152
  "id": self._device_id,
155
153
  "publicKey": public_key_b64,
@@ -189,7 +187,6 @@ class OpenClawRunner:
189
187
  ) -> AgentResult | None:
190
188
  """Run agent via WebSocket for streaming output."""
191
189
  try:
192
- # Send agent request
193
190
  req_id = str(uuid.uuid4())
194
191
  agent_req = {
195
192
  "type": "req",
@@ -207,12 +204,10 @@ class OpenClawRunner:
207
204
 
208
205
  result_text = ""
209
206
 
210
- # Read streaming responses
211
207
  while True:
212
208
  msg = await asyncio.wait_for(ws.recv(), timeout=300.0)
213
209
  data = json.loads(msg)
214
210
 
215
- # Handle events (streaming output)
216
211
  if data.get("type") == "event":
217
212
  event = data.get("event", "")
218
213
  payload = data.get("payload", {})
@@ -226,7 +221,6 @@ class OpenClawRunner:
226
221
  if on_output:
227
222
  on_output(AgentOutput(category="tool_call", content=f"[{tool}]"))
228
223
 
229
- # Handle response (completion)
230
224
  elif data.get("type") == "res" and data.get("id") == req_id:
231
225
  if data.get("ok"):
232
226
  result_text = data.get("payload", {}).get("result", "")
@@ -298,7 +292,6 @@ class OpenClawRunner:
298
292
  if on_output:
299
293
  on_output(AgentOutput(category="text", content="🦞 Connecting to OpenClaw..."))
300
294
 
301
- # Try WebSocket first
302
295
  ws = await self._connect_websocket()
303
296
  if ws:
304
297
  try:
@@ -308,7 +301,6 @@ class OpenClawRunner:
308
301
  finally:
309
302
  await ws.close()
310
303
 
311
- # Fallback to CLI
312
304
  if on_output:
313
305
  on_output(AgentOutput(category="text", content="WebSocket unavailable, using CLI..."))
314
306
 
File without changes
File without changes