Commit Graph
1700 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN fa348e7e00 refactor(nip07): make adapter dynamic to handle extension updates
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 23:23:59 +00:00
google-labs-jules[bot]andPR0M3TH3AN d48847aa5a fix(services): resolve infinite subscription loop in moderationService
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 22:24:04 +00:00
google-labs-jules[bot]andPR0M3TH3AN 3c7a396da9 refactor(auth): decouple NIP-07 logic and optimize list fetching (agent)
- Moved NIP-07 extension detection and permission logic from `NostrClient` to `nip07` provider.
- Removed redundant `login` method from `NostrClient`.
- Increased concurrency and added timeouts to `fetchListIncrementally` to prevent hanging on slow relays.
- Updated `UserBlocks` to force full fetch on cache miss, fixing "empty list" issues.
- Updated unit tests for login permissions and hashtag preferences to reflect architectural changes.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 21:48:52 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7cb603b652 fix(nostr): prevent nip-07 fallback from overwriting concurrent login
- Added a check in `ensureActiveSignerForPubkey` to verify if a valid signer (e.g. NIP-46) was registered during the extension wait period.
- Modified `nip07Permissions.js` to respect global timeout overrides for structured permission requests, fixing flaky tests.
- Added regression test `tests/nostr-signer-race.test.mjs` to simulate the race condition.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 21:19:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN a57947da0c fix(nostr): await nip-07 extension injection to resolve race conditions
This commit fixes a critical race condition where `window.nostr` might not be injected
before the app attempts to use it, causing failures in decryption (subscriptions, hashtags, DMs)
and login flows.

Changes:
- Updated `ensureExtensionPermissions` in `js/nostr/client.js` to verify `window.nostr` existence
  even when permissions are cached. If missing, it now awaits `waitForNip07Extension` instead of
  returning a false success.
- Updated `ensureActiveSignerForPubkey` in `js/nostr/client.js` to wait for the extension
  if permissions are cached but `window.nostr` is missing, ensuring a valid signer is created.

