89 lines
3.5 KiB
Plaintext
89 lines
3.5 KiB
Plaintext
-- 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<ModelProviderGroup>
|
|
selected_model_id: String?
|
|
}
|
|
|
|
value ModelProviderGroup {
|
|
provider_name: String -- e.g. "OpenAI", "Ollama", "LM Studio"
|
|
models: List<ModelEntry>
|
|
}
|
|
|
|
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
|