Commit Graph

48 Commits

Author SHA1 Message Date
uberwald 69b3c8871b Release CI/CD3
CI / ci (push) Failing after 1m18s
2026-05-25 14:36:36 +02:00
uberwald c47b045c9d Release CI/CD3
CI / ci (push) Failing after 50s
2026-05-25 14:31:25 +02:00
uberwald 359e7336a4 Release CI/CD3
CI / ci (push) Failing after 8s
2026-05-25 14:28:28 +02:00
uberwald 0ff637ffe1 Add new resolution drop-down select
CI / ci (push) Failing after 7s
2026-05-25 13:55:20 +02:00
uberwald 7a0d935239 Story 5.2: Video Widget Width Customization
Implements configurable video widget widths for small and large dock layouts:
- Add widgetWidthSm and widgetWidthMd world settings (defaults: 83px, 150px)
- Add width dropdown selectors in Director's Board UI
- Apply width settings to participant avatars via CSS custom properties
- Update strip width/height calculations to use custom widths
- Add localization strings for widget width settings
- Add CSS styling for widget width dropdown controls
- Fix Handlebars template syntax for select element selected values

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-25 12:57:24 +02:00
uberwald 748c7d7f85 Story 3.3 done 2026-05-25 10:32:49 +02:00
uberwald 7b56d62563 Fianlize deck strip and management
CI / ci (push) Failing after 6s
2026-05-25 00:51:46 +02:00
uberwald 5dc9b3b8d4 Module cleanup and tests
CI / ci (push) Failing after 7s
2026-05-24 23:13:45 +02:00
uberwald 63d83e999a Update build path comment in scrying-pool.less
Changed comment to reflect new build output location.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:13:45 +02:00
uberwald 06cf740aa3 Fix: Move CSS to root styles/ folder for FoundryVTT compatibility
The issue: CSS was in dist/styles/ but FoundryVTT expects module CSS
at the root level or in a standard location.

Changes:
- Build CSS to styles/scrying-pool.css (root level) instead of dist/styles/
- Update module.json to reference styles/scrying-pool.css
- Update .gitignore to track styles/scrying-pool.css
- Update build script in package.json

This ensures FoundryVTT can find and load the CSS file properly in live sessions.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:12:44 +02:00
uberwald 940268573a Add postinstall script to auto-build CSS
- Added 'postinstall': 'npm run build' to package.json
- This ensures CSS is automatically rebuilt when dependencies are installed
- Provides better developer experience and ensures CSS is always up-to-date

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:08:55 +02:00
uberwald e4b69b6141 Update .gitignore to allow dist/styles/ for CSS distribution
- Changed .gitignore to ignore dist/ but allow dist/styles/
- This allows the compiled CSS to be tracked while still ignoring other build artifacts

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:07:27 +02:00
uberwald e7f094b469 Fix: Include built CSS in distribution
- Updated .gitignore to allow dist/styles/ folder
- Added dist/styles/scrying-pool.css to git tracking
- This ensures users get the compiled CSS when installing from source

Without this, the module would have NO STYLING AT ALL because:
1. dist/ was in .gitignore
2. Users need to run 'npm run build' manually (not standard practice)
3. FoundryVTT modules typically ship with compiled assets

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:07:18 +02:00
uberwald 9dc202053c Fix styling issues: dialog backgrounds, spacing tokens, and module category
- Added category 'Audio/Video' to module.json to fix 'Non répertorié' issue
- Created styles/tokens/_spacing.less with spacing tokens (xxs, xs, sm, md, lg, xl, 2xl)
- Added legacy aliases (--sp-space-xs, --sp-space-sm, --sp-space-m, etc.) for preset-import-export.less
- Added --sp-bg and --sp-surface-elevated tokens to _base.less
- Fixed _player-privacy-panel.less to use CSS custom properties instead of LESS variables
- Added background: var(--sp-surface) to all dialog root elements:
  - PlayerPrivacyPanel
  - PresetSaveDialog
  - PresetLoadDialog
  - DirectorsBoard
  - PresetImport/Export dialogs
- Added _spacing.less import to scrying-pool.less
- Rebuilt CSS (dist/styles/scrying-pool.css)

