- Remove cli-build / cli-upload jobs; server is distributed via Docker only.
- Add Desktop + platform marker to electron-builder artifactName so files
read e.g. Memoh-Desktop-<v>-mac-arm64.dmg / linux-x86_64.AppImage / win-x64-setup.exe.
- Tighten desktop upload glob to apps/desktop/dist/*.<ext> so win-unpacked/
Memoh.exe and elevate.exe stop being picked up by **/*.exe.
- Drop *.blockmap, latest*.yml, *.msi from upload list; auto-update is not used.
Selector dropdowns previously reserved 50% of the row for the right-hand
metadata, squeezing long model names beyond visibility, and triggers
truncated their labels without a tooltip. Restructure the model option
into a two-row layout (name + capabilities/context badge above, model_id
below), and add native title tooltips on every truncated label across
the shared SearchableSelectPopover and the model/TTS/search/memory/
browser-context selectors so the full name is always reachable.
Replace 16 boxed per-tool components with a single inline row driven by a
central tool registry plus per-tool detail components. Tools without
specialized result rendering no longer expand (the fallback for unknown
tools still does). Write/edit are treated as Cursor-style inline diffs:
default-expanded with +N/-M line stats, the filename itself opens the file,
and the action verb is suppressed. Thinking blocks adopt the same inline
style — expanded while streaming, collapsed on reload.
* refactor: use Electron instead of Tauri
* feat: two level windows and self-managed vite project
* feat(desktop): macOS hidden-inset chrome and floating chat title
Apply hiddenInset titleBarStyle on darwin so the system titlebar is hidden
but native traffic lights remain. Reusable web sidebars inject a new
DesktopShellKey to reserve a 36px TopBar that holds the traffic-light
inset (drag region + right border) without colliding with the bot list,
and the sidebar stays pinned open in the Electron shell so window resize
doesn't fight the layout.
Overlay a centered "Title - BotName" header above the chat content with a
bottom shadow gradient that obscures scrolling messages, and reserve top
padding so the first message stays visible when content fits the viewport.
Route the sidebar + action by path (/settings/bots) so the chat router's
/settings/* interception forwards it to the settings window cleanly while
remaining a normal navigation in web.
* docs(desktop): add AGENTS.md for Electron shell
Document the multi-window architecture, web reuse strategy, type-stubbing
trick, macOS chrome, IPC surface, routing, icons, and packaging — captures
the non-obvious bits that bit us during the Tauri → Electron refactor so
future agents don't relearn them.
Expose a dedicated container metrics endpoint and surface current CPU, memory, and root filesystem usage in the bot container view. This gives operators a quick health snapshot while degrading cleanly on unsupported backends.
Expose a paginated endpoint and UI table that lists individual LLM call
records (assistant messages with usage) per bot, showing time, session
type, model, provider, and token counts. Respects existing date / model
/ session-type filters and adds full-height loaders plus a max-width
layout to keep the usage page consistent with other top-level pages.
Introduce a shared SettingsShell with narrow/standard/wide/full width
tiers, and convert the primary provider/memory/speech/transcription/
email/browser/bot-mcp/channel/heartbeat/compaction settings forms from
single-column space-y stacks to md:grid-cols-2 grids where short fields
pair up and long inputs (secrets, URLs, webhooks, commands, etc.) stay
full width.
Also fix the provider model list, platform grid, and bots grid to use
responsive breakpoint columns instead of single-column flex or fixed
grid-cols-4 / minmax(400px), and make model/bot cards equal-height with
bottom-aligned actions.
Replace the read-only schedule list with a form-driven builder so users
never hand-edit cron patterns. A canonical ScheduleFormState feeds two
inverse pure functions (toCron / fromCron) that guarantee round-trip
equivalence, so new and edit flows share the exact same UI state shape
even though the DB stores only the pattern. Unrecognised patterns (AI-
generated ranges/steps, descriptors, 6-field seconds cron) fall back
losslessly to an advanced mode instead of being silently rewritten.
The dialog adds live previews (human-readable via cronstrue, next 3
trigger times via cron-parser evaluated in the bot timezone) and row
actions for edit / enable-toggle / delete.
Prevent the About page from rendering duplicate `v` prefixes when the server already returns tags like `v0.7.0`. Reuse the same normalization for release checks so the displayed version and update comparison stay consistent.
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
* feat: Ear and Mouth
* fix: separate ear/mouth page
* fix: separate audio domain and restore transcription templates
Move speech and transcription internals into the audio domain, restore template-driven transcription providers, and regenerate Swagger/SDK so the frontend can stop hand-calling /transcription-* APIs.
---------
Co-authored-by: aki <arisu@ieee.org>
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
* feat: Ear and Mouth
* fix: separate ear/mouth page
* fix: separate audio domain and restore transcription templates
Move speech and transcription internals into the audio domain, restore template-driven transcription providers, and regenerate Swagger/SDK so the frontend can stop hand-calling /transcription-* APIs.
---------
Co-authored-by: aki <arisu@ieee.org>
* feat: expand speech provider support with new client types and configuration schema
* feat: add icon support for speech providers and update related configurations
* feat: add SVG support for Deepgram and Elevenlabs with Vue components
* feat: except *-speech client type in llm provider
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: remove go.mod replace
* feat: enhance speech provider functionality with advanced settings and model import capabilities
* chore: update go module dependencies
---------
Co-authored-by: Acbox <acbox0328@gmail.com>
- Add POST /bots/:bot_id/sessions/:session_id/compact endpoint for
synchronous context compaction with fallback to chat model when no
dedicated compaction model is configured
- Add "Compact Now" button to session info panel in the web UI
- Add /compact slash command for triggering compaction from chat
- Regenerate OpenAPI spec and TypeScript SDK
SQL queries (CountProviders, CountModels, ListModels, ListEnabledModels,
ListModelsByProviderID) now exclude speech types. Added IsLLMClientType
guard to prevent cross-domain queries via /models?client_type and
/providers/:id/import-models. Frontend provider forms no longer offer
edge-speech as a client type option.
Also fixed pre-existing SA5011 staticcheck warnings in proxy_test.go
and executor_test.go.
Initialize new bots with preset ACL templates and an allow-by-default fallback so common access setups can be selected during bot creation instead of being configured manually afterward.
Unify webhook handling across channel adapters and add the WeChat Official Account channel so inbound routing and replies work without platform-specific handlers. Add adapter-scoped proxy support and stable config field ordering so restricted network environments can deliver WeChat and Telegram messages reliably.
When a new bot had no sessions, initialize() returned early without
starting WebSocket, message events SSE, or local stream SSE. This
caused the first conversation to hang because stream events had no
delivery channel to reach the frontend.