Commit Graph
734 Commits
Author SHA1 Message Date
thePR0M3TH3ANandClaude Opus 4.8 dde0c35477 refactor(views): batch kind-30079 view counts via SubscriptionManager (P3)
Replaces the per-card view-count transport (each card: list + NIP-45 COUNT +
live sub, × relays — the ~880 REQ/s storm) with ONE shared batched kind-30079
subscription + ONE backfill list() over all visible cards, bucketed back to
per-pointer state by #a. Re-enables the VideoListView circuit-breaker.

Grid counts are convergent/approximate (cheap, persists via the existing view
cache); the watch page opts into an exact NIP-45 COUNT for its single pointer
(modalCoordinator passes { exact: true }) — accurate where it matters, one
request, no storm. Legacy per-pointer path retained for SubscriptionManager-less
environments (tests/mocks).

Verified: nip07-heat steady-idle with views on; flaky multi-relay harness still
all-PASS; new cheat-resistant batching+bucketing test. (Pre-existing
view-counter publish-session-tag failure is unrelated — fails at baseline.)

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-14 15:49:50 -04:00
thePR0M3TH3ANandClaude Opus 4.8 a3b205bfa1 fix(login-perf): kill relay REQ storms and feedback loops
Real-environment console logs revealed nip-07 login pegging the CPU and
starving encrypted-list decryption via relay REQ storms (~1000 REQ/s):

- moderationService.rebuildTrustedContacts emitted "contacts"
  unconditionally, forming an emit->fetch->emit loop (~1600 kind-3 REQ/s).
  Now emits only on actual change. Regression test added.
- Per-video live report (kind 1984) and view-count (kind 30079)
  subscriptions fan out O(videos x relays) and re-fire on every flaky-relay
  reconnect. Circuit-broken behind flags until batched (see refactor plan).
- onVideosShouldRefresh now coalesces forced reloads (2s leading-edge
  throttle) so list-change signals can't drive a reload loop.
- nip-07 queue reserves one foreground slot; DM decryption demoted to LOW
  so background DM backfill can't starve feed-driving lists. Test added.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-14 09:52:33 -04:00
thePR0M3TH3ANandClaude Opus 4.8 52ceb4f211 perf(watch-history): load in background; re-run For You when it resolves
The For You feed awaited watchHistoryService.loadLatest() before rendering, and
loadLatest blocked on the full ~1500-item watch-history fetch on a cold load even
with allowStale:true (the `!allowStale || !hasCachedItems` guard awaited whenever
there was no cache). So the main feed froze behind the entire watch-history
resolution, and nothing re-ran the feed once history finished loading — watched
videos were never suppressed and watch-history tags never applied until a manual
refresh.

- watchHistoryService.loadLatest: allowStale callers now NEVER block. On a cold
  load the refresh is kicked off in the background and the call returns
  immediately with whatever is available (cached items, else the local queue).
- feedCoordinator.subscribeWatchHistoryFeedRefresh: subscribes to the
  "fingerprint" event and, when the For You feed is active, debounced-re-runs it
  so newly-resolved watched videos are suppressed and tags applied. Wired in at
  bootstrap alongside feed registration.

