Commit graph

144 commits

Author SHA1 Message Date
David Perov
2296e9bda8 feat: English UI/i18n, summary slide-over, model-mode UX (v0.3.0)
- i18n: lightweight RU/EN system + interface-language picker; full UI translated, OS-detected default
- summary: right slide-over modal with per-record summary history table (generate/regenerate/edit/copy/delete); replaces inline SummaryPanel; triggers disabled with hint when no text model configured
- models: API & Local split into Recognition/Text sub-tabs; explicit select-mode commit row; TextModelCard restyled to match adapter cards; honest Configured badge
- widget: click-to-expand notice bubble
- bump version to 0.3.0
2026-06-25 13:17:48 +03:00
David Perov
fe81d2e7e8 fix(local): use bartowski single-file Qwen GGUF URLs (7B was 404)
The official Qwen2.5-7B-Instruct-GGUF q4_k_m is split into 2 parts (404 for
the single-file name we used). Switch both 3B and 7B to bartowski's
single-file Q4_K_M GGUFs, both verified to return 200.
2026-06-24 15:11:47 +03:00
David Perov
a69b993694 feat(local): bundled talkis-llm runtime (llama.cpp) for local summary
- talkis-llm.rs: a raw-HTTP sidecar like talkis-stt, backed by llama.cpp
  via llama-cpp-2, serving /health, /v1/models and an OpenAI-compatible
  /v1/chat/completions (Qwen2.5 ChatML). Args: -m/--host/--port/-c.
- Cargo: add llama-cpp-2 (Metal acceleration on macOS)
- prepare-stt-sidecar.mjs + tauri.conf externalBin + check.yml placeholders:
  build and bundle talkis-llm alongside the STT sidecars
- commit the macOS arm64 binary (built locally), like the other sidecars

The engine for the local "Текстовая" model: the GGUF model already
downloads; the runtime is now bundled and signed with the app, so no
talkis.ru hosting and no Gatekeeper issue.
2026-06-24 15:09:51 +03:00
David Perov
6292d5c88e fix(local): match STT selection UI on text-model cards
The "Выбрать" button and the active "Выбрана" label now mirror the STT
model cards exactly (control-muted select button with a check on the
right, success-colored "Выбрана" label on the left when active) instead
of the custom "Для summary" / "Используется" button.
2026-06-24 14:19:25 +03:00
David Perov
1ce322762b fix(local): persist LLM download progress across UI remounts; drop "~"
- Track in-flight download progress in a backend registry (llm_runtime),
  query it on mount via get_llm_download_progress, and drive the bar from
  the registry + events instead of component-local state. Progress now
  survives switching the Транскрибация/Текстовая toggle, changing tabs, or
  minimizing the app. A Drop guard clears the entry on any download exit.
- Remove the "~" from the model size labels (2.0 ГБ / 4.7 ГБ)
2026-06-24 14:04:24 +03:00
David Perov
de9af858c1 fix(local): Qwen avatar + icon metrics on text-model cards (match STT)
- Use the existing Qwen avatar (qwen.png) on local text-model cards instead
  of a letter initial, exactly like the STT Qwen model
- Show disk size and required RAM as HardDrive / MemoryStick icons (same as
  the STT model stats row) instead of plain text
2026-06-24 13:57:06 +03:00
David Perov
1875936544 feat(local): text-model toggle + STT-style cards in Local mode
- Add a [Транскрибация | Текстовая] segmented toggle in Local mode, same as
  the cloud/api/local switch: transcription shows the STT models, text shows
  the local LLM models
- Rebuild LocalLlmModels in the exact STT card style (.card chrome, avatar
  circle, status badge, progress bar with --progress-track/--accent, and the
  same action buttons) instead of the previous custom layout
2026-06-24 13:51:50 +03:00
David Perov
9f646c956f fix(prompts): redesign Style & Prompts in the app's native style
- Add a [Стиль | Промпты] segmented toggle, same as the model-mode switch
- Prompt cards now use OptionCard (click to select, checkmark + highlight)
  exactly like the style cards: no star, no "Встроенный" badge, no extra
  icons, and the full prompt text is shown
