143 Commits
Author SHA1 Message Date
Palash DebnathandClaude Sonnet 5.5 05a6118f01 fix: address PR #2500 review findings
CPU preset leads with Whisper small; CLIs and loaders share omnivoice.utils.dtype
(honours OMNIVOICE_CPU_DTYPE, no import cycle); the Windows-on-ARM notice and the
disk-space message are localized (setup_space takes {{gib}}: 5 for CPU installs, 9
otherwise); ARM64 payloads without a manifest fail the release check; Windows on
ARM is labelled experimental; test imports resolve at run time.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 20:52:57 +05:30
Palash DebnathandClaude Sonnet 5.5 97ee973c61 feat(ci): package Windows on ARM64 (native shell, x64 Python runtime)
Adds a windows-11-arm leg to the packaging rehearsal and the release matrix
(experimental: a failed leg does not block the four established targets; the
release-asset check verifies the arm64 feed in full whenever any trace of it is
published). install.ps1 installs the native ARM64 build and falls back to x64
under emulation. README and the Windows/script docs gain a hardware table, CPU-only
and Windows-on-ARM guidance, and the external-drive recipe for #2436.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 19:06:04 +05:30
Palash Debnath 1ee696553f feat: complete workspace contributors, website previews and local agent interface 2026-09-28 14:32:57 -07:00
debpalash e34d6c735f fix: isolate shell installer version 2026-09-27 01:03:33 +05:30
debpalash f2a7e4cc37 fix: isolate Windows installer version 2026-09-27 00:54:50 +05:30
Palash Debnath 7d1692d838 test: gate retained Electron shared modules 2026-09-26 12:06:14 -07:00
Palash Debnath ad7dcf14c4 fix: close Electron install review gaps 2026-09-26 11:51:07 -07:00
Palash Debnath 29c8a13260 refactor: move shared UI under Electron 2026-09-26 11:46:37 -07:00
Palash Debnath d6348b56f2 chore: retire legacy Tauri app and UI 2026-09-26 11:26:48 -07:00
Palash Debnath 47a06c03cf fix(electron): ship FUSE-free AppImages with zsync updates (#2329)
* feat(electron): publish AppImage zsync updates (#2327)

* Use FUSE-independent AppImage runtime (#2328)

* Launch packaged AppImage in Linux smoke checks

* Postprocess AppImages for source installs and dist builds

* Keep external AppImage updates on the matching release channel

* Run Linux source install smoke against the PR main revision

* Accept shallow PR commits in installer smoke source mirror
2026-09-25 03:08:56 +05:30
Palash Debnath 682f0f60af fix(installer): recognize versioned NSIS registrations and uninstall scope 2026-09-21 21:26:08 +05:30
Palash Debnath 4a1d14747e fix(installer): guard live Linux apps and preserve legacy uninstall entries 2026-09-21 20:57:19 +05:30
debpalash 7f239f6ae9 feat(installer): install Electron releases or main and safely uninstall 2026-09-21 20:10:48 +05:30
Palash Debnath 577d2b7541 fix(cosyvoice): restore runtime imports with maintained PyWORLD source 2026-09-20 20:13:33 +05:30
Palash Debnath 2213092a01 ci: make Electron the only active desktop target (#2220)
Make Electron the maintained desktop target, preserve frozen Tauri v0.5.3 updater feeds, and align setup, smoke checks, release policy and documentation. Validated by full CI, cross-platform smoke and install tests, security checks, and bot review.
2026-09-20 08:26:57 +05:30
Palash Debnath 86c7f6bb35 chore(release): prepare Electron 0.5.4 metadata and authored notes 2026-09-17 22:19:11 +05:30
Palash Debnath b5e9e1bf58 Merge remote-tracking branch 'origin/main' into fix/review-2066 2026-09-17 12:08:09 +05:30
Palash Debnath 623d00eebf Document the integrated Electron transition and CI repairs 2026-09-17 01:24:31 +05:30
Palash Debnath 22637a7954 Align CI fixtures with safe dubbing and compact Electron documentation 2026-09-17 01:18:48 +05:30
Palash Debnath 0b8de98783 Prepare Electron desktop releases and final Tauri sunset workflow 2026-09-16 21:24:27 +05:30
Palash Debnath f21fab4e03 Polish Electron navigation and theme, refresh README and agent skills 2026-09-16 17:25:00 +05:30
Palash Debnath 1d5d3d873e feat: refresh support and integrations experience 2026-09-16 12:38:16 +05:30
Palash Debnath f832d616f7 feat(electron): add full VoiceStudio desktop app 2026-09-14 10:22:23 -07:00
rukhaam19 63e647bd91 feat: add desktop toolchain PATH healing script and unit tests 2026-09-13 13:39:16 +05:30
Palash Debnath c7d0e314d9 Merge branch 'pr/1981' into land/1981-structure 2026-09-09 23:03:14 -07:00
Palash DebnathandClaude Opus 5 5f7df6ac52 fix(dev): reclaim the port from a backend the app itself left running
Closes #1974.

The dev launcher only treated a port holder as ours when it ran out of the git
checkout. A backend the Tauri shell spawned lives under a per-app directory
named after the bundle id instead, so the launcher saw its OWN orphaned backend
as a stranger, refused to free port 3900, and aborted the run with "Refusing to
stop unrelated process" and no way forward but Task Manager.

Ownership now also accepts the app's reverse-DNS identifier in the executable
path or the command line. A bundle id is specific enough to be safe: nothing
else on the machine carries it, which is the point of the namespace.

The guard itself is unchanged in spirit — a foreign listener on the port is
still refused, and a test pins that widening ownership did not widen it to
everything, including a process from some other vendor's bundle.

Known limit, since I hit it in this repo: on Windows the check is given the
command line and executable path but not the working directory, so a backend
started by hand from an arbitrary interpreter — a bare `uvicorn` whose only
link to the checkout is a relative --app-dir — is still not recognised. That is
a different shape from the reported one and needs the cwd, which this code path
does not currently have.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ypcgSsh5j2PEonSJiAU1S
2026-09-09 21:31:19 -07:00
DawcraftandClaude Opus 5 638392994a docs: refresh STRUCTURE.md to match the tree as it is today
STRUCTURE.md still described the April layout: it was missing
backend/engines, worker, mcp_shim, speech_client, migrations, plugins,
hooks and config; the frontend e2e suites, i18n and src-tauri packaging
inputs; and the bin, skills, .agents/skills, notebooks, omnivoice-gallery
and .github/workflows top-level entries. Stale docs are bugs.

Three corrections beyond the missing entries:

- "all tests live here, no exceptions" was wrong. There are three homes
  (tests/, backend/tests/, co-located vitest) and the split is deliberate:
  pyproject testpaths, a separate ci.yml job, and the sys.modules-stub
  hazard documented in backend/tests/conftest.py. Replaced the claim with
  a table that records why each home exists.
- .env.example does not exist and the app never reads a repo-local .env;
  the durable user env file is ~/.config/omnivoice/env
  (backend/core/user_env.py), written by the Settings panel.
- .agents/ was listed as deleted, but it is back with a different job:
  the canonical skill copies pinned by skills-lock.json.

Also fixes the dead blob/main/STRUCTURE.md URL in the backlink script --
the file has lived in docs/ since the cleanup pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LDyC6prbjFydox9XQGhyny
2026-09-10 13:19:44 +09:00
Palash Debnath 512aad5c48 Merge remote-tracking branch 'origin/main' into land/1952
# Conflicts:
#	frontend/src/pages/AudiobookTab.jsx
2026-09-09 13:17:13 -07:00
Palash DebnathandClaude Opus 5 48d1b22fd9 feat(dictation): model picker in the engine quick-switch, and a recoverable Windows dev stack
Adds the sherpa-onnx dictation model picker under the Transcription engine
row so the model the hotkey loads is switchable without opening Settings,
routes the Sherpa transcription path through that same preference, and makes
the Windows desktop dev stack recover instead of demanding Task Manager.
Refreshes the Tauri and npm dependency pins that went with it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ypcgSsh5j2PEonSJiAU1S
2026-09-09 11:47:31 -07:00
marreiradigital 66f7ef8cfe fix(download): reentra no acelerador na proxima tentativa apos queda
Achados do CodeRabbit no PR #1942.

O mais grave: com o erro classificado como transitorio, o codigo mantinha o
acelerador ligado mas caia direto no `snapshot_download` na MESMA tentativa. Se
esse download desse certo, o laco terminava e o manifesto do `.part` nunca era
reusado — exatamente o recomeco-do-zero que a correcao existe para impedir.

Agora o erro transitorio e propagado para o retry externo, cuja proxima
tentativa reentra no `_segmented_snapshot` e retoma do manifesto. A decisao
virou o helper puro `_segmented_retry_plan`, testavel direto (o laco mora dentro
de `install_model`, uma rota de ~200 linhas). A ultima tentativa fica reservada
para o caminho simples, entao o acelerador continua sem poder ser o motivo de um
install falhar de vez.

Tambem deste round de revisao:

- `Invoke-CimMethod ... Terminate` tinha o retorno descartado com `$null =`. O
  Win32_Process.Terminate reporta falha pelo ReturnValue, nao lancando: um kill
  negado por permissao era reportado como sucesso e a porta seguia presa. Agora
  o ReturnValue e validado, com exit 4 proprio e a mensagem carregando o codigo.
- O teste de concorrencia era vazio: o handler sincrono do MockTransport retorna
  antes de qualquer outra task rodar, entao `peak` nunca passava de 1 e a
  asserção `peak <= 4` passava sem exercitar o semaforo. Passou a segurar as
  requisicoes abertas com um asyncio.Event e a exigir `peak == 4` (verificado:
  com o semaforo afrouxado para 1000, o teste acusa 31).
- A doc dizia que OMNIVOICE_DOWNLOAD_MAX_WORKERS limita as faixas e que origem
  sem Range cai no snapshot_download. Nenhum dos dois: `_segmented_snapshot` nao
  passa `num_connections` (usa as 8 padrao) e origem sem Range vira stream unico
  dentro do proprio acelerador.
- Entradas de Highlights do CHANGELOG sem o `(#NNNN)` exigido.
2026-09-08 23:12:14 -04:00
marreiradigital db9e9d7fa1 fix(dev): permite destravar porta de dev presa no Windows
`canStop: !windows` fazia o script recusar qualquer parada no Windows com
"stop it in Task Manager and retry". O motivo original é legítimo: `taskkill
/pid` mira um PID reutilizável, e um PID reciclado entre o inspect e o kill
derrubaria um processo alheio.

Só que isso deixava o `bun run dev` permanentemente travado sempre que um
backend ficasse órfão — exatamente o cenário do commit anterior sobre a árvore
de processos. O predev falhava e não havia caminho de recuperação automático.

A parada agora é presa à INSTÂNCIA do processo: um único PowerShell busca a
instância CIM, confere o CreationDate contra a identidade já inspecionada e só
então chama Terminate NAQUELA instância. O terminate age sobre o objeto que a
checagem validou, não sobre um PID buscado de novo depois — a corrida some.
PID reciclado devolve exit 3 e é deixado em paz, em vez de falhar a execução.
2026-09-08 22:46:48 -04:00
marreiradigital e098d1280c fix(dev): normaliza caminho POSIX sem vazar a semantica do host
`belongsToCheckout(..., windows = false)` respeitava a flag na hora de montar
a string, mas normalizava o caminho com `resolve()` do host. Rodando no
Windows, "/work/VoiceStudio" virava "C:\work\VoiceStudio" e não casava com
nada numa linha de comando POSIX — o mesmo valia para o separador `sep`.

Efeito prático: o teste "command ownership requires a checkout path boundary"
já falhava na `main` limpa em qualquer máquina Windows, passando só no CI
Linux. Passa a usar `path.posix` quando a flag diz POSIX.
2026-09-08 22:46:29 -04:00
marreiradigital 2127aa7716 fix(dev): mata a arvore de processos do backend no Windows
O supervisor faz `spawn("uv", ...)` e o uv sobe o uvicorn como filho dele.
Windows não tem sinais: `child.kill()` vira TerminateProcess só no filho
DIRETO, então matar o `uv` deixava o uvicorn neto vivo segurando a porta 3900.
O spawn seguinte falhava com `[Errno 10048]`, o supervisor contava como crash,
e três desses derrubavam a stack inteira de dev — inclusive o Vite, via
`--kill-others-on-fail`.

`killProcessTree` usa `taskkill /T` no win32 e mantém o envio de sinal no
POSIX. Como o kill forçado devolve exit não-zero e sinal nulo, o reload que nós
mesmos pedimos passaria por crash; isso é tratado olhando se o tree-kill de
fato aconteceu, e não a plataforma — um crash de verdade durante um reload
continua indo para a recuperação de crash (coberto por teste que já existia).
2026-09-08 22:45:44 -04:00
Palash Debnath 5cde34c113 fix(ci): prepare hosted Windows policy for non-admin MSI smoke 2026-09-07 18:20:43 +05:30
Palash Debnath 4486b479a1 test: run generated asset hook inside MSI fixture 2026-09-07 16:44:14 +05:30
Palash Debnath 0d39a5b283 test: exercise MSI build hooks with changing resource filenames 2026-09-07 16:40:12 +05:30
Palash Debnath f2dd6c95db Merge branch 'codex/fix-per-user-msi' into codex/pr-queue-integration
# Conflicts:
#	CHANGELOG.md
2026-09-07 11:58:16 +05:30
Palash Debnath 0cc22ad803 test: reject unresolved MSI authoring and invalid component identity 2026-09-07 11:56:13 +05:30
Palash Debnath 62b0e05c1d fix(windows): preserve registry separators during template expansion 2026-09-07 11:55:42 +05:30
Palash Debnath f463276ca5 ci: validate both Windows MSI scopes with a tiny payload 2026-09-07 11:52:22 +05:30
Palash Debnath 5a1ada0757 fix(windows): give binary registry keypaths explicit stable GUIDs 2026-09-07 11:51:55 +05:30
Palash Debnath 6396cc2b3f style: format Windows installer authoring and regression tests 2026-09-07 11:49:37 +05:30
Palash Debnath 997ba9e673 fix(windows): author per-user MSI file keypaths and folder cleanup 2026-09-07 11:48:20 +05:30
Palash Debnath 7d963cf297 Merge branch 'fix/release-rerun-asset-collisions' into codex/pr-queue-integration
# Conflicts:
#	CHANGELOG.md
2026-09-07 11:19:07 +05:30
Palash Debnath ef30dbece7 fix(release): clear target asset collisions before retry uploads 2026-09-07 11:15:40 +05:30
dajiaohuang 2594abebf8 fix(ci): keep install-docs help cp1252-safe 2026-09-05 05:17:34 +08:00
Palash Debnath 0ed7d2ec22 chore(release): prepare v0.5.2 (#1761)
Synchronize VoiceStudio release metadata, lockfiles, installers, container references, documentation, and the dated v0.5.2 changelog after all planned fixes landed.
2026-09-02 10:26:14 +05:30
Palash Debnath e2446c3e61 fix(release): keep Preview ahead of Stable (#1763)
Closes #1762.
2026-09-02 07:49:22 +05:30
Palash Debnath 51bbf50ce3 Ship a supported per-user Windows installer (#1730)
Closes #1713

Adds a separately identified per-user MSI and updater channel, non-administrator install/uninstall verification, and fail-closed WebView2 handling for current-user installs.
2026-09-01 22:03:33 +05:30
Palash Debnath 2af47dbd4b fix(installer): make WebView2 download opt-in 2026-08-30 21:51:46 +05:30