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.
Files changed (51) hide show
  1. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/CHANGELOG.md +16 -0
  2. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/cli_serve.py +1 -6
  6. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/server.py +3 -0
  7. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/dispatch.py +3 -14
  8. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.github/workflows/ci.yml +0 -0
  9. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.github/workflows/release.yml +0 -0
  10. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/.gitignore +0 -0
  11. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/CLAUDE.md +0 -0
  12. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/LICENSE +0 -0
  13. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/README.md +0 -0
  14. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/app.py +0 -0
  15. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/app_config.py +0 -0
  16. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/audio.py +0 -0
  17. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/audio_macos.py +0 -0
  18. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  19. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/claude.py +0 -0
  20. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  21. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/openclaw.py +0 -0
  22. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/code_providers/registry.py +0 -0
  23. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/config.py +0 -0
  24. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/instances.py +0 -0
  25. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/session.py +0 -0
  26. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/__init__.py +0 -0
  27. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/agent_task.py +0 -0
  28. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/definitions.py +0 -0
  29. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/file_tree.py +0 -0
  30. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/tools/handlers.py +0 -0
  31. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/__init__.py +0 -0
  32. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/callbacks.py +0 -0
  33. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/diff_view.py +0 -0
  34. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/help_modal.py +0 -0
  35. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/panels.py +0 -0
  36. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/screen.py +0 -0
  37. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/setup.py +0 -0
  38. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/state.py +0 -0
  39. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/styles.py +0 -0
  40. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/update_modal.py +0 -0
  41. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/ui/wizard.py +0 -0
  42. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  43. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/gemini.py +0 -0
  44. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  45. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/src/voice_vibecoder/worktrees.py +0 -0
  46. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_audio_gating.py +0 -0
  47. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_file_tree.py +0 -0
  48. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_merge_branch.py +0 -0
  49. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_openai_events.py +0 -0
  50. {voice_vibecoder-2.28.2 → voice_vibecoder-2.29.0}/tests/test_session_interrupts.py +0 -0
  51. {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.28.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.28.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"
@@ -3,7 +3,7 @@
3
3
  A voice-controlled coding assistant using OpenAI Realtime API + Claude Code.
4
4
  """
5
5
 
6
- __version__ = "2.28.2"
6
+ __version__ = "2.29.0"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -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
- # 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.
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 list(_enabled_agents_fallback)
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 list(_enabled_agents_fallback)
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
- if enabled_agents:
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