- Manage custom prompts contextually (Создать / Изменить / Удалить the
  selected one) instead of cluttering each card
- Capitalize "Промпты"; remove dashes from built-in prompt texts
2026-06-24 12:49:58 +03:00
David Perov
af4dcb1176 revert: restore original widget side padding (drop +5px width)
The +5px width safety margin (06aafaf) changed the widget's visible
composition — the left/right padding looked tighter. Revert to the original
IDLE_HOVER_WIDGET_WIDTH (+12) and Rust WIDGET_WIDTH (109). If the Windows
right-edge clipping recurs, it will be handled with a window-only (invisible)
buffer that does not touch the layout.
2026-06-24 12:31:37 +03:00
David Perov
a03df5fc14 feat: native rectangular window on Windows/Linux (system title bar)
Replace the transparent rounded shell (which showed lit square corners on
Windows/Linux) with a standard decorated window there: native title bar
with system minimize / maximize / close, opaque rectangular window, and a
squared .app-root. macOS keeps the custom rounded, decoration-less shell
with the in-app traffic-light title bar; the custom TitleBar is hidden on
non-macOS.
2026-06-24 11:34:09 +03:00
David Perov
818da38031 fix: remove square window shadow on Windows/Linux (rounded-corner halo)
The settings window is transparent and undecorated with CSS-rounded
content, but Windows/Linux draw a square drop-shadow around the square
window, visible as lit corners behind the rounded content. Disable the
window shadow on non-macOS (the floating widget already does); macOS clips
the shadow to the content alpha, so keep it there.
2026-06-24 11:27:31 +03:00
David Perov
06aafaf910 fix: 5px horizontal safety margin on the widget (no right-edge clipping)
Windows DPI rounding could shave a couple of pixels off the right edge of
the floating widget; macOS was fine. Add WIDGET_WIDTH_SAFETY_PX = 5 to the
idle/recording/call-stack widget width and bump the Rust WIDGET_WIDTH to
match (114). The widget window is transparent, so the extra width is
invisible padding and the centered pill keeps its position.
2026-06-24 11:15:57 +03:00
David Perov
321f40b7f5 fix: clearer first-run message when no transcription model is set up
Replace the confusing "Добавьте API ключ" error (shown when a first-time
user records with no cloud session, no API key and no local model) with a
clear instruction to set up a model in Settings → Models, listing the
three options (cloud, local model, own API key).
2026-06-24 11:08:02 +03:00
David Perov
bbfe9982d1 fix: prevent duplicate widget windows on Windows/Linux (single instance)
Add tauri-plugin-single-instance (Windows/Linux only) registered as the
first plugin. A second launch — autostart, deep link, or re-open — now
focuses the running app instead of spawning another process with its own
floating widget. macOS enforces a single instance natively, which is why
the bug never appeared there. The deep-link feature forwards auth URLs
from a blocked second instance to the running app.
2026-06-24 11:03:55 +03:00
David Perov
9eeb48a2c0 feat: cancel local model downloads (STT + LLM)
- download_cancel.rs: shared cancel registry + cancel_local_model_download
  command, CANCELLED_MESSAGE marker
- local_stt / llm_runtime: streaming download loops poll the cancel flag
  each chunk, delete the partial file, return cancelled
- UI: cancel (X) button while a local STT or local LLM model is
  downloading; cancel resets the card silently instead of erroring

User feedback: no way to cancel a local model download (missing on
Windows / everywhere). cargo + tsc + vite green.
2026-06-24 10:57:33 +03:00
David Perov
581f9d21e4 feat: local LLM model slot in Local mode UI (Phase 3)
- LocalLlmModels: list/download/delete bundled GGUF models with progress
  bar, start the managed runtime and point summary at it (sets llmEndpoint
  to the local OpenAI-compatible base URL)
- SettingsTabs: render the slot at the top of the Local model section

