Commit Graph

423 Commits

Author SHA1 Message Date
Mingyu 691586ce2f Merge branch 'SpicyMarinara:main' into i18n/zh-tw 2025-11-26 15:51:12 +08:00
Mingyu d486c9e924 mobile done 2025-11-26 07:49:59 +00:00
Spicy_Marinara 0c5b55b190 Add character card info in separate mode with muted filtering and scrollable Past Events 2025-11-25 12:40:28 +01:00
Mingyu 6759f514f3 pc all done 2025-11-24 22:38:56 +08:00
Mingyu 79f99a40c6 RPG Companion index [done] 2025-11-24 19:48:34 +08:00
Mingyu ab33604ea0 Edit Trackers Pop-up window [done] 2025-11-24 17:40:07 +08:00
Mingyu 0f0a4dceeb RPG Companion Settings Pop-up window [done] 2025-11-24 17:37:38 +08:00
Mingyu 8ef4e4ba6d first try i18n base ok 2025-11-24 17:35:41 +08:00
Spicy_Marinara 950d83fc18 Update promptBuilder.js 2025-11-23 19:59:27 +01:00
Spicy Marinara 5e05dee0e8 Merge pull request #50 from chungchan-dev/fix/mobile-layout
fix: some mobile layout
2025-11-23 13:40:09 +01:00
Spicy_Marinara 67df7034eb Add custom HTML prompt editor, skills blur handler, and include skills in separate mode 2025-11-22 23:36:39 +01:00
Chanho Chung eef547b0fa fix: mobile layout of rpg-skills-section font size 2025-11-22 23:35:30 +09:00
Chanho Chung fed4e2d095 fix: mobile layout of rpg-skills-section and rpg-classic-stat 2025-11-22 23:27:45 +09:00
Chanho Chung 02f080cc98 fix: mobile layout of rpg-mobile-tabs, rpg-info-content, rpg-character-card 2025-11-22 23:09:54 +09:00
Chanho Chung 00265ba905 fix: mobile layout of rpg-info-box 2025-11-22 11:14:14 +09:00
Spicy_Marinara c3624c240f Exclude attributes from separate tracker generation requests 2025-11-21 00:01:44 +01:00
Spicy_Marinara 76c7e3cd9c Update HTML prompt wording and improve together mode swipe handling 2025-11-20 22:59:31 +01:00
Spicy_Marinara 2b45dc8fae Add stat change guidelines, attributes toggle, skills editing, and improved character parsing
- Add temporal awareness and stat decay rules to prompt (0-5% per message)
- Add 'Always Include Attributes' toggle in tracker editor
- Fix skills section editing (was not saving customFields)
- Improve Present Characters parser to handle malformed formats (mid-line chars, extra blank lines)
- All changes work in both together/separate generation modes
2025-11-18 15:10:24 +01:00
Spicy_Marinara ed3eac54fc Update promptBuilder.js 2025-11-16 00:06:32 +01:00
Spicy_Marinara c48b1dab46 Fix: Hide UI elements when extension disabled
- Skip UI initialization entirely when extension is disabled on page load
- Remove all UI elements (panel, buttons) from DOM when disabling extension
- Recreate full UI when re-enabling extension
- Hide mobile toggle button on desktop viewports (>1000px)
- Show/hide mobile toggle based on viewport size transitions
- Ensures clean state management for extension enable/disable
2025-11-13 23:30:44 +01:00
Spicy_Marinara bd891e39b0 Fix: Quests now properly scoped per-chat
Quests were bleeding through from other chats because loadChatData()
wasn't resetting them when switching to a chat without RPG data.

When loading a chat with no rpg_companion metadata, the function now
resets quests to empty state (main: 'None', optional: []) along with
other tracker data. This ensures each chat maintains its own quest
state independently.
2025-11-13 21:01:37 +01:00
Spicy Marinara dfbae54b48 Merge pull request #47 from amauragis/guided-generation-compat
Add a prompt injection suppresson feature for Guided Generations
2025-11-13 20:59:13 +01:00
Andy Mauragis dc37fd4a63 docs: Update README with guided generation compatibility info 2025-11-13 13:46:36 -05:00
Andy Mauragis 0ac85ad9fd feat: Add 'Skip Injections during Guided Generations' setting and UI 2025-11-13 13:46:36 -05:00
Andy Mauragis 407a45a25c feat: Add core suppression logic and integrate into prompt injector 2025-11-13 13:46:36 -05:00
Spicy_Marinara d658e337f6 Fix: Support multiple character variants in Present Characters panel
Fixed issues when AI generates multiple character variants (e.g.,
storyteller mode with 'Dottore (Prime)', 'Dottore (Beta)', etc.):

