From 93c37c25d7e5cd397d771c638c0360bfe136a5b2 Mon Sep 17 00:00:00 2001 From: jakstein <180436403+jakstein@users.noreply.github.com> Date: Wed, 14 Jan 2026 18:44:54 +0100 Subject: [PATCH 1/6] initial omniscience filter --- index.js | 13 ++++++++++ src/core/state.js | 3 +++ src/i18n/en.json | 6 +++++ src/systems/generation/injector.js | 28 ++++++++++++++++++++++ src/systems/generation/promptBuilder.js | 21 ++++++++++++++++ src/systems/ui/promptsEditor.js | 11 ++++++++- src/systems/ui/theme.js | 3 +++ template.html | 32 +++++++++++++++++++++++++ 8 files changed, 116 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 18076b9..7eb82d5 100644 --- a/index.js +++ b/index.js @@ -384,6 +384,11 @@ async function initUI() { saveSettings(); }); + $('#rpg-toggle-omniscience').on('change', function() { + extensionSettings.enableOmniscienceFilter = $(this).prop('checked'); + saveSettings(); + }); + $('#rpg-toggle-cyoa').on('change', function() { extensionSettings.enableCYOA = $(this).prop('checked'); saveSettings(); @@ -572,6 +577,12 @@ async function initUI() { updateFeatureTogglesVisibility(); }); + $('#rpg-toggle-show-omniscience-toggle').on('change', function() { + extensionSettings.showOmniscienceToggle = $(this).prop('checked'); + saveSettings(); + updateFeatureTogglesVisibility(); + }); + $('#rpg-toggle-show-cyoa-toggle').on('change', function() { extensionSettings.showCYOAToggle = $(this).prop('checked'); saveSettings(); @@ -969,6 +980,7 @@ async function initUI() { $('#rpg-toggle-html-prompt').prop('checked', extensionSettings.enableHtmlPrompt); $('#rpg-toggle-dialogue-coloring').prop('checked', extensionSettings.enableDialogueColoring); $('#rpg-toggle-deception').prop('checked', extensionSettings.enableDeceptionSystem ?? false); + $('#rpg-toggle-omniscience').prop('checked', extensionSettings.enableOmniscienceFilter ?? false); $('#rpg-toggle-cyoa').prop('checked', extensionSettings.enableCYOA ?? false); $('#rpg-toggle-spotify-music').prop('checked', extensionSettings.enableSpotifyMusic); @@ -979,6 +991,7 @@ async function initUI() { $('#rpg-toggle-show-html-toggle').prop('checked', extensionSettings.showHtmlToggle ?? true); $('#rpg-toggle-show-dialogue-coloring-toggle').prop('checked', extensionSettings.showDialogueColoringToggle ?? true); $('#rpg-toggle-show-deception-toggle').prop('checked', extensionSettings.showDeceptionToggle ?? true); + $('#rpg-toggle-show-omniscience-toggle').prop('checked', extensionSettings.showOmniscienceToggle ?? true); $('#rpg-toggle-show-cyoa-toggle').prop('checked', extensionSettings.showCYOAToggle ?? true); $('#rpg-toggle-show-spotify-toggle').prop('checked', extensionSettings.showSpotifyToggle ?? true); $('#rpg-toggle-show-dynamic-weather-toggle').prop('checked', extensionSettings.showDynamicWeatherToggle ?? true); diff --git a/src/core/state.js b/src/core/state.js index acc3b13..90778df 100644 --- a/src/core/state.js +++ b/src/core/state.js @@ -29,6 +29,8 @@ export let extensionSettings = { customDialogueColoringPrompt: '', // Custom dialogue coloring prompt text (empty = use default) enableDeceptionSystem: false, // Enable deception tracking with tags customDeceptionPrompt: '', // Custom deception prompt text (empty = use default) + enableOmniscienceFilter: false, // Enable omniscience filter with tags + customOmnisciencePrompt: '', // Custom omniscience filter prompt text (empty = use default) enableCYOA: false, // Enable "Choose Your Own Adventure" formatting with action choices customCYOAPrompt: '', // Custom CYOA prompt text (empty = use default) enableSpotifyMusic: false, // Enable Spotify music integration (asks AI for Spotify URLs) @@ -41,6 +43,7 @@ export let extensionSettings = { showHtmlToggle: true, // Show Immersive HTML toggle in main panel showDialogueColoringToggle: true, // Show Dialogue Coloring toggle in main panel (enabled by default) showDeceptionToggle: true, // Show Deception System toggle in main panel + showOmniscienceToggle: true, // Show Omniscience Filter toggle in main panel showCYOAToggle: true, // Show CYOA toggle in main panel showSpotifyToggle: true, // Show Spotify Music toggle in main panel diff --git a/src/i18n/en.json b/src/i18n/en.json index ef78a33..4f16aa3 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -52,6 +52,10 @@ "template.settingsModal.display.showImmersiveHtmlToggleNote": "Display a toggle button to enable/disable HTML formatting in messages.", "template.settingsModal.display.showDialogueColoringToggle": "Show Colored Dialogues", "template.settingsModal.display.showDialogueColoringToggleNote": "Display a toggle button to enable/disable colored dialogue formatting.", + "template.settingsModal.display.showDeceptionToggle": "Show Deception System", + "template.settingsModal.display.showDeceptionToggleNote": "Display a toggle button to enable/disable the Deception System for marking lies and deceptions.", + "template.settingsModal.display.showOmniscienceToggle": "Show Omniscience Filter", + "template.settingsModal.display.showOmniscienceToggleNote": "Display a toggle button to enable/disable the Omniscience Filter for filtering hidden events.", "template.settingsModal.display.showSpotifyMusicToggle": "Show Spotify Music", "template.settingsModal.display.showSpotifyMusicToggleNote": "Display Spotify music player with AI-suggested scene-appropriate tracks.", "template.settingsModal.display.showSnowflakesToggle": "Show Snowflakes Effect", @@ -162,6 +166,8 @@ "template.mainPanel.clearLastRoll": "Clear last roll", "template.mainPanel.immersiveHtml": "Immersive HTML", "template.mainPanel.coloredDialogues": "Colored Dialogues", + "template.mainPanel.deceptionSystem": "Deception System", + "template.mainPanel.omniscienceFilter": "Omniscience Filter", "template.mainPanel.spotifyMusic": "Spotify Music", "template.mainPanel.snowflakesEffect": "Snowflakes Effect", "template.mainPanel.dynamicWeatherEffects": "Dynamic Weather", diff --git a/src/systems/generation/injector.js b/src/systems/generation/injector.js index bf7471a..2318438 100644 --- a/src/systems/generation/injector.js +++ b/src/systems/generation/injector.js @@ -22,6 +22,7 @@ import { DEFAULT_HTML_PROMPT, DEFAULT_DIALOGUE_COLORING_PROMPT, DEFAULT_DECEPTION_PROMPT, + DEFAULT_OMNISCIENCE_FILTER_PROMPT, DEFAULT_CYOA_PROMPT, DEFAULT_SPOTIFY_PROMPT, SPOTIFY_FORMAT_INSTRUCTION @@ -792,6 +793,19 @@ export async function onGenerationStarted(type, data, dryRun) { setExtensionPrompt('rpg-companion-deception', '', extension_prompt_types.IN_CHAT, 0, false); } + // Inject Omniscience Filter prompt separately at depth 0 if enabled + if (extensionSettings.enableOmniscienceFilter && !shouldSuppress) { + // Use custom Omniscience Filter prompt if set, otherwise use default + const omnisciencePromptText = extensionSettings.customOmnisciencePrompt || DEFAULT_OMNISCIENCE_FILTER_PROMPT; + const omnisciencePrompt = `\n${omnisciencePromptText}\n`; + + setExtensionPrompt('rpg-companion-omniscience', omnisciencePrompt, extension_prompt_types.IN_CHAT, 0, false); + // console.log('[RPG Companion] Injected Omniscience Filter prompt at depth 0 for together mode'); + } else { + // Clear Omniscience Filter prompt if disabled + setExtensionPrompt('rpg-companion-omniscience', '', extension_prompt_types.IN_CHAT, 0, false); + } + // Inject Spotify prompt separately at depth 0 if enabled if (extensionSettings.enableSpotifyMusic && !shouldSuppress) { // Use custom Spotify prompt if set, otherwise use default @@ -880,6 +894,19 @@ Ensure these details naturally reflect and influence the narrative. Character be setExtensionPrompt('rpg-companion-deception', '', extension_prompt_types.IN_CHAT, 0, false); } + // Inject Omniscience Filter prompt separately at depth 0 if enabled + if (extensionSettings.enableOmniscienceFilter && !shouldSuppress) { + // Use custom Omniscience Filter prompt if set, otherwise use default + const omnisciencePromptText = extensionSettings.customOmnisciencePrompt || DEFAULT_OMNISCIENCE_FILTER_PROMPT; + const omnisciencePrompt = `\n${omnisciencePromptText}\n`; + + setExtensionPrompt('rpg-companion-omniscience', omnisciencePrompt, extension_prompt_types.IN_CHAT, 0, false); + // console.log('[RPG Companion] Injected Omniscience Filter prompt at depth 0 for separate/external mode'); + } else { + // Clear Omniscience Filter prompt if disabled + setExtensionPrompt('rpg-companion-omniscience', '', extension_prompt_types.IN_CHAT, 0, false); + } + // Inject Spotify prompt separately at depth 0 if enabled if (extensionSettings.enableSpotifyMusic && !shouldSuppress) { // Use custom Spotify prompt if set, otherwise use default @@ -917,6 +944,7 @@ Ensure these details naturally reflect and influence the narrative. Character be setExtensionPrompt('rpg-companion-html', '', extension_prompt_types.IN_CHAT, 0, false); setExtensionPrompt('rpg-companion-dialogue-coloring', '', extension_prompt_types.IN_CHAT, 0, false); setExtensionPrompt('rpg-companion-deception', '', extension_prompt_types.IN_CHAT, 0, false); + setExtensionPrompt('rpg-companion-omniscience', '', extension_prompt_types.IN_CHAT, 0, false); setExtensionPrompt('rpg-companion-zzz-cyoa', '', extension_prompt_types.IN_CHAT, 0, false); setExtensionPrompt('rpg-companion-spotify', '', extension_prompt_types.IN_CHAT, 0, false); } diff --git a/src/systems/generation/promptBuilder.js b/src/systems/generation/promptBuilder.js index 8c7b69b..bb1d1c8 100644 --- a/src/systems/generation/promptBuilder.js +++ b/src/systems/generation/promptBuilder.js @@ -33,6 +33,27 @@ export const DEFAULT_DIALOGUE_COLORING_PROMPT = `Wrap all character/NPC "dialogu */ export const DEFAULT_DECEPTION_PROMPT = `When a character is lying or deceiving, you should follow up that line with the tag, containing a brief description of the truth and the lie's reason, using the template below (replace placeholders in quotation marks). This will be hidden from the user's view, but not to you, making it useful for future consequences: .`; +/** + * Default Omniscience Filter prompt text + * This instructs the AI to separate information the player character cannot perceive + */ +export const DEFAULT_OMNISCIENCE_FILTER_PROMPT = `OMNISCIENCE FILTER INSTRUCTIONS: +You must strictly separate what the player character can directly perceive from what they cannot. The player should only read narrative content that their character can actually see, hear, smell, touch, or otherwise directly sense. + +BEFORE writing any narrative content that involves events, actions, or details the player character CANNOT directly perceive (because they're not looking, too far away, behind them, in another room, happening silently, etc.), you MUST first output that hidden information inside a tag using this exact format: + + +CRITICAL RULES: +1. The tag must come BEFORE any sensory hints (sounds, smells, etc.) that the player DOES perceive from that event +2. Only write narrative that reflects what the player character actually experiences through their senses +3. Instead of "Jake sweeps the floor behind you", write: followed by narrative like "You hear soft sweeping sounds behind you" +4. NPCs' internal thoughts, silent actions, and events in other locations MUST go in tags +5. The player's narrative should create natural mystery and immersion - they experience the world through limited senses, not omniscient narration + +EXAMPLE: +Wrong: "As you read the newspaper, Sarah quietly pockets the key from the table behind you and slips out the back door." +Correct: You hear a faint click from somewhere behind you, but when you glance up from your newspaper, the room seems unchanged. The afternoon light streams through the windows as you return to your reading.`; + /** * Default CYOA prompt text */ diff --git a/src/systems/ui/promptsEditor.js b/src/systems/ui/promptsEditor.js index 45aadcc..86b02fa 100644 --- a/src/systems/ui/promptsEditor.js +++ b/src/systems/ui/promptsEditor.js @@ -4,7 +4,7 @@ */ import { extensionSettings } from '../../core/state.js'; import { saveSettings } from '../../core/persistence.js'; -import { DEFAULT_HTML_PROMPT, DEFAULT_DIALOGUE_COLORING_PROMPT, DEFAULT_DECEPTION_PROMPT, DEFAULT_CYOA_PROMPT, DEFAULT_SPOTIFY_PROMPT, DEFAULT_NARRATOR_PROMPT } from '../generation/promptBuilder.js'; +import { DEFAULT_HTML_PROMPT, DEFAULT_DIALOGUE_COLORING_PROMPT, DEFAULT_DECEPTION_PROMPT, DEFAULT_OMNISCIENCE_FILTER_PROMPT, DEFAULT_CYOA_PROMPT, DEFAULT_SPOTIFY_PROMPT, DEFAULT_NARRATOR_PROMPT } from '../generation/promptBuilder.js'; let $editorModal = null; let tempPrompts = null; // Temporary prompts for cancel functionality @@ -14,6 +14,7 @@ const DEFAULT_PROMPTS = { html: DEFAULT_HTML_PROMPT, dialogueColoring: DEFAULT_DIALOGUE_COLORING_PROMPT, deception: DEFAULT_DECEPTION_PROMPT, + omniscience: DEFAULT_OMNISCIENCE_FILTER_PROMPT, cyoa: DEFAULT_CYOA_PROMPT, spotify: DEFAULT_SPOTIFY_PROMPT, narrator: DEFAULT_NARRATOR_PROMPT, @@ -96,6 +97,7 @@ function openPromptsEditor() { html: extensionSettings.customHtmlPrompt || '', dialogueColoring: extensionSettings.customDialogueColoringPrompt || '', deception: extensionSettings.customDeceptionPrompt || '', + omniscience: extensionSettings.customOmnisciencePrompt || '', cyoa: extensionSettings.customCYOAPrompt || '', spotify: extensionSettings.customSpotifyPrompt || '', narrator: extensionSettings.customNarratorPrompt || '', @@ -111,6 +113,7 @@ function openPromptsEditor() { $('#rpg-prompt-html').val(extensionSettings.customHtmlPrompt || DEFAULT_PROMPTS.html); $('#rpg-prompt-dialogue-coloring').val(extensionSettings.customDialogueColoringPrompt || DEFAULT_PROMPTS.dialogueColoring); $('#rpg-prompt-deception').val(extensionSettings.customDeceptionPrompt || DEFAULT_PROMPTS.deception); + $('#rpg-prompt-omniscience').val(extensionSettings.customOmnisciencePrompt || DEFAULT_PROMPTS.omniscience); $('#rpg-prompt-cyoa').val(extensionSettings.customCYOAPrompt || DEFAULT_PROMPTS.cyoa); $('#rpg-prompt-spotify').val(extensionSettings.customSpotifyPrompt || DEFAULT_PROMPTS.spotify); $('#rpg-prompt-narrator').val(extensionSettings.customNarratorPrompt || DEFAULT_PROMPTS.narrator); @@ -150,6 +153,7 @@ function savePrompts() { extensionSettings.customHtmlPrompt = $('#rpg-prompt-html').val().trim(); extensionSettings.customDialogueColoringPrompt = $('#rpg-prompt-dialogue-coloring').val().trim(); extensionSettings.customDeceptionPrompt = $('#rpg-prompt-deception').val().trim(); + extensionSettings.customOmnisciencePrompt = $('#rpg-prompt-omniscience').val().trim(); extensionSettings.customCYOAPrompt = $('#rpg-prompt-cyoa').val().trim(); extensionSettings.customSpotifyPrompt = $('#rpg-prompt-spotify').val().trim(); extensionSettings.customNarratorPrompt = $('#rpg-prompt-narrator').val().trim(); @@ -182,6 +186,9 @@ function restorePromptToDefault(promptType) { case 'deception': extensionSettings.customDeceptionPrompt = ''; break; + case 'omniscience': + extensionSettings.customOmnisciencePrompt = ''; + break; case 'cyoa': extensionSettings.customCYOAPrompt = ''; break; @@ -221,6 +228,7 @@ function restoreAllToDefaults() { $('#rpg-prompt-html').val(DEFAULT_PROMPTS.html); $('#rpg-prompt-dialogue-coloring').val(DEFAULT_PROMPTS.dialogueColoring); $('#rpg-prompt-deception').val(DEFAULT_PROMPTS.deception); + $('#rpg-prompt-omniscience').val(DEFAULT_PROMPTS.omniscience); $('#rpg-prompt-cyoa').val(DEFAULT_PROMPTS.cyoa); $('#rpg-prompt-spotify').val(DEFAULT_PROMPTS.spotify); $('#rpg-prompt-narrator').val(DEFAULT_PROMPTS.narrator); @@ -235,6 +243,7 @@ function restoreAllToDefaults() { extensionSettings.customHtmlPrompt = ''; extensionSettings.customDialogueColoringPrompt = ''; extensionSettings.customDeceptionPrompt = ''; + extensionSettings.customOmnisciencePrompt = ''; extensionSettings.customCYOAPrompt = ''; extensionSettings.customSpotifyPrompt = ''; extensionSettings.customNarratorPrompt = ''; diff --git a/src/systems/ui/theme.js b/src/systems/ui/theme.js index 81d5366..a96001a 100644 --- a/src/systems/ui/theme.js +++ b/src/systems/ui/theme.js @@ -139,6 +139,7 @@ export function updateFeatureTogglesVisibility() { const $htmlToggle = $('#rpg-html-toggle-wrapper'); const $dialogueColoringToggle = $('#rpg-dialogue-coloring-toggle-wrapper'); const $deceptionToggle = $('#rpg-deception-toggle-wrapper'); + const $omniscienceToggle = $('#rpg-omniscience-toggle-wrapper'); const $cyoaToggle = $('#rpg-cyoa-toggle-wrapper'); const $spotifyToggle = $('#rpg-spotify-toggle-wrapper'); @@ -150,6 +151,7 @@ export function updateFeatureTogglesVisibility() { $htmlToggle.toggle(extensionSettings.showHtmlToggle); $dialogueColoringToggle.toggle(extensionSettings.showDialogueColoringToggle); $deceptionToggle.toggle(extensionSettings.showDeceptionToggle ?? true); + $omniscienceToggle.toggle(extensionSettings.showOmniscienceToggle ?? true); $cyoaToggle.toggle(extensionSettings.showCYOAToggle ?? true); $spotifyToggle.toggle(extensionSettings.showSpotifyToggle); @@ -161,6 +163,7 @@ export function updateFeatureTogglesVisibility() { const anyVisible = extensionSettings.showHtmlToggle || extensionSettings.showDialogueColoringToggle || (extensionSettings.showDeceptionToggle ?? true) || + (extensionSettings.showOmniscienceToggle ?? true) || (extensionSettings.showCYOAToggle ?? true) || extensionSettings.showSpotifyToggle || extensionSettings.showDynamicWeatherToggle || diff --git a/template.html b/template.html index a3b7499..55e5a63 100644 --- a/template.html +++ b/template.html @@ -139,6 +139,15 @@ + +
+ +
+
+ +
+ + + Injected when "Enable Omniscience Filter" is enabled. Instructs AI to separate information the player character cannot perceive into hidden filter tags. + + + +
+