Commit Graph
4979 Commits
Author SHA1 Message Date
thePR0M3TH3AN 446443167e Merge pull request #2157 from PR0M3TH3AN/ai/interop-tests-15938759699659615005
Add Nostr Protocol Interop Tests
2026-02-07 16:20:31 -05:00
thePR0M3TH3AN 4f13d49f66 Merge pull request #2156 from PR0M3TH3AN/telemetry-aggregator-update-15409738198546473637
Update telemetry aggregator to parse test_output.txt
2026-02-07 09:27:28 -05:00
thePR0M3TH3AN 2626024d0d Merge pull request #2155 from PR0M3TH3AN/ai/schema-validate-20250220-8797542597260908870
chore(ai): event schema validation tool + fixes
2026-02-07 09:27:17 -05:00
thePR0M3TH3AN e7a6cc2a19 Merge pull request #2154 from PR0M3TH3AN/content-docs-audit-15817802463202455501
🌐 Align /content user docs with actual upload & contribution behavior
2026-02-07 09:26:52 -05:00
thePR0M3TH3AN f3c65d1439 Merge pull request #2168 from PR0M3TH3AN/claude/fix-nostr-login-performance-KYX9y
Optimize login performance with shared decryption scheme cache
2026-02-07 09:24:47 -05:00
Claude 71c153f68d perf: speed up post-login list sync with shared decryption cache
Three performance bottlenecks were causing slow list loading after NIP-07 login:

1. Each list service (blocks, subscriptions, hashtag preferences) maintained
   its own isolated decryptionSuccessCache. When blocks decrypted with nip44_v2,
   subscriptions and hashtag preferences had no way to know — they each had to
   independently probe all schemes through the NIP-07 extension queue, tripling
   the number of extension calls during the critical login path.

2. List loading was gated on both relaysReadyPromise AND permissionPromise in
   the coordinator. Since the NIP-07 extension already grants decrypt permissions
   during loginWithExtension(), the redundant pre-grant was adding 2-5 seconds
   of unnecessary latency before any list fetching could begin.

3. The DECRYPT_RETRY_DELAY_MS was 10 seconds across all services. When a decrypt
   attempt failed transiently (extension still initializing), the retry waited
   far too long before trying again.

Changes:
- Create shared decryptionSchemeCache module used by all three list services
- Add fast-path: when shared cache knows the correct scheme, try ONLY that
  scheme before falling back to parallel Promise.any() probe
- Remove permissionPromise from the list-loading gate in authSessionCoordinator
- Reduce DECRYPT_RETRY_DELAY_MS from 10s to 3s in all three services
- Clear shared cache on logout

https://claude.ai/code/session_013QrGMnxtMTsGTPqaP35jMj
2026-02-07 13:43:15 +00:00
thePR0M3TH3AN d792570b69 Merge pull request #2163 from PR0M3TH3AN/claude/fix-hashtag-lists-XNv9d
Fix decryption error reporting and permission prompt handling
2026-02-07 08:11:40 -05:00
google-labs-jules[bot]andPR0M3TH3AN e3d9ea7e3a feat: add interoperability test script for Nostr protocol verification
- Implements `scripts/agent/interop-test.mjs` to verify Video Post, View Event, and DM flows.
- Uses `NostrClient` with ephemeral keys and a local relay.
- Ensures correct event construction via `nostrEventSchemas.js`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 07:10:56 +00:00
google-labs-jules[bot]andPR0M3TH3AN c0251965da Update telemetry aggregator to include test_output.txt
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 06:06:59 +00:00
Claude 1403d2d4cc fix: handle permission-required errors in hashtag preferences background loading
When hashtag preferences decryption fails with "permission-required" during
background loading (allowPermissionPrompt=false), the service silently returned
without setting loaded state, scheduling a retry, or emitting a change event.
This left the UI stuck showing empty hashtag lists. The subscriptions module
already handled this case correctly.

Also fix error scheme mapping in Promise.any() catch blocks for both hashtag
preferences and subscriptions — the index into the original order array was
wrong after filtering out deduplicated scheme families.