1. Escape quotes in character names to prevent HTML attribute breakage
   - Added escapeHtmlAttr() helper function
   - Prevents names like 'Marianna "Mari"' from breaking HTML

2. Restore avatar lookup for character variants
   - namesMatch() now strips parentheses and quotes from both sides
   - Allows 'Dottore (Prime)' to find 'Dottore' character card avatar
   - Each variant still gets its own card with separate attributes

3. Multiple characters now display correctly in panel
   - Each variant creates its own character object
   - Attributes (Details, Relationship, Stats, Thoughts) don't mix
   - All characters appear in the panel, not just the last one
2025-11-13 16:18:35 +01:00
Spicy Marinara 172c8d6ab8 Merge pull request #45 from joenunezb/fix/render-chat-message-properly
fix: Render chat messages using updateMessageBlock
2025-11-13 13:26:13 +01:00
joenunezb c23c68fbc3 fix: Render chat messages using updateMessageBlock 2025-11-13 03:43:41 -08:00
Spicy_Marinara d4fc3ce1d8 Add 'Always Show Thought Bubble' setting - keeps thought bubble permanently expanded 2025-11-06 22:20:35 +01:00
Spicy Marinara 227eb4c31e Merge pull request #43 from SpicyMarinara/revert-36-feat/v2-widget-dashboard-system
Revert "feat: v2 widget dashboard system"
2025-11-06 20:06:40 +01:00
Spicy Marinara fd9adce068 Revert "feat: v2 widget dashboard system" 2025-11-06 20:06:26 +01:00
Spicy Marinara ba45e499e1 Merge pull request #42 from SpicyMarinara/revert-40-feat/responsive-dashboard-layout
Revert "feat: responsive dashboard layout"
2025-11-06 20:05:52 +01:00
Spicy Marinara 71727c0a50 Revert "feat: responsive dashboard layout" 2025-11-06 20:05:33 +01:00
Spicy Marinara a8d5a88438 Merge pull request #40 from paperboygold/feat/responsive-dashboard-layout
feat: responsive dashboard layout
2025-11-06 14:27:37 +01:00
Paperboy 705396a426 Merge branch 'main' into feat/responsive-dashboard-layout 2025-11-07 00:26:23 +11:00
Lucas 'Paperboy' Rose-Winters f8bad60ec1 refactor: display Refresh and Settings buttons on same line
- Move Refresh RPG Info button into rpg-settings-buttons-row
- Add rpg-btn-half class to both buttons for equal width distribution
- Conserves vertical space in the hamburger menu
- Buttons now display side-by-side with flex layout
2025-11-07 00:18:52 +11:00
Lucas 'Paperboy' Rose-Winters 206fe8a98c refactor: simplify Tracker Settings button tooltip
Shorten title from 'Tracker Settings - Customize fields, names, and AI instructions'
to just 'Tracker Settings' for cleaner UI.
2025-11-07 00:16:35 +11:00
Lucas 'Paperboy' Rose-Winters 8981a841fb fix: add missing styling for RPG attribute inputs
- Add .rpg-attr-name styling to match .rpg-stat-name
- Use SmartTheme colors instead of default white background
- Add focus state with highlight border
- Include .rpg-attr-toggle and .rpg-attr-remove in selectors

Fixes white background on RPG attribute text inputs (STR, DEX, etc.)
in the Tracker Editor modal.
2025-11-07 00:15:16 +11:00
Lucas 'Paperboy' Rose-Winters 643acb8142 fix: preserve Skills section in parser and improve button visibility
- Fix stripBrackets() removing Skills section header
  - Add structural header whitelist (Skills, Status, Inventory, etc.)
  - Implement smart look-ahead to detect content below labels
  - Previous logic incorrectly removed 'Skills:' when followed by category labels
- Add proper theming to category action buttons (.rpg-category-action)
  - Match styling of view toggle buttons
  - Use SmartTheme colors for better visibility
- Fix RPG attributes styling in Tracker Editor
  - Change background from --rpg-accent to --SmartThemeBlurTintColor
  - Update border to match other themed inputs