This fixes:
1. Transparent dialogs (now have proper background colors)
2. Missing spacing tokens (caused build errors)
3. Module category (now shows as 'Audio/Video' instead of 'Uncategorized')

All 900 unit tests passing.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 14:03:42 +02:00
uberwald a05d3ca831 Fix ApplicationV2 jQuery parameter handling in _onRender methods
- Fixed TypeError in PlayerPrivacyPanel._onRender: element.querySelector is not a function
- Root cause: FoundryVTT v14 ApplicationV2 passes jQuery objects to _onRender, not plain HTMLElements
- Solution: Normalize parameter to element with querySelector method:
  - If HTMLElement, use directly
  - If jQuery (has [0]), use html[0]
  - Otherwise, use as-is (for test mocks)
- Applied fix to:
  - PlayerPrivacyPanel._onRender
  - PresetSaveDialog._onRender
  - PresetLoadDialog._onRender
- All 900 unit tests passing

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 13:56:31 +02:00
uberwald 5b421d6d49 Fix DirectorsBoard position loading error
- Fixed TypeError: Cannot assign to read only property 'position' of object
- Changed _loadPosition() to use Object.assign() instead of direct assignment
- Added null check for this.options?.position to handle both Foundry and test environments
- Updated fallback _AppBase class to store options in constructor for test compatibility
- Added comprehensive tests for _loadPosition() method

The error occurred because in FoundryVTT v14, ApplicationV2 freezes the options object,
making direct assignment to this.options.position impossible. Using Object.assign()
merges the properties instead, which works with both frozen and unfrozen objects.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 13:50:46 +02:00
uberwald 25dd427a59 Update tests for Story 5-1 Full AV Replacement
- Mark Story 5-1 as done in sprint-status.yaml
- Update FoundryAdapter.test.js:
  - Updated probeCapability tests to expect 'stream-access' (was 'css-fallback')
  - Added tests for all 11 new buildWebRTCSurface methods
  - Added input validation tests for userId-taking methods
- Update ScryingPoolStrip.test.js:
  - Added tests for hasStreamAccess flag in buildParticipantList
  - Added tests for hasStreamAccess in getData()
  - Added tests for _attachVideoStream() method
  - Added tests for _cleanupVideoStreams() method

All 892 unit tests passing + 7 integration tests passing

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 12:36:52 +02:00
uberwald f8cbb75773 Apply code review patches: null guards, validation, cleanup for WebRTC full AV replacement
- module.js: null guards, try-catch, migration logic
- FoundryAdapter.js: input validation, JSDoc fix
- ScryingPoolStrip.js: null guards, cleanup, race condition fix
- _roster-strip.less: CSS typo fix
- All 19 code review findings resolved
- All tests passing, 0 lint errors
- Story 5-1 documentation added (5-1-full-av-replacement.md)
- Sprint status updated for Epic 5

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 09:50:07 +02:00
uberwald 6d7a0b5fd7 Now manage to replace the Foundry native AV dock
CI / ci (push) Failing after 16s
2026-05-24 09:39:53 +02:00
uberwald c4a375f4e3 Story 4.2: Implement full AV replacement with WebRTC stream access
- 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>
2026-05-24 09:12:06 +02:00
uberwald 20d13fc678 Story 4.2: Fix lint errors and code review findings
- 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>
2026-05-24 01:25:30 +02:00
uberwald 2d898f6818 First round of test 2026-05-24 01:07:39 +02:00
uberwald e2da4773bd Fix: GMPlayerPrivacySelectorMenu must extend ApplicationV2
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>
2026-05-24 01:00:14 +02:00
uberwald 0cb046b273 Fix: Add registerMenu method to FoundryAdapter
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>
2026-05-24 00:58:22 +02:00
uberwald ea4462e2e0 Fix: Correct CSS class selector in StripOverlayLayer
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>
2026-05-24 00:57:12 +02:00
uberwald 6f07e48e54 Fix: StripOverlayLayer initialization timing - proper architecture
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>
2026-05-24 00:56:19 +02:00
uberwald a06e504183 Fix: StripOverlayLayer initialization timing issue
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>
2026-05-24 00:52:48 +02:00
uberwald a7370f2e22 Epic 4: Complete retrospective and update sprint status
- Added comprehensive Epic 4 retrospective document
- Marked epic-4-retrospective as done in sprint-status.yaml
- Story 4.2 (Custom Portrait Fallback) already completed in previous commit

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-24 00:41:48 +02:00
uberwald 56eeb7cc83 Story 4.2 completed 2026-05-24 00:37:21 +02:00
uberwald de1b33c453 Story 4.1 completed 2026-05-23 23:00:07 +02:00
uberwald fd0a7868f3 Story 4.1: Tasks 3-6 Complete - Director's Board Integration & Settings Menu
- Task 3: Extended FoundryAdapter with user flag access methods
  - Added getFlag(userId, scope, key) method
  - Added setFlag(userId, scope, key, value) method
  - Added getFlagModule(userId, key) convenience method
  - Added setFlagModule(userId, key, value) convenience method

