Complete rewrite of the UI and significant feature additions since v1.6.1.
UX Redesign (v2.0):
- Single-view dashboard replaces 4-tab sidebar
- Settings, Prompts, Troubleshooter, Memory Manager moved to center-screen modals
- Activity log in slide-out drawer
- Setup Wizard for first-run configuration
- Prompt version tracking with update notifications
- Health indicator in stats bar
Injection Viewer (v1.6–v2.1.6):
- Per-message injection data: see exactly what memories, lorebook entries,
and extension prompts were injected for any generation
- Context/Prompt Breakdown with per-category token counts (System, Char card,
Lorebook, Data Bank, Examples, Chat history) via ST Prompt Itemization
- Stacked bar visualization, token hints in headers, Tips popup
- Context overflow and heavy injection warnings
Memory Management:
- Unified block editor across all 5 editing surfaces (Memory Manager,
Consolidation, Conversion, Reformat, Data Bank browser)
- Find & Replace with highlighting across all editors
- Undo support for all edit operations
- Group chat character picker in Memory Manager
Other features:
- Tablet & phone display modes with touch-friendly controls
- Topic-tagged memory format for better vector retrieval
- Self-closing memory tag handling (GLM-4.7 compatibility)
- Protect recent messages from extraction feedback loop
- 9-point health check system with retrieve chunks and score threshold
- Shared editor factory (editor.js), pure utility library (lib.js)
- Vitest test suite: unit, snapshot, and live LLM tests
- Full documentation suite in docs/
See CHANGELOG.md for detailed per-version notes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show expected URL format (http://hostname:port/v1) and default ports
for each backend below the Base URL field when using the Local Server
preset.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users need to set the URL before connecting. Reorder so the flow is:
API Key → Base URL → Connect → Model picker → Test Model.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Connect button was inside the API key row, so it was hidden when
requiresApiKey was false (e.g., Local Server preset). Move it to its
own row controlled by modelsEndpoint. Also clear stale model display
on provider switch instead of auto-fetching from potentially offline
local servers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a health scoring system that checks Vector Storage configuration
and surfaces issues at a glance:
- Status bar: colored dot (green/yellow/red) with hover tooltip
- Diagnostics panel: detailed breakdown of each health check
- Per-message: duplicate/missing memory warnings in injection drawer
- Click-to-navigate: status bar dot scrolls to diagnostics
Health checks: vector files enabled, memory file exists, file vectorized,
chunk overlap adequacy, chunk size vs block size, memories injected,
duplicate detection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert tool now uses the same callGenericPopup pattern as consolidation:
- Side-by-side panes (original file vs editable memory cards)
- Full card editing (add/delete/edit blocks and bullets)
- Re-run with LLM toggle, version stack, and undo
- Output destination controls inside the dialog
- inApiCall guard prevents concurrent dialogs
- dialogClosed flag cancels stale re-run callbacks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Format settings: chunk boundary dropdown (block/bullet/custom),
custom separator input, metadata-in-chunks toggle. Settings persist
and conditionally show/hide dependent controls.
Heuristic parser: detectFileFormat() identifies 6 format types,
convertHeuristic() handles each with appropriate parsing strategy.
Includes defaultConversionPrompt for LLM fallback path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace 5 top-level tabs with 4. Consolidate and Batch move under a
Tools tab with pill-button sub-navigation. Add Convert tool HTML shell
with source dropdown, LLM prompt disclosure, and preview area.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three UX improvements:
- Model dropdown replaced with searchable text input (filter by typing,
keyboard navigation, optgroup support for NanoGPT)
- Group chats show character avatar thumbnails in the stats bar with
tooltip listing per-character memory filenames
- Extraction prompt labels now show "(1:1 chats)" or "(group chats)"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show the auto-generated or resolved filename in the 1:1 section so
users can see what file will be used without needing to set an override.
Group section already showed this via the placeholder in member inputs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move the "Separate memories per chat" toggle to shared settings so it
applies to both 1:1 and group chats. Update getMemoryFileNameForCharacter
to generate per-chat filenames (e.g. Name-chat123-memories.md) when
enabled, with perChat-aware auto-detection of existing files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hide 1:1 Chat settings when in a group chat, hide Group Chat settings
when in a 1:1 chat. Reduces clutter and only shows what's relevant.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract Now + View/Edit on first row, Consolidate + Undo on second row.
Prevents overflow on iPad landscape.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restructure settings into separate 1:1 Chat and Group Chat sections.
Add dynamic group members list showing each character's resolved memory
filename with editable overrides.
Filename detection cascade: manual override → auto-detect existing
*-memories.md in character's Data Bank → auto-generated {Name}-memories.md.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract per-character memories from group chats. Each NPC character
gets their own extraction call with their card and existing memories,
and results are written to their own Data Bank file.
- Add isGroupChat(), getGroupMembers() detection helpers
- Add per-character Data Bank read/write (bypasses this_chid)
- Add extractGroupMemories() with chunk × character loop
- Add group-specific extraction prompt with {{participants}} variable
- Branch extractMemories() to group path for active group chats
- Add group extraction mode setting and prompt UI
- Handle stale metadata detection for group chats in onChatChanged
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add "Merge extraction chunks" checkbox (default: off) so long
chats produce multiple smaller blocks instead of one massive one
- Add "dates and times" to extraction prompt's WHAT TO EXTRACT list
as a gentle nudge for temporal context
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Main tab gets "Memory Extraction" header with "Automatic" checkbox
- "Select all" moved inline with "Character Attachments" header
- New charMemory_sectionHeader CSS for label + control on same line
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Auto extraction checkbox moved next to Extract Now / View Edit
- Batch Extract tab renamed to Batch Extraction
- Added "Character Attachments" header with tooltip above chat list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Activity Log labeled and always visible below tab content
- Diagnostics moved from Main tab to permanent pane at bottom
- Main tab now only has Extract Now and View/Edit buttons
- Click activity log to expand, hover also works
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows last 3 log entries always visible below tabs, expandable
on click for more history. Uses max-height transition for smooth
expand/collapse.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hidden textarea + Custom option with <details> disclosure
showing the editable prompt for each strategy. Restore Default button
appears when a preset has been customized.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace nested drawer-based layout with top-level tabs (Main, Consolidate,
Batch Extract, Settings, Log). Move consolidation controls from Settings to
dedicated Consolidate tab. Move diagnostics from sub-tab into Main tab.
Remove Tools & Diagnostics drawer wrapper.
All element IDs preserved for JS compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename Test to Test Model. Send a specific echo prompt and check
whether the model follows the instruction. Show model name, response
time, and actual reply in the inline status. Yellow warning if the
model responds but doesn't follow the instruction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace auto-fetch-on-keystroke with explicit Connect button next to the
API key. Connect fetches the model list with inline status feedback.
Test button moved below model dropdown for logical flow: enter key →
Connect → pick model → Test.
API key reveal now auto-hides after 10 seconds as a security best practice.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Models like GLM-4.7 on NVIDIA use reasoning tokens that consume the
response budget before producing content. The previous max of 2000
was insufficient — bumped to 4000 to give thinking models headroom.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Default source changed from Main LLM to Dedicated API for better
out-of-box extraction quality
- Dropdown reordered: Dedicated API first, WebLLM second, Main LLM last
- Removed "If you just want to get started quickly" section from
getting started guide — steering all users toward the recommended path
- Updated all docs to reflect new ordering and default
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clearer labels that tell users what the setting actually does.
Internal values (provider, main_llm, webllm) are unchanged.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add GETTING-STARTED.md with step-by-step setup instructions covering
installation, provider setup, Vector Storage config, and settings tuning
- Raise auto-extraction interval default from 10 to 20 messages for
better extraction quality (more context per LLM call)
- Raise interval slider max from 50 to 100
- Update README with detailed slider interaction docs, Pin as Memory
explanation, and link to getting started guide
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add {{charCard}} placeholder that injects the character's description
and personality into the extraction prompt. This lets the LLM see what
is baseline character knowledge and avoid extracting it as memories.
Update default prompt with CHARACTER CARD section and strengthened
instructions to skip card-redundant info. Add note recommending API
Provider over Main LLM due to prompt pollution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add support for 11 LLM providers (OpenAI, Anthropic, OpenRouter, Groq,
DeepSeek, Mistral, xAI, NanoGPT, Ollama, Pollinations, Custom) with
per-provider settings, preset-based dispatch, and automatic migration
from the previous NanoGPT-only configuration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Retaining only 50 entries was losing history during long batch runs.
Bump to 500 and add a download button so the log can be saved as a
timestamped text file.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously only reset the active chat's metadata, so batch extraction
still saw other chats as fully processed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds phase logging (Sending/Waiting/Response received with timing)
always visible in activity log. When "Verbose" checkbox is enabled,
also logs the full prompt and raw LLM response.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extraction prompt:
- Replace broad "sexual mechanics" AVOID with targeted "repetitive minutiae"
- Add NOTE: capture vivid memorable details, skip sequential play-by-play
- Add clear boundary markers (===== sections) between existing memories and
chat content to prevent weaker models from contaminating extractions
- Add CRITICAL instruction: only extract from RECENT CHAT MESSAGES section
Per-message buttons:
- Add addButtonsToExistingMessages() to inject brain/bookmark buttons on
already-rendered messages when a chat loads (called from onChatChanged)
UX polish:
- Add descriptive tooltips to all UI elements (stats bar, buttons, sliders,
settings, tabs)
- Rename "Extract every N messages" to "Auto-extract every N new messages"
- Improve "no new messages" toast on manual Extract Now to suggest Reset
Extraction State
- Update Extract Now tooltip to explain the reset workflow
Docs:
- Add "Choosing an LLM for Memory Extraction" section to README with
recommended models (DeepSeek V3.1, Qwen3-235B, Mistral Large 3, Hermes 4),
models to avoid, and troubleshooting guide
- Update README for cooldown, tabbed panel, stats bar, per-message buttons
- Update PLAN.md with completed items and new extraction quality ideas
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace default extraction prompt with higher-quality version: AVOID list
(sexual mechanics, temporary states, dialogue), FOCUS categories, past
tense rule, consolidation/fact-checking rules, better examples
- Bump default responseLength from 500 to 800
- Add minCooldownMinutes setting (default 10, range 0-30) to prevent
rapid-fire extractions; manual extractions bypass cooldown
- Combine Activity Log + Diagnostics into single tabbed drawer
- Expand stats bar from 2 to 4 items: file, memory count, extraction
progress (msgs/interval), cooldown timer with auto-refresh
- Fix stats bar showing stale count after Clear All Memories
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add collapsible Activity Log panel that shows timestamped events:
chat switches, extraction state, message collection, LLM responses
- Fix bug where lastExtractedIndex advanced even when LLM returned
NO_NEW_MEMORIES, preventing subsequent manual extraction from
processing messages on a switched-to chat
- Now only advance lastExtractedIndex when memories are actually saved;
always reset messagesSinceExtraction to prevent re-trigger loops
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Test button next to API key to verify connection with a minimal request
- Add model filter checkboxes (Subscription, Open Source, Roleplay, Reasoning)
that narrow the dropdown with intersection logic
- Store additional model fields (isOpenSource, category, capabilities, costEstimate)
- Fix bug where switching chats didn't seed messagesSinceExtraction with
unextracted message count, preventing automatic extraction from triggering
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows using NanoGPT's OpenAI-compatible API for memory extraction
and consolidation, independent of the main chat LLM. Fetches model
list with subscription status, supports custom system prompts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows resetting extraction tracking without deleting memories,
so the next extraction re-reads all messages from the beginning.
Useful after manually editing or deleting memories.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show a side-by-side Before/After preview popup before applying
consolidation results, and add an Undo Consolidation button that
restores the pre-consolidation memories from an in-memory backup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch from ## Memory N headers to <memory chat="..." date="..."> tag blocks
with individual bullet parsing. Memory manager now shows grouped extraction
cards with per-bullet edit/delete controls. Stats bar simplified to file name
and total bullet count. Diagnostics panel shows vectorization status.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename extension header from CharMemory to Character Memory
- Add always-visible stats bar showing active file, memory count, and
extraction progress
- Flatten Memory Status sub-drawer so controls are immediately visible
- Merge Advanced section into Settings with separator dividers
- Rename buttons: Manage Memories → View / Edit, Reset → Clear All
Memories (moved to Settings with danger styling)
- Add tooltips, helper text styling, and separator/danger-button CSS
- Call updateStatusDisplay after consolidation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-generate memory file names from character name (CharName-memories.md),
with optional per-chat isolation (CharName-chat{id}-memories.md). Add memory
info to diagnostics panel showing active file, memory count, and last
extraction result. Migrate old hardcoded 'char-memories.md' default to
auto-naming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>