Skip to content

2.6.0

Choose a tag to compare

@csebold csebold released this 01 Apr 06:51
· 2564 commits to main since this release
2.6.0

Quilltap v2.6.0 Release Notes

Highlights

New UI Layout - Complete redesign with persistent left sidebar navigation, collapsible character/chat lists, resizable sidebar width, and a simplified home page.

Characters-not-Personas - Unified character system where users can control any character directly. Personas have been converted to user-controlled characters with real-time impersonation switching.

Plugin Development SDK - New npm packages (@quilltap/plugin-types, @quilltap/plugin-utils, @quilltap/theme-storybook, create-quilltap-theme) enable standalone plugin development without access to Quilltap source.

Memory Cascade - Memories auto-extracted from messages now track provenance. Deleting or regenerating messages prompts handling of associated memories.


Major Features

New UI Layout with Left Sidebar Navigation

  • Replaced top navbar with persistent left sidebar
  • Sidebar includes: Characters, Chats sections with quick access lists
  • Footer with Settings, Tools, Themes, Quick Hide buttons and Profile menu
  • Collapsible sidebar (desktop) with persistent state in localStorage
  • Mobile: overlay drawer from left with hamburger trigger
  • Simplified header with centered search bar and full-width toggle
  • New home page with welcome message, favorites, and "Start Chat" button
  • Resizable sidebar width (256px–512px) with drag handle, persisted to MongoDB
  • Message count badges on sidebar chat items (shows "999+" for large chats)
  • Brand logo moved to sidebar header (quill icon when collapsed, full logo when expanded)
  • Full-width toggle now affects all pages via --qt-page-max-width CSS variable
  • Improved favorite character cards with wrapping titles and "Chat" quick-start button
  • Dashboard route deprecated; redirects to home page

