Commit Graph
712 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN 4bdcfbdb2e Refactor: Replace duplicated extractDTagValue in DeleteModal
Replaced the local `extractDTagValue` function in `js/ui/components/DeleteModal.js` with the shared `getDTagValueFromTags` utility from `js/nostr/nip71.js` (exported via `js/nostr/index.js`).

Added a new unit test `tests/ui/components/DeleteModal.test.mjs` to verify the d-tag extraction logic and ensure the refactor is correct and safe. This test uses `jsdom` to mock the necessary DOM environment.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:39:07 +00:00
thePR0M3TH3AN 824e9edd65 Merge branch 'unstable' into agents/daily/scheduler-update-agent-2026-02-22-9351640604648205171 2026-02-25 10:30:15 -05:00
thePR0M3TH3AN 3f4316f64e Merge pull request #2681 from PR0M3TH3AN/agents/weekly/refactor-agent-2026-02-23-8774352260885712650
refactor(ui): extract bindThumbnailFallbacks from app.js
2026-02-23 07:13:32 -05:00
thePR0M3TH3AN 22fb4cbd0a Merge pull request #2679 from PR0M3TH3AN/agents/daily/style-agent-2026-02-22-3871995359379843897
Daily Scheduler: style-agent execution
2026-02-23 07:12:38 -05:00
google-labs-jules[bot]andPR0M3TH3AN ff72f181a5 refactor(ui): extract thumbnail logic, fix visual CI, and patch profile controller
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-23 01:53:16 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4a5099d745 refactor(ui): extract bindThumbnailFallbacks from app.js
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-23 01:16:32 +00:00
thePR0M3TH3AN 0af7de6c07 [ui] Fix DM tab blank shell and harden profile modal tests 2026-02-22 20:14:32 -05:00
google-labs-jules[bot]andPR0M3TH3AN cf4e6eb1d4 fix(ci): Resolve runtime crash in ProfileStorageController and race in UploadModal
- Fixes `TypeError: Cannot set properties of null (setting 'value')` in `ProfileStorageController` by adding guards for DOM elements during background login (fixes `feed-pagination-stress` and likely `video-upload-flow`).
- Fixes `UploadModal` visibility race condition by awaiting `load()` in `open()` (from previous attempt).
- Adds timeout to `notification-system.spec.ts` to prevent flakiness (from previous attempt).
- Updates visual baselines (from previous attempt).
- Moves `initializeUserInterface` earlier in `app.js` startup (from previous attempt).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-23 01:00:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN 81c0fc67db fix(ci): resolve e2e and visual test failures
- Fix race condition in UploadModal.js by making open() await load()
- Stabilize notification-system.spec.ts by waiting for app initialization
- Update visual test baselines for default theme
- Complete scheduled style-agent task

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-23 00:19:48 +00:00
google-labs-jules[bot]andPR0M3TH3AN eb56dbb6a2 fix(ui): resolve race condition in UploadModal by initializing controller early
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 23:22:46 +00:00
google-labs-jules[bot]andPR0M3TH3AN c1d7cc768e fix(ui): resolve race condition in UploadModal opening
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 22:31:35 +00:00
thePR0M3TH3AN b65ad21901 Merge pull request #2672 from PR0M3TH3AN/agents/daily/prompt-curator-agent-2026-02-22-2018433635480124911
docs(agents): prompt curation run 2026-02-22
2026-02-22 15:51:03 -05:00
thePR0M3TH3AN a95343e471 Merge branch 'unstable' into agents/daily/prompt-curator-agent-2026-02-22-2018433635480124911 2026-02-22 15:41:30 -05:00
thePR0M3TH3AN 6ed296f2d2 Merge branch 'unstable' into agents/daily/onboarding-audit-2026-02-22-6501903614915901077 2026-02-22 15:40:28 -05:00
google-labs-jules[bot]andPR0M3TH3AN 218159701a fix(ci): restore firefox and prevent dom crashes
- Fixed `package.json` to restrict `test:visual` to `visual` project, preventing execution of E2E tests in the `build` job (which lacks firefox).
- Fixed `js/ui/components/UploadModal.js` and `js/ui/components/SearchFilterModal.js` with defensive null checks to prevent "Cannot set properties of null" crashes during E2E tests.
- Verified `ci.yml` installs firefox for `e2e-headless`.
- Verified `js/relayManager.js` handles missing `window.location`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 17:48:57 +00:00
google-labs-jules[bot]andPR0M3TH3AN 98ecc678a4 fix(ci): install firefox for e2e-headless job and harden ui tests\n\n- Updated .github/workflows/ci.yml to install firefox in the e2e-headless job, resolving \"Executable doesn't exist\" errors.\n- Added defensive null checks in UploadModal.js to prevent runtime crashes during reset.\n- Hardened login-flows.spec.ts to prevent flaky logout assertions.
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 16:09:22 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2122a257c8 Fix E2E CI failures: Harden UploadModal and fix login modal waiter
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 15:13:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN eb1ae774dc Fix: VideoCard attributes and test fixture tagging for robust E2E testing
- Added `data-video-card`, `data-video-pubkey`, `data-video-dtag` to `VideoCard` component root.
- Added `data-play-url` and `data-play-magnet` to `VideoCard` root to support test harness selectors.
- Updated `tests/e2e/helpers/bitvidTestFixture.ts` to include `["t", "video"]` tag in seeded events, fixing feed discovery in tests.
- Added `tests/e2e/dm-scenarios.spec.ts` to improve coverage of Direct Message functionality.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-22 03:50:28 +00:00
thePR0M3TH3AN 0cf1dc0f55 improved playright integration 2026-02-21 20:45:47 -05:00
thePR0M3TH3AN 152b7fbf1a update 2026-02-21 16:08:33 -05:00
Claude 58e4c1b87f fix: prevent logout from auto-selecting first saved profile
After logout, renderSavedProfiles() was unconditionally falling back to
the first saved profile when no active profile existed. This made the
profile modal appear as if the user switched accounts instead of logging
out, requiring a second logout attempt and a page refresh.

