# v0.32.0

These are the release notes for gptme version v0.32.0.

## Contributors

Thanks to everyone who contributed to this release:

@0xbrayo, @dvirarad, @erikbjare, @Fsmount, @meichuanyi, @Miyou, @patriklaurell, @sebastiondev, @the-eater, @Thibaultjaigu, @TimeToBuildBob

## Changelog

Changes since v0.31.0:


## 📦 gptme

### ✨ Features (695)

 - feat(eval): add SWE-bench two-stage file retrieval ([#3179](https://github.com/gptme/gptme/issues/3179)) ([`593bdb760`](https://github.com/gptme/gptme/commit/593bdb760))
 - feat(cli): add opt-in tool-output pruning ([#3181](https://github.com/gptme/gptme/issues/3181)) ([`ffee326cc`](https://github.com/gptme/gptme/commit/ffee326cc))
 - feat(tts): better error guidance and docs when OPENROUTER_API_KEY is absent ([#3175](https://github.com/gptme/gptme/issues/3175)) ([`3d8505cdd`](https://github.com/gptme/gptme/commit/3d8505cdd))
 - feat(mcp): add 'gptme-util mcp serve' subcommand and docs ([#3170](https://github.com/gptme/gptme/issues/3170)) ([`80b8a76e5`](https://github.com/gptme/gptme/commit/80b8a76e5))
 - feat(eval): wire tokens_per_task through SWE-bench and model summary ([#3176](https://github.com/gptme/gptme/issues/3176)) ([`1b71d9cd0`](https://github.com/gptme/gptme/commit/1b71d9cd0))
 - feat(models): add GPT-5.6 Luna/Terra/Sol to OpenAI model registry ([#3166](https://github.com/gptme/gptme/issues/3166)) ([`8221940df`](https://github.com/gptme/gptme/commit/8221940df))
 - feat(subagent): accept plain dict as output_schema, generate proper JSON Schema hints ([#554](https://github.com/gptme/gptme/issues/554)) ([#3174](https://github.com/gptme/gptme/issues/3174)) ([`3b9fb6c6c`](https://github.com/gptme/gptme/commit/3b9fb6c6c))
 - feat(eval): add tokens_consumed_per_task metric to eval harness output ([#3165](https://github.com/gptme/gptme/issues/3165)) ([`e867f7ac2`](https://github.com/gptme/gptme/commit/e867f7ac2))
 - feat(mcp): expose gptme tools as MCP server (gptme-mcp-server) ([#3157](https://github.com/gptme/gptme/issues/3157)) ([`4de53ec1b`](https://github.com/gptme/gptme/commit/4de53ec1b))
 - feat(acp): add gptme-acp shim package for ACP agent registry ([#3160](https://github.com/gptme/gptme/issues/3160)) ([`10adb1181`](https://github.com/gptme/gptme/commit/10adb1181))
 - feat(cli): add GPTME_EXIT_STATS for machine-readable session cost summary ([#3159](https://github.com/gptme/gptme/issues/3159)) ([`2c62b349f`](https://github.com/gptme/gptme/commit/2c62b349f))
 - feat(computer): add --milestone and --all flags to demo command ([#216](https://github.com/gptme/gptme/issues/216)) ([#3152](https://github.com/gptme/gptme/issues/3152)) ([`99621c13a`](https://github.com/gptme/gptme/commit/99621c13a))
 - feat(subagent): subprocess-mode progress notifications via file channel ([#3153](https://github.com/gptme/gptme/issues/3153)) ([`3703b2813`](https://github.com/gptme/gptme/commit/3703b2813))
 - feat(util/replay): compound query from last N user turns for better context recovery ([#3148](https://github.com/gptme/gptme/issues/3148)) ([`3eed3fe21`](https://github.com/gptme/gptme/commit/3eed3fe21))
 - feat(rag): add project-scoped indexes ([#3150](https://github.com/gptme/gptme/issues/3150)) ([`08dbb2ea7`](https://github.com/gptme/gptme/commit/08dbb2ea7))
 - feat(subagent): add context_window to subagent_batch, subagent_parallel, subagent_pipeline ([#554](https://github.com/gptme/gptme/issues/554)) ([#3147](https://github.com/gptme/gptme/issues/3147)) ([`3014f7b0b`](https://github.com/gptme/gptme/commit/3014f7b0b))
 - feat(computer): add ComputerPreview panel using screenshot polling API ([#216](https://github.com/gptme/gptme/issues/216)) ([#3143](https://github.com/gptme/gptme/issues/3143)) ([`ef5fe719a`](https://github.com/gptme/gptme/commit/ef5fe719a))
 - feat(util): BM25 evidence replay for long-session context recovery ([#3146](https://github.com/gptme/gptme/issues/3146)) ([`0fa14d354`](https://github.com/gptme/gptme/commit/0fa14d354))
 - feat(server): add /api/v2/computer/screenshot polling API ([#216](https://github.com/gptme/gptme/issues/216)) ([#3140](https://github.com/gptme/gptme/issues/3140)) ([`201fcab38`](https://github.com/gptme/gptme/commit/201fcab38))
 - feat(llm): enable strict tool schema for openai and azure providers ([#3136](https://github.com/gptme/gptme/issues/3136)) ([`375008e97`](https://github.com/gptme/gptme/commit/375008e97))
 - feat(computer): add gptme-util computer demo command ([#216](https://github.com/gptme/gptme/issues/216)) ([#3137](https://github.com/gptme/gptme/issues/3137)) ([`b4472da86`](https://github.com/gptme/gptme/commit/b4472da86))
 - feat(subagent): add subagent_wait_any() for race/hedging patterns ([`7f160ba08`](https://github.com/gptme/gptme/commit/7f160ba08))
 - feat(computer): surface terminal startup delay fix in doctor ([#216](https://github.com/gptme/gptme/issues/216)) ([#3134](https://github.com/gptme/gptme/issues/3134)) ([`31bd7b7f8`](https://github.com/gptme/gptme/commit/31bd7b7f8))
 - feat(computer): add terminal startup latency diagnostic ([#216](https://github.com/gptme/gptme/issues/216)) ([#3130](https://github.com/gptme/gptme/issues/3130)) ([`338170adc`](https://github.com/gptme/gptme/commit/338170adc))
 - feat(eval): add 'Can it play Factorio?' local milestone validation ([#216](https://github.com/gptme/gptme/issues/216)) ([#3127](https://github.com/gptme/gptme/issues/3127)) ([`2ea863160`](https://github.com/gptme/gptme/commit/2ea863160))
 - feat(computer): add `gptme-util computer doctor` health-check command ([#216](https://github.com/gptme/gptme/issues/216)) ([#3120](https://github.com/gptme/gptme/issues/3120)) ([`b63c9b904`](https://github.com/gptme/gptme/commit/b63c9b904))
 - feat(eval): add 'Can it play Doom?' local milestone validation ([#216](https://github.com/gptme/gptme/issues/216)) ([#3115](https://github.com/gptme/gptme/issues/3115)) ([`006c3ef4f`](https://github.com/gptme/gptme/commit/006c3ef4f))
 - feat(eval): add 'Can it Tweet?' local milestone validation ([#216](https://github.com/gptme/gptme/issues/216)) ([#3112](https://github.com/gptme/gptme/issues/3112)) ([`e2f9f87bd`](https://github.com/gptme/gptme/commit/e2f9f87bd))
 - feat(subagent): add subagent_pipeline() for staged fan-out with no barrier ([#554](https://github.com/gptme/gptme/issues/554)) ([#3110](https://github.com/gptme/gptme/issues/3110)) ([`41bb73e21`](https://github.com/gptme/gptme/commit/41bb73e21))
 - feat(browser): add load_browser_state() for in-session auth state restoration ([#3108](https://github.com/gptme/gptme/issues/3108)) ([`d673fb256`](https://github.com/gptme/gptme/commit/d673fb256))
 - feat(browser): add hover_element(), snapshot_page(), get_current_url() ([#216](https://github.com/gptme/gptme/issues/216)) ([#3104](https://github.com/gptme/gptme/issues/3104)) ([`9efc6b080`](https://github.com/gptme/gptme/commit/9efc6b080))
 - feat(eval): add eval tests for press_key/select_option/wait_for_element ([#216](https://github.com/gptme/gptme/issues/216)) ([#3097](https://github.com/gptme/gptme/issues/3097)) ([`5f2398c9e`](https://github.com/gptme/gptme/commit/5f2398c9e))
 - feat(subagent): token budget tracking — input/output tokens in ReturnType and BatchJob ([#554](https://github.com/gptme/gptme/issues/554)) ([#3099](https://github.com/gptme/gptme/issues/3099)) ([`9de8a92cf`](https://github.com/gptme/gptme/commit/9de8a92cf))
 - feat(subagent): add output_schema, workdir, context_turns to subagent_parallel() and batch ([#554](https://github.com/gptme/gptme/issues/554)) ([#3096](https://github.com/gptme/gptme/issues/3096)) ([`08692fa3c`](https://github.com/gptme/gptme/commit/08692fa3c))
 - feat(subagent): suppress thread-mode subagent terminal output (closes [#554](https://github.com/gptme/gptme/issues/554)) ([#3094](https://github.com/gptme/gptme/issues/3094)) ([`b03935ed5`](https://github.com/gptme/gptme/commit/b03935ed5))
 - feat(browser): add press_key, select_option, wait_for_element for computer-use ([#216](https://github.com/gptme/gptme/issues/216)) ([#3095](https://github.com/gptme/gptme/issues/3095)) ([`09d5c5e35`](https://github.com/gptme/gptme/commit/09d5c5e35))
 - feat(computer): add latency diagnostic command for diagnosing delays ([#216](https://github.com/gptme/gptme/issues/216)) ([#3093](https://github.com/gptme/gptme/issues/3093)) ([`007fe94b2`](https://github.com/gptme/gptme/commit/007fe94b2))
 - feat(subagent): enforce output_schema at the complete-block layer ([#3090](https://github.com/gptme/gptme/issues/3090)) ([`7e81ba052`](https://github.com/gptme/gptme/commit/7e81ba052))
 - feat(doctor): add ffmpeg check for screen recording ([#216](https://github.com/gptme/gptme/issues/216)) ([#3089](https://github.com/gptme/gptme/issues/3089)) ([`03bb8ac4d`](https://github.com/gptme/gptme/commit/03bb8ac4d))
 - feat(computer): add screen recording — start_recording / record_screen / gptme-util computer record ([#216](https://github.com/gptme/gptme/issues/216)) ([#3088](https://github.com/gptme/gptme/issues/3088)) ([`5771653e8`](https://github.com/gptme/gptme/commit/5771653e8))
 - feat(subagent): add subagent_parallel() fan-out + fix BatchJob.wait_all() sequential wait bug ([#3085](https://github.com/gptme/gptme/issues/3085)) ([`7ca25ee31`](https://github.com/gptme/gptme/commit/7ca25ee31))
 - feat(computer): add run-task CLI + fix include_paths directory test ([#216](https://github.com/gptme/gptme/issues/216)) ([#3086](https://github.com/gptme/gptme/issues/3086)) ([`6816c0408`](https://github.com/gptme/gptme/commit/6816c0408))
 - feat(computer): expose audit trail in computer_task() result + --agent-id CLI option ([#216](https://github.com/gptme/gptme/issues/216)) ([#3084](https://github.com/gptme/gptme/issues/3084)) ([`d76c3531a`](https://github.com/gptme/gptme/commit/d76c3531a))
 - feat(computer): add --jsonl output format to audit-log ([#3083](https://github.com/gptme/gptme/issues/3083)) ([`6f6a2b150`](https://github.com/gptme/gptme/commit/6f6a2b150))
 - feat(computer): add real-time risk-label streaming to parent agent ([#216](https://github.com/gptme/gptme/issues/216)) ([#3082](https://github.com/gptme/gptme/issues/3082)) ([`3cd6ebff3`](https://github.com/gptme/gptme/commit/3cd6ebff3))
 - feat(computer): add pre-action confirmation gate for sensitive actions ([#216](https://github.com/gptme/gptme/issues/216)) ([#3081](https://github.com/gptme/gptme/issues/3081)) ([`5dde6e21d`](https://github.com/gptme/gptme/commit/5dde6e21d))
 - feat(computer): add risk-level classification to audit-log ([#216](https://github.com/gptme/gptme/issues/216)) ([#3071](https://github.com/gptme/gptme/issues/3071)) ([`826494cc3`](https://github.com/gptme/gptme/commit/826494cc3))
 - feat(chats): add --all-agents flag to search Cursor and Codex sessions ([#3068](https://github.com/gptme/gptme/issues/3068)) ([`94c303989`](https://github.com/gptme/gptme/commit/94c303989))
 - feat(browser): add session persistence via GPTME_BROWSER_STORAGE_STATE ([#216](https://github.com/gptme/gptme/issues/216)) ([#3069](https://github.com/gptme/gptme/issues/3069)) ([`819f1b778`](https://github.com/gptme/gptme/commit/819f1b778))
 - feat(server): add --default-profile option for specialized deployments ([#3063](https://github.com/gptme/gptme/issues/3063)) ([`a935a2471`](https://github.com/gptme/gptme/commit/a935a2471))
 - feat(computer): add `gptme-util computer video-frames` CLI command ([#3062](https://github.com/gptme/gptme/issues/3062)) ([`112060a75`](https://github.com/gptme/gptme/commit/112060a75))
 - feat(computer): add computer-use service to docker-compose.yml ([#216](https://github.com/gptme/gptme/issues/216)) ([#3061](https://github.com/gptme/gptme/issues/3061)) ([`ff3d32542`](https://github.com/gptme/gptme/commit/ff3d32542))
 - feat(computer): add `gptme-util computer screenshot` CLI command ([#216](https://github.com/gptme/gptme/issues/216)) ([#3060](https://github.com/gptme/gptme/issues/3060)) ([`0ab94ca91`](https://github.com/gptme/gptme/commit/0ab94ca91))
 - feat(cli): show discovered gptme-* plugins in `gptme --help` (Part 3 of [#3051](https://github.com/gptme/gptme/issues/3051)) ([#3057](https://github.com/gptme/gptme/issues/3057)) ([`b43b2081a`](https://github.com/gptme/gptme/commit/b43b2081a))
 - feat(setup): add custom OpenAI-compatible provider to interactive setup ([#3056](https://github.com/gptme/gptme/issues/3056)) ([`6e86ec9ac`](https://github.com/gptme/gptme/commit/6e86ec9ac))
 - feat(cli): gptme-util subcommand mirroring (gptme chats → gptme-util chats) ([#3052](https://github.com/gptme/gptme/issues/3052)) ([`a2b6e0fea`](https://github.com/gptme/gptme/commit/a2b6e0fea))
 - feat(computer): add computer_task() for context-efficient subagent delegation ([#216](https://github.com/gptme/gptme/issues/216)) ([`b894c41a4`](https://github.com/gptme/gptme/commit/b894c41a4))
 - feat(cli): add `gptme search` alias for `gptme-util chats search` ([#3050](https://github.com/gptme/gptme/issues/3050)) ([`65610d791`](https://github.com/gptme/gptme/commit/65610d791))
 - feat(computer): track act_and_observe() calls in audit-log ([#216](https://github.com/gptme/gptme/issues/216)) ([#3043](https://github.com/gptme/gptme/issues/3043)) ([`efc5c9d25`](https://github.com/gptme/gptme/commit/efc5c9d25))
 - feat(config): allow setting system prompt type in gptme.toml via [prompt] system ([#3044](https://github.com/gptme/gptme/issues/3044)) ([`9d0ab3a27`](https://github.com/gptme/gptme/commit/9d0ab3a27))
 - feat(computer): add act_and_observe() for the 'act then look' loop ([#216](https://github.com/gptme/gptme/issues/216)) ([#3042](https://github.com/gptme/gptme/issues/3042)) ([`346600202`](https://github.com/gptme/gptme/commit/346600202))
 - feat(computer): extend audit-log to track browser interactions ([#216](https://github.com/gptme/gptme/issues/216)) ([#3041](https://github.com/gptme/gptme/issues/3041)) ([`b95e29af4`](https://github.com/gptme/gptme/commit/b95e29af4))
 - feat(reduce): emit visible feedback when log is truncated ([#3038](https://github.com/gptme/gptme/issues/3038)) ([`658a3a404`](https://github.com/gptme/gptme/commit/658a3a404))
 - feat(computer): add macOS accessibility tree + click via osascript ([#216](https://github.com/gptme/gptme/issues/216)) ([#3040](https://github.com/gptme/gptme/issues/3040)) ([`d12f3fb26`](https://github.com/gptme/gptme/commit/d12f3fb26))
 - feat(computer): add audit-log CLI + interactive web action evals ([#216](https://github.com/gptme/gptme/issues/216)) ([#3030](https://github.com/gptme/gptme/issues/3030)) ([`6b5a5183d`](https://github.com/gptme/gptme/commit/6b5a5183d))
 - feat(webui): windowed open (limit=50) + 'Load older' button ([#3034](https://github.com/gptme/gptme/issues/3034)) ([`8d15d61af`](https://github.com/gptme/gptme/commit/8d15d61af))
 - feat(server): add ?status= filter to GET /api/v2/tasks list endpoint ([#3033](https://github.com/gptme/gptme/issues/3033)) ([`ae46a7bdf`](https://github.com/gptme/gptme/commit/ae46a7bdf))
 - feat(safety): add local heuristic safety check to chats export ([#3023](https://github.com/gptme/gptme/issues/3023)) ([`d675df2a5`](https://github.com/gptme/gptme/commit/d675df2a5))
 - feat(webui): render normalized transcript messages in session replay detail ([#3028](https://github.com/gptme/gptme/issues/3028)) ([`b10cde34f`](https://github.com/gptme/gptme/commit/b10cde34f))
 - feat(subagent): add context_turns parameter for parent conversation forwarding ([#3008](https://github.com/gptme/gptme/issues/3008)) ([`b673ad792`](https://github.com/gptme/gptme/commit/b673ad792))
 - feat(commands): add /rag slash command for mid-session RAG queries ([#3022](https://github.com/gptme/gptme/issues/3022)) ([`260d7a466`](https://github.com/gptme/gptme/commit/260d7a466))
 - feat(eval): add computer-use eval suite + observe_web/observe_desktop in profile ([#216](https://github.com/gptme/gptme/issues/216)) ([#3020](https://github.com/gptme/gptme/issues/3020)) ([`0245a3b89`](https://github.com/gptme/gptme/commit/0245a3b89))
 - feat(subagent): add max_time parameter for auto-cancel watchdog ([#3019](https://github.com/gptme/gptme/issues/3019)) ([`3d220cc73`](https://github.com/gptme/gptme/commit/3d220cc73))
 - feat(computer): add AT-SPI2 accessibility tree actions for Linux native apps ([#3018](https://github.com/gptme/gptme/issues/3018)) ([`4d1bd24ee`](https://github.com/gptme/gptme/commit/4d1bd24ee))
 - feat(computer): add observe_web/observe_desktop helpers + unit tests for window_focus and wait_for_change ([#216](https://github.com/gptme/gptme/issues/216)) ([#3011](https://github.com/gptme/gptme/issues/3011)) ([`86a14c6d6`](https://github.com/gptme/gptme/commit/86a14c6d6))
 - feat(server): add HTTP QUERY method to /api/v2/tools for filtered introspection ([#3010](https://github.com/gptme/gptme/issues/3010)) ([`259eedbe3`](https://github.com/gptme/gptme/commit/259eedbe3))
 - feat(tools): annotate core built-in tools with hints metadata ([#3009](https://github.com/gptme/gptme/issues/3009)) ([`4912d2281`](https://github.com/gptme/gptme/commit/4912d2281))
 - feat(subagent): compact result summary in subagent_wait ([#554](https://github.com/gptme/gptme/issues/554)) ([#3007](https://github.com/gptme/gptme/issues/3007)) ([`8d974ca1f`](https://github.com/gptme/gptme/commit/8d974ca1f))
 - feat(subagent): add workdir parameter for explicit workspace control ([#2989](https://github.com/gptme/gptme/issues/2989)) ([`5d7dacdbb`](https://github.com/gptme/gptme/commit/5d7dacdbb))
 - feat(cli): add gptme attest sign and verify commands ([#2978](https://github.com/gptme/gptme/issues/2978)) ([`be689fa04`](https://github.com/gptme/gptme/commit/be689fa04))
 - feat(browser): make Playwright engine configurable via GPTME_BROWSER_ENGINE ([#2996](https://github.com/gptme/gptme/issues/2996)) ([`0dd93066f`](https://github.com/gptme/gptme/commit/0dd93066f))
 - feat: add Requesty as an OpenAI-compatible provider ([#2993](https://github.com/gptme/gptme/issues/2993)) ([`cf91ac1e4`](https://github.com/gptme/gptme/commit/cf91ac1e4))
 - feat(lessons): randomized lesson-dropout injection for causal LOO ([#2988](https://github.com/gptme/gptme/issues/2988)) ([`7dbb0f36a`](https://github.com/gptme/gptme/commit/7dbb0f36a))
 - feat(subagent): expose context_window in tool instructions; validate negative values ([#2976](https://github.com/gptme/gptme/issues/2976)) ([`0192f2328`](https://github.com/gptme/gptme/commit/0192f2328))
 - feat(subagent): context_window parameter for workspace context isolation ([#2975](https://github.com/gptme/gptme/issues/2975)) ([`31acfcba6`](https://github.com/gptme/gptme/commit/31acfcba6))
 - feat(cli): add context search-conversations subcommand for RAG conversation search ([#2971](https://github.com/gptme/gptme/issues/2971)) ([`07f3c1b3f`](https://github.com/gptme/gptme/commit/07f3c1b3f))
 - feat(subagent): add subagent_list() tool for observability ([`67235e921`](https://github.com/gptme/gptme/commit/67235e921))
 - feat(subagent): add redact_secrets option for context isolation ([#2950](https://github.com/gptme/gptme/issues/2950)) ([`27e6942fe`](https://github.com/gptme/gptme/commit/27e6942fe))
 - feat(logmanager): append-only event log for session durability (Phase 1) ([#2956](https://github.com/gptme/gptme/issues/2956)) ([`94f0c6e79`](https://github.com/gptme/gptme/commit/94f0c6e79))
 - feat(server): add /api/v2/version endpoint (Slice 2) ([#2954](https://github.com/gptme/gptme/issues/2954)) ([`b865baecb`](https://github.com/gptme/gptme/commit/b865baecb))
 - feat(server): add API version constants, contract_revision, and X-API-Version header ([#2952](https://github.com/gptme/gptme/issues/2952)) ([`9d005b0fb`](https://github.com/gptme/gptme/commit/9d005b0fb))
 - feat(webui): chat UI polish — role-aligned message footer + Chat-button sidebar toggle ([#2947](https://github.com/gptme/gptme/issues/2947)) ([`7b44dbee2`](https://github.com/gptme/gptme/commit/7b44dbee2))
 - feat(cli): add gptme-resume subcommand for lossy session rehydration ([#2933](https://github.com/gptme/gptme/issues/2933)) ([`59728c6ae`](https://github.com/gptme/gptme/commit/59728c6ae))
 - feat(cli): add `gptme-util snapshot list` subcommand ([#2932](https://github.com/gptme/gptme/issues/2932)) ([`002c94806`](https://github.com/gptme/gptme/commit/002c94806))
 - feat(webui): fork conversations from any message ([#2923](https://github.com/gptme/gptme/issues/2923)) ([`a36df3ef2`](https://github.com/gptme/gptme/commit/a36df3ef2))
 - feat(llm): add built-in offline mock provider ([`c92bc5a2a`](https://github.com/gptme/gptme/commit/c92bc5a2a))
 - feat(subagent): progress tool — intermediate parent notifications during long tasks ([#554](https://github.com/gptme/gptme/issues/554)) ([#2921](https://github.com/gptme/gptme/issues/2921)) ([`5de530f34`](https://github.com/gptme/gptme/commit/5de530f34))
 - feat(ci): run webui e2e tests against both stable and dev gptme ([`5b3f8364b`](https://github.com/gptme/gptme/commit/5b3f8364b))
 - feat(shell): suggest subagent when cd enters workspace with gptme.toml ([#554](https://github.com/gptme/gptme/issues/554)) ([#2920](https://github.com/gptme/gptme/issues/2920)) ([`15aee6267`](https://github.com/gptme/gptme/commit/15aee6267))
 - feat(subagent): clarification mechanism — subagents can pause and ask parent for more info ([#2906](https://github.com/gptme/gptme/issues/2906)) ([`c723802e7`](https://github.com/gptme/gptme/commit/c723802e7))
 - feat(doctor): add computer use prerequisite checks + run-docker-computer target ([#2908](https://github.com/gptme/gptme/issues/2908)) ([`3763dcca7`](https://github.com/gptme/gptme/commit/3763dcca7))
 - feat(webui/stt): add sttAuthToken setting for cloud-authenticated STT ([#2903](https://github.com/gptme/gptme/issues/2903)) ([`7b21c1a1b`](https://github.com/gptme/gptme/commit/7b21c1a1b))
 - feat(profiles): add structured-first backend selection to computer-use profile ([#2907](https://github.com/gptme/gptme/issues/2907)) ([`70546a9ed`](https://github.com/gptme/gptme/commit/70546a9ed))
 - feat(computer): add window_focus action for reliable new-window targeting ([`33d59fd4a`](https://github.com/gptme/gptme/commit/33d59fd4a))
 - feat(computer): add wait_for_change action for context-efficient UI loops ([#2898](https://github.com/gptme/gptme/issues/2898)) ([`28bef9c84`](https://github.com/gptme/gptme/commit/28bef9c84))
 - feat(subagent): configurable max_concurrent cap with semaphore gating ([#2892](https://github.com/gptme/gptme/issues/2892)) ([`e3c553c95`](https://github.com/gptme/gptme/commit/e3c553c95))
 - feat(tools): as_function_subtoolspecs() — invoke tool functions without IPython ([#2899](https://github.com/gptme/gptme/issues/2899)) ([`a02099cc9`](https://github.com/gptme/gptme/commit/a02099cc9))
 - feat(snapshot): add --dry-run / -n flag to /snapshot prune ([#2897](https://github.com/gptme/gptme/issues/2897)) ([`264d7a7cf`](https://github.com/gptme/gptme/commit/264d7a7cf))
 - feat(scripts): add treeofthoughts.py — eval-guided tree search for agents ([#495](https://github.com/gptme/gptme/issues/495)) ([#2900](https://github.com/gptme/gptme/issues/2900)) ([`d1100e782`](https://github.com/gptme/gptme/commit/d1100e782))
 - feat(webui): add 'Try the offline demo' CTA to disconnected state ([#2902](https://github.com/gptme/gptme/issues/2902)) ([`bf78ad3cf`](https://github.com/gptme/gptme/commit/bf78ad3cf))
 - feat(webui/tts): add ttsAuthToken setting for cloud-authenticated TTS ([`00e6c3892`](https://github.com/gptme/gptme/commit/00e6c3892))
 - feat(util): add --output-format json to gptme-util llm generate ([#2896](https://github.com/gptme/gptme/issues/2896)) ([`062ab2c89`](https://github.com/gptme/gptme/commit/062ab2c89))
 - feat(tools): add root-cause classification to stuck_detect_hook ([#2895](https://github.com/gptme/gptme/issues/2895)) ([`7137fc796`](https://github.com/gptme/gptme/commit/7137fc796))
 - feat(util): add --max-tokens and --temperature to llm generate ([#2894](https://github.com/gptme/gptme/issues/2894)) ([`e3d73858d`](https://github.com/gptme/gptme/commit/e3d73858d))
 - feat(tools): ToolSpec.from_function() + parameter extraction in from_callable ([#2893](https://github.com/gptme/gptme/issues/2893)) ([`9a098fbfd`](https://github.com/gptme/gptme/commit/9a098fbfd))
 - feat(rag): add rag_index_conversations for indexing past conversations ([#2883](https://github.com/gptme/gptme/issues/2883)) ([`882019e31`](https://github.com/gptme/gptme/commit/882019e31))
 - feat(snapshot): add /snapshot prune subcommand ([#2887](https://github.com/gptme/gptme/issues/2887)) ([`a2b069329`](https://github.com/gptme/gptme/commit/a2b069329))
 - feat(subagent): add subagent_cancel() + tests for resolve_role_defaults ([#2889](https://github.com/gptme/gptme/issues/2889)) ([`1319c19ef`](https://github.com/gptme/gptme/commit/1319c19ef))
 - feat(tools): hint-based allowlist and MCP annotation hints ([#2890](https://github.com/gptme/gptme/issues/2890)) ([`7d818cf80`](https://github.com/gptme/gptme/commit/7d818cf80))
 - feat(llm): route gptme cloud models through their real backend SDK ([#2876](https://github.com/gptme/gptme/issues/2876)) ([`b61f2560c`](https://github.com/gptme/gptme/commit/b61f2560c))
 - feat(tools): introduce ToolFunction abstraction for structured callable metadata ([#2880](https://github.com/gptme/gptme/issues/2880)) ([`00a45bdaa`](https://github.com/gptme/gptme/commit/00a45bdaa))
 - feat(snapshot): embed conversation message count for diff summary ([#2886](https://github.com/gptme/gptme/issues/2886)) ([`d0baa64a4`](https://github.com/gptme/gptme/commit/d0baa64a4))
 - feat(computer): add scroll action for mouse wheel support ([#2884](https://github.com/gptme/gptme/issues/2884)) ([`7e0de973a`](https://github.com/gptme/gptme/commit/7e0de973a))
 - feat(subagent): forward subprocess/isolated defaults from planner subtask roles ([#2881](https://github.com/gptme/gptme/issues/2881)) ([`9eb57759f`](https://github.com/gptme/gptme/commit/9eb57759f))
 - feat(commands): add /snapshot command for agent tree search ([#495](https://github.com/gptme/gptme/issues/495)) ([#2885](https://github.com/gptme/gptme/issues/2885)) ([`83f78db49`](https://github.com/gptme/gptme/commit/83f78db49))
 - feat(tools): add view_anchored and patch_anchored tools (Gate G2) ([#2882](https://github.com/gptme/gptme/issues/2882)) ([`74713885e`](https://github.com/gptme/gptme/commit/74713885e))
 - feat(commands): add /backtrack for in-session conversation recovery ([#2878](https://github.com/gptme/gptme/issues/2878)) ([`ca29f94f3`](https://github.com/gptme/gptme/commit/ca29f94f3))
 - feat(webui): thread log_offset through conversation state for windowed pagination (Slice 1) ([#2872](https://github.com/gptme/gptme/issues/2872)) ([`c4d7e42bf`](https://github.com/gptme/gptme/commit/c4d7e42bf))
 - feat(openai): enable Responses API by default for gpt-5/o-series models ([#2869](https://github.com/gptme/gptme/issues/2869)) ([`9e3a72e85`](https://github.com/gptme/gptme/commit/9e3a72e85))
 - feat(server): add /api/v0/metrics Prometheus endpoint ([#2870](https://github.com/gptme/gptme/issues/2870)) ([`4a7e7f36e`](https://github.com/gptme/gptme/commit/4a7e7f36e))
 - feat(server): add limit/before message pagination to conversation GET ([#2861](https://github.com/gptme/gptme/issues/2861)) ([`dd968bcdf`](https://github.com/gptme/gptme/commit/dd968bcdf))
 - feat(server): add ?q= filter param to conversations API with server-side webui search ([#2864](https://github.com/gptme/gptme/issues/2864)) ([`6a8eaf55c`](https://github.com/gptme/gptme/commit/6a8eaf55c))
 - feat(webui): add sort control to conversation list (Recent/Longest/A-Z) ([#2865](https://github.com/gptme/gptme/issues/2865)) ([`50e36b977`](https://github.com/gptme/gptme/commit/50e36b977))
 - feat(server): cursor-based pagination for conversations list ([#2860](https://github.com/gptme/gptme/issues/2860)) ([`4a909d2fd`](https://github.com/gptme/gptme/commit/4a909d2fd))
 - feat(webui): server-backed star/unstar for conversations via metadata sidecar ([#2848](https://github.com/gptme/gptme/issues/2848)) ([`962d86065`](https://github.com/gptme/gptme/commit/962d86065))
 - feat(cli): add --no-workspace flag to skip all workspace context ([#2853](https://github.com/gptme/gptme/issues/2853)) ([`41628ff9e`](https://github.com/gptme/gptme/commit/41628ff9e))
 - feat(extension): add conversation history ([#2760](https://github.com/gptme/gptme/issues/2760)) ([`58e9f7e43`](https://github.com/gptme/gptme/commit/58e9f7e43))
 - feat(cli): add startup prompt stats report ([#2843](https://github.com/gptme/gptme/issues/2843)) ([`3eee34a41`](https://github.com/gptme/gptme/commit/3eee34a41))
 - feat(eval): surface per-task tool-call count (tool-efficiency metric) ([#2844](https://github.com/gptme/gptme/issues/2844)) ([`0ec74c311`](https://github.com/gptme/gptme/commit/0ec74c311))
 - feat(webui): show conversation stats in list using list-response data ([#2841](https://github.com/gptme/gptme/issues/2841)) ([`f328d7d10`](https://github.com/gptme/gptme/commit/f328d7d10))
 - feat(webui): add settings-level STT provider choice (browser vs server) ([#2840](https://github.com/gptme/gptme/issues/2840)) ([`b8832e46b`](https://github.com/gptme/gptme/commit/b8832e46b))
 - feat(eval): add narrow swebench install extra ([#2837](https://github.com/gptme/gptme/issues/2837)) ([`5bd8ccd8f`](https://github.com/gptme/gptme/commit/5bd8ccd8f))
 - feat(webui): add / keyboard shortcut to focus conversation search ([#2838](https://github.com/gptme/gptme/issues/2838)) ([`7adc7ba1c`](https://github.com/gptme/gptme/commit/7adc7ba1c))
 - feat(webui): show relative timestamps on messages with auto-refresh ([#2828](https://github.com/gptme/gptme/issues/2828)) ([`b7f7dda26`](https://github.com/gptme/gptme/commit/b7f7dda26))
 - feat(config): add context_exclude glob patterns to [prompt] in gptme.toml ([#2831](https://github.com/gptme/gptme/issues/2831)) ([`6c81eae71`](https://github.com/gptme/gptme/commit/6c81eae71))
 - feat(server): expose message_count and last_updated in conversation list ([#2833](https://github.com/gptme/gptme/issues/2833)) ([`0f791e8cc`](https://github.com/gptme/gptme/commit/0f791e8cc))
 - feat(webui): persist conversation search query in URL ?search= param ([#2834](https://github.com/gptme/gptme/issues/2834)) ([`cd0a87bd8`](https://github.com/gptme/gptme/commit/cd0a87bd8))
 - feat(webui): highlight matched search terms in conversation list titles ([#2832](https://github.com/gptme/gptme/issues/2832)) ([`783d5bab8`](https://github.com/gptme/gptme/commit/783d5bab8))
 - feat(webui): add conversation list search/filter ([#2827](https://github.com/gptme/gptme/issues/2827)) ([`9fb50d57c`](https://github.com/gptme/gptme/commit/9fb50d57c))
 - feat(webui): add persistent no-confirm (YOLO) mode setting ([#2825](https://github.com/gptme/gptme/issues/2825)) ([`c5cc33586`](https://github.com/gptme/gptme/commit/c5cc33586))
 - feat(webui): show message count as badge on conversation title line ([#2823](https://github.com/gptme/gptme/issues/2823)) ([`116defea7`](https://github.com/gptme/gptme/commit/116defea7))
 - feat(webui): add keyboard shortcut (Ctrl+Shift+\) to toggle split view ([#2816](https://github.com/gptme/gptme/issues/2816)) ([`5560bd7b6`](https://github.com/gptme/gptme/commit/5560bd7b6))
 - feat(webui): add URL subroutes for settings category deep-linking ([#2824](https://github.com/gptme/gptme/issues/2824)) ([`a7a93db98`](https://github.com/gptme/gptme/commit/a7a93db98))
 - feat(server): add A2A JSON-RPC MVP ([#2763](https://github.com/gptme/gptme/issues/2763)) ([`cb601a600`](https://github.com/gptme/gptme/commit/cb601a600))
 - feat(webui): add per-pane conversation selector in split view (Slice 2) ([#2817](https://github.com/gptme/gptme/issues/2817)) ([`a7c852816`](https://github.com/gptme/gptme/commit/a7c852816))
 - feat(artifacts): format-independent file-write parsing + diffs ([#2818](https://github.com/gptme/gptme/issues/2818)) ([`7d496f481`](https://github.com/gptme/gptme/commit/7d496f481))
 - feat(webui): add TTS engine selector (browser / gptme-server / gptme-tts) ([#2815](https://github.com/gptme/gptme/issues/2815)) ([`ab655640b`](https://github.com/gptme/gptme/commit/ab655640b))
 - feat(artifacts): include workspace files created/modified by the conversation ([#2814](https://github.com/gptme/gptme/issues/2814)) ([`85b8b8d2b`](https://github.com/gptme/gptme/commit/85b8b8d2b))
 - feat(webui): show active model in conversation header ([#2812](https://github.com/gptme/gptme/issues/2812)) ([`75cbfc6b0`](https://github.com/gptme/gptme/commit/75cbfc6b0))
 - feat(ci): self-heal Phase 2 — auto-open draft fix PR on structured gate pass ([#2813](https://github.com/gptme/gptme/issues/2813)) ([`44f9f2939`](https://github.com/gptme/gptme/commit/44f9f2939))
 - feat(webui): add split-pane conversation view (Slice 1 — layout skeleton) ([#2776](https://github.com/gptme/gptme/issues/2776)) ([`5713eb7d5`](https://github.com/gptme/gptme/commit/5713eb7d5))
 - feat(webui): add /settings route with full-page settings view ([#2806](https://github.com/gptme/gptme/issues/2806)) ([`ba34a85f3`](https://github.com/gptme/gptme/commit/ba34a85f3))
 - feat(webui): model favorites, set-as-default, and picker scroll fix ([#2801](https://github.com/gptme/gptme/issues/2801)) ([`7eabaeebf`](https://github.com/gptme/gptme/commit/7eabaeebf))
 - feat(webui): toggle/stop TTS playback from the message button ([#2803](https://github.com/gptme/gptme/issues/2803)) ([`1595ad8e2`](https://github.com/gptme/gptme/commit/1595ad8e2))
 - feat(cli): add --format table option to gptme-util status ([#2797](https://github.com/gptme/gptme/issues/2797)) ([`8db1b3805`](https://github.com/gptme/gptme/commit/8db1b3805))
 - feat(webui): auto-poll provider health every 60s; add degraded badge on settings icon ([#2792](https://github.com/gptme/gptme/issues/2792)) ([`c8f33ee17`](https://github.com/gptme/gptme/commit/c8f33ee17))
 - feat(webui): add Alt+N global shortcut for new conversation ([#2779](https://github.com/gptme/gptme/issues/2779)) ([`b7722965b`](https://github.com/gptme/gptme/commit/b7722965b))
 - feat(server): add provider health endpoint and webui panel ([#2775](https://github.com/gptme/gptme/issues/2775)) ([`ba1cf5992`](https://github.com/gptme/gptme/commit/ba1cf5992))
 - feat(webui): add server-side TTS endpoint via OpenRouter ([#2795](https://github.com/gptme/gptme/issues/2795)) ([`7fb8051a2`](https://github.com/gptme/gptme/commit/7fb8051a2))
 - feat(webui): add OpenRouter STT fallback for unsupported browsers ([`88b87ecfc`](https://github.com/gptme/gptme/commit/88b87ecfc))
 - feat(server): add `detail` query param to conversation list endpoint ([#2791](https://github.com/gptme/gptme/issues/2791)) ([`332fc2dfb`](https://github.com/gptme/gptme/commit/332fc2dfb))
 - feat(plugins): discover src-layout plugins, layer user [plugins], lenient +tool ([#2781](https://github.com/gptme/gptme/issues/2781)) ([`6b6985124`](https://github.com/gptme/gptme/commit/6b6985124))
 - feat(webui): add browser TTS for assistant messages (Slice 1 — Web Speech API) ([#2778](https://github.com/gptme/gptme/issues/2778)) ([`f7dcbb8bd`](https://github.com/gptme/gptme/commit/f7dcbb8bd))
 - feat(chats): add per-conversation session stats ([#2774](https://github.com/gptme/gptme/issues/2774)) ([`68459b62d`](https://github.com/gptme/gptme/commit/68459b62d))
 - feat(webui): add staging deploy trigger ([#2771](https://github.com/gptme/gptme/issues/2771)) ([`7b9ea0cab`](https://github.com/gptme/gptme/commit/7b9ea0cab))
 - feat(webui): add conversation system prompt override ([#2672](https://github.com/gptme/gptme/issues/2672)) ([`17b91546a`](https://github.com/gptme/gptme/commit/17b91546a))
 - feat(util): add batch mode command ([#2759](https://github.com/gptme/gptme/issues/2759)) ([`5dd3ea6e4`](https://github.com/gptme/gptme/commit/5dd3ea6e4))
 - feat(util): add gptme-util status subcommand for operator handoff ([#2752](https://github.com/gptme/gptme/issues/2752)) ([`7355b1820`](https://github.com/gptme/gptme/commit/7355b1820))
 - feat(complete): stuck/loop detection hook for repeating tool calls ([#2743](https://github.com/gptme/gptme/issues/2743)) ([`7e2f394c0`](https://github.com/gptme/gptme/commit/7e2f394c0))
 - feat(webui): add live_app panel kind distinct from iframe panels ([#2754](https://github.com/gptme/gptme/issues/2754)) ([`2c19195f6`](https://github.com/gptme/gptme/commit/2c19195f6))
 - feat(patch): add _anchored core module — hash-anchored line editing ([#2733](https://github.com/gptme/gptme/issues/2733)) ([`be43ca2e0`](https://github.com/gptme/gptme/commit/be43ca2e0))
 - feat(webui): add open conversation directory action ([#2673](https://github.com/gptme/gptme/issues/2673)) ([`6a29d3f93`](https://github.com/gptme/gptme/commit/6a29d3f93))
 - feat(cost_tracker): add extras dict and record_extra() to SessionCosts ([#2735](https://github.com/gptme/gptme/issues/2735)) ([`641dbdeba`](https://github.com/gptme/gptme/commit/641dbdeba))
 - feat(webui): suppress live fetches in demo mode ([#2721](https://github.com/gptme/gptme/issues/2721)) ([`8f15739c6`](https://github.com/gptme/gptme/commit/8f15739c6))
 - feat(self-heal): add structured autofix gate ([#2697](https://github.com/gptme/gptme/issues/2697)) ([`b3c609a45`](https://github.com/gptme/gptme/commit/b3c609a45))
 - feat(webui): replay demo tool-call flow ([`e95a2aa48`](https://github.com/gptme/gptme/commit/e95a2aa48))
 - feat(ci): self-heal workflow — analyze test failures and propose fixes (Phase 1) ([`919836d17`](https://github.com/gptme/gptme/commit/919836d17))
 - feat(webui): add config file editor ([#2677](https://github.com/gptme/gptme/issues/2677)) ([`5cca4905b`](https://github.com/gptme/gptme/commit/5cca4905b))
 - feat(webui): demo mode slice 2 — fixture-backed read paths ([#2687](https://github.com/gptme/gptme/issues/2687)) ([`9ffb02611`](https://github.com/gptme/gptme/commit/9ffb02611))
 - feat(webui): offline demo ApiClient seam (IApiClient + createDemoApiClient) ([#2664](https://github.com/gptme/gptme/issues/2664)) ([`58c46e795`](https://github.com/gptme/gptme/commit/58c46e795))
 - feat(webui): import exported conversation JSON ([#2671](https://github.com/gptme/gptme/issues/2671)) ([`fbbaac911`](https://github.com/gptme/gptme/commit/fbbaac911))
 - feat(webui): add Ctrl+F message search with match navigation ([#2668](https://github.com/gptme/gptme/issues/2668)) ([`d598b5e7f`](https://github.com/gptme/gptme/commit/d598b5e7f))
 - feat(server): add docker-compose self-host setup ([#2681](https://github.com/gptme/gptme/issues/2681)) ([`7a8bf8cd6`](https://github.com/gptme/gptme/commit/7a8bf8cd6))
 - feat(webui): speech-to-text dictation button ([#2666](https://github.com/gptme/gptme/issues/2666)) ([`bac384dde`](https://github.com/gptme/gptme/commit/bac384dde))
 - feat(webui): add compact user avatar treatment ([#2678](https://github.com/gptme/gptme/issues/2678)) ([`6995242c3`](https://github.com/gptme/gptme/commit/6995242c3))
 - feat(tools/python): emit artifact descriptors for plot files ([#830](https://github.com/gptme/gptme/issues/830) Phase 2) ([#2680](https://github.com/gptme/gptme/issues/2680)) ([`d92f6fe25`](https://github.com/gptme/gptme/commit/d92f6fe25))
 - feat(webui): recover dropped event streams ([`7886a9d8f`](https://github.com/gptme/gptme/commit/7886a9d8f))
 - feat(webui): structured tool call visualization with RichToolCall component ([#2676](https://github.com/gptme/gptme/issues/2676)) ([`029b93efb`](https://github.com/gptme/gptme/commit/029b93efb))
 - feat(webui): server connection health panel with /api/v2/server/health endpoint ([#2675](https://github.com/gptme/gptme/issues/2675)) ([`aadc57ce8`](https://github.com/gptme/gptme/commit/aadc57ce8))
 - feat(webui): stream tool outputs live via SSE tool_output events ([#2674](https://github.com/gptme/gptme/issues/2674)) ([`c0d622402`](https://github.com/gptme/gptme/commit/c0d622402))
 - feat(webui): per-tool call latency badges with live elapsed timer ([#2655](https://github.com/gptme/gptme/issues/2655)) ([`6d0347e46`](https://github.com/gptme/gptme/commit/6d0347e46))
 - feat(webui): temperature and top_p controls in ChatOptionsPanel ([`aebc9c57c`](https://github.com/gptme/gptme/commit/aebc9c57c))
 - feat(webui): add FunctionBrowser panel with /api/v2/tools endpoint ([#2663](https://github.com/gptme/gptme/issues/2663)) ([`9643f8f08`](https://github.com/gptme/gptme/commit/9643f8f08))
 - feat(webui): persist temperature/top_p/max_tokens in ConversationSettings sidebar ([#2662](https://github.com/gptme/gptme/issues/2662)) ([`887e9b0c7`](https://github.com/gptme/gptme/commit/887e9b0c7))
 - feat(webui): add ErrorBoundary to catch render crashes and chunk-load failures ([#2661](https://github.com/gptme/gptme/issues/2661)) ([`16d290d09`](https://github.com/gptme/gptme/commit/16d290d09))
 - feat(webui): add temperature and top_p controls to ChatOptionsPanel ([#2660](https://github.com/gptme/gptme/issues/2660)) ([`417a4205a`](https://github.com/gptme/gptme/commit/417a4205a))
 - feat(llm): make temperature and top_p request-driven via ChatConfig ([#2659](https://github.com/gptme/gptme/issues/2659)) ([`9f164493c`](https://github.com/gptme/gptme/commit/9f164493c))
 - feat(resilience): add CircuitBreaker for flaky MCP/tool calls ([#2658](https://github.com/gptme/gptme/issues/2658)) ([`4be41e539`](https://github.com/gptme/gptme/commit/4be41e539))
 - feat(webui): add /admin session management panel ([#2657](https://github.com/gptme/gptme/issues/2657)) ([`6715363a9`](https://github.com/gptme/gptme/commit/6715363a9))
 - feat(webui): add max_tokens input with full operation coverage ([#2652](https://github.com/gptme/gptme/issues/2652)) ([`2aa807e5d`](https://github.com/gptme/gptme/commit/2aa807e5d))
 - feat(webui): responsive nav sidebar with icon-only collapse and label expand ([#2653](https://github.com/gptme/gptme/issues/2653)) ([`4a0990a6b`](https://github.com/gptme/gptme/commit/4a0990a6b))
 - feat(hooks): add injection_screening hook to flag untrusted tool output ([#2650](https://github.com/gptme/gptme/issues/2650)) ([`b7b3e7a03`](https://github.com/gptme/gptme/commit/b7b3e7a03))
 - feat(webui): add keyboard shortcuts reference dialog ([`ca42d7ff6`](https://github.com/gptme/gptme/commit/ca42d7ff6))
 - feat(server): plumb max_tokens from chat config through generation ([#2649](https://github.com/gptme/gptme/issues/2649)) ([`82b64f3a2`](https://github.com/gptme/gptme/commit/82b64f3a2))
 - feat(webui): add per-conversation cost badge to ConversationList ([`d8cefc4ba`](https://github.com/gptme/gptme/commit/d8cefc4ba))
 - feat(llm): add Anthropic fast-mode (speed=fast) support ([#2647](https://github.com/gptme/gptme/issues/2647)) ([`08e154032`](https://github.com/gptme/gptme/commit/08e154032))
 - feat(webui): conversation-level session cost summary ([`1f15de92f`](https://github.com/gptme/gptme/commit/1f15de92f))
 - feat(webui): wire panel_hints into sidebar as iframe panels ([#830](https://github.com/gptme/gptme/issues/830) Phase 3b) ([`22164215c`](https://github.com/gptme/gptme/commit/22164215c))
 - feat(webui): sandboxed iframe panel primitive ([#830](https://github.com/gptme/gptme/issues/830) Phase 3) ([#2640](https://github.com/gptme/gptme/issues/2640)) ([`9671295e4`](https://github.com/gptme/gptme/commit/9671295e4))
 - feat(tools/computer): emit artifact descriptors on screenshot ([#830](https://github.com/gptme/gptme/issues/830) Phase 2 producers) ([#2639](https://github.com/gptme/gptme/issues/2639)) ([`9ff16c4c6`](https://github.com/gptme/gptme/commit/9ff16c4c6))
 - feat(server): consume tool-declared artifact descriptors from message metadata ([#830](https://github.com/gptme/gptme/issues/830) Phase 2) ([`969e9accf`](https://github.com/gptme/gptme/commit/969e9accf))
 - feat(webui): add artifacts sidebar panel and registry ([#2637](https://github.com/gptme/gptme/issues/2637)) ([`f46eb9ac7`](https://github.com/gptme/gptme/commit/f46eb9ac7))
 - feat(server): add conversation artifact registry API ([#830](https://github.com/gptme/gptme/issues/830) Phase 1) ([#2636](https://github.com/gptme/gptme/issues/2636)) ([`f9e242748`](https://github.com/gptme/gptme/commit/f9e242748))
 - feat(tools): add atomic patch_many tool ([#2634](https://github.com/gptme/gptme/issues/2634)) ([`1a7a6591e`](https://github.com/gptme/gptme/commit/1a7a6591e))
 - feat(server): bundle modern webui into package (gptme[#2612](https://github.com/gptme/gptme/issues/2612) Part 2) ([#2633](https://github.com/gptme/gptme/issues/2633)) ([`05b7916fc`](https://github.com/gptme/gptme/commit/05b7916fc))
 - feat: add gptme init command for project scaffolding ([#2632](https://github.com/gptme/gptme/issues/2632)) ([`d9c6e1082`](https://github.com/gptme/gptme/commit/d9c6e1082))
 - feat(models): add DeepSeek V4 Pro/Flash/Flash:free via OpenRouter ([#2629](https://github.com/gptme/gptme/issues/2629)) ([`9cbe3f236`](https://github.com/gptme/gptme/commit/9cbe3f236))
 - feat(hooks): emit aw-watcher tool activity heartbeats ([#2622](https://github.com/gptme/gptme/issues/2622)) ([`a82cd5436`](https://github.com/gptme/gptme/commit/a82cd5436))
 - feat(llm): add Claude Opus 4.8 model support ([`a85cc233a`](https://github.com/gptme/gptme/commit/a85cc233a))
 - feat(server): add --webui-dir flag to serve a custom web UI build ([#2614](https://github.com/gptme/gptme/issues/2614)) ([`62db7c762`](https://github.com/gptme/gptme/commit/62db7c762))
 - feat(lessons): load manifest-backed skills lazily from index.json ([#2604](https://github.com/gptme/gptme/issues/2604)) ([`3dc0f94b4`](https://github.com/gptme/gptme/commit/3dc0f94b4))
 - feat(llm): add gptme.ai as provider alias for gptme ([#2603](https://github.com/gptme/gptme/issues/2603)) ([`152149edd`](https://github.com/gptme/gptme/commit/152149edd))
 - feat(cli): list dynamic models for gptme provider ([`408df0b90`](https://github.com/gptme/gptme/commit/408df0b90))
 - feat(cli): prompt inline gptme auth on first use ([#2599](https://github.com/gptme/gptme/issues/2599)) ([`c72b7362a`](https://github.com/gptme/gptme/commit/c72b7362a))
 - feat(util): added `gptme-util prompts workspace/git/journal` helper commands ([#271](https://github.com/gptme/gptme/issues/271)) ([`3138251b5`](https://github.com/gptme/gptme/commit/3138251b5))
 - feat(eval-ci): expand quality gate from 3 to 5 tests ([#2598](https://github.com/gptme/gptme/issues/2598)) ([`4b5aa3ed2`](https://github.com/gptme/gptme/commit/4b5aa3ed2))
 - feat(eval): check subagent waited for completion before stating result ([#2593](https://github.com/gptme/gptme/issues/2593)) ([`60908932b`](https://github.com/gptme/gptme/commit/60908932b))
 - feat(install): add gptme.ai/install.sh one-liner installer ([#2592](https://github.com/gptme/gptme/issues/2592)) ([`c78976f00`](https://github.com/gptme/gptme/commit/c78976f00))
 - feat(eval): add subagent trajectory checks ([`8b0e098aa`](https://github.com/gptme/gptme/commit/8b0e098aa))
 - feat(browser): support connecting over CDP ([#2570](https://github.com/gptme/gptme/issues/2570)) ([`fa922d8a0`](https://github.com/gptme/gptme/commit/fa922d8a0))
 - feat(hooks): add turn.pre and aw watcher consumer ([#2572](https://github.com/gptme/gptme/issues/2572)) ([`930e2d063`](https://github.com/gptme/gptme/commit/930e2d063))
 - feat(auth): retarget device flow from fleet-operator to Supabase edge fn ([`349972006`](https://github.com/gptme/gptme/commit/349972006))
 - feat(webui): launch SetupWizard from disconnected banner on first visit ([#2494](https://github.com/gptme/gptme/issues/2494)) ([`511bdbd3e`](https://github.com/gptme/gptme/commit/511bdbd3e))
 - feat(webui): surface gptme.ai as cloud alternative in disconnected banner ([#2490](https://github.com/gptme/gptme/issues/2490)) ([`5b4f29696`](https://github.com/gptme/gptme/commit/5b4f29696))
 - feat(webui): opt into Chrome LNA for local-server fetches (targetAddressSpace) ([#2488](https://github.com/gptme/gptme/issues/2488)) ([`55b9cacc1`](https://github.com/gptme/gptme/commit/55b9cacc1))
 - feat(webui): add install step + setup-guide link to disconnected banner ([#2481](https://github.com/gptme/gptme/issues/2481)) ([`0f18cf1af`](https://github.com/gptme/gptme/commit/0f18cf1af))
 - feat(llm): surface diagnostic for generic out-of-credits 402 errors ([#2467](https://github.com/gptme/gptme/issues/2467)) ([`a085d2b18`](https://github.com/gptme/gptme/commit/a085d2b18))
 - feat(bot): add /gptme-resolve comment macro trigger to resolve workflow ([#2453](https://github.com/gptme/gptme/issues/2453)) ([`ed054e4a8`](https://github.com/gptme/gptme/commit/ed054e4a8))
 - feat(tools): add vent tool for real-time friction signals ([#2452](https://github.com/gptme/gptme/issues/2452)) ([`32bf967a3`](https://github.com/gptme/gptme/commit/32bf967a3))
 - feat(bot): add label-triggered issue resolver mode ([#2445](https://github.com/gptme/gptme/issues/2445)) ([`930acf352`](https://github.com/gptme/gptme/commit/930acf352))
 - feat(tools): add when-to-use trigger language for choice, complete, and restart ([#2442](https://github.com/gptme/gptme/issues/2442)) ([`94f2feced`](https://github.com/gptme/gptme/commit/94f2feced))
 - feat(tools): add when-to-use trigger language for mcp and lessons ([#2440](https://github.com/gptme/gptme/issues/2440)) ([`fe6d73250`](https://github.com/gptme/gptme/commit/fe6d73250))
 - feat(tools): add when-to-use trigger language for gh ([`992489cc2`](https://github.com/gptme/gptme/commit/992489cc2))
 - feat(tools): add when-to-use trigger language for screenshot, rag, vision, and todo ([`6861f00a9`](https://github.com/gptme/gptme/commit/6861f00a9))
 - feat(eval): add minimal-feature-preserve-default-with-decoys scenario ([`0d935883f`](https://github.com/gptme/gptme/commit/0d935883f))
 - feat(tools): add when-to-use trigger language for elicit and form ([#2437](https://github.com/gptme/gptme/issues/2437)) ([`8a7cc6c44`](https://github.com/gptme/gptme/commit/8a7cc6c44))
 - feat(tools): add when-to-use trigger language for vision and screenshot ([#2435](https://github.com/gptme/gptme/issues/2435)) ([`842efa85b`](https://github.com/gptme/gptme/commit/842efa85b))
 - feat(tools): add when-to-use trigger language for computer and morph ([#2434](https://github.com/gptme/gptme/issues/2434)) ([`1301dfa15`](https://github.com/gptme/gptme/commit/1301dfa15))
 - feat(eval): add root-cause-pipeline-debug behavioral scenario ([`ef2cac82d`](https://github.com/gptme/gptme/commit/ef2cac82d))
 - feat(eval): add bounded-bugfix-with-decoys behavioral scenario ([#2429](https://github.com/gptme/gptme/issues/2429)) ([`299b9af02`](https://github.com/gptme/gptme/commit/299b9af02))
 - feat(hooks): trace sync hook execution spans ([#2421](https://github.com/gptme/gptme/issues/2421)) ([`efb96866e`](https://github.com/gptme/gptme/commit/efb96866e))
 - feat(hooks): add Windows agent scanning ([`6d12c6529`](https://github.com/gptme/gptme/commit/6d12c6529))
 - feat(tools): add when-to-use trigger language for tmux and browser ([`b8c8e26b5`](https://github.com/gptme/gptme/commit/b8c8e26b5))
 - feat(tools): add when-to-use trigger language for python, save, patch tools ([#2412](https://github.com/gptme/gptme/issues/2412)) ([`1b31bd8a5`](https://github.com/gptme/gptme/commit/1b31bd8a5))
 - feat(setup): add confirmation prompt for fish completions ([#2410](https://github.com/gptme/gptme/issues/2410)) ([`b5ceb04ba`](https://github.com/gptme/gptme/commit/b5ceb04ba))
 - feat(tools): add trigger language for shell, read, and gh ([#2406](https://github.com/gptme/gptme/issues/2406)) ([`7e1bb2ce7`](https://github.com/gptme/gptme/commit/7e1bb2ce7))
 - feat(openai): add feature-gated Responses API chat path ([#2397](https://github.com/gptme/gptme/issues/2397)) ([`076599ac4`](https://github.com/gptme/gptme/commit/076599ac4))
 - feat(cli): add --output-format json for headless gptme runs ([#2392](https://github.com/gptme/gptme/issues/2392)) ([`50422d121`](https://github.com/gptme/gptme/commit/50422d121))
 - feat(eval): add partial-credit 'Score' column to eval_results.csv ([#2389](https://github.com/gptme/gptme/issues/2389)) ([`8d05e0a4b`](https://github.com/gptme/gptme/commit/8d05e0a4b))
 - feat(llm): surface actionable diagnostic for OpenRouter 402 insufficient-credits errors ([#2388](https://github.com/gptme/gptme/issues/2388)) ([`bee2165b2`](https://github.com/gptme/gptme/commit/bee2165b2))
 - feat(hooks): refactor and extend tool_target_instructions (Phase 1+) ([#2386](https://github.com/gptme/gptme/issues/2386)) ([`ebc3a8802`](https://github.com/gptme/gptme/commit/ebc3a8802))
 - feat(hooks): tool-target agent-instruction loading (Phase 1) ([#2385](https://github.com/gptme/gptme/issues/2385)) ([`acb5e3f3d`](https://github.com/gptme/gptme/commit/acb5e3f3d))
 - feat(subagent): add role= parameter for typed work posture ([#2382](https://github.com/gptme/gptme/issues/2382)) ([`78603c5a4`](https://github.com/gptme/gptme/commit/78603c5a4))
 - feat(profiles): add built-in verifier profile for subagent review/validation ([`84d3a1aa9`](https://github.com/gptme/gptme/commit/84d3a1aa9))
 - feat(cli): queue prompts for running chats ([`988f087bd`](https://github.com/gptme/gptme/commit/988f087bd))
 - feat(hooks): add TTL-based cache coldness heuristic to cache_awareness ([#2378](https://github.com/gptme/gptme/issues/2378)) ([`e896ed4ff`](https://github.com/gptme/gptme/commit/e896ed4ff))
 - feat: opt-in auto-snapshots for workspace rollback (Phase 2a) ([#2377](https://github.com/gptme/gptme/issues/2377)) ([`a5fbc0421`](https://github.com/gptme/gptme/commit/a5fbc0421))
 - feat(computer): add pluggable transport abstraction layer ([#2368](https://github.com/gptme/gptme/issues/2368)) ([`2e625199e`](https://github.com/gptme/gptme/commit/2e625199e))
 - feat(commands): add checkpoint slash command ([`1a9969e31`](https://github.com/gptme/gptme/commit/1a9969e31))
 - feat(models): add preferred_edit_format to OpenRouter models ([`c92fdb1a8`](https://github.com/gptme/gptme/commit/c92fdb1a8))
 - feat(serve): inject webui HTML rendering hint into system prompt ([`cf85d7d8b`](https://github.com/gptme/gptme/commit/cf85d7d8b))
 - feat(eval): natural pass-rate gate for lesson injection (Phase 3, idea [#228](https://github.com/gptme/gptme/issues/228)) ([#2365](https://github.com/gptme/gptme/issues/2365)) ([`cdf4be27e`](https://github.com/gptme/gptme/commit/cdf4be27e))
 - feat: architect/editor coder split — plan with strong model, execute with cheap model ([#2364](https://github.com/gptme/gptme/issues/2364)) ([`eafdb5aef`](https://github.com/gptme/gptme/commit/eafdb5aef))
 - feat(models): add preferred_edit_format field to model registry ([#2363](https://github.com/gptme/gptme/issues/2363)) ([`2d46a8f54`](https://github.com/gptme/gptme/commit/2d46a8f54))
 - feat(hooks): add mcp_namespace_hint hook for @server_name references ([#2358](https://github.com/gptme/gptme/issues/2358)) ([`2eca386d8`](https://github.com/gptme/gptme/commit/2eca386d8))
 - feat(commands): add /account provider onboarding with OAuth ([#2356](https://github.com/gptme/gptme/issues/2356)) ([`727aa6030`](https://github.com/gptme/gptme/commit/727aa6030))
 - feat(oauth): add OpenRouter PKCE OAuth flow ([#2355](https://github.com/gptme/gptme/issues/2355)) ([`c55a0fd2c`](https://github.com/gptme/gptme/commit/c55a0fd2c))
 - feat(eval): add task_type to EvalSpec and conditional lesson gating ([#2352](https://github.com/gptme/gptme/issues/2352)) ([`243d5f9ad`](https://github.com/gptme/gptme/commit/243d5f9ad))
 - feat(tokens): add per-step token breakdown to /tokens command ([#2350](https://github.com/gptme/gptme/issues/2350)) ([`9d96649e6`](https://github.com/gptme/gptme/commit/9d96649e6))
 - feat(eval): add --no-lessons flag for no-context baseline runs ([`34890e849`](https://github.com/gptme/gptme/commit/34890e849))
 - feat(tokens): surface biggest-turn input in /tokens output ([#2348](https://github.com/gptme/gptme/issues/2348)) ([`72501779a`](https://github.com/gptme/gptme/commit/72501779a))
 - feat(lessons): cap lesson injection at 50K tokens to prevent sys_prompt bloat ([#2346](https://github.com/gptme/gptme/issues/2346)) ([`b5fc04cd6`](https://github.com/gptme/gptme/commit/b5fc04cd6))
 - feat(tools): add gh issue/pr list preview to shell output ([#2341](https://github.com/gptme/gptme/issues/2341)) ([`eb7b11e96`](https://github.com/gptme/gptme/commit/eb7b11e96))
 - feat(tools): add shell_compact git log preview ([#2337](https://github.com/gptme/gptme/issues/2337)) ([`528a3f8d7`](https://github.com/gptme/gptme/commit/528a3f8d7))
 - feat: add GPTME_DISABLE_PATH_INCLUDE env var to skip path expansion ([#2336](https://github.com/gptme/gptme/issues/2336)) ([`fb4f6a7e1`](https://github.com/gptme/gptme/commit/fb4f6a7e1))
 - feat(messages): ephemeral_ttl — context-aware pruning with cache boundary optimization ([#2330](https://github.com/gptme/gptme/issues/2330)) ([`56080e094`](https://github.com/gptme/gptme/commit/56080e094))
 - feat(tauri): add Android project files and CI build (closes [#2328](https://github.com/gptme/gptme/issues/2328)) ([#2329](https://github.com/gptme/gptme/issues/2329)) ([`973e48a61`](https://github.com/gptme/gptme/commit/973e48a61))
 - feat(webui): add embedded MenuBar context slot ([#2319](https://github.com/gptme/gptme/issues/2319)) ([`582746247`](https://github.com/gptme/gptme/commit/582746247))
 - feat(cost-awareness): warn on cold Anthropic prompt cache ([#2322](https://github.com/gptme/gptme/issues/2322)) ([`4c674a7a9`](https://github.com/gptme/gptme/commit/4c674a7a9))
 - feat(server): voice Phase 3 — transcript to conversation history ([#2315](https://github.com/gptme/gptme/issues/2315)) ([`96067fa2f`](https://github.com/gptme/gptme/commit/96067fa2f))
 - feat(server): expose session last_error in conversation GET response ([#2305](https://github.com/gptme/gptme/issues/2305)) ([`a88401a90`](https://github.com/gptme/gptme/commit/a88401a90))
 - feat(settings): add Re-run Setup button to re-open setup wizard ([#2303](https://github.com/gptme/gptme/issues/2303)) ([`2bd1f2464`](https://github.com/gptme/gptme/commit/2bd1f2464))
 - feat(models): add gpt-5.5 to openai-subscription provider models ([#2299](https://github.com/gptme/gptme/issues/2299)) ([`8fdc1df16`](https://github.com/gptme/gptme/commit/8fdc1df16))
 - feat(eval): add --adversarial flag for behavioral eval prompt injection ([#190](https://github.com/gptme/gptme/issues/190)) ([#2291](https://github.com/gptme/gptme/issues/2291)) ([`ebfaf5733`](https://github.com/gptme/gptme/commit/ebfaf5733))
 - feat(shell): make output truncation thresholds configurable via env vars ([`5f843641d`](https://github.com/gptme/gptme/commit/5f843641d))
 - feat(tauri): sync version to 0.31.0 and show server version in About panel ([`6fce363c3`](https://github.com/gptme/gptme/commit/6fce363c3))
 - feat(webui): add real-time voice session support ([#2265](https://github.com/gptme/gptme/issues/2265)) ([`d13f97758`](https://github.com/gptme/gptme/commit/d13f97758))
 - feat(webui): add _headers for CF Pages cache policies ([#2282](https://github.com/gptme/gptme/issues/2282)) ([`5e5a6967b`](https://github.com/gptme/gptme/commit/5e5a6967b))
 - feat(tools/read): support batch reads via newline-separated paths ([`b799b3933`](https://github.com/gptme/gptme/commit/b799b3933))
 - feat(site): add downloads page at gptme.org/downloads/ ([#2243](https://github.com/gptme/gptme/issues/2243)) ([`45e904ac1`](https://github.com/gptme/gptme/commit/45e904ac1))
 - feat(webui): submit SetupWizard inputs on Enter key ([#2230](https://github.com/gptme/gptme/issues/2230)) ([`c14bd0c8c`](https://github.com/gptme/gptme/commit/c14bd0c8c))
 - feat(cli): add gptme-checkpoint for Git-backed workspace recovery ([#2224](https://github.com/gptme/gptme/issues/2224)) ([`15d3c2256`](https://github.com/gptme/gptme/commit/15d3c2256))
 - feat(openai): support OPENAI_VERBOSITY env var for GPT-5+ models ([#2223](https://github.com/gptme/gptme/issues/2223)) ([`a12a9c065`](https://github.com/gptme/gptme/commit/a12a9c065))
 - feat(openai): add gpt-5.5 and gpt-5.5-pro models ([#2220](https://github.com/gptme/gptme/issues/2220)) ([`5f546f377`](https://github.com/gptme/gptme/commit/5f546f377))
 - feat(context): show truncation savings in /context ([#2213](https://github.com/gptme/gptme/issues/2213)) ([`2df6ce3d5`](https://github.com/gptme/gptme/commit/2df6ce3d5))
 - feat(webui): expose provider API key settings ([`5fcd34dcd`](https://github.com/gptme/gptme/commit/5fcd34dcd))
 - feat(agent): add live agent scan alias ([#2205](https://github.com/gptme/gptme/issues/2205)) ([`18be555cd`](https://github.com/gptme/gptme/commit/18be555cd))
 - feat(webui): wire ServerDefaultModelSettings to GET /api/v2/user/settings ([#2204](https://github.com/gptme/gptme/issues/2204)) ([`9cb296e19`](https://github.com/gptme/gptme/commit/9cb296e19))
 - feat(server): add GET /api/v2/user/settings for provider+model introspection ([#2203](https://github.com/gptme/gptme/issues/2203)) ([`7633bc1d8`](https://github.com/gptme/gptme/commit/7633bc1d8))
 - feat(onboarding): add shared default-model selection flow ([#2201](https://github.com/gptme/gptme/issues/2201)) ([`91a580f05`](https://github.com/gptme/gptme/commit/91a580f05))
 - feat(tauri): in-app API key entry (save_api_key + wizard UI) ([#2195](https://github.com/gptme/gptme/issues/2195)) ([`02fb26b23`](https://github.com/gptme/gptme/commit/02fb26b23))
 - feat(hooks): track memory_mb for detected agents in workspace_agents ([#2200](https://github.com/gptme/gptme/issues/2200)) ([`b0b8fd097`](https://github.com/gptme/gptme/commit/b0b8fd097))
 - feat(cli): add gptme-util agents scan command ([#2198](https://github.com/gptme/gptme/issues/2198)) ([`19422518c`](https://github.com/gptme/gptme/commit/19422518c))
 - feat(tauri): desktop/mobile split — gate sidecar behind cfg(desktop) ([#2191](https://github.com/gptme/gptme/issues/2191)) ([`64a84c77e`](https://github.com/gptme/gptme/commit/64a84c77e))
 - feat(tauri): surface provider_configured in /api/v2 + SetupWizard onboarding step ([#2194](https://github.com/gptme/gptme/issues/2194)) ([`0ace79689`](https://github.com/gptme/gptme/commit/0ace79689))
 - feat(anthropic): wire output_config.effort for true xhigh/max thinking semantics ([#2186](https://github.com/gptme/gptme/issues/2186)) ([`a9f224631`](https://github.com/gptme/gptme/commit/a9f224631))
 - feat(prompts): add cache boundary marker and stable file order ([#2185](https://github.com/gptme/gptme/issues/2185)) ([`e33fec132`](https://github.com/gptme/gptme/commit/e33fec132))
 - feat(anthropic): add GPTME_THINKING_EFFORT env var with named levels ([#2184](https://github.com/gptme/gptme/issues/2184)) ([`6f7e30846`](https://github.com/gptme/gptme/commit/6f7e30846))
 - feat(prompts): propagate model to prompt_short for tool-use enforcement ([#2181](https://github.com/gptme/gptme/issues/2181)) ([`ff626be51`](https://github.com/gptme/gptme/commit/ff626be51))
 - feat(prompts): inject tool-use enforcement for GPT/Gemini/Grok families ([#2180](https://github.com/gptme/gptme/issues/2180)) ([`2cd8ee8b5`](https://github.com/gptme/gptme/commit/2cd8ee8b5))
 - feat(util): add models test command for verifying model connectivity ([#2159](https://github.com/gptme/gptme/issues/2159)) ([`bf64c6799`](https://github.com/gptme/gptme/commit/bf64c6799))
 - feat(chats): expose context/matches options in search and read commands ([#2155](https://github.com/gptme/gptme/issues/2155)) ([`53a00009d`](https://github.com/gptme/gptme/commit/53a00009d))
 - feat(models): add claude-opus-4-7 and anthropic/claude-opus-4.7 (OpenRouter) ([#2153](https://github.com/gptme/gptme/issues/2153)) ([`bc4f2aa86`](https://github.com/gptme/gptme/commit/bc4f2aa86))
 - feat(server): add include_archived parameter to list_tasks API ([#2127](https://github.com/gptme/gptme/issues/2127)) ([`182724167`](https://github.com/gptme/gptme/commit/182724167))
 - feat(eval): add implement-memoization behavioral scenario (31st) ([#2114](https://github.com/gptme/gptme/issues/2114)) ([`e23bd9687`](https://github.com/gptme/gptme/commit/e23bd9687))
 - feat(eval): add implement-priority-queue behavioral scenario (33rd) ([#2113](https://github.com/gptme/gptme/issues/2113)) ([`5fedad714`](https://github.com/gptme/gptme/commit/5fedad714))
 - feat(eval): add implement-event-emitter behavioral scenario (30th) ([#2105](https://github.com/gptme/gptme/issues/2105)) ([`48a437229`](https://github.com/gptme/gptme/commit/48a437229))
 - feat(eval): add implement-lru-cache behavioral scenario (29th) ([#2103](https://github.com/gptme/gptme/issues/2103)) ([`b504ddbc3`](https://github.com/gptme/gptme/commit/b504ddbc3))
 - feat(eval): add circuit-breaker behavioral scenario (28th) ([#2100](https://github.com/gptme/gptme/issues/2100)) ([`5806f3458`](https://github.com/gptme/gptme/commit/5806f3458))
 - feat(eval): add circuit-breaker behavioral scenario (26th) ([#2099](https://github.com/gptme/gptme/issues/2099)) ([`8bb769ea2`](https://github.com/gptme/gptme/commit/8bb769ea2))
 - feat(eval): add rate-limiting behavioral scenario (28th) ([`6fa5d440f`](https://github.com/gptme/gptme/commit/6fa5d440f))
 - feat(eval): add add-docstrings behavioral scenario (24th scenario) ([#2093](https://github.com/gptme/gptme/issues/2093)) ([`833a00c32`](https://github.com/gptme/gptme/commit/833a00c32))
 - feat(eval): add validate-user-input behavioral scenario (27th scenario) ([#2096](https://github.com/gptme/gptme/issues/2096)) ([`dc5cea427`](https://github.com/gptme/gptme/commit/dc5cea427))
 - feat(eval): add retry-with-backoff behavioral scenario (26th scenario) ([#2095](https://github.com/gptme/gptme/issues/2095)) ([`fe0bcd6ea`](https://github.com/gptme/gptme/commit/fe0bcd6ea))
 - feat(eval): add add-deprecation-warning behavioral scenario (25th scenario) ([#2094](https://github.com/gptme/gptme/issues/2094)) ([`b521a3db4`](https://github.com/gptme/gptme/commit/b521a3db4))
 - feat(eval): add fix-mutable-default behavioral scenario (22nd scenario) ([#2091](https://github.com/gptme/gptme/issues/2091)) ([`1da36d5c2`](https://github.com/gptme/gptme/commit/1da36d5c2))
 - feat(eval): add remove-dead-code behavioral scenario (21st scenario) ([#2090](https://github.com/gptme/gptme/issues/2090)) ([`df563ea44`](https://github.com/gptme/gptme/commit/df563ea44))
 - feat(eval): add optimize-n-squared behavioral scenario (20th scenario) ([#2088](https://github.com/gptme/gptme/issues/2088)) ([`83b2f542f`](https://github.com/gptme/gptme/commit/83b2f542f))
 - feat(eval): add fix-data-mutation behavioral scenario (19th scenario) ([#2083](https://github.com/gptme/gptme/issues/2083)) ([`f4288d80c`](https://github.com/gptme/gptme/commit/f4288d80c))
 - feat(eval): add noisy-worktree-fix behavioral scenario (18th scenario) ([#2080](https://github.com/gptme/gptme/issues/2080)) ([`f51c7a9cd`](https://github.com/gptme/gptme/commit/f51c7a9cd))
 - feat(eval): add add-type-hints behavioral scenario (17th scenario) ([#2079](https://github.com/gptme/gptme/issues/2079)) ([`404511815`](https://github.com/gptme/gptme/commit/404511815))
 - feat(eval): add refactor-for-testability behavioral scenario (16th scenario) ([#2078](https://github.com/gptme/gptme/issues/2078)) ([`3db6116c2`](https://github.com/gptme/gptme/commit/3db6116c2))
 - feat(eval): add fix-security-path-traversal behavioral scenario (15th scenario) ([#2077](https://github.com/gptme/gptme/issues/2077)) ([`82e1d2fe5`](https://github.com/gptme/gptme/commit/82e1d2fe5))
 - feat(eval): add handle-specific-exception behavioral scenario (14th scenario) ([#2076](https://github.com/gptme/gptme/issues/2076)) ([`2c4bc5a22`](https://github.com/gptme/gptme/commit/2c4bc5a22))
 - feat(eval): add add-feature-preserve-default behavioral scenario (13th scenario) ([#2074](https://github.com/gptme/gptme/issues/2074)) ([`5ad697291`](https://github.com/gptme/gptme/commit/5ad697291))
 - feat(eval): add use-existing-helper behavioral scenario (12th scenario) ([#2073](https://github.com/gptme/gptme/issues/2073)) ([`049cd9c0e`](https://github.com/gptme/gptme/commit/049cd9c0e))
 - feat(eval): add add-logging behavioral scenario (11th scenario) ([#2072](https://github.com/gptme/gptme/issues/2072)) ([`e389c0ce5`](https://github.com/gptme/gptme/commit/e389c0ce5))
 - feat(webui): polish message styling and fix avatar chaining ([#1996](https://github.com/gptme/gptme/issues/1996)) ([`bab294021`](https://github.com/gptme/gptme/commit/bab294021))
 - feat(eval): add scope-discipline-bugfix behavioral scenario (10th scenario) ([#2069](https://github.com/gptme/gptme/issues/2069)) ([`24272facd`](https://github.com/gptme/gptme/commit/24272facd))
 - feat(server): add CLI-based fallback for external session provider ([#2067](https://github.com/gptme/gptme/issues/2067)) ([`89db2d056`](https://github.com/gptme/gptme/commit/89db2d056))
 - feat(lessons): add GPTME_LESSONS_EXTRA_DIRS env var ([#2066](https://github.com/gptme/gptme/issues/2066)) ([`587acf934`](https://github.com/gptme/gptme/commit/587acf934))
 - feat(eval): add debug-data-pipeline behavioral scenario (9th scenario) ([#2064](https://github.com/gptme/gptme/issues/2064)) ([`60828f867`](https://github.com/gptme/gptme/commit/60828f867))
 - feat(webui): add external sessions catalog view ([#2062](https://github.com/gptme/gptme/issues/2062)) ([`29c517293`](https://github.com/gptme/gptme/commit/29c517293))
 - feat(server): add read-only external session catalog ([#2059](https://github.com/gptme/gptme/issues/2059)) ([`dbf83cd65`](https://github.com/gptme/gptme/commit/dbf83cd65))
 - feat(cli): prototype live terminal status line ([#2058](https://github.com/gptme/gptme/issues/2058)) ([`8f12aa2ca`](https://github.com/gptme/gptme/commit/8f12aa2ca))
 - feat(eval): add write-test-suite and test-driven-error-handling behavioral scenarios ([#2053](https://github.com/gptme/gptme/issues/2053)) ([`19f0f01ed`](https://github.com/gptme/gptme/commit/19f0f01ed))
 - feat(eval): add merge-conflict and extract-function behavioral scenarios ([#2052](https://github.com/gptme/gptme/issues/2052)) ([`1a9607621`](https://github.com/gptme/gptme/commit/1a9607621))
 - feat(eval): add stage-new-files behavioral scenario ([#2049](https://github.com/gptme/gptme/issues/2049)) ([`a4904c6b8`](https://github.com/gptme/gptme/commit/a4904c6b8))
 - feat(eval): add behavioral eval suite — 3 multi-step workflow scenarios ([#2046](https://github.com/gptme/gptme/issues/2046)) ([`3552864cb`](https://github.com/gptme/gptme/commit/3552864cb))
 - feat(eval): add --resume and incremental writing to SWE-bench eval ([`d3f76a95c`](https://github.com/gptme/gptme/commit/d3f76a95c))
 - feat(eval): add --info flag to gptme-eval-swebench for dataset inspection ([#2043](https://github.com/gptme/gptme/issues/2043)) ([`23ed17f66`](https://github.com/gptme/gptme/commit/23ed17f66))
 - feat(eval): add practical31-33 suites — 9 new algorithm tests ([#2036](https://github.com/gptme/gptme/issues/2036)) ([`c13443317`](https://github.com/gptme/gptme/commit/c13443317))
 - feat(eval): add pass-rate trend analysis with sparklines ([#2035](https://github.com/gptme/gptme/issues/2035)) ([`8d5ce76ab`](https://github.com/gptme/gptme/commit/8d5ce76ab))
 - feat(eval): add practical30 suite — decode string, top-k frequent, partition equal subset ([`1647a19c0`](https://github.com/gptme/gptme/commit/1647a19c0))
 - feat(eval): add practical29 suite — word break II, unique paths, rotate array ([#2031](https://github.com/gptme/gptme/issues/2031)) ([`aa0268904`](https://github.com/gptme/gptme/commit/aa0268904))
 - feat(eval): add practical28 suite — minimum path sum, gas station, next permutation ([#2028](https://github.com/gptme/gptme/issues/2028)) ([`7b7f658cc`](https://github.com/gptme/gptme/commit/7b7f658cc))
 - feat(eval): add practical27 suite — house robber, max product subarray, find all anagrams ([#2024](https://github.com/gptme/gptme/issues/2024)) ([`69ddd5dee`](https://github.com/gptme/gptme/commit/69ddd5dee))
 - feat(eval): add practical26 suite — longest palindromic substring, jump game, task scheduler ([#2023](https://github.com/gptme/gptme/issues/2023)) ([`700463af9`](https://github.com/gptme/gptme/commit/700463af9))
 - feat(eval): add practical25 suite — sliding window max, decode ways, meeting rooms ([#2022](https://github.com/gptme/gptme/issues/2022)) ([`1d607a83d`](https://github.com/gptme/gptme/commit/1d607a83d))
 - feat(eval): add practical24 suite — N-Queens, LIS, cycle detection ([#2021](https://github.com/gptme/gptme/issues/2021)) ([`c65e256fc`](https://github.com/gptme/gptme/commit/c65e256fc))
 - feat(eval): add interactive sorting and filtering to HTML leaderboard ([#2018](https://github.com/gptme/gptme/issues/2018)) ([`4a60955c4`](https://github.com/gptme/gptme/commit/4a60955c4))
 - feat(eval): add practical23 suite — LCS, stock cooldown, rotate image ([#2015](https://github.com/gptme/gptme/issues/2015)) ([`eb7f836d6`](https://github.com/gptme/gptme/commit/eb7f836d6))
 - feat(eval): add practical22 suite — trapping rain water, word break, permutations ([#2003](https://github.com/gptme/gptme/issues/2003)) ([`75d788618`](https://github.com/gptme/gptme/commit/75d788618))
 - feat(lessons): support holdout exclusions in auto-include hook ([#1997](https://github.com/gptme/gptme/issues/1997)) ([`bd73c6211`](https://github.com/gptme/gptme/commit/bd73c6211))
 - feat(util): add gptme-util hooks for Claude Code lesson injection ([#1995](https://github.com/gptme/gptme/issues/1995)) ([`9129169cb`](https://github.com/gptme/gptme/commit/9129169cb))
 - feat(eval/swebench): generate predictions JSONL and add official harness integration ([`f18715fe4`](https://github.com/gptme/gptme/commit/f18715fe4))
 - feat(eval): add practical21 suite — Kadane, 0/1 knapsack, flood fill ([#1993](https://github.com/gptme/gptme/issues/1993)) ([`5dfaee0e1`](https://github.com/gptme/gptme/commit/5dfaee0e1))
 - feat(eval): add practical20 suite — Dijkstra, spiral matrix, num islands ([#1988](https://github.com/gptme/gptme/issues/1988)) ([`73075c0bf`](https://github.com/gptme/gptme/commit/73075c0bf))
 - feat(eval): add practical19 suite — edit distance, BST, coin change ([#1987](https://github.com/gptme/gptme/issues/1987)) ([`d6453b629`](https://github.com/gptme/gptme/commit/d6453b629))
 - feat(eval): add practical18 suite — min-stack, knight-moves, histogram-area ([#1986](https://github.com/gptme/gptme/issues/1986)) ([`0177f79ab`](https://github.com/gptme/gptme/commit/0177f79ab))
 - feat(eval): add practical17 suite — LRU cache, interval merge, base converter ([#1982](https://github.com/gptme/gptme/issues/1982)) ([`485f08552`](https://github.com/gptme/gptme/commit/485f08552))
 - feat(webui): custom welcome background with frosted glass effect ([`9d787f357`](https://github.com/gptme/gptme/commit/9d787f357))
 - feat(webui): render short code blocks inline instead of collapsible ([#1977](https://github.com/gptme/gptme/issues/1977)) ([`f7d436d61`](https://github.com/gptme/gptme/commit/f7d436d61))
 - feat(eval): add per-test breakdown and fix OpenRouter model names ([#1961](https://github.com/gptme/gptme/issues/1961)) ([`6362ac6cf`](https://github.com/gptme/gptme/commit/6362ac6cf))
 - feat(eval): add practical16 suite — harder tasks (queue workers, JSON schema, Trie) ([#1960](https://github.com/gptme/gptme/issues/1960)) ([`81a505e7d`](https://github.com/gptme/gptme/commit/81a505e7d))
 - feat(webui): add Attachments tab and 'open in workspace' to workspace explorer ([#1930](https://github.com/gptme/gptme/issues/1930)) ([`2639f8342`](https://github.com/gptme/gptme/commit/2639f8342))
 - feat(eval): add practical15 suite — async, SQL analytics, SQL injection ([#1931](https://github.com/gptme/gptme/issues/1931)) ([`f5b89e336`](https://github.com/gptme/gptme/commit/f5b89e336))
 - feat(webui): collapse intermediate tool steps into expandable summaries ([#1929](https://github.com/gptme/gptme/issues/1929)) ([`077cb24cd`](https://github.com/gptme/gptme/commit/077cb24cd))
 - feat(webui): cleaner assistant surface — borderless, page-native messages ([`d02dc8127`](https://github.com/gptme/gptme/commit/d02dc8127))
 - feat(webui): refresh new chat view ([#1925](https://github.com/gptme/gptme/issues/1925)) ([`ae4df94eb`](https://github.com/gptme/gptme/commit/ae4df94eb))
 - feat(webui): reuse ChatInput for message editing with attachment support ([#1919](https://github.com/gptme/gptme/issues/1919)) ([`c7fa714b1`](https://github.com/gptme/gptme/commit/c7fa714b1))
 - feat(webui): improve file attachment UX with tooltips and lightbox ([#1917](https://github.com/gptme/gptme/issues/1917)) ([`c8054e786`](https://github.com/gptme/gptme/commit/c8054e786))
 - feat(webui): add search to navigation and improve search scope ([#1915](https://github.com/gptme/gptme/issues/1915)) ([`e9ba091b2`](https://github.com/gptme/gptme/commit/e9ba091b2))
 - feat(webui): delete individual messages from conversation ([#1910](https://github.com/gptme/gptme/issues/1910)) ([`8eb231f07`](https://github.com/gptme/gptme/commit/8eb231f07))
 - feat(webui): add dedicated history page with activity calendar ([#1903](https://github.com/gptme/gptme/issues/1903)) ([`66f90c0f5`](https://github.com/gptme/gptme/commit/66f90c0f5))
 - feat(webui): message editing, branch navigation, and tool state restoration ([#1900](https://github.com/gptme/gptme/issues/1900)) ([`d90b7e727`](https://github.com/gptme/gptme/commit/d90b7e727))
 - feat(webui): fix chat UX, add routes, file attachments, and search ([#1894](https://github.com/gptme/gptme/issues/1894)) ([`a9729d562`](https://github.com/gptme/gptme/commit/a9729d562))
 - feat(webui): group conversations by date in sidebar ([#1893](https://github.com/gptme/gptme/issues/1893)) ([`1381dc90d`](https://github.com/gptme/gptme/commit/1381dc90d))
 - feat(webui): add right-click context menu for conversations ([#1891](https://github.com/gptme/gptme/issues/1891)) ([`e393c6b51`](https://github.com/gptme/gptme/commit/e393c6b51))
 - feat(webui): show last message preview in conversation list ([#1890](https://github.com/gptme/gptme/issues/1890)) ([`b4ae4c496`](https://github.com/gptme/gptme/commit/b4ae4c496))
 - feat(webui): show message timestamps on hover ([#1886](https://github.com/gptme/gptme/issues/1886)) ([`884de90d6`](https://github.com/gptme/gptme/commit/884de90d6))
 - feat(webui): add scroll-to-bottom floating button in conversations ([#1884](https://github.com/gptme/gptme/issues/1884)) ([`863da6d0b`](https://github.com/gptme/gptme/commit/863da6d0b))
 - feat(webui): add copy-to-clipboard button on chat messages ([#1883](https://github.com/gptme/gptme/issues/1883)) ([`9b4191068`](https://github.com/gptme/gptme/commit/9b4191068))
 - feat(webui): add conversation export as Markdown and JSON ([#1882](https://github.com/gptme/gptme/issues/1882)) ([`12a3cc497`](https://github.com/gptme/gptme/commit/12a3cc497))
 - feat(webui): add conversation search to command palette ([#1877](https://github.com/gptme/gptme/issues/1877)) ([`f2be6b4c8`](https://github.com/gptme/gptme/commit/f2be6b4c8))
 - feat(webui): add file download button to workspace file preview ([#1876](https://github.com/gptme/gptme/issues/1876)) ([`59c077a99`](https://github.com/gptme/gptme/commit/59c077a99))
 - feat(webui): add file upload support with drag-and-drop ([#1873](https://github.com/gptme/gptme/issues/1873)) ([`744cc1cf0`](https://github.com/gptme/gptme/commit/744cc1cf0))
 - feat(server): add workspace file download endpoint ([#1875](https://github.com/gptme/gptme/issues/1875)) ([`6f753de89`](https://github.com/gptme/gptme/commit/6f753de89))
 - feat(webui): add autocomplete for slash commands and file paths ([#1872](https://github.com/gptme/gptme/issues/1872)) ([`e218432a6`](https://github.com/gptme/gptme/commit/e218432a6))
 - feat(gh): add native issue view handler with linked PRs ([`0a53c166d`](https://github.com/gptme/gptme/commit/0a53c166d))
 - feat(openrouter): add quantization routing preference ([#1864](https://github.com/gptme/gptme/issues/1864)) ([`f0eddbedc`](https://github.com/gptme/gptme/commit/f0eddbedc))
 - feat(openrouter): add user override for data_collection preference ([#1861](https://github.com/gptme/gptme/issues/1861)) ([`50d322370`](https://github.com/gptme/gptme/commit/50d322370))
 - feat(openrouter): add provider routing preferences (require_parameters, data_collection) ([#1859](https://github.com/gptme/gptme/issues/1859)) ([`8596b2f24`](https://github.com/gptme/gptme/commit/8596b2f24))
 - feat(gh): add native issue create and comment commands ([#1852](https://github.com/gptme/gptme/issues/1852)) ([`6b8f475a8`](https://github.com/gptme/gptme/commit/6b8f475a8))
 - feat(plugins): unified plugin registration via entry points ([#1851](https://github.com/gptme/gptme/issues/1851)) ([`461040759`](https://github.com/gptme/gptme/commit/461040759))
 - feat(llm): add plugin-based provider support via entry points ([#1846](https://github.com/gptme/gptme/issues/1846)) ([`152710ec2`](https://github.com/gptme/gptme/commit/152710ec2))
 - feat(gh): add native gh pr merge command ([#1844](https://github.com/gptme/gptme/issues/1844)) ([`0837d40fb`](https://github.com/gptme/gptme/commit/0837d40fb))
 - feat(gh): add gh search issues and gh search prs commands ([#1841](https://github.com/gptme/gptme/issues/1841)) ([`1db97464d`](https://github.com/gptme/gptme/commit/1db97464d))
 - feat(gh): add native `gh issue list` and `gh pr list` commands ([#1839](https://github.com/gptme/gptme/issues/1839)) ([`61147b976`](https://github.com/gptme/gptme/commit/61147b976))
 - feat(gh): add `gh run view` for structured CI failure log extraction ([#1837](https://github.com/gptme/gptme/issues/1837)) ([`7d01905e8`](https://github.com/gptme/gptme/commit/7d01905e8))
 - feat(gh): add gh pr diff command for viewing PR code changes ([#1836](https://github.com/gptme/gptme/issues/1836)) ([`77ea7212f`](https://github.com/gptme/gptme/commit/77ea7212f))
 - feat(gh): support short GitHub references (owner/repo#N, #N, bare N) ([#1835](https://github.com/gptme/gptme/issues/1835)) ([`8b11d7735`](https://github.com/gptme/gptme/commit/8b11d7735))
 - feat(browser): smarter GitHub URL routing + HTML content extraction ([#1825](https://github.com/gptme/gptme/issues/1825)) ([`bbf952b4a`](https://github.com/gptme/gptme/commit/bbf952b4a))
 - feat(llm): add max_tokens parameter to reply() and chat() ([#1828](https://github.com/gptme/gptme/issues/1828)) ([`d57fd0ca4`](https://github.com/gptme/gptme/commit/d57fd0ca4))
 - feat(gh): add `gh issue view` command for structured issue reading ([#1827](https://github.com/gptme/gptme/issues/1827)) ([`704165542`](https://github.com/gptme/gptme/commit/704165542))
 - feat(docs): wire eval leaderboard into docs build ([#1814](https://github.com/gptme/gptme/issues/1814)) ([`d3be51138`](https://github.com/gptme/gptme/commit/d3be51138))
 - feat(context): support @-prefix for file/directory references ([#1813](https://github.com/gptme/gptme/issues/1813)) ([`628453d12`](https://github.com/gptme/gptme/commit/628453d12))
 - feat(eval): add HTML output format for leaderboard ([#1812](https://github.com/gptme/gptme/issues/1812)) ([`c0b6139f8`](https://github.com/gptme/gptme/commit/c0b6139f8))
 - feat(eval): add trend tracking for regression/improvement detection ([#1807](https://github.com/gptme/gptme/issues/1807)) ([`4e9a71cc5`](https://github.com/gptme/gptme/commit/4e9a71cc5))
 - feat(eval): add --json flag for machine-readable eval output ([#1787](https://github.com/gptme/gptme/issues/1787)) ([`2cad452af`](https://github.com/gptme/gptme/commit/2cad452af))
 - feat(cli): add --json flag to tools list and tools info commands ([#1800](https://github.com/gptme/gptme/issues/1800)) ([`64ce57a4d`](https://github.com/gptme/gptme/commit/64ce57a4d))
 - feat(cli): add --json flag to models list and models info ([#1799](https://github.com/gptme/gptme/issues/1799)) ([`06e39131e`](https://github.com/gptme/gptme/commit/06e39131e))
 - feat(cli): add providers test command for connectivity validation ([#1798](https://github.com/gptme/gptme/issues/1798)) ([`40712a4b0`](https://github.com/gptme/gptme/commit/40712a4b0))
 - feat(cli): add --json flag to chats list and chats search commands ([#1797](https://github.com/gptme/gptme/issues/1797)) ([`9e252e829`](https://github.com/gptme/gptme/commit/9e252e829))
 - feat(eval): add practical14 suite — matrix transpose, IPv4 classification, bracket balance ([#1793](https://github.com/gptme/gptme/issues/1793)) ([`497c8a769`](https://github.com/gptme/gptme/commit/497c8a769))
 - feat(eval): add practical13 suite — summary stats, Pascal's triangle, Caesar cipher ([#1788](https://github.com/gptme/gptme/issues/1788)) ([`317a154ac`](https://github.com/gptme/gptme/commit/317a154ac))
 - feat(eval): add practical10 suite — semver sorting, date histogram, TSV-to-CSV ([#1784](https://github.com/gptme/gptme/issues/1784)) ([`8f8eaf6e9`](https://github.com/gptme/gptme/commit/8f8eaf6e9))
 - feat(eval): add practical12 suite — word frequency, Collatz sequences, log-level stats ([`dd1613e95`](https://github.com/gptme/gptme/commit/dd1613e95))
 - feat(eval): add practical11 suite — Roman numerals, run-length encoding, anagram groups ([#1785](https://github.com/gptme/gptme/issues/1785)) ([`b568f4b1d`](https://github.com/gptme/gptme/commit/b568f4b1d))
 - feat(eval): add practical9 suite — env parsing, YAML merge, git log stats ([#1782](https://github.com/gptme/gptme/issues/1782)) ([`c0f6b1f20`](https://github.com/gptme/gptme/commit/c0f6b1f20))
 - feat(prompts): auto-load cross-tool AI instruction files ([#1780](https://github.com/gptme/gptme/issues/1780)) ([`4e719752e`](https://github.com/gptme/gptme/commit/4e719752e))
 - feat(browser): add read_page_text() for interactive page content ([#1772](https://github.com/gptme/gptme/issues/1772)) ([`ddd327389`](https://github.com/gptme/gptme/commit/ddd327389))
 - feat(browser): add page metadata to ARIA snapshot output ([#1771](https://github.com/gptme/gptme/issues/1771)) ([`efff411c0`](https://github.com/gptme/gptme/commit/efff411c0))
 - feat(browser): add interactive browsing — click, fill, scroll ([#1764](https://github.com/gptme/gptme/issues/1764)) ([`4f21623d7`](https://github.com/gptme/gptme/commit/4f21623d7))
 - feat(context): add directory support to include_paths ([#1767](https://github.com/gptme/gptme/issues/1767)) ([`83e3ebf30`](https://github.com/gptme/gptme/commit/83e3ebf30))
 - feat(prompts): include git status in workspace prompt ([#1766](https://github.com/gptme/gptme/issues/1766)) ([`57132d49c`](https://github.com/gptme/gptme/commit/57132d49c))
 - feat(browser): add ARIA accessibility snapshot via snapshot_url() ([#1762](https://github.com/gptme/gptme/issues/1762)) ([`17c2c12c5`](https://github.com/gptme/gptme/commit/17c2c12c5))
 - feat(eval): add --list flag to show available suites and tests ([#1761](https://github.com/gptme/gptme/issues/1761)) ([`7d34bd689`](https://github.com/gptme/gptme/commit/7d34bd689))
 - feat(evals): add model comparison leaderboard ([#1758](https://github.com/gptme/gptme/issues/1758)) ([`e4a5d4833`](https://github.com/gptme/gptme/commit/e4a5d4833))
 - feat(chat): add GPTME_MAX_STEPS and GPTME_CONTEXT_LENGTH env vars ([#1683](https://github.com/gptme/gptme/issues/1683)) ([`02cc7c16a`](https://github.com/gptme/gptme/commit/02cc7c16a))
 - feat(eval): add --eval-module flag for loading external eval specs ([#1727](https://github.com/gptme/gptme/issues/1727)) ([`da477f9a3`](https://github.com/gptme/gptme/commit/da477f9a3))
 - feat(skills): add dependency declarations to SKILL.md frontmatter ([#1722](https://github.com/gptme/gptme/issues/1722)) ([`d8f3bbb2c`](https://github.com/gptme/gptme/commit/d8f3bbb2c))
 - feat(llm): model-dependent break_on_tooluse default ([#1724](https://github.com/gptme/gptme/issues/1724)) ([`955002b39`](https://github.com/gptme/gptme/commit/955002b39))
 - feat(eval): add Claude Code agent for cross-harness evaluation ([#1713](https://github.com/gptme/gptme/issues/1713)) ([`a819c6a70`](https://github.com/gptme/gptme/commit/a819c6a70))
 - feat(eval): add practical8 suite — url-stats, markdown-toc, json-flatten ([#1708](https://github.com/gptme/gptme/issues/1708)) ([`ce5ea8866`](https://github.com/gptme/gptme/commit/ce5ea8866))
 - feat(eval): add practical7 suite — ini-to-json, json-diff, changelog-gen ([#1706](https://github.com/gptme/gptme/issues/1706)) ([`85db2dc17`](https://github.com/gptme/gptme/commit/85db2dc17))
 - feat(prompts): XML-sectioned system prompt when tool_format=xml ([`6939aeba7`](https://github.com/gptme/gptme/commit/6939aeba7))
 - feat(eval): add practical7 suite — ini-to-json, json-diff, changelog-gen ([#1679](https://github.com/gptme/gptme/issues/1679)) ([`31d07dd42`](https://github.com/gptme/gptme/commit/31d07dd42))
 - feat(models): use closest-match heuristic for unknown model metadata ([#1682](https://github.com/gptme/gptme/issues/1682)) ([`35e4aa9de`](https://github.com/gptme/gptme/commit/35e4aa9de))
 - feat(eval): add practical6 suite — csv-analysis, word-frequency, merge-configs ([#1676](https://github.com/gptme/gptme/issues/1676)) ([`c1bb0252a`](https://github.com/gptme/gptme/commit/c1bb0252a))
 - feat(eval): add practical5 suite — rename-function, data-pipeline, regex-scrub ([#1662](https://github.com/gptme/gptme/issues/1662)) ([`76ad24d7e`](https://github.com/gptme/gptme/commit/76ad24d7e))
 - feat(eval): add implement-class and optimize-performance eval tests ([#1644](https://github.com/gptme/gptme/issues/1644)) ([`bad1be942`](https://github.com/gptme/gptme/commit/bad1be942))
 - feat(eval): add practical4 suite — group-by, schedule-overlaps, topo-sort ([#1654](https://github.com/gptme/gptme/issues/1654)) ([`0ac1a46df`](https://github.com/gptme/gptme/commit/0ac1a46df))
 - feat(eval): add practical3 suite — write-tests and sqlite-store tasks ([#1653](https://github.com/gptme/gptme/issues/1653)) ([`80cbf8cff`](https://github.com/gptme/gptme/commit/80cbf8cff))
 - feat(eval): add practical2 suite — sort-and-filter, template-fill, validate-csv ([#1652](https://github.com/gptme/gptme/issues/1652)) ([`47d83e95b`](https://github.com/gptme/gptme/commit/47d83e95b))
 - feat(eval): add practical eval suite with 3 real-world tests ([#1647](https://github.com/gptme/gptme/issues/1647)) ([`120edd060`](https://github.com/gptme/gptme/commit/120edd060))
 - feat(eval): add count-words and json-filter tests to basic suite ([#1661](https://github.com/gptme/gptme/issues/1661)) ([`76277badc`](https://github.com/gptme/gptme/commit/76277badc))
 - feat(util): add context deduplication helper for plugins ([#1656](https://github.com/gptme/gptme/issues/1656)) ([`bfcb30739`](https://github.com/gptme/gptme/commit/bfcb30739))
 - feat(acp): stream tokens from ACP subprocess to server SSE ([#1586](https://github.com/gptme/gptme/issues/1586)) ([`822879134`](https://github.com/gptme/gptme/commit/822879134))
 - feat(server): add /api/config endpoint exposing agent URLs from gptme.toml ([#1657](https://github.com/gptme/gptme/issues/1657)) ([`86510ccec`](https://github.com/gptme/gptme/commit/86510ccec))
 - feat(prompts): distinguish agent instruction files from context files ([#1556](https://github.com/gptme/gptme/issues/1556)) ([`6f44f7742`](https://github.com/gptme/gptme/commit/6f44f7742))
 - feat(release): centralize release pipeline in release.yml ([#1640](https://github.com/gptme/gptme/issues/1640)) ([`0b35e0c1e`](https://github.com/gptme/gptme/commit/0b35e0c1e))
 - feat(lessons): support LLM-judge effectiveness state ([#1636](https://github.com/gptme/gptme/issues/1636)) ([`6f544dfd0`](https://github.com/gptme/gptme/commit/6f544dfd0))
 - feat(cli): add `gptme-util chats rename` command ([#1622](https://github.com/gptme/gptme/issues/1622)) ([`2d77ef1ae`](https://github.com/gptme/gptme/commit/2d77ef1ae))
 - feat(skills): skill marketplace — install, uninstall, validate, init, publish ([#1566](https://github.com/gptme/gptme/issues/1566)) ([`fa6680ee2`](https://github.com/gptme/gptme/commit/fa6680ee2))
 - feat(eval): add debug-type-error and find-and-fix eval tests ([#1614](https://github.com/gptme/gptme/issues/1614)) ([`4347c53ae`](https://github.com/gptme/gptme/commit/4347c53ae))
 - feat(doctor): add MCP server health checks ([#1617](https://github.com/gptme/gptme/issues/1617)) ([`8ba02b92e`](https://github.com/gptme/gptme/commit/8ba02b92e))
 - feat(eval): add generate-cli and extract-function eval tests ([#1615](https://github.com/gptme/gptme/issues/1615)) ([`a21287b06`](https://github.com/gptme/gptme/commit/a21287b06))
 - feat(cli): add `gptme-util chats stats` command ([#1618](https://github.com/gptme/gptme/issues/1618)) ([`53c415e9a`](https://github.com/gptme/gptme/commit/53c415e9a))
 - feat(cli): add tool exclusion with '-' prefix syntax ([#1616](https://github.com/gptme/gptme/issues/1616)) ([`b1907cac0`](https://github.com/gptme/gptme/commit/b1907cac0))
 - feat(cli): add `gptme-util chats clean` command ([#1620](https://github.com/gptme/gptme/issues/1620)) ([`84145d061`](https://github.com/gptme/gptme/commit/84145d061))
 - feat(cli): add `gptme-util chats export` command ([#1619](https://github.com/gptme/gptme/issues/1619)) ([`3abc90f08`](https://github.com/gptme/gptme/commit/3abc90f08))
 - feat(config): add [agent.urls] to AgentConfig for named agent links ([#1621](https://github.com/gptme/gptme/issues/1621)) ([`524208ff5`](https://github.com/gptme/gptme/commit/524208ff5))
 - feat(doctor): add lesson health checks to agent doctor ([#1613](https://github.com/gptme/gptme/issues/1613)) ([`c9a691681`](https://github.com/gptme/gptme/commit/c9a691681))
 - feat(server): add ACP subprocess health monitoring and orphan cleanup ([#1583](https://github.com/gptme/gptme/issues/1583)) ([`6b423fd0f`](https://github.com/gptme/gptme/commit/6b423fd0f))
 - feat(lessons): canonicalize TS lesson lookup keys ([#1610](https://github.com/gptme/gptme/issues/1610)) ([`6f73516ba`](https://github.com/gptme/gptme/commit/6f73516ba))
 - feat(doctor): add version check and Playwright browser check ([#1612](https://github.com/gptme/gptme/issues/1612)) ([`b5310b091`](https://github.com/gptme/gptme/commit/b5310b091))
 - feat(context): show context window utilization in /context command ([#1611](https://github.com/gptme/gptme/issues/1611)) ([`b817e8101`](https://github.com/gptme/gptme/commit/b817e8101))
 - feat(lessons): Thompson sampling effectiveness scoring for hybrid matcher ([#1573](https://github.com/gptme/gptme/issues/1573)) ([`0ee822c76`](https://github.com/gptme/gptme/commit/0ee822c76))
 - feat(models): add GPT-5.4 subscription models ([#1604](https://github.com/gptme/gptme/issues/1604)) ([`aac5582a7`](https://github.com/gptme/gptme/commit/aac5582a7))
 - feat(models): add --available flag and provider status markers to models list ([#1606](https://github.com/gptme/gptme/issues/1606)) ([`b181b450d`](https://github.com/gptme/gptme/commit/b181b450d))
 - feat(subagent): add ACP execution mode for multi-harness subagents ([#1563](https://github.com/gptme/gptme/issues/1563)) ([`809ff65a0`](https://github.com/gptme/gptme/commit/809ff65a0))
 - feat(context): show metadata for binary files instead of silently ignoring ([#1601](https://github.com/gptme/gptme/issues/1601)) ([`6ebae8dbb`](https://github.com/gptme/gptme/commit/6ebae8dbb))
 - feat(read): list directory contents instead of erroring ([#1602](https://github.com/gptme/gptme/issues/1602)) ([`0d789bf6a`](https://github.com/gptme/gptme/commit/0d789bf6a))
 - feat(setup): add bash and zsh shell completions ([#1603](https://github.com/gptme/gptme/issues/1603)) ([`b51575517`](https://github.com/gptme/gptme/commit/b51575517))
 - feat(tauri): first-run setup wizard for new users ([#1596](https://github.com/gptme/gptme/issues/1596)) ([`afa31888d`](https://github.com/gptme/gptme/commit/afa31888d))
 - feat(server): add GPTME_USE_ACP_DEFAULT config for server-side ACP opt-in ([#1580](https://github.com/gptme/gptme/issues/1580)) ([`6752790f4`](https://github.com/gptme/gptme/commit/6752790f4))
 - feat(tauri): add Windows build support ([#1597](https://github.com/gptme/gptme/issues/1597)) ([`799d97770`](https://github.com/gptme/gptme/commit/799d97770))
 - feat(tauri): add monorepo integration — CI, Makefile, and path fixes ([`33cb1c58b`](https://github.com/gptme/gptme/commit/33cb1c58b))
 - feat(eval): add Terminal-Bench (tbench) evaluation module ([#1582](https://github.com/gptme/gptme/issues/1582)) ([`10bcbf6f1`](https://github.com/gptme/gptme/commit/10bcbf6f1))
 - feat(server): add ACP session runtime wrapper for per-session subprocesses ([#1546](https://github.com/gptme/gptme/issues/1546)) ([`7abe6078d`](https://github.com/gptme/gptme/commit/7abe6078d))
 - feat: automated demo capture pipeline (asciinema + screenshots + recordings) ([#1558](https://github.com/gptme/gptme/issues/1558)) ([`0862961cd`](https://github.com/gptme/gptme/commit/0862961cd))
 - feat(eval): new test cases and robustness fixes ([#1559](https://github.com/gptme/gptme/issues/1559)) ([`2016223e0`](https://github.com/gptme/gptme/commit/2016223e0))
 - feat(release): generate structured changelogs for all release types ([#1550](https://github.com/gptme/gptme/issues/1550)) ([`50539e79b`](https://github.com/gptme/gptme/commit/50539e79b))
 - feat(hooks): add CWD_CHANGED hook type for directory change events ([#1539](https://github.com/gptme/gptme/issues/1539)) ([`16e5cd818`](https://github.com/gptme/gptme/commit/16e5cd818))
 - feat(acp): add GptmeAcpClient — gptme as ACP client ([#1536](https://github.com/gptme/gptme/issues/1536)) ([`c1a083281`](https://github.com/gptme/gptme/commit/c1a083281))
 - feat(agent): add `gptme-agent doctor` command for workspace health checks ([#1545](https://github.com/gptme/gptme/issues/1545)) ([`11295882a`](https://github.com/gptme/gptme/commit/11295882a))
 - feat(tools): support loading custom tools from .py files via --tools ([#1540](https://github.com/gptme/gptme/issues/1540)) ([`d66a011e5`](https://github.com/gptme/gptme/commit/d66a011e5))
 - feat(llm): add gptme provider for managed service ([#1529](https://github.com/gptme/gptme/issues/1529)) ([`f6abb75dd`](https://github.com/gptme/gptme/commit/f6abb75dd))
 - feat(hooks): add goose, opencode, amp agent runtime detection ([#1530](https://github.com/gptme/gptme/issues/1530)) ([`5e5f0df10`](https://github.com/gptme/gptme/commit/5e5f0df10))
 - feat(tools): add /tools load command to enable tools mid-conversation ([#1518](https://github.com/gptme/gptme/issues/1518)) ([`02d38a7bd`](https://github.com/gptme/gptme/commit/02d38a7bd))
 - feat(hooks): inject AGENTS.md on working directory change ([#1519](https://github.com/gptme/gptme/issues/1519)) ([`233346545`](https://github.com/gptme/gptme/commit/233346545))
 - feat(hooks): parallel agent awareness via process scanning ([#1505](https://github.com/gptme/gptme/issues/1505)) ([#1509](https://github.com/gptme/gptme/issues/1509)) ([`1b7f817ba`](https://github.com/gptme/gptme/commit/1b7f817ba))
 - feat: enhance --version with extras, providers, health summary ([#1503](https://github.com/gptme/gptme/issues/1503)) ([`67eafafc4`](https://github.com/gptme/gptme/commit/67eafafc4))
 - feat: always load AGENTS.md files (layered: user + project) ([#1511](https://github.com/gptme/gptme/issues/1511)) ([`26da34a77`](https://github.com/gptme/gptme/commit/26da34a77))
 - feat: improve gptme-util discoverability and tool formatting ([#1506](https://github.com/gptme/gptme/issues/1506)) ([`05b07cef4`](https://github.com/gptme/gptme/commit/05b07cef4))
 - feat: cleaner KeyboardInterrupt handling and CI startup benchmarks ([#1502](https://github.com/gptme/gptme/issues/1502)) ([`80c185d46`](https://github.com/gptme/gptme/commit/80c185d46))
 - feat(prompts): skip tool examples for reasoning models ([#1500](https://github.com/gptme/gptme/issues/1500)) ([`50ca19755`](https://github.com/gptme/gptme/commit/50ca19755))
 - feat(eval): add SWE-bench evaluation modules (recovered from [#142](https://github.com/gptme/gptme/issues/142) and [#424](https://github.com/gptme/gptme/issues/424)) ([#1489](https://github.com/gptme/gptme/issues/1489)) ([`7b29e8db0`](https://github.com/gptme/gptme/commit/7b29e8db0))
 - feat: add deep-link OAuth flow for gptme.ai pairing ([#12](https://github.com/gptme/gptme/issues/12)) ([`4e2aadaf3`](https://github.com/gptme/gptme/commit/4e2aadaf3))
 - feat(profiles): add computer-use profile and document --tools +computer ([#1492](https://github.com/gptme/gptme/issues/1492)) ([`60ed23f87`](https://github.com/gptme/gptme/commit/60ed23f87))
 - feat: add Ctrl+V image paste support ([#1379](https://github.com/gptme/gptme/issues/1379)) ([`5de35ffe5`](https://github.com/gptme/gptme/commit/5de35ffe5))
 - feat: add server lifecycle IPC commands ([#11](https://github.com/gptme/gptme/issues/11)) ([`aa38b5e20`](https://github.com/gptme/gptme/commit/aa38b5e20))
 - feat(subagent): add persistent memory per agent profile ([#1466](https://github.com/gptme/gptme/issues/1466)) ([`2fb82ac6f`](https://github.com/gptme/gptme/commit/2fb82ac6f))
 - feat(subagent): add worktree isolation for filesystem-safe subagents ([#1465](https://github.com/gptme/gptme/issues/1465)) ([`15b837654`](https://github.com/gptme/gptme/commit/15b837654))
 - feat(profiles): support markdown files with YAML frontmatter ([#1464](https://github.com/gptme/gptme/issues/1464)) ([`3184df121`](https://github.com/gptme/gptme/commit/3184df121))
 - feat(profiles): add tool name validation ([#1463](https://github.com/gptme/gptme/issues/1463)) ([`210db47db`](https://github.com/gptme/gptme/commit/210db47db))
 - feat(cli): add agent profiles for pre-configured system prompts + tool access ([#1455](https://github.com/gptme/gptme/issues/1455)) ([`64b2015db`](https://github.com/gptme/gptme/commit/64b2015db))
 - feat(acp): consolidate ACP improvements ([`88fd565f2`](https://github.com/gptme/gptme/commit/88fd565f2))
 - feat(acp): enrich listSessions with title, timestamps, cwd filtering ([#1430](https://github.com/gptme/gptme/issues/1430)) ([`4faa85a26`](https://github.com/gptme/gptme/commit/4faa85a26))
 - feat(models): add per-model default tool_format to ModelMeta ([#1417](https://github.com/gptme/gptme/issues/1417)) ([`aa61e3517`](https://github.com/gptme/gptme/commit/aa61e3517))
 - feat(acp): return modes and models in NewSessionResponse ([#1425](https://github.com/gptme/gptme/issues/1425)) ([`eaba19834`](https://github.com/gptme/gptme/commit/eaba19834))
 - feat(cli): add auto_envvar_prefix for GPTME_* env vars ([#1418](https://github.com/gptme/gptme/issues/1418)) ([`d43caf018`](https://github.com/gptme/gptme/commit/d43caf018))
 - feat(acp): persistent sessions with load/list from disk ([#1424](https://github.com/gptme/gptme/issues/1424)) ([`52b855c73`](https://github.com/gptme/gptme/commit/52b855c73))
 - feat(acp): add JSON-RPC protocol logging for debugging ([#1423](https://github.com/gptme/gptme/issues/1423)) ([`e1ac729f0`](https://github.com/gptme/gptme/commit/e1ac729f0))
 - feat: add Windows compatibility ([#528](https://github.com/gptme/gptme/issues/528)) ([`7603eb49e`](https://github.com/gptme/gptme/commit/7603eb49e))
 - feat(acp): send AvailableCommandsUpdate on session start ([#1396](https://github.com/gptme/gptme/issues/1396)) ([`636b9b085`](https://github.com/gptme/gptme/commit/636b9b085))
 - feat(acp): send model and workspace info on session open ([#1392](https://github.com/gptme/gptme/issues/1392)) ([`82b9873f6`](https://github.com/gptme/gptme/commit/82b9873f6))
 - feat(llm): add deprecated field to model metadata ([#1316](https://github.com/gptme/gptme/issues/1316)) ([`1481d059c`](https://github.com/gptme/gptme/commit/1481d059c))
 - feat(llm): add missing OpenAI model metadata (GPT-4.1, o3, o4-mini) ([#1311](https://github.com/gptme/gptme/issues/1311)) ([`dcbbc0a81`](https://github.com/gptme/gptme/commit/dcbbc0a81))
 - feat(reduce): truncate long `<details>` blocks in messages ([#1304](https://github.com/gptme/gptme/issues/1304)) ([`8ff9d9bc0`](https://github.com/gptme/gptme/commit/8ff9d9bc0))
 - feat(server): support slash commands in V2 API ([#1282](https://github.com/gptme/gptme/issues/1282)) ([`60881e487`](https://github.com/gptme/gptme/commit/60881e487))
 - feat(webui): display image attachments and file links in built-in UI ([#1289](https://github.com/gptme/gptme/issues/1289)) ([`5d86aa7d2`](https://github.com/gptme/gptme/commit/5d86aa7d2))
 - feat(server): add server-side elicitation hook for WebUI ([#1295](https://github.com/gptme/gptme/issues/1295)) ([`879a3ad63`](https://github.com/gptme/gptme/commit/879a3ad63))
 - feat(mcp): add elicitation support for user input requests ([#1227](https://github.com/gptme/gptme/issues/1227)) ([`ebf4acbeb`](https://github.com/gptme/gptme/commit/ebf4acbeb))
 - feat(cli): add skills subcommands to gptme-util ([#1287](https://github.com/gptme/gptme/issues/1287)) ([`08c9f0661`](https://github.com/gptme/gptme/commit/08c9f0661))
 - feat(hooks): generalize elicitation with hook-based system ([#1283](https://github.com/gptme/gptme/issues/1283)) ([`b95078dfd`](https://github.com/gptme/gptme/commit/b95078dfd))
 - feat(tools): make read tool useful standalone, disable by default ([#1266](https://github.com/gptme/gptme/issues/1266)) ([`1c05d1f7c`](https://github.com/gptme/gptme/commit/1c05d1f7c))
 - feat(llm): add OpenAI subscription provider support ([#1225](https://github.com/gptme/gptme/issues/1225)) ([`02396e775`](https://github.com/gptme/gptme/commit/02396e775))
 - feat: auto-trigger LLM resume when rule-based compaction stalls ([#1262](https://github.com/gptme/gptme/issues/1262)) ([`3bd7d4ec3`](https://github.com/gptme/gptme/commit/3bd7d4ec3))
 - feat(dirs): add get_workspace() for agent workspace detection ([#1265](https://github.com/gptme/gptme/issues/1265)) ([`a81083c05`](https://github.com/gptme/gptme/commit/a81083c05))
 - feat(cli): add --context flag, --tools validation, and CLI help cleanup ([#1258](https://github.com/gptme/gptme/issues/1258)) ([`b74076d4a`](https://github.com/gptme/gptme/commit/b74076d4a))
 - feat(webui): complete avatar support — cache fix, tooltips, user avatars ([#1252](https://github.com/gptme/gptme/issues/1252)) ([`5ca031a7d`](https://github.com/gptme/gptme/commit/5ca031a7d))
 - feat(webui): display agent avatar in chat messages ([#1215](https://github.com/gptme/gptme/issues/1215)) ([`842c6972f`](https://github.com/gptme/gptme/commit/842c6972f))
 - feat(webui): add show hidden messages setting, move initial system to settings ([#1248](https://github.com/gptme/gptme/issues/1248)) ([`9c68f2567`](https://github.com/gptme/gptme/commit/9c68f2567))
 - feat(webui): multi-backend support with unified view ([#1241](https://github.com/gptme/gptme/issues/1241)) ([`df8df2766`](https://github.com/gptme/gptme/commit/df8df2766))
 - feat(patch): improve multi-hunk support and error messages ([#1245](https://github.com/gptme/gptme/issues/1245)) ([`f110a53eb`](https://github.com/gptme/gptme/commit/f110a53eb))
 - feat(commands): separate /model and /models commands ([#1243](https://github.com/gptme/gptme/issues/1243)) ([`db9f6c572`](https://github.com/gptme/gptme/commit/db9f6c572))
 - feat(config): support config.local.toml for user config ([#1239](https://github.com/gptme/gptme/issues/1239)) ([`edf7aabc9`](https://github.com/gptme/gptme/commit/edf7aabc9))
 - feat(config): add [user] section to user config ([#1238](https://github.com/gptme/gptme/issues/1238)) ([`60b36436f`](https://github.com/gptme/gptme/commit/60b36436f))
 - feat(context): add URL confirmation and content size safeguards ([#1211](https://github.com/gptme/gptme/issues/1211)) ([`717bb20d5`](https://github.com/gptme/gptme/commit/717bb20d5))
 - feat(vision): add PIL.Image support to view_image function ([#1232](https://github.com/gptme/gptme/issues/1232)) ([`328eda834`](https://github.com/gptme/gptme/commit/328eda834))
 - feat(lessons): add default lookup directories for skills ([#1217](https://github.com/gptme/gptme/issues/1217)) ([`f76a80bdd`](https://github.com/gptme/gptme/commit/f76a80bdd))
 - feat(anthropic): enable thinking mode with native tool calling ([#1193](https://github.com/gptme/gptme/issues/1193)) ([`503077803`](https://github.com/gptme/gptme/commit/503077803))
 - feat(telemetry): add GPTME_RUN_TYPE env var support ([#1200](https://github.com/gptme/gptme/issues/1200)) ([`fb3810f6a`](https://github.com/gptme/gptme/commit/fb3810f6a))
 - feat(config): add avatar field to AgentConfig ([#1198](https://github.com/gptme/gptme/issues/1198)) ([`69e6e24ae`](https://github.com/gptme/gptme/commit/69e6e24ae))
 - feat(config): add [plugin.*] namespace for plugin-specific configuration ([#1197](https://github.com/gptme/gptme/issues/1197)) ([`6b5c248e8`](https://github.com/gptme/gptme/commit/6b5c248e8))
 - feat: switch to hook-based tool confirmations ([#1105](https://github.com/gptme/gptme/issues/1105)) ([`a23d89333`](https://github.com/gptme/gptme/commit/a23d89333))
 - feat(agent): detect existing agent workspaces and enhance status command ([#1183](https://github.com/gptme/gptme/issues/1183)) ([`e3bdd2476`](https://github.com/gptme/gptme/commit/e3bdd2476))
 - feat(prompts): add safeguard truncation for context_cmd output ([#1178](https://github.com/gptme/gptme/issues/1178)) ([`ba7cd8776`](https://github.com/gptme/gptme/commit/ba7cd8776))
 - feat: hide messages with hide=true (e.g., auto-included lessons) ([#118](https://github.com/gptme/gptme/issues/118)) ([`6c0df0cad`](https://github.com/gptme/gptme/commit/6c0df0cad))
 - feat(cli): add gptme-onboard wizard for first-run setup ([#1167](https://github.com/gptme/gptme/issues/1167)) ([`d1f45db94`](https://github.com/gptme/gptme/commit/d1f45db94))
 - feat(cli): add gptme-doctor command for system diagnostics ([#1166](https://github.com/gptme/gptme/issues/1166)) ([`5140d8699`](https://github.com/gptme/gptme/commit/5140d8699))
 - feat(cli): add gptme-agent command for unified agent management ([#1159](https://github.com/gptme/gptme/issues/1159)) ([`104f05d78`](https://github.com/gptme/gptme/commit/104f05d78))
 - feat(hooks): add async_mode support for non-blocking hook execution ([#1154](https://github.com/gptme/gptme/issues/1154)) ([`a2b4b70eb`](https://github.com/gptme/gptme/commit/a2b4b70eb))
 - feat(compact): add context file extraction for /compact resume ([#1151](https://github.com/gptme/gptme/issues/1151)) ([`5b7b55993`](https://github.com/gptme/gptme/commit/5b7b55993))
 - feat(browser): improve PDF reading with page limits and vision hints ([#1126](https://github.com/gptme/gptme/issues/1126)) ([`d18b9aa76`](https://github.com/gptme/gptme/commit/d18b9aa76))
 - feat(lessons): session-wide limit and end-of-session statistics ([#1146](https://github.com/gptme/gptme/issues/1146)) ([`4ac795519`](https://github.com/gptme/gptme/commit/4ac795519))
 - feat(mcp): add roots support for defining operational boundaries ([#1144](https://github.com/gptme/gptme/issues/1144)) ([`dd3108cba`](https://github.com/gptme/gptme/commit/dd3108cba))
 - feat(mcp): add MCP prompts support ([#1141](https://github.com/gptme/gptme/issues/1141)) ([`1e585bbf8`](https://github.com/gptme/gptme/commit/1e585bbf8))
 - feat(input): add message queueing support ([#115](https://github.com/gptme/gptme/issues/115)) ([`6f4f3fa68`](https://github.com/gptme/gptme/commit/6f4f3fa68))
 - feat(ui): add auto-accept all option using existing onAuto mechanism ([#103](https://github.com/gptme/gptme/issues/103)) ([`c9b789e95`](https://github.com/gptme/gptme/commit/c9b789e95))
 - feat(auth): derive exchange URL from configuration (Option B) ([#111](https://github.com/gptme/gptme/issues/111)) ([`42d7b3db7`](https://github.com/gptme/gptme/commit/42d7b3db7))
 - feat(mcp): add MCP resources support ([#1109](https://github.com/gptme/gptme/issues/1109)) ([`6d3bd2be5`](https://github.com/gptme/gptme/commit/6d3bd2be5))
 - feat: add URI support in Message.files for URLs and MCP resources ([#1118](https://github.com/gptme/gptme/issues/1118)) ([`34c6afef7`](https://github.com/gptme/gptme/commit/34c6afef7))
 - feat: add file autocomplete for @ mentions ([#110](https://github.com/gptme/gptme/issues/110)) ([`8465902d8`](https://github.com/gptme/gptme/commit/8465902d8))
 - feat: enable auto-reconnect for web environments ([#109](https://github.com/gptme/gptme/issues/109)) ([`1fa2ca113`](https://github.com/gptme/gptme/commit/1fa2ca113))
 - feat(auth): implement auth code exchange flow ([#108](https://github.com/gptme/gptme/issues/108)) ([`8caf1d3ec`](https://github.com/gptme/gptme/commit/8caf1d3ec))
 - feat(browser): add PDF support using pypdf ([#1120](https://github.com/gptme/gptme/issues/1120)) ([`2c5086dcf`](https://github.com/gptme/gptme/commit/2c5086dcf))
 - feat(anthropic): add web search block handling ([#1122](https://github.com/gptme/gptme/issues/1122)) ([`8c403ab32`](https://github.com/gptme/gptme/commit/8c403ab32))
 - feat(anthropic): add native web search support ([#723](https://github.com/gptme/gptme/issues/723)) ([`dda13a54d`](https://github.com/gptme/gptme/commit/dda13a54d))
 - feat(prompts): add skills summary to system prompt ([#1107](https://github.com/gptme/gptme/issues/1107)) ([`f65b0b5ba`](https://github.com/gptme/gptme/commit/f65b0b5ba))
 - feat(gh): truncate verbose comment bodies to reduce token usage ([#1103](https://github.com/gptme/gptme/issues/1103)) ([`fcfe48aad`](https://github.com/gptme/gptme/commit/fcfe48aad))
 - feat(gh): include comment IDs in PR review output ([#1101](https://github.com/gptme/gptme/issues/1101)) ([`5a1850b3d`](https://github.com/gptme/gptme/commit/5a1850b3d))
 - feat(lessons): add wildcard and regex pattern support for keyword matching ([#1093](https://github.com/gptme/gptme/issues/1093)) ([`12dae0b8d`](https://github.com/gptme/gptme/commit/12dae0b8d))
 - feat(server): add GPTME_DEBUG_ERRORS for verbose error messages in dev mode ([#1096](https://github.com/gptme/gptme/issues/1096)) ([`e9bba532f`](https://github.com/gptme/gptme/commit/e9bba532f))
 - feat(hooks): add cache_awareness hook for centralized cache state tracking ([#1074](https://github.com/gptme/gptme/issues/1074)) ([`88c38de31`](https://github.com/gptme/gptme/commit/88c38de31))
 - feat(llm): add retry logic for OpenAI API transient errors ([#1067](https://github.com/gptme/gptme/issues/1067)) ([`91811070f`](https://github.com/gptme/gptme/commit/91811070f))
 - feat(hooks): add CACHE_INVALIDATED hook type for cache-aware plugins ([#1070](https://github.com/gptme/gptme/issues/1070)) ([`04b9f6940`](https://github.com/gptme/gptme/commit/04b9f6940))
 - feat(autocompact): add semantic patterns for value-aware retention ([#1061](https://github.com/gptme/gptme/issues/1061)) ([`34369e203`](https://github.com/gptme/gptme/commit/34369e203))
 - feat: add session cost summary on exit ([#1037](https://github.com/gptme/gptme/issues/1037)) ([`856617adc`](https://github.com/gptme/gptme/commit/856617adc))
 - feat(lessons): deduplicate lessons by resolved path to handle symlinks ([#1026](https://github.com/gptme/gptme/issues/1026)) ([`1a5701125`](https://github.com/gptme/gptme/commit/1a5701125))
 - feat(autocompact): add Master Context Architecture for byte-range recovery ([#1020](https://github.com/gptme/gptme/issues/1020)) ([`c82701c77`](https://github.com/gptme/gptme/commit/c82701c77))
 - feat(commands): add /skills command for browsing skills and lessons ([#1014](https://github.com/gptme/gptme/issues/1014)) ([`ddec87163`](https://github.com/gptme/gptme/commit/ddec87163))
 - feat(codeblock): support quad+ backticks for nested markdown (Issue [#1005](https://github.com/gptme/gptme/issues/1005)) ([#1009](https://github.com/gptme/gptme/issues/1009)) ([`fe24f45cb`](https://github.com/gptme/gptme/commit/fe24f45cb))
 - feat: add extensible command argument completion system ([#1010](https://github.com/gptme/gptme/issues/1010)) ([`ce912dae1`](https://github.com/gptme/gptme/commit/ce912dae1))
 - feat(subagent): add structured delegation template for clear task handoff ([#997](https://github.com/gptme/gptme/issues/997)) ([`aea670e9b`](https://github.com/gptme/gptme/commit/aea670e9b))
 - feat(skills): add codebase classification skill ([`56a9d442e`](https://github.com/gptme/gptme/commit/56a9d442e))
 - feat(lessons): support Anthropic SKILL.md format matching ([#1001](https://github.com/gptme/gptme/issues/1001)) ([`e63c98068`](https://github.com/gptme/gptme/commit/e63c98068))
 - feat(complete): add todo-based continuation enforcer ([#996](https://github.com/gptme/gptme/issues/996)) ([`739691bf8`](https://github.com/gptme/gptme/commit/739691bf8))
 - feat: improve cost awareness UX and add prompt caching for OpenRouter ([#990](https://github.com/gptme/gptme/issues/990)) ([`1ff94d260`](https://github.com/gptme/gptme/commit/1ff94d260))
 - feat(eval): implement DockerGPTMeEnv for Docker-isolated gptme execution ([#988](https://github.com/gptme/gptme/issues/988)) ([`1c61f0ed4`](https://github.com/gptme/gptme/commit/1c61f0ed4))
 - feat(context): implement AdaptiveCompressor for Phase 3.1 Week 3-4 ([#937](https://github.com/gptme/gptme/issues/937)) ([`d8bc11979`](https://github.com/gptme/gptme/commit/d8bc11979))
 - feat(cli): add context-mode, context-include, output-schema flags for subprocess mode ([#987](https://github.com/gptme/gptme/issues/987)) ([`1aac45965`](https://github.com/gptme/gptme/commit/1aac45965))
 - feat: add shared executor module for ACP/server code reuse ([#984](https://github.com/gptme/gptme/issues/984)) ([`6a4756a29`](https://github.com/gptme/gptme/commit/6a4756a29))
 - feat: add parallel tool execution support ([#985](https://github.com/gptme/gptme/issues/985)) ([`7d61dc9db`](https://github.com/gptme/gptme/commit/7d61dc9db))
 - feat(acp): add Phase 2 tool call reporting and permissions ([#979](https://github.com/gptme/gptme/issues/979)) ([`8f5cc107c`](https://github.com/gptme/gptme/commit/8f5cc107c))
 - feat(subagent): add Phase 1 async enhancements (subprocess mode, hook notifications, batch) ([#962](https://github.com/gptme/gptme/issues/962)) ([`431c7c171`](https://github.com/gptme/gptme/commit/431c7c171))
 - feat(acp): add Agent Client Protocol support (Phase 1) ([#978](https://github.com/gptme/gptme/issues/978)) ([`75d94dd34`](https://github.com/gptme/gptme/commit/75d94dd34))
 - feat(cli): add /clear command to clear terminal screen ([#968](https://github.com/gptme/gptme/issues/968)) ([`e0168dbfe`](https://github.com/gptme/gptme/commit/e0168dbfe))
 - feat(models): add ollama/local model discovery to /model command ([#960](https://github.com/gptme/gptme/issues/960)) ([`4512d3237`](https://github.com/gptme/gptme/commit/4512d3237))
 - feat(cli): add /delete command to remove conversations (Issue [#956](https://github.com/gptme/gptme/issues/956)) ([#959](https://github.com/gptme/gptme/issues/959)) ([`0563366bd`](https://github.com/gptme/gptme/commit/0563366bd))
 - feat(tasks): add target type filters to task list ([#101](https://github.com/gptme/gptme/issues/101)) ([`066769c34`](https://github.com/gptme/gptme/commit/066769c34))
 - feat(ui): improve error handling for conversation creation ([#95](https://github.com/gptme/gptme/issues/95)) ([`cc3f9c89d`](https://github.com/gptme/gptme/commit/cc3f9c89d))
 - feat(ui): add CommandPalette component with comprehensive tests ([#98](https://github.com/gptme/gptme/issues/98)) ([`48ca8b2f2`](https://github.com/gptme/gptme/commit/48ca8b2f2))
 - feat: add markdown preview to file explorer with accessibility improvements ([#94](https://github.com/gptme/gptme/issues/94)) ([`e47a7e152`](https://github.com/gptme/gptme/commit/e47a7e152))
 - feat: redesign navigation with unified collapsible sidebar ([#89](https://github.com/gptme/gptme/issues/89)) ([`b7e267897`](https://github.com/gptme/gptme/commit/b7e267897))
 - feat: add ExamplesSection component with more examples modal ([`3717e2e4b`](https://github.com/gptme/gptme/commit/3717e2e4b))
 - feat: redesign settings modal ([`a82549a55`](https://github.com/gptme/gptme/commit/a82549a55))
 - feat: add setting to configure default code block open state ([`ca90c78de`](https://github.com/gptme/gptme/commit/ca90c78de))
 - feat: implement auto-naming for conversations ([#84](https://github.com/gptme/gptme/issues/84)) ([`00aa50695`](https://github.com/gptme/gptme/commit/00aa50695))
 - feat: enhance right sidebar UX with auto-collapse and click-to-close ([`e3b08cd89`](https://github.com/gptme/gptme/commit/e3b08cd89))
 - feat: implement collapsible right sidebar with icons-only mode ([`2b49a313b`](https://github.com/gptme/gptme/commit/2b49a313b))
 - feat: add agent/workspace badges and improve sidebar UX ([`67c5a376d`](https://github.com/gptme/gptme/commit/67c5a376d))
 - feat: add tool execution status indicator ([`246485d12`](https://github.com/gptme/gptme/commit/246485d12))
 - feat: list models available from gptme-server API ([#82](https://github.com/gptme/gptme/issues/82)) ([`e29514976`](https://github.com/gptme/gptme/commit/e29514976))
 - feat: add agent creation form and agent list ([`9f3f9eaa9`](https://github.com/gptme/gptme/commit/9f3f9eaa9))
 - feat: ability to add new workspace ([`6d6b63321`](https://github.com/gptme/gptme/commit/6d6b63321))
 - feat: added system notifications on completed response, added modal for ui settings like chime and theme ([#79](https://github.com/gptme/gptme/issues/79)) ([`4a94295b4`](https://github.com/gptme/gptme/commit/4a94295b4))
 - feat: switch to next-themes ThemeProvider for theme detection and settings ([`233ed4251`](https://github.com/gptme/gptme/commit/233ed4251))
 - feat: implement infinite loading for conversations list ([#78](https://github.com/gptme/gptme/issues/78)) ([`2ed57032c`](https://github.com/gptme/gptme/commit/2ed57032c))
 - feat: started working on task view for parallel workflows ([#77](https://github.com/gptme/gptme/issues/77)) ([`00289595f`](https://github.com/gptme/gptme/commit/00289595f))
 - feat: send SIGTERM to gptme-server on app exit ([`440bed12a`](https://github.com/gptme/gptme/commit/440bed12a))
 - feat: add chime sound notifications for assistant completion and tool confirmations ([#72](https://github.com/gptme/gptme/issues/72)) ([`fcad63560`](https://github.com/gptme/gptme/commit/fcad63560))
 - feat: implement inline tool confirmation to replace modal dialog ([#71](https://github.com/gptme/gptme/issues/71)) ([`57f4637ad`](https://github.com/gptme/gptme/commit/57f4637ad))
 - feat: add port conflict detection and error dialogs ([`e5f86d3dd`](https://github.com/gptme/gptme/commit/e5f86d3dd))
 - feat: add auto-connect with retry logic and Tauri integration ([#70](https://github.com/gptme/gptme/issues/70)) ([`e417f265b`](https://github.com/gptme/gptme/commit/e417f265b))
 - feat: add comprehensive logging for browser and gptme-server output ([`20c7eb3e2`](https://github.com/gptme/gptme/commit/20c7eb3e2))
 - feat(wip): add agents and workspace list UI components ([`8855bf068`](https://github.com/gptme/gptme/commit/8855bf068))
 - feat: added support for conversation display names (separate id and name) ([#68](https://github.com/gptme/gptme/issues/68)) ([`ca4a097fa`](https://github.com/gptme/gptme/commit/ca4a097fa))
 - feat: added WelcomeView for cleaner conversation starts ([#56](https://github.com/gptme/gptme/issues/56)) ([`b60b00daf`](https://github.com/gptme/gptme/commit/b60b00daf))
 - feat: bundle gptme-server as a sidecar ([`7f3722234`](https://github.com/gptme/gptme/commit/7f3722234))
 - feat: add gptme submodule ([`f0d010204`](https://github.com/gptme/gptme/commit/f0d010204))
 - feat: run `npm i`on first run ([`a2e9e2fbf`](https://github.com/gptme/gptme/commit/a2e9e2fbf))
 - feat:add gptme logo ([`136e4b008`](https://github.com/gptme/gptme/commit/136e4b008))
 - feat: replace default frontend with gptme-webui ([`72ac75abe`](https://github.com/gptme/gptme/commit/72ac75abe))
 - feat:initial commit ([`f21cef66a`](https://github.com/gptme/gptme/commit/f21cef66a))
 - feat: added resizable sidebars, file type icons, menubar improvements ([#62](https://github.com/gptme/gptme/issues/62)) ([`45c50c1fa`](https://github.com/gptme/gptme/commit/45c50c1fa))
 - feat: added workspace file browser ([#59](https://github.com/gptme/gptme/issues/59)) ([`18ce81192`](https://github.com/gptme/gptme/commit/18ce81192))
 - feat: add button to delete conversations ([#55](https://github.com/gptme/gptme/issues/55)) ([`24751b07a`](https://github.com/gptme/gptme/commit/24751b07a))
 - feat: added browser to sidebar ([#54](https://github.com/gptme/gptme/issues/54)) ([`702311613`](https://github.com/gptme/gptme/commit/702311613))
 - feat: chat config panel, incl tools & MCP support ([#53](https://github.com/gptme/gptme/issues/53)) ([`fdfef2b58`](https://github.com/gptme/gptme/commit/fdfef2b58))
 - feat: add keyboard shortcuts and floating input styling ([`08d0ed177`](https://github.com/gptme/gptme/commit/08d0ed177))
 - feat: add back 'Thinking...' indicator until first token ([#52](https://github.com/gptme/gptme/issues/52)) ([`d849e6a9f`](https://github.com/gptme/gptme/commit/d849e6a9f))
 - feat: add back hasSession$ ([#47](https://github.com/gptme/gptme/issues/47)) ([`b555cfec9`](https://github.com/gptme/gptme/commit/b555cfec9))
 - feat: support multiple loaded/active conversations ([#42](https://github.com/gptme/gptme/issues/42)) ([`243d0781d`](https://github.com/gptme/gptme/commit/243d0781d))
 - feat: retry getting session id if not received ([#43](https://github.com/gptme/gptme/issues/43)) ([`5d60cd9a9`](https://github.com/gptme/gptme/commit/5d60cd9a9))
 - feat: add button to view rendered markdown blocks ([#40](https://github.com/gptme/gptme/issues/40)) ([`0be2013f5`](https://github.com/gptme/gptme/commit/0be2013f5))
 - feat: disable auto scrolling on scroll up ([#35](https://github.com/gptme/gptme/issues/35)) ([`976a1bdbb`](https://github.com/gptme/gptme/commit/976a1bdbb))
 - feat: streaming markdown parsing ([`38f8606b1`](https://github.com/gptme/gptme/commit/38f8606b1))
 - feat: improve API connection handling and security ([#34](https://github.com/gptme/gptme/issues/34)) ([`63a54b6e6`](https://github.com/gptme/gptme/commit/63a54b6e6))
 - feat: persist baseUrl and userToken in localstorage to enable refresh without having to re-click link ([`4fe43bfc0`](https://github.com/gptme/gptme/commit/4fe43bfc0))
 - feat: enter to confirm tooluse ([`e3cdfaeb0`](https://github.com/gptme/gptme/commit/e3cdfaeb0))
 - feat: a bunch of smaller enhancements ([#30](https://github.com/gptme/gptme/issues/30)) ([`8e6a31352`](https://github.com/gptme/gptme/commit/8e6a31352))
 - feat: rewrite chat rendering with LegendState ([#26](https://github.com/gptme/gptme/issues/26)) ([`b62861666`](https://github.com/gptme/gptme/commit/b62861666))
 - feat: wip rewrite for server api v2, including tool confirmations ([`f2b95173f`](https://github.com/gptme/gptme/commit/f2b95173f))
 - feat: added a message options dropdown for model and streaming selection ([#22](https://github.com/gptme/gptme/issues/22)) ([`d43201bc1`](https://github.com/gptme/gptme/commit/d43201bc1))
 - feat: support baseUrl and userToken via URL fragments ([#20](https://github.com/gptme/gptme/issues/20)) ([`0ee5984ca`](https://github.com/gptme/gptme/commit/0ee5984ca))
 - feat: added option to add header `Authorization` to the connect modal ([#17](https://github.com/gptme/gptme/issues/17)) ([`b80d6d1ee`](https://github.com/gptme/gptme/commit/b80d6d1ee))
 - feat: added support for attached images ([#14](https://github.com/gptme/gptme/issues/14)) ([`2e9a31664`](https://github.com/gptme/gptme/commit/2e9a31664))
 - feat: add dynamic page titles based on selected conversation ([`a57be6e68`](https://github.com/gptme/gptme/commit/a57be6e68))
 - feat: improve web UI instructions and code highlighting ([`e1b0b9193`](https://github.com/gptme/gptme/commit/e1b0b9193))
 - feat: automatically continue generating after tool use, as in cli ([`ebf2a4a8c`](https://github.com/gptme/gptme/commit/ebf2a4a8c))
 - feat: added support for computer use, improved styling, fixed bugs ([`74dd8f9ac`](https://github.com/gptme/gptme/commit/74dd8f9ac))
 - feat: get streaming working ([#2](https://github.com/gptme/gptme/issues/2)) ([`dfe655709`](https://github.com/gptme/gptme/commit/dfe655709))

### 🐛 Fixes (962)
<details><summary>Click to expand</summary>
<p>

 - fix(mcp): keep tool stdout off stdio transport ([#3182](https://github.com/gptme/gptme/issues/3182)) ([`fd29d2390`](https://github.com/gptme/gptme/commit/fd29d2390))
 - fix(test): skip real model loading in semantic unit tests ([#3177](https://github.com/gptme/gptme/issues/3177)) ([`6338a8f29`](https://github.com/gptme/gptme/commit/6338a8f29))
 - fix(release): use OIDC Trusted Publisher for gptme-acp PyPI publish ([#3173](https://github.com/gptme/gptme/issues/3173)) ([`21ba5b4d0`](https://github.com/gptme/gptme/commit/21ba5b4d0))
 - fix(test): add @pytest.mark.no_retry to test_multi_tool_per_message ([#3171](https://github.com/gptme/gptme/issues/3171)) ([`4167a4fc6`](https://github.com/gptme/gptme/commit/4167a4fc6))
 - fix(subagent): preserve workdir in subagent_reply() re-spawn ([#554](https://github.com/gptme/gptme/issues/554)) ([#3161](https://github.com/gptme/gptme/issues/3161)) ([`4a6f59dc1`](https://github.com/gptme/gptme/commit/4a6f59dc1))
 - fix(openrouter): update stale default models (llama-3.1 series deprecated) ([#3163](https://github.com/gptme/gptme/issues/3163)) ([`76c253354`](https://github.com/gptme/gptme/commit/76c253354))
 - fix(acp): add gptme_acp stub package so hatchling can build the shim wheel ([#3167](https://github.com/gptme/gptme/issues/3167)) ([`cdd71aa41`](https://github.com/gptme/gptme/commit/cdd71aa41))
 - fix(mypy): add warn_unused_ignores and remove 53 stale type: ignore comments ([#3154](https://github.com/gptme/gptme/issues/3154)) ([`0198f0590`](https://github.com/gptme/gptme/commit/0198f0590))
 - fix: reorder star button and message count indicator in ConversationItem to remove dead space (star button only visible on hover) ([`7d331b795`](https://github.com/gptme/gptme/commit/7d331b795))
 - fix(webui): stabilize WelcomeView autoFocus$ to prevent focus-steal on re-render ([#3155](https://github.com/gptme/gptme/issues/3155)) ([`4fd36a8ab`](https://github.com/gptme/gptme/commit/4fd36a8ab))
 - fix(config): cast providers to AoT to fix tomlkit type errors ([#3151](https://github.com/gptme/gptme/issues/3151)) ([`9b793120d`](https://github.com/gptme/gptme/commit/9b793120d))
 - fix(webui): show --cors-origin command in setup wizard for web users ([#3149](https://github.com/gptme/gptme/issues/3149)) ([`d9c3e148a`](https://github.com/gptme/gptme/commit/d9c3e148a))
 - fix(ci): harden docs deploy and PyInstaller apt setup ([#3144](https://github.com/gptme/gptme/issues/3144)) ([`8d7164b0d`](https://github.com/gptme/gptme/commit/8d7164b0d))
 - fix(computer): apply terminal startup delay fix to Docker container ([#216](https://github.com/gptme/gptme/issues/216)) ([#3133](https://github.com/gptme/gptme/issues/3133)) ([`2893cdf48`](https://github.com/gptme/gptme/commit/2893cdf48))
 - fix(computer): treat missing Playwright chromium binary as warning, not error ([#216](https://github.com/gptme/gptme/issues/216)) ([#3131](https://github.com/gptme/gptme/issues/3131)) ([`f0ed8713b`](https://github.com/gptme/gptme/commit/f0ed8713b))
 - fix(computer): treat playwright missing as warning, not hard failure ([#216](https://github.com/gptme/gptme/issues/216)) ([#3129](https://github.com/gptme/gptme/issues/3129)) ([`44da5d6cd`](https://github.com/gptme/gptme/commit/44da5d6cd))
 - fix(info): fall back to pyproject.toml when editable install omits Provides-Extra ([#216](https://github.com/gptme/gptme/issues/216)) ([#3128](https://github.com/gptme/gptme/issues/3128)) ([`27b954094`](https://github.com/gptme/gptme/commit/27b954094))
 - fix(computer): classify new browser functions in risk/audit system ([#216](https://github.com/gptme/gptme/issues/216)) ([#3123](https://github.com/gptme/gptme/issues/3123)) ([`7aa01574c`](https://github.com/gptme/gptme/commit/7aa01574c))
 - fix(computer): auto-detect native transport in latency diagnostic ([#216](https://github.com/gptme/gptme/issues/216)) ([#3117](https://github.com/gptme/gptme/issues/3117)) ([`e876924ab`](https://github.com/gptme/gptme/commit/e876924ab))
 - fix(subagent): add +complete to subprocess mode tool list ([#3116](https://github.com/gptme/gptme/issues/3116)) ([`945af647d`](https://github.com/gptme/gptme/commit/945af647d))
 - fix(subagent): apply output_schema parsing in subagent_wait() ([#554](https://github.com/gptme/gptme/issues/554)) ([#3114](https://github.com/gptme/gptme/issues/3114)) ([`68a9af0b2`](https://github.com/gptme/gptme/commit/68a9af0b2))
 - fix(webui): wait for artifact preview in tests ([#3113](https://github.com/gptme/gptme/issues/3113)) ([`dec292ceb`](https://github.com/gptme/gptme/commit/dec292ceb))
 - fix(webui): connect server after auth-code exchange + lazy cloud env vars ([#3111](https://github.com/gptme/gptme/issues/3111)) ([`258e69277`](https://github.com/gptme/gptme/commit/258e69277))
 - fix(computer): lower screen-change threshold 1% → 0.2% and fix xvfb teardown ([#216](https://github.com/gptme/gptme/issues/216)) ([#3109](https://github.com/gptme/gptme/issues/3109)) ([`c2440ccdd`](https://github.com/gptme/gptme/commit/c2440ccdd))
 - fix(subagent): delete worktree branch on cleanup ([#554](https://github.com/gptme/gptme/issues/554)) ([#3106](https://github.com/gptme/gptme/issues/3106)) ([`527b19be2`](https://github.com/gptme/gptme/commit/527b19be2))
 - fix(browser): drop unreachable label= fallback in select_option ([#3103](https://github.com/gptme/gptme/issues/3103)) ([`28a5139b8`](https://github.com/gptme/gptme/commit/28a5139b8))
 - fix(subagent): isolate thread tool list via clear_tools() at entry ([#554](https://github.com/gptme/gptme/issues/554)) ([#3102](https://github.com/gptme/gptme/issues/3102)) ([`94aae12a5`](https://github.com/gptme/gptme/commit/94aae12a5))
 - fix(subagent): report unfinished thread agents as "timeout" in wait_all() ([`4f89a57da`](https://github.com/gptme/gptme/commit/4f89a57da))
 - fix(computer): microsecond screenshot timestamps + robust test timing ([#3092](https://github.com/gptme/gptme/issues/3092)) ([`30400bd0e`](https://github.com/gptme/gptme/commit/30400bd0e))
 - fix(subagent): fix eval checks and subagent_wait_basic test ([#554](https://github.com/gptme/gptme/issues/554)) ([#3087](https://github.com/gptme/gptme/issues/3087)) ([`9a328b67f`](https://github.com/gptme/gptme/commit/9a328b67f))
 - fix(util): add missing f-prefix in epoch_to_age incl_date branch ([#3080](https://github.com/gptme/gptme/issues/3080)) ([`b601eaa87`](https://github.com/gptme/gptme/commit/b601eaa87))
 - fix(chats): discover cursor-chat-history.json even when conversations/ dir absent ([#3077](https://github.com/gptme/gptme/issues/3077)) ([`437c3cfb2`](https://github.com/gptme/gptme/commit/437c3cfb2))
 - fix(subagent): close watchdog wait race ([#3074](https://github.com/gptme/gptme/issues/3074)) ([`e40bcefdc`](https://github.com/gptme/gptme/commit/e40bcefdc))
 - fix(tools): always pair structured tool_use with a tool_result ([#554](https://github.com/gptme/gptme/issues/554)) ([`33d25418b`](https://github.com/gptme/gptme/commit/33d25418b))
 - fix(computer): add settle_time to _poll_for_change to handle multi-phase UI transitions ([#216](https://github.com/gptme/gptme/issues/216)) ([#3065](https://github.com/gptme/gptme/issues/3065)) ([`345f70c11`](https://github.com/gptme/gptme/commit/345f70c11))
 - fix(ci): harden Build workflow against broken Ubuntu apt sources ([#3066](https://github.com/gptme/gptme/issues/3066)) ([`2bb45ad99`](https://github.com/gptme/gptme/commit/2bb45ad99))
 - fix(computer): capture pre-action baseline in act_and_observe to detect immediate changes ([#216](https://github.com/gptme/gptme/issues/216)) ([#3064](https://github.com/gptme/gptme/issues/3064)) ([`5761a5d34`](https://github.com/gptme/gptme/commit/5761a5d34))
 - fix(computer): derive VNC hostname from page origin in computer.html ([#216](https://github.com/gptme/gptme/issues/216)) ([#3054](https://github.com/gptme/gptme/issues/3054)) ([`013a7588a`](https://github.com/gptme/gptme/commit/013a7588a))
 - fix(computer): detect macOS display scale via AppKit/system_profiler ([#216](https://github.com/gptme/gptme/issues/216)) ([#3047](https://github.com/gptme/gptme/issues/3047)) ([`994a362ad`](https://github.com/gptme/gptme/commit/994a362ad))
 - fix(computer): doctor checks for WM + pyatspi; profile guidance for window_focus delay ([#216](https://github.com/gptme/gptme/issues/216)) ([#3046](https://github.com/gptme/gptme/issues/3046)) ([`a42b5d38f`](https://github.com/gptme/gptme/commit/a42b5d38f))
 - fix(computer): surface observe_web failures as actionable error messages ([#216](https://github.com/gptme/gptme/issues/216)) ([#3039](https://github.com/gptme/gptme/issues/3039)) ([`a9d0b47c0`](https://github.com/gptme/gptme/commit/a9d0b47c0))
 - fix(computer): add browser tool to Docker server for structured-first web interaction ([`921040881`](https://github.com/gptme/gptme/commit/921040881))
 - fix(server): reject unknown fields in PUT /api/v2/tasks/{id} to prevent silent no-ops ([#3032](https://github.com/gptme/gptme/issues/3032)) ([`631d910fa`](https://github.com/gptme/gptme/commit/631d910fa))
 - fix(computer): restore Docker build with lockfile-backed install ([#216](https://github.com/gptme/gptme/issues/216)) ([#3029](https://github.com/gptme/gptme/issues/3029)) ([`b58ec3766`](https://github.com/gptme/gptme/commit/b58ec3766))
 - fix(eval): make subagent eval expect/check_log checks picklable ([#3025](https://github.com/gptme/gptme/issues/3025)) ([`54e038f84`](https://github.com/gptme/gptme/commit/54e038f84))
 - fix(eval): harden computer-use eval suite flagged at Greptile 3/5 on [#3020](https://github.com/gptme/gptme/issues/3020) ([#3026](https://github.com/gptme/gptme/issues/3026)) ([`4272c0d1e`](https://github.com/gptme/gptme/commit/4272c0d1e))
 - fix(cli): re-raise ClickException before catch-all so UsageError exits 2 ([#3016](https://github.com/gptme/gptme/issues/3016)) ([`818ae0b59`](https://github.com/gptme/gptme/commit/818ae0b59))
 - fix(webui): guard provider-health and user-settings hooks on isConnected ([`ad823b6c9`](https://github.com/gptme/gptme/commit/ad823b6c9))
 - fix(computer): register observe_web/observe_desktop as ToolFunctions + handle list[Message] in ipython ([#3014](https://github.com/gptme/gptme/issues/3014)) ([`00c52fc7f`](https://github.com/gptme/gptme/commit/00c52fc7f))
 - fix(test): use infinite iterator for monotonic mock to avoid StopIteration ([#3013](https://github.com/gptme/gptme/issues/3013)) ([`eae44dc72`](https://github.com/gptme/gptme/commit/eae44dc72))
 - fix(computer): adaptive wait_for_change polling + EWMH WM readiness check ([#3005](https://github.com/gptme/gptme/issues/3005)) ([`85285e801`](https://github.com/gptme/gptme/commit/85285e801))
 - fix(computer): add shell+vision to Docker server, Xvfb liveness check in doctor ([#3004](https://github.com/gptme/gptme/issues/3004)) ([`f07b8cf6b`](https://github.com/gptme/gptme/commit/f07b8cf6b))
 - fix(server): only reject message-delete that creates a NEW role adjacency ([#2997](https://github.com/gptme/gptme/issues/2997)) ([`36c5237ff`](https://github.com/gptme/gptme/commit/36c5237ff))
 - fix(webui): avatar alignment + standard-markdown previews (closes [#2998](https://github.com/gptme/gptme/issues/2998)) ([#2999](https://github.com/gptme/gptme/issues/2999)) ([`4436f54fc`](https://github.com/gptme/gptme/commit/4436f54fc))
 - fix(util): tokens count rejects valid provider-prefixed models ([#2992](https://github.com/gptme/gptme/issues/2992)) ([`f3bdf806f`](https://github.com/gptme/gptme/commit/f3bdf806f))
 - fix(lessons): always log dropout record when epsilon>0, even if no lessons withheld ([#2990](https://github.com/gptme/gptme/issues/2990)) ([`7061f0bbc`](https://github.com/gptme/gptme/commit/7061f0bbc))
 - fix(webui): fix fork_command placeholder in Create Agent dialog ([#2991](https://github.com/gptme/gptme/issues/2991)) ([`c8d8715ac`](https://github.com/gptme/gptme/commit/c8d8715ac))
 - fix(openai): embed reasoning content in non-streaming response instead of dropping it ([#2985](https://github.com/gptme/gptme/issues/2985)) ([`66b48256b`](https://github.com/gptme/gptme/commit/66b48256b))
 - fix: demote reasoning content logging from INFO to DEBUG ([#2981](https://github.com/gptme/gptme/issues/2981)) ([`63c659234`](https://github.com/gptme/gptme/commit/63c659234))
 - fix(rag): register tools-list context hook with dot notation ([#2980](https://github.com/gptme/gptme/issues/2980)) ([`44f842640`](https://github.com/gptme/gptme/commit/44f842640))
 - fix(subagent): correct context_window=N truncation (off-by-one in n_base) ([#2977](https://github.com/gptme/gptme/issues/2977)) ([`b7254c271`](https://github.com/gptme/gptme/commit/b7254c271))
 - fix(config): strip unknown top-level keys from config file on load ([#2974](https://github.com/gptme/gptme/issues/2974)) ([`0da7af251`](https://github.com/gptme/gptme/commit/0da7af251))
 - fix(shell): only show workspace-detected hint once per workspace ([#2973](https://github.com/gptme/gptme/issues/2973)) ([`d5f0ca312`](https://github.com/gptme/gptme/commit/d5f0ca312))
 - fix(server): return 400 on config-file PATCH with non-table traversal ([#2970](https://github.com/gptme/gptme/issues/2970)) ([`b3be71cc9`](https://github.com/gptme/gptme/commit/b3be71cc9))
 - fix(subagent): make redact_secrets=True the default (secure by default) ([#2963](https://github.com/gptme/gptme/issues/2963)) ([`34177187c`](https://github.com/gptme/gptme/commit/34177187c))
 - fix(server): return 400 not 500 for unknown chat config keys ([#2962](https://github.com/gptme/gptme/issues/2962)) ([`a3648ce82`](https://github.com/gptme/gptme/commit/a3648ce82))
 - fix(config): tolerate PermissionError in ChatConfig.from_logdir workspace mkdir ([#2959](https://github.com/gptme/gptme/issues/2959)) ([`9fc58a224`](https://github.com/gptme/gptme/commit/9fc58a224))
 - fix(tests): mock thread creation in test_subagent_status_returns_dict ([#2957](https://github.com/gptme/gptme/issues/2957)) ([`c4ba4bb4f`](https://github.com/gptme/gptme/commit/c4ba4bb4f))
 - fix(server): prevent external-sessions endpoint from hanging on large session catalogs ([#2953](https://github.com/gptme/gptme/issues/2953)) ([`833ad614e`](https://github.com/gptme/gptme/commit/833ad614e))
 - fix(cli): make tokens count --file - read from stdin ([#2951](https://github.com/gptme/gptme/issues/2951)) ([`7778caa3f`](https://github.com/gptme/gptme/commit/7778caa3f))
 - fix(tools): normalize bare callables in ToolSpec.functions (server won't start with plugins) ([#2946](https://github.com/gptme/gptme/issues/2946)) ([`287e1cefa`](https://github.com/gptme/gptme/commit/287e1cefa))
 - fix(webui): code-block rendering improvements + emoji additions + star move ([#2945](https://github.com/gptme/gptme/issues/2945)) ([`7a76048c6`](https://github.com/gptme/gptme/commit/7a76048c6))
 - fix(cli): validate model provider early, before context_cmd runs ([#2941](https://github.com/gptme/gptme/issues/2941)) ([`133cfaec2`](https://github.com/gptme/gptme/commit/133cfaec2))
 - fix(server): enforce workspace containment at config PUT/PATCH boundary ([#2943](https://github.com/gptme/gptme/issues/2943)) ([`b0f5f3adb`](https://github.com/gptme/gptme/commit/b0f5f3adb))
 - fix(server): preserve 'files' field in PUT /api/v2/conversations/:id messages ([#2942](https://github.com/gptme/gptme/issues/2942)) ([`d3331d5d0`](https://github.com/gptme/gptme/commit/d3331d5d0))
 - fix(test): use json.dumps for valid JSON in kimi_k2 test ([#2936](https://github.com/gptme/gptme/issues/2936)) ([`83dbacff2`](https://github.com/gptme/gptme/commit/83dbacff2))
 - fix(webui): extract ConversationItem to module level ([#2935](https://github.com/gptme/gptme/issues/2935)) ([`3d104c1d2`](https://github.com/gptme/gptme/commit/3d104c1d2))
 - fix(server): accept --tools none to disable all tools ([#2931](https://github.com/gptme/gptme/issues/2931)) ([`b7ac9649c`](https://github.com/gptme/gptme/commit/b7ac9649c))
 - fix(webui): avoid sidebar log scans ([#2924](https://github.com/gptme/gptme/issues/2924)) ([`e94bf2c0e`](https://github.com/gptme/gptme/commit/e94bf2c0e))
 - fix(webui): skip hosted loopback probe for first-time users ([#2922](https://github.com/gptme/gptme/issues/2922)) ([`f1bf1d472`](https://github.com/gptme/gptme/commit/f1bf1d472))
 - fix(webui): tolerate legacy non-paginated conversations response ([#2916](https://github.com/gptme/gptme/issues/2916)) ([#2917](https://github.com/gptme/gptme/issues/2917)) ([`32694bc4b`](https://github.com/gptme/gptme/commit/32694bc4b))
 - fix(server): handle OSError in workspace API endpoints (ENAMETOOLONG crash) ([#2915](https://github.com/gptme/gptme/issues/2915)) ([`4ac4eeb26`](https://github.com/gptme/gptme/commit/4ac4eeb26))
 - fix(webui/demo): skip provider health + user settings fetches in demo mode ([#2905](https://github.com/gptme/gptme/issues/2905)) ([`419fb23d0`](https://github.com/gptme/gptme/commit/419fb23d0))
 - fix(llm): invalidate gptme gateway client on reinit ([#2876](https://github.com/gptme/gptme/issues/2876) follow-up) ([#2888](https://github.com/gptme/gptme/issues/2888)) ([`ab634d581`](https://github.com/gptme/gptme/commit/ab634d581))
 - fix(webui): collapse single hook system messages in chat view ([#2879](https://github.com/gptme/gptme/issues/2879)) ([`18469440c`](https://github.com/gptme/gptme/commit/18469440c))
 - fix(server): return 400 for non-positive limit in conversations API ([#2877](https://github.com/gptme/gptme/issues/2877)) ([`78f0c0583`](https://github.com/gptme/gptme/commit/78f0c0583))
 - fix(server): tolerate pre-existing workspace symlink in ChatConfig.from_logdir ([#2874](https://github.com/gptme/gptme/issues/2874)) ([`94d0c16c3`](https://github.com/gptme/gptme/commit/94d0c16c3))
 - fix(server): improve model validation error messages with examples ([#2873](https://github.com/gptme/gptme/issues/2873)) ([`53555a994`](https://github.com/gptme/gptme/commit/53555a994))
 - fix(models): validate provider default model entries + update groq default ([#2871](https://github.com/gptme/gptme/issues/2871)) ([`b17c96066`](https://github.com/gptme/gptme/commit/b17c96066))
 - fix(server): validate model type in config PATCH to prevent 500 ([#2868](https://github.com/gptme/gptme/issues/2868)) ([`4398aedeb`](https://github.com/gptme/gptme/commit/4398aedeb))
 - fix: two startup hangs — skip OpenRouter fetch for bare model names, non-blocking piped stdin ([#2867](https://github.com/gptme/gptme/issues/2867)) ([`8789034ef`](https://github.com/gptme/gptme/commit/8789034ef))
 - fix(server): preserve messages field on cached conversation list responses ([#2859](https://github.com/gptme/gptme/issues/2859)) ([`9e381a4bf`](https://github.com/gptme/gptme/commit/9e381a4bf))
 - fix(server): scope conversations cache to active logs dir ([#2856](https://github.com/gptme/gptme/issues/2856)) ([`f5102088e`](https://github.com/gptme/gptme/commit/f5102088e))
 - fix(webui): reduce redundant conversations API calls on page load ([#2857](https://github.com/gptme/gptme/issues/2857)) ([`f0bb73e62`](https://github.com/gptme/gptme/commit/f0bb73e62))
 - fix(webui): add semantic landmarks, aria-current, and aria-selected for keyboard navigation ([#2849](https://github.com/gptme/gptme/issues/2849)) ([`0306c23a0`](https://github.com/gptme/gptme/commit/0306c23a0))
 - fix(complete): auto-reply kill-switch now detects both auto-reply variants ([#2846](https://github.com/gptme/gptme/issues/2846)) ([`4c1f19ed1`](https://github.com/gptme/gptme/commit/4c1f19ed1))
 - fix(webui): add Escape-to-navigate-back for full-page settings view ([#2845](https://github.com/gptme/gptme/issues/2845)) ([`368ffc9d2`](https://github.com/gptme/gptme/commit/368ffc9d2))
 - fix(webui): update ConversationList test to handle highlighted search terms ([#2835](https://github.com/gptme/gptme/issues/2835)) ([`0e689c178`](https://github.com/gptme/gptme/commit/0e689c178))
 - fix(cloud): parse max_completion_tokens for gptme provider models ([#2826](https://github.com/gptme/gptme/issues/2826)) ([`254c7136e`](https://github.com/gptme/gptme/commit/254c7136e))
 - fix(webui): make clickable selection rows keyboard-accessible ([#2829](https://github.com/gptme/gptme/issues/2829)) ([`09c20db4b`](https://github.com/gptme/gptme/commit/09c20db4b))
 - fix(cloud): route LLM API calls to Supabase edge functions, not fleet.gptme.ai ([#2820](https://github.com/gptme/gptme/issues/2820)) ([`f70206540`](https://github.com/gptme/gptme/commit/f70206540))
 - fix(webui): make Escape key and interrupt logs consistent with isBusy ([`b703f8931`](https://github.com/gptme/gptme/commit/b703f8931))
 - fix(server): graceful shutdown on SIGTERM ([#2821](https://github.com/gptme/gptme/issues/2821)) ([`1d02a613c`](https://github.com/gptme/gptme/commit/1d02a613c))
 - fix(tools): report unavailable tools accurately instead of 'invalid choice' ([#2809](https://github.com/gptme/gptme/issues/2809)) ([`a4b310976`](https://github.com/gptme/gptme/commit/a4b310976))
 - fix(hooks): hide injected agent-instructions from conversation view ([#2807](https://github.com/gptme/gptme/issues/2807)) ([`ec2dbdb24`](https://github.com/gptme/gptme/commit/ec2dbdb24))
 - fix(webui): don't flush queued messages during tool confirmation ([#2808](https://github.com/gptme/gptme/issues/2808)) ([`dd8b1a124`](https://github.com/gptme/gptme/commit/dd8b1a124))
 - fix(webui): sync model selector when switching conversations ([#2804](https://github.com/gptme/gptme/issues/2804)) ([`9319f63d4`](https://github.com/gptme/gptme/commit/9319f63d4))
 - fix(cli): reject malformed model paths ([#2798](https://github.com/gptme/gptme/issues/2798)) ([`9d4e7d70c`](https://github.com/gptme/gptme/commit/9d4e7d70c))
 - fix(server): validate edited message file paths ([#2762](https://github.com/gptme/gptme/issues/2762)) ([`3ab1b592a`](https://github.com/gptme/gptme/commit/3ab1b592a))
 - fix(webui): UI polish (input radius, code blocks, avatar, health badge) ([#2802](https://github.com/gptme/gptme/issues/2802)) ([`a73e71053`](https://github.com/gptme/gptme/commit/a73e71053))
 - fix: conversation load crash chain (server symlink 500 + webui dataless crash + error surfacing) ([#2800](https://github.com/gptme/gptme/issues/2800)) ([`42dc02f8d`](https://github.com/gptme/gptme/commit/42dc02f8d))
 - fix(webui): request fast conversation list detail ([#2796](https://github.com/gptme/gptme/issues/2796)) ([`1be7efa74`](https://github.com/gptme/gptme/commit/1be7efa74))
 - fix(plugins): recurse nested src-layout tool packages ([#2793](https://github.com/gptme/gptme/issues/2793)) ([`97a37bec2`](https://github.com/gptme/gptme/commit/97a37bec2))
 - fix(ci): pin self-heal logs to triggering attempt ([#2777](https://github.com/gptme/gptme/issues/2777)) ([`675b1d71b`](https://github.com/gptme/gptme/commit/675b1d71b))
 - fix(browser): use tabs instead of new windows for CDP connections ([#2723](https://github.com/gptme/gptme/issues/2723)) ([`1b0b9c5a9`](https://github.com/gptme/gptme/commit/1b0b9c5a9))
 - fix: clear normal_display_buffer on `<think>` tag detection to prevent double output ([`b1bac08e0`](https://github.com/gptme/gptme/commit/b1bac08e0))
 - fix(server): reject whitespace elicitation ids ([`0736a78f0`](https://github.com/gptme/gptme/commit/0736a78f0))
 - fix(shell): preserve indentation on first line of command output ([#2767](https://github.com/gptme/gptme/issues/2767)) ([`666285e32`](https://github.com/gptme/gptme/commit/666285e32))
 - fix(webui): trigger placeholder chat initial step ([#2768](https://github.com/gptme/gptme/issues/2768)) ([`273034842`](https://github.com/gptme/gptme/commit/273034842))
 - fix(webui): improve chat composer mobile ergonomics ([#2764](https://github.com/gptme/gptme/issues/2764)) ([`d57fabc0b`](https://github.com/gptme/gptme/commit/d57fabc0b))
 - fix(util): reject empty batch model override ([`a9d287188`](https://github.com/gptme/gptme/commit/a9d287188))
 - fix(webui): Jest ESM import crash from ansi-regex v6 ([#2761](https://github.com/gptme/gptme/issues/2761)) ([`15bd38319`](https://github.com/gptme/gptme/commit/15bd38319))
 - fix: model-aware temperature and top_p for gpt-5 and moonshot ([`f0564fd4a`](https://github.com/gptme/gptme/commit/f0564fd4a))
 - fix(complete): nudge interactive+no_confirm (-y) mode on think-only responses ([`d9c4157ec`](https://github.com/gptme/gptme/commit/d9c4157ec))
 - fix(webui): keep demo mode out of setup probes ([#2746](https://github.com/gptme/gptme/issues/2746)) ([`a6527cadb`](https://github.com/gptme/gptme/commit/a6527cadb))
 - fix(reduce): drop orphaned tool results in limit_log when tool-use is dropped ([`4bea903d6`](https://github.com/gptme/gptme/commit/4bea903d6))
 - fix(eval): normalize model key in pass-rate gate to handle router prefixes ([`13b4f1060`](https://github.com/gptme/gptme/commit/13b4f1060))
 - fix(tests): add assertions to three no-op test functions in server bad-input suite ([#2738](https://github.com/gptme/gptme/issues/2738)) ([`9f7c2a185`](https://github.com/gptme/gptme/commit/9f7c2a185))
 - fix(server): return JSON instead of HTML for HTTP errors (404, 405, etc.) ([#2740](https://github.com/gptme/gptme/issues/2740)) ([`50fb21abc`](https://github.com/gptme/gptme/commit/50fb21abc))
 - fix(webui): restore direct-link fallbacks for admin and health ([#2742](https://github.com/gptme/gptme/issues/2742)) ([`dce35372e`](https://github.com/gptme/gptme/commit/dce35372e))
 - fix(webui): add baseline security headers to Cloudflare Pages _headers ([#2744](https://github.com/gptme/gptme/issues/2744)) ([`2840c9fde`](https://github.com/gptme/gptme/commit/2840c9fde))
 - fix(server): batch SSE generation_progress events and fire generation_complete early ([#2730](https://github.com/gptme/gptme/issues/2730)) ([`5be5f1fc1`](https://github.com/gptme/gptme/commit/5be5f1fc1))
 - fix(tests): update bad-input test expectations for correct error codes ([#2729](https://github.com/gptme/gptme/issues/2729)) ([`385ad0611`](https://github.com/gptme/gptme/commit/385ad0611))
 - fix(webui): polyfill structuredClone in jest.setup for jsdom ([#2690](https://github.com/gptme/gptme/issues/2690)) ([`23a658e36`](https://github.com/gptme/gptme/commit/23a658e36))
 - fix(config): validate temperature/top_p/max_tokens types in ChatConfig.from_dict ([#2737](https://github.com/gptme/gptme/issues/2737)) ([`b5da92408`](https://github.com/gptme/gptme/commit/b5da92408))
 - fix(cli): bare model name without provider gives misleading error ([#2734](https://github.com/gptme/gptme/issues/2734)) ([`340efcf66`](https://github.com/gptme/gptme/commit/340efcf66))
 - fix(cli): guard against empty --name value bypassing ParamType validation ([#2732](https://github.com/gptme/gptme/issues/2732)) ([`f21f3c73b`](https://github.com/gptme/gptme/commit/f21f3c73b))
 - fix(cli): promote no-tool auto-reply logging from info to warning level ([#2736](https://github.com/gptme/gptme/issues/2736)) ([`3c7038529`](https://github.com/gptme/gptme/commit/3c7038529))
 - fix(logmanager): stop auto-pruning thinking blocks ([#2727](https://github.com/gptme/gptme/issues/2727)) ([`5106fa6de`](https://github.com/gptme/gptme/commit/5106fa6de))
 - fix: suppress RequestsDependencyWarning globally ([#2728](https://github.com/gptme/gptme/issues/2728)) ([`35613fcc5`](https://github.com/gptme/gptme/commit/35613fcc5))
 - fix(webui): preserve demo query across chat navigation ([#2722](https://github.com/gptme/gptme/issues/2722)) ([`48fae73a7`](https://github.com/gptme/gptme/commit/48fae73a7))
 - fix(cli): use interactive flag instead of raw isatty() for stderr routing ([#2719](https://github.com/gptme/gptme/issues/2719)) ([`14625ae02`](https://github.com/gptme/gptme/commit/14625ae02))
 - fix(cost): drain stream after tool break to capture message_delta usage ([#2720](https://github.com/gptme/gptme/issues/2720)) ([`69a373377`](https://github.com/gptme/gptme/commit/69a373377))
 - fix(logs): demote reasoning_budget and auto-naming retry logs to debug ([#2715](https://github.com/gptme/gptme/issues/2715)) ([`03f405a6a`](https://github.com/gptme/gptme/commit/03f405a6a))
 - fix(llm): buffer thinking-block display to prevent think-sig terminal wrapping ([#2704](https://github.com/gptme/gptme/issues/2704)) ([`54b77b123`](https://github.com/gptme/gptme/commit/54b77b123))
 - fix(logs): suppress multiline think-sig; capture usage when stream broken early ([#2703](https://github.com/gptme/gptme/issues/2703)) ([`c95e73cb4`](https://github.com/gptme/gptme/commit/c95e73cb4))
 - fix(cost): fix request_count inflation and redundant total display ([#2702](https://github.com/gptme/gptme/issues/2702)) ([`58eff1f3e`](https://github.com/gptme/gptme/commit/58eff1f3e))
 - fix(server): load conversations from validated logdir ([#2696](https://github.com/gptme/gptme/issues/2696)) ([`760c74291`](https://github.com/gptme/gptme/commit/760c74291))
 - fix(logs): suppress think-sig in streaming; restore CLI workspace default ([`ee17a7dca`](https://github.com/gptme/gptme/commit/ee17a7dca))
 - fix(webui): encode chat route conversation ids ([#2699](https://github.com/gptme/gptme/issues/2699)) ([`0753abe19`](https://github.com/gptme/gptme/commit/0753abe19))
 - fix(logs): quiet normal runtime noise ([`25a2f1fc5`](https://github.com/gptme/gptme/commit/25a2f1fc5))
 - fix(server): reject path traversal in file attachments via API ([`4d487bba3`](https://github.com/gptme/gptme/commit/4d487bba3))
 - fix(cli): catch empty --model at parse time instead of blocking startup ([#2692](https://github.com/gptme/gptme/issues/2692)) ([`f93cccf26`](https://github.com/gptme/gptme/commit/f93cccf26))
 - fix(self-heal): handle invalid ANTHROPIC_API_KEY gracefully ([#2693](https://github.com/gptme/gptme/issues/2693)) ([`42cdec9ed`](https://github.com/gptme/gptme/commit/42cdec9ed))
 - fix(webui): replace structuredClone with JSON.parse/stringify for jsdom compat ([#2691](https://github.com/gptme/gptme/issues/2691)) ([`6340324ed`](https://github.com/gptme/gptme/commit/6340324ed))
 - fix(webui): add missing getServerHealth to demo ApiClient ([`4b8abfdb7`](https://github.com/gptme/gptme/commit/4b8abfdb7))
 - fix(webui): add missing getServerHealth to demoApiClient ([#2685](https://github.com/gptme/gptme/issues/2685)) ([`c5078b037`](https://github.com/gptme/gptme/commit/c5078b037))
 - fix(webui): improve history accessibility ([#2670](https://github.com/gptme/gptme/issues/2670)) ([`a374f26ae`](https://github.com/gptme/gptme/commit/a374f26ae))
 - fix(release): verify artifact build workflows actually started ([#2648](https://github.com/gptme/gptme/issues/2648)) ([`a23951230`](https://github.com/gptme/gptme/commit/a23951230))
 - fix(release): vendor build_changelog.py, add dry-run PyPI publish validation ([#2644](https://github.com/gptme/gptme/issues/2644)) ([`c77843321`](https://github.com/gptme/gptme/commit/c77843321))
 - fix(cli): clearer error when calling execute-only tools via 'tools call' ([#2642](https://github.com/gptme/gptme/issues/2642)) ([`5ec49f43e`](https://github.com/gptme/gptme/commit/5ec49f43e))
 - fix(server): emit Access-Control-Allow-Private-Network on CORS preflight ([#2635](https://github.com/gptme/gptme/issues/2635)) ([`5031b54e3`](https://github.com/gptme/gptme/commit/5031b54e3))
 - fix(server): strip whitespace from session_id before emptiness check ([`de2447956`](https://github.com/gptme/gptme/commit/de2447956))
 - fix(webui): handle cloud auth postMessage handoff from popup ([#2624](https://github.com/gptme/gptme/issues/2624)) ([`2746a6978`](https://github.com/gptme/gptme/commit/2746a6978))
 - fix(util-cli): reject empty --model in llm generate ([#2628](https://github.com/gptme/gptme/issues/2628)) ([`785d76aba`](https://github.com/gptme/gptme/commit/785d76aba))
 - fix(test): use CliRunner instead of subprocess in TestModelsInfo to prevent CI timeouts ([`fbfb2c235`](https://github.com/gptme/gptme/commit/fbfb2c235))
 - fix(computer): handle missing/timed-out ImageMagick convert in screenshot resize ([#2625](https://github.com/gptme/gptme/issues/2625)) ([`111e178b0`](https://github.com/gptme/gptme/commit/111e178b0))
 - fix(webui): tag loopback requests correctly ([#2623](https://github.com/gptme/gptme/issues/2623)) ([`4dc83cb28`](https://github.com/gptme/gptme/commit/4dc83cb28))
 - fix(server): avoid full JSONL scan in agents listing endpoint ([#2619](https://github.com/gptme/gptme/issues/2619)) ([`3b11cd751`](https://github.com/gptme/gptme/commit/3b11cd751))
 - fix(webui): hint when hosted chat hits loopback without CORS ([#2615](https://github.com/gptme/gptme/issues/2615)) ([`89eb8e903`](https://github.com/gptme/gptme/commit/89eb8e903))
 - fix(webui): refresh stale fallback model to claude-sonnet-4-6 ([#2610](https://github.com/gptme/gptme/issues/2610)) ([`dd67a2a93`](https://github.com/gptme/gptme/commit/dd67a2a93))
 - fix(webui): cross-tab sync for server registry after cloud sign-in ([`6c58d6bc9`](https://github.com/gptme/gptme/commit/6c58d6bc9))
 - fix(server): validate stream and tool-confirm action inputs ([#2608](https://github.com/gptme/gptme/issues/2608)) ([`322c893d8`](https://github.com/gptme/gptme/commit/322c893d8))
 - fix(cli): suppress resume hint after fatal exit ([#2607](https://github.com/gptme/gptme/issues/2607)) ([`4a0c25287`](https://github.com/gptme/gptme/commit/4a0c25287))
 - fix(autocompact): preserve tool-call messages ([#2606](https://github.com/gptme/gptme/issues/2606)) ([`df7533d7f`](https://github.com/gptme/gptme/commit/df7533d7f))
 - fix(llm): stop tool-format streams without newline ([#2605](https://github.com/gptme/gptme/issues/2605)) ([`0c1f47359`](https://github.com/gptme/gptme/commit/0c1f47359))
 - fix(install): error on missing TTY instead of silently assuming yes ([#2600](https://github.com/gptme/gptme/issues/2600)) ([`22c26d473`](https://github.com/gptme/gptme/commit/22c26d473))
 - fix(server): validate config patch tool allowlist ([#2597](https://github.com/gptme/gptme/issues/2597)) ([`e385e622b`](https://github.com/gptme/gptme/commit/e385e622b))
 - fix(cli): reject shell-hostile conversation names ([#2596](https://github.com/gptme/gptme/issues/2596)) ([`386cb3bac`](https://github.com/gptme/gptme/commit/386cb3bac))
 - fix(server): validate tools field type before calling init_tools ([#2595](https://github.com/gptme/gptme/issues/2595)) ([`3d6b4ee95`](https://github.com/gptme/gptme/commit/3d6b4ee95))
 - fix(cli): expand tilde in --workspace paths ([`ef9297a28`](https://github.com/gptme/gptme/commit/ef9297a28))
 - fix(hooks): never crash gptme-util hooks run on malformed CC event JSON ([#2591](https://github.com/gptme/gptme/issues/2591)) ([`c2913a033`](https://github.com/gptme/gptme/commit/c2913a033))
 - fix(server): block /edit command in server mode ([#2590](https://github.com/gptme/gptme/issues/2590)) ([`a55f46010`](https://github.com/gptme/gptme/commit/a55f46010))
 - fix(cli): reject whitespace-only conversation names ([`fb904f796`](https://github.com/gptme/gptme/commit/fb904f796))
 - fix(server): return 'Branch not found' when POST targets a non-existent branch ([#2587](https://github.com/gptme/gptme/issues/2587)) ([`9ccc02c64`](https://github.com/gptme/gptme/commit/9ccc02c64))
 - fix(cli): strip whitespace from prompts before empty check ([#2584](https://github.com/gptme/gptme/issues/2584)) ([`c61294aed`](https://github.com/gptme/gptme/commit/c61294aed))
 - fix(server): reject non-string transcript call_sid ([#2583](https://github.com/gptme/gptme/issues/2583)) ([`ab112b6f4`](https://github.com/gptme/gptme/commit/ab112b6f4))
 - fix(server): propagate ContextVars into background threads ([#2582](https://github.com/gptme/gptme/issues/2582)) ([`347ad1695`](https://github.com/gptme/gptme/commit/347ad1695))
 - fix: improvements to `gptme-util chats read/search` ([#437](https://github.com/gptme/gptme/issues/437)) ([`d5b19ba50`](https://github.com/gptme/gptme/commit/d5b19ba50))
 - fix(server): reject whitespace-only upload filenames; return 404 for nonexistent workspace subpaths ([#2581](https://github.com/gptme/gptme/issues/2581)) ([`85a430b0c`](https://github.com/gptme/gptme/commit/85a430b0c))
 - fix(util-cli): prepend system message in llm generate ([#2578](https://github.com/gptme/gptme/issues/2578)) ([`e31dddfa1`](https://github.com/gptme/gptme/commit/e31dddfa1))
 - fix(server): reject invalid message tool allowlists ([#2579](https://github.com/gptme/gptme/issues/2579)) ([`bcf4b28ad`](https://github.com/gptme/gptme/commit/bcf4b28ad))
 - fix(util-cli): keep tools info JSON machine-readable ([`c6178c96e`](https://github.com/gptme/gptme/commit/c6178c96e))
 - fix(cli): raise UsageError for empty --model string ([#2577](https://github.com/gptme/gptme/issues/2577)) ([`6362147c9`](https://github.com/gptme/gptme/commit/6362147c9))
 - fix(server): correct upload path field description and add upload tests ([#2576](https://github.com/gptme/gptme/issues/2576)) ([`b87d153ab`](https://github.com/gptme/gptme/commit/b87d153ab))
 - fix(cli): raise UsageError for unknown model in llm generate ([#2575](https://github.com/gptme/gptme/issues/2575)) ([`998fb759b`](https://github.com/gptme/gptme/commit/998fb759b))
 - fix(server): reject non-string conversation prompt ([#2574](https://github.com/gptme/gptme/issues/2574)) ([`c5c0c8598`](https://github.com/gptme/gptme/commit/c5c0c8598))
 - fix(hooks): tolerate session-end trigger kwargs ([#2573](https://github.com/gptme/gptme/issues/2573)) ([`ec9b5104b`](https://github.com/gptme/gptme/commit/ec9b5104b))
 - fix(cli): keep unknown profile errors off stdout ([#2567](https://github.com/gptme/gptme/issues/2567)) ([`db71a4e7f`](https://github.com/gptme/gptme/commit/db71a4e7f))
 - fix(cli): reject malformed --output-schema with a usage error ([#2571](https://github.com/gptme/gptme/issues/2571)) ([`ea860e41d`](https://github.com/gptme/gptme/commit/ea860e41d))
 - fix(cli): reject missing path args before prompt merge ([#2569](https://github.com/gptme/gptme/issues/2569)) ([`8d3b3ff3a`](https://github.com/gptme/gptme/commit/8d3b3ff3a))
 - fix(cli): validate custom tool paths before startup ([#2566](https://github.com/gptme/gptme/issues/2566)) ([`64e09e384`](https://github.com/gptme/gptme/commit/64e09e384))
 - fix(webui): skip hosted loopback auto-connect ([#2568](https://github.com/gptme/gptme/issues/2568)) ([`4597b63c7`](https://github.com/gptme/gptme/commit/4597b63c7))
 - fix(server): reject malformed project_config sections ([`4ca1d829b`](https://github.com/gptme/gptme/commit/4ca1d829b))
 - fix(cli): validate architect/editor model names with clean usage error ([`5c2d0f05f`](https://github.com/gptme/gptme/commit/5c2d0f05f))
 - fix(cli): scope implicit resume to cwd workspace ([`72300a945`](https://github.com/gptme/gptme/commit/72300a945))
 - fix(cli): reject missing explicit path prompts early ([`1183cfd62`](https://github.com/gptme/gptme/commit/1183cfd62))
 - fix(server): reject malformed JSON before field validation ([#2562](https://github.com/gptme/gptme/issues/2562)) ([`f133dda7f`](https://github.com/gptme/gptme/commit/f133dda7f))
 - fix(cli): scope unnamed resume to workspace ([#2561](https://github.com/gptme/gptme/issues/2561)) ([`66e4249c0`](https://github.com/gptme/gptme/commit/66e4249c0))
 - fix(json): keep runtime stdout pure in JSON mode ([#2559](https://github.com/gptme/gptme/issues/2559)) ([`ed66a68c1`](https://github.com/gptme/gptme/commit/ed66a68c1))
 - fix(webui): retire dead cloud preset URL ([#2560](https://github.com/gptme/gptme/issues/2560)) ([`c45feb926`](https://github.com/gptme/gptme/commit/c45feb926))
 - fix(models): dedup 'Unknown model' warning via log_warn_once ([#2558](https://github.com/gptme/gptme/issues/2558)) ([`10a313143`](https://github.com/gptme/gptme/commit/10a313143))
 - fix(test): adjust short prompt lower bound from 500 to 400 after null-byte guard reduced prompt size ([`85b00010c`](https://github.com/gptme/gptme/commit/85b00010c))
 - fix(cli): preserve custom tool file allowlists ([#2554](https://github.com/gptme/gptme/issues/2554)) ([`2573e54ae`](https://github.com/gptme/gptme/commit/2573e54ae))
 - fix(logmanager): clamp over-large conversation limit to avoid islice crash ([#2552](https://github.com/gptme/gptme/issues/2552)) ([`6b6e7e46e`](https://github.com/gptme/gptme/commit/6b6e7e46e))
 - fix(telemetry): honor OTEL_EXPORTER_OTLP_TIMEOUT for export and flush ([#2550](https://github.com/gptme/gptme/issues/2550)) ([`f38ffaf7f`](https://github.com/gptme/gptme/commit/f38ffaf7f))
 - fix(webui): render a NotFound page for unmatched client-side routes ([#2551](https://github.com/gptme/gptme/issues/2551)) ([`2201a78d3`](https://github.com/gptme/gptme/commit/2201a78d3))
 - fix(cli): remove dead logdirs on startup validation ([#2540](https://github.com/gptme/gptme/issues/2540)) ([`683a1b501`](https://github.com/gptme/gptme/commit/683a1b501))
 - fix(cli): allow json after headless auto-switch ([#2548](https://github.com/gptme/gptme/issues/2548)) ([`3a8c1ed7b`](https://github.com/gptme/gptme/commit/3a8c1ed7b))
 - fix(cli): reject unsafe /fork conversation ids ([#2536](https://github.com/gptme/gptme/issues/2536)) ([`575e9a3c2`](https://github.com/gptme/gptme/commit/575e9a3c2))
 - fix(cli): reject unsafe /fork names ([#2539](https://github.com/gptme/gptme/issues/2539)) ([`f97df5856`](https://github.com/gptme/gptme/commit/f97df5856))
 - fix(cli): avoid full conversation scans on resume ([#2544](https://github.com/gptme/gptme/issues/2544)) ([`b23cdb47c`](https://github.com/gptme/gptme/commit/b23cdb47c))
 - fix(server): reject non-string session ids ([#2545](https://github.com/gptme/gptme/issues/2545)) ([`d6057b931`](https://github.com/gptme/gptme/commit/d6057b931))
 - fix(cli): keep slash commands on json rail ([#2543](https://github.com/gptme/gptme/issues/2543)) ([`c61d145e0`](https://github.com/gptme/gptme/commit/c61d145e0))
 - fix(cli): accept -t=value tool syntax ([#2542](https://github.com/gptme/gptme/issues/2542)) ([`8bfebb811`](https://github.com/gptme/gptme/commit/8bfebb811))
 - fix(webui): restore hosted deep links on Pages ([#2534](https://github.com/gptme/gptme/issues/2534)) ([`34bc0a01e`](https://github.com/gptme/gptme/commit/34bc0a01e))
 - fix(server): reject non-string elicit ids ([#2541](https://github.com/gptme/gptme/issues/2541)) ([`3491af279`](https://github.com/gptme/gptme/commit/3491af279))
 - fix(cli): keep json-mode logs off stdout ([#2537](https://github.com/gptme/gptme/issues/2537)) ([`184ccc7ef`](https://github.com/gptme/gptme/commit/184ccc7ef))
 - fix(server): reject invalid chat config path types ([#2538](https://github.com/gptme/gptme/issues/2538)) ([`5ddadc2e3`](https://github.com/gptme/gptme/commit/5ddadc2e3))
 - fix(server): reject non-string step models ([#2535](https://github.com/gptme/gptme/issues/2535)) ([`64f74e318`](https://github.com/gptme/gptme/commit/64f74e318))
 - fix(cli): validate custom tool paths before init ([#2533](https://github.com/gptme/gptme/issues/2533)) ([`212139f93`](https://github.com/gptme/gptme/commit/212139f93))
 - fix(server): validate agent creation field types ([#2531](https://github.com/gptme/gptme/issues/2531)) ([`ec61e388e`](https://github.com/gptme/gptme/commit/ec61e388e))
 - fix(webui): keep api misses out of SPA fallback ([#2532](https://github.com/gptme/gptme/issues/2532)) ([`10ee75d53`](https://github.com/gptme/gptme/commit/10ee75d53))
 - fix(telemetry): suppress OTLP timeout tracebacks ([#2528](https://github.com/gptme/gptme/issues/2528)) ([`2d64b73ec`](https://github.com/gptme/gptme/commit/2d64b73ec))
 - fix(server): return 409 for upload name exhaustion ([#2529](https://github.com/gptme/gptme/issues/2529)) ([`ef29f0682`](https://github.com/gptme/gptme/commit/ef29f0682))
 - fix(cli): avoid blocking on idle stdin pipes ([#2525](https://github.com/gptme/gptme/issues/2525)) ([`9390f0ef7`](https://github.com/gptme/gptme/commit/9390f0ef7))
 - fix(cli): ignore disable env in prompts expand ([`bcfbd00bc`](https://github.com/gptme/gptme/commit/bcfbd00bc))
 - fix(server): reject non-object conversation config ([`4f68269eb`](https://github.com/gptme/gptme/commit/4f68269eb))
 - fix(server): use get_json(silent=True) in tasks endpoints ([#2524](https://github.com/gptme/gptme/issues/2524)) ([`84d5c5857`](https://github.com/gptme/gptme/commit/84d5c5857))
 - fix(server): reject non-object v2 JSON bodies ([`e5c09e826`](https://github.com/gptme/gptme/commit/e5c09e826))
 - fix(server): use get_json(silent=True) in tasks and agents endpoints ([#2523](https://github.com/gptme/gptme/issues/2523)) ([`03fca16a6`](https://github.com/gptme/gptme/commit/03fca16a6))
 - fix(cli): honor --name when resuming conversations ([#2522](https://github.com/gptme/gptme/issues/2522)) ([`417a4f82a`](https://github.com/gptme/gptme/commit/417a4f82a))
 - fix(mcp): deduplicate search_all results across registries ([#2520](https://github.com/gptme/gptme/issues/2520)) ([`ecfea2bae`](https://github.com/gptme/gptme/commit/ecfea2bae))
 - fix(webui): route auth code exchange through fleet ([#2519](https://github.com/gptme/gptme/issues/2519)) ([`d50617c57`](https://github.com/gptme/gptme/commit/d50617c57))
 - fix(server): validate PUT conversation body and messages types ([#2517](https://github.com/gptme/gptme/issues/2517)) ([`4c7fa7916`](https://github.com/gptme/gptme/commit/4c7fa7916))
 - fix(cli): reject unsafe conversation names ([#2518](https://github.com/gptme/gptme/issues/2518)) ([`fa6c9d80c`](https://github.com/gptme/gptme/commit/fa6c9d80c))
 - fix(chats): add logger warning for skipped non-string content and narrower type hint ([`5f1fee889`](https://github.com/gptme/gptme/commit/5f1fee889))
 - fix(webui): reset isLoading to false when disconnected in useModels ([#2514](https://github.com/gptme/gptme/issues/2514)) ([`568585c70`](https://github.com/gptme/gptme/commit/568585c70))
 - fix(webui): gate useModels on connection state ([#2513](https://github.com/gptme/gptme/issues/2513)) ([`3282b11db`](https://github.com/gptme/gptme/commit/3282b11db))
 - fix(server): validate transcript turn text type to prevent 500 on non-string input ([`01729f32c`](https://github.com/gptme/gptme/commit/01729f32c))
 - fix(server): validate message content type in PUT conversation ([#2511](https://github.com/gptme/gptme/issues/2511)) ([`2bd3b3ca8`](https://github.com/gptme/gptme/commit/2bd3b3ca8))
 - fix(cli): reject directory passed to 'tokens count --file' ([#2510](https://github.com/gptme/gptme/issues/2510)) ([`7e1cdf1c6`](https://github.com/gptme/gptme/commit/7e1cdf1c6))
 - fix(server): validate session belongs to conversation across all sessions endpoints ([#2508](https://github.com/gptme/gptme/issues/2508)) ([`d5f44c478`](https://github.com/gptme/gptme/commit/d5f44c478))
 - fix(cli): prevent gptme-util tokens count from hanging on no-input non-TTY ([#2509](https://github.com/gptme/gptme/issues/2509)) ([`5f527a0f6`](https://github.com/gptme/gptme/commit/5f527a0f6))
 - fix(server): return 404 from events endpoint when conversation does not exist ([`cca616bd9`](https://github.com/gptme/gptme/commit/cca616bd9))
 - fix: prevent hang on empty query in chats search ([#2505](https://github.com/gptme/gptme/issues/2505)) ([`b68a38f75`](https://github.com/gptme/gptme/commit/b68a38f75))
 - fix(webui): gate useTasksQuery on connection state ([`24d42078b`](https://github.com/gptme/gptme/commit/24d42078b))
 - fix(webui): suppress duplicate PNA hint in install block ([`9379aa6db`](https://github.com/gptme/gptme/commit/9379aa6db))
 - fix(cli): reject overlong conversation IDs before filesystem access ([#2502](https://github.com/gptme/gptme/issues/2502)) ([`6bdf18dc3`](https://github.com/gptme/gptme/commit/6bdf18dc3))
 - fix(server): return 400 for conversation_id/branch names exceeding NAME_MAX ([#2498](https://github.com/gptme/gptme/issues/2498)) ([`4d3f06f97`](https://github.com/gptme/gptme/commit/4d3f06f97))
 - fix(cli): remove browser backend noise from utility output ([#2500](https://github.com/gptme/gptme/issues/2500)) ([`a5b383286`](https://github.com/gptme/gptme/commit/a5b383286))
 - fix(chats): read finds any conversation by id and exits non-zero when missing ([#2497](https://github.com/gptme/gptme/issues/2497)) ([`7a39bba7f`](https://github.com/gptme/gptme/commit/7a39bba7f))
 - fix(cli): reject negative chats --limit instead of crashing islice() ([#2496](https://github.com/gptme/gptme/issues/2496)) ([`dad0fe359`](https://github.com/gptme/gptme/commit/dad0fe359))
 - fix(cli): warn when 'models info' falls back for an unrecognized provider ([#2495](https://github.com/gptme/gptme/issues/2495)) ([`8bcc96e8b`](https://github.com/gptme/gptme/commit/8bcc96e8b))
 - fix(cli): make non-default tools callable via gptme-util tools call ([#2493](https://github.com/gptme/gptme/issues/2493)) ([`b4664e9ad`](https://github.com/gptme/gptme/commit/b4664e9ad))
 - fix(chats): avoid scanning test logs for user stats ([#2491](https://github.com/gptme/gptme/issues/2491)) ([`b3b3e01b7`](https://github.com/gptme/gptme/commit/b3b3e01b7))
 - fix(cli): tokens count treats '-' as stdin (Unix convention) ([#2489](https://github.com/gptme/gptme/issues/2489)) ([`3e137c218`](https://github.com/gptme/gptme/commit/3e137c218))
 - fix(cli): mcp commands exit nonzero on failure ([#2487](https://github.com/gptme/gptme/issues/2487)) ([`925eaae6a`](https://github.com/gptme/gptme/commit/925eaae6a))
 - fix(cli): tokens count exits nonzero when no input is provided ([#2484](https://github.com/gptme/gptme/issues/2484)) ([`1ceb07ab1`](https://github.com/gptme/gptme/commit/1ceb07ab1))
 - fix(cli): resolve bare provider-less model names instead of crashing ([`3072e1a4f`](https://github.com/gptme/gptme/commit/3072e1a4f))
 - fix(logmanager): tolerate unknown message fields when reading logs ([#2482](https://github.com/gptme/gptme/issues/2482)) ([`f1719b89a`](https://github.com/gptme/gptme/commit/f1719b89a))
 - fix(tools): split comma-separated choice options ([`cf1c91a28`](https://github.com/gptme/gptme/commit/cf1c91a28))
 - fix(vent): tolerate trailing punctuation in resolution-owner tag ([#2474](https://github.com/gptme/gptme/issues/2474)) ([`9bd65be9b`](https://github.com/gptme/gptme/commit/9bd65be9b))
 - fix(bot): verify sha256 of downloaded github_bot.py ([`0973bbf44`](https://github.com/gptme/gptme/commit/0973bbf44))
 - fix(lessons): use description field for semantic matching in hybrid_matcher ([#2469](https://github.com/gptme/gptme/issues/2469)) ([`35e426d19`](https://github.com/gptme/gptme/commit/35e426d19))
 - fix(bot): update model default, fix checkout version, tighten permissions ([#2468](https://github.com/gptme/gptme/issues/2468)) ([`aa7675878`](https://github.com/gptme/gptme/commit/aa7675878))
 - fix(vent): teach resolution-owner taxonomy, capture owner tag ([#2463](https://github.com/gptme/gptme/issues/2463)) ([`09bcf44ef`](https://github.com/gptme/gptme/commit/09bcf44ef))
 - fix(webui): surface payment-required chat errors ([#2462](https://github.com/gptme/gptme/issues/2462)) ([`a3302479a`](https://github.com/gptme/gptme/commit/a3302479a))
 - fix(hooks): replace invalid noqa directives in auto_snapshots ([#2461](https://github.com/gptme/gptme/issues/2461)) ([`e4e078fb0`](https://github.com/gptme/gptme/commit/e4e078fb0))
 - fix(tests): bump short prompt token limit to 4200 ([#2460](https://github.com/gptme/gptme/issues/2460)) ([`aad46a340`](https://github.com/gptme/gptme/commit/aad46a340))
 - fix(site): strip broken README TOC from homepage ([#2459](https://github.com/gptme/gptme/issues/2459)) ([`daea4ee98`](https://github.com/gptme/gptme/commit/daea4ee98))
 - fix(tauri): verify server is usable before reusing port 5700 ([#2458](https://github.com/gptme/gptme/issues/2458)) ([`1bf0beb3c`](https://github.com/gptme/gptme/commit/1bf0beb3c))
 - fix(webui): include status code and server error in models fetch failure ([#2457](https://github.com/gptme/gptme/issues/2457)) ([`137a55d53`](https://github.com/gptme/gptme/commit/137a55d53))
 - fix(android): disable broken mobile cloud setup path ([#2454](https://github.com/gptme/gptme/issues/2454)) ([`30bc3384e`](https://github.com/gptme/gptme/commit/30bc3384e))
 - fix(tests): skip test_search_perplexity on Perplexity/OpenRouter quota exhaustion ([#2450](https://github.com/gptme/gptme/issues/2450)) ([`d30562d6d`](https://github.com/gptme/gptme/commit/d30562d6d))
 - fix(benchmark): raise cold threshold to 10s and increase runs to 10 ([#2449](https://github.com/gptme/gptme/issues/2449)) ([`fdbcf5a92`](https://github.com/gptme/gptme/commit/fdbcf5a92))
 - fix(bot): avoid duplicate resolve failure comments ([#2447](https://github.com/gptme/gptme/issues/2447)) ([`248aac98c`](https://github.com/gptme/gptme/commit/248aac98c))
 - fix(tauri): commit app icons and remove icons/* from gitignore ([#2446](https://github.com/gptme/gptme/issues/2446)) ([`abe287c84`](https://github.com/gptme/gptme/commit/abe287c84))
 - fix(tests): skip requires_api tests on invalid API key (AuthenticationError) ([#2444](https://github.com/gptme/gptme/issues/2444)) ([`b4b6ea58a`](https://github.com/gptme/gptme/commit/b4b6ea58a))
 - fix(tools): keep tool descriptions within OpenAI limit ([#2441](https://github.com/gptme/gptme/issues/2441)) ([`89a5dccac`](https://github.com/gptme/gptme/commit/89a5dccac))
 - fix(github): rewire stale PR view helper ([#2432](https://github.com/gptme/gptme/issues/2432)) ([`1071fac9a`](https://github.com/gptme/gptme/commit/1071fac9a))
 - fix(subagent): harden thread-mode wait path ([#2425](https://github.com/gptme/gptme/issues/2425)) ([`5e026c961`](https://github.com/gptme/gptme/commit/5e026c961))
 - fix(tests): adapt server tests to isolated workspaces ([#2428](https://github.com/gptme/gptme/issues/2428)) ([`76b121112`](https://github.com/gptme/gptme/commit/76b121112))
 - fix(config): give server sessions an isolated workspace directory ([#2427](https://github.com/gptme/gptme/issues/2427)) ([`4e4ae6bc5`](https://github.com/gptme/gptme/commit/4e4ae6bc5))
 - fix(tools): warn when plain allowlists drop MCP tools ([`aadcdd257`](https://github.com/gptme/gptme/commit/aadcdd257))
 - fix(server): correct conversation sort direction ([`cc0554d26`](https://github.com/gptme/gptme/commit/cc0554d26))
 - fix(tools): support glob tool allowlists ([#2423](https://github.com/gptme/gptme/issues/2423)) ([`10e8caee5`](https://github.com/gptme/gptme/commit/10e8caee5))
 - fix(hooks): harden Windows process handles ([#2422](https://github.com/gptme/gptme/issues/2422)) ([`98c9f3f5e`](https://github.com/gptme/gptme/commit/98c9f3f5e))
 - fix(eval): lazy-load disabled swebench helpers ([`b8a47cce4`](https://github.com/gptme/gptme/commit/b8a47cce4))
 - fix(eval): address staged swebench review notes ([`3b9eead84`](https://github.com/gptme/gptme/commit/3b9eead84))
 - fix(eval): fail fast on disabled staged swebench runner ([`cc39e45fc`](https://github.com/gptme/gptme/commit/cc39e45fc))
 - fix(webui): preserve structured API errors ([`d255073b8`](https://github.com/gptme/gptme/commit/d255073b8))
 - fix(llm): apply default max_tokens (16k) for OpenRouter models ([#2402](https://github.com/gptme/gptme/issues/2402)) ([`ed1d6ef26`](https://github.com/gptme/gptme/commit/ed1d6ef26))
 - fix(ci): move workflow inputs from inline run: interpolation to env: (closes [#2398](https://github.com/gptme/gptme/issues/2398)) ([#2399](https://github.com/gptme/gptme/issues/2399)) ([`dc070862b`](https://github.com/gptme/gptme/commit/dc070862b))
 - fix(tools): restore CUA transport compatibility ([#2393](https://github.com/gptme/gptme/issues/2393)) ([`afada2488`](https://github.com/gptme/gptme/commit/afada2488))
 - fix(eval): attach fixture files to local eval prompts ([#2390](https://github.com/gptme/gptme/issues/2390)) ([`157f7c98d`](https://github.com/gptme/gptme/commit/157f7c98d))
 - fix(tests): clear GPTME_DISABLE_PATH_INCLUDE in test_image_auto_attach_end_to_end ([#2379](https://github.com/gptme/gptme/issues/2379)) ([`184daf803`](https://github.com/gptme/gptme/commit/184daf803))
 - fix(webui): surface auto-step startup failures ([#2375](https://github.com/gptme/gptme/issues/2375)) ([`5d5bba3ec`](https://github.com/gptme/gptme/commit/5d5bba3ec))
 - fix(tests): isolate include_paths tests from GPTME_DISABLE_PATH_INCLUDE env var ([#2359](https://github.com/gptme/gptme/issues/2359)) ([`7ad8c7d93`](https://github.com/gptme/gptme/commit/7ad8c7d93))
 - fix(tools): simplify derive_type TODO with get_type_hints fallback ([#2351](https://github.com/gptme/gptme/issues/2351)) ([`7df272dcc`](https://github.com/gptme/gptme/commit/7df272dcc))
 - fix(server): move :key from Vue template to child elements ([#2345](https://github.com/gptme/gptme/issues/2345)) ([`6f065264a`](https://github.com/gptme/gptme/commit/6f065264a))
 - fix(tools): fall back to current LogManager when shell logdir is None ([#2344](https://github.com/gptme/gptme/issues/2344)) ([`b84ef032f`](https://github.com/gptme/gptme/commit/b84ef032f))
 - fix(autocompact): record context-savings ledger when tool outputs are summarized ([#2342](https://github.com/gptme/gptme/issues/2342)) ([`941bb9b25`](https://github.com/gptme/gptme/commit/941bb9b25))
 - fix(tools): fold git log preview into shell ([#2340](https://github.com/gptme/gptme/issues/2340)) ([`786d1a00c`](https://github.com/gptme/gptme/commit/786d1a00c))
 - fix(webui): responsive settings modal — horizontal tabs on mobile, sidebar on desktop ([#2335](https://github.com/gptme/gptme/issues/2335)) ([`2333ae49d`](https://github.com/gptme/gptme/commit/2333ae49d))
 - fix(messages): merge turns after ephemeral pruning ([#2331](https://github.com/gptme/gptme/issues/2331)) ([`05dc3feab`](https://github.com/gptme/gptme/commit/05dc3feab))
 - fix(webui): delete stale api.gptme.ai Cloud preset on migration ([#2327](https://github.com/gptme/gptme/issues/2327)) ([`af8d3edec`](https://github.com/gptme/gptme/commit/af8d3edec))
 - fix(webui): show HTTP status in auth code exchange error instead of 'Unknown error' ([#2326](https://github.com/gptme/gptme/issues/2326)) ([`5cd88032b`](https://github.com/gptme/gptme/commit/5cd88032b))
 - fix(webui): support same-window postMessage in EmbeddedContextProvider ([#2325](https://github.com/gptme/gptme/issues/2325)) ([`41da3560a`](https://github.com/gptme/gptme/commit/41da3560a))
 - fix(server): validate per-turn dict type in POST /transcript ([`c15350ab0`](https://github.com/gptme/gptme/commit/c15350ab0))
 - fix(webui): update auth base URL from fleet.gptme.ai to gptme.ai ([#2312](https://github.com/gptme/gptme/issues/2312)) ([`3c0fb79f0`](https://github.com/gptme/gptme/commit/3c0fb79f0))
 - fix(llm): strip redundant openrouter/ prefix from proxy model IDs ([#2311](https://github.com/gptme/gptme/issues/2311)) ([`9453b85a3`](https://github.com/gptme/gptme/commit/9453b85a3))
 - fix(context): add per-message size budget to include_paths ([#2308](https://github.com/gptme/gptme/issues/2308)) ([`2f7981c76`](https://github.com/gptme/gptme/commit/2f7981c76))
 - fix(context): deduplicate paths in _find_potential_paths to prevent repeated file embeddings ([#2307](https://github.com/gptme/gptme/issues/2307)) ([`c48735622`](https://github.com/gptme/gptme/commit/c48735622))
 - fix(tests): add _restore_logged_warnings fixture and fix caplog context in TestLogWarnOnce ([#2301](https://github.com/gptme/gptme/issues/2301)) ([`b94ae2ba2`](https://github.com/gptme/gptme/commit/b94ae2ba2))
 - fix(ci): route Anthropic tests through OpenRouter to use per-key spend limits ([#2297](https://github.com/gptme/gptme/issues/2297)) ([`771528ed8`](https://github.com/gptme/gptme/commit/771528ed8))
 - fix(webui): make SetupWizard X close button visible and persist hasCompletedSetup ([#2295](https://github.com/gptme/gptme/issues/2295)) ([`b0200264b`](https://github.com/gptme/gptme/commit/b0200264b))
 - fix(webui): add Skip button to SetupWizard welcome step ([#2294](https://github.com/gptme/gptme/issues/2294)) ([`e1583222a`](https://github.com/gptme/gptme/commit/e1583222a))
 - fix(webui): mount SettingsModal in mobile layout so Server settings works on Android ([#2293](https://github.com/gptme/gptme/issues/2293)) ([`f8d336238`](https://github.com/gptme/gptme/commit/f8d336238))
 - fix(webui): stop auto-connect retries on CORS/PNA failures ([#2290](https://github.com/gptme/gptme/issues/2290)) ([`faa0333e9`](https://github.com/gptme/gptme/commit/faa0333e9))
 - fix(webui): move Sheet safe-area from SheetHeader margin to SheetContent padding ([#2289](https://github.com/gptme/gptme/issues/2289)) ([`bd954bbc8`](https://github.com/gptme/gptme/commit/bd954bbc8))
 - fix(webui): apply safe-area insets to Sheet primitive (app-wide) ([#2287](https://github.com/gptme/gptme/issues/2287)) ([`60e826e8a`](https://github.com/gptme/gptme/commit/60e826e8a))
 - fix(webui): replace removed SiOpenai with local SVG icon ([#2283](https://github.com/gptme/gptme/issues/2283)) ([`58ded337b`](https://github.com/gptme/gptme/commit/58ded337b))
 - fix(webui): add safe-area insets for Android/iOS notch support ([#2284](https://github.com/gptme/gptme/issues/2284)) ([`deb4a008d`](https://github.com/gptme/gptme/commit/deb4a008d))
 - fix(webui): remove dead Lovable bootstrap script ([#2281](https://github.com/gptme/gptme/issues/2281)) ([`6482aee7e`](https://github.com/gptme/gptme/commit/6482aee7e))
 - fix(webui): remove unsupported [build] key from wrangler.toml ([#2279](https://github.com/gptme/gptme/issues/2279)) ([`f14d1df4e`](https://github.com/gptme/gptme/commit/f14d1df4e))
 - fix(webui): gitignore bun.lockb to prevent silent CF Pages breakage ([#2278](https://github.com/gptme/gptme/issues/2278)) ([`adf43a21a`](https://github.com/gptme/gptme/commit/adf43a21a))
 - fix(webui): remove bun.lockb and fix McpConfiguration type errors ([#2270](https://github.com/gptme/gptme/issues/2270)) ([`74d15ee5a`](https://github.com/gptme/gptme/commit/74d15ee5a))
 - fix(tauri,server): self-terminate gptme-server when Tauri parent dies ([#2267](https://github.com/gptme/gptme/issues/2267)) ([`6684e7032`](https://github.com/gptme/gptme/commit/6684e7032))
 - fix(tauri): handle RunEvent::Exit for macOS Cmd+Q sidecar cleanup ([#2260](https://github.com/gptme/gptme/issues/2260)) ([#2266](https://github.com/gptme/gptme/issues/2266)) ([`fa8616615`](https://github.com/gptme/gptme/commit/fa8616615))
 - fix(tauri): prevent_exit in ExitRequested to guarantee server cleanup on macOS ([#2264](https://github.com/gptme/gptme/issues/2264)) ([`32b13c1dc`](https://github.com/gptme/gptme/commit/32b13c1dc))
 - fix(tauri): catch PyInstaller orphan on app exit ([`62155215e`](https://github.com/gptme/gptme/commit/62155215e))
 - fix(tauri): kill gptme-server subprocesses and orphans on exit ([#2261](https://github.com/gptme/gptme/issues/2261)) ([`fe05ed5c3`](https://github.com/gptme/gptme/commit/fe05ed5c3))
 - fix(agents_md_inject): skip re-injection when content already loaded from different path ([#2256](https://github.com/gptme/gptme/issues/2256)) ([`b69b5bf91`](https://github.com/gptme/gptme/commit/b69b5bf91))
 - fix(tauri): reuse existing gptme-server on startup instead of blocking error dialog ([#2258](https://github.com/gptme/gptme/issues/2258)) ([`ee6bb708a`](https://github.com/gptme/gptme/commit/ee6bb708a))
 - fix(cli): skip context_cmd when opening any existing conversation, not just --resume ([#2257](https://github.com/gptme/gptme/issues/2257)) ([`5b607e1ea`](https://github.com/gptme/gptme/commit/5b607e1ea))
 - fix(prompts): include version string in custom agent system prompt ([#2251](https://github.com/gptme/gptme/issues/2251)) ([`ff23215b9`](https://github.com/gptme/gptme/commit/ff23215b9))
 - fix(llm): read OpenRouter cache write tokens ([#2250](https://github.com/gptme/gptme/issues/2250)) ([`09a4f7164`](https://github.com/gptme/gptme/commit/09a4f7164))
 - fix(tauri): set display name to 'gptme' in Dock/Finder on macOS ([#2248](https://github.com/gptme/gptme/issues/2248)) ([`42fcc357a`](https://github.com/gptme/gptme/commit/42fcc357a))
 - fix(settings): show effective config sources and restore scroll ([#2247](https://github.com/gptme/gptme/issues/2247)) ([`7cd59addd`](https://github.com/gptme/gptme/commit/7cd59addd))
 - fix(tauri): restore execute permission on sidecar after artifact download ([#2246](https://github.com/gptme/gptme/issues/2246)) ([`4d0f9d663`](https://github.com/gptme/gptme/commit/4d0f9d663))
 - fix(tauri): fix notarization, app name, and icon ([#2244](https://github.com/gptme/gptme/issues/2244)) ([`8f78b5a3d`](https://github.com/gptme/gptme/commit/8f78b5a3d))
 - fix(tauri): codesign sidecar binary on macOS ([#2242](https://github.com/gptme/gptme/issues/2242)) ([`3571ed770`](https://github.com/gptme/gptme/commit/3571ed770))
 - fix(webui): surface missing provider setup on welcome view ([#2241](https://github.com/gptme/gptme/issues/2241)) ([`92646ade7`](https://github.com/gptme/gptme/commit/92646ade7))
 - fix(tauri): trigger macOS local-network permission at app startup ([#2240](https://github.com/gptme/gptme/issues/2240)) ([`7e099f847`](https://github.com/gptme/gptme/commit/7e099f847))
 - fix(webui): include port in derived server name to prevent name collisions ([#2239](https://github.com/gptme/gptme/issues/2239)) ([`4b0440ddc`](https://github.com/gptme/gptme/commit/4b0440ddc))
 - fix(tauri): clean up gptme-server on app exit, not just window close ([#2238](https://github.com/gptme/gptme/issues/2238)) ([`620edf49b`](https://github.com/gptme/gptme/commit/620edf49b))
 - fix(webui): use configured Pages project and refresh Bun lock ([#2233](https://github.com/gptme/gptme/issues/2233)) ([`07027a663`](https://github.com/gptme/gptme/commit/07027a663))
 - fix(tauri): expose __TAURI__ global so webui detects desktop env ([#2229](https://github.com/gptme/gptme/issues/2229)) ([`ee6693584`](https://github.com/gptme/gptme/commit/ee6693584))
 - fix(webui): show actionable connection error details ([#2228](https://github.com/gptme/gptme/issues/2228)) ([`cf87099be`](https://github.com/gptme/gptme/commit/cf87099be))
 - fix(tauri): allow multi-origin CORS so AppImage local setup works ([#2227](https://github.com/gptme/gptme/issues/2227)) ([`646590516`](https://github.com/gptme/gptme/commit/646590516))
 - fix(webui): surface disconnected first-run actions ([#2219](https://github.com/gptme/gptme/issues/2219)) ([`45820f031`](https://github.com/gptme/gptme/commit/45820f031))
 - fix(server): apply provider API key to os.environ immediately (no restart needed) ([#2214](https://github.com/gptme/gptme/issues/2214)) ([`2930da50e`](https://github.com/gptme/gptme/commit/2930da50e))
 - fix(reduce): skip unfindable codeblocks instead of asserting ([#2212](https://github.com/gptme/gptme/issues/2212)) ([`74f701ec6`](https://github.com/gptme/gptme/commit/74f701ec6))
 - fix(release): use creatordate sorting for previous tag detection ([#2211](https://github.com/gptme/gptme/issues/2211)) ([`285c45f76`](https://github.com/gptme/gptme/commit/285c45f76))
 - fix(cli): reduce agents scan latency ([#2206](https://github.com/gptme/gptme/issues/2206)) ([`c7f6833a7`](https://github.com/gptme/gptme/commit/c7f6833a7))
 - fix(hooks): match Claude sessions by start time ([#2202](https://github.com/gptme/gptme/issues/2202)) ([`b155f7913`](https://github.com/gptme/gptme/commit/b155f7913))
 - fix(hooks): detect codex session mode in workspace_agents ([#2196](https://github.com/gptme/gptme/issues/2196)) ([`4136b5857`](https://github.com/gptme/gptme/commit/4136b5857))
 - fix(anthropic): use adaptive thinking on Opus 4.7 (legacy returns 400) ([#2190](https://github.com/gptme/gptme/issues/2190)) ([`3933b9e95`](https://github.com/gptme/gptme/commit/3933b9e95))
 - fix(openai): extract cache_creation_input_tokens from OpenRouter/Anthropic responses ([#2189](https://github.com/gptme/gptme/issues/2189)) ([`ace5b7cdf`](https://github.com/gptme/gptme/commit/ace5b7cdf))
 - fix(anthropic): fold static bootstrap into system prompt ([#2188](https://github.com/gptme/gptme/issues/2188)) ([`fe9c84c34`](https://github.com/gptme/gptme/commit/fe9c84c34))
 - fix(doctor): check for pandoc, pdftoppm, convert, and shellcheck ([#2182](https://github.com/gptme/gptme/issues/2182)) ([`fb44ae9e7`](https://github.com/gptme/gptme/commit/fb44ae9e7))
 - fix(config): drop unknown project-config keys instead of crashing ([#2179](https://github.com/gptme/gptme/issues/2179)) ([`59c780852`](https://github.com/gptme/gptme/commit/59c780852))
 - fix(server): start without a default model when no API keys configured ([#2178](https://github.com/gptme/gptme/issues/2178)) ([`76719bf4d`](https://github.com/gptme/gptme/commit/76719bf4d))
 - fix(server): pick fallback model based on available provider keys ([#2177](https://github.com/gptme/gptme/issues/2177)) ([`8304021d7`](https://github.com/gptme/gptme/commit/8304021d7))
 - fix(config): ignore unknown keys in [prompt] and [user] instead of crashing ([#2176](https://github.com/gptme/gptme/issues/2176)) ([`504aec64d`](https://github.com/gptme/gptme/commit/504aec64d))
 - fix(doctor): show fix hints for SKIPPED checks in verbose mode ([#2172](https://github.com/gptme/gptme/issues/2172)) ([`398adb1a7`](https://github.com/gptme/gptme/commit/398adb1a7))
 - fix(doctor): add node, npx, and docker to optional tool checks ([#2171](https://github.com/gptme/gptme/issues/2171)) ([`54cb8e21a`](https://github.com/gptme/gptme/commit/54cb8e21a))
 - fix(eval): clean up auto-created host_dir in DockerExecutionEnv ([#2170](https://github.com/gptme/gptme/issues/2170)) ([`f3bc96e2e`](https://github.com/gptme/gptme/commit/f3bc96e2e))
 - fix(eval): isolate user context from benchmark runs ([#2168](https://github.com/gptme/gptme/issues/2168)) ([`6537b57bc`](https://github.com/gptme/gptme/commit/6537b57bc))
 - fix(server): serial multi-tool execution and call_id propagation ([#2166](https://github.com/gptme/gptme/issues/2166)) ([`622c92f35`](https://github.com/gptme/gptme/commit/622c92f35))
 - fix(doctor): suppress requests version-compatibility warning ([#2164](https://github.com/gptme/gptme/issues/2164)) ([`a3aa732b8`](https://github.com/gptme/gptme/commit/a3aa732b8))
 - fix(server): use int type for --port, add GPTME_SERVER_HOST/PORT env vars ([#2163](https://github.com/gptme/gptme/issues/2163)) ([`10dcd2922`](https://github.com/gptme/gptme/commit/10dcd2922))
 - fix(doctor): add Python version check (require 3.10+) ([#2161](https://github.com/gptme/gptme/issues/2161)) ([`97f2608e3`](https://github.com/gptme/gptme/commit/97f2608e3))
 - fix(cli): suppress requests version-compatibility warning in gptme-util ([#2160](https://github.com/gptme/gptme/issues/2160)) ([`2cd90fd6b`](https://github.com/gptme/gptme/commit/2cd90fd6b))
 - fix(server): include exception detail in agent init error response ([#2158](https://github.com/gptme/gptme/issues/2158)) ([`cc3b2f1b2`](https://github.com/gptme/gptme/commit/cc3b2f1b2))
 - fix(server): include exception detail in tasks API error responses ([#2157](https://github.com/gptme/gptme/issues/2157)) ([`096b4f572`](https://github.com/gptme/gptme/commit/096b4f572))
 - fix(chats): use 1-indexed labels in read to match --start parameter ([#2156](https://github.com/gptme/gptme/issues/2156)) ([`0f4b24995`](https://github.com/gptme/gptme/commit/0f4b24995))
 - fix(doctor): show warning when Anthropic API key quota is exhausted ([#2154](https://github.com/gptme/gptme/issues/2154)) ([`1eb85f995`](https://github.com/gptme/gptme/commit/1eb85f995))
 - fix(dx): improve error messages with actionable context ([#2151](https://github.com/gptme/gptme/issues/2151)) ([`e39e37c5b`](https://github.com/gptme/gptme/commit/e39e37c5b))
 - fix(dx): improve first-run experience with better errors and config detection ([#2150](https://github.com/gptme/gptme/issues/2150)) ([`e273ae15f`](https://github.com/gptme/gptme/commit/e273ae15f))
 - fix(models): update OpenRouter Anthropic model IDs to dot notation ([#2149](https://github.com/gptme/gptme/issues/2149)) ([`d66ac4ba7`](https://github.com/gptme/gptme/commit/d66ac4ba7))
 - fix(agent): use function timeout for fork command instead of hardcoded 120s ([#2148](https://github.com/gptme/gptme/issues/2148)) ([`f6e4eacce`](https://github.com/gptme/gptme/commit/f6e4eacce))
 - fix(server): reject non-object JSON in session endpoints ([#2144](https://github.com/gptme/gptme/issues/2144)) ([`e70c73d9e`](https://github.com/gptme/gptme/commit/e70c73d9e))
 - fix(server): reject non-object JSON in task PATCH endpoint ([#2142](https://github.com/gptme/gptme/issues/2142)) ([`e01a50be5`](https://github.com/gptme/gptme/commit/e01a50be5))
 - fix(server): reject non-object JSON in agent creation ([#2143](https://github.com/gptme/gptme/issues/2143)) ([`53ff31a4e`](https://github.com/gptme/gptme/commit/53ff31a4e))
 - fix(server): 404 orphaned conversation avatar requests ([#2141](https://github.com/gptme/gptme/issues/2141)) ([`182df9a0c`](https://github.com/gptme/gptme/commit/182df9a0c))
 - fix(util): lazy-import scipy in _sound_sounddevice to avoid 1.4s startup penalty ([#2140](https://github.com/gptme/gptme/issues/2140)) ([`5676664d2`](https://github.com/gptme/gptme/commit/5676664d2))
 - fix(server): reject non-object JSON in config patch ([#2139](https://github.com/gptme/gptme/issues/2139)) ([`fabfa88ba`](https://github.com/gptme/gptme/commit/fabfa88ba))
 - fix(server): add missing validation in POST message and config PATCH endpoints ([#2138](https://github.com/gptme/gptme/issues/2138)) ([`65c60f362`](https://github.com/gptme/gptme/commit/65c60f362))
 - fix(server): return 404 for missing conversation avatar and config ([#2137](https://github.com/gptme/gptme/issues/2137)) ([`69503e907`](https://github.com/gptme/gptme/commit/69503e907))
 - fix(server): return 404 when patching missing conversation config ([#2136](https://github.com/gptme/gptme/issues/2136)) ([`3d0995d65`](https://github.com/gptme/gptme/commit/3d0995d65))
 - fix(server): return 404 for missing conversations ([#2135](https://github.com/gptme/gptme/issues/2135)) ([`4d689db77`](https://github.com/gptme/gptme/commit/4d689db77))
 - fix(server): handle file deletion races and bound attachment name allocation ([#2134](https://github.com/gptme/gptme/issues/2134)) ([`fdcac364e`](https://github.com/gptme/gptme/commit/fdcac364e))
 - fix(webui): avoid setup wizard completion loop ([#2133](https://github.com/gptme/gptme/issues/2133)) ([`387a27ceb`](https://github.com/gptme/gptme/commit/387a27ceb))
 - fix(server): validate message content and timestamp in conversation creation ([#2132](https://github.com/gptme/gptme/issues/2132)) ([`b6256b03d`](https://github.com/gptme/gptme/commit/b6256b03d))
 - fix(server): add thread-safety lock to SessionManager ([#2131](https://github.com/gptme/gptme/issues/2131)) ([`4f2eee4f3`](https://github.com/gptme/gptme/commit/4f2eee4f3))
 - fix(tools): report error on invalid read line numbers and fix tool name in server error log ([#2130](https://github.com/gptme/gptme/issues/2130)) ([`da409c30c`](https://github.com/gptme/gptme/commit/da409c30c))
 - fix(server): validate task_id to prevent path traversal in tasks API ([#2128](https://github.com/gptme/gptme/issues/2128)) ([`be1bee349`](https://github.com/gptme/gptme/commit/be1bee349))
 - fix(server): add random suffix to task IDs to prevent collisions ([#2126](https://github.com/gptme/gptme/issues/2126)) ([`8bdbca06e`](https://github.com/gptme/gptme/commit/8bdbca06e))
 - fix(ci): fall back to unsigned tauri release when apple secrets missing ([#2121](https://github.com/gptme/gptme/issues/2121)) ([`6872f804b`](https://github.com/gptme/gptme/commit/6872f804b))
 - fix(server): cap text file preview at 10MB to prevent OOM ([#2124](https://github.com/gptme/gptme/issues/2124)) ([`748f177d0`](https://github.com/gptme/gptme/commit/748f177d0))
 - fix(server): restrict agent creation path to server working directory ([#2123](https://github.com/gptme/gptme/issues/2123)) ([`899c5b053`](https://github.com/gptme/gptme/commit/899c5b053))
 - fix(tests): fix server_confirm race condition and mark slow CLI tests ([#2122](https://github.com/gptme/gptme/issues/2122)) ([`80f35ccf6`](https://github.com/gptme/gptme/commit/80f35ccf6))
 - fix(server): validate user avatar serves only image files ([#2119](https://github.com/gptme/gptme/issues/2119)) ([`9ae2f22ff`](https://github.com/gptme/gptme/commit/9ae2f22ff))
 - fix(lessons): validate tools field in frontmatter like keywords/patterns ([#2120](https://github.com/gptme/gptme/issues/2120)) ([`13ca5cba6`](https://github.com/gptme/gptme/commit/13ca5cba6))
 - fix(webui): use dynamic month name in ConversationList date group test ([#2117](https://github.com/gptme/gptme/issues/2117)) ([`aa6e86186`](https://github.com/gptme/gptme/commit/aa6e86186))
 - fix(server+eval): event trimming for memory leak + eval timeout bug ([#2108](https://github.com/gptme/gptme/issues/2108)) ([`62ec454f9`](https://github.com/gptme/gptme/commit/62ec454f9))
 - fix(server): detect and clean up stuck generating sessions ([#2107](https://github.com/gptme/gptme/issues/2107)) ([`33f17bd1d`](https://github.com/gptme/gptme/commit/33f17bd1d))
 - fix(lessons): guard against zero-norm embeddings and clean up dead code ([#2102](https://github.com/gptme/gptme/issues/2102)) ([`16ef840bc`](https://github.com/gptme/gptme/commit/16ef840bc))
 - fix(lessons): make tool matching case-insensitive ([#2092](https://github.com/gptme/gptme/issues/2092)) ([`890ffc840`](https://github.com/gptme/gptme/commit/890ffc840))
 - fix(lessons): fix hybrid matcher crash, improve context extraction and path parsing ([#2087](https://github.com/gptme/gptme/issues/2087)) ([`cd762a1ff`](https://github.com/gptme/gptme/commit/cd762a1ff))
 - fix: three reliability/UX bugs (assert, API validation, stdout) ([#2086](https://github.com/gptme/gptme/issues/2086)) ([`3d6a19504`](https://github.com/gptme/gptme/commit/3d6a19504))
 - fix(server): fix SSE event delivery race causing test flakiness ([#2081](https://github.com/gptme/gptme/issues/2081)) ([`825514b0e`](https://github.com/gptme/gptme/commit/825514b0e))
 - fix(server): resolve gptme session dirs in external sessions API ([#2071](https://github.com/gptme/gptme/issues/2071)) ([`012241e31`](https://github.com/gptme/gptme/commit/012241e31))
 - fix(mcp): don't set thread-global event loop in MCPClient ([#2070](https://github.com/gptme/gptme/issues/2070)) ([`d7abbc8a3`](https://github.com/gptme/gptme/commit/d7abbc8a3))
 - fix(server): improve external session provider detection for uv tool installs ([#2065](https://github.com/gptme/gptme/issues/2065)) ([`463747f20`](https://github.com/gptme/gptme/commit/463747f20))
 - fix(eval): clarify behavioral eval prompts to improve baseline score ([#2063](https://github.com/gptme/gptme/issues/2063)) ([`51c32cf47`](https://github.com/gptme/gptme/commit/51c32cf47))
 - fix(tools): add explicit UTF-8 encoding to all file read/write operations ([#2051](https://github.com/gptme/gptme/issues/2051)) ([`d0b41b0ae`](https://github.com/gptme/gptme/commit/d0b41b0ae))
 - fix(server): fix model name in rerun endpoint and event flag race condition ([#2050](https://github.com/gptme/gptme/issues/2050)) ([`3b271f7c3`](https://github.com/gptme/gptme/commit/3b271f7c3))
 - fix(eval): fix behavioral eval suite — 4 cascading bugs ([#2047](https://github.com/gptme/gptme/issues/2047)) ([`922603a69`](https://github.com/gptme/gptme/commit/922603a69))
 - fix(tools): add text=True to lynx subprocess and error handling to PDF download ([#2044](https://github.com/gptme/gptme/issues/2044)) ([`928f18dd1`](https://github.com/gptme/gptme/commit/928f18dd1))
 - fix(server): close TOCTOU race in /step endpoint for concurrent requests ([#2042](https://github.com/gptme/gptme/issues/2042)) ([`e3c20a98f`](https://github.com/gptme/gptme/commit/e3c20a98f))
 - fix(llm): add safety guard against silent None return in retry decorators ([#2041](https://github.com/gptme/gptme/issues/2041)) ([`b87923bd6`](https://github.com/gptme/gptme/commit/b87923bd6))
 - fix(eval): handle TimeoutExpired from docker stop during timeout cleanup ([#2040](https://github.com/gptme/gptme/issues/2040)) ([`8d7a4c4b6`](https://github.com/gptme/gptme/commit/8d7a4c4b6))
 - fix(tools): add missing capture_output/text to subprocess calls ([#2038](https://github.com/gptme/gptme/issues/2038)) ([`68d47b425`](https://github.com/gptme/gptme/commit/68d47b425))
 - fix(server): return LLM errors in step HTTP response ([#2037](https://github.com/gptme/gptme/issues/2037)) ([`0ddec3da6`](https://github.com/gptme/gptme/commit/0ddec3da6))
 - fix(tools): add error handling for subprocess calls in screenshot and PDF tools ([#2030](https://github.com/gptme/gptme/issues/2030)) ([`7fecc87a8`](https://github.com/gptme/gptme/commit/7fecc87a8))
 - fix(server): harden session management and input validation ([#2029](https://github.com/gptme/gptme/issues/2029)) ([`9eee5d2c3`](https://github.com/gptme/gptme/commit/9eee5d2c3))
 - fix(tools): replace deprecated getchildren() with direct iteration ([#2020](https://github.com/gptme/gptme/issues/2020)) ([`5489d2dbe`](https://github.com/gptme/gptme/commit/5489d2dbe))
 - fix(subagent): add timeout to subprocess monitor to prevent indefinite blocking ([#2019](https://github.com/gptme/gptme/issues/2019)) ([`6a1c07837`](https://github.com/gptme/gptme/commit/6a1c07837))
 - fix(tests): set asyncio_default_fixture_loop_scope to suppress deprecation warning ([#2016](https://github.com/gptme/gptme/issues/2016)) ([`dee34bc29`](https://github.com/gptme/gptme/commit/dee34bc29))
 - fix(server): validate input types on tasks API and POST message endpoints ([#2014](https://github.com/gptme/gptme/issues/2014)) ([`cc7804bb2`](https://github.com/gptme/gptme/commit/cc7804bb2))
 - fix(eval): add subprocess timeouts to eval module ([#2012](https://github.com/gptme/gptme/issues/2012)) ([`8ac9f4b52`](https://github.com/gptme/gptme/commit/8ac9f4b52))
 - fix: add subprocess timeouts to remaining misc modules ([#2013](https://github.com/gptme/gptme/issues/2013)) ([`3d84cbe10`](https://github.com/gptme/gptme/commit/3d84cbe10))
 - fix(agent): add subprocess timeouts to service and workspace modules ([#2010](https://github.com/gptme/gptme/issues/2010)) ([`1b175afb5`](https://github.com/gptme/gptme/commit/1b175afb5))
 - fix(util): add subprocess timeouts to all gh CLI calls ([#2009](https://github.com/gptme/gptme/issues/2009)) ([`53ea31565`](https://github.com/gptme/gptme/commit/53ea31565))
 - fix(tools): add subprocess timeouts to computer tool ([#2007](https://github.com/gptme/gptme/issues/2007)) ([`447bb9a4d`](https://github.com/gptme/gptme/commit/447bb9a4d))
 - fix(util): add subprocess timeouts to clipboard operations ([#2008](https://github.com/gptme/gptme/issues/2008)) ([`9e4a1f5ad`](https://github.com/gptme/gptme/commit/9e4a1f5ad))
 - fix(server): wrap tasks list response to match TaskListResponse schema ([#2006](https://github.com/gptme/gptme/issues/2006)) ([`524e7640a`](https://github.com/gptme/gptme/commit/524e7640a))
 - fix(server): validate branch parameter to prevent path traversal (CWE-22) ([#2005](https://github.com/gptme/gptme/issues/2005)) ([`39f118bdc`](https://github.com/gptme/gptme/commit/39f118bdc))
 - fix: harden XML parsing — prevent KeyError and negative positions ([#2004](https://github.com/gptme/gptme/issues/2004)) ([`b55f79d83`](https://github.com/gptme/gptme/commit/b55f79d83))
 - fix(server): add path traversal validation to session and workspace endpoints ([#2000](https://github.com/gptme/gptme/issues/2000)) ([`fbe35eb55`](https://github.com/gptme/gptme/commit/fbe35eb55))
 - fix(server): hide reasoning blocks from visible output ([#1999](https://github.com/gptme/gptme/issues/1999)) ([`ba2567323`](https://github.com/gptme/gptme/commit/ba2567323))
 - fix(tests): remove unused pytest-asyncio config options ([#1998](https://github.com/gptme/gptme/issues/1998)) ([`960884dc7`](https://github.com/gptme/gptme/commit/960884dc7))
 - fix(webui): resolve eslint react-hooks/exhaustive-deps warning ([#1991](https://github.com/gptme/gptme/issues/1991)) ([`23a55aafc`](https://github.com/gptme/gptme/commit/23a55aafc))
 - fix(webui): fix pre-commit hooks to only run on webui file changes ([#1990](https://github.com/gptme/gptme/issues/1990)) ([`5a9e5a5eb`](https://github.com/gptme/gptme/commit/5a9e5a5eb))
 - fix(tools): add missing subprocess timeouts to prevent indefinite hangs ([#1985](https://github.com/gptme/gptme/issues/1985)) ([`7177168cd`](https://github.com/gptme/gptme/commit/7177168cd))
 - fix(eval): replace readline() loops with communicate() to prevent pipe deadlocks ([#1984](https://github.com/gptme/gptme/issues/1984)) ([`3d5beeec8`](https://github.com/gptme/gptme/commit/3d5beeec8))
 - fix: harden subagent thread safety and server input validation ([`52db57eba`](https://github.com/gptme/gptme/commit/52db57eba))
 - fix(eval): use Wilson score consistently in per-test breakdown ([#1981](https://github.com/gptme/gptme/issues/1981)) ([`f71571cab`](https://github.com/gptme/gptme/commit/f71571cab))
 - fix(eval): add missing subprocess timeouts to Docker operations ([#1980](https://github.com/gptme/gptme/issues/1980)) ([`b385decaf`](https://github.com/gptme/gptme/commit/b385decaf))
 - fix(eval): rank leaderboard by Wilson score to account for test coverage ([#1978](https://github.com/gptme/gptme/issues/1978)) ([`f52f2c826`](https://github.com/gptme/gptme/commit/f52f2c826))
 - fix(webui): sidebar icon reorder, workspace filtering, remove redundant sections ([#1976](https://github.com/gptme/gptme/issues/1976)) ([`348f09e6d`](https://github.com/gptme/gptme/commit/348f09e6d))
 - fix(webui): handle nested code blocks in markdown rendering ([`f595ef842`](https://github.com/gptme/gptme/commit/f595ef842))
 - fix(webui): add node types for test environment ([#1973](https://github.com/gptme/gptme/issues/1973)) ([`95cd37bf3`](https://github.com/gptme/gptme/commit/95cd37bf3))
 - fix(webui,server): step collapse bugs, message styling, metadata, model persistence, scroll ([#1957](https://github.com/gptme/gptme/issues/1957)) ([`a9105d50e`](https://github.com/gptme/gptme/commit/a9105d50e))
 - fix(test): join subagent threads before mock assertions ([#1968](https://github.com/gptme/gptme/issues/1968)) ([`5115fbdf7`](https://github.com/gptme/gptme/commit/5115fbdf7))
 - fix(ci): install ffmpeg conditionally for demo capture recording ([`9367530dc`](https://github.com/gptme/gptme/commit/9367530dc))
 - fix(eval): close remaining practical16 review gaps ([#1967](https://github.com/gptme/gptme/issues/1967)) ([`f48de363a`](https://github.com/gptme/gptme/commit/f48de363a))
 - fix(server): validate auto_confirm type in PUT conversation endpoint (CWE-20) ([#1966](https://github.com/gptme/gptme/issues/1966)) ([`d69781211`](https://github.com/gptme/gptme/commit/d69781211))
 - fix(ci): install ffmpeg in capture-webui job for recording support ([#1964](https://github.com/gptme/gptme/issues/1964)) ([`730bccc07`](https://github.com/gptme/gptme/commit/730bccc07))
 - fix(webui): add DOMPurify sanitization and remove debug logs ([#1963](https://github.com/gptme/gptme/issues/1963)) ([`d8fbb6dc9`](https://github.com/gptme/gptme/commit/d8fbb6dc9))
 - fix(eval): fix practical16 check false positives flagged by Greptile ([#1962](https://github.com/gptme/gptme/issues/1962)) ([`fa6febd9a`](https://github.com/gptme/gptme/commit/fa6febd9a))
 - fix(hooks): prevent AGENTS.md re-injection on CWD change in server mode ([#1959](https://github.com/gptme/gptme/issues/1959)) ([`c613c7593`](https://github.com/gptme/gptme/commit/c613c7593))
 - fix: add ValueError guards for env var int() parsing in anthropic and computer tools ([#1956](https://github.com/gptme/gptme/issues/1956)) ([`a129ec7cb`](https://github.com/gptme/gptme/commit/a129ec7cb))
 - fix(test): check Anthropic quota by API key presence, not MODEL env var ([#1955](https://github.com/gptme/gptme/issues/1955)) ([`daf02c9b6`](https://github.com/gptme/gptme/commit/daf02c9b6))
 - fix(logmanager): call write() after undo() to persist changes ([#1954](https://github.com/gptme/gptme/issues/1954)) ([`e59ed83e7`](https://github.com/gptme/gptme/commit/e59ed83e7))
 - fix(message): preserve quiet flag in Message.concat() ([#1953](https://github.com/gptme/gptme/issues/1953)) ([`949316ab7`](https://github.com/gptme/gptme/commit/949316ab7))
 - fix(subagent): use DEVNULL instead of PIPE to prevent deadlock ([#1952](https://github.com/gptme/gptme/issues/1952)) ([`c6885c494`](https://github.com/gptme/gptme/commit/c6885c494))
 - fix: config write loss, env prefix mismatch, chats lock, gh poll timeout ([#1951](https://github.com/gptme/gptme/issues/1951)) ([`b971b9b7a`](https://github.com/gptme/gptme/commit/b971b9b7a))
 - fix(logmanager): use is_absolute() instead of resolve() for logdir check ([#1950](https://github.com/gptme/gptme/issues/1950)) ([`d9dc0e8a2`](https://github.com/gptme/gptme/commit/d9dc0e8a2))
 - fix(computer): use API dimensions directly for screenshot resize ([#1949](https://github.com/gptme/gptme/issues/1949)) ([`96d4df926`](https://github.com/gptme/gptme/commit/96d4df926))
 - fix: pdf temp directory leak, tmux wait crash, include_paths crash guard ([#1948](https://github.com/gptme/gptme/issues/1948)) ([`19d7356f9`](https://github.com/gptme/gptme/commit/19d7356f9))
 - fix(codeblock): preserve fence length to prevent truncation assertion failure ([#1947](https://github.com/gptme/gptme/issues/1947)) ([`b51845ebb`](https://github.com/gptme/gptme/commit/b51845ebb))
 - fix(logmanager): use Path.relative_to() instead of string containment for logdir check ([#1946](https://github.com/gptme/gptme/issues/1946)) ([`cc4bb1b86`](https://github.com/gptme/gptme/commit/cc4bb1b86))
 - fix: tty file handle leak, vision temp file cleanup, and server TOCTOU race ([#1945](https://github.com/gptme/gptme/issues/1945)) ([`ba464915a`](https://github.com/gptme/gptme/commit/ba464915a))
 - fix(eval): remove phantom CSV columns and add Docker upload path traversal guard ([#1944](https://github.com/gptme/gptme/issues/1944)) ([`8469985ce`](https://github.com/gptme/gptme/commit/8469985ce))
 - fix(server): persist tool output to disk after execution ([#1943](https://github.com/gptme/gptme/issues/1943)) ([`ca3539be1`](https://github.com/gptme/gptme/commit/ca3539be1))
 - fix: register planner subagent before thread start and remove dead proxy_url branch ([#1942](https://github.com/gptme/gptme/issues/1942)) ([`d7e33c0f0`](https://github.com/gptme/gptme/commit/d7e33c0f0))
 - fix: fix Log.__repr__ bracket, command arg parsing, and read end_line check ([#1941](https://github.com/gptme/gptme/issues/1941)) ([`c555deb03`](https://github.com/gptme/gptme/commit/c555deb03))
 - fix: replace deprecated tempfile.mktemp() and fix patch size warning condition ([#1940](https://github.com/gptme/gptme/issues/1940)) ([`744166718`](https://github.com/gptme/gptme/commit/744166718))
 - fix(eval): add p.wait() after p.kill() to prevent zombie processes ([#1938](https://github.com/gptme/gptme/issues/1938)) ([`dfb7ffdf3`](https://github.com/gptme/gptme/commit/dfb7ffdf3))
 - fix(server): use .get() to prevent KeyError on concurrent pending_tools access ([#1937](https://github.com/gptme/gptme/issues/1937)) ([`0443906f5`](https://github.com/gptme/gptme/commit/0443906f5))
 - fix(server): snapshot session dict before iterating in cleanup ([#1935](https://github.com/gptme/gptme/issues/1935)) ([`7a323d888`](https://github.com/gptme/gptme/commit/7a323d888))
 - fix(server): send text chunks not individual characters in ACP SSE streaming ([#1934](https://github.com/gptme/gptme/issues/1934)) ([`8721842ba`](https://github.com/gptme/gptme/commit/8721842ba))
 - fix(openrouter): don't set require_parameters when reasoning is enabled ([#1933](https://github.com/gptme/gptme/issues/1933)) ([`6760b4cec`](https://github.com/gptme/gptme/commit/6760b4cec))
 - fix(webui): remove broken generic Cloud preset from multi-server registry ([#1926](https://github.com/gptme/gptme/issues/1926)) ([`1c9a0b79e`](https://github.com/gptme/gptme/commit/1c9a0b79e))
 - fix(server): persist visible generation errors ([#1920](https://github.com/gptme/gptme/issues/1920)) ([`86480967d`](https://github.com/gptme/gptme/commit/86480967d))
 - fix(webui): highlight Chat tab when on root path '/' ([#1914](https://github.com/gptme/gptme/issues/1914)) ([`c5a4b7b33`](https://github.com/gptme/gptme/commit/c5a4b7b33))
 - fix(webui): add mobile bottom navigation and fix desktop logo shift ([#1913](https://github.com/gptme/gptme/issues/1913)) ([`b1954b3c9`](https://github.com/gptme/gptme/commit/b1954b3c9))
 - fix(webui): use dynamic aria-label for mobile nav toggle ([#1911](https://github.com/gptme/gptme/issues/1911)) ([`9ab5d20d7`](https://github.com/gptme/gptme/commit/9ab5d20d7))
 - fix(webui): fix mobile navigation — add hamburger menu, prevent sidebar auto-open ([#1909](https://github.com/gptme/gptme/issues/1909)) ([`25b6346bf`](https://github.com/gptme/gptme/commit/25b6346bf))
 - fix(webui): fetch recommended models from API instead of hardcoding ([#1901](https://github.com/gptme/gptme/issues/1901)) ([`e1b6659c5`](https://github.com/gptme/gptme/commit/e1b6659c5))
 - fix(webui): serve attached files via correct API endpoint ([#1906](https://github.com/gptme/gptme/issues/1906)) ([`2abccb4dc`](https://github.com/gptme/gptme/commit/2abccb4dc))
 - fix(webui): preserve cross-server conversations with same id ([#1904](https://github.com/gptme/gptme/issues/1904)) ([`7d1605a01`](https://github.com/gptme/gptme/commit/7d1605a01))
 - fix(webui): fix duplicate message and step race in pendingFiles flow ([#1902](https://github.com/gptme/gptme/issues/1902)) ([`0618790fa`](https://github.com/gptme/gptme/commit/0618790fa))
 - fix(webui): remove asChild from ContextMenuTrigger wrapping Computed ([#1892](https://github.com/gptme/gptme/issues/1892)) ([`59db8b873`](https://github.com/gptme/gptme/commit/59db8b873))
 - fix(webui): add aria-label attributes to icon-only buttons ([#1889](https://github.com/gptme/gptme/issues/1889)) ([`90202f246`](https://github.com/gptme/gptme/commit/90202f246))
 - fix(webui): prevent scroll-to-bottom button flicker during smooth scroll ([#1888](https://github.com/gptme/gptme/issues/1888)) ([`164a7fee6`](https://github.com/gptme/gptme/commit/164a7fee6))
 - fix(webui): make scroll-to-bottom button reactive with use$() ([#1887](https://github.com/gptme/gptme/issues/1887)) ([`ad15a4104`](https://github.com/gptme/gptme/commit/ad15a4104))
 - fix(save): handle binary/non-UTF-8 files gracefully ([#1879](https://github.com/gptme/gptme/issues/1879)) ([`21d182e1d`](https://github.com/gptme/gptme/commit/21d182e1d))
 - fix: ensure python command is available in eval on macOS ([#1853](https://github.com/gptme/gptme/issues/1853)) ([`ecc02a63a`](https://github.com/gptme/gptme/commit/ecc02a63a))
 - fix(webui): asset detection breaks on query strings, causing HTML to be served as JS/CSS ([#1848](https://github.com/gptme/gptme/issues/1848)) ([`c53a9eca3`](https://github.com/gptme/gptme/commit/c53a9eca3))
 - fix: use --env-file for docker secrets instead of CLI args (CWE-214) ([#1832](https://github.com/gptme/gptme/issues/1832)) ([`67c55bbbb`](https://github.com/gptme/gptme/commit/67c55bbbb))
 - fix(gh): show leading omitted lines in run log extraction ([#1838](https://github.com/gptme/gptme/issues/1838)) ([`97c1befe2`](https://github.com/gptme/gptme/commit/97c1befe2))
 - fix(tests): keep FakePage reference for evaluate_calls assertions to satisfy mypy ([#1834](https://github.com/gptme/gptme/issues/1834)) ([`8340ca7c0`](https://github.com/gptme/gptme/commit/8340ca7c0))
 - fix(browser): preserve repo metadata on README parse errors ([`d050766ec`](https://github.com/gptme/gptme/commit/d050766ec))
 - fix(tests): prevent TemporaryDirectory resource leak in test_cli ([#1833](https://github.com/gptme/gptme/issues/1833)) ([`6971ac5ad`](https://github.com/gptme/gptme/commit/6971ac5ad))
 - fix(llm): forward max_tokens to openai-subscription provider ([#1830](https://github.com/gptme/gptme/issues/1830)) ([`883ecb8e4`](https://github.com/gptme/gptme/commit/883ecb8e4))
 - fix(eval): add 21 missing practical tests to leaderboard categorization ([#1822](https://github.com/gptme/gptme/issues/1822)) ([`6b83adcb4`](https://github.com/gptme/gptme/commit/6b83adcb4))
 - fix(eval): increase default timeout from 60s to 300s ([#1820](https://github.com/gptme/gptme/issues/1820)) ([`f81e15ebb`](https://github.com/gptme/gptme/commit/f81e15ebb))
 - fix(eval): increase default timeout from 30s to 60s ([#1819](https://github.com/gptme/gptme/issues/1819)) ([`c41a0b660`](https://github.com/gptme/gptme/commit/c41a0b660))
 - fix(eval): instruct agents to use relative paths in isolated workspace ([#1818](https://github.com/gptme/gptme/issues/1818)) ([`56ac4d187`](https://github.com/gptme/gptme/commit/56ac4d187))
 - fix(eval): restore fixture files before running eval checks ([#1815](https://github.com/gptme/gptme/issues/1815)) ([`9b2b0261d`](https://github.com/gptme/gptme/commit/9b2b0261d))
 - fix: use --env-file for docker secrets instead of CLI args (CWE-214) ([#1789](https://github.com/gptme/gptme/issues/1789)) ([`e6c3a9766`](https://github.com/gptme/gptme/commit/e6c3a9766))
 - fix(ci): replace bash 4+ lowercase syntax with POSIX-compatible tr ([#1806](https://github.com/gptme/gptme/issues/1806)) ([`c4114cfd3`](https://github.com/gptme/gptme/commit/c4114cfd3))
 - fix: improve error handling in SSE parsing, CLI args, and URL parsing ([#1804](https://github.com/gptme/gptme/issues/1804)) ([`1e6fbfe6e`](https://github.com/gptme/gptme/commit/1e6fbfe6e))
 - fix(shell): fix -executable false positive in is_allowlisted flag detection ([#1792](https://github.com/gptme/gptme/issues/1792)) ([`843898997`](https://github.com/gptme/gptme/commit/843898997))
 - fix: remove 6 type: ignore comments — batch 5 ([#1783](https://github.com/gptme/gptme/issues/1783)) ([`b851e3cb9`](https://github.com/gptme/gptme/commit/b851e3cb9))
 - fix(tests): gracefully skip tests when API quota exhausted mid-run ([#1778](https://github.com/gptme/gptme/issues/1778)) ([`c7cf7fcac`](https://github.com/gptme/gptme/commit/c7cf7fcac))
 - fix: remove 11 type: ignore comments — batch 4 ([#1777](https://github.com/gptme/gptme/issues/1777)) ([`43b7af0e8`](https://github.com/gptme/gptme/commit/43b7af0e8))
 - fix: remove 18 type: ignore comments — batch 3 ([#1775](https://github.com/gptme/gptme/issues/1775)) ([`6ee5aefd6`](https://github.com/gptme/gptme/commit/6ee5aefd6))
 - fix: remove 19 type: ignore comments with proper type fixes ([#1774](https://github.com/gptme/gptme/issues/1774)) ([`b31827057`](https://github.com/gptme/gptme/commit/b31827057))
 - fix(context): include dotfiles in rglob fallback listing ([#1770](https://github.com/gptme/gptme/issues/1770)) ([`59161e813`](https://github.com/gptme/gptme/commit/59161e813))
 - fix: improve type safety — remove 4 type: ignore comments ([#1769](https://github.com/gptme/gptme/issues/1769)) ([`38ff334af`](https://github.com/gptme/gptme/commit/38ff334af))
 - fix(config): preserve TOML formatting and comments on chat config save ([#1765](https://github.com/gptme/gptme/issues/1765)) ([`cd671c5bd`](https://github.com/gptme/gptme/commit/cd671c5bd))
 - fix(tests): use fully-qualified model names to prevent test pollution ([#1763](https://github.com/gptme/gptme/issues/1763)) ([`acfd5258b`](https://github.com/gptme/gptme/commit/acfd5258b))
 - fix(server): add cookie-based auth for SSE connections ([#1760](https://github.com/gptme/gptme/issues/1760)) ([`447447b3f`](https://github.com/gptme/gptme/commit/447447b3f))
 - fix(tests): properly isolate server v2 test from user config ([#1757](https://github.com/gptme/gptme/issues/1757)) ([`bc432757c`](https://github.com/gptme/gptme/commit/bc432757c))
 - fix(acp,llm): fail-closed permission checks + surface token refresh errors ([#1750](https://github.com/gptme/gptme/issues/1750)) ([`94cb4c08d`](https://github.com/gptme/gptme/commit/94cb4c08d))
 - fix(server): make shell cwd thread-safe for concurrent sessions ([#1749](https://github.com/gptme/gptme/issues/1749)) ([`f09d95552`](https://github.com/gptme/gptme/commit/f09d95552))
 - fix(tests): eliminate 250+ 'init() called twice' warning spam ([#1748](https://github.com/gptme/gptme/issues/1748)) ([`bf6f30858`](https://github.com/gptme/gptme/commit/bf6f30858))
 - fix(subagent): import Status type, remove dead threads list ([#1746](https://github.com/gptme/gptme/issues/1746)) ([`7c34383bf`](https://github.com/gptme/gptme/commit/7c34383bf))
 - fix(eval): make topo-sort checks dynamic — read graph from deps.json ([#1728](https://github.com/gptme/gptme/issues/1728)) ([`165b66cb7`](https://github.com/gptme/gptme/commit/165b66cb7))
 - fix(tests): fix flaky test_api_conversation_generate mock setup ([#1739](https://github.com/gptme/gptme/issues/1739)) ([`4fc9b174e`](https://github.com/gptme/gptme/commit/4fc9b174e))
 - fix(skills): address remaining quality issues in dependency declarations ([#1730](https://github.com/gptme/gptme/issues/1730)) ([`f0b32d668`](https://github.com/gptme/gptme/commit/f0b32d668))
 - fix(shell): decode bytes in final read of background job output ([#1726](https://github.com/gptme/gptme/issues/1726)) ([`01fc09859`](https://github.com/gptme/gptme/commit/01fc09859))
 - fix(models): add supports_parallel_tool_calls to openrouter/anthropic/claude-sonnet-4-6 ([#1725](https://github.com/gptme/gptme/issues/1725)) ([`050700af5`](https://github.com/gptme/gptme/commit/050700af5))
 - fix(browser): auto-select search backends with fallback ([#1721](https://github.com/gptme/gptme/issues/1721)) ([`ded1394e9`](https://github.com/gptme/gptme/commit/ded1394e9))
 - fix: stats timestamp fallback + add model/token/cost breakdown ([#1718](https://github.com/gptme/gptme/issues/1718)) ([`b660a7f0e`](https://github.com/gptme/gptme/commit/b660a7f0e))
 - fix(vision): add webp to allowed image file extensions ([#1717](https://github.com/gptme/gptme/issues/1717)) ([`7450a6adc`](https://github.com/gptme/gptme/commit/7450a6adc))
 - fix(tests): use subprocess isolation for flaky ACP stdout test ([#1715](https://github.com/gptme/gptme/issues/1715)) ([`fa3032502`](https://github.com/gptme/gptme/commit/fa3032502))
 - fix(eval): improve error robustness in eval runner ([#1714](https://github.com/gptme/gptme/issues/1714)) ([`5c39e64f2`](https://github.com/gptme/gptme/commit/5c39e64f2))
 - fix(eval-ci): detect fast-fail pattern as API quota exhaustion ([#1711](https://github.com/gptme/gptme/issues/1711)) ([`84c6f709f`](https://github.com/gptme/gptme/commit/84c6f709f))
 - fix(ci): version release artifacts ([#1710](https://github.com/gptme/gptme/issues/1710)) ([`387be21e2`](https://github.com/gptme/gptme/commit/387be21e2))
 - fix(chat): don't exit on complete when chained prompts remain ([#1707](https://github.com/gptme/gptme/issues/1707)) ([`bd1b07579`](https://github.com/gptme/gptme/commit/bd1b07579))
 - fix: keep tool descriptions within OpenAI's 1024-char limit ([`c2280ba8c`](https://github.com/gptme/gptme/commit/c2280ba8c))
 - fix(shell): use findall+last for return code parsing (Greptile follow-up from [#1672](https://github.com/gptme/gptme/issues/1672)) ([#1701](https://github.com/gptme/gptme/issues/1701)) ([`8dc0d6715`](https://github.com/gptme/gptme/commit/8dc0d6715))
 - fix(shell): preserve output when last line lacks trailing newline ([#1672](https://github.com/gptme/gptme/issues/1672)) ([`84dcbba2c`](https://github.com/gptme/gptme/commit/84dcbba2c))
 - fix(tokens): graceful fallback when tiktoken unavailable or offline ([#1675](https://github.com/gptme/gptme/issues/1675)) ([`d1cb27654`](https://github.com/gptme/gptme/commit/d1cb27654))
 - fix(tools): use itertext() in _iter_from_xml to prevent content truncation ([#1694](https://github.com/gptme/gptme/issues/1694)) ([`b7f8d1a7c`](https://github.com/gptme/gptme/commit/b7f8d1a7c))
 - fix: assorted bug fixes — wrong tool name, missing timeout, dead code, race guard ([#1677](https://github.com/gptme/gptme/issues/1677)) ([`5cd1332d7`](https://github.com/gptme/gptme/commit/5cd1332d7))
 - fix(eval): prevent user workspace config from contaminating eval agent prompts ([#1693](https://github.com/gptme/gptme/issues/1693)) ([`9954695d8`](https://github.com/gptme/gptme/commit/9954695d8))
 - fix(precommit): run checks on modified files only in TURN_POST hook ([#1667](https://github.com/gptme/gptme/issues/1667)) ([`0870f4bb9`](https://github.com/gptme/gptme/commit/0870f4bb9))
 - fix(tests): replace pytest-mock mocker fixture with unittest.mock ([#1673](https://github.com/gptme/gptme/issues/1673)) ([`b1e09f0ea`](https://github.com/gptme/gptme/commit/b1e09f0ea))
 - fix(codeblock): handle `</thinking>` end tag (gemini uses it instead of `</think>`) ([#1691](https://github.com/gptme/gptme/issues/1691)) ([`9ee3c6829`](https://github.com/gptme/gptme/commit/9ee3c6829))
 - fix(prompts): pass workspace to prompt_systeminfo for correct Working Directory ([`73c3d28b7`](https://github.com/gptme/gptme/commit/73c3d28b7))
 - fix(llm): prevent double-wrapped `<think>` tags when both reasoning mechanisms fire ([#1689](https://github.com/gptme/gptme/issues/1689)) ([`04f1a6f34`](https://github.com/gptme/gptme/commit/04f1a6f34))
 - fix(llm): handle reasoning content in openai-subscription stream ([`556bde01d`](https://github.com/gptme/gptme/commit/556bde01d))
 - fix(models): update Claude 4.6 context window to 1M (GA) ([#1674](https://github.com/gptme/gptme/issues/1674)) ([`2bfece86d`](https://github.com/gptme/gptme/commit/2bfece86d))
 - fix: replace bare except clauses and unclosed file handle ([#1670](https://github.com/gptme/gptme/issues/1670)) ([`9400dff9f`](https://github.com/gptme/gptme/commit/9400dff9f))
 - fix(types): resolve mypy errors in chats tool and gh tests ([#1669](https://github.com/gptme/gptme/issues/1669)) ([`e17eb06dc`](https://github.com/gptme/gptme/commit/e17eb06dc))
 - fix(tests): mark test_python and test_python_error as slow ([#1671](https://github.com/gptme/gptme/issues/1671)) ([`9b1d7a3fc`](https://github.com/gptme/gptme/commit/9b1d7a3fc))
 - fix(server): replace assertions with explicit error checks in production code ([#1681](https://github.com/gptme/gptme/issues/1681)) ([`e752f2aef`](https://github.com/gptme/gptme/commit/e752f2aef))
 - fix(tools): graceful degradation for unavailable tools in server context ([#1680](https://github.com/gptme/gptme/issues/1680)) ([`d4da97051`](https://github.com/gptme/gptme/commit/d4da97051))
 - fix(eval): close file handle in SWEBenchInfo.save_to_log_dir ([#1668](https://github.com/gptme/gptme/issues/1668)) ([`7cad79dff`](https://github.com/gptme/gptme/commit/7cad79dff))
 - fix(server): close TOCTOU race on acp_runtime in step request handler ([#1666](https://github.com/gptme/gptme/issues/1666)) ([`73f84f263`](https://github.com/gptme/gptme/commit/73f84f263))
 - fix(server): guard acp_runtime None in _acp_step finally block ([#1664](https://github.com/gptme/gptme/issues/1664)) ([`953ef0055`](https://github.com/gptme/gptme/commit/953ef0055))
 - fix(eval): rename duplicate write-tests to avoid name collision ([#1663](https://github.com/gptme/gptme/issues/1663)) ([`cce683d25`](https://github.com/gptme/gptme/commit/cce683d25))
 - fix(tools): pass tool_format to all .to_output() calls in examples ([#1650](https://github.com/gptme/gptme/issues/1650)) ([`fafbb36b4`](https://github.com/gptme/gptme/commit/fafbb36b4))
 - fix(tools): prevent content from leaking into unrelated ToolUse parameters ([#1646](https://github.com/gptme/gptme/issues/1646)) ([`94ce6e032`](https://github.com/gptme/gptme/commit/94ce6e032))
 - fix(eval/dspy): handle empty messages gracefully in tool_usage_metric ([#1642](https://github.com/gptme/gptme/issues/1642)) ([`3cf20a913`](https://github.com/gptme/gptme/commit/3cf20a913))
 - fix(release): poetry via pipx, upload retry, Docker tag policy ([#1641](https://github.com/gptme/gptme/issues/1641)) ([`4a8c0b350`](https://github.com/gptme/gptme/commit/4a8c0b350))
 - fix(release): don't block dev releases on flaky API test failures ([#1639](https://github.com/gptme/gptme/issues/1639)) ([`9626e8be5`](https://github.com/gptme/gptme/commit/9626e8be5))
 - fix(models): proper metadata for openai-subscription models ([#1637](https://github.com/gptme/gptme/issues/1637)) ([`9bdcac233`](https://github.com/gptme/gptme/commit/9bdcac233))
 - fix(eval/dspy): handle API quota exhaustion gracefully in optimize workflow ([#1628](https://github.com/gptme/gptme/issues/1628)) ([`910503855`](https://github.com/gptme/gptme/commit/910503855))
 - fix(docs): extend RST title underlines for wide emoji characters ([#1631](https://github.com/gptme/gptme/issues/1631)) ([`2ea96458f`](https://github.com/gptme/gptme/commit/2ea96458f))
 - fix(shell): do not process backslash escapes inside single quotes ([#1624](https://github.com/gptme/gptme/issues/1624)) ([`7004680f6`](https://github.com/gptme/gptme/commit/7004680f6))
 - fix(util): fix parameter shadowing and add empty-list guards ([#1605](https://github.com/gptme/gptme/issues/1605)) ([`c3c8cdaaf`](https://github.com/gptme/gptme/commit/c3c8cdaaf))
 - fix(lessons): deduplicate same-named lessons across directories ([#1594](https://github.com/gptme/gptme/issues/1594)) ([`aff8fd515`](https://github.com/gptme/gptme/commit/aff8fd515))
 - fix(tauri): add webui npm install to tauri-dev target ([`297a7af41`](https://github.com/gptme/gptme/commit/297a7af41))
 - fix(tauri): use real PyInstaller sidecar in release CI instead of placeholder ([`99ae4dde3`](https://github.com/gptme/gptme/commit/99ae4dde3))
 - fix(tauri): pre-commit paths relative to tauri/, gptme.toml no agent, tauri-dev sidecar placeholder ([`69a6d116f`](https://github.com/gptme/gptme/commit/69a6d116f))
 - fix(tauri): ensure venv exists before uv pip install, add deb to Linux CI build ([`27d9ab449`](https://github.com/gptme/gptme/commit/27d9ab449))
 - fix(test): increase timeout for test_create_template_mode_e2e to 120s ([`092b8c3ef`](https://github.com/gptme/gptme/commit/092b8c3ef))
 - fix(tauri): platform-specific CORS, capability path, pre-commit config, gptme.toml ([`4f5ed21ad`](https://github.com/gptme/gptme/commit/4f5ed21ad))
 - fix(tauri): install pyinstaller before running it in build-sidecar.sh ([`cbc3ef124`](https://github.com/gptme/gptme/commit/cbc3ef124))
 - fix(tauri): address remaining Greptile review feedback ([`3370adbab`](https://github.com/gptme/gptme/commit/3370adbab))
 - fix(ci): use platform-specific bundle args for build job ([`e7c285956`](https://github.com/gptme/gptme/commit/e7c285956))
 - fix(tauri-ci): skip DMG bundling in build job to fix macOS CI ([`5b2492934`](https://github.com/gptme/gptme/commit/5b2492934))
 - fix(tauri): address Greptile review feedback ([`2f247a906`](https://github.com/gptme/gptme/commit/2f247a906))
 - fix(ci): add placeholder icons to build/release jobs before icon generation ([`95f78632e`](https://github.com/gptme/gptme/commit/95f78632e))
 - fix(tauri): correct frontendDist path for monorepo layout ([`0695c4398`](https://github.com/gptme/gptme/commit/0695c4398))
 - fix: use diff syntax highlighting for save/append previews ([#1585](https://github.com/gptme/gptme/issues/1585)) ([`92584a49e`](https://github.com/gptme/gptme/commit/92584a49e))
 - fix: perplexity search now reads keys from config.local.toml ([#1584](https://github.com/gptme/gptme/issues/1584)) ([`0f5bef4ea`](https://github.com/gptme/gptme/commit/0f5bef4ea))
 - fix(lessons): inject keyword count instead of text to prevent self-referential corpus matches ([#1581](https://github.com/gptme/gptme/issues/1581)) ([`97a90309d`](https://github.com/gptme/gptme/commit/97a90309d))
 - fix(gh): add multi-line comment guidance to prevent literal \n in posts ([#1572](https://github.com/gptme/gptme/issues/1572)) ([`0fe7e7fdb`](https://github.com/gptme/gptme/commit/0fe7e7fdb))
 - fix(server): validate auto_confirm type in v2 step request ([#1571](https://github.com/gptme/gptme/issues/1571)) ([`6b1faf80c`](https://github.com/gptme/gptme/commit/6b1faf80c))
 - fix(server): validate use_acp as boolean in v2 step request ([#1569](https://github.com/gptme/gptme/issues/1569)) ([`13f0e4369`](https://github.com/gptme/gptme/commit/13f0e4369))
 - fix(release): fix oversized changelog from unreachable dev tags, add truncation guard ([#1567](https://github.com/gptme/gptme/issues/1567)) ([`7b84f7431`](https://github.com/gptme/gptme/commit/7b84f7431))
 - fix: improve error handling and resource cleanup across tools ([#1565](https://github.com/gptme/gptme/issues/1565)) ([`6a5ae8813`](https://github.com/gptme/gptme/commit/6a5ae8813))
 - fix(codeblock): prevent premature block extraction in streaming mode ([#1564](https://github.com/gptme/gptme/issues/1564)) ([`136bc14d3`](https://github.com/gptme/gptme/commit/136bc14d3))
 - fix(tools): pass instructions to ToolSpec in vision and subagent tools ([#1562](https://github.com/gptme/gptme/issues/1562)) ([`951015418`](https://github.com/gptme/gptme/commit/951015418))
 - fix(context): use plain git status instead of -vv ([#1561](https://github.com/gptme/gptme/issues/1561)) ([`b8cadbf4d`](https://github.com/gptme/gptme/commit/b8cadbf4d))
 - fix(chats): escape regex in search highlight and fix repr'd output ([#1557](https://github.com/gptme/gptme/issues/1557)) ([`0b4c9a188`](https://github.com/gptme/gptme/commit/0b4c9a188))
 - fix(release): skip branch push for pre-releases to avoid branch protection ([#1548](https://github.com/gptme/gptme/issues/1548)) ([`3fe1da788`](https://github.com/gptme/gptme/commit/3fe1da788))
 - fix(deps): bump pypdf minimum to >=6.7.3 for security fixes ([`9dca32aa3`](https://github.com/gptme/gptme/commit/9dca32aa3))
 - fix(test): configure pytest-asyncio and add as explicit dependency ([#1538](https://github.com/gptme/gptme/issues/1538)) ([`3652f064c`](https://github.com/gptme/gptme/commit/3652f064c))
 - fix(docker): optimize image size and add CI size tracking ([#1524](https://github.com/gptme/gptme/issues/1524)) ([`c54fd7f7e`](https://github.com/gptme/gptme/commit/c54fd7f7e))
 - fix(hooks): resolve prompt file paths relative to agent's CWD ([#1531](https://github.com/gptme/gptme/issues/1531)) ([`018406eb7`](https://github.com/gptme/gptme/commit/018406eb7))
 - fix(tests): make test_shell_file resilient to output ordering ([#1522](https://github.com/gptme/gptme/issues/1522)) ([`bfa8f4ea2`](https://github.com/gptme/gptme/commit/bfa8f4ea2))
 - fix(webui): resolve high-severity npm vulnerabilities ([#1526](https://github.com/gptme/gptme/issues/1526)) ([`59090b10f`](https://github.com/gptme/gptme/commit/59090b10f))
 - fix: write RESUME.md to logdir instead of workspace ([#1514](https://github.com/gptme/gptme/issues/1514)) ([`58b9b2017`](https://github.com/gptme/gptme/commit/58b9b2017))
 - fix: use quad backticks for tool output codeblocks ([#1507](https://github.com/gptme/gptme/issues/1507)) ([`4e90fe895`](https://github.com/gptme/gptme/commit/4e90fe895))
 - fix(hooks): filter lockfiles and add token budget to active context ([#1499](https://github.com/gptme/gptme/issues/1499)) ([`bf9472161`](https://github.com/gptme/gptme/commit/bf9472161))
 - fix: remove stale xfail, register xdist_group marker, close socket in tts ([#1497](https://github.com/gptme/gptme/issues/1497)) ([`9f39db7f3`](https://github.com/gptme/gptme/commit/9f39db7f3))
 - fix: cleanup test assertions, typo, and memory-efficient msg counting ([#1496](https://github.com/gptme/gptme/issues/1496)) ([`f8ef5b7e2`](https://github.com/gptme/gptme/commit/f8ef5b7e2))
 - fix(subagent): subprocess mode fixes for profiles ([#1495](https://github.com/gptme/gptme/issues/1495)) ([`ce5a7da23`](https://github.com/gptme/gptme/commit/ce5a7da23))
 - fix(prompt): strip System outputs from tool examples to prevent hallucination ([#1490](https://github.com/gptme/gptme/issues/1490)) ([`e2c9705ce`](https://github.com/gptme/gptme/commit/e2c9705ce))
 - fix(screenshot): add availability check for screenshot tools ([#1488](https://github.com/gptme/gptme/issues/1488)) ([`76daa97de`](https://github.com/gptme/gptme/commit/76daa97de))
 - fix(server): always chdir to workspace at step start ([#1400](https://github.com/gptme/gptme/issues/1400)) ([`d2cef9427`](https://github.com/gptme/gptme/commit/d2cef9427))
 - fix(util): correct pytest detection and codeblock XML roundtrip ([#1485](https://github.com/gptme/gptme/issues/1485)) ([`94de63494`](https://github.com/gptme/gptme/commit/94de63494))
 - fix(server): fix unreachable model fallback and consistent msg2dict serialization ([#1484](https://github.com/gptme/gptme/issues/1484)) ([`a7143f7ac`](https://github.com/gptme/gptme/commit/a7143f7ac))
 - fix(context): fix missing separator and inverted error handling in path parsing ([#1474](https://github.com/gptme/gptme/issues/1474)) ([`17449863e`](https://github.com/gptme/gptme/commit/17449863e))
 - fix(logmanager): use .exists() for conversation.jsonl path check ([#1478](https://github.com/gptme/gptme/issues/1478)) ([`f3ff8e938`](https://github.com/gptme/gptme/commit/f3ff8e938))
 - fix(browser): add missing return path in read_url ([#1482](https://github.com/gptme/gptme/issues/1482)) ([`02abaa7e9`](https://github.com/gptme/gptme/commit/02abaa7e9))
 - fix(computer): implement proper macOS left_click_drag using cliclick dd/du ([#1479](https://github.com/gptme/gptme/issues/1479)) ([`a7cbe5960`](https://github.com/gptme/gptme/commit/a7cbe5960))
 - fix(tools): add path resolution and traversal protection to append and morph ([#1475](https://github.com/gptme/gptme/issues/1475)) ([`86e931bf9`](https://github.com/gptme/gptme/commit/86e931bf9))
 - fix(reduce): handle all-pinned messages in reduce_log ([#1480](https://github.com/gptme/gptme/issues/1480)) ([`a4cc63ea0`](https://github.com/gptme/gptme/commit/a4cc63ea0))
 - fix(cli): improve error messages and log levels for better UX ([#1476](https://github.com/gptme/gptme/issues/1476)) ([`7fd5e075e`](https://github.com/gptme/gptme/commit/7fd5e075e))
 - fix(subagent): use correct Status type in notify_completion and reap killed processes ([#1477](https://github.com/gptme/gptme/issues/1477)) ([`a74e55f8d`](https://github.com/gptme/gptme/commit/a74e55f8d))
 - fix(models): add recommended defaults for deepseek, groq, openai-subscription ([#1473](https://github.com/gptme/gptme/issues/1473)) ([`4c40e1e1a`](https://github.com/gptme/gptme/commit/4c40e1e1a))
 - fix(profiles): correct tools=[] display and broaden type validation ([#1483](https://github.com/gptme/gptme/issues/1483)) ([`2fdb1ea44`](https://github.com/gptme/gptme/commit/2fdb1ea44))
 - fix(tmux): remove check=True to let error messages display in kill_session ([#1481](https://github.com/gptme/gptme/issues/1481)) ([`41f182a26`](https://github.com/gptme/gptme/commit/41f182a26))
 - fix(tools): skip tool call parsing inside markdown codeblocks ([#1472](https://github.com/gptme/gptme/issues/1472)) ([`e53ea3d01`](https://github.com/gptme/gptme/commit/e53ea3d01))
 - fix(browser): fix Google search consent banner bypass in lynx ([#1380](https://github.com/gptme/gptme/issues/1380)) ([`0ef877010`](https://github.com/gptme/gptme/commit/0ef877010))
 - fix(profiles): reject string tools field with clear error ([#1471](https://github.com/gptme/gptme/issues/1471)) ([`d46255ff7`](https://github.com/gptme/gptme/commit/d46255ff7))
 - fix(agent): set default git identity for workspace creation ([#1470](https://github.com/gptme/gptme/issues/1470)) ([`2713d6b01`](https://github.com/gptme/gptme/commit/2713d6b01))
 - fix(test): set git identity in agent create E2E test for CI ([`0fb6494f7`](https://github.com/gptme/gptme/commit/0fb6494f7))
 - fix: server cleanup bug, modernize CI, update deps ([#10](https://github.com/gptme/gptme/issues/10)) ([`3b7393442`](https://github.com/gptme/gptme/commit/3b7393442))
 - fix(python): don't set NO_COLOR globally, it breaks Rich colors ([`53fdded53`](https://github.com/gptme/gptme/commit/53fdded53))
 - fix(subagent): hard-enforce profile tool restrictions at execution level ([#1460](https://github.com/gptme/gptme/issues/1460)) ([`ded8a8136`](https://github.com/gptme/gptme/commit/ded8a8136))
 - fix: use specific exception handlers and lazy logging ([#1459](https://github.com/gptme/gptme/issues/1459)) ([`70aedae4e`](https://github.com/gptme/gptme/commit/70aedae4e))
 - fix(context): exclude paths inside XML tags from context extraction ([#1445](https://github.com/gptme/gptme/issues/1445)) ([`a72599034`](https://github.com/gptme/gptme/commit/a72599034))
 - fix(acp): prevent GC of fire-and-forget asyncio tasks + sort __all__ ([#1456](https://github.com/gptme/gptme/issues/1456)) ([`0d60b1266`](https://github.com/gptme/gptme/commit/0d60b1266))
 - fix(llm): prevent empty text content that breaks Z.AI/GLM via OpenRouter ([#1444](https://github.com/gptme/gptme/issues/1444)) ([`aec3372e8`](https://github.com/gptme/gptme/commit/aec3372e8))
 - fix(codeblock): fix streaming parser nesting for bare backticks ([#1429](https://github.com/gptme/gptme/issues/1429)) ([`621303cb8`](https://github.com/gptme/gptme/commit/621303cb8))
 - fix(acp): remove slash prefix from advertised command names ([#1438](https://github.com/gptme/gptme/issues/1438)) ([`c9d923818`](https://github.com/gptme/gptme/commit/c9d923818))
 - fix: add timezone awareness to all datetime calls ([#1433](https://github.com/gptme/gptme/issues/1433)) ([`051ed1df6`](https://github.com/gptme/gptme/commit/051ed1df6))
 - fix: remove unused dep, fix RAG post-process bug, clean type ignores ([#1428](https://github.com/gptme/gptme/issues/1428)) ([`157c5117b`](https://github.com/gptme/gptme/commit/157c5117b))
 - fix(acp): defer session-open notifications to after NewSessionResponse ([#1420](https://github.com/gptme/gptme/issues/1420)) ([`459bd0107`](https://github.com/gptme/gptme/commit/459bd0107))
 - fix(acp): return None from load_session instead of raising NotImplementedError ([#1419](https://github.com/gptme/gptme/issues/1419)) ([`d77df7720`](https://github.com/gptme/gptme/commit/d77df7720))
 - fix(acp): resend AvailableCommandsUpdate on first prompt() to fix Zed race condition ([#1412](https://github.com/gptme/gptme/issues/1412)) ([`df3021089`](https://github.com/gptme/gptme/commit/df3021089))
 - fix(auth): don't truncate OAuth URL in fallback message ([#1414](https://github.com/gptme/gptme/issues/1414)) ([`4ed5152ce`](https://github.com/gptme/gptme/commit/4ed5152ce))
 - fix(agent): replace template strings in gptme-agent create ([#1413](https://github.com/gptme/gptme/issues/1413)) ([`cf592b0ff`](https://github.com/gptme/gptme/commit/cf592b0ff))
 - fix(logmanager,tmux): prevent crashes on undo overflow and send-keys missing args ([#1390](https://github.com/gptme/gptme/issues/1390)) ([`3795f5483`](https://github.com/gptme/gptme/commit/3795f5483))
 - fix(acp): include gptme version in ACP agent startup log ([#1410](https://github.com/gptme/gptme/issues/1410)) ([`65f4a8511`](https://github.com/gptme/gptme/commit/65f4a8511))
 - fix(acp): replace assert guards with explicit runtime checks ([#1399](https://github.com/gptme/gptme/issues/1399)) ([`031cade81`](https://github.com/gptme/gptme/commit/031cade81))
 - fix(todo): allow setting paused state on todo items ([#1405](https://github.com/gptme/gptme/issues/1405)) ([`9138a12d1`](https://github.com/gptme/gptme/commit/9138a12d1))
 - fix(models): update Anthropic model metadata per official docs ([#1409](https://github.com/gptme/gptme/issues/1409)) ([`1cebda747`](https://github.com/gptme/gptme/commit/1cebda747))
 - fix: duplicate name entry, explicit encoding, simplified exception ([#1401](https://github.com/gptme/gptme/issues/1401)) ([`564c6edd3`](https://github.com/gptme/gptme/commit/564c6edd3))
 - fix(acp): guard session_update calls against null connection in prompt() ([#1406](https://github.com/gptme/gptme/issues/1406)) ([`fac950499`](https://github.com/gptme/gptme/commit/fac950499))
 - fix(context): use proper type annotations in config dataclasses ([#1402](https://github.com/gptme/gptme/issues/1402)) ([`8d1079499`](https://github.com/gptme/gptme/commit/8d1079499))
 - fix(acp): handle slash commands with actual execution (closes [#1393](https://github.com/gptme/gptme/issues/1393)) ([#1394](https://github.com/gptme/gptme/issues/1394)) ([`5ab0b4ff3`](https://github.com/gptme/gptme/commit/5ab0b4ff3))
 - fix(server): prevent IndexError on bare slash command and use immutable Log API ([#1388](https://github.com/gptme/gptme/issues/1388)) ([`5afb19b0b`](https://github.com/gptme/gptme/commit/5afb19b0b))
 - fix(logmanager): prevent data loss when writing on compacted view branch ([#1389](https://github.com/gptme/gptme/issues/1389)) ([`251ef49dd`](https://github.com/gptme/gptme/commit/251ef49dd))
 - fix: remove debug print statements from util and anthropic modules ([#1386](https://github.com/gptme/gptme/issues/1386)) ([`77988a8c7`](https://github.com/gptme/gptme/commit/77988a8c7))
 - fix: resolve morph duplication, off-by-one count, and dead code ([#1384](https://github.com/gptme/gptme/issues/1384)) ([`7c7e379e8`](https://github.com/gptme/gptme/commit/7c7e379e8))
 - fix(browser): implement lynx cookie support, fix model metadata ([#1377](https://github.com/gptme/gptme/issues/1377)) ([`dc196c0a0`](https://github.com/gptme/gptme/commit/dc196c0a0))
 - fix: add requires-python to project metadata ([#1376](https://github.com/gptme/gptme/issues/1376)) ([`8a7929973`](https://github.com/gptme/gptme/commit/8a7929973))
 - fix: code quality follow-ups (lambda assignments, assert validation) ([#1371](https://github.com/gptme/gptme/issues/1371)) ([`d5de79ac4`](https://github.com/gptme/gptme/commit/d5de79ac4))
 - fix(webui): resolve npm security vulnerabilities ([#1373](https://github.com/gptme/gptme/issues/1373)) ([`088f269d1`](https://github.com/gptme/gptme/commit/088f269d1))
 - fix(tests): use tmp_path fixture to avoid parallel test interference ([#1372](https://github.com/gptme/gptme/issues/1372)) ([`f78133cd7`](https://github.com/gptme/gptme/commit/f78133cd7))
 - fix(acp): add session cleanup to prevent unbounded memory growth ([#1368](https://github.com/gptme/gptme/issues/1368)) ([`ff2fcbdb2`](https://github.com/gptme/gptme/commit/ff2fcbdb2))
 - fix: replace assert with proper validation in server and shell ([#1366](https://github.com/gptme/gptme/issues/1366)) ([`7b9e2ae01`](https://github.com/gptme/gptme/commit/7b9e2ae01))
 - fix(logmanager): handle malformed JSON lines gracefully in JSONL reader ([#1364](https://github.com/gptme/gptme/issues/1364)) ([`e4f3f8ce7`](https://github.com/gptme/gptme/commit/e4f3f8ce7))
 - fix(llm): strip @provider suffix in non-streaming chat path ([#1363](https://github.com/gptme/gptme/issues/1363)) ([`b98a76429`](https://github.com/gptme/gptme/commit/b98a76429))
 - fix(acp): use per-session model from project gptme.toml ([#1360](https://github.com/gptme/gptme/issues/1360)) ([`b33879b42`](https://github.com/gptme/gptme/commit/b33879b42))
 - fix: guard Unix-only imports for Windows compatibility ([#1357](https://github.com/gptme/gptme/issues/1357)) ([`e6e77849f`](https://github.com/gptme/gptme/commit/e6e77849f))
 - fix(logmanager): check only last assistant message to prevent pre-commit loops ([#1358](https://github.com/gptme/gptme/issues/1358)) ([`41634ba96`](https://github.com/gptme/gptme/commit/41634ba96))
 - fix(subagent): capture workspace before spawning planner threads ([#1356](https://github.com/gptme/gptme/issues/1356)) ([`9dd547e24`](https://github.com/gptme/gptme/commit/9dd547e24))
 - fix(acp): surface init error proactively in new_session via session/update ([#1355](https://github.com/gptme/gptme/issues/1355)) ([`e9ccc1061`](https://github.com/gptme/gptme/commit/e9ccc1061))
 - fix(shell): don't use start_new_session in TTY path ([#1352](https://github.com/gptme/gptme/issues/1352)) ([`4771cf0a4`](https://github.com/gptme/gptme/commit/4771cf0a4))
 - fix(llm): add missing Claude 4.x model aliases ([#1347](https://github.com/gptme/gptme/issues/1347)) ([`2dabee163`](https://github.com/gptme/gptme/commit/2dabee163))
 - fix(llm): mark claude-3-opus-latest as deprecated ([#1346](https://github.com/gptme/gptme/issues/1346)) ([`e7b50e4f4`](https://github.com/gptme/gptme/commit/e7b50e4f4))
 - fix: clean up type ignores and fix browser element selector ([#1344](https://github.com/gptme/gptme/issues/1344)) ([`e87201a60`](https://github.com/gptme/gptme/commit/e87201a60))
 - fix(shell): restore interactive sudo support in interactive mode ([#1288](https://github.com/gptme/gptme/issues/1288)) ([`e79ff6e9f`](https://github.com/gptme/gptme/commit/e79ff6e9f))
 - fix(llm): correct GPT-4.1 knowledge cutoff to June 2024 ([#1342](https://github.com/gptme/gptme/issues/1342)) ([`b6dd2b486`](https://github.com/gptme/gptme/commit/b6dd2b486))
 - fix(chat): improve thread safety and None guard in auto-naming ([#1341](https://github.com/gptme/gptme/issues/1341)) ([`5caa7b2d6`](https://github.com/gptme/gptme/commit/5caa7b2d6))
 - fix(acp): surface init errors as agent messages instead of killing connection ([#1319](https://github.com/gptme/gptme/issues/1319)) ([`6be28f078`](https://github.com/gptme/gptme/commit/6be28f078))
 - fix(llm): add missing -latest model aliases for Anthropic ([#1337](https://github.com/gptme/gptme/issues/1337)) ([`d225c5987`](https://github.com/gptme/gptme/commit/d225c5987))
 - fix(llm): add GPT-5.3-Codex and Codex-Spark to subscription models ([#1336](https://github.com/gptme/gptme/issues/1336)) ([`c0303c070`](https://github.com/gptme/gptme/commit/c0303c070))
 - fix(llm): add missing Gemini model entries (3-pro-preview, 2.0-flash) ([#1334](https://github.com/gptme/gptme/issues/1334)) ([`dc3fc5783`](https://github.com/gptme/gptme/commit/dc3fc5783))
 - fix(llm): fix tools API detection for custom providers ([#1331](https://github.com/gptme/gptme/issues/1331)) ([`7913cf03f`](https://github.com/gptme/gptme/commit/7913cf03f))
 - fix(logmanager): check all messages for modifications, not just first 3 ([#1329](https://github.com/gptme/gptme/issues/1329)) ([`8056c261a`](https://github.com/gptme/gptme/commit/8056c261a))
 - fix(llm): update model metadata (xAI, Gemini 3, Anthropic) ([#1328](https://github.com/gptme/gptme/issues/1328)) ([`2d0f510a6`](https://github.com/gptme/gptme/commit/2d0f510a6))
 - fix(tests): restore xfail on test_shell_file (flaky in CI) ([#1327](https://github.com/gptme/gptme/issues/1327)) ([`ed1f89282`](https://github.com/gptme/gptme/commit/ed1f89282))
 - fix(message): drop timestamp from Message equality, add consistent __hash__ ([#1326](https://github.com/gptme/gptme/issues/1326)) ([`cca9c02df`](https://github.com/gptme/gptme/commit/cca9c02df))
 - fix(tests): remove stale xfail from test_shell_file ([#1325](https://github.com/gptme/gptme/issues/1325)) ([`5bad61022`](https://github.com/gptme/gptme/commit/5bad61022))
 - fix(tests): register flaky and integration pytest markers ([`bf6fc46a4`](https://github.com/gptme/gptme/commit/bf6fc46a4))
 - fix(tests): isolate server v2 test from user config ([#1323](https://github.com/gptme/gptme/issues/1323)) ([`29d012f9c`](https://github.com/gptme/gptme/commit/29d012f9c))
 - fix(types): add specific error codes to all bare type: ignore comments ([#1320](https://github.com/gptme/gptme/issues/1320)) ([`734a5ca4b`](https://github.com/gptme/gptme/commit/734a5ca4b))
 - fix(types): add mypy overrides for optional deps (dspy, playwright) ([#1322](https://github.com/gptme/gptme/issues/1322)) ([`d97cb22d7`](https://github.com/gptme/gptme/commit/d97cb22d7))
 - fix(llm): correct gemini-2.5-pro max_output from 8192 to 65536 ([#1321](https://github.com/gptme/gptme/issues/1321)) ([`9813091a6`](https://github.com/gptme/gptme/commit/9813091a6))
 - fix(acp): resolve model from config instead of hardcoding Anthropic default ([#1317](https://github.com/gptme/gptme/issues/1317)) ([`e9cd4842f`](https://github.com/gptme/gptme/commit/e9cd4842f))
 - fix(tmux): handle list-sessions failure gracefully instead of asserting ([#1318](https://github.com/gptme/gptme/issues/1318)) ([`0cfb732f0`](https://github.com/gptme/gptme/commit/0cfb732f0))
 - fix(tools): add specific error codes to bare type-ignore and noqa comments ([#1312](https://github.com/gptme/gptme/issues/1312)) ([`9a101ba8c`](https://github.com/gptme/gptme/commit/9a101ba8c))
 - fix(dirs): move readline history from config dir to data dir ([#1310](https://github.com/gptme/gptme/issues/1310)) ([`22d3f65e4`](https://github.com/gptme/gptme/commit/22d3f65e4))
 - fix(agent): create clean git history for new workspaces ([#1308](https://github.com/gptme/gptme/issues/1308)) ([`edfe4b494`](https://github.com/gptme/gptme/commit/edfe4b494))
 - fix(python): disable colors at source instead of only stripping ANSI ([#1309](https://github.com/gptme/gptme/issues/1309)) ([`779b0ad9e`](https://github.com/gptme/gptme/commit/779b0ad9e))
 - fix(acp): re-set default model for cross-task ContextVar isolation ([#1300](https://github.com/gptme/gptme/issues/1300)) ([`06aac4df9`](https://github.com/gptme/gptme/commit/06aac4df9))
 - fix(hooks): remove unnecessary type: ignore and fix cast import style ([#1302](https://github.com/gptme/gptme/issues/1302)) ([`f034baddb`](https://github.com/gptme/gptme/commit/f034baddb))
 - fix(webui): rename env vars to use VITE_GPTME_ prefix ([#1307](https://github.com/gptme/gptme/issues/1307)) ([`1bf38e4bb`](https://github.com/gptme/gptme/commit/1bf38e4bb))
 - fix(shell): use current model for tokenizer in output truncation ([#1305](https://github.com/gptme/gptme/issues/1305)) ([`9d0074475`](https://github.com/gptme/gptme/commit/9d0074475))
 - fix(logmanager): persist main branch when writing from non-main branch ([#1299](https://github.com/gptme/gptme/issues/1299)) ([`6262316b6`](https://github.com/gptme/gptme/commit/6262316b6))
 - fix(doctor): handle OAuth-based providers in diagnostics ([#1297](https://github.com/gptme/gptme/issues/1297)) ([`2c7e32593`](https://github.com/gptme/gptme/commit/2c7e32593))
 - fix(tests): skip tests when optional deps/API keys unavailable ([#1298](https://github.com/gptme/gptme/issues/1298)) ([`1a2bfb127`](https://github.com/gptme/gptme/commit/1a2bfb127))
 - fix(tree): remove tree command dependency, fall back to git ls-files ([#1284](https://github.com/gptme/gptme/issues/1284)) ([`d6670dcf8`](https://github.com/gptme/gptme/commit/d6670dcf8))
 - fix(tests): use correct field name option_id in ACP test helper ([#1296](https://github.com/gptme/gptme/issues/1296)) ([`1db5095da`](https://github.com/gptme/gptme/commit/1db5095da))
 - fix(acp): propagate ContextVars to executor thread in prompt handler ([#1293](https://github.com/gptme/gptme/issues/1293)) ([`e7c242518`](https://github.com/gptme/gptme/commit/e7c242518))
 - fix(acp): handle Pydantic TextContentBlock in content conversion ([#1291](https://github.com/gptme/gptme/issues/1291)) ([`c30f86e4c`](https://github.com/gptme/gptme/commit/c30f86e4c))
 - fix(doctor): add missing provider docs for gemini, azure ([#1286](https://github.com/gptme/gptme/issues/1286)) ([`ef6e8306b`](https://github.com/gptme/gptme/commit/ef6e8306b))
 - fix(acp): use proper write pipe protocol to prevent _drain_helper AttributeError ([#1276](https://github.com/gptme/gptme/issues/1276)) ([`2f390bdc5`](https://github.com/gptme/gptme/commit/2f390bdc5))
 - fix(config): use logger instead of console for config messages ([#1281](https://github.com/gptme/gptme/issues/1281)) ([`aa681fb3c`](https://github.com/gptme/gptme/commit/aa681fb3c))
 - fix(tests): skip server API tests when flask is not installed ([#1274](https://github.com/gptme/gptme/issues/1274)) ([`629e25918`](https://github.com/gptme/gptme/commit/629e25918))
 - fix(python): detect and use user's venv for IPython tool ([#1279](https://github.com/gptme/gptme/issues/1279)) ([`9bcc85338`](https://github.com/gptme/gptme/commit/9bcc85338))
 - fix(types): resolve mypy errors in OpenAI and ACP modules ([#1277](https://github.com/gptme/gptme/issues/1277)) ([`477530825`](https://github.com/gptme/gptme/commit/477530825))
 - fix(acp): remove eager cli.main import from gptme/__init__.py to prevent stdout pollution ([#1273](https://github.com/gptme/gptme/issues/1273)) ([`3108adfb2`](https://github.com/gptme/gptme/commit/3108adfb2))
 - fix(eval): handle @ in OpenRouter model names when parsing tool format ([#1271](https://github.com/gptme/gptme/issues/1271)) ([`6046b5380`](https://github.com/gptme/gptme/commit/6046b5380))
 - fix(acp): redirect Rich console to stderr to prevent JSON-RPC pollution ([#1269](https://github.com/gptme/gptme/issues/1269)) ([`e000defbb`](https://github.com/gptme/gptme/commit/e000defbb))
 - fix(shell): close leaked pipes via SESSION_END hook ([#1257](https://github.com/gptme/gptme/issues/1257)) ([`d1e77bb32`](https://github.com/gptme/gptme/commit/d1e77bb32))
 - fix(llm): properly round-trip tool calls in OpenAI subscription provider ([`412c1f4b8`](https://github.com/gptme/gptme/commit/412c1f4b8))
 - fix(subagent): update subprocess mode for new --context CLI flag ([#1263](https://github.com/gptme/gptme/issues/1263)) ([`c5dd33129`](https://github.com/gptme/gptme/commit/c5dd33129))
 - fix(agent): fix service management and add proper tests ([#1261](https://github.com/gptme/gptme/issues/1261)) ([`911ef35fe`](https://github.com/gptme/gptme/commit/911ef35fe))
 - fix(models): handle @ suffix in OpenRouter model lookup for context length ([#1256](https://github.com/gptme/gptme/issues/1256)) ([`617bb17e6`](https://github.com/gptme/gptme/commit/617bb17e6))
 - fix(webui): chain consecutive user messages like assistant/system chains ([#1255](https://github.com/gptme/gptme/issues/1255)) ([`4813120c4`](https://github.com/gptme/gptme/commit/4813120c4))
 - fix(webui): fix chat settings save, sidebar icon, and model search ([#1253](https://github.com/gptme/gptme/issues/1253)) ([`5ce7850c4`](https://github.com/gptme/gptme/commit/5ce7850c4))
 - fix(webui): use message queue array to prevent rapid-send message loss ([#1254](https://github.com/gptme/gptme/issues/1254)) ([`3b27e7a6b`](https://github.com/gptme/gptme/commit/3b27e7a6b))
 - fix(webui): use .get() for agent avatar observable check ([#1251](https://github.com/gptme/gptme/issues/1251)) ([`48e2523ff`](https://github.com/gptme/gptme/commit/48e2523ff))
 - fix(webui): skip hidden messages in chain type calculation ([#1250](https://github.com/gptme/gptme/issues/1250)) ([`c0330febf`](https://github.com/gptme/gptme/commit/c0330febf))
 - fix(webui): restore Developer Options that were lost in [#1249](https://github.com/gptme/gptme/issues/1249) ([`27ff31cbb`](https://github.com/gptme/gptme/commit/27ff31cbb))
 - fix(webui): clean up server UI — combine ConnectionButton into ServerSelector ([#1249](https://github.com/gptme/gptme/issues/1249)) ([`0b71ef7fc`](https://github.com/gptme/gptme/commit/0b71ef7fc))
 - fix(webui): make settings reactive in Legend State For loop ([`2ec2e0fb4`](https://github.com/gptme/gptme/commit/2ec2e0fb4))
 - fix(tests): expect cursorrules hint at DEBUG level ([#1247](https://github.com/gptme/gptme/issues/1247)) ([`73b089053`](https://github.com/gptme/gptme/commit/73b089053))
 - fix: use configured username instead of 'User' for user messages ([`b18ffb4dc`](https://github.com/gptme/gptme/commit/b18ffb4dc))
 - fix(lessons): demote noisy startup messages to debug level ([`e9e9e00d2`](https://github.com/gptme/gptme/commit/e9e9e00d2))
 - fix(config): condense user config log to single line ([`0b4856feb`](https://github.com/gptme/gptme/commit/0b4856feb))
 - fix(config): deduplicate and improve user config logging ([`f6be0a891`](https://github.com/gptme/gptme/commit/f6be0a891))
 - fix(eval): prevent recursive SIGTERM handler loop ([#1240](https://github.com/gptme/gptme/issues/1240)) ([`9c6224b0c`](https://github.com/gptme/gptme/commit/9c6224b0c))
 - fix(prompts): attach workspace files to Message instead of reading inline ([#1231](https://github.com/gptme/gptme/issues/1231)) ([`0707f7364`](https://github.com/gptme/gptme/commit/0707f7364))
 - fix: detect vision support from OpenRouter modality correctly ([#1237](https://github.com/gptme/gptme/issues/1237)) ([`152504f16`](https://github.com/gptme/gptme/commit/152504f16))
 - fix: fix `a` as acceptable answer for auto in confirmation ([#1233](https://github.com/gptme/gptme/issues/1233)) ([`cf189c929`](https://github.com/gptme/gptme/commit/cf189c929))
 - fix(docs): add PIL.Image.Image to nitpick ignore list ([`9ac73a081`](https://github.com/gptme/gptme/commit/9ac73a081))
 - fix(docs): use string literal for PIL.Image.Image type annotation to fix Sphinx warning ([`413cc7ce2`](https://github.com/gptme/gptme/commit/413cc7ce2))
 - fix(llm): handle httpx transport errors during streaming ([#1226](https://github.com/gptme/gptme/issues/1226)) ([`f564bb707`](https://github.com/gptme/gptme/commit/f564bb707))
 - fix(llm): handle OpenRouter 'Overloaded' errors for Anthropic models ([#1223](https://github.com/gptme/gptme/issues/1223)) ([`a57f5612a`](https://github.com/gptme/gptme/commit/a57f5612a))
 - fix(autocompact): reduce log spam from per-message logging ([#1216](https://github.com/gptme/gptme/issues/1216)) ([`753b756fc`](https://github.com/gptme/gptme/commit/753b756fc))
 - fix(save): remove duplicate overwrite confirmation ([#1204](https://github.com/gptme/gptme/issues/1204)) ([`2c055be8a`](https://github.com/gptme/gptme/commit/2c055be8a))
 - fix(lessons): exclude worktree and .git directories from indexing ([#1213](https://github.com/gptme/gptme/issues/1213)) ([`af9acc27a`](https://github.com/gptme/gptme/commit/af9acc27a))
 - fix: Add tsroot to eslint config ([#1214](https://github.com/gptme/gptme/issues/1214)) ([`28401e06c`](https://github.com/gptme/gptme/commit/28401e06c))
 - fix(patch): handle RST heading underlines (===================) in content ([#1203](https://github.com/gptme/gptme/issues/1203)) ([`b201c91ce`](https://github.com/gptme/gptme/commit/b201c91ce))
 - fix(eval): add thread-safe locking for environment variable mutation ([#1044](https://github.com/gptme/gptme/issues/1044)) ([`a14391479`](https://github.com/gptme/gptme/commit/a14391479))
 - fix(llm): handle list content in OpenRouter reasoning extraction ([#1188](https://github.com/gptme/gptme/issues/1188)) ([`5a2eddbf4`](https://github.com/gptme/gptme/commit/5a2eddbf4))
 - fix: added missing import ([`7582ccf9a`](https://github.com/gptme/gptme/commit/7582ccf9a))
 - fix(server): include hide property in SSE message_added events ([#1190](https://github.com/gptme/gptme/issues/1190)) ([`2d7a03b17`](https://github.com/gptme/gptme/commit/2d7a03b17))
 - fix(llm): add reasoning_content for OpenRouter reasoning models with tool_calls ([#1187](https://github.com/gptme/gptme/issues/1187)) ([`fd1db2d28`](https://github.com/gptme/gptme/commit/fd1db2d28))
 - fix(llm): handle OpenRouter subprovider suffix in model lookup ([#1182](https://github.com/gptme/gptme/issues/1182)) ([`5be25bc58`](https://github.com/gptme/gptme/commit/5be25bc58))
 - fix: support [lessons] section in user config ([#1184](https://github.com/gptme/gptme/issues/1184)) ([`5f7b261ba`](https://github.com/gptme/gptme/commit/5f7b261ba))
 - fix(browser): disable broken google/duckduckgo search, default to perplexity ([`e66ac15f1`](https://github.com/gptme/gptme/commit/e66ac15f1))
 - fix(prompts): restore truncation line accidentally deleted in suggestion commit ([`7891580b5`](https://github.com/gptme/gptme/commit/7891580b5))
 - fix(chat): restructure type checks for mypy narrowing ([#1177](https://github.com/gptme/gptme/issues/1177)) ([`391953c99`](https://github.com/gptme/gptme/commit/391953c99))
 - fix(chat): allow explicit model param to bypass default_model assertion ([#1176](https://github.com/gptme/gptme/issues/1176)) ([`dbb7420f7`](https://github.com/gptme/gptme/commit/dbb7420f7))
 - fix(tests): mark PDF tests as slow to exclude from no-API-key CI ([`aca29a1e3`](https://github.com/gptme/gptme/commit/aca29a1e3))
 - fix: added 'auto' to listed choices in ask_execute ([`8126698c1`](https://github.com/gptme/gptme/commit/8126698c1))
 - fix(shell): correct markdown heading level for Background Jobs section ([#1168](https://github.com/gptme/gptme/issues/1168)) ([`afc27403b`](https://github.com/gptme/gptme/commit/afc27403b))
 - fix(config): use TOOL_ALLOWLIST instead of TOOLS for consistency ([#1165](https://github.com/gptme/gptme/issues/1165)) ([`1abe61db9`](https://github.com/gptme/gptme/commit/1abe61db9))
 - fix(tests): fix lesson tests failing due to mock config issues ([#1150](https://github.com/gptme/gptme/issues/1150)) ([`718a5cbe6`](https://github.com/gptme/gptme/commit/718a5cbe6))
 - fix: add proper TypeScript types and lint fixes ([`a9e3485e2`](https://github.com/gptme/gptme/commit/a9e3485e2))
 - fix: remove duplicate Goodbye message on Ctrl+D exit ([#1147](https://github.com/gptme/gptme/issues/1147)) ([`a34dbb7c9`](https://github.com/gptme/gptme/commit/a34dbb7c9))
 - fix: fix examples for tmux tool, add tmux tool examples for working with subagents ([#1145](https://github.com/gptme/gptme/issues/1145)) ([`268f350f9`](https://github.com/gptme/gptme/commit/268f350f9))
 - fix(auth): re-check hash at mount time for SPA navigation ([#113](https://github.com/gptme/gptme/issues/113)) ([`1e25eb42e`](https://github.com/gptme/gptme/commit/1e25eb42e))
 - fix(server): propagate default model to request contexts via before_request hook ([#1139](https://github.com/gptme/gptme/issues/1139)) ([`25492f6b6`](https://github.com/gptme/gptme/commit/25492f6b6))
 - fix: add fallback model when no default is available ([`b50a2709f`](https://github.com/gptme/gptme/commit/b50a2709f))
 - fix: don't disable input while waiting for session + persist drafts ([#107](https://github.com/gptme/gptme/issues/107)) ([`dab3dbb9b`](https://github.com/gptme/gptme/commit/dab3dbb9b))
 - fix: move step() from createConversation to useConversation to fix streaming race ([#106](https://github.com/gptme/gptme/issues/106)) ([`c21b7bc77`](https://github.com/gptme/gptme/commit/c21b7bc77))
 - fix(llm): add supports_reasoning flag to Gemini 2.x models ([#1136](https://github.com/gptme/gptme/issues/1136)) ([`a738a2e92`](https://github.com/gptme/gptme/commit/a738a2e92))
 - fix(setup): recognize Gemini API keys in setup wizard ([#1137](https://github.com/gptme/gptme/issues/1137)) ([`d10e7e883`](https://github.com/gptme/gptme/commit/d10e7e883))
 - fix: handle Session ID 404 errors in tool confirmation retry ([#105](https://github.com/gptme/gptme/issues/105)) ([`53fe8a44f`](https://github.com/gptme/gptme/commit/53fe8a44f))
 - fix(server): make session_id optional for tool confirmation ([#1133](https://github.com/gptme/gptme/issues/1133)) ([`7f0fba2e4`](https://github.com/gptme/gptme/commit/7f0fba2e4))
 - fix(logmanager): robust lock handling with PID check for server mode ([#1130](https://github.com/gptme/gptme/issues/1130)) ([`c5ee4137f`](https://github.com/gptme/gptme/commit/c5ee4137f))
 - fix(server): improve skip message to prevent LLM re-suggestion ([#1132](https://github.com/gptme/gptme/issues/1132)) ([`7e9e5538c`](https://github.com/gptme/gptme/commit/7e9e5538c))
 - fix(chat): return to prompt when user declines execution ([#1127](https://github.com/gptme/gptme/issues/1127)) ([`67f16e1e3`](https://github.com/gptme/gptme/commit/67f16e1e3))
 - fix(cli): validate non-interactive mode requires prompt ([#1125](https://github.com/gptme/gptme/issues/1125)) ([`dd0e23464`](https://github.com/gptme/gptme/commit/dd0e23464))
 - fix(llm): add safe parsing for environment variables ([#1029](https://github.com/gptme/gptme/issues/1029)) ([`11aa4b7e0`](https://github.com/gptme/gptme/commit/11aa4b7e0))
 - fix(server): add timeouts to subprocess.run calls in tasks_api ([#1087](https://github.com/gptme/gptme/issues/1087)) ([`d1ade7755`](https://github.com/gptme/gptme/commit/d1ade7755))
 - fix(auto-naming): validate LLM responses to reject error-like titles ([#1117](https://github.com/gptme/gptme/issues/1117)) ([`270d6bec2`](https://github.com/gptme/gptme/commit/270d6bec2))
 - fix(logging): suppress OpenTelemetry error spam on connection failures ([#1113](https://github.com/gptme/gptme/issues/1113)) ([`f111d27a1`](https://github.com/gptme/gptme/commit/f111d27a1))
 - fix(models): inherit base model properties for date-suffixed variants ([#1114](https://github.com/gptme/gptme/issues/1114)) ([`b59555ab4`](https://github.com/gptme/gptme/commit/b59555ab4))
 - fix(lessons): disable description-based word matching ([#1106](https://github.com/gptme/gptme/issues/1106)) ([`f9ec1a139`](https://github.com/gptme/gptme/commit/f9ec1a139))
 - fix(chat): add input validation and queue size limits ([#1077](https://github.com/gptme/gptme/issues/1077)) ([`214643b51`](https://github.com/gptme/gptme/commit/214643b51))
 - fix(server): sanitize error messages returned to clients ([#1090](https://github.com/gptme/gptme/issues/1090)) ([`5c0903b4b`](https://github.com/gptme/gptme/commit/5c0903b4b))
 - fix(server): replace assert with proper validation checks ([#1092](https://github.com/gptme/gptme/issues/1092)) ([`bcd5f3850`](https://github.com/gptme/gptme/commit/bcd5f3850))
 - fix(server): validate role against allowed values ([#1085](https://github.com/gptme/gptme/issues/1085)) ([`ed03f611a`](https://github.com/gptme/gptme/commit/ed03f611a))
 - fix(message): improve TOML serialization and round-trip completeness ([#1083](https://github.com/gptme/gptme/issues/1083)) ([`a8b66bf8d`](https://github.com/gptme/gptme/commit/a8b66bf8d))
 - fix(server): remove stale init_tools FIXME comments ([#1091](https://github.com/gptme/gptme/issues/1091)) ([`c4f97dd60`](https://github.com/gptme/gptme/commit/c4f97dd60))
 - fix(shell): check denylist for background jobs ([#1086](https://github.com/gptme/gptme/issues/1086)) ([`dbb3b6396`](https://github.com/gptme/gptme/commit/dbb3b6396))
 - fix(server): add @require_auth to tasks and workspace API endpoints ([#1084](https://github.com/gptme/gptme/issues/1084)) ([`0ea93f1d3`](https://github.com/gptme/gptme/commit/0ea93f1d3))
 - fix(anthropic): prevent empty message content error ([#1081](https://github.com/gptme/gptme/issues/1081)) ([`7d539dfbf`](https://github.com/gptme/gptme/commit/7d539dfbf))
 - fix(prompts): truncate context command stderr to prevent info leakage ([#1079](https://github.com/gptme/gptme/issues/1079)) ([`9827a611a`](https://github.com/gptme/gptme/commit/9827a611a))
 - fix(message): prevent call_id=None from serializing as literal 'None' string ([#1078](https://github.com/gptme/gptme/issues/1078)) ([`0bbc82102`](https://github.com/gptme/gptme/commit/0bbc82102))
 - fix(server): replace assert with runtime check for path traversal defense ([#1072](https://github.com/gptme/gptme/issues/1072)) ([`473806dde`](https://github.com/gptme/gptme/commit/473806dde))
 - fix(message): preserve whitespace in TOML serialization ([#1064](https://github.com/gptme/gptme/issues/1064)) ([`d78644d89`](https://github.com/gptme/gptme/commit/d78644d89))
 - fix(llm): replace assert with runtime checks for production safety ([#1071](https://github.com/gptme/gptme/issues/1071)) ([`02bfaf17a`](https://github.com/gptme/gptme/commit/02bfaf17a))
 - fix(prompts): add path traversal protection for glob patterns ([#1065](https://github.com/gptme/gptme/issues/1065)) ([`f5c7ff0ed`](https://github.com/gptme/gptme/commit/f5c7ff0ed))
 - fix(llm): check raw file size instead of base64 encoded size ([#1066](https://github.com/gptme/gptme/issues/1066)) ([`99d2834e3`](https://github.com/gptme/gptme/commit/99d2834e3))
 - fix(llm): prevent duplicate output on generator retry ([#1063](https://github.com/gptme/gptme/issues/1063)) ([`c8d8e6b63`](https://github.com/gptme/gptme/commit/c8d8e6b63))
 - fix(llm): log exceptions instead of silently swallowing them ([#1068](https://github.com/gptme/gptme/issues/1068)) ([`0ec410170`](https://github.com/gptme/gptme/commit/0ec410170))
 - fix(llm): prevent division by zero in token rate calculation ([#1062](https://github.com/gptme/gptme/issues/1062)) ([`6058d8c87`](https://github.com/gptme/gptme/commit/6058d8c87))
 - fix(lessons): deduplicate lessons by resolved path in matcher ([#1060](https://github.com/gptme/gptme/issues/1060)) ([`faf9ea0ed`](https://github.com/gptme/gptme/commit/faf9ea0ed))
 - fix(llm): replace bare assert with proper error for missing system message ([#1058](https://github.com/gptme/gptme/issues/1058)) ([`196e106bf`](https://github.com/gptme/gptme/commit/196e106bf))
 - fix(llm): replace bare assert with proper error for empty LLM responses ([#1057](https://github.com/gptme/gptme/issues/1057)) ([`c00acd461`](https://github.com/gptme/gptme/commit/c00acd461))
 - fix(autocompact): include exception type when resume error message is empty ([#1056](https://github.com/gptme/gptme/issues/1056)) ([`dab83d969`](https://github.com/gptme/gptme/commit/dab83d969))
 - fix(eval): prevent SIGTERM self-kill from overwriting success result ([#1055](https://github.com/gptme/gptme/issues/1055)) ([`eb4ce7a72`](https://github.com/gptme/gptme/commit/eb4ce7a72))
 - fix(eval): add grace period before SIGKILL to prevent IPC corruption ([#1042](https://github.com/gptme/gptme/issues/1042)) ([`329997b69`](https://github.com/gptme/gptme/commit/329997b69))
 - fix(tools): add path traversal protection to save and patch tools ([#1045](https://github.com/gptme/gptme/issues/1045)) ([`c20217098`](https://github.com/gptme/gptme/commit/c20217098))
 - fix(message): add XML escaping to prevent injection in to_xml() ([#1048](https://github.com/gptme/gptme/issues/1048)) ([`945050fc0`](https://github.com/gptme/gptme/commit/945050fc0))
 - fix(config): use atomic write to prevent corruption in daemon thread ([#1050](https://github.com/gptme/gptme/issues/1050)) ([`8b1720ea3`](https://github.com/gptme/gptme/commit/8b1720ea3))
 - fix(logmanager): ensure lock is released if atexit registration fails ([#1049](https://github.com/gptme/gptme/issues/1049)) ([`80edeb6a8`](https://github.com/gptme/gptme/commit/80edeb6a8))
 - fix(eval): add automatic cleanup for temp directories ([#1051](https://github.com/gptme/gptme/issues/1051)) ([`3a5bf98b9`](https://github.com/gptme/gptme/commit/3a5bf98b9))
 - fix(logmanager): store TemporaryDirectory instance to prevent resource leak ([#1054](https://github.com/gptme/gptme/issues/1054)) ([`9913c0c93`](https://github.com/gptme/gptme/commit/9913c0c93))
 - fix(eval): move init_tools outside inner function to avoid repeated calls ([#1053](https://github.com/gptme/gptme/issues/1053)) ([`061935cc5`](https://github.com/gptme/gptme/commit/061935cc5))
 - fix(eval): use UUID for deterministic unique IDs ([#1052](https://github.com/gptme/gptme/issues/1052)) ([`c2ee02da0`](https://github.com/gptme/gptme/commit/c2ee02da0))
 - fix(eval): prevent race condition in result retrieval ([#1043](https://github.com/gptme/gptme/issues/1043)) ([`0ef426743`](https://github.com/gptme/gptme/commit/0ef426743))
 - fix(eval): add path traversal protection to FileStore.upload() ([#1041](https://github.com/gptme/gptme/issues/1041)) ([`7de80c0ec`](https://github.com/gptme/gptme/commit/7de80c0ec))
 - fix(eval): use explicit shell invocation instead of shell=True ([#1040](https://github.com/gptme/gptme/issues/1040)) ([`d2d28a5d4`](https://github.com/gptme/gptme/commit/d2d28a5d4))
 - fix(util): use ContextVar for thread-safe interrupt state ([#1046](https://github.com/gptme/gptme/issues/1046)) ([`395036479`](https://github.com/gptme/gptme/commit/395036479))
 - fix(llm): explicitly close stream generator in finally block ([#1047](https://github.com/gptme/gptme/issues/1047)) ([`2ee2fd6e1`](https://github.com/gptme/gptme/commit/2ee2fd6e1))
 - fix(browser): close browser contexts to prevent resource leaks ([#1038](https://github.com/gptme/gptme/issues/1038)) ([`1a3c820c6`](https://github.com/gptme/gptme/commit/1a3c820c6))
 - fix(tools): add defensive checks for edge cases ([#1027](https://github.com/gptme/gptme/issues/1027)) ([`ae574f386`](https://github.com/gptme/gptme/commit/ae574f386))
 - fix(security): validate screenshot path stays within OUTPUT_DIR ([#1023](https://github.com/gptme/gptme/issues/1023)) ([`7576240b7`](https://github.com/gptme/gptme/commit/7576240b7))
 - fix(security): block file:// protocol in lynx browser backend ([#1022](https://github.com/gptme/gptme/issues/1022)) ([`8f24d700c`](https://github.com/gptme/gptme/commit/8f24d700c))
 - fix(eval): pass API keys to Docker container ([#1019](https://github.com/gptme/gptme/issues/1019)) ([`d53293dde`](https://github.com/gptme/gptme/commit/d53293dde))
 - fix(security): prevent command injection vulnerabilities ([#1018](https://github.com/gptme/gptme/issues/1018)) ([`da7dc3c53`](https://github.com/gptme/gptme/commit/da7dc3c53))
 - fix(restart): filter out positional arguments (prompts) on restart ([#1012](https://github.com/gptme/gptme/issues/1012)) ([`707a23370`](https://github.com/gptme/gptme/commit/707a23370))
 - fix: propagate metadata return value in Anthropic retry decorator ([#1013](https://github.com/gptme/gptme/issues/1013)) ([`a4a9e0f1c`](https://github.com/gptme/gptme/commit/a4a9e0f1c))
 - fix(tests): mock _create_subagent_thread to prevent API calls ([`a410846c1`](https://github.com/gptme/gptme/commit/a410846c1))
 - fix(llm): cut out @provider suffix spec in model send to API to fix provider spec support ([`b8e614d8d`](https://github.com/gptme/gptme/commit/b8e614d8d))
 - fix(tmux): add retry logic for session creation race conditions ([`fdbe38f11`](https://github.com/gptme/gptme/commit/fdbe38f11))
 - fix(autocompact): use compacted_log length for Phase 3 distance calculation ([`bd35cdad8`](https://github.com/gptme/gptme/commit/bd35cdad8))
 - fix(shell): prevent orphaned bg jobs and support bg on non-first line ([#994](https://github.com/gptme/gptme/issues/994)) ([`f32186a63`](https://github.com/gptme/gptme/commit/f32186a63))
 - fix: throw lock on tmux tool new_session to prevent race ([#991](https://github.com/gptme/gptme/issues/991)) ([`106781775`](https://github.com/gptme/gptme/commit/106781775))
 - fix(eval): wire DockerGPTMeEnv to agent for --docker flag ([#989](https://github.com/gptme/gptme/issues/989)) ([`99c467650`](https://github.com/gptme/gptme/commit/99c467650))
 - fix(shell): truncate long commands in output to reduce context waste ([#983](https://github.com/gptme/gptme/issues/983)) ([`c4ae9e535`](https://github.com/gptme/gptme/commit/c4ae9e535))
 - fix: improve /tokens command to use CostTracker ([#976](https://github.com/gptme/gptme/issues/976)) ([`4b4599588`](https://github.com/gptme/gptme/commit/4b4599588))
 - fix: fixed autonaming in some cases (like for unknown models) ([`75709b120`](https://github.com/gptme/gptme/commit/75709b120))
 - fix: enable dynamic model switching via /model command ([#967](https://github.com/gptme/gptme/issues/967)) ([`ec61727e4`](https://github.com/gptme/gptme/commit/ec61727e4))
 - fix: add missing sound files to package distribution ([#969](https://github.com/gptme/gptme/issues/969)) ([`2f36eedeb`](https://github.com/gptme/gptme/commit/2f36eedeb))
 - fix(setup): check for wl-copy instead of wl-clipboard command ([#970](https://github.com/gptme/gptme/issues/970)) ([`ab0dd1e02`](https://github.com/gptme/gptme/commit/ab0dd1e02))
 - fix(shell): ignore ProcessLookupError during close ([`d765f4c03`](https://github.com/gptme/gptme/commit/d765f4c03))
 - fix(setup): use PROVIDERS instead of get_args(Provider) ([#958](https://github.com/gptme/gptme/issues/958)) ([`1eb7d106b`](https://github.com/gptme/gptme/commit/1eb7d106b))
 - fix(models): support local providers in get_summary_model ([#950](https://github.com/gptme/gptme/issues/950)) ([`f74743774`](https://github.com/gptme/gptme/commit/f74743774))
 - fix(lessons): handle empty globs/triggers in Cursor rules ([#952](https://github.com/gptme/gptme/issues/952)) ([`9e7cc4305`](https://github.com/gptme/gptme/commit/9e7cc4305))
 - fix: fix issues with LLM-powered compact ([#951](https://github.com/gptme/gptme/issues/951)) ([`547016dfc`](https://github.com/gptme/gptme/commit/547016dfc))
 - fix(api): await operations in createConversationWithPlaceholder to propagate errors ([#100](https://github.com/gptme/gptme/issues/100)) ([`e85787dd8`](https://github.com/gptme/gptme/commit/e85787dd8))
 - fix: add crypto.randomUUID polyfill and SPA routing support ([#97](https://github.com/gptme/gptme/issues/97)) ([`a594aa0f7`](https://github.com/gptme/gptme/commit/a594aa0f7))
 - fix: implement onConnected callback and improve message streaming ([`259d804f5`](https://github.com/gptme/gptme/commit/259d804f5))
 - fix: resolve session ID mismatch causing interrupt failures on initial prompts ([`71c554738`](https://github.com/gptme/gptme/commit/71c554738))
 - fix: improve layout and scrolling in settings panels ([`54bd992ad`](https://github.com/gptme/gptme/commit/54bd992ad))
 - fix: support auto-generating agent path from name ([#88](https://github.com/gptme/gptme/issues/88)) ([`4b343c33f`](https://github.com/gptme/gptme/commit/4b343c33f))
 - fix: fixed test ([`eff175ee7`](https://github.com/gptme/gptme/commit/eff175ee7))
 - fix: use authHeader for /models requests ([`1e871ed5c`](https://github.com/gptme/gptme/commit/1e871ed5c))
 - fix: improve styling for inline tool confirmation and execution components (denser) ([`5ea375c05`](https://github.com/gptme/gptme/commit/5ea375c05))
 - fix: embed auto-approve in button dropdown for a denser component ([`b4940c44b`](https://github.com/gptme/gptme/commit/b4940c44b))
 - fix: use simple placeholder text instead of rotating examples ([`1fe9fa926`](https://github.com/gptme/gptme/commit/1fe9fa926))
 - fix: only show recommended models that are available ([`83fa597d3`](https://github.com/gptme/gptme/commit/83fa597d3))
 - fix: improved model selector with recommended models, fix model search input focus, etc. ([`01ce9d0b9`](https://github.com/gptme/gptme/commit/01ce9d0b9))
 - fix: ensure pending tool state is always set for tool execution ([`2e8aa4f2c`](https://github.com/gptme/gptme/commit/2e8aa4f2c))
 - fix: added logo to repo ([`e91e29d90`](https://github.com/gptme/gptme/commit/e91e29d90))
 - fix: show interrupt button during tool execution ([`35116c0e9`](https://github.com/gptme/gptme/commit/35116c0e9))
 - fix: select agents by their paths ([`568384bb9`](https://github.com/gptme/gptme/commit/568384bb9))
 - fix: simplify create agent dialog with better defaults ([`0fe8f3271`](https://github.com/gptme/gptme/commit/0fe8f3271))
 - fix: improved success detection for messages, refer to equivalent code in gptme cli ([`e121314c5`](https://github.com/gptme/gptme/commit/e121314c5))
 - fix: extend the success pattern for messages ([`92b7eef7b`](https://github.com/gptme/gptme/commit/92b7eef7b))
 - fix: fixed warning from missing forwardRef ([`72fa6c4c4`](https://github.com/gptme/gptme/commit/72fa6c4c4))
 - fix: added account/dashboard link in top menu when in 'embedded mode' (set by vite env var), removed theme toggle quick-button (now in settings) ([`142017dee`](https://github.com/gptme/gptme/commit/142017dee))
 - fix: responsive sidebar design issues on mobile and desktop ([#80](https://github.com/gptme/gptme/issues/80)) ([`0179f94f4`](https://github.com/gptme/gptme/commit/0179f94f4))
 - fix: fix respecting baseUrl in workspaceApi ([`ed7c061ee`](https://github.com/gptme/gptme/commit/ed7c061ee))
 - fix: fixes for integration with gptme-landing ([`ab9363024`](https://github.com/gptme/gptme/commit/ab9363024))
 - fix: fixed links and scrolling for tasks ([`1996d5eac`](https://github.com/gptme/gptme/commit/1996d5eac))
 - fix: resolve TypeScript warnings in audio utils by properly typing webkit AudioContext ([#74](https://github.com/gptme/gptme/issues/74)) ([`abe5b9394`](https://github.com/gptme/gptme/commit/abe5b9394))
 - fix: properly manage gptme-server lifecycle and fix dev mode CORS ([`787104e90`](https://github.com/gptme/gptme/commit/787104e90))
 - fix: remove logspam ([`0b1b02949`](https://github.com/gptme/gptme/commit/0b1b02949))
 - fix: reuse ChatInput component in WelcomeView, improve styling, fix model selector when creating new conversations ([#67](https://github.com/gptme/gptme/issues/67)) ([`acf874131`](https://github.com/gptme/gptme/commit/acf874131))
 - fix: collapse thinking blocks by default ([`6cd2dff1a`](https://github.com/gptme/gptme/commit/6cd2dff1a))
 - fix: support `<think>` tags in smd.js streaming output ([`f78fa3da4`](https://github.com/gptme/gptme/commit/f78fa3da4))
 - fix: minor fixes ([`29ef54ec9`](https://github.com/gptme/gptme/commit/29ef54ec9))
 - fix: moved the conversation delete button into conversation settings ([#60](https://github.com/gptme/gptme/issues/60)) ([`39ad54ebe`](https://github.com/gptme/gptme/commit/39ad54ebe))
 - fix: use encodeURIComponent for path ([`aa9489fb8`](https://github.com/gptme/gptme/commit/aa9489fb8))
 - fix: demo conversations now show without API connection ([#57](https://github.com/gptme/gptme/issues/57)) ([`5b86355f7`](https://github.com/gptme/gptme/commit/5b86355f7))
 - fix: use testid instead of placeholder for e2e test element lookup ([`c9f52cc25`](https://github.com/gptme/gptme/commit/c9f52cc25))
 - fix: fix re-rendering issues, implement connection retry and connection status ([#41](https://github.com/gptme/gptme/issues/41)) ([`0ee36b766`](https://github.com/gptme/gptme/commit/0ee36b766))
 - fix: change default port to 5701, adapt to new 5700 gptme-server default ([#38](https://github.com/gptme/gptme/issues/38)) ([`cc85450fb`](https://github.com/gptme/gptme/commit/cc85450fb))
 - fix: fixes messed up rebase ([`2cdf6261a`](https://github.com/gptme/gptme/commit/2cdf6261a))
 - fix: add StreamingMessage extended Message ([`84393c58c`](https://github.com/gptme/gptme/commit/84393c58c))
 - fix: chatmessage styling not updating on new messages ([#31](https://github.com/gptme/gptme/issues/31)) ([`0208d6ae8`](https://github.com/gptme/gptme/commit/0208d6ae8))
 - fix: don't rerender whole ConversationContent on isLoading change ([`e73f54f0d`](https://github.com/gptme/gptme/commit/e73f54f0d))
 - fix: chatinput button not updating after generation complete ([`f1d3a1702`](https://github.com/gptme/gptme/commit/f1d3a1702))
 - fix: fix chat input being stuck in disabled ([#29](https://github.com/gptme/gptme/issues/29)) ([`5b9845187`](https://github.com/gptme/gptme/commit/5b9845187))
 - fix: support non-streaming LLM requests ([#25](https://github.com/gptme/gptme/issues/25)) ([`5202998a3`](https://github.com/gptme/gptme/commit/5202998a3))
 - fix: improved chat input design and UX ([#24](https://github.com/gptme/gptme/issues/24)) ([`e20c3285f`](https://github.com/gptme/gptme/commit/e20c3285f))
 - fix: fixes interruptions ([#23](https://github.com/gptme/gptme/issues/23)) ([`17c5d2574`](https://github.com/gptme/gptme/commit/17c5d2574))
 - fix: dont disable input box during generation (much easier to reply! much better UX!) ([`e51020edd`](https://github.com/gptme/gptme/commit/e51020edd))
 - fix: add important comment and refactor use of queryKey ([`e06389a17`](https://github.com/gptme/gptme/commit/e06389a17))
 - fix: implement use of generation_started/onMessageStart ([`7a2ccc2f4`](https://github.com/gptme/gptme/commit/7a2ccc2f4))
 - fix: less log spam, clarified function names, check for duplicates before adding ([`d9d35144b`](https://github.com/gptme/gptme/commit/d9d35144b))
 - fix: incorrect type ToolPendingEvent ([`8fdb76f89`](https://github.com/gptme/gptme/commit/8fdb76f89))
 - fix: improved typing ([`d319118da`](https://github.com/gptme/gptme/commit/d319118da))
 - fix: minor fix ([`11fd94201`](https://github.com/gptme/gptme/commit/11fd94201))
 - fix: more fixes ([`c76e9bdb3`](https://github.com/gptme/gptme/commit/c76e9bdb3))
 - fix: more fixes ([`3db2a9091`](https://github.com/gptme/gptme/commit/3db2a9091))
 - fix: switch default branch to master ([`60cff9f9d`](https://github.com/gptme/gptme/commit/60cff9f9d))
 - fix: make npm run format less spammy ([`37d1d0ef9`](https://github.com/gptme/gptme/commit/37d1d0ef9))
 - fix: include Authorization header in all requests if user token available ([`2292625b3`](https://github.com/gptme/gptme/commit/2292625b3))
 - fix: fixed `<think>` tags support ([`de6e22a85`](https://github.com/gptme/gptme/commit/de6e22a85))
 - fix: open external links in new tabs ([`0e300aef4`](https://github.com/gptme/gptme/commit/0e300aef4))
 - fix: only show system message toggle when initial system messages exist ([`e59314e01`](https://github.com/gptme/gptme/commit/e59314e01))
 - fix: improve markdown parsing and add comprehensive tests ([`abc57033c`](https://github.com/gptme/gptme/commit/abc57033c))
 - fix: style saves as success ([`4f251bb46`](https://github.com/gptme/gptme/commit/4f251bb46))
 - fix: improved styling, denser chat ([`2e026b09a`](https://github.com/gptme/gptme/commit/2e026b09a))
 - fix: improved parsing of markdown fenced codeblocks' langtag args ([`8e7359de3`](https://github.com/gptme/gptme/commit/8e7359de3))
 - fix: show codeblock langtag args, improve demo conversation ([`1adf2dcc1`](https://github.com/gptme/gptme/commit/1adf2dcc1))
 - fix: added special emoji for writing tools (save/append/patch) ([`b478e8097`](https://github.com/gptme/gptme/commit/b478e8097))
 - fix: improved demo conversation ([`1095bdf04`](https://github.com/gptme/gptme/commit/1095bdf04))
 - fix: fixed respecting base url for navigation ([`a1d98eae6`](https://github.com/gptme/gptme/commit/a1d98eae6))
 - fix: fixed emoji for certain files ([`339fb574f`](https://github.com/gptme/gptme/commit/339fb574f))
 - fix: added emojis to `<details>` cards like 💭 thinking, 📄 documents, 🛠️ tooluse, and 📤 output ([`71ab9ead0`](https://github.com/gptme/gptme/commit/71ab9ead0))
 - fix: fix styling for links in messages ([`d7f216f05`](https://github.com/gptme/gptme/commit/d7f216f05))
 - fix: improved styling ([`f16c11937`](https://github.com/gptme/gptme/commit/f16c11937))
 - fix: add spacing at end of conversation to give last message some breathing room ([`381459d5b`](https://github.com/gptme/gptme/commit/381459d5b))
 - fix: improved logging ([`87045b8fa`](https://github.com/gptme/gptme/commit/87045b8fa))
 - fix: handle nested codeblocks ([`5384c79f7`](https://github.com/gptme/gptme/commit/5384c79f7))
 - fix: style error/success system messages ([`9c730841f`](https://github.com/gptme/gptme/commit/9c730841f))
 - fix: improved styling and layout for chat messages ([`0ca11f5d3`](https://github.com/gptme/gptme/commit/0ca11f5d3))
 - fix: fixed aspect ratio for logo ([`c86204dd1`](https://github.com/gptme/gptme/commit/c86204dd1))
 - fix: re-added message id to fix streaming issue ([`7a8baedc3`](https://github.com/gptme/gptme/commit/7a8baedc3))
 - fix: removed unused interrupted message property ([`d90ebcd21`](https://github.com/gptme/gptme/commit/d90ebcd21))
 - fix: work on interrupting requests, fixed styling ([`445839b3d`](https://github.com/gptme/gptme/commit/445839b3d))
 - fix: improved styling for lists ([`28910f602`](https://github.com/gptme/gptme/commit/28910f602))
 - fix: set `stream: true` for /generate call ([`af229edbe`](https://github.com/gptme/gptme/commit/af229edbe))
 - fix: cleanup and refactor ([`acf89b6ac`](https://github.com/gptme/gptme/commit/acf89b6ac))
 - fix: lots of fixes ([`931c12482`](https://github.com/gptme/gptme/commit/931c12482))

</p>
</details>

### 🔨 Misc (514)
<details><summary>Click to expand</summary>
<p>

 - chore: bump version to 0.32.0 ([`a084f7ce6`](https://github.com/gptme/gptme/commit/a084f7ce6))
 - docs(computer): add 'Validate your setup' section to how-to ([#216](https://github.com/gptme/gptme/issues/216)) ([#3172](https://github.com/gptme/gptme/issues/3172)) ([`3684aedf3`](https://github.com/gptme/gptme/commit/3684aedf3))
 - test(subagent): deterministic roundtrip tests for thread-mode completion ([#554](https://github.com/gptme/gptme/issues/554)) ([#3145](https://github.com/gptme/gptme/issues/3145)) ([`f71248631`](https://github.com/gptme/gptme/commit/f71248631))
 - docs(subagent): correct false threading-context premise behind [#554](https://github.com/gptme/gptme/issues/554) tool-isolation ([#3142](https://github.com/gptme/gptme/issues/3142)) ([`5ffac83d6`](https://github.com/gptme/gptme/commit/5ffac83d6))
 - eval(subagent): workdir-subprocess eval + broader wait_any cancel check ([#554](https://github.com/gptme/gptme/issues/554)) ([#3141](https://github.com/gptme/gptme/issues/3141)) ([`8986e9f38`](https://github.com/gptme/gptme/commit/8986e9f38))
 - docs(mcp): add Chrome DevTools MCP server example ([#3138](https://github.com/gptme/gptme/issues/3138)) ([`309a00da6`](https://github.com/gptme/gptme/commit/309a00da6))
 - test(computer): add integration tests for Doom and Factorio milestone pipelines ([#216](https://github.com/gptme/gptme/issues/216)) ([#3139](https://github.com/gptme/gptme/issues/3139)) ([`932109b7e`](https://github.com/gptme/gptme/commit/932109b7e))
 - docs(subagent): document subagent_pipeline and subagent_wait_any; add wait_any eval ([#554](https://github.com/gptme/gptme/issues/554)) ([#3135](https://github.com/gptme/gptme/issues/3135)) ([`581d46222`](https://github.com/gptme/gptme/commit/581d46222))
 - test(computer): add integration tests for hover_element, snapshot_page, get_current_url, save/load_browser_state ([#216](https://github.com/gptme/gptme/issues/216)) ([#3132](https://github.com/gptme/gptme/issues/3132)) ([`5f86c10a4`](https://github.com/gptme/gptme/commit/5f86c10a4))
 - eval(subagent): trajectory evals for output_schema and subagent_pipeline ([#554](https://github.com/gptme/gptme/issues/554)) ([#3124](https://github.com/gptme/gptme/issues/3124)) ([`872acd852`](https://github.com/gptme/gptme/commit/872acd852))
 - test(subagent): add unit tests for subagent_pipeline() staged fan-out ([#554](https://github.com/gptme/gptme/issues/554)) ([#3122](https://github.com/gptme/gptme/issues/3122)) ([`2f37ef612`](https://github.com/gptme/gptme/commit/2f37ef612))
 - test(subagent): add regression tests for thread-mode tool isolation ([#554](https://github.com/gptme/gptme/issues/554)) ([#3121](https://github.com/gptme/gptme/issues/3121)) ([`a05f0eb5b`](https://github.com/gptme/gptme/commit/a05f0eb5b))
 - docs(subagent): document parallel/batch/output_schema/token-budget; fix stale race note ([#554](https://github.com/gptme/gptme/issues/554)) ([#3107](https://github.com/gptme/gptme/issues/3107)) ([`1a1cb9bc6`](https://github.com/gptme/gptme/commit/1a1cb9bc6))
 - test(tools): regression test for execute_msg defensive error tool_result ([#554](https://github.com/gptme/gptme/issues/554)) ([#3098](https://github.com/gptme/gptme/issues/3098)) ([`2a06c8d2f`](https://github.com/gptme/gptme/commit/2a06c8d2f))
 - docs(tools): document subagent isolation contract ([#3073](https://github.com/gptme/gptme/issues/3073)) ([`71d604621`](https://github.com/gptme/gptme/commit/71d604621))
 - docs(howto): document observe_web/observe_desktop, AT-SPI2, and act_and_observe ([#216](https://github.com/gptme/gptme/issues/216)) ([#3070](https://github.com/gptme/gptme/issues/3070)) ([`edd8d6b0b`](https://github.com/gptme/gptme/commit/edd8d6b0b))
 - test(computer): native X11 integration tests for issue [#216](https://github.com/gptme/gptme/issues/216) ([#3058](https://github.com/gptme/gptme/issues/3058)) ([`cdd7cea81`](https://github.com/gptme/gptme/commit/cdd7cea81))
 - test(cli): cover external plugin dispatch ([#3053](https://github.com/gptme/gptme/issues/3053)) ([`56e4ea64a`](https://github.com/gptme/gptme/commit/56e4ea64a))
 - test(computer): end-to-end integration tests for the 'Can it Tweet?' pipeline ([#216](https://github.com/gptme/gptme/issues/216)) ([#3045](https://github.com/gptme/gptme/issues/3045)) ([`97f8654bb`](https://github.com/gptme/gptme/commit/97f8654bb))
 - docs(providers): add dedicated Groq section with setup and anti-pattern note ([#3037](https://github.com/gptme/gptme/issues/3037)) ([`7999b0f90`](https://github.com/gptme/gptme/commit/7999b0f90))
 - docs(tools): add Browser FAQ section ([#3036](https://github.com/gptme/gptme/issues/3036)) ([`fe3899106`](https://github.com/gptme/gptme/commit/fe3899106))
 - test(server): cover audio transcription oversize guard + _guess_audio_format ([#3006](https://github.com/gptme/gptme/issues/3006)) ([`248882da9`](https://github.com/gptme/gptme/commit/248882da9))
 - docs(howto): add computer-use guide (prerequisites, backend selection, recipes) ([#2987](https://github.com/gptme/gptme/issues/2987)) ([`5a4643e72`](https://github.com/gptme/gptme/commit/5a4643e72))
 - test(subagent): regression tests for planner role→execution-mode forwarding ([#2986](https://github.com/gptme/gptme/issues/2986)) ([`2433e47d5`](https://github.com/gptme/gptme/commit/2433e47d5))
 - [codex] fix webui rerun tool session id ([#2948](https://github.com/gptme/gptme/issues/2948)) ([`af40d2db1`](https://github.com/gptme/gptme/commit/af40d2db1))
 - perf(hooks): batch process cmdline scan in workspace_agents ([#2972](https://github.com/gptme/gptme/issues/2972)) ([`6d3bd90d3`](https://github.com/gptme/gptme/commit/6d3bd90d3))
 - docs(config): add model selection guide and provider-key reference ([#2955](https://github.com/gptme/gptme/issues/2955)) ([`fd9af1eed`](https://github.com/gptme/gptme/commit/fd9af1eed))
 - test(server): perf gate for GET /api/v2/conversations with 100 conversations ([#2937](https://github.com/gptme/gptme/issues/2937)) ([`7a343dcfa`](https://github.com/gptme/gptme/commit/7a343dcfa))
 - perf(server): partial cache update on message POST to avoid O(N) rescan ([#2934](https://github.com/gptme/gptme/issues/2934)) ([`e9b7c9e80`](https://github.com/gptme/gptme/commit/e9b7c9e80))
 - chore(deps): group dependabot minor/patch bumps into single PRs ([#2926](https://github.com/gptme/gptme/issues/2926)) ([`d7fd59f8a`](https://github.com/gptme/gptme/commit/d7fd59f8a))
 - docs(commands): document /snapshot and /backtrack commands ([#2891](https://github.com/gptme/gptme/issues/2891)) ([`995eb6946`](https://github.com/gptme/gptme/commit/995eb6946))
 - refactor(llm): extract shared Responses API event loop into openai_responses.py ([#2875](https://github.com/gptme/gptme/issues/2875)) ([`018329133`](https://github.com/gptme/gptme/commit/018329133))
 - perf(tools): lazy-load mcp.types and bashlex to reduce startup time ([#2862](https://github.com/gptme/gptme/issues/2862)) ([`949761c1e`](https://github.com/gptme/gptme/commit/949761c1e))
 - perf(server): add ETag conditional request support for conversations endpoints ([#2863](https://github.com/gptme/gptme/issues/2863)) ([`e20ef6405`](https://github.com/gptme/gptme/commit/e20ef6405))
 - perf(server): skip branch glob on fast scan, dedupe stat, drop debug log ([#2854](https://github.com/gptme/gptme/issues/2854)) ([`d37c69c9d`](https://github.com/gptme/gptme/commit/d37c69c9d))
 - docs(howto): remove inaccurate --no-workspace equivalence claim ([#2858](https://github.com/gptme/gptme/issues/2858)) ([`1cae5798f`](https://github.com/gptme/gptme/commit/1cae5798f))
 - perf(server): enable gzip compression on API responses ([#2852](https://github.com/gptme/gptme/issues/2852)) ([`2e4bd56b1`](https://github.com/gptme/gptme/commit/2e4bd56b1))
 - test(complete): cover cross-variant auto-reply exit counting ([#2847](https://github.com/gptme/gptme/issues/2847)) ([`1aaca3bcf`](https://github.com/gptme/gptme/commit/1aaca3bcf))
 - test(webui): add Playwright e2e keyboard navigation tests ([#2839](https://github.com/gptme/gptme/issues/2839)) ([`3f62f130c`](https://github.com/gptme/gptme/commit/3f62f130c))
 - test(server): add PATCH edit-message and DELETE message edge-case tests ([#2830](https://github.com/gptme/gptme/issues/2830)) ([`683d38fac`](https://github.com/gptme/gptme/commit/683d38fac))
 - docs: add model-routing guide — pick your model per task ([#2810](https://github.com/gptme/gptme/issues/2810)) ([`7fd564faf`](https://github.com/gptme/gptme/commit/7fd564faf))
 - docs(config): document [models] section — default and favorites keys ([`f27f8c946`](https://github.com/gptme/gptme/commit/f27f8c946))
 - refactor(webui): group Settings → Servers into collapsible sections ([#2805](https://github.com/gptme/gptme/issues/2805)) ([`95e5385db`](https://github.com/gptme/gptme/commit/95e5385db))
 - test(tauri): add E2E chat interaction flow tests (Slice 2) ([#2780](https://github.com/gptme/gptme/issues/2780)) ([`b1c7bde9f`](https://github.com/gptme/gptme/commit/b1c7bde9f))
 - docs(howto): add how-to guide section with 5 task-oriented recipes ([#2782](https://github.com/gptme/gptme/issues/2782)) ([`134b36c4f`](https://github.com/gptme/gptme/commit/134b36c4f))
 - test(tauri): cover IPC server lifecycle commands ([#2772](https://github.com/gptme/gptme/issues/2772)) ([`29d5f1358`](https://github.com/gptme/gptme/commit/29d5f1358))
 - test(tauri): scaffold E2E smoke test with tauri-driver (Slice 1, Linux) ([`9a113de6a`](https://github.com/gptme/gptme/commit/9a113de6a))
 - test(webui): honor Playwright port setting ([`a0d43d283`](https://github.com/gptme/gptme/commit/a0d43d283))
 - refactor(extension): move under webui/, replace side panel with React ([#2755](https://github.com/gptme/gptme/issues/2755)) ([`20f65e999`](https://github.com/gptme/gptme/commit/20f65e999))
 - perf(llm): batch terminal output per chunk, not per char ([#2753](https://github.com/gptme/gptme/issues/2753)) ([`0a301eab6`](https://github.com/gptme/gptme/commit/0a301eab6))
 - docs(automation): expand automation guide with non-interactive mode, CI/CD, and scheduling ([`8d0b246fa`](https://github.com/gptme/gptme/commit/8d0b246fa))
 - docs(commands): add missing /account, /doctor, and /checkpoint commands ([#2748](https://github.com/gptme/gptme/issues/2748)) ([`b2f1cb2af`](https://github.com/gptme/gptme/commit/b2f1cb2af))
 - docs(webui): add comment on structuredClone polyfill limitations ([#2741](https://github.com/gptme/gptme/issues/2741)) ([`f1efd6d59`](https://github.com/gptme/gptme/commit/f1efd6d59))
 - docs(server): add systemd unit template for pipx self-hosters ([#2688](https://github.com/gptme/gptme/issues/2688)) ([`23083dcbf`](https://github.com/gptme/gptme/commit/23083dcbf))
 - docs(server): add nginx reverse proxy guide for self-hosters ([#2684](https://github.com/gptme/gptme/issues/2684)) ([`1f31b6ab7`](https://github.com/gptme/gptme/commit/1f31b6ab7))
 - docs(server): point self-hosters to the same-origin bundled web UI ([#2683](https://github.com/gptme/gptme/issues/2683)) ([`5cff5d7b8`](https://github.com/gptme/gptme/commit/5cff5d7b8))
 - refactor(webui): remove dead App.css and convert remaining raw CSS to Tailwind @apply ([#2669](https://github.com/gptme/gptme/issues/2669)) ([`2cb20e406`](https://github.com/gptme/gptme/commit/2cb20e406))
 - refactor(hooks): use typed HookData dataclass for tool execution hooks ([`c2b5859a6`](https://github.com/gptme/gptme/commit/c2b5859a6))
 - docs: improve examples page with subsections and advanced workflows ([#2616](https://github.com/gptme/gptme/issues/2616)) ([`e821361ab`](https://github.com/gptme/gptme/commit/e821361ab))
 - docs(skills): note Agent Skills open standard conformance ([#2611](https://github.com/gptme/gptme/issues/2611)) ([`f40857cb8`](https://github.com/gptme/gptme/commit/f40857cb8))
 - chore(deps): bump actions/checkout from 4 to 6 ([#2553](https://github.com/gptme/gptme/issues/2553)) ([`f568fe921`](https://github.com/gptme/gptme/commit/f568fe921))
 - test(cli): add real resume hint coverage ([#2530](https://github.com/gptme/gptme/issues/2530)) ([`254d1edd4`](https://github.com/gptme/gptme/commit/254d1edd4))
 - docs(readme): surface gptme-codegraph as a named feature ([`ab5ae11d8`](https://github.com/gptme/gptme/commit/ab5ae11d8))
 - docs: surface gptme-codegraph as named ecosystem project in README ([#2503](https://github.com/gptme/gptme/issues/2503)) ([`c1861dbd7`](https://github.com/gptme/gptme/commit/c1861dbd7))
 - docs(webui): explain Chrome 142+ Local Network Access for hosted UI → local server ([#2483](https://github.com/gptme/gptme/issues/2483)) ([`7a01a7e0d`](https://github.com/gptme/gptme/commit/7a01a7e0d))
 - docs(webui): document CORS origin needed for hosted UI + local server ([#2478](https://github.com/gptme/gptme/issues/2478)) ([`fea7042ce`](https://github.com/gptme/gptme/commit/fea7042ce))
 - docs(readme): add multi-agent and provider support rows to comparison table ([#2477](https://github.com/gptme/gptme/issues/2477)) ([`a8ca40aae`](https://github.com/gptme/gptme/commit/a8ca40aae))
 - chore: ignore local test artifacts ([#2476](https://github.com/gptme/gptme/issues/2476)) ([`5e4abf48e`](https://github.com/gptme/gptme/commit/5e4abf48e))
 - test(server): relax tool confirmation log assertions ([#2472](https://github.com/gptme/gptme/issues/2472)) ([`82a170b09`](https://github.com/gptme/gptme/commit/82a170b09))
 - perf(lessons): cache lesson embeddings across turns in hybrid matcher ([#2471](https://github.com/gptme/gptme/issues/2471)) ([`ebd927dba`](https://github.com/gptme/gptme/commit/ebd927dba))
 - perf(webui): route-based code-splitting via React.lazy ([#2464](https://github.com/gptme/gptme/issues/2464)) ([`98c6341e2`](https://github.com/gptme/gptme/commit/98c6341e2))
 - test(webui): add setup wizard e2e coverage ([#2456](https://github.com/gptme/gptme/issues/2456)) ([`4880cd7cf`](https://github.com/gptme/gptme/commit/4880cd7cf))
 - docs(tools): add missing autocommit, precommit, and vent tool entries ([#2455](https://github.com/gptme/gptme/issues/2455)) ([`ec72c0452`](https://github.com/gptme/gptme/commit/ec72c0452))
 - docs(tools): add 9 missing tools to tools.rst ([#2443](https://github.com/gptme/gptme/issues/2443)) ([`9fc3c925b`](https://github.com/gptme/gptme/commit/9fc3c925b))
 - test(config): document chat workspace default ([`ae0c4aa68`](https://github.com/gptme/gptme/commit/ae0c4aa68))
 - docs: add FAQ section ([`7e88d1719`](https://github.com/gptme/gptme/commit/7e88d1719))
 - test(eval): cover top-level future drain timeout fallback ([#2419](https://github.com/gptme/gptme/issues/2419)) ([`eb703c39e`](https://github.com/gptme/gptme/commit/eb703c39e))
 - test(computer): add macOS mouse move, drag, and cursor position tests ([`e852e6a6a`](https://github.com/gptme/gptme/commit/e852e6a6a))
 - chore(cli): replace stale TODO with clarifying comment on deferred path expansion ([#2416](https://github.com/gptme/gptme/issues/2416)) ([`7b88ea8ef`](https://github.com/gptme/gptme/commit/7b88ea8ef))
 - test(chat): cover deferred path expansion in chained prompts ([#2414](https://github.com/gptme/gptme/issues/2414)) ([`c7cea8db8`](https://github.com/gptme/gptme/commit/c7cea8db8))
 - docs(config): document default_config defaults for about, response_preference, and prompt.project ([`5ffde4a4c`](https://github.com/gptme/gptme/commit/5ffde4a4c))
 - docs: make finetuning page honest about current support ([#2407](https://github.com/gptme/gptme/issues/2407)) ([`c429555fb`](https://github.com/gptme/gptme/commit/c429555fb))
 - refactor(openai): share Responses API helpers ([#2405](https://github.com/gptme/gptme/issues/2405)) ([`f26e5383c`](https://github.com/gptme/gptme/commit/f26e5383c))
 - docs(providers): document OpenAI Responses API gate ([`a2d717554`](https://github.com/gptme/gptme/commit/a2d717554))
 - docs(cli): document JSONL automation mode ([#2403](https://github.com/gptme/gptme/issues/2403)) ([`e1f3736ce`](https://github.com/gptme/gptme/commit/e1f3736ce))
 - test(cli): relax queued prompt help assertions ([#2401](https://github.com/gptme/gptme/issues/2401)) ([`15c93a4ca`](https://github.com/gptme/gptme/commit/15c93a4ca))
 - docs(cli): surface queued follow-up prompts ([#2400](https://github.com/gptme/gptme/issues/2400)) ([`04dbb7782`](https://github.com/gptme/gptme/commit/04dbb7782))
 - test(cli): add integration tests validating stdout is pure JSONL in JSON mode ([#2394](https://github.com/gptme/gptme/issues/2394)) ([`0bf47a6c5`](https://github.com/gptme/gptme/commit/0bf47a6c5))
 - [codex] improve skills discoverability ([#2387](https://github.com/gptme/gptme/issues/2387)) ([`7865bf853`](https://github.com/gptme/gptme/commit/7865bf853))
 - test(webui): cover server settings onboarding action ([#2380](https://github.com/gptme/gptme/issues/2380)) ([`c1225fae4`](https://github.com/gptme/gptme/commit/c1225fae4))
 - docs(readme): fix truncated initial-commit SHA link ([#2376](https://github.com/gptme/gptme/issues/2376)) ([`b54503f89`](https://github.com/gptme/gptme/commit/b54503f89))
 - docs: describe account provider onboarding ([#2360](https://github.com/gptme/gptme/issues/2360)) ([`eb6ebbade`](https://github.com/gptme/gptme/commit/eb6ebbade))
 - docs(alternatives): make CMA runtime fee gap explicit ($0.08/hr vs $0) ([#2357](https://github.com/gptme/gptme/issues/2357)) ([`e3caabd6c`](https://github.com/gptme/gptme/commit/e3caabd6c))
 - test(cost-awareness): add 29 tests for cache-cold warning, cost thresholds, and injection ([#2324](https://github.com/gptme/gptme/issues/2324)) ([`fe0f873d3`](https://github.com/gptme/gptme/commit/fe0f873d3))
 - test(webui): cover PCM voice playback + useVoiceSession state machine ([`dee689a49`](https://github.com/gptme/gptme/commit/dee689a49))
 - docs(readme): drop brittle undated session counts ([#2300](https://github.com/gptme/gptme/issues/2300)) ([`794505a43`](https://github.com/gptme/gptme/commit/794505a43))
 - test(webui): use ConnectionProbeResult type in ApiContext mocks ([#2292](https://github.com/gptme/gptme/issues/2292)) ([`4c3b0f3f6`](https://github.com/gptme/gptme/commit/4c3b0f3f6))
 - perf(llm): lazy-load provider imports to speed CLI startup ~1.7s ([#2235](https://github.com/gptme/gptme/issues/2235)) ([`dba4da4bf`](https://github.com/gptme/gptme/commit/dba4da4bf))
 - chore: remove journal entry ([`066975839`](https://github.com/gptme/gptme/commit/066975839))
 - docs(providers): document gpt-5.5 and gpt-5.5-pro ([#2222](https://github.com/gptme/gptme/issues/2222)) ([`2ceaee271`](https://github.com/gptme/gptme/commit/2ceaee271))
 - perf(telemetry): lazy-load opentelemetry imports (saves ~1.4s startup) ([#2218](https://github.com/gptme/gptme/issues/2218)) ([`24d286450`](https://github.com/gptme/gptme/commit/24d286450))
 - refactor(webui): share provider api key metadata ([`4a76a42f5`](https://github.com/gptme/gptme/commit/4a76a42f5))
 - perf(lessons): defer sentence_transformers import (~33s CLI startup savings) ([#2208](https://github.com/gptme/gptme/issues/2208)) ([`19aad7692`](https://github.com/gptme/gptme/commit/19aad7692))
 - perf: lazy-load heavy imports to reduce CLI startup time 3.3s→1.0s ([#2207](https://github.com/gptme/gptme/issues/2207)) ([`ceddeb96f`](https://github.com/gptme/gptme/commit/ceddeb96f))
 - docs: update gptme-webui links to merged location ([#2199](https://github.com/gptme/gptme/issues/2199)) ([`823cf847d`](https://github.com/gptme/gptme/commit/823cf847d))
 - docs: add guardrails framing for autonomous agents ([#2197](https://github.com/gptme/gptme/issues/2197)) ([`9c0512df8`](https://github.com/gptme/gptme/commit/9c0512df8))
 - docs(cli): improve models test command docstring with examples ([#2162](https://github.com/gptme/gptme/issues/2162)) ([`f77bf93f7`](https://github.com/gptme/gptme/commit/f77bf93f7))
 - perf: lazy-compute version string to avoid subprocess calls at import time ([#2145](https://github.com/gptme/gptme/issues/2145)) ([`41ec74653`](https://github.com/gptme/gptme/commit/41ec74653))
 - refactor(server): remove redundant re imports in tasks_api ([#2129](https://github.com/gptme/gptme/issues/2129)) ([`60bdd0cf5`](https://github.com/gptme/gptme/commit/60bdd0cf5))
 - docs(alternatives): add Claude Managed Agents to comparison tables ([#2110](https://github.com/gptme/gptme/issues/2110)) ([`9abfa79b6`](https://github.com/gptme/gptme/commit/9abfa79b6))
 - Unauthenticated static file server exposed on all interfaces can leak sensitive workspace files ([#1847](https://github.com/gptme/gptme/issues/1847)) ([`00076bc9c`](https://github.com/gptme/gptme/commit/00076bc9c))
 - docs: add local model quickstart and Claude Managed Agents comparison ([#2106](https://github.com/gptme/gptme/issues/2106)) ([`8a11f6ffd`](https://github.com/gptme/gptme/commit/8a11f6ffd))
 - docs: improve alternatives page for SEO and discoverability ([#2085](https://github.com/gptme/gptme/issues/2085)) ([`da1be915b`](https://github.com/gptme/gptme/commit/da1be915b))
 - refactor(eval): split behavioral.py monolith into per-scenario package ([#2082](https://github.com/gptme/gptme/issues/2082)) ([`a0c44f3b4`](https://github.com/gptme/gptme/commit/a0c44f3b4))
 - test(server): add unit tests for external_sessions module ([#2068](https://github.com/gptme/gptme/issues/2068)) ([`1b4ec412f`](https://github.com/gptme/gptme/commit/1b4ec412f))
 - Revert "feat(cli): prototype live terminal status line ([#2058](https://github.com/gptme/gptme/issues/2058))" ([#2061](https://github.com/gptme/gptme/issues/2061)) ([`a6212255a`](https://github.com/gptme/gptme/commit/a6212255a))
 - docs: clarify selective subagent context components ([#2034](https://github.com/gptme/gptme/issues/2034)) ([`eac7e45be`](https://github.com/gptme/gptme/commit/eac7e45be))
 - test(eval): add end-to-end solution verification for behavioral evals ([#2057](https://github.com/gptme/gptme/issues/2057)) ([`890f35ed0`](https://github.com/gptme/gptme/commit/890f35ed0))
 - test(eval): add comprehensive tests for behavioral eval checkers ([#2056](https://github.com/gptme/gptme/issues/2056)) ([`5f8a177e3`](https://github.com/gptme/gptme/commit/5f8a177e3))
 - docs(eval): document current SWE-Bench support ([#2055](https://github.com/gptme/gptme/issues/2055)) ([`1a6510eec`](https://github.com/gptme/gptme/commit/1a6510eec))
 - docs(eval): fix leaderboard CLI command examples ([#2054](https://github.com/gptme/gptme/issues/2054)) ([`313197daf`](https://github.com/gptme/gptme/commit/313197daf))
 - refactor: remove redundant local imports already available at module scope ([#2048](https://github.com/gptme/gptme/issues/2048)) ([`a17fdcb4d`](https://github.com/gptme/gptme/commit/a17fdcb4d))
 - refactor: narrow broad except Exception catches to specific types ([#2039](https://github.com/gptme/gptme/issues/2039)) ([`b17c92d02`](https://github.com/gptme/gptme/commit/b17c92d02))
 - docs: fix contrib plugin example links ([#2025](https://github.com/gptme/gptme/issues/2025)) ([`dd8f1c3fa`](https://github.com/gptme/gptme/commit/dd8f1c3fa))
 - docs(evals): update practical suite coverage to practical29, 86 tasks ([#2033](https://github.com/gptme/gptme/issues/2033)) ([`8f66016dd`](https://github.com/gptme/gptme/commit/8f66016dd))
 - docs(evals): update practical suite coverage and add suite aliases ([#2026](https://github.com/gptme/gptme/issues/2026)) ([`9ce6e11da`](https://github.com/gptme/gptme/commit/9ce6e11da))
 - refactor(eval): auto-derive test sets from suite registry ([#2017](https://github.com/gptme/gptme/issues/2017)) ([`4929fd13a`](https://github.com/gptme/gptme/commit/4929fd13a))
 - Revert "fix(server): hide reasoning blocks from visible output ([#1999](https://github.com/gptme/gptme/issues/1999))" ([#2001](https://github.com/gptme/gptme/issues/2001)) ([`1c1b2f79d`](https://github.com/gptme/gptme/commit/1c1b2f79d))
 - docs(eval): sync suite overview to practical19 and harden autodiscovery test ([#1989](https://github.com/gptme/gptme/issues/1989)) ([`41b7f898d`](https://github.com/gptme/gptme/commit/41b7f898d))
 - docs: add webui/AGENTS.md with architecture notes and gotchas ([#1979](https://github.com/gptme/gptme/issues/1979)) ([`403da33e1`](https://github.com/gptme/gptme/commit/403da33e1))
 - docs: increase commands.rst TOC depth to 3 ([`b2dd7c1ce`](https://github.com/gptme/gptme/commit/b2dd7c1ce))
 - test(computer): assert screenshot resize dimensions ([#1969](https://github.com/gptme/gptme/issues/1969)) ([`ee2a6ce4a`](https://github.com/gptme/gptme/commit/ee2a6ce4a))
 - refactor: avoid redundant str.split() calls in content and choice utils ([#1939](https://github.com/gptme/gptme/issues/1939)) ([`f723e7a5a`](https://github.com/gptme/gptme/commit/f723e7a5a))
 - test(prompt): fix FIXME — enable simple filename highlighting test ([#1936](https://github.com/gptme/gptme/issues/1936)) ([`f57ac8311`](https://github.com/gptme/gptme/commit/f57ac8311))
 - test(server): add 59 tests for agents and session API endpoints ([#1918](https://github.com/gptme/gptme/issues/1918)) ([`4ca7f4c6c`](https://github.com/gptme/gptme/commit/4ca7f4c6c))
 - perf(server): speed up conversation list/search with tail-only JSONL scan ([#1916](https://github.com/gptme/gptme/issues/1916)) ([`2b5f88adb`](https://github.com/gptme/gptme/commit/2b5f88adb))
 - test(server): add 84 tests for api_v2_common and session_models modules ([#1899](https://github.com/gptme/gptme/issues/1899)) ([`84d6c8a61`](https://github.com/gptme/gptme/commit/84d6c8a61))
 - test(models): add 86 tests for model resolution and listing modules ([#1898](https://github.com/gptme/gptme/issues/1898)) ([`f05ec70fa`](https://github.com/gptme/gptme/commit/f05ec70fa))
 - test(context): strengthen vacuous assertions per Greptile review ([#1897](https://github.com/gptme/gptme/issues/1897)) ([`0f0ae2cfa`](https://github.com/gptme/gptme/commit/0f0ae2cfa))
 - test(context): expand test coverage for task_analyzer and adaptive_compressor ([#1896](https://github.com/gptme/gptme/issues/1896)) ([`3e6dbf0dd`](https://github.com/gptme/gptme/commit/3e6dbf0dd))
 - test(hooks): add 80 tests for cache_awareness and server_confirm modules ([#1895](https://github.com/gptme/gptme/issues/1895)) ([`c5990904e`](https://github.com/gptme/gptme/commit/c5990904e))
 - test(server): add 59 tests for tasks API module ([#1881](https://github.com/gptme/gptme/issues/1881)) ([`c9a5b02d9`](https://github.com/gptme/gptme/commit/c9a5b02d9))
 - test(tools): add 35 tests for browser thread module ([#1880](https://github.com/gptme/gptme/issues/1880)) ([`61408d8ce`](https://github.com/gptme/gptme/commit/61408d8ce))
 - test(webui): add 19 tests for workspace file components ([`f1a4a27de`](https://github.com/gptme/gptme/commit/f1a4a27de))
 - test(server): add 61 tests for workspace API endpoints ([#1874](https://github.com/gptme/gptme/issues/1874)) ([`d5b6bbba5`](https://github.com/gptme/gptme/commit/d5b6bbba5))
 - test(tools): add 172 tests for browser and mcp tools ([#1870](https://github.com/gptme/gptme/issues/1870)) ([`160ebde1d`](https://github.com/gptme/gptme/commit/160ebde1d))
 - test(tools): add 100 tests for shell_background and restart tools ([#1869](https://github.com/gptme/gptme/issues/1869)) ([`7176fd3f7`](https://github.com/gptme/gptme/commit/7176fd3f7))
 - test(tools): add 63 tests for complete and screenshot tools ([#1868](https://github.com/gptme/gptme/issues/1868)) ([`30b0026bf`](https://github.com/gptme/gptme/commit/30b0026bf))
 - test(tools): add 61 tests for precommit tool ([#1867](https://github.com/gptme/gptme/issues/1867)) ([`46ce2fc2b`](https://github.com/gptme/gptme/commit/46ce2fc2b))
 - test(tools): add 42 tests for lessons tool ([#1866](https://github.com/gptme/gptme/issues/1866)) ([`e84c25fec`](https://github.com/gptme/gptme/commit/e84c25fec))
 - test(mcp): mock registry lookup in CLI test ([#1865](https://github.com/gptme/gptme/issues/1865)) ([`f0c7ffcd9`](https://github.com/gptme/gptme/commit/f0c7ffcd9))
 - refactor(gh): trim tool sprawl, add CLI pass-through ([#1863](https://github.com/gptme/gptme/issues/1863)) ([`dc19041af`](https://github.com/gptme/gptme/commit/dc19041af))
 - test(tools): add 49 tests for shell_background.py ([#1854](https://github.com/gptme/gptme/issues/1854)) ([`1f0ff8ba9`](https://github.com/gptme/gptme/commit/1f0ff8ba9))
 - docs(plugins): document unified plugin registration system ([#1858](https://github.com/gptme/gptme/issues/1858)) ([`6e7b7862e`](https://github.com/gptme/gptme/commit/6e7b7862e))
 - test(tools): add 35 tests for autocommit hook and /commit command ([#1856](https://github.com/gptme/gptme/issues/1856)) ([`26bac3ba9`](https://github.com/gptme/gptme/commit/26bac3ba9))
 - test(tools): add 44 tests for morph tool editing infrastructure ([#1855](https://github.com/gptme/gptme/issues/1855)) ([`07eec0669`](https://github.com/gptme/gptme/commit/07eec0669))
 - test(util): add 73 tests for install, interrupt, and terminal utilities ([#1850](https://github.com/gptme/gptme/issues/1850)) ([`9e31a1aec`](https://github.com/gptme/gptme/commit/9e31a1aec))
 - test(dirs): add 40 tests for directory resolution and path utilities ([#1845](https://github.com/gptme/gptme/issues/1845)) ([`26597bed5`](https://github.com/gptme/gptme/commit/26597bed5))
 - test(util): add 88 tests for keyword_matching and file_storage ([#1843](https://github.com/gptme/gptme/issues/1843)) ([`6087f97d4`](https://github.com/gptme/gptme/commit/6087f97d4))
 - test(tools): add 85 tests for base.py tool infrastructure ([#1842](https://github.com/gptme/gptme/issues/1842)) ([`ad160739d`](https://github.com/gptme/gptme/commit/ad160739d))
 - refactor(gh): extract common ref-parsing and repo-resolution helpers ([#1840](https://github.com/gptme/gptme/issues/1840)) ([`d885cd141`](https://github.com/gptme/gptme/commit/d885cd141))
 - test(util): add 105 unit tests for content, tool_format, and cost utilities ([#1826](https://github.com/gptme/gptme/issues/1826)) ([`0f4362210`](https://github.com/gptme/gptme/commit/0f4362210))
 - test(lessons): add 90 unit tests for lesson system core ([#1824](https://github.com/gptme/gptme/issues/1824)) ([`ac3fa9602`](https://github.com/gptme/gptme/commit/ac3fa9602))
 - test(gh): add 43 unit tests for gh tool functions ([#1823](https://github.com/gptme/gptme/issues/1823)) ([`2c78f302c`](https://github.com/gptme/gptme/commit/2c78f302c))
 - test(auth): add 55 unit tests for LLM auth helpers ([`47d78d0f2`](https://github.com/gptme/gptme/commit/47d78d0f2))
 - refactor(eval): move leaderboard into eval module, add --leaderboard CLI flag ([#1809](https://github.com/gptme/gptme/issues/1809)) ([`3be81fb77`](https://github.com/gptme/gptme/commit/3be81fb77))
 - refactor(eval): auto-discover eval suites instead of manual registration ([#1808](https://github.com/gptme/gptme/issues/1808)) ([`2d668eb70`](https://github.com/gptme/gptme/commit/2d668eb70))
 - test(prompts): add unit tests for prompt templates, context_cmd, and helpers ([`7117052f0`](https://github.com/gptme/gptme/commit/7117052f0))
 - test(commands): add unit tests for command registry and dispatch system ([#1802](https://github.com/gptme/gptme/issues/1802)) ([`a17f87849`](https://github.com/gptme/gptme/commit/a17f87849))
 - test(executor): add unit tests for shared execution infrastructure ([#1801](https://github.com/gptme/gptme/issues/1801)) ([`5a35c96c0`](https://github.com/gptme/gptme/commit/5a35c96c0))
 - test(init): add unit tests for core initialization module ([#1796](https://github.com/gptme/gptme/issues/1796)) ([`00a4cbbed`](https://github.com/gptme/gptme/commit/00a4cbbed))
 - test(info): add unit tests for system/environment info module ([#1795](https://github.com/gptme/gptme/issues/1795)) ([`fea4e5fda`](https://github.com/gptme/gptme/commit/fea4e5fda))
 - test(hooks): add unit tests for hook registry module ([#1794](https://github.com/gptme/gptme/issues/1794)) ([`0feeac38d`](https://github.com/gptme/gptme/commit/0feeac38d))
 - test(vision): add unit tests for view_image function ([#1790](https://github.com/gptme/gptme/issues/1790)) ([`fc380bf1f`](https://github.com/gptme/gptme/commit/fc380bf1f))
 - test(shell): add unit tests for shell_validation module ([#1791](https://github.com/gptme/gptme/issues/1791)) ([`e796b3cc6`](https://github.com/gptme/gptme/commit/e796b3cc6))
 - test(subagent): add unit tests for refactored subagent package ([#1779](https://github.com/gptme/gptme/issues/1779)) ([`cd740d8bd`](https://github.com/gptme/gptme/commit/cd740d8bd))
 - docs(profiles): update browser-use profile with interactive browsing functions ([#1776](https://github.com/gptme/gptme/issues/1776)) ([`180123615`](https://github.com/gptme/gptme/commit/180123615))
 - refactor(subagent): split into modular package ([#1773](https://github.com/gptme/gptme/issues/1773)) ([`023e99fbb`](https://github.com/gptme/gptme/commit/023e99fbb))
 - refactor(prompts): move context_cmd output after static content for better caching ([#1768](https://github.com/gptme/gptme/issues/1768)) ([`2f4829f2c`](https://github.com/gptme/gptme/commit/2f4829f2c))
 - refactor(models): split models.py into modular sub-files (-90%) ([#1759](https://github.com/gptme/gptme/issues/1759)) ([`d604ca94e`](https://github.com/gptme/gptme/commit/d604ca94e))
 - refactor(logmanager): split logmanager.py into modular sub-files (-95%) ([#1756](https://github.com/gptme/gptme/issues/1756)) ([`4574b326e`](https://github.com/gptme/gptme/commit/4574b326e))
 - refactor(config): split config.py into modular sub-files (-93%) ([#1754](https://github.com/gptme/gptme/issues/1754)) ([`deb5072fb`](https://github.com/gptme/gptme/commit/deb5072fb))
 - refactor(autocompact): split autocompact.py into modular sub-files (-96%) ([`656027c22`](https://github.com/gptme/gptme/commit/656027c22))
 - refactor(prompts): split prompts.py into modular sub-files (-71%) ([#1752](https://github.com/gptme/gptme/issues/1752)) ([`bc6cdd68b`](https://github.com/gptme/gptme/commit/bc6cdd68b))
 - refactor(hooks): split __init__.py into types + registry sub-modules (-79%) ([#1751](https://github.com/gptme/gptme/issues/1751)) ([`867dc1199`](https://github.com/gptme/gptme/commit/867dc1199))
 - refactor(server): split api_v2_sessions.py into modular sub-files (-64%) ([#1747](https://github.com/gptme/gptme/issues/1747)) ([`1227fe0e5`](https://github.com/gptme/gptme/commit/1227fe0e5))
 - refactor(subagent): extract execution backends into subagent_execution.py ([#1745](https://github.com/gptme/gptme/issues/1745)) ([`1a58369e4`](https://github.com/gptme/gptme/commit/1a58369e4))
 - refactor(cli): split util.py into modular command files (-57%) ([#1743](https://github.com/gptme/gptme/issues/1743)) ([`e861bc842`](https://github.com/gptme/gptme/commit/e861bc842))
 - refactor(shell): split shell.py into modular sub-files (-34%) ([#1744](https://github.com/gptme/gptme/issues/1744)) ([`473385144`](https://github.com/gptme/gptme/commit/473385144))
 - refactor(util): deduplicate flush_stdin into terminal.py ([#1741](https://github.com/gptme/gptme/issues/1741)) ([`4bee516c6`](https://github.com/gptme/gptme/commit/4bee516c6))
 - refactor(server): remove V1 API endpoints (-564 lines) ([#1740](https://github.com/gptme/gptme/issues/1740)) ([`6b3a86e2b`](https://github.com/gptme/gptme/commit/6b3a86e2b))
 - refactor(server): extract shared code from V1 API module ([#1738](https://github.com/gptme/gptme/issues/1738)) ([`ea66d1529`](https://github.com/gptme/gptme/commit/ea66d1529))
 - refactor: remove 9 unused scripts (-1,437 lines) ([#1737](https://github.com/gptme/gptme/issues/1737)) ([`0698f60d4`](https://github.com/gptme/gptme/commit/0698f60d4))
 - refactor: move TTS tool to gptme-contrib plugin ([#1735](https://github.com/gptme/gptme/issues/1735)) ([`cd4739402`](https://github.com/gptme/gptme/commit/cd4739402))
 - refactor(lessons): remove unused EnhancedLessonMatcher dead code cluster ([#1736](https://github.com/gptme/gptme/issues/1736)) ([`5005e47b4`](https://github.com/gptme/gptme/commit/5005e47b4))
 - refactor: remove 47 unused type: ignore comments ([#1733](https://github.com/gptme/gptme/issues/1733)) ([`fbc2f17cc`](https://github.com/gptme/gptme/commit/fbc2f17cc))
 - refactor: move youtube tool to gptme-contrib plugin ([#1734](https://github.com/gptme/gptme/issues/1734)) ([`e97772965`](https://github.com/gptme/gptme/commit/e97772965))
 - test(llm): add integration tests for model-dependent break_on_tooluse default ([#1729](https://github.com/gptme/gptme/issues/1729)) ([`a4066e8f4`](https://github.com/gptme/gptme/commit/a4066e8f4))
 - refactor(models): move deprecated models to separate files ([#1732](https://github.com/gptme/gptme/issues/1732)) ([`edab9f588`](https://github.com/gptme/gptme/commit/edab9f588))
 - autoresearch(gptme): improve practical5 pass rate 0.778 → 1.000 ([#1723](https://github.com/gptme/gptme/issues/1723)) ([`da798cec8`](https://github.com/gptme/gptme/commit/da798cec8))
 - refactor(eval): use specific exception types and cleaner imports ([#1716](https://github.com/gptme/gptme/issues/1716)) ([`8ef484698`](https://github.com/gptme/gptme/commit/8ef484698))
 - docs(evals): update eval docs — fix model, expand suite listing ([#1712](https://github.com/gptme/gptme/issues/1712)) ([`92504ab80`](https://github.com/gptme/gptme/commit/92504ab80))
 - autoresearch(gptme): improve practical5 pass rate 0.556 → 1.000 ([#1702](https://github.com/gptme/gptme/issues/1702)) ([`f500d590b`](https://github.com/gptme/gptme/commit/f500d590b))
 - test(eval): add runtime guard and test for duplicate test names ([#1665](https://github.com/gptme/gptme/issues/1665)) ([`44059ef1e`](https://github.com/gptme/gptme/commit/44059ef1e))
 - chore: delete ellipsis.yaml ([`995927a0f`](https://github.com/gptme/gptme/commit/995927a0f))
 - refactor: consolidate release pipeline into single workflow ([#1643](https://github.com/gptme/gptme/issues/1643)) ([`389ff5fb1`](https://github.com/gptme/gptme/commit/389ff5fb1))
 - refactor(message): nest token fields under `usage` in MessageMetadata ([#1638](https://github.com/gptme/gptme/issues/1638)) ([`1d5d5a670`](https://github.com/gptme/gptme/commit/1d5d5a670))
 - docs: remove incorrect claim that Bob's workspace is open source ([`4dfc40014`](https://github.com/gptme/gptme/commit/4dfc40014))
 - chore: add make tiny summary + refactor gh tool complexity ([#1630](https://github.com/gptme/gptme/issues/1630)) ([`065ccd937`](https://github.com/gptme/gptme/commit/065ccd937))
 - docs: expand autonomous agents in README, remove private agent mentions ([`ad9439f7f`](https://github.com/gptme/gptme/commit/ad9439f7f))
 - docs: expand Autonomous Agents section in features.rst ([`08648e757`](https://github.com/gptme/gptme/commit/08648e757))
 - docs: add features overview page ([`e177b4782`](https://github.com/gptme/gptme/commit/e177b4782))
 - test(tauri): add Rust unit tests for IPC commands and deep-link parsing ([#1598](https://github.com/gptme/gptme/issues/1598)) ([`bf7e1faf2`](https://github.com/gptme/gptme/commit/bf7e1faf2))
 - test(eval): expand basic suite with 4 practical agent capability tests ([#1607](https://github.com/gptme/gptme/issues/1607)) ([`8771579eb`](https://github.com/gptme/gptme/commit/8771579eb))
 - Merge remote-tracking branch 'origin/feat/tauri-subtree-merge' ([`3f1fd34db`](https://github.com/gptme/gptme/commit/3f1fd34db))
 - Add 'tauri/' from commit '4e2aadaf348b6c2d917e7d4edee9d350785995f2' ([`c680b290e`](https://github.com/gptme/gptme/commit/c680b290e))
 - docs: comprehensive README improvements (MCP, ACP, plugins, skills, ecosystem) ([#1553](https://github.com/gptme/gptme/issues/1553)) ([`d3f27bec9`](https://github.com/gptme/gptme/commit/d3f27bec9))
 - docs(custom_tool): document --tools file loading and /tools load command ([#1547](https://github.com/gptme/gptme/issues/1547)) ([`46a6de62e`](https://github.com/gptme/gptme/commit/46a6de62e))
 - docs: document /tools load command and gptme managed service provider ([#1544](https://github.com/gptme/gptme/issues/1544)) ([`233c227a8`](https://github.com/gptme/gptme/commit/233c227a8))
 - refactor(auto-naming): consolidate duplicated auto-naming logic ([#1542](https://github.com/gptme/gptme/issues/1542)) ([`7f7320485`](https://github.com/gptme/gptme/commit/7f7320485))
 - test(hooks): add tests for cli_confirm and form_autodetect ([`c27fdbc09`](https://github.com/gptme/gptme/commit/c27fdbc09))
 - test(hooks): add tests for cost_awareness, token_awareness, server_confirm, server_elicit ([#1535](https://github.com/gptme/gptme/issues/1535)) ([`0e82bfb71`](https://github.com/gptme/gptme/commit/0e82bfb71))
 - test(hooks): add tests for markdown_validation, agents_md_inject, active_context ([#1533](https://github.com/gptme/gptme/issues/1533)) ([`863b31db6`](https://github.com/gptme/gptme/commit/863b31db6))
 - test(hooks): add tests for cwd_tracking, time_awareness, and auto_confirm ([#1520](https://github.com/gptme/gptme/issues/1520)) ([`0ca92d635`](https://github.com/gptme/gptme/commit/0ca92d635))
 - test(shell): add tests for allowlist auto-confirm behavior ([#1508](https://github.com/gptme/gptme/issues/1508)) ([`a8ac588ab`](https://github.com/gptme/gptme/commit/a8ac588ab))
 - refactor(info): parse extras from package metadata instead of hardcoding ([#1517](https://github.com/gptme/gptme/issues/1517)) ([`94e2eb342`](https://github.com/gptme/gptme/commit/94e2eb342))
 - style: use shared prompt_alert() for consistent alert styling ([#1516](https://github.com/gptme/gptme/issues/1516)) ([`32f600c88`](https://github.com/gptme/gptme/commit/32f600c88))
 - docs: add gptme acronym interpretations ([#1515](https://github.com/gptme/gptme/issues/1515)) ([`be1874651`](https://github.com/gptme/gptme/commit/be1874651))
 - style: use shared prompt_alert() for consistent alert styling ([#1510](https://github.com/gptme/gptme/issues/1510)) ([`1e5c7ac1c`](https://github.com/gptme/gptme/commit/1e5c7ac1c))
 - docs: add AGENTS.md with agent-specific development guidelines ([#1504](https://github.com/gptme/gptme/issues/1504)) ([`917167fdf`](https://github.com/gptme/gptme/commit/917167fdf))
 - refactor(context): return mention counts from get_mentioned_files ([#1501](https://github.com/gptme/gptme/issues/1501)) ([`df05462bd`](https://github.com/gptme/gptme/commit/df05462bd))
 - test(computer): expand test coverage from 9 to 51 tests ([#1498](https://github.com/gptme/gptme/issues/1498)) ([`c6b48ffa1`](https://github.com/gptme/gptme/commit/c6b48ffa1))
 - refactor: use Message.concat() in Anthropic provider ([#1494](https://github.com/gptme/gptme/issues/1494)) ([`c5446adce`](https://github.com/gptme/gptme/commit/c5446adce))
 - test(context): add image auto-attach pipeline tests + debug logging ([#1493](https://github.com/gptme/gptme/issues/1493)) ([`919e25807`](https://github.com/gptme/gptme/commit/919e25807))
 - revert: undo unconditional chdir that breaks cd persistence ([#1400](https://github.com/gptme/gptme/issues/1400)) ([#1487](https://github.com/gptme/gptme/issues/1487)) ([`e90f9e533`](https://github.com/gptme/gptme/commit/e90f9e533))
 - test(agent): add e2e coverage for gptme-agent create template path ([#1468](https://github.com/gptme/gptme/issues/1468)) ([`d98f265ac`](https://github.com/gptme/gptme/commit/d98f265ac))
 - docs(skills): clarify standards-aligned scope and plugin boundary ([#1467](https://github.com/gptme/gptme/issues/1467)) ([`5a53a6ac1`](https://github.com/gptme/gptme/commit/5a53a6ac1))
 - refactor: remove obsolete gptme-webui submodule, use gptme's built-in webui ([#9](https://github.com/gptme/gptme/issues/9)) ([`632362c32`](https://github.com/gptme/gptme/commit/632362c32))
 - chore: bump ruff-pre-commit v0.6.9 → v0.15.2 ([#1431](https://github.com/gptme/gptme/issues/1431)) ([`3e8b53273`](https://github.com/gptme/gptme/commit/3e8b53273))
 - Support GPTME_ prefix for environment variables ([#1416](https://github.com/gptme/gptme/issues/1416)) ([`57a351909`](https://github.com/gptme/gptme/commit/57a351909))
 - style: rename deprecated ruff TCH rules to TC ([#1426](https://github.com/gptme/gptme/issues/1426)) ([`7dd0f699c`](https://github.com/gptme/gptme/commit/7dd0f699c))
 - style: enable PT011/PT022 rules, clean up unused noqa and imports ([#1408](https://github.com/gptme/gptme/issues/1408)) ([`c76997b55`](https://github.com/gptme/gptme/commit/c76997b55))
 - style: enable FLY, ISC, PLE, PERF ruff rules ([#1398](https://github.com/gptme/gptme/issues/1398)) ([`3b8fcb8c7`](https://github.com/gptme/gptme/commit/3b8fcb8c7))
 - style: enable TCH, PIE810, PT003/PT006/PT022 ruff rules ([#1407](https://github.com/gptme/gptme/issues/1407)) ([`b71909506`](https://github.com/gptme/gptme/commit/b71909506))
 - style: remove self-assignment and add timezone to datetime.now() calls ([#1404](https://github.com/gptme/gptme/issues/1404)) ([`d3d918b43`](https://github.com/gptme/gptme/commit/d3d918b43))
 - refactor(acp): remove unused adapter scaffolding ([#1397](https://github.com/gptme/gptme/issues/1397)) ([`bb0179fcb`](https://github.com/gptme/gptme/commit/bb0179fcb))
 - style: add explicit check param to subprocess.run() calls (PLW1510) ([#1403](https://github.com/gptme/gptme/issues/1403)) ([`658d1cce2`](https://github.com/gptme/gptme/commit/658d1cce2))
 - test(autocompact): add unit tests for semantic and reference scoring functions ([#1387](https://github.com/gptme/gptme/issues/1387)) ([`131dc0966`](https://github.com/gptme/gptme/commit/131dc0966))
 - test(tools): add unit tests for choice and elicit tool parsing ([#1385](https://github.com/gptme/gptme/issues/1385)) ([`084dceb6d`](https://github.com/gptme/gptme/commit/084dceb6d))
 - test(llm): add unit tests for shared LLM utility functions ([#1382](https://github.com/gptme/gptme/issues/1382)) ([`bfd1cc211`](https://github.com/gptme/gptme/commit/bfd1cc211))
 - test(util): add unit tests for tokens, cost_display, and export modules ([#1383](https://github.com/gptme/gptme/issues/1383)) ([`780acc00c`](https://github.com/gptme/gptme/commit/780acc00c))
 - style: enable additional ruff rules (C4, FURB, RSE, RET, RUF) ([#1381](https://github.com/gptme/gptme/issues/1381)) ([`a5fb1842d`](https://github.com/gptme/gptme/commit/a5fb1842d))
 - style: enable SIM103, SIM110, SIM117, SIM300, SIM910, RET505 ruff rules ([#1378](https://github.com/gptme/gptme/issues/1378)) ([`3c3dacc6a`](https://github.com/gptme/gptme/commit/3c3dacc6a))
 - style: enable SIM118, PIE790, RET501 ruff rules ([#1375](https://github.com/gptme/gptme/issues/1375)) ([`11d59f23d`](https://github.com/gptme/gptme/commit/11d59f23d))
 - test(acp): add per-session model override tests ([#1370](https://github.com/gptme/gptme/issues/1370)) ([`4aefb0c0f`](https://github.com/gptme/gptme/commit/4aefb0c0f))
 - chore: remove dead TYPE_CHECKING blocks with empty pass bodies ([#1369](https://github.com/gptme/gptme/issues/1369)) ([`15750f6a5`](https://github.com/gptme/gptme/commit/15750f6a5))
 - refactor: move inline lynx tests to proper test file ([#1367](https://github.com/gptme/gptme/issues/1367)) ([`d955fd670`](https://github.com/gptme/gptme/commit/d955fd670))
 - chore: remove commented-out dead code across 7 files ([#1365](https://github.com/gptme/gptme/issues/1365)) ([`8f374dd2b`](https://github.com/gptme/gptme/commit/8f374dd2b))
 - refactor: remove deprecated parallel tool execution module ([#1361](https://github.com/gptme/gptme/issues/1361)) ([`bc28ee093`](https://github.com/gptme/gptme/commit/bc28ee093))
 - style: fix E402 import ordering in codeblock.py and plugins/__init__.py ([#1353](https://github.com/gptme/gptme/issues/1353)) ([`51e06a6b4`](https://github.com/gptme/gptme/commit/51e06a6b4))
 - chore(deps): bump pillow, cryptography, protobuf for security fixes ([#1351](https://github.com/gptme/gptme/issues/1351)) ([`8f65c8b68`](https://github.com/gptme/gptme/commit/8f65c8b68))
 - chore: update deprecated model references and remove stale noqa ([#1350](https://github.com/gptme/gptme/issues/1350)) ([`2beb00810`](https://github.com/gptme/gptme/commit/2beb00810))
 - test: remove stale xfail and fix unclosed file handles ([#1349](https://github.com/gptme/gptme/issues/1349)) ([`a08b6e4a7`](https://github.com/gptme/gptme/commit/a08b6e4a7))
 - refactor(llm): replace duplicate model entries with MODEL_ALIASES ([#1348](https://github.com/gptme/gptme/issues/1348)) ([`44a67a8c7`](https://github.com/gptme/gptme/commit/44a67a8c7))
 - chore: remove 6 unused type: ignore comments ([#1345](https://github.com/gptme/gptme/issues/1345)) ([`64f8e0602`](https://github.com/gptme/gptme/commit/64f8e0602))
 - docs: update stale xai model example (grok-beta → grok-4) ([#1343](https://github.com/gptme/gptme/issues/1343)) ([`3a9c5f585`](https://github.com/gptme/gptme/commit/3a9c5f585))
 - chore: remove redundant assert and str() calls ([#1340](https://github.com/gptme/gptme/issues/1340)) ([`1f1e9da87`](https://github.com/gptme/gptme/commit/1f1e9da87))
 - chore: remove dead browser tests and fix shell.py type safety ([#1339](https://github.com/gptme/gptme/issues/1339)) ([`7c75db589`](https://github.com/gptme/gptme/commit/7c75db589))
 - chore: remove stale TODO comments ([#1335](https://github.com/gptme/gptme/issues/1335)) ([`e14dee3a0`](https://github.com/gptme/gptme/commit/e14dee3a0))
 - docs: fix config path in custom-providers.md (gptme.toml → config.toml) ([#1333](https://github.com/gptme/gptme/issues/1333)) ([`c382491e8`](https://github.com/gptme/gptme/commit/c382491e8))
 - test(util): add comprehensive tests for tree.py workspace listing ([#1303](https://github.com/gptme/gptme/issues/1303)) ([`a96b099f6`](https://github.com/gptme/gptme/commit/a96b099f6))
 - test(acp): add comprehensive unit tests for types, adapter, and agent ([#1275](https://github.com/gptme/gptme/issues/1275)) ([`4a5d2b765`](https://github.com/gptme/gptme/commit/4a5d2b765))
 - refactor(eval): replace model@format strings with typed ModelConfig dataclass ([#1280](https://github.com/gptme/gptme/issues/1280)) ([`744ff9ec8`](https://github.com/gptme/gptme/commit/744ff9ec8))
 - chore: update default model references to current versions ([#1278](https://github.com/gptme/gptme/issues/1278)) ([`84e740706`](https://github.com/gptme/gptme/commit/84e740706))
 - docs: recommend gptme-agent CLI for creating and managing agents ([#1260](https://github.com/gptme/gptme/issues/1260)) ([`86c60356f`](https://github.com/gptme/gptme/commit/86c60356f))
 - refactor(tools): combine todoread/todowrite into single todo tool ([#1242](https://github.com/gptme/gptme/issues/1242)) ([`76732bca0`](https://github.com/gptme/gptme/commit/76732bca0))
 - refactor(commands): add auto_undo to command decorator ([#1244](https://github.com/gptme/gptme/issues/1244)) ([`a073a8b49`](https://github.com/gptme/gptme/commit/a073a8b49))
 - chore(deps): bump actions/checkout from 4 to 6 ([#1221](https://github.com/gptme/gptme/issues/1221)) ([`b2e32c7bd`](https://github.com/gptme/gptme/commit/b2e32c7bd))
 - chore(deps): bump actions/setup-node from 4 to 6 ([#1220](https://github.com/gptme/gptme/issues/1220)) ([`767ce42f7`](https://github.com/gptme/gptme/commit/767ce42f7))
 - chore(deps): bump actions/setup-python from 5 to 6 ([#1222](https://github.com/gptme/gptme/issues/1222)) ([`6b85679a7`](https://github.com/gptme/gptme/commit/6b85679a7))
 - chore(deps): bump actions/upload-artifact from 4 to 6 ([#1219](https://github.com/gptme/gptme/issues/1219)) ([`6ccabf95e`](https://github.com/gptme/gptme/commit/6ccabf95e))
 - chore: merge gptme-webui into webui/ folder ([`e2fa294dd`](https://github.com/gptme/gptme/commit/e2fa294dd))
 - chore: merge latest gptme-webui commits ([`8c8a9937b`](https://github.com/gptme/gptme/commit/8c8a9937b))
 - docs: improve system dependencies organization ([`1510bcdcb`](https://github.com/gptme/gptme/commit/1510bcdcb))
 - docs: add source installation and extras documentation ([`d68293cb4`](https://github.com/gptme/gptme/commit/d68293cb4))
 - refactor(llm): add TypedDict for message dict typing ([#1195](https://github.com/gptme/gptme/issues/1195)) ([`89d467b98`](https://github.com/gptme/gptme/commit/89d467b98))
 - docs: improve README with minor fixes ([#1191](https://github.com/gptme/gptme/issues/1191)) ([`f8af34076`](https://github.com/gptme/gptme/commit/f8af34076))
 - test: fixed test ([`5d933eb62`](https://github.com/gptme/gptme/commit/5d933eb62))
 - refactor(agent): rename setup command to create ([#1185](https://github.com/gptme/gptme/issues/1185)) ([`29c9a0bab`](https://github.com/gptme/gptme/commit/29c9a0bab))
 - docs(lessons): add worktree best practices with /tmp/ recommendation ([`c94594d9c`](https://github.com/gptme/gptme/commit/c94594d9c))
 - refactor: move top-level files to appropriate modules ([#1175](https://github.com/gptme/gptme/issues/1175)) ([`4cae46f99`](https://github.com/gptme/gptme/commit/4cae46f99))
 - test: add slow marker to test_load_context_files_truncates_long_files ([`d8f7805a6`](https://github.com/gptme/gptme/commit/d8f7805a6))
 - refactor: move CLI into gptme/cli/ module ([#1173](https://github.com/gptme/gptme/issues/1173)) ([`5e3e80ce9`](https://github.com/gptme/gptme/commit/5e3e80ce9))
 - Add 'webui/' from commit '6c0df0cad5a6316b96b91840fb39b29c082fe8c9' ([`fad8287c3`](https://github.com/gptme/gptme/commit/fad8287c3))
 - docs: clarify lessons vs skills distinction ([#1169](https://github.com/gptme/gptme/issues/1169)) ([`6d5428931`](https://github.com/gptme/gptme/commit/6d5428931))
 - Replace hasattr checks with isinstance for type safety ([#1161](https://github.com/gptme/gptme/issues/1161)) ([`163678ed9`](https://github.com/gptme/gptme/commit/163678ed9))
 - docs: improve README (again) ([`ff2960e40`](https://github.com/gptme/gptme/commit/ff2960e40))
 - docs: improve README ([`9fd1f47cb`](https://github.com/gptme/gptme/commit/9fd1f47cb))
 - docs: improve README ([`5e3e358c9`](https://github.com/gptme/gptme/commit/5e3e358c9))
 - docs: fill News section and update Timeline with recent milestones ([#1143](https://github.com/gptme/gptme/issues/1143)) ([`baf1cd110`](https://github.com/gptme/gptme/commit/baf1cd110))
 - docs: fill News section with major milestones and ecosystem highlights ([`afe29ad7e`](https://github.com/gptme/gptme/commit/afe29ad7e))
 - perf(ui): optimize first message latency with optimistic UI ([#104](https://github.com/gptme/gptme/issues/104)) ([`dc53c3821`](https://github.com/gptme/gptme/commit/dc53c3821))
 - refactor: use ContextVar for thread-safe shell sessions ([#1089](https://github.com/gptme/gptme/issues/1089)) ([`aa738bb09`](https://github.com/gptme/gptme/commit/aa738bb09))
 - format: fixed formatting ([`082841ed6`](https://github.com/gptme/gptme/commit/082841ed6))
 - refactor(chat): remove vestigial _recently_interrupted variable ([#1039](https://github.com/gptme/gptme/issues/1039)) ([`56ca13b4b`](https://github.com/gptme/gptme/commit/56ca13b4b))
 - refactor(dspy): archive GptmeReasoningProgram, simplify GEPA ([#1128](https://github.com/gptme/gptme/issues/1128)) ([`3ade55080`](https://github.com/gptme/gptme/commit/3ade55080))
 - test(gh): update mocked tests for comment ID format ([#1102](https://github.com/gptme/gptme/issues/1102)) ([`bdbc13f03`](https://github.com/gptme/gptme/commit/bdbc13f03))
 - refactor(hooks): adopt OpenCode-style dot-notation naming ([#1099](https://github.com/gptme/gptme/issues/1099)) ([`f1d152743`](https://github.com/gptme/gptme/commit/f1d152743))
 - docs(security): add warning about gptme.toml trust in untrusted repos ([#1082](https://github.com/gptme/gptme/issues/1082)) ([`44d0dcacc`](https://github.com/gptme/gptme/commit/44d0dcacc))
 - docs: add glossary with step/turn terminology ([#1076](https://github.com/gptme/gptme/issues/1076)) ([`911bbd023`](https://github.com/gptme/gptme/commit/911bbd023))
 - refactor: split commands.py into modular commands/ package ([#1073](https://github.com/gptme/gptme/issues/1073)) ([`36cc81dff`](https://github.com/gptme/gptme/commit/36cc81dff))
 - refactor(llm): remove dead code in _chat_complete control flow ([#1069](https://github.com/gptme/gptme/issues/1069)) ([`28c51d912`](https://github.com/gptme/gptme/commit/28c51d912))
 - docs(security): add security documentation and SECURITY.md ([#1024](https://github.com/gptme/gptme/issues/1024)) ([`372e654af`](https://github.com/gptme/gptme/commit/372e654af))
 - docs: add comprehensive commands reference documentation ([#1008](https://github.com/gptme/gptme/issues/1008)) ([`4545c64d5`](https://github.com/gptme/gptme/commit/4545c64d5))
 - refactor: separate multi-tool from parallel execution ([#1006](https://github.com/gptme/gptme/issues/1006)) ([`b57ed2100`](https://github.com/gptme/gptme/commit/b57ed2100))
 - docs: document plugins in project config ([#1007](https://github.com/gptme/gptme/issues/1007)) ([`5ddbd06bd`](https://github.com/gptme/gptme/commit/5ddbd06bd))
 - refactor(autocompact): truncate largest tool results first ([`79fd943dc`](https://github.com/gptme/gptme/commit/79fd943dc))
 - docs: fixed cloc commands to have cleaner output ([`045fb376c`](https://github.com/gptme/gptme/commit/045fb376c))
 - chore: cleaned up old md file ([`e8c0e17ec`](https://github.com/gptme/gptme/commit/e8c0e17ec))
 - docs: improved file list for cloc groups ([`228a2bed0`](https://github.com/gptme/gptme/commit/228a2bed0))
 - chore: remove unfinished gptme-ncurses ([`cc7c08475`](https://github.com/gptme/gptme/commit/cc7c08475))
 - refactor(session): add shared session module for ACP/server ([#982](https://github.com/gptme/gptme/issues/982)) ([`fd0e236b6`](https://github.com/gptme/gptme/commit/fd0e236b6))
 - docs(acp): add Agent Client Protocol documentation ([#981](https://github.com/gptme/gptme/issues/981)) ([`8c1cf1f98`](https://github.com/gptme/gptme/commit/8c1cf1f98))
 - docs: improved the usage instructions, mention gptme.ai ([`f66a45693`](https://github.com/gptme/gptme/commit/f66a45693))
 - refactor: remove spammy per-token debug logging ([`9dadf72b8`](https://github.com/gptme/gptme/commit/9dadf72b8))
 - perf: prevent unnecessary state updates in MainLayout ([`367a9e5c8`](https://github.com/gptme/gptme/commit/367a9e5c8))
 - refactor: centralize examples system with user type support ([`6404776a3`](https://github.com/gptme/gptme/commit/6404776a3))
 - Model selector improvements (search, refactor, fixes), add name input in chat settings  ([#85](https://github.com/gptme/gptme/issues/85)) ([`af0f9e8e9`](https://github.com/gptme/gptme/commit/af0f9e8e9))
 - refactor: restructure right sidebar to fix padding and layout issues ([`01d6fae4f`](https://github.com/gptme/gptme/commit/01d6fae4f))
 - chore: set NO_STRIP on linux build only ([`a33d4473f`](https://github.com/gptme/gptme/commit/a33d4473f))
 - refactor: change agent.workspace to agent.path, use path as primary agent ID ([`70dfad00b`](https://github.com/gptme/gptme/commit/70dfad00b))
 - chore: updated gptme.toml ([`8d22592b3`](https://github.com/gptme/gptme/commit/8d22592b3))
 - chore: updated gptme.toml ([`1e4d22b18`](https://github.com/gptme/gptme/commit/1e4d22b18))
 - format: fixed formatting and lint ([`bdb44e6e0`](https://github.com/gptme/gptme/commit/bdb44e6e0))
 - format: fixed formatting and lint ([`12c64155f`](https://github.com/gptme/gptme/commit/12c64155f))
 - refactor: extract SuggestedActionsPanel and SuggestedActionsTips ([`23b49e484`](https://github.com/gptme/gptme/commit/23b49e484))
 - Fix tool confirmation cancellation and auto-stepping chime behavior ([#76](https://github.com/gptme/gptme/issues/76)) ([`aa275e1f4`](https://github.com/gptme/gptme/commit/aa275e1f4))
 - docs: add testing section to README ([#75](https://github.com/gptme/gptme/issues/75)) ([`9d1bec28f`](https://github.com/gptme/gptme/commit/9d1bec28f))
 - chore:skip rebuilding gptme-server if alredy built ([`3b25ed48c`](https://github.com/gptme/gptme/commit/3b25ed48c))
 - docs: added README ([`7b29ec1d0`](https://github.com/gptme/gptme/commit/7b29ec1d0))
 - format: fixed formatting ([`cd133266b`](https://github.com/gptme/gptme/commit/cd133266b))
 - refactor: simplify ChatInput component structure and fix button positioning ([`d99873249`](https://github.com/gptme/gptme/commit/d99873249))
 - refactor: consolidate conversation types and add workspace selector to ChatInput ([`5839db9d4`](https://github.com/gptme/gptme/commit/5839db9d4))
 - refactor: move positioning logic out of ChatInput to parent components ([`c7f44bb08`](https://github.com/gptme/gptme/commit/c7f44bb08))
 - chore: cargo fmt :( ([`71dbb3115`](https://github.com/gptme/gptme/commit/71dbb3115))
 - chore: set up gptme submodule and update .gitignore ([`01bd2c4cf`](https://github.com/gptme/gptme/commit/01bd2c4cf))
 - chore: fix broken Makefile ([`d8d9a855c`](https://github.com/gptme/gptme/commit/d8d9a855c))
 - chore: delete react folder and related files ([`5e174df26`](https://github.com/gptme/gptme/commit/5e174df26))
 - Initial setup of gptme-tauri project with React and TypeScript ([`9e657fe02`](https://github.com/gptme/gptme/commit/9e657fe02))
 - refactor: refactor conversation settings component ([#61](https://github.com/gptme/gptme/issues/61)) ([`84bc99c28`](https://github.com/gptme/gptme/commit/84bc99c28))
 - chore: fixed deprecated .pre-commit-config.yml format ([`1b1b5c458`](https://github.com/gptme/gptme/commit/1b1b5c458))
 - docs: update README.md gptengineer.app -> lovable.dev ([#50](https://github.com/gptme/gptme/issues/50)) ([`729c171b8`](https://github.com/gptme/gptme/commit/729c171b8))
 - test: added basic e2e tests ([#46](https://github.com/gptme/gptme/issues/46)) ([`cc37ad76b`](https://github.com/gptme/gptme/commit/cc37ad76b))
 - refactor: refactored to allow using as submodule ([#39](https://github.com/gptme/gptme/issues/39)) ([`59ef067a5`](https://github.com/gptme/gptme/commit/59ef067a5))
 - refactor: minor fixes ([`f2dc9b96a`](https://github.com/gptme/gptme/commit/f2dc9b96a))
 - refactor: wip v2 api stuff (remove v1 api support, among other things) ([`83aa97918`](https://github.com/gptme/gptme/commit/83aa97918))
 - chore: replace old (personal) repo-links ([#16](https://github.com/gptme/gptme/issues/16)) ([`d4f35a301`](https://github.com/gptme/gptme/commit/d4f35a301))
 - chore: removed unused file ([`dd2b1fb3e`](https://github.com/gptme/gptme/commit/dd2b1fb3e))
 - chore: disable prettier for md files ([`a68d7b796`](https://github.com/gptme/gptme/commit/a68d7b796))
 - format: set up prettier and formatted project ([`8e45fa689`](https://github.com/gptme/gptme/commit/8e45fa689))
 - Reverted to edit 8b3959ef-92d3-4cfe-a9ed-1d26d2244f9d: "feat: add dynamic page titles based on selected conversation" ([`9d3725158`](https://github.com/gptme/gptme/commit/9d3725158))
 - Reverted to edit 92595471-e0eb-4f82-8df6-cce9b1afc166: "Add external link icons to messages ([`1cacd4ad8`](https://github.com/gptme/gptme/commit/1cacd4ad8))
 - Update bottom left icons ([`1a25474ce`](https://github.com/gptme/gptme/commit/1a25474ce))
 - Add external link icons to messages ([`57f3cc2e0`](https://github.com/gptme/gptme/commit/57f3cc2e0))
 - Reverted to edit 8b3959ef-92d3-4cfe-a9ed-1d26d2244f9d: "feat: add dynamic page titles based on selected conversation" ([`1e351207c`](https://github.com/gptme/gptme/commit/1e351207c))
 - Fix TypeScript errors in markdownUtils ([`f544d3cc9`](https://github.com/gptme/gptme/commit/f544d3cc9))
 - Add external link icons to messages ([`915481397`](https://github.com/gptme/gptme/commit/915481397))
 - refactor: consolidate Vite configs into single file ([`eee76072f`](https://github.com/gptme/gptme/commit/eee76072f))
 - chore: remove redundant jest.setup.js in favor of TypeScript version ([`6bfa10f64`](https://github.com/gptme/gptme/commit/6bfa10f64))
 - style: improve code block styling and formatting ([`4baa4aed3`](https://github.com/gptme/gptme/commit/4baa4aed3))
 - docs: update demo conversation to use correct dev server port (8080) ([`9468e2b07`](https://github.com/gptme/gptme/commit/9468e2b07))
 - docs: update domain from gptme.gptengineer.run to chat.gptme.org ([`48ea02adc`](https://github.com/gptme/gptme/commit/48ea02adc))
 - chore: comment out GitHub Pages base URL ([`2f3a95eb4`](https://github.com/gptme/gptme/commit/2f3a95eb4))
 - refactor: improve markdown code block handling ([`f2626cd95`](https://github.com/gptme/gptme/commit/f2626cd95))
 - Remove follow-on avatars from messages ([`7e943705f`](https://github.com/gptme/gptme/commit/7e943705f))
 - Improve System Message Styling ([`61315ec06`](https://github.com/gptme/gptme/commit/61315ec06))
 - Add background for assistant cards ([`d6701bb93`](https://github.com/gptme/gptme/commit/d6701bb93))
 - Fix light mode design ([`33211e972`](https://github.com/gptme/gptme/commit/33211e972))
 - Update message styling for system outputs ([`f26a7a9ef`](https://github.com/gptme/gptme/commit/f26a7a9ef))
 - Reverted to edit dd0e8988-d18a-4a66-ae1d-cbaf262721eb: "Fix overlapping messages issue ([`3aca22385`](https://github.com/gptme/gptme/commit/3aca22385))
 - Update system message styling ([`085e3c945`](https://github.com/gptme/gptme/commit/085e3c945))
 - Fix overlapping messages issue ([`4c590457f`](https://github.com/gptme/gptme/commit/4c590457f))
 - Join assistant-system messages and fix styling ([`d67d8daae`](https://github.com/gptme/gptme/commit/d67d8daae))
 - Refactor ConversationContent component ([`444725f67`](https://github.com/gptme/gptme/commit/444725f67))
 - Join messages into a single card ([`9be7801e6`](https://github.com/gptme/gptme/commit/9be7801e6))
 - Retry last action on correct branch ([`1faa85722`](https://github.com/gptme/gptme/commit/1faa85722))
 - Reverted to edit 815a42d6-9116-4fbf-9d95-1e113737e268: "fix: improved parsing of markdown fenced codeblocks' langtag args" ([`de5b21ed4`](https://github.com/gptme/gptme/commit/de5b21ed4))
 - Update message handling logic ([`8a06922c4`](https://github.com/gptme/gptme/commit/8a06922c4))
 - Reverted to edit 664da7a0-5c00-49d1-af75-0cbf4306b238: "fix: handle nested codeblocks" ([`3c7bb372a`](https://github.com/gptme/gptme/commit/3c7bb372a))
 - Adjust message spacing for continuity ([`f583fbc09`](https://github.com/gptme/gptme/commit/f583fbc09))
 - test: setup jest for testing and added tests for handleWrappedFencedCodeBlocks and transformThinkingTags (with fixes) ([`e9301fcd8`](https://github.com/gptme/gptme/commit/e9301fcd8))
 - chore: fixed incompatible gptme.toml config ([`69c78edee`](https://github.com/gptme/gptme/commit/69c78edee))
 - Update conversation URL handling ([`c85bf3194`](https://github.com/gptme/gptme/commit/c85bf3194))
 - Fix conversation navigation issue ([`1f6084dc5`](https://github.com/gptme/gptme/commit/1f6084dc5))
 - Reverted to edit 2367e0d1-5107-48f5-9222-f1f517e3b5bd: "Reduce font size across application ([`5c7e43abf`](https://github.com/gptme/gptme/commit/5c7e43abf))
 - Adjust Avatar Spacing in Messages ([`20dbb43ef`](https://github.com/gptme/gptme/commit/20dbb43ef))
 - Reduce font size across application ([`83ba6d2c5`](https://github.com/gptme/gptme/commit/83ba6d2c5))
 - Reverted to edit 8cd5b1eb-0450-4f31-85d5-cde2c3980604: "Remove unused variables in ChatMessage.tsx ([`b8993f2fb`](https://github.com/gptme/gptme/commit/b8993f2fb))
 - Reverted to edit 871d40ab-c673-4dd5-aa55-a9abae1cb146: "Fix HTML entity rendering issues ([`d6b1bd129`](https://github.com/gptme/gptme/commit/d6b1bd129))
 - Fix HTML rendering issues ([`ec9b8235c`](https://github.com/gptme/gptme/commit/ec9b8235c))
 - Reverted to edit 8cd5b1eb-0450-4f31-85d5-cde2c3980604: "Remove unused variables in ChatMessage.tsx ([`417bcf84b`](https://github.com/gptme/gptme/commit/417bcf84b))
 - Fix HTML entity rendering issues ([`226c94b66`](https://github.com/gptme/gptme/commit/226c94b66))
 - Remove unused variables in ChatMessage.tsx ([`8f2933791`](https://github.com/gptme/gptme/commit/8f2933791))
 - Adjust message layout alignment ([`dae7b52c7`](https://github.com/gptme/gptme/commit/dae7b52c7))
 - Fix message overlapping issue ([`3a8de85dc`](https://github.com/gptme/gptme/commit/3a8de85dc))
 - Hide avatars on small screens and adjust spacing ([`a522a1356`](https://github.com/gptme/gptme/commit/a522a1356))
 - Update user chat bubble color ([`31382280d`](https://github.com/gptme/gptme/commit/31382280d))
 - Move user avatar to right side ([`ef1d7f599`](https://github.com/gptme/gptme/commit/ef1d7f599))
 - Refine paragraph formatting ([`8848f147d`](https://github.com/gptme/gptme/commit/8848f147d))
 - Remove excessive padding ([`3ca8552ae`](https://github.com/gptme/gptme/commit/3ca8552ae))
 - Add chat bubble for messages ([`f240d910d`](https://github.com/gptme/gptme/commit/f240d910d))
 - Make UI darker ([`80af26e67`](https://github.com/gptme/gptme/commit/80af26e67))
 - Compare UI Color Schemes ([`8dbbfd6ec`](https://github.com/gptme/gptme/commit/8dbbfd6ec))
 - Remove blue tint from gray ([`aa959e18e`](https://github.com/gptme/gptme/commit/aa959e18e))
 - Update background to dark gray ([`51eb037e5`](https://github.com/gptme/gptme/commit/51eb037e5))
 - Adjust button margin settings ([`16365bbce`](https://github.com/gptme/gptme/commit/16365bbce))
 - Update button sizes and menu bar ([`e834dec1b`](https://github.com/gptme/gptme/commit/e834dec1b))
 - Reduce button size in MenuBar ([`bf332ed21`](https://github.com/gptme/gptme/commit/bf332ed21))
 - Make menu bar thinner and update font ([`ae63ccdb5`](https://github.com/gptme/gptme/commit/ae63ccdb5))
 - Update chat message styles ([`bc74616a5`](https://github.com/gptme/gptme/commit/bc74616a5))
 - format: fixed formatting ([`e9649bd9f`](https://github.com/gptme/gptme/commit/e9649bd9f))
 - Replace favicon logo ([`96687c658`](https://github.com/gptme/gptme/commit/96687c658))
 - Fix sidebar toggle button issue ([`91d5ac410`](https://github.com/gptme/gptme/commit/91d5ac410))
 - docs(README): fix typo in example ([`33d7e1067`](https://github.com/gptme/gptme/commit/33d7e1067))
 - refactor: renamed ConversationMessage -> Message ([`2b918341d`](https://github.com/gptme/gptme/commit/2b918341d))
 - refactor: major refactor with better typechecking ([`a6f142842`](https://github.com/gptme/gptme/commit/a6f142842))
 - Reverted to edit 68d941ae-8a5d-420e-a3be-1e6beca5417e: "Fix tooltip for server conversations ([`162a9a6d2`](https://github.com/gptme/gptme/commit/162a9a6d2))
 - Fix issue with functionality ([`e6e73ba00`](https://github.com/gptme/gptme/commit/e6e73ba00))
 - Fix chat area overflow issue ([`9a997a762`](https://github.com/gptme/gptme/commit/9a997a762))
 - Fix tooltip for server conversations ([`e6f59badc`](https://github.com/gptme/gptme/commit/e6f59badc))
 - Reverted to edit f80f0015-ed10-4179-8a02-f0fb0f41a7b0: "Fix meta tags for social previews ([`72f15012e`](https://github.com/gptme/gptme/commit/72f15012e))
 - Fix empty tooltips in conversations ([`526ca37e2`](https://github.com/gptme/gptme/commit/526ca37e2))
 - Fix tooltip for message counts ([`ae8c47ac8`](https://github.com/gptme/gptme/commit/ae8c47ac8))
 - Fix meta tags for social previews ([`65b30647b`](https://github.com/gptme/gptme/commit/65b30647b))
 - Hide content in conversations footer ([`b792608e9`](https://github.com/gptme/gptme/commit/b792608e9))
 - Add links to GitHub repositories ([`291b8bd9e`](https://github.com/gptme/gptme/commit/291b8bd9e))
 - Add tooltip for message breakdown ([`c19e07236`](https://github.com/gptme/gptme/commit/c19e07236))
 - Fix CORS origin typo ([`bdfec6a73`](https://github.com/gptme/gptme/commit/bdfec6a73))
 - Remove border from New button ([`5de3bcc23`](https://github.com/gptme/gptme/commit/5de3bcc23))
 - Add checkmarks to ConversationList ([`2b69addbb`](https://github.com/gptme/gptme/commit/2b69addbb))
 - Fix emoji display when disconnected ([`d1c30c250`](https://github.com/gptme/gptme/commit/d1c30c250))
 - Remove features from connection dialog ([`92e827908`](https://github.com/gptme/gptme/commit/92e827908))
 - Update connection instructions ([`9ee226f4d`](https://github.com/gptme/gptme/commit/9ee226f4d))
 - Add favicon from URL ([`21a4dd2c7`](https://github.com/gptme/gptme/commit/21a4dd2c7))
 - docs(README): updated README ([`cf7209a66`](https://github.com/gptme/gptme/commit/cf7209a66))
 - Toggle visibility for system messages ([`998bc4f85`](https://github.com/gptme/gptme/commit/998bc4f85))
 - Fix hiding system messages ([`33d38fb6f`](https://github.com/gptme/gptme/commit/33d38fb6f))
 - Hide Leading System Messages by Default ([`19910b5c0`](https://github.com/gptme/gptme/commit/19910b5c0))
 - Hide Initial System Messages ([`646b90dd6`](https://github.com/gptme/gptme/commit/646b90dd6))
 - Refresh conversation list after creation ([`2f6735f7b`](https://github.com/gptme/gptme/commit/2f6735f7b))
 - Fix type conversion error ([`a0584237a`](https://github.com/gptme/gptme/commit/a0584237a))
 - Add information to connection modal ([`a2a84c1f0`](https://github.com/gptme/gptme/commit/a2a84c1f0))
 - Fix TypeScript errors ([`964bc124d`](https://github.com/gptme/gptme/commit/964bc124d))
 - Move New Conversation Button ([`139c1452d`](https://github.com/gptme/gptme/commit/139c1452d))
 - docs: updated README and index.html ([`8e6ec4559`](https://github.com/gptme/gptme/commit/8e6ec4559))
 - Add padding to components ([`c0b205389`](https://github.com/gptme/gptme/commit/c0b205389))
 - Style details with border and padding ([`4d4865338`](https://github.com/gptme/gptme/commit/4d4865338))
 - Add styling for lists in messages ([`f087345a6`](https://github.com/gptme/gptme/commit/f087345a6))
 - Transform Thinking Tags in Messages ([`7588641ca`](https://github.com/gptme/gptme/commit/7588641ca))
 - Add API call to generate replies ([`25aba2d0c`](https://github.com/gptme/gptme/commit/25aba2d0c))
 - Refactor ChatMessage to Use Message ([`24be7340a`](https://github.com/gptme/gptme/commit/24be7340a))
 - Hide Initial System Messages ([`755058dbe`](https://github.com/gptme/gptme/commit/755058dbe))
 - Fix TypeScript error in ChatMessage ([`6c008517e`](https://github.com/gptme/gptme/commit/6c008517e))
 - Fix HTML rendering issue ([`db4fe1523`](https://github.com/gptme/gptme/commit/db4fe1523))
 - Fix issues in existing code ([`e88221e8a`](https://github.com/gptme/gptme/commit/e88221e8a))
 - Fix image problems ([`8e6338784`](https://github.com/gptme/gptme/commit/8e6338784))
 - Add example messages for conversation ([`fcab46c60`](https://github.com/gptme/gptme/commit/fcab46c60))
 - Improve Conversation Switching Performance ([`36dbec34a`](https://github.com/gptme/gptme/commit/36dbec34a))
 - Fix unresponsiveness on conversation click ([`b40e89d44`](https://github.com/gptme/gptme/commit/b40e89d44))
 - Fix TypeScript error in Index.tsx ([`093a1e047`](https://github.com/gptme/gptme/commit/093a1e047))
 - Fix TypeScript errors in Index.tsx ([`0098a0b39`](https://github.com/gptme/gptme/commit/0098a0b39))
 - Fix conversation switching performance ([`18833ef67`](https://github.com/gptme/gptme/commit/18833ef67))
 - Fix performance issue with server conversations ([`337f239c1`](https://github.com/gptme/gptme/commit/337f239c1))
 - Fix TypeScript errors in Index.tsx ([`8be776002`](https://github.com/gptme/gptme/commit/8be776002))
 - Read and Process Conversation Log ([`50b6c20f4`](https://github.com/gptme/gptme/commit/50b6c20f4))
 - Fix TypeError for apiMessages ([`1e9affd14`](https://github.com/gptme/gptme/commit/1e9affd14))
 - Fix conversation path usage ([`f961cccf7`](https://github.com/gptme/gptme/commit/f961cccf7))
 - Fix conversation loading errors ([`2333b61f6`](https://github.com/gptme/gptme/commit/2333b61f6))
 - Fix runtime errors and TypeScript issues ([`03c1698ce`](https://github.com/gptme/gptme/commit/03c1698ce))
 - Fix TypeScript error in ApiContext ([`20454a3e3`](https://github.com/gptme/gptme/commit/20454a3e3))
 - Fix TypeScript error in ApiContext ([`0b85c151b`](https://github.com/gptme/gptme/commit/0b85c151b))
 - Connect to API by default ([`e8f977eb9`](https://github.com/gptme/gptme/commit/e8f977eb9))
 - Fix connection state handling ([`e43cee555`](https://github.com/gptme/gptme/commit/e43cee555))
 - Fix runtime errors in ApiContext ([`e9a6cd059`](https://github.com/gptme/gptme/commit/e9a6cd059))
 - Fix CORS issue ([`2c608d837`](https://github.com/gptme/gptme/commit/2c608d837))
 - Add verbose error logging ([`4c4f16d03`](https://github.com/gptme/gptme/commit/4c4f16d03))
 - Fix ApiContext usage error ([`351298356`](https://github.com/gptme/gptme/commit/351298356))
 - Fix type error in ApiContext ([`524d472f3`](https://github.com/gptme/gptme/commit/524d472f3))
 - Fix connection button and conversation loading ([`75c6f75f7`](https://github.com/gptme/gptme/commit/75c6f75f7))
 - Add new conversation button ([`8e788a70d`](https://github.com/gptme/gptme/commit/8e788a70d))
 - Fix TypeScript errors in ApiContext ([`db319023b`](https://github.com/gptme/gptme/commit/db319023b))
 - Fix TypeScript error in ApiContext ([`ffb7d6b30`](https://github.com/gptme/gptme/commit/ffb7d6b30))
 - Load API Conversations and Enable Messaging ([`a4aac76fc`](https://github.com/gptme/gptme/commit/a4aac76fc))
 - Fix API errors and type assignment ([`c71b5c12d`](https://github.com/gptme/gptme/commit/c71b5c12d))
 - Add configurable connection button ([`714c20611`](https://github.com/gptme/gptme/commit/714c20611))
 - Connect to Optional gptme Instance ([`279022afe`](https://github.com/gptme/gptme/commit/279022afe))
 - Fix incorrect element wrapping ([`5eef749cd`](https://github.com/gptme/gptme/commit/5eef749cd))
 - Remove Excessive Borders and Style ([`b01300432`](https://github.com/gptme/gptme/commit/b01300432))
 - Remove terminal-commands langtag ([`d972802b3`](https://github.com/gptme/gptme/commit/d972802b3))
 - Fix display of example.py ([`d2b604b27`](https://github.com/gptme/gptme/commit/d2b604b27))
 - Refactor markdown parsing for code blocks ([`5e593c6bf`](https://github.com/gptme/gptme/commit/5e593c6bf))
 - Fix recursive nesting in codeblock ([`11a377aaa`](https://github.com/gptme/gptme/commit/11a377aaa))
 - Fix nested terminal command display ([`0851b040e`](https://github.com/gptme/gptme/commit/0851b040e))
 - Fix sidebar border extension ([`4ddc69d69`](https://github.com/gptme/gptme/commit/4ddc69d69))
 - Fix sidepanel toggle issue ([`bcc3e3ecd`](https://github.com/gptme/gptme/commit/bcc3e3ecd))
 - Fix sidebar button functionality ([`bea802078`](https://github.com/gptme/gptme/commit/bea802078))
 - Fix undefined conversations error ([`3fe8bffe1`](https://github.com/gptme/gptme/commit/3fe8bffe1))
 - Add conversation selection feature ([`e815d8fb6`](https://github.com/gptme/gptme/commit/e815d8fb6))
 - Fix TypeScript error in ChatMessage ([`25a58895e`](https://github.com/gptme/gptme/commit/25a58895e))
 - Fix codeblock formatting issue ([`97b56ddf6`](https://github.com/gptme/gptme/commit/97b56ddf6))
 - Add markdown highlighting and formatting ([`a91fca323`](https://github.com/gptme/gptme/commit/a91fca323))
 - Add markdown parsing for assistant messages ([`a36d92027`](https://github.com/gptme/gptme/commit/a36d92027))
 - Implement LLM Chat Interface UI ([`5cbe7a4d5`](https://github.com/gptme/gptme/commit/5cbe7a4d5))
 - Use tech stack vite_react_shadcn_ts [skip gpt_engineer] ([`010528338`](https://github.com/gptme/gptme/commit/010528338))

</p>
</details>

*(excluded 87 less relevant [commits](https://github.com/gptme/gptme/compare/v0.31.0...v0.32.0))*

**Full Changelog**: https://github.com/gptme/gptme/compare/v0.31.0...v0.32.0