Characters-not-Personas Migration

  • Personas have been converted to characters with controlledBy: 'user'
  • Users can now control any character directly during chat via impersonation
  • SpeakerSelector dropdown for switching between multiple impersonated characters
  • AllLLMPauseModal for all-LLM chats with Continue/Stop/Take Over options
  • New API endpoints: /api/chats/[id]/impersonate, /api/chats/[id]/active-speaker
  • Inter-character memory support with aboutCharacterId field
  • Chat creation UI now shows "Play As" selector for user-controlled characters
  • Character view page: user-controlled toggle, default conversation partner setting
  • Personas link removed from navigation; all /personas/* routes redirect to /characters
  • Migration in upgrade plugin converts existing personas and updates references

Plugin Development SDK

  • @quilltap/plugin-types (v1.1.0): TypeScript types for third-party plugin development
    • Exports all types: LLM, tools, provider, manifest, themes, roleplay templates
    • Error classes: PluginError, ApiKeyError, ProviderApiError, RateLimitError
    • Submodule exports for granular imports (/llm, /plugins, /common)
  • @quilltap/plugin-utils (v1.1.0): Runtime utilities for plugins
    • Tool call parsers and format converters
    • Logger bridge: createPluginLogger() routes to Quilltap core logging
    • OpenAICompatibleProvider base class for custom LLM providers
    • Roleplay template utilities: createRoleplayTemplatePlugin(), validation functions
  • @quilltap/theme-storybook (v1.0.4): Theme development kit
    • Default theme tokens CSS and all qt-* component classes
    • Storybook preset and ThemeDecorator for theme/mode switching
    • Comprehensive story components for all UI elements
  • create-quilltap-theme: CLI scaffolding for new theme plugins
    • Interactive prompts for theme name, author, description, primary color
    • Optional CSS overrides and Storybook setup
    • Includes bundled THEME_PLUGIN_DEVELOPMENT.md guide

Memory Cascade on Message Changes

  • Memories auto-extracted from messages now tracked with provenance links
  • Deleting a message prompts: delete/keep/regenerate associated memories
  • Regenerating a response (swipe) automatically cleans up old memories
  • Memory cards show "Source" link navigating to and highlighting source message
  • New chat settings section for default memory cascade behavior
  • Repository methods: deleteBySourceMessageId(), countBySourceMessageId()
  • Message navigation utilities for cross-page scroll-to-message functionality

Search & Replace Tool

  • Bulk text replacement across messages and memories
  • Scoping: single chat, all chats for a character, or all chats
  • Wizard-style UI: scope selection → search/replace input → preview counts → confirmation
  • Entry points: chat ToolPalette, character view page
  • Automatically regenerates memory embeddings after content changes

Plugin System

npm-based Plugin Installation

  • Browse qtap-plugin-* packages from npm registry in Settings → Plugins
  • Install/uninstall APIs with manifest validation and version compatibility checking
  • Support for scoped npm packages (@org/qtap-plugin-*)
  • Site-wide and per-user plugin installation scopes
  • Docker volume configuration for persistent plugin storage
  • Note: Gab AI provider moved to external plugin at @quilltap/qtap-plugin-gab-ai

Self-Contained Theme Plugin Architecture

  • Theme plugins now support module-based loading (similar to provider plugins)
  • Themes can embed tokens, CSS overrides, and fonts directly in the module export
  • ThemePlugin interface with ThemeMetadata, ThemeTokens, FontDefinition
  • Theme registry tries module-based loading first, with file-based fallback
  • All existing themes (Ocean, Earl Grey, Rains) migrated to self-contained format

Plugin-Registered Provider Configuration

  • Extended LLMProviderPlugin interface with runtime configuration:
    • messageFormat, charsPerToken, toolFormat, cheapModels, defaultContextWindow
  • Query methods in provider registry eliminate hardcoded provider data
  • Core lib files query registry first, with fallback to legacy constants
  • Adding/removing providers now only requires adding/removing the plugin

Roleplay Template Plugin Types

  • Added RoleplayTemplatePlugin, RoleplayTemplateConfig, RoleplayTemplateMetadata types
  • New utilities: createRoleplayTemplatePlugin(), createSingleTemplatePlugin()
  • Validation utilities: validateTemplateConfig(), validateRoleplayTemplatePlugin()
  • Documented in docs/TEMPLATE_PLUGIN_DEVELOPMENT.md

Theming & Styling

Theme Redesigns

  • Ocean Theme (v1.2.5): New quirky, childlike underwater aesthetic
    • Coral reef background image visible on all main pages
    • Glass-effect panels with backdrop blur
    • Color palette: coral pink, teal accent, jellyfish purple, octopus orange, seaweed green
    • Nunito font for playful typography
    • Fixed participant sidebar contrast issues
  • Earl Grey Theme: Modernized with ChatGPT-inspired design
  • Rains Theme: Modernized with ChatGPT-inspired design, serif headings

New qt-* Utility Classes

  • Avatar utilities: qt-avatar-name, qt-avatar-title with CSS variables
  • Button utilities: qt-button-success standalone class
  • Page utilities: qt-page-container, qt-page-toolbar
  • Sidebar utilities: qt-left-sidebar-brand, width variables
  • Card grid variants: qt-card-grid-2, qt-card-grid-3
  • Improved success button contrast with dark text on bright green

Chat Improvements

XML Tool Call Detection

  • Detects and executes tool calls from LLMs like DeepSeek that emit XML tool syntax
  • Supports formats: DeepSeek (<function_calls><invoke>), Claude-style, generic (<tool_call>)
  • XML tool calls stripped from displayed messages; execution status shown separately
  • Runs for ALL providers, not just pseudo-tool mode

Timestamp Injection in System Prompts

  • Configurable modes: disabled, conversation start only, or every message
  • Format options: friendly, ISO 8601, date only, time only, or custom format
  • Fictional time support: base timestamp that advances with real elapsed time
  • Template variable {{timestamp}} for custom placement
  • Global default in Chat Settings, per-chat override available

Scenario Prompt for New Chats

  • Add optional scenario text when creating a new chat
  • Available in both New Chat page and ChatCreationDialog
  • Scenario stored in chat context for character use

Message Re-attribution

  • Re-attribute messages to different participants
  • Works for both USER and ASSISTANT messages
  • Automatically deletes associated memories when re-attributed
  • After re-attribution, scrolls to updated message

All-LLM Chat Improvements

  • Turn manager auto-continues in all-LLM chats (no more "user's turn")
  • Single-character all-LLM chats continue in monologue mode
  • Pause logic at intervals (3, 6, 12... turns) prevents runaway API usage
  • Resume button properly triggers next speaker

Bug Fixes

  • Chat page content no longer cut off by page toolbar
  • Strip duplicate character name prefixes from LLM responses (multi-character chats)
  • Resolve "Maximum update depth exceeded" errors in React 19/Next.js 16
  • Prevent render loop in DevConsoleProvider with batched log updates
  • Deduplicate jobs in tasks queue to prevent React key collision
  • Memory regeneration respects message participantId in multi-character chats
  • After deleting a message, scroll to next message instead of bottom
  • Chat creation dialog now responsive with scrollable content
  • Improved error logging for undefined error messages
  • Fix TypeScript type errors in provider plugins (role types, stopSequences)

Refactoring

Backend Refactoring (6 Phases)

  • Phase 1: Migrated 101 API routes to createAuthenticatedHandler middleware (~1,500 lines saved)
  • Phase 2: Standardized API responses across 76+ route files, centralized utilities
  • Phase 3: User-scoped repository refactoring with generic base classes (32% reduction)
  • Phase 4: Batch query methods to eliminate N+1 patterns
  • Phase 5: Large service decomposition
    • context-manager.ts (1,266 lines) → 4 focused modules
    • search/route.ts (721 lines) → 73 lines with extracted service
    • chats/import/route.ts (763 lines) → 131 lines
  • Phase 6: Plugin registry integration; legacy fallback constants consolidated and deprecated

Frontend Refactoring

  • Created shared hooks: useDialogState, useWizardState, useAutoAssociate, useImageNavigation
  • Created BaseModal component consolidating modal structure from 17 components
  • Created shared ProfileCard and ProfileList components
  • Extracted wizard step components for export/import dialogs
  • Export dialog: 424 → ~250 lines; Import dialog: 565 → ~250 lines

Dead Code Cleanup

  • Removed duplicate components/characters/system-prompts/ directory
  • Removed unused debug components and auth placeholder files
  • Removed completed migration scripts
  • Removed unused barrel/index files for better tree-shaking
  • Removed backwards-compatibility shims

Logging Improvements

LLM API Debug Logging

  • All LLM API calls now log request and response details at debug level
  • Chat messages, cheap LLM tasks, embeddings, image generation, greeting generation
  • Consistent format with context: 'llm-api' for easy filtering

Reduced Verbose Logging

  • Removed ~2,900 debug log entries per typical session
  • Eliminated cache hit logs, successful validation logs, entry/exit pairs
  • Removed MongoDB connection status checks, repository instantiation logs
  • Removed UI lifecycle debug logs (theme, settings, search replace)
  • Kept only error logs, warnings, and initialization info logs

Infrastructure

Migrations Consolidated

  • All migration files moved from lib/mongodb/migrations/ to upgrade plugin
  • Post-login migrations now in upgrade plugin as user-migrations.ts
  • Upgrade plugin version: 1.0.11

Test Improvements

  • 114 new unit tests for characters-not-personas features
  • Unit tests for sidebar, memory cascade, and navigation features
  • Mock repository fixtures for auth middleware mocking

Documentation

  • New docs/THEME_PLUGIN_DEVELOPMENT.md with step-by-step tutorial
  • New docs/TEMPLATE_PLUGIN_DEVELOPMENT.md for roleplay template plugins
  • Updated features/complete/new_ui_layout.md documenting sidebar navigation
  • Updated features/complete/characters_not_personas.md for migration details
  • Package documentation: plugin-types, plugin-utils, theme-storybook, create-quilltap-theme