v6.8.5 — Character Wiki, Relationship Web, jsonrepair, responsive overhaul
Highlights
Two major new features (Character Wiki + Relationship Web), a from-the-ground-up responsive overhaul (container queries, tablet fullscreen, auto-condense), and a real tokenizer-based JSON repair pipeline that finally handles unescaped quotes inside string values.
Added
- Character Wiki overlay — full-screen browser for every character ever encountered, not just those currently in scene. Walks all snapshots once on open to aggregate first seen / last seen / appearance count / last known location. Per-character cards with appearance grid, relationship meters with mini sparklines, goals, inventory, fertility, and history metadata. Search, filter pills (All / In Scene / Absent), sort (name / first seen / last seen / appearances / relevance), compact grid view, per-character user notes, avatars, JSON / MD export.
- Relationship Web visualization — SVG circular layout graph of all characters with relationship edges. Edge weight reflects relationship strength; node color matches per-character color assignment. Reachable from the Character Wiki header.
- Container queries for the panel —
#sp-paneldeclarescontainer-type: inline-sizeso child styles can react to the panel's actual width. Replaces viewport@mediaqueries that broke onposition: fixed. New breakpoints at 550px and 380px. - Tablet fullscreen mode — 601–1024px viewports now match the mobile fullscreen overlay pattern, with the mobile slide-up animation and the mobile-style top bar.
- Auto-condense at intermediate widths so the panel stops bleeding into the chat area before mobile mode kicks in.
- Vendored
jsonrepairv3.12.0 (ISC) for inline tracker JSON parsing — 106-case validation suite undertests/vendor/.
Changed
- Quest journal UI — NEW / UPDATED / RESOLVED badges right-aligned alongside action buttons.
"upd"abbreviation replaced with the full localized label, capitalized via CSS so all 29 locales render naturally. - Inline tracker JSON repair —
cleanJson()now usesjsonrepair(tokenizer-based) instead of nine in-house regex passes. Worst-case behavior is unchanged: a clean throw still triggers the existing separate-generation fallback. - Character storage now accumulates the full historical character set forever; the view layer trims via
filterForView(). This is what powers the Character Wiki overlay. - Interceptor prompt — removed "silently / hidden" wording that some models parroted into narrative. Concrete delta payload examples improve schema compliance.
Fixed
- Character / relationship sync —
filterForView()reconcilesd.charactersagainstd.charactersPresentand stubs missing entries fromd.relationships. Resolves the "4 relationships shown but only 1 character" gap. - MemoryBooks compatibility —
GENERATION_ENDEDhandler now guards oninlineGenStartMs > 0so extraction only runs against generations ScenePulse actually injected into. Other extensions firingGENERATION_ENDEDfor their ownquietPrompt()calls will no longer corrupt their messages. - Streaming hider regex broadened to match
[SCENE TRACKER ...]echoed instruction headers some models emit during streaming. - JSON parse error logging now matches both V8/Chromium
position Nand Firefoxline N column Nformats. Previously the logged context window was always anchored at position 0 on Firefox. - Fallback warning text distinguishes
markers found, JSON unparseable(sampling/formatting failure) fromno SP markers(prompt-following failure). Conflating these previously sent investigations down the wrong path. - Live language switch for settings, schema-edit protection (lock confirm), experimental-feature caution labels, miscellaneous settings i18n fixes.
- Wiki meter row spacing — label column widened so "Compatibility" no longer overflows into the bar.
Full changelog: v6.6.0...v6.8.5