Commit Graph

40 Commits

Author SHA1 Message Date
a564f7ec77 fix: resolve all TypeScript errors and accessibility warnings
TypeScript error fixes:
- Fix UUID mock type in chunker.test.ts
- Remove invalid timestamp property from Message types in tests
- Fix mockFetch type in client.test.ts
- Add missing parameters property to tool definition in test

Accessibility fixes (109 → 40 warnings, remaining are CSS @apply):
- Add aria-labels to all toggle switches and icon-only buttons
- Add tabindex="-1" to all dialog elements with role="dialog"
- Add onkeydown handlers to modal backdrops for keyboard accessibility
- Fix form labels: change decorative labels to spans, use fieldset/legend for groups
- Convert fileInput variables to $state() for proper reactivity
- Fix closure captures in ThinkingBlock and HtmlPreview with $derived()
- Add role="region" to drag-and-drop zones
- Restore keyboard navigation to BranchNavigator

All 547 tests pass.
2026-01-23 15:33:25 +01:00
a80ddc0fe4 feat: add multi-backend LLM support (Ollama, llama.cpp, LM Studio)
Add unified backend abstraction layer supporting multiple LLM providers:

Backend (Go):
- New backends package with interface, registry, and adapters
- Ollama adapter wrapping existing functionality
- OpenAI-compatible adapter for llama.cpp and LM Studio
- Unified API routes under /api/v1/ai/*
- SSE to NDJSON streaming conversion for OpenAI backends
- Auto-discovery of backends on default ports

Frontend (Svelte 5):
- New backendsState store for backend management
- Unified LLM client routing through backend API
- AI Providers tab combining Backends and Models sub-tabs
- Backend-aware chat streaming (uses appropriate client)
- Model name display for non-Ollama backends in top nav
- Persist and restore last selected backend

Key features:
- Switch between backends without restart
- Conditional UI based on backend capabilities
- Models tab only visible when Ollama active
- llama.cpp/LM Studio show loaded model name
2026-01-23 15:04:49 +01:00
9b4eeaff2a feat(agents): implement agents feature (v1)
Adds agents feature with the following capabilities:
- Agent identity: name, description
- System prompt reference from Prompt Library (promptId)
- Tool set: subset of available tools (enabledToolNames)
- Optional preferred model
- CRUD operations with IndexedDB storage (schema v7)
- Project-agent relationships (many-to-many via junction table)
- Per-chat agent selection via AgentSelector component
- Settings UI via AgentsTab in Settings page

Integration:
- Agent tools filter LLM tool calls via getToolDefinitionsForAgent()
- Agent prompt integrates with prompt resolution (priority 3)
- AgentSelector dropdown in chat UI (opens upward)

Tests:
- 22 storage layer tests
- 22 state management tests
- 7 tool integration tests
- 9 prompt resolution tests
- 14 E2E tests

Closes #7
2026-01-22 12:02:13 +01:00
d81430e1aa test: extend test coverage for backend and frontend
Backend:
- Add fetcher_test.go (HTML stripping, URL fetching utilities)
- Add model_registry_test.go (parsing, size ranges, model matching)
- Add database_test.go (CRUD operations, migrations)
- Add tests for geolocation, search, tools, version handlers

Frontend unit tests (469 total):
- OllamaClient: 22 tests for API methods with mocked fetch
- Memory/RAG: tokenizer, chunker, summarizer, embeddings, vector-store
- Services: prompt-resolution, conversation-summary
- Components: Skeleton, BranchNavigator, ConfirmDialog, ThinkingBlock
- Utils: export, import, file-processor, keyboard
- Tools: builtin math parser (44 tests)

E2E tests (28 total):
- Set up Playwright with Chromium
- App loading, sidebar navigation, settings page
- Chat interface, responsive design, accessibility
- Import dialog, project modal interactions

Config changes:
- Add browser conditions to vitest.config.ts for Svelte 5 components
- Add playwright.config.ts for E2E testing
- Add test:e2e scripts to package.json
- Update .gitignore to exclude test artifacts

Closes #8
2026-01-22 11:05:49 +01:00
ddce578833 feat: implement cross-chat RAG for project conversations
- Add embedding-based chat indexing for project conversations
- Chunk long messages (1500 chars with 200 overlap) for better coverage
- Index messages when leaving a conversation (background)
- Search indexed chat history with semantic similarity
- Show other project conversations with message count and summary status
- Include relevant chat snippets in project context for LLM
- Fix chunker infinite loop bug near end of text
- Fix curl encoding error with explicit Accept-Encoding header
- Add document previews to project knowledge base context
- Lower RAG threshold to 0.2 and increase topK to 10 for better recall
2026-01-07 18:06:49 +01:00
298fb9681e feat: add project detail page with new chat creation
- Add /projects/[id] route with project header, stats, and tabbed UI
- Add "New chat in [Project]" input that creates chats inside project
- Add project conversation search and filtering
- Add file upload with drag-and-drop for project documents
- Update ProjectFolder to navigate to project page on click
- Add initialMessage prop to ChatWindow for auto-sending first message
- Support ?firstMessage= query param in chat page for project chats
- Add projectId support to vector-store for document association
2026-01-07 14:53:06 +01:00
5e6994f415 feat: add projects feature for organizing conversations
Add ChatGPT-style projects with cross-chat context sharing:

- Database schema v6 with projects, projectLinks, chatChunks tables
- Project CRUD operations and storage layer
- ProjectsState store with Svelte 5 runes
- Cross-chat context services (summaries, chat indexing, context assembly)
- Project context injection into ChatWindow system prompt
- ProjectFolder collapsible component in sidebar
- ProjectModal for create/edit with Settings, Instructions, Links tabs
- MoveToProjectModal for moving conversations between projects
- "New Project" button in sidebar
- "Move to Project" action on conversation items

Conversations in a project share awareness through:
- Project instructions injected into system prompt
- Summaries of other project conversations
- RAG search across project chat history (stub)
- Reference links
2026-01-07 14:36:12 +01:00
51b89309e6 fix: parse text-based tool calls for models without native function calling
Models like ministral output tool calls as plain text (e.g., tool_name[ARGS]{json})
instead of using Ollama's native tool_calls format. This adds a parser that:

- Detects text-based tool call patterns in model output
- Converts them to OllamaToolCall format for execution
- Cleans the raw tool call text from the message
- Shows proper ToolCallDisplay UI with styled output

Supports three formats:
- tool_name[ARGS]{json}
- <tool_call>{"name": "...", "arguments": {...}}</tool_call>
- {"tool_calls": [...]} JSON blobs
2026-01-07 12:41:40 +01:00
566273415f feat: add agentic tool templates and improve custom tool styling
Some checks failed
Create Release / release (push) Has been cancelled
- Add 5 agentic tool templates: Task Manager, Memory Store,
  Structured Thinking, Decision Matrix, Project Planner
- Task Manager and Memory Store persist to localStorage
- Add pattern-based auto-detect styling for custom tools in chat
- Add credit attribution to prompt browser
- Add 'agentic' category to tool template types
2026-01-07 12:30:00 +01:00
558c035b84 fix: prevent stream abort and improve attachment handling
- Limit max attachments to 5 files to prevent context overflow
- Fix URL update timing: use SvelteKit's replaceState in onComplete
  callback instead of history.replaceState before streaming
- Load attachment content from IndexedDB in conversation history
  so follow-up messages have access to file content
- Show error messages in chat when Ollama fails instead of stuck
  "Processing..." indicator
- Force file analysis when >3 files attached to reduce context usage
2026-01-04 01:46:26 +01:00
f8fb5ce172 fix: keep processing indicator visible until LLM starts streaming
Clear 'Processing...' text only when first token arrives, not before
the LLM request. This keeps the indicator visible during prompt
resolution, RAG retrieval, and LLM initialization.
2026-01-04 00:41:42 +01:00
4084c9a361 feat: add language instruction to always match user's language
LLM will now respond in the same language the user writes in,
defaulting to English if unclear.
2026-01-04 00:37:14 +01:00
26b58fbd50 feat: improve file attachment handling with processing indicator
- Add "Processing X files..." indicator in chat while handling attachments
- Indicator transitions to "Analyzing X files..." for large files needing LLM summarization
- Reuse streaming message for seamless transition to LLM response
- Add FileAnalyzer service for large file summarization with 10s timeout
- Skip analysis for borderline files (within 20% of 8K threshold)
- Read up to 50KB from original file for analysis (not just truncated content)
- Remove base64 blobs from JSON before analysis to reduce prompt size
- Add AttachmentDisplay component for showing file badges on messages
- Persist attachments to IndexedDB with message references
- Add chat state methods: setStreamContent, removeMessage
- Clean up debug logging
2026-01-04 00:35:33 +01:00
6868027a1c feat: add model-specific prompts and custom model creation
Adds two related features for enhanced model customization:

**Model-Specific System Prompts:**
- Assign prompts to models via Settings > Model Prompts
- Capability-based default prompts (vision, tools, thinking, code)
- Auto-select appropriate prompt when switching models in chat
- Per-model prompt mappings stored in IndexedDB

**Custom Ollama Model Creation:**
- Create custom models with embedded system prompts via Models page
- Edit system prompts of existing custom models
- Streaming progress during model creation
- Visual "Custom" badge for models with embedded prompts
- Backend handler for Ollama /api/create endpoint

New files:
- ModelEditorDialog.svelte: Create/edit dialog for custom models
- model-creation.svelte.ts: State management for model operations
- model-prompt-mappings.svelte.ts: Model-to-prompt mapping store
- model-info-service.ts: Fetches and caches model info from Ollama
- modelfile-parser.ts: Parses system prompts from Modelfiles
2026-01-03 21:12:49 +01:00
cf4981f3b2 feat: add auto-compact, settings page, and message virtualization
- Add auto-compact feature with configurable threshold (50-90%)
- Convert settings modal to full /settings page with organized sections
- Add Memory Management settings (auto-compact toggle, threshold, preserve count)
- Add inline SummarizationIndicator shown where compaction occurred
- Add VirtualMessageList with fallback for long conversation performance
- Trigger auto-compact after assistant responses when threshold reached
2026-01-03 18:26:11 +01:00
5cab71dd78 fix: sync context progress bar with custom context length setting
- Add customMaxTokens override to ContextManager
- maxTokens is now derived from custom override or model default
- ChatWindow syncs settings.num_ctx to context manager
- Progress bar now shows custom context length when enabled
2026-01-02 21:04:47 +01:00
4a9e45b40b fix: persist toolCalls to database for reload persistence
Tool usage was not showing after page reload because the toolCalls
field was not being included when saving assistant messages to the
database. Now toolCalls are properly persisted and restored.
2026-01-02 20:34:53 +01:00
686c59c6bc feat: improve auto-scroll to match cloud provider UX
Auto-scroll now stops when the top of the assistant's response
reaches the top of the viewport, allowing users to read from
the beginning while more content streams below.
2026-01-02 09:54:20 +01:00
6ecb64f802 feat: styled search results in tool call dropdown
- Parse search results into structured data with SearchResultItem type
- Render expanded results as clickable cards with:
  - Numbered rank badges
  - Linked titles (open in new tab)
  - Truncated URLs
  - Snippets when available
- Fallback to raw text for non-search results
- Proper light/dark mode styling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 07:32:26 +01:00
3faf1e9f34 fix: consistent theming across tool and message components
- MessageContent: Make prose-invert conditional (dark:prose-invert)
  and use !important on inline code colors to override Typography
- ToolCallDisplay: Replace theme variables with explicit Tailwind
  dark/light classes for reliable styling
- ToolResultDisplay: Same treatment - explicit slate colors for
  both light and dark modes

All components now properly respect light/dark mode toggle.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 07:28:15 +01:00
77bc72078a fix: code block theming and JSON tool call display
- CodeBlock: Use consistent dark styling (github-dark theme colors)
  regardless of light/dark app theme to match Shiki output
- MessageContent: Detect JSON tool call objects in message content
  and render them as formatted code blocks instead of prose

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 07:18:31 +01:00
35884150ee feat: rename project from ollama-webui to Vessel
- Update package.json name to "vessel"
- Update storage keys (vessel-settings, vessel IndexedDB)
- Update Go module to vessel-backend with new imports
- Update database path to vessel.db
- Add new Vessel "V" icon (favicon + app icons)
- Update all user-facing branding (titles, sidebar, settings)
- Update docker-compose files with vessel naming and network
- Change accent color from emerald to violet

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 06:53:07 +01:00
d54acb97a3 fix: improve light mode theming and text contrast
- Increase light mode text contrast in app.css (slate.600→700, slate.500→600)
- Add light/dark mode prose styles in MessageContent.svelte for proper markdown rendering
- Convert hardcoded slate-* classes to theme utilities across 37 components
- Fix code block copy button and scrollbar theming for both modes
- Update all route pages (models, tools, knowledge, prompts) with theme classes
- Ensure consistent theming in modals, dialogs, and form inputs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 06:20:48 +01:00
8fa6fdec1f feat: implement light/dark theme toggle with CSS custom properties
- Add CSS custom properties for theme colors (:root and .dark)
- Create utility classes: bg-theme-*, text-theme-*, border-theme-*
- Update +layout.svelte main containers
- Update Sidenav with theme-aware navigation links
- Update TopNav header and action buttons
- Update ChatWindow main area and input section
- Update ChatInput with themed input container
- Update MessageItem with theme-aware message bubbles
- Update EmptyState with themed welcome cards

Theme colors automatically switch between light and dark mode
when clicking the theme toggle button in the top navigation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 04:46:31 +01:00
243f00f85f fix: show system prompt selector on new chat page
- Add onSelect callback to SystemPromptSelector for 'new' mode
- Track selected prompt locally (newChatPromptId) before conversation exists
- Show selector in both 'new' and 'conversation' modes
- Apply newChatPromptId when streaming in new conversation

Note: Theme toggle mechanism works but CSS lacks light mode styles
(app uses hardcoded dark colors, would need CSS refactoring)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 04:40:03 +01:00
463067d2ae feat: add context management, summarization, and UI improvements
Context Window Management:
- Add ContextFullModal with recovery options (summarize, new chat, dismiss)
- Show toast notifications at 85% and 95% context thresholds
- Block sending when context exceeds 100% until user takes action

Conversation Summarization:
- Add isSummarized/isSummary flags to Message type
- Implement markAsSummarized() and insertSummaryMessage() in ChatState
- Add messagesForContext derived state (excludes summarized, includes summaries)
- Complete handleSummarize flow with LLM summary generation
- Add amber-styled summary message UI with archive icon

Auto-scroll Fixes:
- Fix Svelte 5 reactivity issues by using plain variables instead of $state
- Add continuous scroll during streaming via streamBuffer tracking
- Properly handle user scroll override (re-enable at bottom)

Drag & Drop Improvements:
- Add full-screen drag overlay with document-level event listeners
- Use dragCounter pattern for reliable nested element detection
- Add hideDropZone prop to FileUpload/ImageUpload components

Additional Features:
- Add SystemPromptSelector for per-conversation prompts
- Add SearchModal for full-text message search
- Add ShortcutsModal for keyboard shortcuts help
- Add theme toggle to TopNav

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 04:36:18 +01:00
bb5720434a feat: add streaming stats, settings panel, model management, and export/import
Implement four major features for the Ollama WebUI:

1. Streaming Stats - Real-time performance metrics display
   - Tokens per second, time to first token, total tokens
   - Fade-out display after stream completion
   - New streaming-metrics.svelte.ts store and StreamingStats component

2. Settings Panel - Model parameter configuration
   - Temperature, top_k, top_p, num_ctx sliders
   - localStorage persistence for global defaults
   - Collapsible panel in chat window with gear icon toggle

3. Model Management - Pull/delete models from UI
   - Add pullModel() and deleteModel() methods to Ollama client
   - Progress tracking with speed and ETA calculations
   - PullModelDialog component and model-operations store

4. Export/Import - Full conversation backup/restore
   - JSON export with full fidelity, Markdown for readability
   - Import validation with error/warning display
   - Export button in conversation items, import in sidebar header

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 03:35:32 +01:00
c5864fadf6 fix: memory leaks, mobile UX, and silent failures
- Fix memory leaks in ui.svelte.ts and sync-manager.svelte.ts by storing
  bound function references for proper addEventListener/removeEventListener
- Make conversation action buttons visible on mobile (opacity-100 when isMobile)
- Replace silent console.error calls with toast notifications for user feedback
- Remove ~35 debug console.log statements from production code

Files: ui.svelte.ts, sync-manager.svelte.ts, ConversationItem.svelte,
ChatWindow.svelte, CodeBlock.svelte, MessageActions.svelte,
MessageContent.svelte, +page.svelte, builtin.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 02:39:24 +01:00
2e1a677431 feat: add backend model registry API and fix sidenav updates
Backend:
- Add local models API with filter, sort, and pagination
- Add grouped chats endpoint for date-based display
- Support search, family filtering, and multi-field sorting

Frontend:
- Add model registry store with backend-powered operations
- Add server conversations store for future backend queries
- Fix sidenav to use local state for immediate updates on
  conversation create/delete (offline-first architecture)
- Fix date display in conversation items (remove duplicate
  Date constructor call)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 02:01:18 +01:00
c0ef31e5f4 feat: collapse tool results and add headless Chrome fetcher
Backend:
- Add unified URL fetcher with fallback chain: curl → wget → native Go → headless Chrome
- Implement JS-rendered page detection for sites like docs.rs
- Add chromedp dependency for headless browser support
- Log fetch method on server startup

Frontend:
- Store tool results in structured ToolCall.result field instead of message content
- Show tool results collapsed by default in ToolCallDisplay
- Add expandable results section with truncation for large outputs
- Add Message.hidden flag for internal messages (tool context)
- Separate visibleMessages (UI) from allMessages (API) to fix infinite loop
- Fix tool result messages not being sent to model

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 23:52:57 +01:00
4758fa8c52 feat: add native thinking mode, file uploads, and model capability icons
Thinking mode:
- Add native Ollama `think: true` API parameter support
- Create ThinkingBlock component with collapsible UI and streaming indicator
- Allow expanding/collapsing thinking blocks during streaming
- Pass showThinking prop through component chain to hide when disabled
- Auto-generate smart chat titles using LLM after first response

File uploads:
- Add FileUpload component supporting images, text files, and PDFs
- Create FilePreview component for non-image attachments
- Add file-processor utility for text extraction and PDF parsing
- Text/PDF content injected as context for all models

Model capabilities:
- Add ModelCapabilityIcons component showing vision/tools/code badges
- Detect model capabilities from name patterns in models store
- Display capability icons in model selector dropdown

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 23:05:08 +01:00
a327b24248 fix: allow typing during streaming and maintain input focus
- Textarea no longer disabled during streaming (only sending is blocked)
- User can prepare their next message while LLM is responding
- Focus maintained on input after sending a message
- Image upload also enabled during streaming

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:55:55 +01:00
3cf6036c15 feat: modernize UI/UX and add quick-start prompts
- Modernize chat UI with dark slate palette and subtle styling
- Add interactive quick-start prompt cards that set system prompts
- Clear temporary prompt when starting new chat
- Fix scroll jumping during streaming by skipping Shiki highlighting
- Improve code block styling with CSS containment
- Fix doubled newlines in code blocks (Shiki .line display: inline)
- Simplify success badge in execution output

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:52:30 +01:00
5f1988ab65 feat: visually distinguish tool messages from regular AI responses
- Tool messages get emerald/teal avatar with wrench icon
- Tool message bubbles have emerald left border and darker bg
- Normal assistant messages keep purple robot avatar
- Clear visual hierarchy: user (blue) / assistant (purple) / tool (green)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:16:55 +01:00
9627bd3afc fix: hide tool result user messages and improve visibility
- Hide tool result messages (role: user) from chat display
  They're internal API messages, not actual user input
- Improve pattern matching to catch all tool result formats
- Clean up "Tool execution results:" and "Called tool:" text
- Detect and hide HTML garbage from failed fetch attempts
- Add fetch result type with proper styling
- Improve text visibility in fallback displays

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:13:09 +01:00
f5fa9121f4 feat: improve tool calling UI/UX
ToolCallDisplay improvements:
- Tool-specific icons and gradient colors (location, search, fetch, time, calc)
- Human-readable argument formatting instead of raw JSON
- Collapsible details with expand/collapse animation
- Contextual summaries (e.g., "Searching: query")

New ToolResultDisplay component:
- Beautiful location results with city/country display
- Web search results as clickable cards with ranks
- Error states with distinct red styling
- Automatic JSON detection and formatting

MessageContent improvements:
- Detect and parse tool results in message content
- Hide redundant "Called tool:" text (shown via ToolCallDisplay)
- Clean separation of text, code, and tool results

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 21:09:40 +01:00
940abb18e8 fix: improve tool descriptions and enable recursive tool calling
- Simplify and clarify all tool descriptions for better model understanding
- Enable recursive tool calling - model can now chain multiple tools
- Pass tools on follow-up calls so model can call more tools after seeing results
- Update tool result message to encourage calling additional tools if needed
- Include suggestion in error messages so model knows what to do on failure
- Fix StreamingIndicator visibility with explicit colors

🤖 Generated with [Claude Code](https://claude.ai/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 20:08:37 +01:00
26b4f342fc feat: add web search and location tools
- Add web_search built-in tool that searches via DuckDuckGo
- Add get_location tool to get user's geographic location
- Create backend search proxy endpoint (/api/v1/proxy/search)
- DuckDuckGo HTML scraping with title, URL, and snippet extraction
- Geolocation with OpenStreetMap reverse geocoding for city/country
- Fix StreamingIndicator visibility in dark mode
- Improve tool descriptions to encourage proper tool usage
- Better error messages with suggestions when location fails

🤖 Generated with [Claude Code](https://claude.ai/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 20:04:09 +01:00
6013191376 feat: add system prompts, custom tools, theme toggle, and tool display
Major features implemented:
- System prompt management (/prompts route)
  - Create, edit, delete prompt templates
  - Set default and active prompts
  - Prompts stored in IndexedDB (v3 migration)
  - Injected into chat as system messages

- Custom tool creation (ToolEditor)
  - Create tools with JavaScript or HTTP implementations
  - Execute user-defined tools during chat
  - Tool call display in messages (ToolCallDisplay.svelte)

- Theme toggle
  - Light/dark mode switch in Settings
  - Theme persistence to localStorage
  - Flash prevention on page load

- Bug fixes
  - Disable USE_FUNCTION_MODEL (was routing all to functiongemma)
  - Add ready() promise to prompts store for async loading
  - Fix ToolEditor syntax error (extra script tag)

Files created:
- src/lib/storage/prompts.ts
- src/lib/stores/prompts.svelte.ts
- src/routes/prompts/+page.svelte
- src/lib/components/tools/ToolEditor.svelte
- src/lib/components/chat/ToolCallDisplay.svelte

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 19:31:15 +01:00
de835b7af7 feat: initial commit - Ollama WebUI with tools, sync, and backend
Complete Ollama Web UI implementation featuring:

Frontend (SvelteKit + Svelte 5 + Tailwind CSS + Skeleton UI):
- Chat interface with streaming responses and markdown rendering
- Message tree with branching support (edit creates branches)
- Vision model support with image upload/paste
- Code syntax highlighting with Shiki
- Built-in tools: get_current_time, calculate, fetch_url
- Function model middleware (functiongemma) for tool routing
- IndexedDB storage with Dexie.js
- Context window tracking with token estimation
- Knowledge base with embeddings (RAG support)
- Keyboard shortcuts and responsive design
- Export conversations as Markdown/JSON

Backend (Go + Gin + SQLite):
- RESTful API for conversations and messages
- SQLite persistence with branching message tree
- Sync endpoints for IndexedDB ↔ SQLite synchronization
- URL proxy endpoint for CORS-bypassed web fetching
- Health check endpoint
- Docker support with host network mode

Infrastructure:
- Docker Compose for development and production
- Vite proxy configuration for Ollama and backend APIs
- Hot reload development setup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-31 08:11:33 +01:00