Resolves issue where skills with categories were all showing as 'Uncategorized'
due to the Skills section being truncated during parsing.
2025-11-07 00:13:34 +11:00
Lucas 'Paperboy' Rose-Winters 9f3ee18e4e debug: add code block extraction logging
Add detailed logging to trace Skills section through code block extraction.

New logs in parseResponse:
- Log each code block's content length
- Check if code block contains 'Skills:'
- If yes, show 200 chars of text around Skills section
- This runs BEFORE the content is categorized as userStats/infoBox/etc

This will show us:
1. Is Skills section in the extracted code block?
2. At what point does it get truncated?
3. Is it a code block extraction issue or later processing?

Related: Skills categorization debugging
2025-11-06 23:02:11 +11:00
Lucas 'Paperboy' Rose-Winters 53870857ef debug: add detailed logging to extractSkills function
Add verbose debug logging to trace why Skills section extraction is failing.

Logs added:
- Whether statsText is provided
- Text length and if it contains 'Skills:'
- Whether main regex matched
- If 'On Person:' exists (lookahead target)
- 200 chars of text around Skills section
- Whether simple format fallback matched
- Captured text length when successful

This will help diagnose why parser logs show 'Skills extraction failed'
even when Skills section clearly exists in the text.

Related: Skills categorization issue investigation
2025-11-06 22:57:59 +11:00
Lucas 'Paperboy' Rose-Winters cf993b2eaa debug: add comprehensive logging to skills parser
Add detailed console logging to trace how skills are being parsed and
categorized. This will help diagnose why skills are ending up in
"Uncategorized" instead of their proper categories.

Debug logs added:
- Log all lines extracted from skills section
- Log when category headers are detected
- Log when category arrays are created
- Log when skills are added to categories vs uncategorized
- Log ERROR when skill can't be added due to missing category array
- Log final skills data structure with category counts

Fallback behavior:
- If skill can't be added to its category (category array doesn't exist),
  fall back to uncategorized with ERROR log

To see logs:
- Enable Debug Mode in RPG Companion settings
- Check browser console during AI response parsing
- Look for "[RPG Parser]" prefix

Related: Skills categorization issue investigation
2025-11-06 22:52:02 +11:00
Lucas 'Paperboy' Rose-Winters fe5abb47ba fix: make skills parser handle text-based proficiency levels
Parser was only matching numeric levels "(Lv 5)" but AI was returning
text proficiencies like "(Proficient)", "(Advanced)", causing all skills
to be ignored and not categorized.

Changes to parser.js:
- Add fallback regex to match text proficiency format: "- Skill (Proficient)"
- Map text proficiencies to numeric levels:
  - Initiated/Novice → Lv 1
  - Basic/Beginner → Lv 2
  - Intermediate → Lv 4
  - Proficient → Lv 5
  - Competent → Lv 6
  - Advanced → Lv 7
  - Expert → Lv 8
  - Mastered/Master → Lv 9
  - Grandmaster/Legendary → Lv 10
- Default to Lv 5 for unrecognized proficiency text
- Try numeric format first, fall back to text format

Changes to promptBuilder.js:
- Make prompt instructions more explicit about numeric format
- Add negative examples: "write 'Lv 5' not 'Proficient'"
- Add guidance: "1=novice, 5=intermediate, 10=expert"
- Emphasize with "IMPORTANT:" prefix

Benefits:
- Parser now handles both formats (backward compatible)
- AI has clearer instructions to use numeric levels
- Skills with text proficiencies now parse correctly and show in categories
- Existing numeric format continues to work

Issue Resolution:
- Skills like "Demonic Qi Manipulation (Proficient)" now parse as Lv 5
- Categories like "Demonic Arts:", "Combat:", "Social:" now populate correctly
- Widget displays skills organized by category instead of ignoring them

Related: Skills widget, AI tracker integration
2025-11-06 22:48:38 +11:00
Lucas 'Paperboy' Rose-Winters 4dd71c95c7 refactor: remove redundant Edit Trackers button from hamburger menu
Remove duplicate "Edit Trackers" button from hamburger menu since there's
already a Tracker Settings button in the dashboard header.

