-- allium: 1 -- bDS Chat Panel -- Scope: UI content area — AI chat surface -- Distilled from: ChatPanel.tsx -- Describes the layout and behaviour of the chat panel. -- ─── Chat panel ─────────────────────────────────────────────── -- Three-region vertical layout: header, message area, input area. -- API Key Required screen (shown when no API key): -- Key icon, title, description, "Open Settings" button -- Header: -- Left: conversation title (or "New Chat"), CSS ellipsis on overflow -- Right: model selector button + dropdown. Groups models by provider. -- Message area: -- Welcome screen (no messages, not streaming): robot icon, tips -- Message list: each has avatar (user=person, assistant=robot), role label, text -- User messages: plain text -- Assistant messages: rendered as GFM Markdown -- External images blocked (CSP), shown as links -- Tool markers: checkmark/dot, tool name, truncated args (30 char strings) -- Streaming: accumulating markdown + tool markers, thinking dots animation -- Auto-scrolls to bottom on new messages -- Input area: -- Abort/Stop button (only during streaming, square stop icon) -- Auto-growing textarea (max 200px). Enter sends, Shift+Enter newline -- Send button (up-arrow icon), disabled when empty or streaming -- Token usage tracked per conversation (displayed in status bar, not chat panel). -- Per-conversation model override via header selector. config { chat_tool_args_max_length: Integer = 30 chat_input_max_height: Integer = 200 } -- ─── Model selector dropdown ────────────────────────────────── value ModelSelectorDropdown { -- Dropdown in chat panel header for per-conversation model override. -- Groups models by provider using section headers. -- Each entry: model display name. -- Expandable details per model: context window, max output tokens, pricing. -- Selected model persisted with conversation record. -- Changing model mid-conversation applies to subsequent messages only. groups: List selected_model_id: String? } value ModelProviderGroup { provider_name: String -- e.g. "OpenAI", "Ollama", "LM Studio" models: List } value ModelEntry { model_id: String display_name: String context_window: Integer max_output_tokens: Integer } -- ─── Chat panel actions ───────────────────────────────────── -- Model selector: -- Dropdown in header, groups models by provider (optgroup) -- Selection is per-conversation override, persisted with conversation -- Changing model mid-conversation applies to subsequent messages only -- Streaming behaviour: -- Messages accumulate in real-time (markdown rendered incrementally) -- Tool call markers: checkmark icon (done) or dot (in-progress), -- tool name, args truncated to 30 chars for string values -- Thinking animation (three dots) during LLM processing -- Stop/Abort: -- Square stop icon button, visible only during active streaming -- Stops current generation, partial message preserved as-is -- Assistant action dispatch: -- Assistant tool calls can trigger navigation actions: -- open_post(id), open_media(id), open_settings(), etc. -- Actions dispatched through store, same as user clicks -- Navigation actions open tabs with pin intent