https://claude.ai/code/session_016xYxLQ1U2XVVY5rFuCRKfc
2026-02-07 05:42:24 +00:00
google-labs-jules[bot]andPR0M3TH3AN da7fc65e94 chore(ai): event schema validation tool + fixes
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 05:09:50 +00:00
google-labs-jules[bot]andPR0M3TH3AN 48af19a4a2 docs: align upload guides with current code behavior
Updates `/content/docs/guides/upload-content.md` and `/content/docs/getting-started.md` to accurately reflect the storage configuration workflow (Profile -> Storage tab), supported providers (S3/R2), and CORS requirements.

- Clarified instructions for configuring R2 vs Generic S3.
- Updated CORS configuration example with placeholder origins.
- Aligned "Configure Storage" steps with the actual UI location.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-07 02:41:35 +00:00
thePR0M3TH3AN 0c85e0ea7f Merge pull request #2153 from PR0M3TH3AN/claude/speed-up-nostr-login-47O5O
Optimize login performance with parallel decryption and increased concurrency
2026-02-06 17:30:18 -05:00
Claude 47e900ebef perf: speed up nostr login by parallelizing list sync and decryption
Login with NIP-07 extensions was extremely slow because list loading
(blocks, subscriptions, hashtag preferences) happened sequentially and
each list's decryption tried encryption schemes one at a time.

Changes:
- Load blocks, subscriptions, and hashtags in parallel instead of
  sequentially (blocks no longer blocks other lists from starting)
- Use Promise.any() to try all decryption schemes simultaneously
  instead of trying nip44_v2 → nip44 → nip04 one-by-one
- Deduplicate same-family schemes (nip44/nip44_v2) to avoid redundant
  extension calls
- Increase NIP-07 request queue concurrency from 3 to 5 to support
  parallel decrypt operations during login
- Raise no-prompt decrypt timeout from 3s/5s to 8s since extensions
  that have already granted permission still need time to decrypt
- Increase feed sync timeout from 8s to 12s to give lists more time
  to settle before rendering unfiltered content

https://claude.ai/code/session_01V6m1gTecsppPrBHQnUyPnF
2026-02-06 22:23:46 +00:00
thePR0M3TH3AN 1b6d3c1fe8 Merge pull request #2152 from PR0M3TH3AN/claude/fix-dm-watch-history-qZF3J
Optimize auth flow and moderation UI rendering
2026-02-06 16:47:30 -05:00
Claude 3a55e1bf03 fix: resolve coordinator refactoring regressions breaking DM, lists, and feed pipeline
- Remove undefined hashtagPreferencesPromise reference in handleAuthLogin
  that caused the feed sync Promise.allSettled to silently fail, preventing
  proper list/profile synchronization before grid refresh
- Add missing getModerationSettings and getActiveProfilePubkey dependency
  injection to authSessionCoordinator, fixing crashes during logout
  moderation reset and profile switch pubkey resolution
- Parallelize NIP-07 permission request with relay readiness instead of
  gating list loading behind it; parallelize subscriptions and hashtag
  preference loading (independent of each other, only blocks must sequence)
- Add native run() alias to feedEngine so callers don't rely solely on
  the applicationBootstrap compatibility shim
- Remove redundant refreshVisibleModerationUi call from renderVideoList
  that re-decorated every video immediately after decoration
- Avoid re-normalizing moderation settings on every getActiveModerationThresholds
  call when settings are already an object

https://claude.ai/code/session_01FCosieUXjEn95KtUeyGemY
2026-02-06 21:42:49 +00:00
thePR0M3TH3AN 31c99f06e6 Merge pull request #2151 from PR0M3TH3AN/claude/refactor-app-coordinators-vwgBe
Refactor Application into coordinator modules
2026-02-06 16:00:38 -05:00
Claude 41a12669f6 refactor: extract Application method clusters into coordinator modules
Move cohesive method groups out of the monolithic Application class
(js/app.js, ~10K lines) into five coordinator modules under js/app/:

- feedCoordinator: feed registration, runtime building, refresh,
  video loading, URL-health helpers, and feed telemetry
- playbackCoordinator: URL-first + magnet fallback pipeline, probing,
  torrent status intervals, and video timestamp resolution
- authSessionCoordinator: signer lifecycle, profile switching,
  relay/block/wallet management, and cleanup