The fix gates the fallback so it only triggers when an active pubkey IS
set but doesn't match any saved entry (a data-inconsistency edge case),
not when the active pubkey is null (the normal logged-out state).

https://claude.ai/code/session_01Lw3WG8A9Risiqx2uLTZZZH
2026-02-21 19:48:17 +00:00
google-labs-jules[bot]andPR0M3TH3AN f9f23c0d08 [security] replace innerHTML usages in js/ui/components/ShareNostrModal.js — convert to safe DOM APIs
- Replace template `innerHTML` with `DOMParser`
- Replace SVG `innerHTML` with `createElementNS`
- Replace `innerHTML = ""` with `replaceChildren()`
- Update `check-innerhtml` baseline

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-20 20:07:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN f022168c33 [decompose] extract Zap and LinkPreview controllers from VideoModal.js
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-20 01:39:25 +00:00
google-labs-jules[bot]andPR0M3TH3AN bd6ca5b54e [decompose] extract BlockList and EditProfile from ProfileModalController
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-19 20:10:37 +00:00
google-labs-jules[bot]andPR0M3TH3AN 599f72a373 [security] replace innerHTML usages in js/ui/components/DeleteModal.js
- Replaced `wrapper.innerHTML` with `DOMParser` for template loading.
- Replaced `metadataList.innerHTML = ""` with `replaceChildren()`.
- Updated `scripts/check-innerhtml.mjs` baseline (count reduced by 3).
- Added artifacts: context, todo, decisions, log.
- Verified with lint and unit tests.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-18 16:23:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN 106f7640c4 fix(exploreData): trigger refresh immediately on visibility change
- `handleVisibility` only scheduled intervals but didn't trigger an immediate refresh when returning to the tab.
- This caused `tests/unit/services/exploreDataService.test.mjs` to fail (assertion `0 !== 1`).
- Added explicit calls to `refreshWatchHistoryTagCounts` and `refreshTagIdf` when `document.hidden` becomes false.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-18 15:10:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN d22785bb87 [decompose] extract helpers from js/ui/profileModalController.js
Extracted DM Relay UI logic and DM Attachment logic into separate binder modules to reduce the size of ProfileModalController.js. Updated file size baseline.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-18 01:03:43 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6d0bd25067 Refactor copy logic to remove deprecated execCommand
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-17 04:55:45 +00:00
google-labs-jules[bot]andPR0M3TH3AN 16de3802ab [security] replace innerHTML usages in js/ui/subscriptionHistoryController.js
- Migrated 6 out of 7 innerHTML assignments to safe DOM APIs (createElement, textContent, replaceChildren).
- Reduced innerHTML baseline for the file from 7 to 1.
- Updated scripts/check-innerhtml.mjs baseline.
- Verified with lint, unit tests, and frontend verification.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-16 18:51:44 +00:00
google-labs-jules[bot]andPR0M3TH3AN d0ea513271 [constants] extract MAX_BLOCKLIST_ENTRIES and SHORT_TIMEOUT_MS
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-16 03:57:09 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7637631730 perf: visibility gating for LoginModalController
- Implements visibility gating in `LoginModalController.js` to pause polling intervals when the tab is hidden.
- Created `perf/daily-perf-report-2026-02-15.md` with performance findings.
- Verified upload documentation alignment.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-15 15:52:32 +00:00
google-labs-jules[bot]andPR0M3TH3AN 9b95a38d34 refactor(ai): extract video modal events to controller (refactor-agent)
Extracts video modal event handling logic from `js/app.js` to
`js/ui/videoModalController.js`.