The re-run reads the now-fresh cache (no further refresh scheduled), so there is
no loop. Adds feedCoordinatorWatchHistoryRefresh.test.mjs (debounced single
refresh while active; no refresh when inactive; idempotent subscription).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-12 11:44:01 -04:00
google-labs-jules[bot]andPR0M3TH3AN f7712f51a9 fix: initialize video modal share popover with correct arguments
- Update `js/ui/components/VideoModal.js` to correctly initialize the modal share popover using the `createPopover(trigger, renderFn, options)` signature instead of a single config object.
- Fix the flaky e2e test `tests/e2e/search-and-filter.spec.ts` by increasing the test timeout from 15s to 30s to allow more time for feed items to be retrieved from the network.
- Update `tests/e2e/video-modal-share-bug.spec.ts` to attach an `#uiOverlay` wrapper element for the popover so the DOM doesn't crash on tests.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-03-01 20:49:41 +00:00
google-labs-jules[bot]andPR0M3TH3AN f255bdd9bc chore(torch): execute daily agent run for ci-health-agent
- Resolve scheduler context and preflight exclusions
- Select `ci-health-agent` from roster using round-robin logic
- Acquire distributed lock for execution window
- Perform necessary repository check fixes (linting and tests)
- Publish successful completion lock event
- Write final `task-logs` event record
- Output execution summary

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 19:48:57 +00:00
thePR0M3TH3AN 34b0b03ad0 Merge branch 'unstable' into agents/daily/torch-garbage-collection-agent-2026-02-26-15639715828522871125 2026-02-26 21:42:21 -05:00
thePR0M3TH3AN 8d6e32be27 Merge branch 'unstable' into agents/daily/style-agent-1740615175-12694853261144843326 2026-02-26 21:40:23 -05:00
thePR0M3TH3AN 9448624753 Merge branch 'unstable' into agents/daily/todo-triage-agent-13829754158937187173 2026-02-26 21:38:12 -05:00
google-labs-jules[bot]andPR0M3TH3AN 5c2ba17459 chore: garbage collection and maintenance fixes
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 02:32:53 +00:00
google-labs-jules[bot]andPR0M3TH3AN a649c341e0 I have updated the nostr-tools usage and resolved the UI bugs. Here are the details of the changes:
- Updated `js/nostr/adapters/nsecAdapter.js` to ensure private keys are `Uint8Array` bytes before passing to `getPublicKey`, fixing compatibility with `nostr-tools` v2.
- Updated `tests/nostr/nip46Client.test.js` to use byte arrays for keys in crypto operations.
- Implemented missing `setupModalMorePopover`, `setupModalSharePopover`, and `refreshModalMoreMenuPanel` in `VideoModal.js`.
- Fixed a bug in `VideoModal.js` where `setCommentComposerState` was overriding `CommentsController` send button logic; it now delegates to the controller if available.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 02:14:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN 089556acd1 chore(todo-triage): daily scan and minor fixes
- Ran `todo-triage-agent` scan (0 actionable items found).
- Fixed inline style lint error in `tests/ui/components/DeleteModal.test.mjs`.
- Fixed duplicate import syntax error in `js/ui/components/RevertModal.js`.
- Initialized `modalNavScrollHandler` in `VideoModal` constructor to improve test stability.
- Updated scheduler memory.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 02:14:06 +00:00
google-labs-jules[bot]andPR0M3TH3AN bf076578e9 fix(ci): resolve nostr-tools v2 compatibility and VideoModal regressions
- Fix `nostr-tools` v2 compatibility:
  - Update `js/nostr/adapters/nsecAdapter.js` to convert hex private keys to `Uint8Array` before passing to `getPublicKey`.
  - Update `js/nostr/nip46Client.js` to ensure keys are bytes for `getPublicKey`.
  - Update `tests/nostr/nip46Client.test.js` and `tests/nostr-private-key-signer.test.mjs` to use `Uint8Array` for keys.
- Fix `VideoModal` regressions:
  - Add missing delegation methods (`setCommentsVisibility`, `clearComments`, `resetCommentComposer`, `setCommentStatus`, `setCommentComposerState`, `appendComment`, `renderComments`, `setCommentSectionCallbacks`, `hideCommentsDisabledMessage`, `showCommentsDisabledMessage`, `updateCommentCharCount`, `updateCommentSubmitState`) to `js/ui/components/VideoModal.js`.
  - Expose getters for `commentsList`, `commentsComposer`, etc., in `VideoModal.js` to support tests.
  - Implement `setCallbacks` in `js/ui/components/video-modal/commentsController.js` and ensure robust initialization when DOM elements are missing.
  - Fix `open()` and `updateSourceAvailability()` in `VideoModal.js` to correctly re-enable Share, Embed, and Copy Magnet buttons.
