Skip to content

Releases: webdevarif/BizVoice

0.1.25

Choose a tag to compare

@webdevarif webdevarif released this 08 Jun 06:53
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:52
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:43
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:28
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:14
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:05
v0.1.20

chore(release): bump version to 0.1.19

0.1.19

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 23:02
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 22:31
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 22:31
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

Choose a tag to compare

@webdevarif webdevarif released this 07 Jun 22:02
v0.1.16

chore(release): bump version to 0.1.15