- Moves `_bindVideoModalEvents` logic to `VideoModalController.bindEvents`.
- Adds unit tests for the controller.
- Follows AGENTS.md refactor guidelines.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-15 01:10:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN f676fb2ff5 [security] replace innerHTML in RevertModal.js
Migrated `js/ui/components/RevertModal.js` to safe DOM APIs (`createElement`, `textContent`, `DOMParser`).
Extracted rendering logic to `js/ui/components/revertModalRenderers.js`.
Updated baseline in `scripts/check-innerhtml.mjs` (0 remaining usages).
Updated tests to mock DOMParser.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-14 18:58:02 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5338942ea3 docs: document profileModalController.js and add architecture overview (docs-code-investigator)
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-14 17:41:32 +00:00
thePR0M3TH3AN a7d5448f83 Merge pull request #2505 from PR0M3TH3AN/agents/daily/decompose-agent-1771068993-9839708061087795531
[decompose] extract helpers from js/ui/components/VideoModal.js
2026-02-14 07:55:18 -05:00
google-labs-jules[bot]andPR0M3TH3AN 54be0efcac [decompose] extract helpers from js/ui/components/VideoModal.js
Decomposed js/ui/components/VideoModal.js by extracting "Similar Video" and "Pointer Key" logic into a new helper module js/ui/components/VideoModalSimilarHelpers.js.

- Reduced VideoModal.js line count from 6334 to 6045.
- Added comprehensive unit tests for extracted helpers.
- Updated check-file-size.mjs baseline.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-14 11:46:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6209d32b52 fix: add missing moderation aliases to ProfileModalController
- Added aliases/delegate properties for `moderationBlurInput`, `moderationAutoplayInput`, `moderationMuteHideInput`, `moderationSpamHideInput`, `moderationSaveButton`, `moderationResetButton`, `moderationStatusText`, `moderationOverridesList`, `moderationOverridesEmpty`, `moderationTrustedContactsCount`, `moderationTrustedMuteCount`, `moderationTrustedReportCount`, `moderationSeedOnlyIndicator`, `moderationHideControlsGroup`, `moderationHideControlElements` to `ProfileModalController.js`.
- Added delegate methods for `handleModerationSettingsSave`, `handleModerationSettingsReset`, `getModerationSettingsDefaults`.
- This ensures backward compatibility for existing tests like `tests/ui/profile-modal-moderation-settings.test.mjs`.
- Verified with unit tests (`tests/profile-modal-controller.test.mjs` and `tests/ui/profile-modal-moderation-settings.test.mjs`).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-14 11:07:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN f35d27d471 fix: repair profileModalController decomposition by adding delegate methods
- Added delegate methods for `refreshAdminPaneState`, `refreshModerationSettingsUi`, `updateModerationTrustStats`, `runAdminMutation`, `sendAdminListNotification`, `describeAdminError`, `describeNotificationError`, `notifyAdminError` to `ProfileModalController.js`.
- Added aliases for properties like `moderatorSection` in `ProfileModalController.js` to satisfy tests.
- Removed duplicated method implementations from `ProfileModalController.js`.
- Verified with unit tests (`tests/profile-modal-controller.test.mjs`) and linting.
- Reduced `ProfileModalController.js` size by ~2000 lines.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-14 10:59:14 +00:00
google-labs-jules[bot]andPR0M3TH3AN d2c6f0a32e chore(ai): document js/ui/components/VideoModal.js
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-13 15:48:06 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4059d52847 fix(ui): profile modal controller instantiation order
- Moved controller instantiation (DM, Relay, Hashtag) to after services setup in `ProfileModalController.js`.
- Fixed `ProfileHashtagController` usage of uninitialized services.
- Updated `profile-modal-controller.test.mjs` mock to include `uiReady/dataReady` flags and use correct service access pattern.
- Resolved CI failures in `profile-modal-controller.test.mjs`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-13 03:50:42 +00:00
google-labs-jules[bot]andPR0M3TH3AN 1b68e3c5f2 [decompose] extract ProfileHashtagController from js/ui/profileModalController.js
Extracts all hashtag preference related logic into a new controller
`js/ui/profileModal/ProfileHashtagController.js` to reduce the size of `js/ui/profileModalController.js` and improve maintainability.

