diff --git a/src/systems/interaction/inventoryActions.js b/src/systems/interaction/inventoryActions.js index 74eaf09..9784c3b 100644 --- a/src/systems/interaction/inventoryActions.js +++ b/src/systems/interaction/inventoryActions.js @@ -3,7 +3,7 @@ * Handles all user interactions with the inventory v2 system */ -import { extensionSettings, lastGeneratedData } from '../../core/state.js'; +import { extensionSettings, lastGeneratedData, committedTrackerData } from '../../core/state.js'; import { saveSettings, saveChatData, updateMessageSwipeData } from '../../core/persistence.js'; import { buildInventorySummary } from '../generation/promptBuilder.js'; import { renderInventory } from '../rendering/inventory.js'; @@ -37,15 +37,16 @@ let openForms = { }; /** - * Updates lastGeneratedData.userStats to include current inventory in text format. - * This ensures the AI context stays synced with manual edits. + * Updates lastGeneratedData.userStats AND committedTrackerData.userStats to include + * current inventory in text format. + * This ensures manual edits are immediately visible to AI in next generation. */ function updateLastGeneratedDataInventory() { const stats = extensionSettings.userStats; const inventorySummary = buildInventorySummary(stats.inventory); - // Rebuild the lastGeneratedData.userStats text format - lastGeneratedData.userStats = + // Rebuild the userStats text format + const statsText = `Health: ${stats.health}%\n` + `Satiety: ${stats.satiety}%\n` + `Energy: ${stats.energy}%\n` + @@ -53,6 +54,11 @@ function updateLastGeneratedDataInventory() { `Arousal: ${stats.arousal}%\n` + `${stats.mood}: ${stats.conditions}\n` + `${inventorySummary}`; + + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI + lastGeneratedData.userStats = statsText; + committedTrackerData.userStats = statsText; } /** diff --git a/src/systems/rendering/infoBox.js b/src/systems/rendering/infoBox.js index 281f388..e73ce45 100644 --- a/src/systems/rendering/infoBox.js +++ b/src/systems/rendering/infoBox.js @@ -7,6 +7,7 @@ import { getContext } from '../../../../../../extensions.js'; import { extensionSettings, lastGeneratedData, + committedTrackerData, $infoBoxContainer } from '../../core/state.js'; import { saveChatData } from '../../core/persistence.js'; @@ -429,6 +430,10 @@ export function updateInfoBoxField(field, value) { lastGeneratedData.infoBox = updatedLines.join('\n'); + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI + committedTrackerData.infoBox = updatedLines.join('\n'); + // Update the message's swipe data const chat = getContext().chat; if (chat && chat.length > 0) { diff --git a/src/systems/rendering/thoughts.js b/src/systems/rendering/thoughts.js index 03d9eb4..1ef272c 100644 --- a/src/systems/rendering/thoughts.js +++ b/src/systems/rendering/thoughts.js @@ -9,6 +9,7 @@ import { selected_group, getGroupMembers } from '../../../../../../group-chats.j import { extensionSettings, lastGeneratedData, + committedTrackerData, $thoughtsContainer, FALLBACK_AVATAR_DATA_URI } from '../../core/state.js'; @@ -320,6 +321,10 @@ export function updateCharacterField(characterName, field, value) { lastGeneratedData.characterThoughts = updatedLines.join('\n'); // console.log('[RPG Companion] 💾 Updated lastGeneratedData.characterThoughts:', lastGeneratedData.characterThoughts); + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI + committedTrackerData.characterThoughts = updatedLines.join('\n'); + // Also update the last assistant message's swipe data const chat = getContext().chat; if (chat && chat.length > 0) { diff --git a/src/systems/rendering/userStats.js b/src/systems/rendering/userStats.js index bdede29..d84e8e0 100644 --- a/src/systems/rendering/userStats.js +++ b/src/systems/rendering/userStats.js @@ -8,6 +8,7 @@ import { user_avatar } from '../../../../../../../script.js'; import { extensionSettings, lastGeneratedData, + committedTrackerData, $userStatsContainer, FALLBACK_AVATAR_DATA_URI } from '../../core/state.js'; @@ -17,6 +18,7 @@ import { updateMessageSwipeData } from '../../core/persistence.js'; import { getSafeThumbnailUrl } from '../../utils/avatars.js'; +import { buildInventorySummary } from '../generation/promptBuilder.js'; /** * Renders the user stats panel with health bars, mood, inventory, and classic stats. @@ -178,13 +180,15 @@ export function renderUserStats() { // Update the setting extensionSettings.userStats[field] = value; - // Also update lastGeneratedData to keep it in sync - if (!lastGeneratedData.userStats) { - lastGeneratedData.userStats = ''; - } - // Regenerate the userStats text with updated value - const statsText = `Health: ${extensionSettings.userStats.health}%\nSatiety: ${extensionSettings.userStats.satiety}%\nEnergy: ${extensionSettings.userStats.energy}%\nHygiene: ${extensionSettings.userStats.hygiene}%\nArousal: ${extensionSettings.userStats.arousal}%\n${extensionSettings.userStats.mood}: ${extensionSettings.userStats.conditions}\nInventory: ${extensionSettings.userStats.inventory}`; + // Rebuild userStats text with proper inventory format + const stats = extensionSettings.userStats; + const inventorySummary = buildInventorySummary(stats.inventory); + const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI lastGeneratedData.userStats = statsText; + committedTrackerData.userStats = statsText; saveSettings(); saveChatData(); @@ -199,9 +203,15 @@ export function renderUserStats() { const value = $(this).text().trim(); extensionSettings.userStats.mood = value || '😐'; - // Update lastGeneratedData - const statsText = `Health: ${extensionSettings.userStats.health}%\nSatiety: ${extensionSettings.userStats.satiety}%\nEnergy: ${extensionSettings.userStats.energy}%\nHygiene: ${extensionSettings.userStats.hygiene}%\nArousal: ${extensionSettings.userStats.arousal}%\n${extensionSettings.userStats.mood}: ${extensionSettings.userStats.conditions}\nInventory: ${extensionSettings.userStats.inventory}`; + // Rebuild userStats text with proper inventory format + const stats = extensionSettings.userStats; + const inventorySummary = buildInventorySummary(stats.inventory); + const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI lastGeneratedData.userStats = statsText; + committedTrackerData.userStats = statsText; saveSettings(); saveChatData(); @@ -212,9 +222,15 @@ export function renderUserStats() { const value = $(this).text().trim(); extensionSettings.userStats.conditions = value || 'None'; - // Update lastGeneratedData - const statsText = `Health: ${extensionSettings.userStats.health}%\nSatiety: ${extensionSettings.userStats.satiety}%\nEnergy: ${extensionSettings.userStats.energy}%\nHygiene: ${extensionSettings.userStats.hygiene}%\nArousal: ${extensionSettings.userStats.arousal}%\n${extensionSettings.userStats.mood}: ${extensionSettings.userStats.conditions}\nInventory: ${extensionSettings.userStats.inventory}`; + // Rebuild userStats text with proper inventory format + const stats = extensionSettings.userStats; + const inventorySummary = buildInventorySummary(stats.inventory); + const statsText = `Health: ${stats.health}%\nSatiety: ${stats.satiety}%\nEnergy: ${stats.energy}%\nHygiene: ${stats.hygiene}%\nArousal: ${stats.arousal}%\n${stats.mood}: ${stats.conditions}\n${inventorySummary}`; + + // Update BOTH lastGeneratedData AND committedTrackerData + // This makes manual edits immediately visible to AI lastGeneratedData.userStats = statsText; + committedTrackerData.userStats = statsText; saveSettings(); saveChatData();