voice-vibecoder 2.28.2__tar.gz → 2.29.0__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.2 → voice_vibecoder-2.29.0}/CHANGELOG.md +16 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/PKG-INFO +1 -1
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/pyproject.toml +1 -1
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/__init__.py +1 -1
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/cli_serve.py +1 -6
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/server.py +3 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/dispatch.py +3 -14
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.github/workflows/ci.yml +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.github/workflows/release.yml +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.gitignore +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/CLAUDE.md +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/LICENSE +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/README.md +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/app.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/app_config.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/audio.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/audio_macos.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/__init__.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/claude.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/cursor.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/registry.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/config.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/instances.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/session.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/__init__.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/agent_task.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/definitions.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/file_tree.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/handlers.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/__init__.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/callbacks.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/diff_view.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/help_modal.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/panels.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/screen.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/setup.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/state.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/styles.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/update_modal.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/wizard.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/openai.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/worktrees.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_audio_gating.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_file_tree.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_merge_branch.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_openai_events.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_session_interrupts.py +0 -0
- {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_startup_context.py +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v2.29.0 (2026-07-22)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Include worktree directory name in instance_status
|
|
10
|
+
([`7b289ff`](https://github.com/snokam/voice-vibecoder/commit/7b289ffdff8f527bb5a97200edf94e146060edc1))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v2.28.3 (2026-07-22)
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- Drop the process-wide agent fallback; config reconciliation is the fix
|
|
18
|
+
([`cc8c976`](https://github.com/snokam/voice-vibecoder/commit/cc8c9768c1890263c6ed9132fb6a1d6a311b52cd))
|
|
19
|
+
|
|
20
|
+
|
|
5
21
|
## v2.28.2 (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.
|
|
3
|
+
Version: 2.29.0
|
|
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.
|
|
7
|
+
version = "2.29.0"
|
|
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,12 +111,7 @@ def main(voice_config: VoiceConfig | None = None) -> None:
|
|
|
111
111
|
settings = RealtimeSettings.load()
|
|
112
112
|
settings = _apply_env_overrides(settings)
|
|
113
113
|
|
|
114
|
-
#
|
|
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.
|
|
114
|
+
# default_agent is authoritative — a stale ["claude"] default must not keep claude selectable
|
|
120
115
|
if config.default_agent and config.default_agent not in settings.enabled_agents:
|
|
121
116
|
settings.enabled_agents = [config.default_agent]
|
|
122
117
|
logger.info("enabled_agents set from default_agent: %s", config.default_agent)
|
|
@@ -247,6 +247,7 @@ class WebSocketBridge:
|
|
|
247
247
|
"branch": inst.branch,
|
|
248
248
|
"agentType": inst.agent_type,
|
|
249
249
|
"displayName": inst.display_key,
|
|
250
|
+
"worktree": Path(inst.worktree_path).name if inst.worktree_path else "",
|
|
250
251
|
})
|
|
251
252
|
# Send buffered output from previous session
|
|
252
253
|
if inst.output_buffer:
|
|
@@ -342,6 +343,7 @@ class WebSocketBridge:
|
|
|
342
343
|
branch = inst.branch if inst else ""
|
|
343
344
|
agent_type = inst.agent_type if inst else "claude"
|
|
344
345
|
display_name = inst.display_key if inst else branch
|
|
346
|
+
worktree = Path(inst.worktree_path).name if inst and inst.worktree_path else ""
|
|
345
347
|
self._send({
|
|
346
348
|
"type": "instance_status",
|
|
347
349
|
"instanceId": instance_id,
|
|
@@ -349,6 +351,7 @@ class WebSocketBridge:
|
|
|
349
351
|
"branch": branch,
|
|
350
352
|
"agentType": agent_type,
|
|
351
353
|
"displayName": display_name,
|
|
354
|
+
"worktree": worktree,
|
|
352
355
|
})
|
|
353
356
|
|
|
354
357
|
def _on_tool_call(self, name: str, arguments: dict) -> None:
|
|
@@ -55,14 +55,6 @@ _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
|
-
|
|
66
58
|
|
|
67
59
|
def __getattr__(name: str) -> Any:
|
|
68
60
|
var = _SCOPED_VARS.get(name)
|
|
@@ -70,12 +62,12 @@ def __getattr__(name: str) -> Any:
|
|
|
70
62
|
raise AttributeError(name)
|
|
71
63
|
value = var.get()
|
|
72
64
|
if name == "_enabled_agents" and not value:
|
|
73
|
-
return
|
|
65
|
+
return ["claude"]
|
|
74
66
|
return value
|
|
75
67
|
|
|
76
68
|
|
|
77
69
|
def _enabled_agents_or_default() -> list[str]:
|
|
78
|
-
return _enabled_agents_var.get() or
|
|
70
|
+
return _enabled_agents_var.get() or ["claude"]
|
|
79
71
|
|
|
80
72
|
# ── External tool registry ───────────────────────────────────────────────────
|
|
81
73
|
# Maps tool name → async handler(name, arguments, user_jwt) -> str
|
|
@@ -136,14 +128,11 @@ def configure(
|
|
|
136
128
|
user_jwt: str | None = None,
|
|
137
129
|
voice_config: VoiceConfig | None = None,
|
|
138
130
|
) -> None:
|
|
139
|
-
global _enabled_agents_fallback
|
|
140
131
|
_registry_var.set(registry)
|
|
141
132
|
_repo_root_var.set(repo_root)
|
|
142
133
|
_agent_timeout_var.set(agent_timeout)
|
|
143
134
|
_permission_mode_var.set(permission_mode)
|
|
144
|
-
|
|
145
|
-
_enabled_agents_fallback = list(enabled_agents)
|
|
146
|
-
_enabled_agents_var.set(enabled_agents or None)
|
|
135
|
+
_enabled_agents_var.set(enabled_agents or ["claude"])
|
|
147
136
|
_voice_config_var.set(voice_config)
|
|
148
137
|
|
|
149
138
|
|
|
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.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/claude.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/cursor.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/openclaw.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/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
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/__init__.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/gemini.py
RENAMED
|
File without changes
|
{voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/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
|