- Moves `normalizeHashtagTag`, `formatHashtagTag`, `getResolvedHashtagPreferences`, `setHashtagStatus`, `refreshHashtagBackgroundStatus`, `populateHashtagPreferences`, `renderHashtagList`, `sanitizeHashtagList`, `createHashtagListItem`, `persistHashtagPreferences`, `handleAddHashtagPreference`, `handleRemoveHashtagPreference`, `handleHashtagPreferencesChange`, `describeHashtagPreferencesError`.
- Updates `ProfileModalController` to delegate to `ProfileHashtagController`.
- Adds delegate getters/methods in `ProfileModalController` to maintain backward compatibility for tests.
- Reduces `js/ui/profileModalController.js` by ~600 lines.
- Updates file size baseline in `scripts/check-file-size.mjs`.

Passes `npm run lint` and `npm run test:unit`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-13 02:26:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN 393c06c749 [decompose] extract ProfileHashtagController from js/ui/profileModalController.js
Extracts all hashtag preference related logic into a new controller
`js/ui/profileModal/ProfileHashtagController.js` to reduce the size of `js/ui/profileModalController.js` and improve maintainability.

- Moves `normalizeHashtagTag`, `formatHashtagTag`, `getResolvedHashtagPreferences`, `setHashtagStatus`, `refreshHashtagBackgroundStatus`, `populateHashtagPreferences`, `renderHashtagList`, `sanitizeHashtagList`, `createHashtagListItem`, `persistHashtagPreferences`, `handleAddHashtagPreference`, `handleRemoveHashtagPreference`, `handleHashtagPreferencesChange`, `describeHashtagPreferencesError`.
- Updates `ProfileModalController` to delegate to `ProfileHashtagController`.
- Adds delegate getters/methods in `ProfileModalController` to maintain backward compatibility for tests.
- Reduces `js/ui/profileModalController.js` by ~600 lines.
- Updates file size baseline in `scripts/check-file-size.mjs`.

Passes `npm run lint` and `npm run test:unit`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-13 02:06:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5f1edebea7 [decompose] extract ProfileHashtagController from js/ui/profileModalController.js
Extracts all hashtag preference related logic into a new controller
`js/ui/profileModal/ProfileHashtagController.js` to reduce the size of `js/ui/profileModalController.js` and improve maintainability.

- Moves `normalizeHashtagTag`, `formatHashtagTag`, `getResolvedHashtagPreferences`, `setHashtagStatus`, `refreshHashtagBackgroundStatus`, `populateHashtagPreferences`, `renderHashtagList`, `sanitizeHashtagList`, `createHashtagListItem`, `persistHashtagPreferences`, `handleAddHashtagPreference`, `handleRemoveHashtagPreference`, `handleHashtagPreferencesChange`, `describeHashtagPreferencesError`.
- Updates `ProfileModalController` to delegate to `ProfileHashtagController`.
- Reduces `js/ui/profileModalController.js` by ~600 lines.
- Updates file size baseline in `scripts/check-file-size.mjs`.