- Fix `DeleteModal` tests to comply with linting rules (avoid direct `.style` assignment).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 02:08:58 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7427961a69 fix(ci): resolve various test failures and nostr-tools v2 compatibility
- Fix duplicate imports/declarations in `js/ui/components/RevertModal.js`
- Update `js/nostr/nip46Client.js` to pass `Uint8Array` keys to `getConversationKey` for compatibility with `nostr-tools` v2
- Fix NIP-46 compliance tests by using correct key types and improved mocks
- Implement missing methods in `js/ui/components/VideoModal.js` (`handleCopyRequest`, `setCommentsVisibility`, etc.) to fix runtime crashes in tests
- Ensure `VideoModal` stores comment composer state locally to support external controller updates in tests
- Update DM integration tests to use `Uint8Array` keys for `nostr-tools` helpers
- Fix linting issue in `tests/ui/components/DeleteModal.test.mjs` using `Object.defineProperty`

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 01:52:00 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6a7dbf8c7d fix(ui): restore missing methods in VideoModal.js to prevent initialization crash
- Restore missing handlers (`handleCopyRequest`, `handleShareRequest`, `handleEmbedRequest`, `handleCreatorNavigation`, `handleModalMoreButtonClick`, `handleReactionClick`) and setup methods (`setupModalMorePopover`, `setupModalSharePopover`, `bindVideoEvents`, `detachVideoEvents`, `bindActionButtons`, `updateSourceAvailability`, `updateSourceToggleState`, `attachAmbientGlow`, `teardownAmbientGlow`, `refreshModalMoreMenuPanel`).
- Fixes `TypeError: Cannot read properties of undefined (reading 'bind')` in `VideoModal` constructor which caused E2E test timeouts and unit test failures.
- Implement methods using standard patterns and available imports (`popoverEngine`, `videoMenuRenderers`, `ambientBackground`).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 01:31:28 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5aac1b2d21 fix(ci): address multiple test and build failures
- Fixed duplicate import and variable declaration in `js/ui/components/RevertModal.js` which caused syntax errors.
- Fixed missing method implementations in `js/ui/components/VideoModal.js` which caused `bind` errors during initialization.
- Fixed NIP-46 compliance tests by updating mocks to match `nostr-tools` v2 structure.
- Updated `js/nostr/nip46Client.js` to ensure keys are passed as `Uint8Array` to `nostr-tools` helpers, maintaining compatibility with legacy hex strings.
- Updated `tests/nostr/dm-direct-message-flow.test.mjs` to use `Uint8Array` keys, fixing "expected Uint8Array" errors.
- Maintained the previous lint fix for `tests/ui/components/DeleteModal.test.mjs`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 01:15:53 +00:00
google-labs-jules[bot]andPR0M3TH3AN 51128c1d33 fix(ci): address linting errors and nostr-tools v2 compatibility
- Fix `SyntaxError` in `js/ui/components/RevertModal.js` by removing duplicate variable declaration.
- Update `js/nostr/nip46Client.js` to support hex string private keys with `nostr-tools` v2 `nip44` operations by converting to `Uint8Array`.
- Update `tests/nostr/dm-direct-message-flow.test.mjs` and `tests/compliance/nip04_44_compliance.test.mjs` to pass `Uint8Array` keys where required.
- Fix linting error in `tests/ui/components/DeleteModal.test.mjs` by avoiding direct `.style` assignment in mock.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 00:32:11 +00:00
thePR0M3TH3AN de80e58b5d Merge pull request #2725 from PR0M3TH3AN/refactor-delete-modal-dtag-919037621417068012
Refactor DeleteModal to use shared getDTagValueFromTags utility
2026-02-26 13:04:19 -05:00
thePR0M3TH3AN 0e5e56b146 Merge branch 'unstable' into refactor-revert-modal-dtag-18208308647871133769 2026-02-26 13:04:04 -05:00
thePR0M3TH3AN c28d1e2c2b Merge pull request #2734 from PR0M3TH3AN/refactor/revert-modal-rendering-15253432646628070109
Refactor RevertModal rendering logic
2026-02-26 13:00:38 -05:00
google-labs-jules[bot]andPR0M3TH3AN feb7ad765a Refactor VideoModal to delegate comments to CommentsController
Move comment-related logic and state from VideoModal.js to CommentsController.js.
Split CommentsController into CommentsController (orchestration), CommentsListRenderer (DOM management), and CommentNodeFactory (element creation) to maintain modularity and adhere to file size limits.
Update VideoModal to initialize and destroy CommentsController correctly.
Fix minor lint issues.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:53:34 +00:00
google-labs-jules[bot]andPR0M3TH3AN 2703382ab4 Refactor RevertModal rendering logic into separate module
Extracted excessive DOM rendering logic from `RevertModal.js` into `revertModalRenderers.js`.
This improves code readability and maintainability by separating the view construction from the modal logic.
Added unit tests for the new renderers using a lightweight DOM mock.
Replaced local d-tag extraction with shared utility `getDTagValueFromTags`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:50:10 +00:00
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
google-labs-jules[bot]andPR0M3TH3AN 931f57eebe Refactor RevertModal to use shared d-tag extraction utility
- Removed duplicated `extractDTagValue` method from `js/ui/components/RevertModal.js`
- Imported and used `getDTagValueFromTags` from `js/nostr/nip71.js`
- Added unit tests for `getDTagValueFromTags` in `tests/nostr/nip71-d-tag.test.mjs`

This reduces code duplication and ensures consistent d-tag extraction logic.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:37:26 +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