bd: talkis-pc-623.9
2026-06-23 21:31:37 +03:00
David Perov
be18237af3 feat: managed local LLM runtime (llama.cpp) + GGUF catalog (Phase 3)
- llm_runtime.rs: bundled talkis-llm (llama-server) runtime management —
  GGUF catalog (Qwen2.5 3B/7B Instruct), streaming download with progress
  events, port allocation, sidecar spawn + /health wait, OpenAI-compatible
  base URL, and Tauri commands (list/download/delete/start/stop/status)
- lib.rs: register module + commands

The actual llama-server binary bundling (prepare-llm-sidecar.mjs +
externalBin) is the remaining sub-step; start_local_llm errors gracefully
until then so dev/build stays green. cargo check passes.

bd: talkis-pc-623.7 / talkis-pc-623.8
2026-06-23 21:27:37 +03:00
David Perov
63b5764c91 feat: text model (LLM endpoint) in API mode for summary (Phase 2)
- SettingsTabs: TextModelCard in API mode — custom OpenAI-compatible
  endpoint, model and key bound to llmEndpoint/llmModel/llmApiKey. Empty
  endpoint falls back to OpenAI with the user's own key. Summary then
  routes through process_text to that endpoint.

bd: talkis-pc-623.6
2026-06-23 20:45:40 +03:00
David Perov
02f3a45cfc feat: unified LLM route (process_text) + summary backend selection (Phase 2)
- ai.rs: process_text Tauri command posting to an OpenAI-compatible
  /v1/chat/completions endpoint — cloud, a local runtime (127.0.0.1) or a
  user-provided endpoint; resolve_chat_completions_url. Explicit
  user-initiated action; automatic cleanup stays disabled by policy.
- lib.rs: register ai::process_text
- summarize.ts: resolveSummaryBackend (cloud | custom | local) and a
  generic map-reduce reused across backends; summarizeTranscript replaces
  the cloud-only summarizeWithCloud
- SummaryPanel: route summary through the resolved backend; show the
  active model and a hint when none is configured

bd: talkis-pc-623.5
2026-06-23 20:42:35 +03:00
David Perov
9cdbfa6335 feat: prompt library + cloud summary of transcripts (Phase 1)
- store: PromptPreset model with built-in cleanup + summary presets,
  prompts[] plus selectedCleanupPromptId/defaultSummaryPromptId,
  migration from the legacy `style` field, and CRUD/resolver helpers
- summarize.ts: cloud summary over processTextWithCloudPrompt with
  map-reduce chunking so long videos/calls don't hit context limits
- Settings: "Стиль" -> "Стиль и промпты" with a prompt constructor
  (create/edit/duplicate/delete + pick the default summary prompt)
- SummaryPanel: pick a prompt and summarize a transcript result via
  Talkis Cloud; wired into the file/call transcription result view

bd: talkis-pc-623.1/.2/.3/.4
2026-06-23 20:13:17 +03:00
David Perov
1f07abb941 fix(call_capture): compile platform-gated Windows/Linux audio capture
Some checks failed
CI / cargo check (linux) (push) Has been cancelled
CI / cargo check (macos) (push) Has been cancelled
CI / cargo check (windows) (push) Has been cancelled
CI / tsc + hotkey smoke (push) Has been cancelled
Windows: cpal::Stream is !Send; wrap it in a SendStream newtype with a
documented unsafe impl Send so the global SESSIONS static is Sync (the WASAPI
stream is a control handle, access serialized via the mutex).