Passes `npm run lint` and `npm run test:unit`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-13 01:39:22 +00:00
google-labs-jules[bot]andPR0M3TH3AN a77e182ed1 chore(agents): run const-refactor-agent daily task — Refactored timeouts in UI controllers and webtorrent.js to use canonical constants
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-12 23:10:37 +00:00
google-labs-jules[bot]andPR0M3TH3AN df62585106 perf: enable lazy loading for avatars and thumbnails
Added `loading="lazy"` and `decoding="async"` attributes to dynamically created `<img>` elements in:
- `js/historyView.js` (avatars)
- `js/ui/subscriptionHistoryController.js` (channel icons)
- `js/searchView.js` (added `decoding="async"`)
- `js/ui/profileModal/ProfileDirectMessageRenderer.js` (attachment previews, avatars)
- `js/ui/profileModalController.js` (attachment previews, saved profile avatars)

This reduces initial page load impact and bandwidth usage by deferring off-screen image loading.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-12 16:56:06 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2aae4094e7 [constants] refactor duplicate numeric constants
- Add `UI_FEEDBACK_DELAY_MS`, `DEBOUNCE_DELAY_MS`, and `NETWORK_RETRY_DELAY_MS` to `js/constants.js`.
- Replace magic numbers (5000, 2000, 1500) with semantic constants in:
  - `js/ui/notificationController.js`
  - `js/ui/profileModal/ProfileDirectMessageActions.js`
  - `js/ui/urlHealthController.js`
  - `js/app/uiCoordinator.js`
  - `js/ui/components/VideoModal.js`
  - `js/ui/components/UploadModal.js`
  - `js/services/dmNostrService.js`
  - `js/services/hashtagPreferencesService.js`
  - `js/app/feedCoordinator.js`
  - `js/services/moderationService.js`

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-12 03:43:03 +00:00
thePR0M3TH3AN 0607367f1a Merge pull request #2368 from PR0M3TH3AN/decompose-profile-modal-controller-1637476114002717833
Decompose ProfileModalController
2026-02-11 16:17:07 -05:00
google-labs-jules[bot]andPR0M3TH3AN 7300977a6d [decompose] extract DM and Relay controllers from ProfileModalController
Extracted ProfileDirectMessageController (split into Controller, Actions, Renderer, Helper) and ProfileRelayController from ProfileModalController to reduce file size and improve maintainability.

ProfileModalController.js size reduced from ~12000 lines to ~8750 lines.
Updated unit tests to reflect the new structure.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-11 21:15:06 +00:00
thePR0M3TH3AN 244f5f80a8 Merge pull request #2367 from PR0M3TH3AN/claude/fix-sync-and-dm-issues-NMShC
Fix NIP-07 adapter support and improve signer resolution
2026-02-11 15:01:35 -05:00
Claude 53b8a2609c fix: recognize NIP-07 signer type for extension permission pre-granting
The NIP-07 adapter uses type "nip07" but all permission pre-granting
checks only matched type "extension", causing NIP-07 browser extension
users to fail decryption for block/mute lists, subscriptions, DMs, and
watch history. Hashtag preferences appeared to work because their read
path had a separate fix, masking the systemic issue.

Changes:
- shouldRequestExtensionPermissions() now matches both "extension" and
  "nip07" signer types (central fix affecting DM signals, comments,
  publish helpers, and watch history fetch)
- buildDmDecryptContext() pre-grants extension permissions for NIP-07
- userBlocks.js: remove capabilities-gated decryptor check that failed
  with lazy NIP-07 module injection (same fix already in subscriptions.js);
  always resolve signer regardless of allowPermissionPrompt; increase
  fast-path relay timeout from 6s to 10s
- watchHistoryService: recognize NIP-07 type and always resolve signer
- All publish paths (blocks, subscriptions, hashtags, relays, uploads,
  sharing, moderation) now pre-grant permissions for NIP-07 signers

https://claude.ai/code/session_01PipsdaTQmw7wBTJ1LmJjkk
2026-02-11 19:41:53 +00:00