- Backend runs on port 9090 (matches vite proxy default)
- Adds health check command for all services
- Includes llama.cpp server commands
- Adds test and build commands
- Add SyncStatusIndicator component showing connection status in TopNav
- Add SyncWarningBanner that appears after 30s of backend disconnection
- Green dot when synced, amber pulsing when syncing, red when error/offline
- Warning banner is dismissible but reappears on next failure
Closes #11
- Fix pin icons in ConversationItem to use bookmark style matching TopNav
- Make pin() and archive() methods async with IndexedDB persistence
- Use optimistic updates with rollback on failure
- Queue changes for backend sync via markForSync()
Install script improvements:
- Show release notes after --update completes
- Detect installed version from backend/cmd/server/main.go
- Fetch releases from GitHub API and display changes between versions
- Graceful fallback when jq not installed (shows link only)
Embedding model detection:
- Add EMBEDDING_MODEL_PATTERNS for detecting embedding models
- Add embeddingModels and hasEmbeddingModel derived properties
- KnowledgeTab shows embedding model status conditionally
- MemoryTab shows model installation status with three states
- Add dedicated /search page with semantic, titles, and messages tabs
- Add embedding model selector in Settings > Memory Management
- Add background migration service to index existing conversations
- Fix sidebar search to navigate on Enter only (local filtering while typing)
- Fix search page input race condition with isTyping flag
- Update chat-indexer to use configured embedding model
- 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
- Add embedding model dropdown to project file upload
- Create addDocumentAsync that stores immediately, embeds in background
- Add embeddingStatus field to track pending/processing/ready/failed
- Show status indicator and text for each document
- Upload no longer blocks the UI - files appear immediately
- Background embedding shows toast notifications on completion/error
- Add 30 second timeout to generateEmbedding and generateEmbeddings
- Abort controller cancels request if it takes too long
- Clear error message when embedding model isn't available
- Add null check for projectId before file upload
- Wrap loadProjectData in try-catch after upload
- Show detailed error messages on upload failure
- Fix document filter to use strict equality
- 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
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
Tool descriptions now explicitly state when models should use them:
- Memory Store: 'Use when user asks to remember, recall, list memories'
- Task Manager: 'Use when user mentions tasks, todos, things to do'
- Structured Thinking: 'Use for complex questions requiring analysis'
- Decision Matrix: 'Use when comparing options or recommendations'
- Project Planner: 'Use for planning, roadmaps, breaking work into phases'
This helps smaller models understand WHEN to call these tools instead of
just responding with text claiming they don't have memory/capabilities.
When the model calls recall without key or category (e.g., 'what memories
do you have?'), it now returns all memories across all categories instead
of an error. This provides better UX since models often use recall instead
of list for memory queries.
- Add validation for missing key/value in store action
- Return formatted entries in recall (category only) - consistent with list
- Check if category exists before reporting success in forget
- Include value in store response for confirmation
- Include entriesRemoved count when forgetting a category
The list action was only returning keys and counts, not the actual
stored values. Now it returns full entries with key, value, and
stored timestamp for all memories.
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
- Add curated prompt templates with categories (coding, writing, analysis,
creative, assistant) that users can browse and add to their library
- Add "Browse Templates" tab to the Prompts page with category filtering
and preview functionality
- Add Design Brief Generator tool template for creating structured design
briefs from project requirements
- Add Color Palette Generator tool template for generating harmonious
color schemes from a base color
Prompts included: Code Reviewer, Refactoring Expert, Debug Assistant,
API Designer, SQL Expert, Technical Writer, Marketing Copywriter,
UI/UX Advisor, Security Auditor, Data Analyst, Creative Brainstormer,
Storyteller, Concise Assistant, Patient Teacher, Devil's Advocate,
Meeting Summarizer
Adds the ability to test HTTP endpoint custom tools directly in the
editor, matching the existing test functionality for Python and
JavaScript tools. Closes #6.
- 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
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.
- 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
- Add postinstall script to copy worker to static/
- Update Dockerfile to copy worker during build
- Update file-processor to try local worker first, fallback to CDN
- Bump version to 0.4.11
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