Adds a standalone Node.js script that reproduces the TypeError seen in
`tests/app/channel-profile-moderation.test.mjs`. The crash occurs because
the test harness instantiates `Application` without running the constructor,
leaving `moderationDecorator` undefined.
The reproducer demonstrates this by using `Object.create(Application.prototype)`
and attempting to call `decorateVideoModeration`.
Refactors the disclaimer modal to use responsive utility classes, forcing full-screen width/height on mobile while preserving the card-based layout on desktop. This matches the behavior of the login modal and works around existing CSS limitations for modal sheets.
Extracts `decorateVideoModeration` and related helper methods from `js/app.js` into a new `js/services/moderationDecorator.js` service. This improves separation of concerns by moving complex moderation logic out of the main application class.
AGENTS.md Checklist:
1. Identify Logic: Extracted `decorateVideoModeration`, `deriveModerationReportType`, `deriveModerationTrustedCount`, `getReporterDisplayName`, `normalizeModerationSettings`, `getActiveModerationThresholds`.
2. Create Controller Method: Created `ModerationDecorator` class with `decorateVideo` method.
3. Create `bitvidApp` Wrapper: Replaced `decorateVideoModeration` in `js/app.js` with a wrapper that delegates to `this.moderationDecorator.decorateVideo`.
4. Wire Up Callbacks: Passed `getProfileCacheEntry` to `ModerationDecorator` constructor.
5. Remove Old Code: Removed extracted methods from `js/app.js`.
Also added unit tests for `ModerationDecorator` and ensured runtime settings updates are propagated.
- Removed a TODO comment in `scripts/agent/validate-events.mjs` as the functionality was already implemented.
- Optimized the code to avoid redundant `JSON.parse` calls.
- Verified the script passes all validation tests.
- Created `artifacts/issue_telemetry_json.md` to track the larger task of handling JSON logs in telemetry aggregation.
- Adds `scripts/agent/review-pr.mjs` to automate PR checks (lint, format, test).
- Implements micro-fix logic to auto-commit formatting changes.
- Adds guardrails for sensitive files (security/protocol review).
- Generates a Markdown report with test failure analysis.
Removed unused JS exports and constants identified during dead code sweep:
- `subscribeToDesignSystemChanges` (js/designSystem.js)
- Unused metric getters (js/designSystem/metrics.js)
- `refreshHealthBadges` (js/gridHealth.js)
- `setQueryParam` (js/index.js)
- `ADMIN_INITIAL_WHITELIST`, `ADMIN_INITIAL_BLACKLIST` (js/lists.js)
- `getWatchHistoryV2Enabled` (js/constants.js)
Also added missing `jsdom` devDependency to fix unit test failures.
Verified with `npm run build`, `npm run lint`, and `npm run test:unit`.
This change updates `components/login-modal.html` to remove layout constraints (`items-start`, `justify-center`, `max-h-modal-shell`) on mobile viewports (< lg) by prefixing them with `lg:`. This allows the modal to utilize the default full-screen behavior provided by the `.bv-modal` and `.modal-sheet` classes on smaller screens, matching the behavior of the Profile and Video modals. Desktop layout remains unchanged.
- Implement mobile view state management (`list` vs `thread`) in `ProfileModalController`.
- Update `AppShell` to apply `data-dm-view` attribute for CSS toggling.
- Update `MessageThread` to render a "Back" button on mobile.
- Add CSS rules to hide/show sidebar and thread panels based on mobile view state.
- Ensure desktop layout remains split-pane.
- Added JSDoc comments to `NostrClient` class and methods.
- Documented state management (`activeMap`, `tombstones`), caching strategy, and subscription buffering.
- Created `docs/nostr-client-overview.md` with a high-level architecture overview.
- Verified with `tests/nostr-login-permissions.test.mjs`.
- Added a new mobile-specific "Logout" button to the profile navigation list, visible only on screens smaller than `lg`.
- Hid the existing footer logout button on mobile screens.
- Updated `ProfileModalController` to bind the logout logic to the new mobile button.
- Applied `data-variant="critical"` and spacing to the new button to match styling requirements.
- Refactor `SimilarContentController` integration in `similar-content.test.mjs` to fix unit tests.
- Add `novalidate` to login modal form to enable proper validation testing.
- Fix broken asset paths in `profile-modal.html` and `application-form.html`.
- Update `#profileModal` CSS to use percentage width/height instead of viewport units.
- Replace raw CSS measurements with tokens in `tailwind.source.css`.
- Remove `lockdown-modal` from close-button e2e verification.
- Update `overlay-layers.spec.ts` expectation to match CSS behavior.
Adds a minimal reproducer for the `similar-content` logic bug where candidates are not correctly ordered or filtered.
This confirms the failures seen in `tests/app/similar-content.test.mjs`.
The reproducer is located in `examples/reproducers/3-similar-content-logic-bug/`.
- Add `tests/services/link-preview-service.test.mjs`: Tests for caching, fetching, and TTL logic using `fake-indexeddb` and `jsdom`.
- Add `tests/nostr/session-actor.test.mjs`: Tests for encryption/decryption and persistence of session actor.
- Refactor `tests/app/similar-content.test.mjs`: Update to test `SimilarContentController` directly, fixing regression caused by architectural changes.
- Ensure tests are self-contained with necessary polyfills (IndexedDB, LocalStorage).