- modalCoordinator: modal open/close, view-count subscriptions,
  watch-history metadata, and playback logging
- moderationCoordinator: moderation settings, video decoration,
  override/block/hide action routing

Each coordinator factory receives injected dependencies instead of
importing globals. Application retains thin delegator methods so all
public call-sites remain unchanged. Coordinator initialisation is
idempotent (via _initCoordinators) and supports both constructor-based
and Object.create()-based instantiation used by test harnesses.

All existing unit tests, lint checks, and syntax validation pass.

https://claude.ai/code/session_01C3PKJTCdavsGbk5jjC85EB
2026-02-06 20:47:10 +00:00
thePR0M3TH3AN 2dc4d7e4ff Merge pull request #2149 from PR0M3TH3AN/ai/load-test-20260206-11143403756697545779
feat: add load test script
2026-02-06 14:56:46 -05:00
thePR0M3TH3AN 4497d4327d Merge pull request #2150 from PR0M3TH3AN/claude/fix-dm-block-mute-awF1A
Add DM block/mute filtering to prevent messages from blocked users
2026-02-06 14:43:58 -05:00
Claude 416a809ae4 fix: apply block/mute list filtering to DM messages and conversations
The user's block/mute list (NIP-51) was not being checked when
processing direct messages, allowing blocked users' messages to appear
in conversations, trigger notifications, and increment unseen counts.

This adds block filtering at four layers:
- nostrService.applyDirectMessage: drops incoming DMs from blocked users
  before they enter the in-memory message cache
- nostrService.persistDirectMessageRecord: prevents blocked DM senders
  from being persisted to IndexedDB or triggering notifications
- profileModalController.buildDmConversationData: filters blocked users
  from the conversation list UI (catches pre-block persisted messages)
- applicationBootstrap: excludes blocked-user conversations from the
  unread DM badge count

The block checker is injected via setDmBlockChecker() to keep
nostrService decoupled from userBlocks, wired up in app.js init().

https://claude.ai/code/session_01EAVLtAM14GN99Eik8otLg2
2026-02-06 19:41:50 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6caf650d52 feat(scripts): add load test script for relay stress testing
- Implements `scripts/agent/load-test.mjs` to simulate N clients publishing mixed events.
- Adds `test:load` script to `package.json`.
- Measures roundtrip latency and client-side signing time.
- Generates JSON report in `artifacts/`.
- Includes `--mock` mode for verification without external relay.
- Enforces guardrails against public relay usage.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 19:31:00 +00:00
thePR0M3TH3AN 3d9cbe1c08 Merge pull request #2148 from PR0M3TH3AN/claude/fix-subscription-list-loading-9Om53
Improve subscription loading resilience and retry logic
2026-02-06 14:25:54 -05:00
Claude 8a9750002d fix: improve subscription list loading reliability and error recovery
The subscription list was failing to load correctly during login because:

1. Permission-required decryption errors silently returned without setting
   loaded=true or scheduling a retry, leaving subscriptions permanently
   stuck in a loading state.

2. Generic decryption failures (all schemes exhausted) had no retry path,
   unlike timeout errors which already scheduled retries.

3. The ensureLoaded timeout (30s) was too tight for the worst-case
   pipeline of relay fetch (12s) + decryption (20s) = 32s, causing
   premature timeouts that left loaded=false.

4. The loadingPromise was cleared in a finally block even when the loader
   was still in-flight after a timeout, allowing duplicate concurrent
   loads that could race against each other.

Changes:
- Handle permission-required errors like timeout errors: set loaded=true,
  schedule a retry (with allowPermissionPrompt: true), emit change event
- Schedule decrypt retries for all decrypt failure paths
- Increase ensureLoaded timeout from 30s to 45s
- Mark loaded=true on ensureLoaded timeout so the UI can proceed
- Clean up loadingPromise via loader.then() instead of finally block,
  preventing duplicate loads when the first is still in-flight