Changes:
- Removed "Edit Trackers" button from template.html hamburger menu
- Updated Settings button to full width (removed .rpg-btn-half class)
- Changed dashboard button ID from 'rpg-dashboard-tracker-settings' to
  'rpg-open-tracker-editor' to become the canonical button
- Removed redundant event handler in dashboardIntegration.js that was
  clicking the old hamburger button

Benefits:
- Reduces UI clutter in hamburger menu
- Single source of truth for Tracker Settings button (dashboard header)
- Existing code in trackerEditor.js, infoBoxWidgets.js continues to work
  via jQuery event delegation on ID 'rpg-open-tracker-editor'

Technical Notes:
- jQuery delegation $(document).on('click', '#rpg-open-tracker-editor', ...)
  works for any element with that ID, not just a specific one
- No changes needed to trackerEditor.js or widget disabled state handlers
- Dashboard button is now the canonical "Edit Trackers" trigger

Related: Hamburger menu UI, dashboard header controls
2025-11-06 22:37:20 +11:00
Lucas 'Paperboy' Rose-Winters aa0dd55fb1 feat: add disabled state UI for Recent Events widget
Show helpful message when Recent Events tracking is disabled in tracker config.

Changes:
- Check if recentEvents is enabled in trackerConfig before rendering
- If disabled, show dimmed widget with overlay message:
  - Info icon + explanation text
  - "Enable in Tracker Settings" button
  - Button opens Tracker Settings and switches to Info Box tab

UX Improvements:
- Widget opacity reduced to 0.6 to indicate disabled state
- Message centered with clear visual hierarchy
- Button has hover/active states with elevation feedback
- Clicking button directly navigates to the right settings location

Technical Implementation:
- attachDisabledStateHandlers() opens Tracker Settings modal
- Auto-switches to Info Box tab after 100ms delay
- Graceful fallback if button not found (console warning)

CSS Additions:
- .rpg-widget-disabled: Dimmed overlay state
- .rpg-widget-disabled-message: Centered message container
- .rpg-widget-enable-btn: Styled action button with hover effects

Benefits:
- Users immediately understand why Recent Events isn't updating
- One-click access to fix the issue
- Clear visual feedback about widget state
- Pattern can be reused for other widgets (Skills, etc.)

Next Steps:
- Apply this pattern to other widgets that depend on tracker config
- Consider adding similar disabled states for Skills, Stats, etc.

Related: Recent Events widget implementation, tracker config system
2025-11-06 22:29:53 +11:00
Lucas 'Paperboy' Rose-Winters a9d98a3076 feat: implement Skills widget with level progression and categories
Add comprehensive Skills widget to dashboard system with category organization,
XP tracking, level progression, and multiple view modes.

Widget Features:
- Three sub-tabs: All Skills, By Category, Quick View
- Level-up and level-down buttons for manual progression
- XP progress bars with visual feedback
- Search and filter functionality
- Category collapse/expand in By Category view
- Editable skill names and categories
- Delete skills and categories
- Add new skills and categories
- Configurable max level and XP display

UI Improvements:
- Scrollable content area for large skill lists
- Responsive card layout
- Shortened tab labels for compact display ("All", "Quick" vs "All Skills", "Quick View")
- Proper flex layout for skill names (no longer truncated)
- Level badges and action buttons

Technical Implementation:
- Event handler deduplication to prevent exponential level-up bug
- Flag-based handler attachment: container.dataset.handlersAttached
- Nested flex containers for proper space distribution
- Scrollable views wrapper matching Inventory/Quests pattern

Dashboard Integration:
- Added Skills tab to defaultLayout.js (tab 5)
  - Icon: fa-solid fa-book (fixed invalid fa-book-sparkles)
  - Dimensions: 3x7 grid cells
  - Default config: All Skills tab, show XP, show categories
- Auto-arrange support in dashboardManager.js
  - Skills category group with priority order 6
  - Auto-creates Skills tab when skills widgets detected
- Widget registration in dashboardIntegration.js

Widget Files:
- src/systems/dashboard/widgets/userSkillsWidget.js (new)
  - Full widget implementation with all sub-tabs and features
  - State management with Map-based storage
  - Category-based and flat views
  - Search/filter/sort functionality

Styling:
- style.css: Added skills widget styles
  - Skill cards, headers, action buttons
  - Level-down button with accent color
  - XP progress bars
  - Category sections

