Add a «Подписка Talkis» heading above the cloud-section subscription block on
the Models page, and a dedicated «Подписка Talkis» item in the settings menu
that opens the same three-state subscription block (active / account / guest).
Extract the shared SubscriptionCards component and lift the activate/logout
handlers to component scope so both surfaces drive one flow.
- Prompt editor: «Улучшить промпт» → «Сгенерировать промпт»; icon removed; moved onto the action row next to Отменить/Сохранить with matching style. Generation now feeds the prompt TITLE + draft (works from the name alone).
- talkis-llm sidecar: accumulate raw token bytes and emit only complete UTF-8 sequences — token_to_str decoded partial multibyte chars, producing garbled «иероглифы» on Cyrillic. Rebuilt the macOS sidecar binary.
- Promo banners (guest + account card) now show «7 дней бесплатно» above the Перейти на PRO button; cloud-section status text says «7 дней бесплатно — перейдите на PRO».
- Reorder the Models tab: recognition-mode selector moves to the top; the subscription-active card / go-Pro promo now lives inside the Cloud section, above the cloud card.
- Fix local summary hitting a dead port after app restart: the talkis-llm sidecar dies while llmEndpoint stays persisted. Lazily (re)start the bundled runtime before a local summary (new llmLocalModelId marker) and use the live port.
- Add Улучшить промпт button (shown when a text backend is configured); rewrites the draft via the model.
- SummaryModal listens to SETTINGS_UPDATED_EVENT so a freshly created prompt shows in the dropdown immediately.
- Long prompt text in cards collapses with Раскрыть/Скрыть like the history table.
- Prompt textarea auto-grows to content up to a cap, then scrolls.
- TextModelCard (API) and local LLM cards become collapsed-by-default accordions matching the recognition cards.
- 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
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.
- 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.
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.
- 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 ГБ)
- 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
- 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
- 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
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.
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.
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.
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.
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).
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.
- 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.
- 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
- 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
- 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
- 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
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.
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.