https://claude.ai/code/session_015MhPiSWNa7dm4UaRuq5x4U
2026-02-06 19:23:36 +00:00
thePR0M3TH3AN a1dd75591b Merge pull request #2147 from PR0M3TH3AN/update-known-issues-lint-cleanup-18181985090645434
Update Known Issues and Cleanup Stale Lint Report
2026-02-06 13:50:38 -05:00
google-labs-jules[bot]andPR0M3TH3AN 3fd19e0bf0 chore: update known issues and remove stale lint report
- Updates KNOWN_ISSUES.md to reflect current status of unit tests and document skipped tests.
- Removes LINT_ISSUES.md as the reported lint failure (767.98px token) is no longer present.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 18:24:19 +00:00
thePR0M3TH3AN 0e828e29c3 Merge pull request #2146 from PR0M3TH3AN/docs-remove-presigned-manifest-mode-1567500302751795913
📘 Align development docs with codebase behavior
2026-02-06 12:19:27 -05:00
thePR0M3TH3AN 47e7196be8 Merge pull request #2145 from PR0M3TH3AN/perf/optimize-explore-diversity-sorter-17286241045936615177
⚡ Optimize explore diversity sorter performance
2026-02-06 12:18:33 -05:00
google-labs-jules[bot]andPR0M3TH3AN 6f95000703 docs: remove unsupported presigned manifest upload mode
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 17:04:35 +00:00
google-labs-jules[bot]andPR0M3TH3AN 16458d1bc2 perf: Optimize explore diversity sorter
- Pre-calculate normalized vector norms to avoid O(N^2) recalculation.
- Pre-calculate normalized scores to avoid redundant property access and normalization.
- Combine selection loops to reduce iteration overhead.
- Modify cosineSimilarity to use dot product on normalized vectors.

Benchmark (1000 items): ~240ms -> ~152ms (~37% improvement).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 16:49:55 +00:00
thePR0M3TH3AN 9a6c305e9a Merge pull request #2144 from PR0M3TH3AN/content-docs-audit-7564546966826799255
🌐 Align /content user docs with actual upload & contribution behavior
2026-02-06 07:12:56 -05:00
google-labs-jules[bot]andPR0M3TH3AN 4dc3691974 Align /content user docs with actual upload & contribution behavior
Updated `content/docs/guides/upload-content.md` and `content/docs/getting-started.md` to accurately reflect the application's runtime behavior, specifically regarding upload workflows, CORS configuration, and routing links.

- Clarified CORS instructions to distinguish between R2 (manual) and S3 (auto) configuration.
- Updated example origins to be more generic (localhost).
- Explicitly mentioned the "Hashtags" section in the upload form.
- Clarified navigation to the Storage tab.
- Fixed the broken link to the Watch History view (using hash routing).
- Removed unsupported "captions" from the metadata list.
- Validated changes using `tests/docs/verify-upload-claims.test.mjs`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 03:05:56 +00:00
thePR0M3TH3AN d27952ad68 Merge pull request #2143 from PR0M3TH3AN/fix-decryption-timeouts-9346185409394997100
Fix decryption timeouts and listener warnings
2026-02-05 21:24:54 -05:00
google-labs-jules[bot]andPR0M3TH3AN 849e00a2ff fix: resolve decryption timeouts and listener warnings
Increases NIP-07 concurrency to 3 and lowers priority for non-critical decryption tasks to prevent blocklist timeouts. Increases relay max listeners to 200 to mitigate warnings.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 02:00:56 +00:00
thePR0M3TH3AN b8143435a3 Merge pull request #2142 from PR0M3TH3AN/fix/nostr-login-private-list-sync-6836921498389272758
Fix NIP-07 private list sync performance and reliability
2026-02-05 20:45:18 -05:00
google-labs-jules[bot]andPR0M3TH3AN a375b8336b Fix slow/failing NIP-07 private-list sync & decryption
- Implemented concurrent queue for NIP-07 requests (max 2)
- Added pre-authorization step at login to prevent redundant prompts
- Sequentialized critical list loading (blocks, subscriptions)
- Optimized decryption with result caching and high priority for critical lists
- Fixed MaxListenersExceededWarning by increasing relay listener limit
- Added concurrency tests

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 01:26:41 +00:00
thePR0M3TH3AN 1dbac77753 update from claude 2026-02-05 19:31:19 -05:00
thePR0M3TH3AN 51a34b046a Merge pull request #2140 from PR0M3TH3AN/fix-moderation-fixture-visibility-check-4053965773964474745
fix(tests): resolve visibility check failure in moderation fixture
2026-02-05 19:29:06 -05:00
google-labs-jules[bot]andPR0M3TH3AN e5a49e79ed fix(tests): replace hex color to satisfy linter
Replace `#eee` with `lightgray` in `tests/visual/moderation.spec.ts` to comply with the project's no-hex-colors linting rule (except for allowed files). This style is injected only for test stability in headless environments.

