Releases: webdevarif/BizVoice
Releases · webdevarif/BizVoice
Release list
0.1.25
fix(paste): widen to all Chromium/Gecko hosts; add detection log Process-name detection misses custom Electron hosts (Hermes Agent, Tabby, Wave, any branded Electron shell) that aren't in the known browser list. Their executable name is the brand, not chrome/edge — so the previous IsBrowser check skipped them and they fell through to the Ctrl+V branch, which the TUI inside the webview intercepts. Adds IsChromiumOrGeckoHost(cls) keyed on the window class instead: Chrome_WidgetWin_1 — Chrome / Edge / every Electron app MozillaWindowClass — Firefox / forks Any match → char-type. Catches the Hermes Agent case without needing per-app process names. SMART command refactored into a clear 4-step cascade: 1. Code editor process → Shift+Insert 2. Native terminal class → Shift+Insert 3. Chromium / Gecko host → char-type 4. Native Win32 app → Ctrl+V Each paste also emits a one-line stderr log bizvoice-paste: proc=... cls=... strategy=... so when something still fails we can read the exact decision from the type-proc stderr stream Node already captures. Bump 0.1.23 → 0.1.24.
0.1.24
fix(paste): char-type in browsers for web-hosted TUIs
Web-based terminals (Hermes Agent, web Claude Code, Cloud Shell, any
xterm.js app) live inside a browser tab. The browser holds focus and
forwards Ctrl+V into the page, where the TUI in raw mode intercepts it
as a control character — hence the recurring "No image found in
clipboard" from Claude Code's image-paste handler. Shift+Insert doesn't
help here either because the browser has no terminal-pane paste binding
to translate it into clipboard delivery.
Only path that works universally for browser-hosted TUIs is sending the
text as raw key events.
Adds IsBrowser(proc) covering Chrome, Edge, Firefox, Brave, Opera,
Vivaldi, Arc, Zen, LibreWolf. SMART command now three-way dispatches:
- Browser process → Type(text) char-typed via batched
SendInput (~30ms / 100 chars)
- Editor / terminal → Paste() shortcut Shift+Insert path
- Everything else → Paste() shortcut Ctrl+V path
Browser normal use (Gmail, Slack web, etc.) is now char-typed too —
slightly slower than Ctrl+V but functionally invisible at voice text
length, and the upside is web TUIs Just Work.
Bump 0.1.22 → 0.1.23.
0.1.23
fix(paste): use Shift+Insert in editors/terminals (Wispr Flow approach)
Researched how Wispr Flow handles this: on Windows they use Shift+Insert
instead of Ctrl+V for the Cursor / VS Code / Windsurf integrated
terminals because those IDEs bind Ctrl+V at the app level and don't
forward it to the terminal pane reliably — Claude Code's "No image
found in clipboard" message was the same root cause (its Ctrl+V
handler ran before any paste could happen).
PS helper now picks the shortcut from the focused app:
- IsCodeEditor(process) → Shift+Insert
Process detection via GetWindowThreadProcessId + OpenProcess +
GetModuleBaseName. Matches Code.exe / Cursor.exe / Windsurf.exe /
Trae.exe / code-* (VS Code Insiders).
- IsTerminal(window class) → Shift+Insert
Same shortcut covers Windows Terminal, conhost, mintty so TUIs
(Claude Code, vim, tmux) get text via bracketed paste mode.
- Everything else → Ctrl+V (instant, unchanged).
Other bits:
- Type() rewritten as batched SendInput (50-event chunks) so the
explicit char-typing fallback is ~10× faster (100 chars ≈ 30ms).
KEY_DELAY_MS Sleep replaced by CHUNK_SIZE batching.
- SMART command kept as legacy alias; just calls Paste() now.
- Node side sends 'PASTE\n' (no base64 payload needed anymore).
Refs:
https://docs.wisprflow.ai/articles/6434410694-use-flow-with-cursor-vs-code-and-other-ides
https://github.com/anthropics/claude-code/issues/38620
Bump 0.1.21 → 0.1.22.
0.1.22
fix(paste): char-type in terminals so TUIs accept text input
TUIs running inside terminals (Claude Code, vim, tmux, nano, btop)
intercept Ctrl+V and Ctrl+Shift+V for their own bindings — Claude Code
treats Ctrl+V as image-paste, hence "No image found in clipboard"
whenever we dictated into its prompt. The terminal emulator never gets
to handle the shortcut, so clipboard text never reaches the TUI.
New SMART command: PS helper inspects the foreground window per paste
and switches strategy.
- Terminal window class detected (CASCADIA_HOSTING_WINDOW_CLASS,
ConsoleWindowClass, mintty, etc.) → character typing via
KEYEVENTF_UNICODE. TUI sees real key events, no shortcut to
intercept. ~3ms/char, acceptable for typical voice text.
- Anything else → instant clipboard + Ctrl+V shortcut, same as before.
Bump 0.1.20 → 0.1.21.
0.1.21
fix(updater): strip HTML from GitHub release notes GitHub auto-renders Markdown release bodies to HTML, so the update popup was showing <p> and <br /> tags as literal text. parseReleaseNotes now converts paragraph/break/list tags to line breaks, strips remaining tags, decodes common HTML entities, then splits into clean bullet strings. - 0.1.19 → 0.1.20 sweep from publish script.
0.1.20
v0.1.20 chore(release): bump version to 0.1.19
0.1.19
feat(settings): one Save button for OpenRouter + Custom configs - Replaces per-field blur-save with a single "Save Configuration" button per provider. Users fill all fields (key, base URL, model, headers) and persist them in one click + one toast. - New saveOpenrouterConfig() and saveCustomConfig() collect every editable field into a single settings patch. - Inputs that start with • are treated as unchanged (masked key placeholder) and skipped on save, so the existing key isn't overwritten by accident. - Remove-key shown as a small secondary action next to Save when a key is already stored. - Pairs with the BizGrowHub backend update that now persists gptProvider + customBaseUrl + customChatModel + customHeaders. - Sweeps in the 0.1.16 → 0.1.18 version drift from the publish script.
0.1.18
feat: unify provider picker for STT, AI Formatting, and Refine - One Provider picker in Cloud mode controls everything: OpenAI, Groq, OpenRouter, or Custom. Removes the confusing second picker that used to live inside the AI Formatting card. - Picking OpenAI/Groq sets both sttProvider and gptProvider — STT, formatting, and refine all go to the same key. - Picking OpenRouter/Custom sets gptProvider only; sttProvider stays as the last OpenAI/Groq value so Whisper has a fallback. Amber warning shown when no STT-capable key exists. - pipeline.ts: new buildGptClient() picks the right OpenAI-compatible client per provider (OpenAI base URL, Groq, OpenRouter w/ HTTP-Referer, or Custom with user base URL + optional JSON headers). - callRefine(): same provider selection, falls back through other configured keys when the chosen provider lacks one. - New settings fields: gptProvider, openrouterKeyEncrypted, customKeyEncrypted, customBaseUrl, customChatModel, customHeaders. All encrypted via safeStorage (centralised in persistEncryptedKey). - Local mode + AI Formatting: uses any cloud key fallback (Groq first for speed) since no local LLM is bundled. - Paste path: switched from char-by-char SendInput (slow) to clipboard + smart Ctrl+V / Ctrl+Shift+V keystroke detected from foreground window class — instant regardless of text length, works in terminals.
0.1.17
feat: unify provider picker for STT, AI Formatting, and Refine - One Provider picker in Cloud mode controls everything: OpenAI, Groq, OpenRouter, or Custom. Removes the confusing second picker that used to live inside the AI Formatting card. - Picking OpenAI/Groq sets both sttProvider and gptProvider — STT, formatting, and refine all go to the same key. - Picking OpenRouter/Custom sets gptProvider only; sttProvider stays as the last OpenAI/Groq value so Whisper has a fallback. Amber warning shown when no STT-capable key exists. - pipeline.ts: new buildGptClient() picks the right OpenAI-compatible client per provider (OpenAI base URL, Groq, OpenRouter w/ HTTP-Referer, or Custom with user base URL + optional JSON headers). - callRefine(): same provider selection, falls back through other configured keys when the chosen provider lacks one. - New settings fields: gptProvider, openrouterKeyEncrypted, customKeyEncrypted, customBaseUrl, customChatModel, customHeaders. All encrypted via safeStorage (centralised in persistEncryptedKey). - Local mode + AI Formatting: uses any cloud key fallback (Groq first for speed) since no local LLM is bundled. - Paste path: switched from char-by-char SendInput (slow) to clipboard + smart Ctrl+V / Ctrl+Shift+V keystroke detected from foreground window class — instant regardless of text length, works in terminals.
0.1.16
v0.1.16 chore(release): bump version to 0.1.15