- Task 4: Integrated Privacy Settings with Director's Board
  - Updated participant-card.hbs to show Reaction Cam badge
  - Modified boardUtils.js to pass playerPrivacyManager through context
  - Updated DirectorsBoard to accept and pass playerPrivacyManager
  - Added CSS styles for Reaction Cam badge (SP accent color)

- Task 5: Registered PlayerPrivacyPanel in module settings
  - Added settings menu registration in module.js Hooks.once('ready')
  - Available to all users (restricted: false)
  - Uses localized labels and hints

- Task 6: Added all localization strings
  - Added SCRYING_POOL.PrivacyPanel.* strings for panel UI
  - Added SCRYING_POOL.Settings.* strings for settings menu

- Updated story file with task completion status

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 21:29:58 +02:00
uberwald 61f362004e Story 4.1: Task 1 Complete - PlayerPrivacyManager Core Logic
- Created src/contracts/privacy-settings.js with:
  - PrivacySettings typedef
  - PRIVACY_SETTINGS_DEFAULT (both flags false)
  - PRIVACY_SETTING_KEYS and FEATURE_NAME_MAP constants
  - createPrivacySettings() factory
  - isValidPrivacySettings() validator
  - validateSettingKey(), validateSettingValue(), validateFeatureName() helpers
- Created src/core/PlayerPrivacyManager.js with:
  - Constructor with FoundryAdapter DI validation
  - getSettings(userId) - retrieves settings from user flags
  - setSetting(userId, key, value) - async, validates, persists via user.setFlag
  - isOptedIn(userId, feature) - convenience method for feature checks
  - getAllSettings() - aggregates all users' settings (GM view)
  - onChange(callback) - subscription pattern for change events
  - teardown() - cleanup
- Created tests/unit/contracts/privacy-settings.test.js - 44 tests
- Created tests/unit/core/PlayerPrivacyManager.test.js - 35 tests
- All tests passing, lint clean
- Updated sprint-status.yaml: 4-1 from ready-for-dev to in-progress
- Updated story file: Task 1 subtasks 1.1-1.8 marked complete

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 21:11:55 +02:00
uberwald e81c05a3db Create Story 4.1: Player Privacy Panel & Automation Opt-ins
- 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>
2026-05-23 21:02:43 +02:00
uberwald 972e456759 Epic 3 finished 2026-05-23 19:31:35 +02:00
uberwald f126793daf Update Epic 3 status to done - all stories complete
- 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>
2026-05-23 19:06:57 +02:00
uberwald 6a55d4f1e1 Fix sprint tracking: Story 3.1 was already implemented
- 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>
2026-05-23 19:06:31 +02:00
uberwald 45fbb9da00 Update Story 3.3 status to done after code review fixes
- Updated sprint-status.yaml: 3-3-preset-import-and-export → done
- Updated story file header: Status → done
- Updated last_updated timestamp

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 18:59:59 +02:00
uberwald ea2c2ea093 Fix code review findings for Story 3.3: Preset Import & Export
Security & Quality Improvements:
- Fix XSS vulnerabilities in PresetImportDialog, PresetExportDialog, and templates
- Add resource leak protection in downloadExportFile() with try/finally
- Fix encapsulation violation by using public API instead of _presetsCache
- Add rollback mechanism for partial failures in replace mode
- Add preset name validation (length, characters, empty check)
- Add duplicate name detection within import files
- Add file size validation (5MB limit) and type validation
- Fix event listener leaks with proper cleanup in _onRender/_onClose
- Add constructor parameter validation for all dialogs

