- Update FoundryAdapter to properly detect and expose WebRTC stream access
- Modify ScryingPoolStrip to create video elements with WebRTC streams
- Add video container to roster-strip.hbs template with conditional rendering
- Add CSS to hide Foundry's AV dock (#av and .camera-view)
- Add CSS styling for video containers and elements
- Fix unused variable in FoundryAdapter.buildWebRTCSurface
- Add comprehensive test script for stream access implementation
Architecture: Full replacement mode where module hides Foundry's AV dock
and creates its own video elements using game.webrtc.client.getMediaStreamForUser()
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Remove unused StripOverlayLayer import and stripOverlayLayer variable from module.js
- Add comprehensive JSDoc annotations to FoundryAdapter.js methods (settings, socket, users, scenes, notifications, hooks)
- Add /* global Dialog */ comment to PlayerPrivacyPanel.js for ESLint
- Remove unused _force parameter from GMPlayerPrivacySelector.js render() method
- Fix PlayerPrivacyPanelMenu.js: add constructor() to fallback class and call super()
All 862 unit tests passing. All Story 4.2 acceptance criteria met.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Modified GMPlayerPrivacySelectorMenu to extend ApplicationV2 (or fallback class)
to be compatible with FoundryVTT's registerMenu API.
FoundryVTT requires that menu types passed to registerMenu() must be a
FormApplication or ApplicationV2 instance or subclass.
Changes:
- Added conditional _AppBase class (ApplicationV2 or fallback for tests)
- Extended GMPlayerPrivacySelectorMenu from _AppBase
- Added DEFAULT_OPTIONS static property for ApplicationV2 compatibility
- Added super(options) call in constructor
This fixes: Error: You must provide a menu type that is a FormApplication or ApplicationV2 instance or subclass
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Added missing registerMenu method to the settings surface of FoundryAdapter
to support GM Player Privacy Selector menu registration.
This fixes the error: TypeError: _adapter.settings.registerMenu is not a function
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Changed selector from '.scrying-pool__roster-strip' to '.scrying-pool-strip'
to match the actual CSS class defined in ScryingPoolStrip.defaultOptions.
This was the root cause of the warning: 'StripOverlayLayer: ScryingPoolStrip not found'
The class name in ScryingPoolStrip is 'scrying-pool-strip' (set in defaultOptions),
not 'scrying-pool__roster-strip'.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Resolved the 'ScryingPoolStrip not found, appending to body' warning by
restructuring the initialization flow:
1. ScryingPoolStrip now creates its own StripOverlayLayer lazily via getter
2. ScryingPoolStrip.stripOverlayLayer returns the layer instance
3. ConfirmationBar accepts ScryingPoolStrip/RoleRenderer and extracts stripOverlayLayer
4. RoleRenderer exposes public .strip getter for ScryingPoolStrip access
5. All components only initialized for GM users (where ScryingPoolStrip exists)
This ensures:
- StripOverlayLayer is created AFTER ScryingPoolStrip DOM element exists
- ConfirmationBar renders correctly positioned within the strip
- No fallback to document.body needed
- Proper separation of concerns (strip owns its overlay layer)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
Moved StripOverlayLayer and ConfirmationBar initialization to occur AFTER
ScryingPoolStrip is created (via roleRenderer.openStrip()). This fixes the
console warning: 'StripOverlayLayer: ScryingPoolStrip not found, appending to body'
The issue was that StripOverlayLayer.init() was trying to find
.scrying-pool__roster-strip before it was created. ScryingPoolStrip is
created lazily when roleRenderer.openStrip() is called.
Additionally, made both components GM-only since:
- ConfirmationBar is in src/ui/gm/ and is only useful for GMs
- StripOverlayLayer is currently only used by ConfirmationBar
- ScryingPoolStrip is only created for GMs
This ensures proper positioning of ConfirmationBar relative to ScryingPoolStrip.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Created comprehensive story file with 8 acceptance criteria from FR-23, FR-24, FR-25
- Documented PlayerPrivacyManager core logic with DI pattern
- Designed PlayerPrivacyPanel UI component extending ApplicationV2
- Added FoundryAdapter user flag access methods specification
- Integrated Reaction Cam badge into Director's Board design
- Defined all localization strings
- Mapped file structure (new and modified files)
- Specified testing requirements (12-15 new tests)
- Updated sprint-status.yaml: 4-1 from backlog to ready-for-dev, epic-4 to in-progress
- Resolved OQ-GDPR: using user flags for v1.0
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Updated epic-3 status from in-progress to done
- All stories in Epic 3 are now done:
- 3-1-save-and-load-scene-presets: done
- 3-2-scene-auto-apply-and-confirmationbar: done
- 3-3-preset-import-and-export: done
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Updated sprint-status.yaml: 3-1-save-and-load-scene-presets → done
- Updated Story 3.1 file header: Status → done
- Updated last_updated timestamp
Note: Story 3.1 (Save & Load Scene Presets) was implemented as part of
commit a1e8886 (Story 3.2 done) which created ScenePresetManager,
PresetSaveDialog, PresetLoadDialog, and related tests.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Created comprehensive story file for Scene Auto-Apply & ConfirmationBar
- Added detailed acceptance criteria covering FR-17 and FR-18
- Included exhaustive developer context with previous story intelligence
- Specified architecture compliance, file structure, and testing requirements
- Updated sprint-status.yaml to mark 3-2 as ready-for-dev
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- Delete src/ui/shared/ParticipantCard.js (duplicate of boardUtils.js with conflicting implementations)
- Delete tests/unit/ui/shared/ParticipantCard.test.js (tests for deleted file)
- Add directorsBoard to global declarations in ScryingPoolStrip.js to fix lint errors
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>