Linux: spa::pod::Pod::from_bytes returns Option, not Result — use ok_or_else
instead of map_err.
2026-06-22 12:16:02 +03:00
David Perov
d4f30e7659 ci: build Linux on ubuntu-24.04 for pipewire 0.10, add sidecar placeholders
libspa 0.10.0 needs pipewire headers newer than ubuntu-22.04 ships (0.3.48),
which broke both the release build and the new CI cargo check on Linux. Build
the Linux leg on ubuntu-24.04 (pipewire 1.x). Also create empty sidecar
placeholders before cargo check so tauri-build path validation passes on
Windows without downloading the real ffmpeg/STT binaries.
2026-06-22 12:06:04 +03:00
David Perov
b5c444eac5 Release v0.2.0 2026-06-22 00:25:07 +03:00
David Perov
e6931a2c6d Realtime interpreter updates and repo housekeeping
Realtime interpreter work (realtime_interpreter.rs, realtimeInterpreter.ts, RealtimeInterpreterTab.tsx), .gitignore entries for Beads/Dolt, audio-pipeline docs, style rule, and the talkis-product-ui-style skill.
2026-06-22 00:24:54 +03:00
David Perov
e30ee9c25e feat: home stats, processing stop/retry, uniform hotkey editing, support link
- Words statistics on the home page (month / all-time / words-per-minute), minimalist layout
- Live processing row in history with stop/cancel; retry for interrupted & failed entries (voice/file/call); startup reconciliation of orphaned jobs
- Uniform hotkey editing across OSes: physical-key (event.code) capture + apply-on-keydown on macOS
- Contact-support button and a GitHub link next to the version
- Stop ducking other apps audio: check mic permission via the Permissions API instead of opening getUserMedia at startup
- CI workflow running cargo check on macOS/Windows/Linux on push and PR
2026-06-22 00:24:40 +03:00
David Perov
c9026a4778 feat: add PipeWire call audio capture 2026-06-05 00:23:44 +03:00
David Perov
ccf7708de0 docs: add AGPL license 2026-06-04 14:28:24 +03:00
David Perov
cd965dfd61 docs: remove readme status section 2026-05-28 10:41:36 +03:00
David Perov
532dc51460 docs: improve open source readme 2026-05-28 10:32:54 +03:00
David Perov
f630c9163c Release v0.1.24 2026-05-25 20:53:14 +03:00
David Perov
2616cf37d9 Release v0.1.23 2026-05-25 20:09:12 +03:00
David Perov
98f00a4bd1 Prepare release v0.1.22 2026-05-22 11:33:32 +03:00
David Perov
c3cf031c21 Merge remote-tracking branch 'origin/main' 2026-05-21 14:43:55 +03:00
Trixter
80c94d42a0 Fix Linux voice input and diarization setup 2026-05-21 14:41:08 +03:00
Trixter
ec51d2a4f6 Fix Linux voice input and diarization setup 2026-05-21 14:17:17 +03:00
Trixter
b64a83b77c Merge remote-tracking branch 'origin/main'
# Conflicts:
#	src/lib/store.ts
2026-05-20 19:18:41 +03:00
Trixter
acede816b3 Fix Linux microphone recording and hotkeys 2026-05-20 19:17:32 +03:00
David Perov
90b81c0eb0 Add widget scale setting 2026-05-20 19:15:49 +03:00
Trixter
49ddfce411 Add Linux sidecar binaries 2026-05-20 17:38:03 +03:00
David Perov
b7ed996b3f Fix call capture audio tracks and speaker labels 2026-05-20 15:58:28 +03:00
David Perov
41644d8ae7 Fix call capture retry processing 2026-05-20 13:15:49 +03:00
David Perov
edaff035b8 Update call widget bubble layout 2026-05-19 09:58:24 +03:00
David Perov
3cd74ab747 Add call capture transcription workflow 2026-05-18 17:21:04 +03:00
David Perov
3237032d58 Respect speaker diarization in widget file drops 2026-05-15 17:14:03 +03:00
David Perov
3a37b6664b Handle missing Linux xdo dependency 2026-05-15 16:15:53 +03:00
David Perov
db13052daf Add cmake to Linux sidecar prerequisites 2026-05-15 14:16:57 +03:00
David Perov
b10c66bd9b Fix Linux sidecar build prerequisites 2026-05-15 13:51:53 +03:00
David Perov
beff1a6209 Release v0.1.21 2026-05-15 13:14:48 +03:00
David Perov
134f407294 Release v0.1.20 2026-05-15 10:32:54 +03:00
David Perov
4c9e6e25d4 Release v0.1.19 2026-05-15 00:49:49 +03:00