Acceptance Criteria Compliance:
- Fix AC-2: Export filename now uses world name (via parent.name)
- Fix AC-6: Error message matches spec exactly ('Import failed: invalid JSON format')
- Fix AC-8: Merge/Replace messages match spec format

Code Quality:
- Add shared HTML escaping utilities (src/utils/html.js)
- Consolidate duplicate localization strings (removed 28 duplicates from SCRYING_POOL)
- Use SCENE_PRESET_VERSION constant instead of hardcoded 1
- Handle null options in importPresets()
- Graceful handling of skipValidation with invalid data

Test Results: 679 passed, 3 failed (pre-existing in DirectorsBoard)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 18:58:34 +02:00
uberwald a1e8886fce Story 3.2 done 2026-05-23 18:23:48 +02:00
uberwald d175f92806 Complete Story 3.3: Preset Import & Export
Implements FR-19: Preset import/export as JSON

New Files:
- src/core/PresetImportExportManager.js - Core logic for export/import with merge/replace
- src/ui/gm/PresetExportDialog.js - Export dialog with file download
- src/ui/gm/PresetImportDialog.js - Import dialog with file picker, preview, merge/replace
- templates/preset-export.hbs - Export dialog template
- templates/preset-import.hbs - Import dialog template
- styles/components/_preset-import-export.less - Dialog styles
- tests/unit/core/PresetImportExportManager.test.js - 38 unit tests
- _bmad-output/implementation-artifacts/3-3-preset-import-and-export.md - Story file

Modified Files:
- src/ui/gm/DirectorsBoard.js - Added export/import button handlers
- templates/directors-board.hbs - Added Export/Import buttons to footer
- styles/scrying-pool.less - Added stylesheet import
- lang/en.json - Added localization strings for new UI
- _bmad-output/implementation-artifacts/sprint-status.yaml - Story status: review

Features:
- Export all presets from current scene as JSON file
- Import presets with merge (add new, skip duplicates) or replace (overwrite all) modes
- Preview of presets before import with validation status
- Confirmation dialog for replace mode to prevent data loss
- Comprehensive error handling and validation
- All ACs satisfied (AC-9 deferred for README docs)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 16:28:53 +02:00
uberwald e31badf865 Create Story 3.3: Preset Import & Export
- Add comprehensive story file for preset import/export functionality
- Update sprint status: 3-3-preset-import-and-export → ready-for-dev
- Story covers FR-19: Preset import/export as JSON
- Includes 9 acceptance criteria, tasks, and developer context

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 15:57:44 +02:00
uberwald dc63148b80 Create Story 3.2: Scene Auto-Apply & ConfirmationBar
- 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>
2026-05-23 15:10:55 +02:00
uberwald 25b98ce64a Mark Story 2.3 code review as done
- Update deferred-work.md: mark ParticipantCard.js issue as resolved
- Update sprint-status.yaml: add code review completion date

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 11:43:05 +02:00
uberwald cc5b04d902 Update sprint status: Story 2.3 code review completed and merged
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-23 11:37:16 +02:00
uberwald 7918792f4e Fix Story 2.3 code review findings: remove duplicate ParticipantCard.js, fix lint in ScryingPoolStrip.js
- 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>
2026-05-23 11:31:01 +02:00
uberwald d001659e27 Update sprint status: Story 1.3 → done
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-22 13:24:06 +02:00
uberwald 5ba7717ecd Fix Story 1.3: StateStore spec compliance and minor cleanup
Critical Fix:
- StateStore now uses global Hooks.callAll directly (per spec)
- Removed hooks parameter from StateStore constructor
- Updated module.js to pass only adapter.settings
- Updated tests to stub globalThis.Hooks

Minor Cleanup:
- Fixed misleading warning in SocketHandler.registerPendingOp
- Added clarifying comment for setMatrix _revision behavior

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-22 11:38:45 +02:00
uberwald 110b295a7b CLose story 1.2 2026-05-21 23:08:34 +02:00