voice-vibecoder 2.5.1__tar.gz → 2.5.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 (42) hide show
  1. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/CHANGELOG.md +8 -0
  2. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/PKG-INFO +1 -1
  3. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/pyproject.toml +1 -1
  4. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/__init__.py +1 -1
  5. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/config.py +21 -0
  6. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/instances.py +22 -7
  7. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/.github/workflows/ci.yml +0 -0
  8. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/.github/workflows/release.yml +0 -0
  9. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/.gitignore +0 -0
  10. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/LICENSE +0 -0
  11. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/README.md +0 -0
  12. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/app.py +0 -0
  13. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/index.html +0 -0
  14. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/app_config.py +0 -0
  15. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/audio.py +0 -0
  16. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/cli_serve.py +0 -0
  17. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/code_providers/__init__.py +0 -0
  18. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/code_providers/claude.py +0 -0
  19. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/code_providers/cursor.py +0 -0
  20. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/code_providers/registry.py +0 -0
  21. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/server.py +0 -0
  22. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/session.py +0 -0
  23. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/__init__.py +0 -0
  24. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/agent_task.py +0 -0
  25. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/definitions.py +0 -0
  26. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/dispatch.py +0 -0
  27. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/file_tree.py +0 -0
  28. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/tools/handlers.py +0 -0
  29. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/__init__.py +0 -0
  30. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/callbacks.py +0 -0
  31. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/diff_view.py +0 -0
  32. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/help_modal.py +0 -0
  33. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/panels.py +0 -0
  34. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/screen.py +0 -0
  35. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/setup.py +0 -0
  36. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/state.py +0 -0
  37. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/styles.py +0 -0
  38. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/update_modal.py +0 -0
  39. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/ui/wizard.py +0 -0
  40. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/voice_providers/__init__.py +0 -0
  41. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/voice_providers/openai.py +0 -0
  42. {voice_vibecoder-2.5.1 → voice_vibecoder-2.5.2}/src/voice_vibecoder/worktrees.py +0 -0
@@ -2,6 +2,14 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v2.5.2 (2026-02-20)
6
+
7
+ ### Bug Fixes
8
+
9
+ - Let user freely continue conversations in any session/agent
10
+ ([`0d43f1c`](https://github.com/snokam/voice-vibecoder/commit/0d43f1c0acca831d9b51da81a029cc45e04a8eea))
11
+
12
+
5
13
  ## v2.5.1 (2026-02-19)
6
14
 
7
15
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voice-vibecoder
3
- Version: 2.5.1
3
+ Version: 2.5.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.5.1"
7
+ version = "2.5.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.5.1"
6
+ __version__ = "2.5.2"
7
7
 
8
8
  from voice_vibecoder.app_config import VoiceConfig
9
9
  from voice_vibecoder.ui.screen import VoiceCodingScreen
@@ -62,6 +62,13 @@ Regler:
62
62
  - Når agenten er ferdig: nevn utfallet i én setning.
63
63
  - Vær naturlig, kort, vennlig mens agenter jobber.
64
64
 
65
+ Brukeren bestemmer:
66
+ - Når brukeren spesifikt sier hvilken sesjon eller agent de vil sende til, \
67
+ BARE videresend meldingen. ALDRI nekt eller forklar at sesjonen er "feil" for den oppgaven.
68
+ - Brukeren har ALLTID rett til å sende hva som helst til hvilken som helst sesjon/agent.
69
+ - Naturlig videreføring: hvis brukeren stiller et oppfølgingsspørsmål relatert til en nylig sesjon, \
70
+ send det til samme sesjon uten å spørre.
71
+
65
72
  Avbryt/reset:
66
73
  - "avbryt", "stopp" → cancel_agent (med branch eller session_name)
67
74
  - "start på nytt", "reset" → reset_agent
@@ -108,6 +115,13 @@ Rules:
108
115
  - When the agent finishes: mention the outcome in one sentence.
109
116
  - Be natural, brief, friendly while agents work.
110
117
 
118
+ User is in control:
119
+ - When the user specifically says which session or agent to send to, \
120
+ JUST forward the message. NEVER refuse or explain that the session is "wrong" for the task.
121
+ - The user ALWAYS has the right to send anything to any session/agent.
122
+ - Natural continuation: if the user asks a follow-up question related to a recent session, \
123
+ send it to the same session without asking.
124
+
111
125
  Cancel/reset:
112
126
  - "cancel", "stop" → cancel_agent (with branch or session_name)
113
127
  - "start fresh", "reset" → reset_agent
@@ -154,6 +168,13 @@ Regler:
154
168
  - När agenten är klar: nämn utfallet i en mening.
155
169
  - Var naturlig, kort, vänlig medan agenter arbetar.
156
170
 
171
+ Användaren bestämmer:
172
+ - När användaren specifikt säger vilken session eller agent att skicka till, \
173
+ BARA vidarebefordra meddelandet. ALDRIG vägra eller förklara att sessionen är "fel" för uppgiften.
174
+ - Användaren har ALLTID rätt att skicka vad som helst till vilken session/agent som helst.
175
+ - Naturlig fortsättning: om användaren ställer en uppföljningsfråga relaterad till en nylig session, \
176
+ skicka den till samma session utan att fråga.
177
+
157
178
  Avbryt/reset:
158
179
  - "avbryt", "stopp" → cancel_agent (med branch eller session_name)
159
180
  - "börja om", "reset" → reset_agent
@@ -154,25 +154,40 @@ class InstanceRegistry:
154
154
  return instance
155
155
 
156
156
  def get_session_by_name(self, name: str) -> AgentInstance | None:
157
- """Fuzzy-match against SESSION instances' display_name."""
157
+ """Fuzzy-match against SESSION instances' display_name and session key.
158
+
159
+ Matches against both the display_name and the original session key
160
+ (stored in branch as ``_session_{key}``), so lookups work even after
161
+ the display_name is updated to a human-friendly label.
162
+ """
158
163
  name_lower = name.lower().strip()
159
164
  with self._lock:
160
165
  sessions = [
161
166
  inst for inst in self._instances.values()
162
167
  if inst.instance_type == InstanceType.SESSION
163
168
  ]
164
- # Exact match first
169
+
170
+ def _session_key(inst: AgentInstance) -> str:
171
+ return inst.branch.removeprefix("_session_").lower()
172
+
173
+ # Exact match on display_name or session key
165
174
  for inst in sessions:
166
- if inst.display_name.lower() == name_lower:
175
+ if inst.display_name.lower() == name_lower or _session_key(inst) == name_lower:
167
176
  return inst
168
- # Substring match
169
- partial = [inst for inst in sessions if name_lower in inst.display_name.lower()]
177
+ # Substring match on display_name or session key
178
+ partial = [
179
+ inst for inst in sessions
180
+ if name_lower in inst.display_name.lower() or name_lower in _session_key(inst)
181
+ ]
170
182
  if len(partial) == 1:
171
183
  return partial[0]
172
184
  if partial:
173
185
  return min(partial, key=lambda i: len(i.display_name))
174
- # Reverse substring (session name in query)
175
- partial = [inst for inst in sessions if inst.display_name.lower() in name_lower]
186
+ # Reverse substring (session name or key in query)
187
+ partial = [
188
+ inst for inst in sessions
189
+ if inst.display_name.lower() in name_lower or _session_key(inst) in name_lower
190
+ ]
176
191
  if len(partial) == 1:
177
192
  return partial[0]
178
193
  if partial:
File without changes
File without changes