# Suzent Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [v0.6.6] - 2026-06-08

### 🐛 Fixed
- **Standalone Installer UX**: Reworked the custom installer with a fixed-size setup window, native folder browsing, responsive stage execution, in-app detailed logs, and launch/exit completion actions.
- **Windows Shortcuts**: Create shortcuts using Windows known folders so Desktop and Start Menu links work with redirected locations such as OneDrive Desktop.
- **Installer Release Asset**: Updated the standalone installer package version so release assets report `v0.6.6`.

## [v0.6.5] - 2026-06-07

### 🚀 Added
- **Standalone Desktop Installer**: Added a dedicated Tauri installer app that provides a custom setup UI while reusing the existing staged install engine.
- **Installer Release Assets**: Release builds now publish `suzent-installer-*` assets alongside the main desktop binaries, so users can install Suzent through the dedicated bootstrap app.

### 🐛 Fixed
- **Installer Packaging Model**: Removed the main app's bundled-helper assumption and now directs uninstalled users to the standalone Suzent Installer.
- **i18n Provider Placement**: Moved `I18nProvider` above the app tree so loading, bootstrap, and error states can safely use localized components.

## [v0.6.4] - 2026-06-07

### 🚀 Added
- **Desktop Installer Bootstrap**: Added a first-run desktop setup flow backed by a headless Rust installer helper for cloning Suzent, syncing dependencies, installing Playwright, and creating shortcuts.
- **Installer Packaging**: Bundled the installer helper as a Tauri resource and added a bootstrap completion marker so partial virtualenvs do not skip setup.
- **Add cost dashboard (Usage tab) to Settings**
- **Update compact order to pre-chat**
- **Mid-run checkpoint after each completed tool batch**
- **Sync desktop streaming with backend persistence across refreshes**
- **Integrate BrutalSegmentedTabs for improved tab navigation in MemoryView**
- **Replace PlanningTool with project-scoped Goal & Task management (#44)**
- **Enhance chat activity timeline with new components and styles**

### 🐛 Fixed
- **Windows Installer Launch**: Embedded an `asInvoker` manifest so Windows can launch the installer helper from the main app without UAC elevation errors.
- **Custom Install Updates**: Desktop update checks and restart scripts now use the saved install workspace instead of the app bundle/default directory.
- **Toolcall bug**
- **Address cr issues**
- **Update chat refresh recovery**
- **Update provider logos and improve label display in ProvidersTab**

## [v0.6.3] - 2026-05-26

### 🚀 Added
- **Background Turn Locking**: Improved wakeup handling across chat streams to prevent concurrent turn conflicts.
- **AgentTool**: Renamed SpawnSubagentTool to AgentTool for consistency across the codebase.
- **New Models**: Added Gemini, OpenRouter, Xiaomi MiMo, and multi-model subagent council support.
- **Codex Login Bridge**: Session bridge for Codex login flow (#23).
- **Chat File Mentions**: Files can now be mentioned and linked directly in chat (#22).
- **Interactive Logo**: New animated Suzent logo component replaces static SVG in Sidebar and AppInner.
- **FileDiffViewer**: New component for visualizing file edits inline in tool call blocks, with Monaco editor themes and preview configuration.
- **Tool Renderers**: `BashCommandRenderer`, `BashOutputRenderer`, and `WebSearchRenderer` for richer tool output display.
- **ToolSearchTool**: Agent-activated deferred toolset for dynamic tool discovery.
- **Homepage Revamp**: New layout, textures, theme toggle, locale switch, and interactive logo.

### ⚡ Changed
- **Startup Performance**: Lazy-import `litellm`, `lancedb`, `crawl4ai`, and `ChatProcessor` — cold-start import time reduced from ~4.3s to ~1.1s.
- **AG-UI Message Structure**: Enhanced rendering with AG-UI parts for stable historical replay and real-time streaming display.
- **Context Usage Tracking**: Tracked in the chat model, surfaced via API and status bar, persisted in the database.
- **Display Text Truncation**: Long text in chat components and DB queries is now truncated for performance.
- **Skills Sync**: Deferred `sync_managed_skills_dirs()` to first use instead of config import time.

### 🐛 Fixed
- **Tool Approval Policy**: `stripDenyApprovalPolicies` now correctly filters `always_deny` entries from approval state.
- **Chat Renaming**: Added rename functionality with UI support and localization.
- **Social Channel Tool Approval**: Fixed surface parameter threading through `CommandContext`.
- **Compact Command**: Fixed `TypeError` by using `dispatch` instead of direct call (#27).
- **IME Composition**: Enter keypress now correctly ignored while IME composition is active (#28).
- **Cursor Position**: Fixed cursor position regression in `ChatInputPanel`.
- **Search File Mentions**: Fixed virtual path handling in `search_file_mentions`.
- **A2UI Validation**: New surface ID aliases and validation, with tests.

## [v0.6.2] - 2026-05-05

### 🚀 Added
- **Model Roles**: New "Model Roles" tab in Settings lets you assign specific models to each role — Primary, Cheap, Vision, Embedding, Image Generation, and TTS — with a searchable dropdown populated from your enabled providers.
- **`/model` Slash Command**: View or change the active model directly from social channels (Telegram, etc.) or the CLI. `/model` shows the current model, `/model ls` lists all enabled models, `/model <id>` switches immediately. Telegram shows an interactive button keyboard for quick selection.
- **Chat Unread State**: Chat list now tracks read/unread status — chats with new messages are visually marked until you open them.
- **ZhipuAI Provider**: Added ZhipuAI as a supported capability provider with model definitions.
- **New OpenAI Models**: Updated OpenAI capabilities configuration with the latest available models.
- **User Home Data Directory**: SUZENT now stores user data in `~/.suzent` by default, with `SUZENT_DATA_DIR` available for custom locations.
- **Data Import, Export, and Sync**: Added snapshot export/import APIs, CLI commands, and a Settings > Data tab. Snapshot sync supports pushing timestamped archives to a shared folder and pulling the latest snapshot back.
- **User Skills Directory**: User-installed skills can live under `~/.suzent/skills`, layered above bundled repository skills.

### ⚡ Changed
- **Providers Settings UX**: Improved layout and interaction for API key and provider configuration in Settings.
- **AG-UI Message Structure**: Enhanced message rendering with AG-UI parts for improved real-time streaming display and stable historical replay. Tool call blocks now show formatted arguments and improved markdown styling.
- **Streaming Indicator**: Blinking indicator in assistant messages now correctly reflects active streaming state.
- **Context Usage Tracking**: Context usage is now tracked in the chat model and surfaced via API responses and the status bar. Persisted in the database for accurate per-chat display.
- **Display Text Truncation**: Long display text in chat components and database queries is now truncated for improved performance and readability.
- **Social Dependencies**: `suzent upgrade` and setup scripts now sync the `zstandard` compression dependency required by social channel features.
- **Desktop Runtime Paths**: Desktop runtime files such as `server.port` and backend logs now live under `~/.suzent/runtime`, so source checkouts stay clean.
- **Configuration Layers**: User config and permission overrides can be stored under `~/.suzent/config`, while repository config remains the default/template layer.
- **Social Channel Dependencies**: Setup scripts and `suzent upgrade` now sync the `social` extra by default so Telegram, Slack, Discord, and Feishu integrations are available for normal user installs.

### 🐛 Fixed
- **Plan Tab Auto-close**: Right sidebar now automatically closes the Plan tab when an invalid or missing plan is detected, preventing a stuck empty panel.
- **Desktop Binary Compatibility**: Avoid launching stale local UI binaries when backend/Tauri startup files have changed in the source checkout.
- **Windows Data Export**: Export now skips inaccessible symlink-like files instead of failing with Windows `WinError 1920`.
- **Secret Export Safety**: Default portable exports scrub encrypted API-key rows from `chats.db` and continue excluding `.secret_key`; local pre-import backups preserve secrets inside excluded backup storage.
- **Import Error Handling**: Invalid or missing import archives now return structured 400/404 responses instead of uncaught 500 errors.

## [v0.6.1]

### 🚀 Added
- **Chat Unread State**: Chat list now tracks read/unread status — chats with new messages are visually marked until you open them.
- **Dashscope Provider**: Added Dashscope provider configuration.
- **Custom Volume Metadata Cache**: Volume metadata is now cached on settings save for faster context injection.

### ⚡ Changed
- **Provider Registry**: Enhanced provider registry management and model retrieval logic.
- **Model Cost Estimation**: Added cost estimation to `ModelCapabilities` and updated model selection UX.
- **Desktop Startup Flow**: Improved prebuilt desktop startup sequence and backend health checks.

### 🐛 Fixed
- **Tool Approval in Social Channels**: Fixed permission rule logic for tool approvals sent via Telegram and other social channels. Bash command approvals now show the command preview and offer "Always Allow `<command>...`" as a session-level rule. Non-bash tool approvals correctly surface the tool description.
- **Social "Remember" Approval**: The "remember" decision for approved tools is now correctly forwarded through the approval pipeline so the session-level rule actually takes effect.
- **Chat Message Count**: Fixed incorrect message count in the chat list.
- **Redundant Unread Badges**: Cleaned up duplicate unread indicators in the chat list.
- **Auto-title Crash**: Fixed a crash when the auto-title generator returned no result.
- **Desktop Backend Startup Reliability**: Fixed reliability issues with desktop backend startup.
- **Agent Startup Hangs**: Prevented agent startup hangs caused by prompt probing.

## [v0.6.2] - 2026-05-05

### 🚀 Added
- **User Home Data Directory**: SUZENT now stores user data in `~/.suzent` by default, with `SUZENT_DATA_DIR` available for custom locations.
- **Data Import, Export, and Sync**: Added snapshot export/import APIs, CLI commands, and a Settings > Data tab. Snapshot sync supports pushing timestamped archives to a shared folder and pulling the latest snapshot back.
- **User Skills Directory**: User-installed skills can live under `~/.suzent/skills`, layered above bundled repository skills.

### ⚡ Changed
- **Desktop Runtime Paths**: Desktop runtime files such as `server.port` and backend logs now live under `~/.suzent/runtime`, so source checkouts stay clean.
- **Configuration Layers**: User config and permission overrides can be stored under `~/.suzent/config`, while repository config remains the default/template layer.
- **Social Channel Dependencies**: Setup scripts and `suzent upgrade` now sync the `social` extra by default so Telegram, Slack, Discord, and Feishu integrations are available for normal user installs.

### 🐛 Fixed
- **Desktop Binary Compatibility**: Avoid launching stale local UI binaries when backend/Tauri startup files have changed in the source checkout.
- **Windows Data Export**: Export now skips inaccessible symlink-like files instead of failing with Windows `WinError 1920`.
- **Secret Export Safety**: Default portable exports scrub encrypted API-key rows from `chats.db` and continue excluding `.secret_key`; local pre-import backups preserve secrets inside excluded backup storage.
- **Import Error Handling**: Invalid or missing import archives now return structured 400/404 responses instead of uncaught 500 errors.

## [v0.6.0] - 2026-04-23

### ⚡ Changed
- **Distribution**: Remove Tauri installer packaging entirely. SUZENT is now distributed as a source checkout — users install via a one-line setup script (`setup.sh` / `setup.ps1`) that clones the repo, installs uv + Node, syncs dependencies, and writes a `suzent` CLI shim. No compiled binaries, no `.msi`/`.dmg`/`.AppImage`, no bundled Python environment.
- **Setup Scripts**: Rewrite `setup.sh` and `setup.ps1` with full install + update flows: OS detection, auto-install of uv (and Node via nvm/winget), git stash-before-pull on update, `SUZENT_DIR` / `SUZENT_BRANCH` env overrides, and `SUZENT_SKIP_PLAYWRIGHT=1` escape hatch.
- **CLI**: Add `suzent ui` command to launch only the Tauri frontend (assumes backend already running, accepts `--port`). `suzent start` now starts backend + frontend together and cleanly stops the backend when the frontend exits. `suzent serve` remains the headless backend-only mode.
- **Configuration**: Centralize default port/host as `DEFAULT_PORT` / `DEFAULT_HOST` constants in `suzent.config`, driven by `SUZENT_PORT` / `SUZENT_HOST` env vars. Removes all hardcoded `25314` occurrences across CLI, client, server, and node host.
- **CI**: Replace 90-minute 4-platform Tauri build matrix with a lightweight CI that runs lint + tests on every push and creates a GitHub Release (with install instructions) on version tags.
- **Tauri Dev Mode**: `npm run dev` / `suzent ui` no longer launches the Python backend — connect to a separately-running `suzent serve` instance. Port is auto-discovered from `data/server.port` written at startup.

### 🐛 Fixed
- **Starlette 1.0 Compatibility**: Replace deprecated `on_startup`/`on_shutdown` kwargs with the standard `lifespan` async context manager.
- **Telegram Duplicate Polling**: Add `_running` guard in `TelegramChannel.connect()` and `drop_pending_updates=True` on `start_polling()` to prevent `Conflict: terminated by other getUpdates request` on server restart.
- **Startup Re-entrance**: Guard `startup()` social-brain initialization against double-invocation.

## [v0.5.0] - 2026-04-22

### ⚡ Changed
- **Desktop Build**: Switch to prebuilt Python environment — all dependencies are now installed at build time instead of first launch. The app starts instantly with no network access or venv creation on the user's machine.

### 🚀 Added
- **Retry**: Re-run the last user message from scratch. Click the retry icon next to the copy button on any assistant response, or send `/retry` in any social channel. Before each turn the agent state, display messages, sandbox `/persistence` directory, and all custom-volume host directories are snapshotted; on retry everything is restored and the original message is replayed. `/shared` is intentionally excluded from rollback because it is shared across all chats.
- **Two-Phase Chat Persistence**: State is now saved in two stages — a quick snapshot immediately after streaming ends (so fast-follow turns always have full history), followed by a background job that handles transcript writing, memory extraction, context compression, and final persistence. Each step is tracked individually, and failed jobs are automatically retried up to 3 times.
- **Sub-agent Runtime**: Add `spawn_subagent` tool with support for `run_in_background` (async vs blocking execution) and optional `cwd` override for per-task working directory control.
- **Sub-agent Backend APIs**: Add sub-agent management endpoints:
  - `GET /subagents/active`
  - `GET /subagents/stream`
  - `GET /subagents`
  - `GET /subagents/{task_id}`
  - `POST /subagents/{task_id}/stop`
- **Background Event Bus**: Add `GET /events/stream` SSE multiplexer that streams all background events (heartbeat, scheduler, social, sub-agents) over one persistent connection.
- **Sub-agent Frontend UI**: Add dedicated sub-agent components and hooks (`SubAgentCallBlock`, `SubAgentList`, `SubAgentView`, `useEventBus`, `useSubAgentStatus`) for real-time task status, detail view, and stop actions.
- **Social Session Slash Commands**: Add `/sess` command group (`ls`, `switch`, `new`, `info`) for managing active social sessions.
- **Web Search Rich Output Renderer**: Add `WebSearchRenderer` for structured web-search result cards in tool output.
- **Web Activity Sidebar**: Add web activity views and hooks (`WebActivitiesView`, `WebPageReaderView`, `WebSearchSidebarView`, `useWebHistory`) to surface browsing/search context in the right sidebar.
- **Context Usage Tracking**: Add context usage store and status bar display to show prompt/context consumption in real time.
- **Tool Icon System**: Add dynamic tool icon utilities/components (`toolIcon`, `toolGroupIcon`) with contract/smoke tests for UI rendering behavior.
- **Shell Tool Package**: Add `tools/shell` package with shared host process registry for background process lifecycle management.
- **Prompt Architecture Tests**: Add dedicated tests for prompt architecture and tool cleanup contracts.

### ⚡ Changed
- **Parent Wakeup Flow**: Background sub-agent completion can now trigger an automatic parent wakeup turn, so the parent agent can continue without waiting for new user input.
- **Streaming Infrastructure**: Refactor stream registry to support active stream queue lookup and event-bus fan-out from background stream queues.
- **Assistant Tool Output UX**: `spawn_subagent` tool calls now render as dedicated interactive blocks instead of generic tool pills, with stronger status propagation in chat and sidebar.
- **Web Search Tool Contract**: `websearch` now returns structured `ToolResult` payloads (JSON envelope with normalized result items) instead of mixed plain-text-only responses.
- **Bash Tool Execution Context**: `BashTool` now supports dependency-provided `cwd` overrides for sub-agent scoped execution.
- **Tool Return Contract Cleanup**: Refactor tools toward structured `ToolResult` responses and improve tool metadata consistency across prompt/runtime pipelines.
- **Prompt Resolution and Guidance**: Refine instruction handling, dynamic context registration, and tool/session guidance; improve shell-type detection and output efficiency hints in prompts.
- **Filesystem Tool Reliability**: Improve `edit_file`, `glob`, `grep`, `path_resolver`, `read_file`, and `write_file` behaviors, including better no-match hints, large-file scan caps, path normalization, and stale-write handling.
- **Shell Tool Organization**: Move shell execution tools into `tools/shell` and route process execution through a centralized host process registry.
- **Chat and Sidebar UX**: Update chat/right-sidebar/canvas/sub-agent UI state handling and styles for clearer tool-call and sub-agent rendering.
- **Bash Tool Permission**: Optimize bash tool permission level.
- **Tool Approval Enhancement**: Expanded tool approval system with global "remember" scope, per-tool permission policies for `BashTool`, and utility to collect unprocessed tool call IDs. `bash_execute` is skipped for remember semantics to avoid double-approval.

### 🐛 Fixed
- **File-Level Retry Snapshots**: Replace full directory `copytree` with per-file backups for retry checkpoints. `edit_file` and `write_file` now back up each file before the first write per turn (`{sha256(path)[:16]}@v1` under `sandbox/file-history/{chat_id}/`); a snapshot is finalised after each turn and stored in the DB checkpoint. On `/retry` only the actually-modified files are restored (or deleted if newly created), instead of re-copying entire session and volume directories. Turns with no file edits produce zero disk I/O.
- **npm Install on Start**: `suzent start` now re-runs `npm install` in `frontend/` and `src-tauri/` when `package.json` is newer than `node_modules/`, fixing "failed to resolve import" errors for users who run `suzent upgrade` and then `suzent start` after a release that adds new npm dependencies.
- **Web Search Rendering Compatibility**: Frontend parsing now handles both new `ToolResult` envelopes and legacy markdown output for search results.
- **Parent Wakeup Persistence Race**: Add synchronization around wakeup post-processing to reduce message persistence races in parent chat updates.
- **Edit File Replace Robustness**: Improve string replacement matching in `EditFileTool` (line-number prefix handling, whitespace/quote normalization) to reduce false mismatches.
- **Concurrent File Edit Conflicts**: Refine stale write detection and error messaging for concurrent edits to improve retry behavior and diagnostics.
- **Sidebar Toggle Stability**: Fix right sidebar toggle behavior regression in chat UI.

## [v0.4.1]

### 🚀 Added
- **Slash Command System**: Introduce slash command system registered to desktop app and telegram.
- **Canvas (A2UI)**: Agents can render interactive UI surfaces in the sidebar canvas panel or inline in chat using the `render_ui` tool.
  - Component types: `card`, `stack`, `columns`, `text`, `badge`, `button`, `table`, `form`, `list`, `progress`, `divider`.
  - Canvas tab auto-opens when a surface is rendered; supports multiple named surfaces with a tab strip.
  - Button clicks and form submits are sent back to the agent as structured messages, enabling interactive workflows.
  - Surfaces persist across the session; re-rendering with the same `surface_id` upserts in place.
  - Fullscreen mode, drag-to-resize sidebar, and markdown rendering in text/list/table cells.
  - New `canvas` skill (`skill_execute("canvas")`) provides the agent with full component reference and examples.
- **`ask_question` tool**: Dedicated tool for collecting user input that blocks the agent until the user responds, then returns answers as structured data.
  - Single question with options renders as an inline button list; multiple questions or multi-select render as a paged form (one question per page).
  - Paged form includes Back / Skip / Next navigation; Next is only enabled once the current field has a value.
  - `allow_free_text` adds a "Type something else…" option inline as the last list item.
  - **Form field types**: `select` and `multiselect` fields render as inline option lists instead of dropdowns — no portal positioning issues inside inline surfaces.
  - **Paged form mode**: Forms support `paged: true` to show one question at a time with progress indicator.
  - **Notification Rework**: Move heartbeat badge to the notification bar. Add notification pins.
  - **Auto title**: Auto generation of chat title.
  - **Desktop Single Instance**: Block multiple desktop instances running at the same time.
  - **LLM Wiki**: Update notebook skill based on the ideas from Karpathy's [LLM Wiki](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f)

### ⚡ Changed
- **Context Compact System**: Optimize the context compressor. It can be triggered manually or when the estimated tokens beyond a threshold.
- **Sandbox Docker**: Use Docker as the default sandbox.
- **Chat list**: Improve the design of chat list.

### 🐛 Fixed
- **Host Prompt Path Leakage**: Fixed host-mode instruction leakage of sandbox virtual paths (`/mnt/*`, `/shared/*`) across memory and skill contexts.
  - Memory context rendering is now mode-aware and uses host environment paths outside sandbox mode.
  - Skills XML locations now render host-resolvable paths in host mode.
  - SkillTool now adapts loaded skill content to host-safe path variables when sandbox is disabled.


## [v0.4.0]

### 🚀 Added
- **Tool Approval (HITL)**: Sensitive tools now pause and ask for user confirmation before running.
  - Desktop app shows an inline approval dialog during streaming.
  - CLI prints a boxed prompt with `suzent agent approve <id>` / `deny <id>` commands.
  - Social channels receive an alert message; reply `/y` or `/n` to respond.
  - Automated contexts (cron, heartbeat) auto-approve by default.
  - Session-level "remember" option to skip repeated prompts for the same tool.
- **Image Generation**: New tool for generating images via the configured provider.
- **Social Slash Commands**: `/help`, `/y`, `/n` command framework for social channels.
- **Agent Steering**: user can send additional text while the agent is actively streaming to redirect its behavior. 
- **Dark Mode**: Add dark mode to the desktop app.
- **Provider Abstraction**: Add provider abstraction layer for easy provider management.

### ⚡ Changed
- **Pydantic AI Migration**: Agent runtime moved from Smolagents to pydantic-ai, bringing native async streaming, structured tool definitions, and deferred-tool support for HITL.
- **Stream Parser**: Unified SSE parser (`StreamParser`) shared across CLI, social, and internal consumers — replaces per-module parsing logic.
- **Approval Manager**: Centralized `approval_manager` module replaces per-stream approval state, enabling cross-interface resolution (e.g. approve from CLI while streaming in desktop).
- **Heartbeat**: Heartbeat can be enabled per session.

### 🐛 Fixed
- **Image Input**: Fixed image input error.
- **Memory loss when stopped by user**: Fixed memory loss caused by stop.

## [v0.3.0]

### 🚀 Added
- **Automation**: Two independent automation systems for proactive agent execution.
  - **Cron Jobs**: Schedule prompts to run on a cron expression in isolated sessions (`cron-{id}`).
    - Full CRUD via Settings > Automation UI, CLI (`suzent cron`), and REST API.
    - Delivery modes: `announce` (status bar notification) or `none` (silent).
    - Per-job model override; falls back to user preference.
    - Exponential backoff retry with auto-deactivation after 5 consecutive failures.
    - Run history stored in `cron_runs` table — viewable per-job in UI and via `suzent cron history`.
    - Inline edit form in the job list card.
  - **Heartbeat**: Periodic ambient monitoring in a persistent `heartbeat-main` chat.
    - Reads `/shared/HEARTBEAT.md` checklist on each tick (configurable and default 30-minute interval).
    - `HEARTBEAT_OK` sentinel suppresses notifications when nothing needs attention.
    - Checklist editable directly in Settings > Automation or by the agent via file tools.
    - Enable/disable toggle and "Run Now" button in UI; `suzent heartbeat` CLI subcommand group.
- **CLI**: New subcommand groups for automation.
  - `suzent cron list|add|edit|remove|toggle|trigger|history|status`
  - `suzent heartbeat status|enable|disable|run`
- **Skills**: New `automation` skill documenting both systems for agent-driven scheduling.
- **Database**: `cron_jobs` table for job configuration; `cron_runs` table for execution history.
- **Docs**: [Automation guide](docs/02-concepts/automation/automation.md) covering cron expressions, heartbeat format, CLI reference, API reference, architecture, and troubleshooting.
- **i18n**: Support zh-CN in desktop app

### ⚡ Changed
- **Memory**: Cron and heartbeat now run with memory fully enabled — agent can read and write long-term memory during scheduled tasks.
- **Subprocess**: `BashTool` now uses `errors="replace"` when decoding subprocess output, preventing crashes on non-UTF-8 output (e.g. GBK on Chinese Windows).
- **Frontend**: Update the streaming and intermediate step output visuals.

### 🐛 Fixed
- **Database**: Added migration to drop legacy `is_heartbeat` column from `cron_jobs` table.


## [v0.2.8]

### 🐛 Fixed
- **Desktop App**: Fix MacOS window hanging whilst waiting for backend startup
- **Desktop App**: Fix Environment Path for desktop app
- **CLI**: Fixed recursive execution hang by nullifying stdin for backend subprocesses.
- **CLI**: Fixed connectivity issues by correctly handling dynamic port allocation in nested environments.
- **CLI**: Fixed `AuthenticationError` in CLI tools (like `speak`) by loading API keys from the database into the CLI environment.
- **Backend Setup**: Added lock check during backend environment setup to prevent `uv venv` from corrupting the virtual environment if the CLI attempts an upgrade while the GUI server is running.
- **CLI/Backend**: Fixed an issue where new configuration keys (like `TTS_MODEL` for Gemini support) were not being deployed to existing users. The backend now consistently deploys example fallback configurations so they can be seamlessly queried by tools like `suzent agent speak`.
- **Installer/Startup**: Fixed an issue where the application would hang in the "Initializing" state when auto-launched by the NSIS installer or from the Start Menu on a fresh install. The application now properly sanitizes its working directory and standard I/O streams for setup subprocesses.

## [v0.2.7]

### 🚀 Added
- **Social Messaging Tool**:
  - Now suzent could proactively send messages to any configured social platform.
- **Voice**:
  - Add voice support for suzent.
- **Node System**: OpenClaw-inspired node architecture for controlling companion devices (phones, desktops, headless servers) remotely.
  - `NodeBase` ABC and `NodeManager` for device registry, lookup, and command dispatch.
  - `WebSocketNode` with JSON-RPC-style invoke/result protocol and heartbeat support.
  - WebSocket endpoint (`/ws/node`) for node connections with Pydantic-validated handshake.
  - REST endpoints for listing (`/nodes`), describing (`/nodes/{id}`), and invoking commands (`/nodes/{id}/invoke`).
  - Pydantic models for all protocol messages and API schemas (`nodes/models.py`).
  - `nodes_enabled` and `node_auth_mode` configuration fields.
- **CLI Overhaul**: New subcommand groups alongside existing commands.
  - `suzent nodes list|status|describe|invoke` — manage connected nodes.
  - `suzent agent chat|status` — interact with the agent from the terminal.
  - `suzent config show|get|set` — view and modify configuration.
- **Skills**: New `nodes` skill teaching the agent to use `suzent nodes` commands via `BashTool`.


## [v0.2.6]

### 🚀 Added
- **Memory**:
  - Markdown memory layer — human-readable source of truth in `/shared/memory/` with daily logs (`YYYY-MM-DD.md`) and curated `MEMORY.md`.
  - Dual-write architecture — every extracted fact persisted to both markdown and LanceDB.
  - `MarkdownIndexer` for rebuilding LanceDB from markdown source of truth.
  - `TranscriptIndexer` for chunking and embedding JSONL transcripts into LanceDB (opt-in via `transcript_indexing_enabled`).
  - Transcript-linked facts with `source_session_id`, `source_transcript_line`, `source_timestamp` fields.
- **Session**:
  - JSONL per-session transcripts at `.suzent/transcripts/{session_id}.jsonl`.
  - Session lifecycle management with daily reset, idle timeout, and max turns policies.
  - `StateMirror` writes inspectable JSON snapshots to `.suzent/state/{session_id}.json`.
- **Agent State**: JSON v2 serialization format replacing opaque pickle, with backward-compatible deserialization.
- **Context**: Pre-compaction memory flush — extracts facts from steps before context compression discards them.
- **API**: New endpoints: `/session/{id}/transcript`, `/session/{id}/state`, `/memory/daily`, `/memory/daily/{date}`, `/memory/file`, `/memory/reindex`.
- **Frontend**:
  - Memory view sub-navigation with Overview, Daily Logs, MEMORY.md, and Transcripts tabs.
  - DailyLogsPanel, MemoryFilePanel, and TranscriptPanel components.
  - Extended memoryApi with 6 new API client functions and TypeScript types.

### ⚡ Changed
- **Memory**: 
  - Fact extraction prompts rewritten for concise one-sentence-per-fact output.
  - Retrieved memories formatted as single-line entries.
- **Context**: `ContextCompressor` now accepts `chat_id`/`user_id` for pre-compaction flush.
- **Database**: `ChatModel` extended with `last_active_at` and `turn_count` fields (nullable migration).
- **Frontend**: improve thinking animation.

## [v0.2.5]
### ⚡ Changed
- **Desktop Build**: Replace PyInstaller/Nuitka compilation with bundled Python + uv architecture
  - Bundle standalone Python 3.12 distribution and uv package manager
  - First-run venv creation via uv (~10-30s on first launch)
  - All native dependencies (Playwright, lancedb, crawl4ai) now work natively
  - Build time reduced from minutes/hours to ~30 seconds
- **Playwright**: Auto-install Chromium browser on first launch (no manual setup needed)
- **File Viewer**: Fix CSP to allow serving images and iframes from backend

### 🐛 Fixed
- **Desktop**: Fix window hanging whilst waiting for backend startup
- **File Viewer**: Fix JSON parse error when backend returns non-JSON responses


## [v0.2.4] - 2026-02-08
### ⚡ Changed
- **Port**: use dynamic port for backend in release mode
- **Desktop App**: use pyinstaller for faster build

### 🐛 Fixed
- **Social Messaging**: fix social messaging setting's view crashes

## [v0.2.3] - 2026-02-03

### 🚀 Added
- **MCP**: Support headers for streamable-http MCP servers.
- **Context**: Add auto context compression.

### ⚡ Changed
- **MCP**: 
    - Move MCP server management from Config View to Settings View.
    - support headers for streamable-http MCP servers.
- **Refactor**: Refactor the settings view.
- **Browser**: Allow taking control of the internal browser.

### 🐛 Fixed
- **MCP**: Fix the frontend/backend inconsistency for MCP server.

## [v0.2.2] - 2026-02-02
### 🚀 Added
- **Browser**: Add browser tool and include a browser tab in the right sidebar.
- **Social Messaging Configuration**: Add social messaging configuration to the frontend.

### ⚡ Changed
- **UI**: Move the plan view to the bottom of the right sidebar.

### 🐛 Fixed
- **UX**: hide the progress bar when the right sidebar is expanded.
- **UI**: fix memory search cancel button displacement issue.

## [v0.2.1] - 2026-02-02

### ⚡ Changed
- **Frontend**: Move social message history to a separate tab.
- **Agent Manager**: Refactored to use a more robust agent management system.

## [v0.2.0] - 2026-02-01

### 🚀 Added
- **Social Messaging**: Full integration with major social platforms (Telegram, Slack, Discord, Feishu/Lark).
    - **Smart Routing**: The agent respects context—replying inside Threads, Channels, or Groups automatically.
    - **Multi-Modal**: Send text and files/images to the agent.
    - **Access Control**: Configure allowed users via `social.json`.
- **Tools**: Bash tool support in host mode.
- **UI**: Added "Open in File Explorer" option in file view.

### ⚡ Changed
- **Configuration**: Unified credentials management in `config/social.json`.
- **Core**: Enhanced driver stability for connection handling (Socket Mode for Slack, Polling for others).
- **Context**: Automatically injects the selected context folder into the system prompt.

### 🐛 Fixed
- **Routing**: Resolved "Reply in DM" routing bug.
- **Documentation**: Corrected privacy mode documentation for Telegram.
- **Code Quality**: Linting and formatting improvements.
- **Workflow**: Fixed upgrade workflow issues.
- **Rendering**: Resolved markdown code block rendering glitches.
- **Compatibility**: Fixed "path not found" errors on macOS.
- **Performance**: Optimized path resolver logic for sandbox/host mode.

## [v0.1.3]

### ⚡ Changed
- **Optimization**: Excluded heavy unused modules to prevent C compiler heap exhaustion during build.

### 🚀 Added
- **Releases**: Released standalone executable.

## [v0.1.2]

### 🚀 Added
- **Desktop App**: Initial desktop app release.
- **Configuration**:
    - Added API Models/Keys configuration UI.
    - Added Memory configuration UI.
- **UX**: Added context selector in chat box.
- **Files**: Unified file upload support for UI and Backend.
- **Distribution**: Added distribution packages and one-click scripts for Windows, Mac, and Linux.

### ⚠️ Deprecated
- **Modes**: Browser mode is now deprecated.
