⨠Features
- Unrolled agent loop #9574
- Cache-safe request assembly with append-only turn context and declared cache semantics #11022
- Streaming shell output while commands run #10808
- Per-message usage stats UI (tokens, cost, TTFT, tok/s) #10210
- Per-message usage/cost tracking with derived session totals #10172
- Track cache tokens for accurate cost reporting #9752
- Markdown format option to session export #10703
- Resizable sidebar with drag handle and persisted width #10795
- Interactive menu for single select elicitations #10327
- Session metadata on sidebar chat hover #10663
- Configurable LOCAL_WHISPER_LANGUAGE for multilingual local transcription #10634
- Allow disabling built-in skills #10600
- Structured summary output with template rendering for compaction #10471
- Pass working_dir to the Stop hook context #10296
- Surface output-token-limit info #10831
- Tab completion and switch provider for
modelcommand #10585 - Collapse const-union enums in tool schemas #10577
- GenAI semantic convention attributes for OTEL #10700
- Enrich root span with gen_ai attributes and improve OTEL output format #10816
- Forward images and MCP embedded-resource blobs in Anthropic and Google formats #10340
- ACP session/new supports Hidden session via _meta.hidden #10811
- Stable agent event message identity #10716
- OAuth logo_uri in client ID metadata documents #10727
- Termux detection in installer to select musl portable build #10568
- Hooks feature with PreToolUse denial #9093, #9304
/goalcommand for agent self-evaluation before finishing #9069/statusslash command #9845/modelslash command to switch session model #8747--editsession flag to edit conversation before forking #9799goose reviewlocal code review command #9114- Open plugins generalization with skills support #9112
- Summon extension: peek mode for async background tasks #9519
- Summon extension: context and working_dir parameters for delegate tasks #9518, #9520
- Load global hints from ~/.agents/AGENTS.md #9736
- Proactive OAuth token refresh to avoid re-auth on every session #8386
- GOOSE_OAUTH_CALLBACK_PORT for stable OAuth redirect_uri #9209
- Unified thinking effort control across all providers #9242
- Projects as backend sources with system prompt injection #8739
- Group chat sessions by project in nav panel #10212
- Collapsible project group headers in nav panel #10278
- Worktree-aware directory switcher #8450
- Chat history search feature in navigation panel #8448
- Search filter to provider grid #10437
- Option to disable automatic update downloads #9872
- TUI diff viewer #9260
- MAX_CODE_BLOCK_LINES configurable via env vars #9301
- GOOSE_MAX_TOOL_RESPONSE_SIZE to configure tool output size limit #9256
- GOOSE_FAST_MODEL env var in ModelConfig::with_fast #9296
- GOOSE_DOCS_ROOT for air-gapped docs access #10294
- Quarterly option for scheduler #9076
- Harbor eval runner #9138
- goose://new-session and goose://resume deep links #9196, #9343
- Initial prompt with goose://new-session #9427
- Encrypted Nostr session sharing #8922
- Import sessions #9474
- Hugging Face OAuth support with auth tab in settings #9552
- MLX models support in local inference provider #9154
- Linux Vulkan support for local inference #9038
- Reconnect desktop ACP sessions after sleep and connection loss #10411
- TLS support for ACP serve #10088
- Group consecutive tool calls into one summarized chain card #8995
- Bind MCP apps to trusted ownership metadata #10747
- MCP extensions in open plugins #9471
- Skills to the chat composer #8881
- Dynamically refresh skill instructions each turn #9217
- CLI to list skills with token counts #9326
- Image read tool #9607
- View model interactions #9806
- UniFFI SDK for cross-language bindings #9593
- Provider bindings MVP to goose-sdk with Python wheel publishing #10208
- Kotlin FFI with build and Maven publish #10375
- Create source archive as release artifact #10786
New Providers
- Celeris provider #10714
- Friendli declarative provider #10762
- Azure AI Foundry multi-LLM provider #10622
- OllamaCloud provider with dynamic model discovery #10264
- Sakana AI provider for OpenAI-compatible Fugu API #10357
- iFlytek Spark and Astron MaaS providers #9837
- Fireworks AI declarative provider #9990
- OpenRouter request parameters support #9276
- Together AI declarative provider #9545
- OrcaRouter declarative provider #9515
- Perplexity declarative provider #9324
- Alibaba (Qwen via DashScope) declarative provider #9443
- Databricks AI Gateway provider #9274
- Scaleway provider #9254
- NEAR AI Cloud provider #9352
- EmpirioLabs declarative provider #9771
- xAI SuperGrok OAuth subscription provider #9420
- Vercel AI Gateway #9144
- Routstr declarative provider #9175
- FuturMix provider #8840
- oMLX declarative provider #9177
- Atomic Chat declarative provider #9210
- Muse Spark 1.1 via Meta Models API #10432
- AWS Bedrock support for OpenAI GPT models via mantle endpoint #9707
- Azure AD (Entra ID) bearer token auth via AZURE_OPENAI_AD_TOKEN #9716
New Models
- GPT-5.6 support #10384, #10349
- GPT-5.5 to ChatGPT Codex known models #9292
- GLM-5.2 support #9967
- Opus5 support with adaptive thinking #10686
- Claude-sonnet-5 and claude-fable-5 to known models #10865, #10183
- Cursor composer-2.5 models #10618
- Cursor-agent models from CLI #10367
- Latest Gemini models #10630
- Gemini 3.x known locations and KNOWN_MODELS entries #9142
- MiniMax-M3 and M2.7 variants #10431
- OVHcloud Qwen3.6-27B model #10339
Internationalization
- French, German, Italian, Portuguese, Indonesian, Malay, Vietnamese, zh-TW desktop locales #10072
- Korean localization #9856, #10667
- Spanish (es) locale #9833
- Japanese locale #9768
- Hindi Desktop locale #9733
- Russian language support #9406
- Turkish desktop locale #9392
- Simplified Chinese (zh-CN) translation #8765
- Language selection feature #9405
š Bug Fixes
- Reject invalid subrecipe content #10994
- Keep turn-context in place for OpenAI Responses-stack models for prompt caching #10993
- Byte-bound the shell truncation preview #10992
- Stop silently ignoring thinking effort off for OpenRouter #10991
- Dispatch edited queued messages #10933
- Contain recipe template paths #10930
- Make shell approval titles faithful #10986
- Block MCP app form submissions #10985
- Sanitize Bedrock tool errors #10934
- Implicit OAuth during model discovery #10929
- Keep ACP session naming out of live conversations #10963
- Sanitize Unicode tags in MCP resources #10746
- Preserve RFC 9207 iss from MCP OAuth callback #10678
- Shell ACP providers on desktop #10907
- Stop killing streaming responses at the total request timeout #10620
- Restore final_output_tool when agent is recreated after LRU eviction #10793
- Avoid O(n²) cloning during session load #10665
- Prefix child stderr log target so it passes the default goose=info filter #10901
- Fall back to static model list only for non-models payloads #10189
- Stdio extensions silently skipped when name missing or env: used in config #10773
- Start scheduler at startup instead of first ACP connection #10766
- Respect disabled builtin extensions (developer) at session start #10223
- Parse PyPI requirements for OSV checks #10510
- Contain voice file extensions in telegram #10456
- Preserve denied tool request precedence #10612
- Contain subdirectory hint discovery #10545
- Clear stale validation error when reopening the schedule modal #10627
- Sanitize shell/subprocess call in linux.rs #10748
- Unlink destination before copying binaries #10705
- Honor timeout_seconds on the Anthropic declarative provider #10440
- Allow removing images when editing user messages #9979
- Preserve thinking inline for Cerebras models that reject reasoning_content #10774
- Make CLI streaming render incremental instead of O(n^2) #10487
- Together provider: parse model list response #10576
- DeepSeek model names to v4 API #10729
- Forward Claude Code and Pi model picker selection to the adapter #10675, #10707
- Preserve enabled flag when migrating platform extensions #10690
- Pass session working_dir to on_call_tool #10689
- Preserve adversary tool arguments #10529
- Keep XML snippets inside JSON as data for local-inference #10606
- Sync generated chat title in header #10578
- Prompt for tool approval in Telegram gateway sessions #10613
- Keep CLI provider prompts out of process arguments #10547
- Ignore stale inventory for static model lists #10591
- Preserve featured model size on delete and backfill missing sizes #10422
- Create inventory tables atomically with schema version #10586
- Rewrite oneOf to anyOf in tool schemas for OpenAI-compatible backends #10571
- Allow custom model as default for non-local providers #10438
- Require absolute goose path roots #10454
- Scope smart approval by request #10457
- Preserve fixed subrecipe values #10452
- Bundle git so hermit can clone its package registry in Flatpak #10511
- Forward image content chunks to client during live ACP session #10485
- Dispatch Code Mode callbacks on main runtime to prevent hangs #10484
- Protect OAuth token caches #10516
- Preserve content audience boundaries #10493
- Bound scheduled recipe validation #10509
- Return JSON-RPC errors from dispatch handlers instead of killing the connection #10499
- Avoid local inference Metal teardown crash #10508
- Enable indexmap serde support for musl builds #10507
- Scroll chat to the latest reply on session resume #10501
- Secure large response spill files #10482
- Register LiteLLM with refresh_only inventory so model picker lists models #10489
- Limit provider selector height in CLI #10420
- Tighten existing secrets file permissions #10453
- Classify image access capabilities in developer extension #10451
- Preserve one-time permission scope #10450
- Register goose:// scheme handler in Flatpak desktop entry #10461
- Reject duplicate recipe parameter keys #10448
- Synchronously kill orphaned goose serve backends on GUI close #10292
- Break self-referential $ref cycles before Code Mode schema #10469
- Stop multiline paste auto-submitting line-by-line on Windows #10326
- Hide nested config values in Configuration Editor #10390
- Stop resolving TUI scripts from cwd #10449
- Exclude MCP App tools from Code Mode callbacks #10290
- Apply the default extension timeout to developer shell tool calls #10348
- Preserve reasoning_content for DeepSeek thinking mode on multi-turn tool calls #10366
- Make prompt timestamps timezone-explicit #10209
- Compact disabled during approval #10089
- Treat empty-string finish_reason as non-terminal in streaming #10258
- Gemini OAuth onboarding #10363, #8905
- Retry empty provider turns instead of stopping silently #10360
- Guard llama.cpp backend init against SIGILL on x86_64 CPUs without FMA/AVX2 #10105
- Sanitize responses function call names #10344
- Pick session mode from the ids the agent actually offers #10320
- Dedupe duplicate signed thinking blocks to fix Anthropic 400 #10083
- Resolve provider default model instead of leaking sentinel "current" #10305
- Return effective context limit from /model-info #10165
- Gate rcgen aws_lc_rs feature behind rustls-tls #10116
- Tolerate partial Responses output items #10108
- Always use OpenAI-compatible "parameters" for tools in Databricks #10101
- Unescape shell-escaped image paths #10098
- Seed mac auto-update config #10132
- Send inference config (max_tokens, temperature) on Bedrock Converse #9889
- Dedupe Nostr session deep link imports #9918
- Don't retry deterministically-permanent 400s (thinking-block immutability) #10005
- Use async reqwest client so OTLP export works in
goose servemode #10100 - Reject non-object tool-call arguments instead of panicking #9832
- Save /edit prompts to history #10011
- Use session.message_count for schedule sessions listing #10026
- Support streamed tool calls without indexes #10023
- Disable extended thinking for fast-model operations #9815
- Buffer thinking across stream chunks for DeepSeek/Kimi tool calls #9704
- Surface actionable errors for truncated tool-call arguments #9946
- Show optimistic toggle state when disabling an extension #9882
- Resolve databricks_v2 pricing and surface cost in standard usage update #9925
- Publish mac updater metadata #9945
- Activate hermit on macOS so STDIO extensions resolve node #9482
- Accept JSON-encoded string for autovisualiser data parameter #9838
- Send User-Agent on URL image fetches in developer/read_image #9927
- Do not pass temperature to ChatGPT Codex provider #9931
- Sanitize extension environment maps #9884
- GCP: use refreshed gcloud token after reauth (retry Vertex AI on 401/403) #9849
- Start a turn when /goal or /grind is set #9801
- Pass thinking config to Bedrock Anthropic models #9794
- Keep extensions icon visible after switching sessions #9787
- Skip non-recipe project config files in summon #9808
- Dedup duplicate tool-call ids within a turn #9792
- Resolve bundled extensions from discovery #9759
- Custom OpenAI provider dropping port when URL scheme is omitted #9730
- Preserve Windows backslash paths in custom extension command #9741
- Include agentInfo in ACP initialize response #9765
- ACP cancel race condition #9804
- Inherit login-shell PATH in spawned subagents #9737
- Accept string values for GOOSE_CONTEXT_LIMIT #9738
- Clear rejected OAuth credentials after refresh #9694
- Keep extended thinking within the Anthropic output cap #9814
- Disable RPM build-id links #9671
- Preserve custom API path in base_url derivation for OpenAI #9649
- Handle resume deep links #9298
- Repair PATH for plugin hook commands #9615
- Restore Cmd/Ctrl+T new chat shortcut #9614
- Lead with extension description, shorten HTTP/SSE transport label #9653
- Mention menu icon to open the sidebar #9643
- Dedupe React to prevent multiple instances in renderer #9631
- Add hermit cleanup to uvx and jbang scripts #9616
- Use blocking OTLP HTTP exporter #9599
- Fall back to default provider when resuming session with unavailable provider #9547
- Provide Tokio runtime for OTLP HTTP exporter batch thread #9541
- Read meta.n_ctx from /v1/models to fix context limit for local servers #9530
- Align session history scrollbar with window edge #9601
- Refresh session name in sidebar after rename #9543
- Show resolved skill supporting file paths #9584
- Implement real Bedrock streaming via ConverseStream API #9579
- Record OpenAI-native cached_tokens in usage metering #9829
- Add option for overriding API URL for Moonshot provider #9819
- Detect image paths with spaces #9387
- Restore new chat shortcut navigation #9528
- Evict stale completed tasks to prevent unbounded memory growth in summon #9514
- OAuth: time out the MCP callback wait instead of hanging in WSL #9536
- Warn on unmatched extension names in summon delegate #9513
- Deleting a recently created session and then creating a new shows the deleted session's content #9351
- Propagate elicitation decline and cancel actions end-to-end #9437
- Close modal when canceling recipe parameter form #9195
- Ensure tool request timestamp precedes tool response timestamp #9462
- Correctly map ollama_cloud to canonical provider #9639
- Incorrect max tokens values for groq provider #9790
- Mark stream decode errors retryable #9723
- Classify Bedrock ValidationException as ExecutionError #9735
- Page through all Databricks AI Gateway v2 endpoints when listing models #9753
- Preserve unparseable extension entries during config refresh #9439
- Sync slash help with builtins in CLI #10173
- Treat unicode punctuation as image path terminators #10106
- Don't bleed provider-specific request_params into delegate() sessions #9906
- Purge empty phantom sessions on startup #9651
- Include structuredContent from MCP tool response #10128
- Propagate agent cleanup errors on session delete #10112
- Prevent login-shell PATH probe from suspending goose on startup #8804
- Exclude preprompt from session title generation #8793
- Unscheduling a recipe should not delete them #8978
- Seed provider handoff history in ACP #8941
- Respect goose2 interface density settings #8953
- Make goose2 respect accent color #8952
- Preserve replay message timestamps #8942
- Goose2 window minimum sizing #8946
- Avoid transform-rasterized dialog text in goose2 #8937
- Keep renamed skills open in detail view #8935
- Model picker stays usable during provider loading #8900
- Handle ACP requests concurrently #8781
- Apply hermit env directly in node shims so a fish login shell doesn't break MCP startup #10028
- Preserve command arguments through extension forms #10527
- Enforce manual approval for code mode #10528
- Confine app file operations #10481
- Preserve recursive schema types with pctx 0.4.1 in code-mode #10572
- Use shell working directory on initial launch #10655
- Enable inventory refresh for OpenRouter model picker #10641
- Preserve read lines and reload tool output in ACP #10662
- Surface tool call output in CLI and Desktop #10654
- Overlong function names in provider requests #10659
- Preserve ACP tool call update fields #10653
- Omit disabled OpenRouter reasoning #10517
- Clear stale pending ACP connection after terminal recovery failure #10552
- Confirm pending steer message on queuedSteer notification #10532
- Restore dynamic model discovery and current Grok support #10756
- Reuse parent provider for summon delegates #10754
- Skip permission mode negotiation for Pi #10701
- Freeze turn-context timestamp at turn start to preserve prefix cache #10734
- Refresh Moonshot model list with current Kimi lineup #10696
- Update Kimi-code known models metadata with current platform lineup #10713
- Avoid double loading full conversation on session open #10794
- Recover malformed tool calls from GLM/Minimax models instead of rejecting them #10230
- Restore cursor when configure exits #4889
š§ Improvements
- Keep turn-context out of the OpenAI-compatible prefix cache #10937
- Keep turn-context out of the Anthropic prefix cache #10030
- Parallelize provider resolution and eagerly init SQLite pool #8899
- Deduplicate _goose/providers/list RPC call at startup #8873
- Compact tool schema JSON #10409
- Drop debug info for dependencies in the dev profile #9843
- Use LRU cache for token counting #9586
- Mergeable configs with cleanup #8378
- Structured per-provider config block with non-destructive provider switching #8977
- Linux musl CLI builds #9240
- Windows CUDA release artifacts #8750
- Linux desktop Vulkan packages #9323
- Migrate desktop routing to React Router 8.3.0 #10971
- Upgrade to rmcp 3.0 #10789
- Handle MCP tool list change notifications #e7088ee
- Redesign Extensions page #8940
- Redesign skills library #8868
- Dark mode inline code styling for message bubbles #10861
- Refine dark theme message surfaces #10693
- Inline code contrast improvement in light theme #9058
- Polish sidebar navigation and project icons #8896
- Simplify UI customization #9353
- Better parsing of pasted HTML as markdown so agents understand #9190
- Remove CLI project support #10838
- Deprecate and remove ui/text TUI #10799
- Remove MCP sampling support #10087
- Make context exceeded checker more precise #9831
- Update canonical model inventory #10352, #9709, #9551, #9331
- Add canonical thinking modes #9743
- Nushell terminal and completion support #8628
- Migrate diagnostics to JSON report #9964
- Route MCP elicitations through tool streams #9943
- Allow unlisted models in search #9933
- ACP paginate session list #9199
- Flush OTLP traces reliably on exit with configurable timeout #9228
- Increase /mcp-app-guest body limit for larger single-file MCP apps #10324
- Use current_exe() instead of PATH lookup when spawning goose #9236
- Set TCP_USER_TIMEOUT on streamable HTTP clients in extension_manager #9207
- Fail closed on unverifiable update provenance #10168
- Trim macOS desktop entitlements #10490
- Consolidate and harden release workflows #10447
- Update Rust toolchain and raise recursion limit #10303
- Enhance the uniffi API layer #10427
- Bound code-mode execution with timeout and cancellation #10214
- Switch local inference MLX backend to use safemlx crate #10304
- Preserve thinking content for providers that require it #8857, #9314
- Build summon instructions per turn #9329
- Refactor local inference around backends #9137
- Stricter GGUF requirements with auto detection of tool calling support and fixed thinking output parsing #9442
- Prefer goose aliases for Databricks v2 inventory #9430
- ACP migration: UI connect to ACP directly instead of goosed #10081
- Unified OTLP logging schema for cross-tool detection #9713
- Pattern-based detection updates for prompt injection #9350, #9198, #9690, #8546
- Enable prompt injection mitigation by default for internal users #9612
- OpenAI Responses API store param configurable #10040
- GitHub Copilot /responses API #9043
- Check for responses API support in Databricks #9347
- Honor Retry-After on 429 responses #9161
- Coalesce streaming Thinking deltas and list available tools on not-found #9162
- Strip chain-of-thought markers from custom provider output #8635
- Coalesce streaming chunks under one message id in ACP #8788
š Documentation
- Document auto-injected GOOSE_SHELL flags #10759
- Clarify macOS sandbox feature was removed in post-v1.25.0 cleanup #10900
- Update Discord invite #10863
- Update environment and config references #10203
- Document hook deny contract, matcher regex, tool_input keys, and provider config #10467
- Add Code of Conduct #10424
- Adopt issue-first contribution workflow #10819
- Update docs for ACP clients #9772
- Hooks guide #9288
- Custom agents guide #9293
- Guide for connecting goose Desktop to a remote goosed server #9275
- Document summon extension requirement for delegate and load tools #9231
- Refresh Ophis extension page (tool list, chains, skills link) #10681
- Clean up stale documentation audit findings #10114
- Reorganize docs #9310
- Blog: Goose with Peekaboo #8884
- Blog: Built-in Local Inference #8808
- Blog: Orchestrating with Goose #9104
- Blog: Self-improving agents #9846
- Blog: AAIF migration #9866
- Blog: MiniMax and Office QA benchmark findings #8984