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.
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/CHANGELOG.md +16 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/PKG-INFO +1 -1
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/pyproject.toml +1 -1
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/__init__.py +1 -1
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/openclaw.py +6 -14
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.github/workflows/ci.yml +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.github/workflows/release.yml +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/.gitignore +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/LICENSE +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/README.md +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/app.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/index.html +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/app_config.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/audio.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/cli_serve.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/__init__.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/claude.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/cursor.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/registry.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/config.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/instances.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/server.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/session.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/__init__.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/agent_task.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/definitions.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/dispatch.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/file_tree.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/tools/handlers.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/__init__.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/callbacks.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/diff_view.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/help_modal.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/panels.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/screen.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/setup.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/state.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/styles.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/update_modal.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/ui/wizard.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
- {voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/openai.py +0 -0
- {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.
|
|
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.
|
|
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"
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/openclaw.py
RENAMED
|
@@ -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": "
|
|
138
|
+
"id": "cli", # Must be "cli" for operator role
|
|
143
139
|
"version": "1.0.0",
|
|
144
140
|
"platform": "linux",
|
|
145
|
-
"mode": "
|
|
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": {"
|
|
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
|
|
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.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/claude.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/code_providers/cursor.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/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
|
|
File without changes
|
|
File without changes
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.9.0 → voice_vibecoder-2.9.2}/src/voice_vibecoder/voice_providers/openai.py
RENAMED
|
File without changes
|
|
File without changes
|