All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
ExtraBodyonprovider.Configandprovider.Requestmerges vendor-specific top-level fields into the request body on both/chat/completionsand/responses, e.g. OpenRouter'sproviderrouting object; request keys override config keys, a nil value removes one, andmodel/messages/input/streamare rejected as reservedagent.WithExtraBody,Agent.SetExtraBodyandAgent.ExtraBodysend those fields from the agent, so OpenRouter upstream providers can be chosen per model alongsideSetModel
- OpenRouter is now a supported provider: log in with an
sk-or-…API key viaprofile.Manager, the login example, or the webPOST /providers/openrouter/loginroute, and pick from its models in any picker - OpenRouter models are discovered live from its
/modelsendpoint with vendor-namespaced IDs (e.g.openrouter/openai/gpt-4o) and each model'scontext_lengthpropagated toModelInfo provider.OpenRouterConfig()helper andprovider.OpenRouterBaseURLconstant for embedders wiring OpenRouter directly
- Groq cloud is now a supported provider: log in with a
gsk_…API key viaprofile.Manager, the login example, or the webPOST /providers/groq/loginroute, and pick from its models in any picker - Groq models are discovered live from its
/modelsendpoint; retired entries (active: false) and audio-only families (Whisper, PlayAI TTS) are hidden and each model'scontext_windowis propagated toModelInfo provider.GroqConfig()helper andModelMeta.Activefield for embedders wiring Groq directly/effortTUI command picks the reasoning effort (default, ornonethroughmax) mid-session; the current level shows in the status bar and a 400 while an effort is set suggests trying another level- Reasoning effort persists across TUI restarts via
tui.WithEffortStore, backed byprofile.Manager.ReasoningEffort/SetReasoningEffortand areasoning_effortfield inconfig.json agent.SetReasoningEffort/ReasoningEffortchange and read an agent's effort at runtime, andprovider.ReasoningEffortLevels()lists every level
- Reasoning effort control:
provider.Config.ReasoningEffort(default for every call),provider.Request.ReasoningEffort(per-call override) andagent.WithReasoningEffort(level), with theprovider.ReasoningEffortNone|Minimal|Low|Medium|Highconstants. Sent asreasoning.efforton/responsesandreasoning_efforton/chat/completions; omitted when unset, so the model keeps its own default
- OpenAI/Azure chat completions now send max_completion_tokens (with automatic max_tokens fallback for older models), fixing 400 unsupported_parameter errors on newer models
- Improved test coverage from 71.56% to 93.81%
- Formatted all source files with gofmt
sqlitestore.ImportJSONLof an export with no messages now stores a NULL leaf pointer instead of an empty string, so the imported session loads instead of failing with "current_leaf_id not found"- OAuth web-flow logins (OpenAI and Codex) now drain the local callback server gracefully on completion, so the browser reliably receives the result page instead of an occasional connection reset
- BREAKING: moved the SQLite-backed session store out of
sessioninto the newsession/sqlitestoresubpackage —session.OpenSQLiteStore/session.NewSQLiteStore/session.SQLiteStore/session.SQLiteConfigare nowsqlitestore.Open/sqlitestore.New/sqlitestore.Store/sqlitestore.Config. Importingsessionfor theSessionStoreinterface no longer linksmodernc.org/sqliteinto the embedder's binary; thesessionpackage is now guaranteed driver-free
agent.Runno longer mutates the shared Agent's hooks per step, making concurrentRuncalls on one Agent safe — each run now snapshots the options and emits to its own event channel without cross-wiring. The concurrency contract is documented onAgent,Run,SetProvider, andSetModel
- Added in new OpenAI models
- Added pagination for sessions
- Added endpoint for logging in with all providers
- Added a web example of how to log in to a provider, choose a model and start a chat
- Fixed model communication issues with OpenAI models
- Changed colour of the thinking blocks and made italic.
- Show Gemini thinking blocks as they come under a differnt name to other models
- TUI
/helpcommand listing all available slash commands with descriptions - TUI
/sessionscommand to browse, switch, and delete persisted sessions from a keyboard-driven picker - TUI
/renamecommand with a centered modal for renaming the current session - TUI
/forkcommand with a message picker for branching the current session at any point in its history - TUI
/deletecommand to remove the current session and start fresh - TUI
/exportcommand for saving the current session to a JSONL file - Session indicator in the TUI status bar showing the current session name and message count
- TUI image paste: Ctrl+V reads the system clipboard via wl-paste / xclip / pngpaste / osascript / powershell.exe, inserts a
[Image #N]placeholder into the textarea, and emits an interleavedBlockImageon send so all five OpenAI-compatible backends receive the bytes as a base64 data URI. Falls back transparently to the default text paste when the clipboard holds no image or the platform tools are unavailable. - TUI status line now shows the current model and context usage right-aligned (e.g.
gpt-5.4 · 12,345 / 200,000 (6.2%)). Token counts come from actual providerusagefields (opts intostream_options.include_usageon chat completions; readsresponse.completed.usageon/responses), and the max context length is read fromcapabilities.limits.max_prompt_tokenswhere the provider exposes it (Copilot) with a hardcoded fallback table covering the GPT / Claude / Gemini / Llama / Mistral / Qwen / DeepSeek families. Per-sessionLastUsageis persisted via SQLite schema v2 so reopening a session restores the figures without a round-trip to the model.
- TUI example now uses the SQLite-backed session store so sessions persist across runs
- Block-shaped messages: every Message now holds an ordered slice of typed blocks (text, thinking, redacted_thinking, image, tool_use, tool_result), so interleaved assistant output replays faithfully through every layer — providers, agent loop, TUI, web SSE, and the session store.
- Reasoning capture across providers: chat completions parses delta.reasoning_content alongside delta.content, and the Responses API stream maps every output_item (reasoning / message / function_call) to its own block instead of dropping reasoning on the floor.
- Durable SQLite session store: session.SQLiteStore persists full conversation history to a single pure-Go SQLite file (modernc.org/sqlite, no CGO) with OpenSQLiteStore for standalone embedders and NewSQLiteStore for parent apps that share a *sql.DB — all stackllm tables are prefixed stackllm_ so host-app schemas coexist.
- Session branching: Fork, Rewind, and ListBranches let callers create sibling branches at any message boundary without deleting history, backed by a parent_id message tree and a current_leaf_id pointer.
- Artifact offload with SHA-256 dedupe: large tool results, inline image bytes, and redacted thinking payloads move to a side table with a small inline preview kept on the block row; HydrateArtifact fetches the full payload lazily and identical blobs share a single artifact row across sessions.
- FTS5 full-text search: session.Search runs full-text queries across text, thinking, and tool_result blocks with optional block-type and per-session scoping.
- JSONL export and import: ExportJSONL / ImportJSONL round-trips every block type, inlining artifact bytes so exported sessions are fully self-contained.
- examples/sqlite: runnable shared-DB demo that runs a parent-app migration alongside session.NewSQLiteStore on the same SQLite file.
- conversation: Message.Content (string) and Message.ToolCalls ([]ToolCall) — superseded by Message.Blocks. Readers should switch to m.TextContent() or Blocks iteration; builders should switch to the block-oriented Builder methods.
- Configurable poll intervals and retry backoff (PollInterval on auth configs, BaseBackoff on provider Config, WithPollInterval on profile Manager) to allow fast test execution without hardcoded sleeps
- Provider management layer: config/ package for user preferences, profile/ package composing auth+config+provider with Login/Logout/Status/ListModels/SetDefault/LoadDefault, examples/login interactive CLI, and updated examples to use profile-first resolution with interactive onboarding fallback
- Initial Build
[Deployment] Notes for deployment [Added] for new features. [Changed] for changes in existing functionality. [Deprecated] for once-stable features removed in upcoming releases. [Removed] for deprecated features removed in this release. [Fixed] for any bug fixes. [Security] to invite users to upgrade in case of vulnerabilities. [YANKED] Note the emphasis, used for Hotfixes