This ensures that the "Performance Analysis" optimization (skipping `enable()` calls based on cache)
does not break functionality when the extension injection is delayed.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:57:17 +00:00
thePR0M3TH3AN 91e0be0ad4 Merge pull request #1757 from PR0M3TH3AN/fix/nip07-reliability-hashtag-sync-9057175927008985329
Fix NIP-07 reliability and Hashtag sync race conditions
2026-01-26 15:41:21 -05:00
google-labs-jules[bot]andPR0M3TH3AN 5c1d1d340b fix(nostr): harden nip-07 adapter and fix hashtag sync issues
- Wrapped NIP-07 adapter extension calls in `retryNip07Call` to handle transient failures and timeouts robustly.
- Updated `HashtagPreferencesService` to autosave changes to relays immediately on modification.
- Added race condition protection in `HashtagPreferencesService.load` to prevent overwriting optimistic local updates with stale relay data.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:40:28 +00:00
google-labs-jules[bot]andPR0M3TH3AN 596bfd074a chore(ai): remove dead code (agent)
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:29:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 9d820c27e9 fix(nostr): prevent list data loss on fetch failure and optimize login timeout
- Update `fetchListIncrementally` in `js/nostr/client.js` to throw an error if all relays fail, preventing empty returns from being interpreted as data loss.
- Update `HashtagPreferencesService`, `UserBlockListManager`, and `SubscriptionsManager` to handle fetch errors gracefully without wiping local state.
- Update `js/nostr/nip07Permissions.js` to use a short timeout (3s) for experimental permission requests, fixing "clunky" login issues while preserving user interaction time for standard login.
- Remove `try/catch` in `adminListStore.js` fetch logic to allow error propagation to the fallback cache logic.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 20:16:08 +00:00
google-labs-jules[bot]andPR0M3TH3AN c81f71b6d2 fix(client): track and filter unreachable relays to prevent timeouts
Introduces `unreachableRelays` tracking in `NostrClient` to identify relays that fail connection during initialization.
Updates fetch operations (`fetchListIncrementally`, `subscribeVideos`, etc.) to use `getHealthyRelays`, filtering out known bad relays to prevent `SimplePool` timeouts (7s) from blocking the application.
This resolves slow loading and app breakage when the user's persistent configuration contains dead relays.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 19:55:05 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6a2432dd4c fix(nostr): anchor hashtag preferences fetch to local state
- Updated `NostrClient.fetchListIncrementally` to accept a `since` override.
- Updated `HashtagPreferencesService.load` to pass `since` based on local cache timestamp.
- Ensures preferences are refreshed if local state is stale or missing, overriding potentially incorrect `SyncMetadataStore` state.
- Added regression tests for `fetchListIncrementally` since parameter logic.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 19:21:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 73541168f7 fix(subscriptions): improve reliability of list loading and button responsiveness
- Implemented optimistic UI updates for the channel subscribe button to improve responsiveness.
- Fixed a race condition in `js/subscriptions.js` and `js/services/hashtagPreferencesService.js` where lists were wiped on refresh due to `profileCache.activePubkey` not being initialized in time. Now using `profileCache.getProfileData(pubkey, ...)` to ensure the correct cache entry is loaded.
- Validated with targeted unit tests.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-01-26 18:56:34 +00:00
google-labs-jules[bot] f321477455 fix(s3): remove duplicate normalizedInfoHash declaration
Removes a redundant `const normalizedInfoHash` declaration in `s3UploadService.js` that caused a `SyntaxError` and prevented the application from loading. The variable is already declared in the outer scope of the `try` block.
2026-01-26 18:29:42 +00:00
thePR0M3TH3AN 5123944a7d update 2026-01-26 13:23:11 -05:00
thePR0M3TH3AN 27b71ba9bb Revert "perf(profile): implement stale-while-revalidate for lists and messages" 2026-01-26 13:18:51 -05:00
thePR0M3TH3AN b570350412 Merge pull request #1747 from PR0M3TH3AN/improve-profile-modal-fetching-11060559516076687952
perf(profile): implement stale-while-revalidate for lists and messages
2026-01-26 13:17:25 -05:00
google-labs-jules[bot] d61074e200 perf(profile): implement stale-while-revalidate for lists and messages 2026-01-26 18:16:45 +00:00
thePR0M3TH3AN c02db755ac Refactor R2 key prefix for deterministic identifiers 2026-01-26 12:47:05 -05:00
thePR0M3TH3AN 82986650ce Store video file fingerprints alongside series IDs 2026-01-26 12:25:54 -05:00
thePR0M3TH3AN 3006a75602 Allow publish video series identifiers 2026-01-26 12:13:26 -05:00
thePR0M3TH3AN bf69acedec Merge pull request #1741 from PR0M3TH3AN/enhance-s3-storage-ui-9302963025146887048
Enhance Custom S3 Storage UI and Configuration
2026-01-26 11:56:22 -05:00
google-labs-jules[bot] 6e3562b64b feat(ui): enhance custom S3 storage configuration with helper text and force path style option
- Add helper text to the S3 storage configuration form to guide users on Endpoint URL format.
- Add 'Force Path Style' checkbox to S3 storage configuration to support MinIO and other S3-compatible providers that require it.
- Update `ProfileModalController` to toggle visibility of these new fields based on the selected provider.
- Update `ProfileModalController` to save and load the `forcePathStyle` setting.
- Update `tests/ui/storageService.test.mjs` to verify persistence of `forcePathStyle`.
2026-01-26 16:50:48 +00:00
google-labs-jules[bot] 4823486ed7 fix(playback): disable timeout and fallback when source is forced by user 2026-01-26 16:12:12 +00:00
thePR0M3TH3AN f5203ddb47 Merge pull request #1738 from PR0M3TH3AN/feat/playback-timeout-fallback-8232196413966424077
feat(playback): add configurable timeout for initial playback start
2026-01-26 10:57:07 -05:00
google-labs-jules[bot] 7921ab6a2e feat(playback): add configurable timeout for initial playback start
Introduces a race condition between the primary playback source (URL or Torrent) and a configurable timeout. If the primary source fails to reach the 'playing' state within the timeout window, the system automatically falls back to the alternative source.

- Adds `DEFAULT_PLAYBACK_START_TIMEOUT` to instance config (3000ms).
- Updates `PlaybackService` to implement timeout logic using `withTimeout` wrapper.
- Ensures proper cleanup of stalled attempts (resetting video element, destroying torrent client).
2026-01-26 15:55:11 +00:00
thePR0M3TH3AN c650597da1 Merge pull request #1737 from PR0M3TH3AN/ai/doc-nip46-client-20241026-1908093676591025314
chore(ai): document js/nostr/nip46Client.js
2026-01-26 10:37:09 -05:00
google-labs-jules[bot] 9d56dc7d0b chore(ai): doc js/nostr/nip46Client.js (agent) 2026-01-26 15:34:58 +00:00
google-labs-jules[bot] c22037a575 feat: make default playback source configurable
- Added `DEFAULT_PLAYBACK_SOURCE` to `config/instance-config.js` to allow choosing between "url" (default) and "torrent" priority.
- Updated `js/constants.js` to derive `URL_FIRST_ENABLED` flag from the configuration.
- Refactored `PlaybackService.execute()` in `js/services/playbackService.js` to robustly support "Torrent First" logic with fallback to URL, while maintaining "URL First" with fallback to Torrent.
- Added unit tests in `tests/services/playbackService_order.test.mjs` to verify playback order and fallback mechanics.
2026-01-26 15:13:56 +00:00
google-labs-jules[bot] f66a2e5245 fix(nostr): retry NIP-07 detection on timeout
Increases the robustness of NIP-07 extension detection by implementing a retry loop in `NostrClient.login`. If the initial detection (default 5s) times out, the client will retry up to 3 times with a 1-second delay between attempts, effectively handling slower injection scenarios or race conditions during page load.