Fixes CI failure in `lint:hex`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 00:19:36 +00:00
google-labs-jules[bot]andPR0M3TH3AN 55571c1c0d fix(tests): resolve visibility check failure in moderation fixture
Inject critical CSS styles in moderation fixture tests to prevent layout collapse in headless environments where external CSS loading might be delayed or fail to apply correctly. This ensures elements have dimensions before visibility checks run.

Additionally, update `waitForFixtureReady` to robustly wait for at least one visible card with non-zero dimensions, rather than assuming all cards are visible (as some fixtures start hidden).

Fixes: #moderation-fixture-visibility

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-06 00:13:06 +00:00
thePR0M3TH3AN 930c730557 Merge pull request #2139 from PR0M3TH3AN/claude/nostr-relay-sync-login-eezJv
Optimize login flow: parallelize list loading with relay readiness
2026-02-05 19:00:03 -05:00
Claude 8a335c2ec8 Fix slow Nostr list sync by decoupling from profile and awaiting before feed render
The login-to-feed pipeline had several issues causing lists (blocks,
subscriptions, hashtag preferences) to load too slowly or not reflect
in the feed:

1. All list loading was chained after profileStatePromise, adding
   2.5-6s of unnecessary delay. Lists only need relay URLs, not profile
   data. Now they chain off relaysReadyPromise instead, loading in
   parallel with profile fetching.

2. The video grid refreshed immediately without waiting for any lists,
   so the feed briefly displayed unfiltered content. Now the grid refresh
   waits (up to 8s) for critical feed-filtering lists to settle.

3. Hashtag preferences weren't cached into the snapshot before the feed
   rendered, so interests/disinterests were empty on first paint.

4. Subscription ensureLoaded had a 6s timeout that was too aggressive
   for relay fetch (12s) + decryption (3-12s), causing silent failures.
   Increased to 30s.

5. Subscription relay fetches for user and session actor ran sequentially.
   Now they run in parallel via Promise.all.

https://claude.ai/code/session_01UKmTWb83AnQPRVQo3bKZqm
2026-02-05 23:55:50 +00:00
thePR0M3TH3AN a6b9803a54 Merge pull request #2138 from PR0M3TH3AN/fix/moderation-fixture-visibility-3216243228017029847
Fix visibility check failure for trusted report hide fixture
2026-02-05 18:33:37 -05:00
thePR0M3TH3AN 9c396ad6c9 Merge branch 'unstable' into fix/moderation-fixture-visibility-3216243228017029847 2026-02-05 18:24:38 -05:00
thePR0M3TH3AN 0b09e146ef Merge pull request #2136 from PR0M3TH3AN/fix-moderation-fixture-click-timeout-1667716654204123300
Fix moderation fixture click timeout and enable disabled test steps
2026-02-05 18:24:16 -05:00
thePR0M3TH3AN e9f2cd66c3 Merge branch 'unstable' into fix/moderation-fixture-visibility-3216243228017029847 2026-02-05 18:19:51 -05:00
thePR0M3TH3AN 704ee5f29d Merge branch 'unstable' into fix-moderation-fixture-click-timeout-1667716654204123300 2026-02-05 18:18:51 -05:00
thePR0M3TH3AN 7d30dedf1b Merge pull request #2137 from PR0M3TH3AN/fix-moderation-test-visibility-6633763958860183568
Fix flaky visibility check in moderation fixture test
2026-02-05 18:18:09 -05:00
thePR0M3TH3AN 1f6c857dbf Merge branch 'unstable' into fix-moderation-test-visibility-6633763958860183568 2026-02-05 18:18:02 -05:00
thePR0M3TH3AN f914b4f2de Merge pull request #2135 from PR0M3TH3AN/fix-moderation-fixture-click-timeout-6604549089296585406
Fix moderation fixture click timeout
2026-02-05 18:17:43 -05:00