- Add `baseUrl` and `apiKey` fields to CustomModelConfig (config and models packages)
- Store them on ModelInfo so they travel through the registry
- createCustomProvider resolves URL/key from model definition first,
falling back to global --provider-url / --provider-api-key
- Fix registry initialisation: call ReloadGlobalRegistry() in InitConfig()
so customModels from config are visible on startup (not just at init time)
- Include custom provider in GetLLMProviders() so custom models appear
in the /model selector
- Hide the built-in custom/custom stub from the selector when user-defined
custom models are present
- Add PopupList: generic themed popup with fuzzy search, scrolling,
keyboard navigation, and centered overlay rendering
- Refactor ModelSelectorComponent to delegate to PopupList instead
of implementing its own full-screen rendering and input handling
- Render /model selector as a centered overlay on top of the chat
view instead of replacing the entire screen
- PopupList accepts a pluggable FilterFunc for domain-specific
fuzzy matching (model selector wires its own scoring)
- Add 11 tests for PopupList covering navigation, search, selection,
cancellation, filtering, rendering, and edge cases
Remove 'j' and 'k' keybindings from model, session, and tree selectors
to allow typing those characters for fuzzy filtering. Navigation now
uses only arrow keys (↑/↓) which matches the existing help text.
Fix /resume, /model, and /tree selectors to render in the alternate
screen buffer instead of terminal scrollback. All three selector
components now set AltScreen=true on their tea.View returns.
- Remove scrollbackBuf, appendScrollback(), drainScrollback() and all
call sites — the entire terminal scrollback pipeline was dead code
since the alt screen migration
- Remove StreamComponent.render(), renderCache, renderDirty,
scrollbackFlushedLines, viewContent(), and ConsumeOverflow() body —
rendering is now handled by StreamingMessageItem in the ScrollList
- Remove SetHeight and ConsumeOverflow from streamComponentIface since
height is managed by ScrollList and overflow is a no-op
- Remove redundant AltScreen/MouseMode/ReportFocus/KeyboardEnhancements
boilerplate from 6 child View() methods — parent already sets these
- Convert two orphan appendScrollback calls (extension default text,
shell command output) to proper ScrollList message items
- Update ~30 stale comments referencing tea.Println and scrollback buffer
Rename public SDK symbols to use generic LLM terminology instead of
exposing the internal dependency name (charm.land/fantasy):
Public API renames (with deprecated wrappers for backward compat):
- ConvertToFantasyMessages() → ConvertToLLMMessages()
- ConvertFromFantasyMessage() → ConvertFromLLMMessage()
- GetFantasyProviders() → GetLLMProviders()
New type alias:
- LLMFilePart = fantasy.FilePart (eliminates need for direct fantasy import)
- PromptResultWithFiles() signature now uses LLMFilePart
Internal renames (with deprecated wrappers):
- ModelsRegistry.GetFantasyProviders() → GetLLMProviders()
- TreeManager.GetFantasyMessages() → GetLLMMessages()
- TreeManager.AppendFantasyMessage() → AppendLLMMessage()
- TreeManager.AddFantasyMessages() → AddLLMMessages()
- Message.ToFantasyMessages() → ToLLMMessages()
- FromFantasyMessage() → FromLLMMessage()
- npmToFantasyProvider → npmToLLMProvider
- isProviderFantasySupported() → isProviderLLMSupported()
All internal callers migrated to new names. ~30 comments updated
to remove Fantasy references across pkg/kit/, internal/agent/,
internal/models/, internal/message/, internal/session/.
Documentation updates:
- AGENTS.md: added Public SDK rules section (no dependency leakage,
naming conventions, deprecation pattern)
- README.md: removed Fantasy references
- pkg/kit/README.md: full rewrite with current API surface
- skills/kit-sdk/SKILL.md: updated examples and type references
- www/pages/providers.md, www/pages/cli/commands.md: updated
Prevent layout corruption and visual breakage when the terminal is
resized to narrow or short dimensions:
- Status bar: progressively drops middle/right sections instead of
wrapping to multiple lines (broke height calculation)
- Autocomplete popup: guard against negative widths, truncate names
before rendering to prevent text wrapping inside fixed-width columns,
adapt to name-only mode at very narrow widths
- Tree selector: use full height minus chrome instead of halved height,
guard against negative width in node truncation
- Model selector: rune-aware name truncation preserving provider tags,
width-adaptive entry rendering
- Overlay dialog: clamp dimensions to terminal bounds instead of using
fixed minimums that could exceed the terminal
- Input hint, popup footer, and all help text: tiered adaptive variants
for different terminal widths
- Queued messages: measure actual rendered height instead of fixed
5-line-per-message estimate
Add /model command that allows switching LLM models mid-session.
When invoked without arguments, opens a full-screen selector overlay
showing only models with configured API keys, with inline fuzzy search,
cursor navigation, and current model indicator. When invoked with an
argument (e.g. /model anthropic/claude-haiku-4-5), switches directly.
Also upgrades all Go dependencies to latest versions.