voice-vibecoder 2.28.0__tar.gz → 2.28.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.28.0 → voice_vibecoder-2.28.2}/CHANGELOG.md +16 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/PKG-INFO +1 -1
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/pyproject.toml +1 -1
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/__init__.py +1 -1
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/cli_serve.py +10 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/dispatch.py +14 -3
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/.github/workflows/ci.yml +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/.github/workflows/release.yml +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/.gitignore +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/CLAUDE.md +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/LICENSE +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/README.md +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/app.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/app_config.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/audio.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/audio_macos.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/__init__.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/claude.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/cursor.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/registry.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/config.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/instances.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/server.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/session.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/__init__.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/agent_task.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/definitions.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/file_tree.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/tools/handlers.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/__init__.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/callbacks.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/diff_view.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/help_modal.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/panels.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/screen.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/setup.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/state.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/styles.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/update_modal.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/ui/wizard.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/openai.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/worktrees.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_audio_gating.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_file_tree.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_merge_branch.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_openai_events.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_session_interrupts.py +0 -0
- {voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/tests/test_startup_context.py +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v2.28.2 (2026-07-22)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- Let configured default_agent drive the enabled set
|
|
10
|
+
([`96aea35`](https://github.com/snokam/voice-vibecoder/commit/96aea35543746d60e204a5812f1b1f42540360f3))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v2.28.1 (2026-07-22)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- Fall back to configured agents, never hardcoded claude
|
|
18
|
+
([`0b4bbf5`](https://github.com/snokam/voice-vibecoder/commit/0b4bbf5a78090ef99f6cbf17f8569536f6e2f74a))
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v2.28.0 (2026-07-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.28.
|
|
3
|
+
Version: 2.28.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.28.
|
|
7
|
+
version = "2.28.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"
|
|
@@ -111,6 +111,16 @@ def main(voice_config: VoiceConfig | None = None) -> None:
|
|
|
111
111
|
settings = RealtimeSettings.load()
|
|
112
112
|
settings = _apply_env_overrides(settings)
|
|
113
113
|
|
|
114
|
+
# The configured default_agent is authoritative for the enabled set.
|
|
115
|
+
# enabled_agents defaults to ["claude"]; on a worker whose default_agent is
|
|
116
|
+
# openclaw that stale default keeps claude selectable, so a restored
|
|
117
|
+
# claude-typed instance runs the Claude CLI ("Please run /login") instead of
|
|
118
|
+
# being coerced to the configured agent. When the default is not enabled,
|
|
119
|
+
# make it the enabled set.
|
|
120
|
+
if config.default_agent and config.default_agent not in settings.enabled_agents:
|
|
121
|
+
settings.enabled_agents = [config.default_agent]
|
|
122
|
+
logger.info("enabled_agents set from default_agent: %s", config.default_agent)
|
|
123
|
+
|
|
114
124
|
from voice_vibecoder.server import serve
|
|
115
125
|
|
|
116
126
|
asyncio.run(serve(
|
|
@@ -55,6 +55,14 @@ _SCOPED_VARS: dict[str, contextvars.ContextVar] = {
|
|
|
55
55
|
"_voice_config": _voice_config_var,
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
# Enabled agents are deployment-constant (one agent set per worker process),
|
|
59
|
+
# unlike the per-connection registry/repo_root. The ContextVar can miss a
|
|
60
|
+
# background dispatch task that did not copy the configuring context; without a
|
|
61
|
+
# process-wide fallback that miss silently resolves to "claude" and a worker
|
|
62
|
+
# configured for openclaw runs the wrong agent. configure() records the last
|
|
63
|
+
# configured set here so an unset ContextVar falls back to it, never to "claude".
|
|
64
|
+
_enabled_agents_fallback: list[str] = ["claude"]
|
|
65
|
+
|
|
58
66
|
|
|
59
67
|
def __getattr__(name: str) -> Any:
|
|
60
68
|
var = _SCOPED_VARS.get(name)
|
|
@@ -62,12 +70,12 @@ def __getattr__(name: str) -> Any:
|
|
|
62
70
|
raise AttributeError(name)
|
|
63
71
|
value = var.get()
|
|
64
72
|
if name == "_enabled_agents" and not value:
|
|
65
|
-
return
|
|
73
|
+
return list(_enabled_agents_fallback)
|
|
66
74
|
return value
|
|
67
75
|
|
|
68
76
|
|
|
69
77
|
def _enabled_agents_or_default() -> list[str]:
|
|
70
|
-
return _enabled_agents_var.get() or
|
|
78
|
+
return _enabled_agents_var.get() or list(_enabled_agents_fallback)
|
|
71
79
|
|
|
72
80
|
# ── External tool registry ───────────────────────────────────────────────────
|
|
73
81
|
# Maps tool name → async handler(name, arguments, user_jwt) -> str
|
|
@@ -128,11 +136,14 @@ def configure(
|
|
|
128
136
|
user_jwt: str | None = None,
|
|
129
137
|
voice_config: VoiceConfig | None = None,
|
|
130
138
|
) -> None:
|
|
139
|
+
global _enabled_agents_fallback
|
|
131
140
|
_registry_var.set(registry)
|
|
132
141
|
_repo_root_var.set(repo_root)
|
|
133
142
|
_agent_timeout_var.set(agent_timeout)
|
|
134
143
|
_permission_mode_var.set(permission_mode)
|
|
135
|
-
|
|
144
|
+
if enabled_agents:
|
|
145
|
+
_enabled_agents_fallback = list(enabled_agents)
|
|
146
|
+
_enabled_agents_var.set(enabled_agents or None)
|
|
136
147
|
_voice_config_var.set(voice_config)
|
|
137
148
|
|
|
138
149
|
|
|
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.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/claude.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/cursor.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/code_providers/openclaw.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.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
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/gemini.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.0 → voice_vibecoder-2.28.2}/src/voice_vibecoder/voice_providers/openai.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
|