- Modified `js/nostr/client.js` to wrap `waitForNip07Extension` in a retry loop.
- Validated with a reproduction test case simulating late injection.
2026-01-26 14:34:02 +00:00
google-labs-jules[bot] 603b0b1a69 test(ai): add unit tests for NostrClient and NostrService (agent) 2026-01-26 14:09:53 +00:00
thePR0M3TH3AN 802c70a0e3 Normalize block checks for author moderation 2026-01-26 08:01:40 -05:00
thePR0M3TH3AN 50ec850706 Merge pull request #1730 from PR0M3TH3AN/codex/add-unit-tests-for-r2service
R2Service: add DI for storage helpers and unit tests for bucket selection
2026-01-26 07:47:06 -05:00
thePR0M3TH3AN 84468cbed5 Add R2 bucket config tests 2026-01-26 07:46:54 -05:00
thePR0M3TH3AN 16b8656521 Fix R2 bucket resolution and add coverage 2026-01-26 07:40:23 -05:00
thePR0M3TH3AN 5759b9437a Use configured bucket for R2 verification 2026-01-26 07:37:24 -05:00
thePR0M3TH3AN ad0f58e328 Use meta bucket in R2 bucket resolution 2026-01-26 07:35:34 -05:00
thePR0M3TH3AN a1d27996f7 Handle locked R2 storage metadata 2026-01-26 07:26:52 -05:00
thePR0M3TH3AN dd363f0086 Allow any public URL for storage 2026-01-26 07:01:35 -05:00
thePR0M3TH3AN 49809c2154 Merge pull request #1717 from PR0M3TH3AN/fix-privacy-warning-timeout-863377375539024117
Add timeout to sticky privacy warnings in profile modal
2026-01-26 06:34:15 -05:00
google-labs-jules[bot] 727892c61a fix: add timeout to sticky privacy warnings in profile modal
Updates the privacy warning notifications in `ProfileModalController` to auto-dismiss after 5 seconds. This resolves an issue where warnings about direct message relays and NIP-17 delivery would persist indefinitely, requiring manual dismissal or page reload.

The fix applies `{ autoHideMs: 5000 }` to `this.showStatus` calls for:
- "Privacy warning: direct messages are using your default relays because no NIP-17 relay list is available."
- "Privacy warning: this recipient has not shared NIP-17 relays, so we'll use your default relays."
- "Privacy warning: this message used default relays because no NIP-17 relay list was found."
2026-01-26 11:33:47 +00:00
thePR0M3TH3AN 0c0addb2a1 Merge pull request #1712 from PR0M3TH3AN/ai/schema-validate-20260126-15068520206560681237
chore(ai): event schema validation tool + fixes
2026-01-26 06:22:22 -05:00
google-labs-jules[bot] 3a1ffd3688 chore(ai): event schema validation tool + fixes
- Added `scripts/agent/validate-events.mjs` to validate event builders.
- Added `GENERIC_REPOST` (kind 16) to `js/nostrEventSchemas.js` and `docs/nostr-event-schemas.md`.
- Updated `buildRepostEvent` to validate against `GENERIC_REPOST` when producing kind 16 events.
2026-01-26 05:20:43 +00:00
google-labs-jules[bot] 62dcc57e64 refactor(ai): extract EditModalController from js/app.js (agent) 2026-01-26 03:21:44 +00:00
thePR0M3TH3AN 4e71b1d320 Add R2 CORS failure context logging 2026-01-25 22:00:22 -05:00
thePR0M3TH3AN 69dc281c04 Add debug logs for upload settings presence 2026-01-25 21:57:09 -05:00
thePR0M3TH3AN e1da71b802 Include R2 identifiers in uploads 2026-01-25 21:54:17 -05:00
thePR0M3TH3AN 4373bda877 Remove deprecated quick R2 upload 2026-01-25 21:35:50 -05:00
thePR0M3TH3AN 1e2f6b989a Migrate legacy R2 settings to storage service 2026-01-25 21:33:00 -05:00
thePR0M3TH3AN 4248999294 Guard r2 settings bucket lookup 2026-01-25 21:07:54 -05:00
thePR0M3TH3AN 46161ccea2 Improve R2 CORS error guidance 2026-01-25 21:05:24 -05:00