Fixes from iteration:
1. Invalid FontAwesome icon (fa-book-sparkles → fa-book)
2. Tab labels too wide (shortened to single words)
3. Skill names truncated (fixed with proper flex structure)
4. Widget height incorrect (adjusted to h:7)
5. Level-up exponential bug (duplicate handlers, added flag guard)
6. No level-down button (added with minimum level 1)
7. No scrollbar on long lists (added .rpg-skills-views wrapper)

Category: skills
Integration: Fully integrated with dashboard v2.0 system
Tested: Layout, interactions, scrolling, level progression

Refs: AI tracker integration (separate commit)
2025-11-06 22:08:48 +11:00
Lucas 'Paperboy' Rose-Winters 0f96c62c62 feat: add structured skills parsing with categories and levels
Add AI tracker awareness for skills system with proper level and category support.

Changes:
- Add extractSkills() parser function to extract structured skills data
  - Parses category-based format: "CategoryName:\n- SkillName (Lv X)"
  - Falls back to legacy string format for backward compatibility
  - Returns structured data: { version: 1, categories: {}, uncategorized: [] }

- Update prompt instructions to request structured skills format
  - AI now generates: "Skills:\nCombat:\n- Swordsmanship (Lv 5)"
  - Supports multiple categories (Combat, Magic, Social, Crafting, etc.)
  - Includes Uncategorized section for skills without clear category

- Add buildSkillsSummary() utility function
  - Converts structured skills data back to formatted text
  - Ready for future feature: syncing manual skill edits to AI context

Parser integration:
- parseUserStats() now uses extractSkills() to parse Skills section
- Stores structured data in extensionSettings.userStats.skills
- Widget reads structured data for display and level-up/down functionality

AI workflow:
1. AI generates skills in structured format (via prompt instructions)
2. Parser extracts to structured data (via extractSkills)
3. Widget displays with level controls (already implemented)
4. Raw text flows through committedTrackerData to next generation

Note: Manual skill edits (level-up/down in widget) are not yet synced back
to AI context. This requires additional work to regenerate the raw text
when skills are manually modified. buildSkillsSummary is ready for this.

Refs: Skills widget implementation (previous session)
2025-11-06 22:06:22 +11:00
Lucas 'Paperboy' Rose-Winters 0a5bad6b1c refactor: remove unused settings button from edit mode widgets
The green settings icon that appeared on widget hover during edit mode
was not connected to any functionality. Removed to simplify UI.

- Delete button (red X) remains functional
- Edit mode drag/drop and resize unaffected
2025-11-06 21:27:58 +11:00
Spicy_Marinara ad4b4feee5 Fix: Add missing CSS for RPG Attributes and Relationship Status delete buttons 2025-11-06 11:13:25 +01:00
Lucas 'Paperboy' Rose-Winters 6c99b31d48 refactor: use resetLayout() for first-run initialization
Refactored loadLayout() to call resetLayout() for first-run users instead of
duplicating setup logic inline. This provides a single source of truth for
"set to default layout" behavior.

Previous Approach (Problems):
- loadLayout() had ~40 lines of inline first-run setup
- Different behavior: used autoLayout (repositions widgets)
- Less comprehensive: no state reset, different persistence method
- Code duplication between loadLayout() and resetLayout()
- Error handler also duplicated applyDashboardConfig() logic
- Emergency fallback tab creation needed after load

New Approach (Benefits):
- loadLayout() is now a simple router: saved layout vs. reset
- Consistent behavior: first-run and manual reset use same code path
- More comprehensive: fresh layout generation, state reset, validation
- Better error recovery: always uses resetLayout() for clean state
- Single source of truth for default layout initialization
- ~40 lines removed, cleaner code

Changes:
1. Removed inline applyDashboardConfig(defaultLayout) for first run
2. Removed manual autoLayout() loop (lines 1489-1494)
3. Removed manual saveLayout() call (line 1497)
4. Removed error handler's inline applyDashboardConfig()
5. Removed emergency fallback tab creation (lines 1506-1520)
6. Added resetLayout() call for first run (line 1494)
7. Added resetLayout() call for error recovery (line 1500)

Result:
- First-run users get comprehensive setup via resetLayout()
- Preserves default positions (doesn't reposition with autoLayout)
- Consistent layout behavior across first-run and manual reset
- Better maintainability (single code path for default setup)
- Proven reliability (resetLayout already works in production)
2025-11-06 21:11:36 +11:00