Commit Graph
3880 Commits
Author SHA1 Message Date
google-labs-jules[bot] 94cafc26ab Fix storage credentials persistence on profile switch
This change ensures that cloud storage credentials are not leaked between Nostr profiles when switching accounts in the UI.

Changes:
- Imported `storageService` in `js/app.js` to enable the `bitvid:auth-changed` event listener to correctly lock the previous profile's storage session.
- Updated `ProfileModalController.populateStoragePane` to explicitly clear the storage form before loading new data.
- Enhanced `ProfileModalController.handleClearStorage` to fully reset the form state, including the provider selection and visibility toggles.

Verified with a reproduction script (`reproduce_storage_isolation.mjs`) that `StorageService` correctly isolates data by pubkey at the backend level. The UI fixes address the frontend persistence issue.
2026-01-25 18:32:46 +00:00
thePR0M3TH3AN 399f57a9a9 Merge pull request #1685 from PR0M3TH3AN/fix-storage-unlock-profile-switch-5219038763657167414
Fix storage unlock failure when switching profiles
2026-01-25 13:09:58 -05:00
google-labs-jules[bot] d50110f685 fix(storage): validate signer identity before unlocking storage
Prevents storage unlock failures and security risks when switching profiles by verifying that the active signer's public key matches the target profile. This ensures users are prompted to switch accounts in their NIP-07 extension if a mismatch occurs.

Fixes an issue where switching profiles caused the storage tab to break due to using the wrong decryption key.
2026-01-25 18:09:28 +00:00
thePR0M3TH3AN bdb7c88f3f Merge pull request #1684 from PR0M3TH3AN/enable-custom-s3-option-1398486658476996920
Enable Custom S3 Storage Option
2026-01-25 13:06:39 -05:00
google-labs-jules[bot] 50acab55fc feat: Enable Custom S3 storage provider option
Replaces the disabled 'S3 Compatible' placeholder with an active 'Custom S3' option in the profile modal storage settings. This maps to the 'generic_s3' provider which is already supported by the backend logic.

- Updated `components/profile-modal.html` to enable the option.
- Verified via script and visual inspection (headless screenshot).
- Verified existing tests pass.
2026-01-25 18:05:41 +00:00
thePR0M3TH3AN 9582c3e61f Merge pull request #1682 from PR0M3TH3AN/fix-storage-default-connections-7359024264233326996
Fix multiple default storage connections issue
2026-01-25 12:59:45 -05:00
thePR0M3TH3AN 78b535d9ce Merge pull request #1683 from PR0M3TH3AN/fix-thumbnail-cache-login-7009530366255554386
Fix thumbnail cache clearing on login
2026-01-25 12:59:25 -05:00
google-labs-jules[bot] 31751579a3 Fix: prevent thumbnail cache from being cleared on empty video lists
This commit addresses an issue where thumbnail images would "drop" (disappear/flicker) upon login or re-initialization of the video list.

Changes:
- Modified `js/ui/views/VideoListView.js` to add a guard clause in `cleanupThumbnailCache`.
- The function now returns early if the provided `videos` list is empty, preserving the existing `loadedThumbnails` cache during transient loading states.

Verification:
- Created a reproduction script (`reproduce_issue.mjs`) that confirmed the cache was being cleared on empty input.
- Verified the fix with the same script, ensuring the cache is preserved.
- Verified no regression in `npm run lint:hex` and `npm run lint:inline-styles`.
2026-01-25 17:44:21 +00:00
google-labs-jules[bot] ea026552ce Fix: Enforce single default storage connection
Previously, `StorageService.saveConnection` allowed multiple connections to be marked as `defaultForUploads: true` because it did not unset the flag on existing connections. This caused `loadFromStorage` (which uses `find`) to potentially pick up an old, invalid connection instead of the newly configured one, leading to a loop where the user is asked to configure credentials again.

This change modifies `saveConnection` to iterate through existing connections and unset `defaultForUploads` if the new connection is being saved as the default. This ensures the "default" invariant is maintained.

Added a unit test case to verify this behavior.
2026-01-25 17:40:16 +00:00
thePR0M3TH3AN e162ee355d Merge pull request #1681 from PR0M3TH3AN/fix-nip07-timeout-125771448135618428
Increase NIP-07 extension detection timeout
2026-01-25 12:05:00 -05:00
google-labs-jules[bot] ecef84f2d8 fix: increase NIP-07 extension timeout to 5000ms
Increases the default wait time for NIP-07 extension injection from 1.5s to 5s.
This resolves timeout errors for users on slower connections or devices where
the extension takes longer to inject `window.nostr`.

Verified with a reproduction script that simulates delayed injection.
2026-01-25 17:04:28 +00:00
thePR0M3TH3AN 02e078264b Merge pull request #1679 from PR0M3TH3AN/ai/fuzz-tests-20241121-5061817015810019596
Add fuzz testing scripts for Nostr schemas, DM decryptor, and magnet utils
2026-01-25 11:51:54 -05:00
thePR0M3TH3AN 6c63ea1a0f Merge pull request #1678 from PR0M3TH3AN/update-readme-storage-docs-11053884227444764200
Update README and Storage Docs
2026-01-25 11:51:30 -05:00
thePR0M3TH3AN 31a03e81b3 Merge pull request #1680 from PR0M3TH3AN/fix-nip07-login-race-18287588969415200256
Fix NIP-07 login race condition
2026-01-25 11:38:08 -05:00
google-labs-jules[bot] b980f3a9ba Fix NIP-07 login by waiting for extension injection
Implemented `waitForNip07Extension` polling in `js/nostr/client.js` to address race conditions where `window.nostr` is not immediately available.
Updated `js/nostr/nip07Permissions.js` with the polling logic and added unit tests.
2026-01-25 16:34:07 +00:00
thePR0M3TH3AN 001f090af7 Merge pull request #1677 from PR0M3TH3AN/ds-audit/2026-01-25-3633434911679271685
Daily Design System Audit Remediation
2026-01-25 11:29:09 -05:00
google-labs-jules[bot] f2d3650873 Add fuzz robustness tests for nostr schemas, dm decryptor, and magnet utils
- Created `scripts/agent/fuzz-utils.mjs` with shared random data generators.
- Created `scripts/agent/fuzz-nostrEventSchemas.mjs` to fuzz event builders and validators, including `sanitizeAdditionalTags`.
- Created `scripts/agent/fuzz-dmDecryptor.mjs` to fuzz DM decryption with mocked decryptors and custom reproducer generation.
- Created `scripts/agent/fuzz-magnetUtils.mjs` to fuzz magnet URI normalization.
- Verified that all fuzz targets run without crashes.
- Saved execution reports to `artifacts/`.
2026-01-25 16:13:23 +00:00
thePR0M3TH3AN f40b067d86 update 2026-01-25 11:01:11 -05:00
google-labs-jules[bot] 099d218a33 Update README and storage docs with static client and S3 mode info
- Updated README.md to state bitvid is a static client.
- Added supported S3 upload modes to README.md and docs/storage-tab-design.md.
- Added security warnings about browser-held keys.
- Updated docs/storage-r2.md to contextually place R2 integration.
- Updated scripts/check-hex.js to ignore ai/** to fix lint failure.
2026-01-25 16:00:51 +00:00
google-labs-jules[bot] f9be022253 Perform Daily Design System Audit (2026-01-25)
- Fix Tailwind color violations in `js/ui/components/EmbedPlayerModal.js` by using semantic tokens.
- Add `js/embed.js`, `tests/unit/embed-accent.test.mjs`, and `tests/visual/embed-layout.spec.ts` to `scripts/check-hex.js` allowlist as they have legitimate hex usage (fallback/tests).
- Add `js/embed.js` and `js/ui/components/VideoModal.js` to `scripts/check-inline-styles.mjs` allowlist as they use sanctioned dynamic styles.
- Verified all lint checks pass with `scripts/daily-design-system-audit.mjs`.

Report:
Headline: ✓ No violations
2026-01-25 16:00:21 +00:00
thePR0M3TH3AN c99a00993a Merge pull request #1676 from PR0M3TH3AN/ai/doc-nostr-client-20250212-10623091702389088402
chore(ai): document js/nostr/client.js
2026-01-25 10:51:46 -05:00
thePR0M3TH3AN 5aa4dd14ba Merge pull request #1675 from PR0M3TH3AN/ai/docs-update-YYYYMMDD-4776788901166911926
Update documentation for contributors and quickstart
2026-01-25 10:51:20 -05:00
thePR0M3TH3AN 6822fb9e9d Merge pull request #1674 from PR0M3TH3AN/ai/lint-20260125-9985637447103613042
chore(ai): apply formatting/lint autofixes
2026-01-25 10:50:41 -05:00
thePR0M3TH3AN ba1b6b1d78 Merge pull request #1673 from PR0M3TH3AN/ai/reproducers-known-issues-20250222-14423649846906263096
Add minimal reproducers for known issues
2026-01-25 10:50:11 -05:00
thePR0M3TH3AN 1908dfe8db Merge pull request #1671 from PR0M3TH3AN/ai/deps-security-scan-16274800310085154888
Security Scan and Dependency Analysis
2026-01-25 10:48:09 -05:00
thePR0M3TH3AN 3a599e3ad5 Merge pull request #1670 from PR0M3TH3AN/ai/onboarding-20231026-1317313232699865149
docs(ai): improve onboarding steps
2026-01-25 10:47:23 -05:00
thePR0M3TH3AN de470d7e43 Merge pull request #1669 from PR0M3TH3AN/ai/interop-tests-20250523-5080573414385366993
feat: Add Nostr interop test script with local relay
2026-01-25 10:46:50 -05:00
thePR0M3TH3AN e4a4216fae Merge pull request #1668 from PR0M3TH3AN/telemetry-aggregation-script-13541382405670106865
feat(ai): telemetry aggregation script
2026-01-25 10:46:10 -05:00
google-labs-jules[bot] c026a8cc45 chore(ai): doc js/nostr/client.js (agent) 2026-01-25 15:43:39 +00:00
thePR0M3TH3AN 06550ef007 Merge pull request #1667 from PR0M3TH3AN/ai/schema-validate-20231026-12531232348450891371
chore(ai): event schema validation tool + fixes
2026-01-25 10:42:14 -05:00
thePR0M3TH3AN e6518f8ab4 Merge pull request #1666 from PR0M3TH3AN/ai/refactor-share-nostr-20260125-14923769825350051949
refactor(ai): extract ShareNostrController from js/app.js
2026-01-25 10:39:24 -05:00
google-labs-jules[bot] 726ef24e4d docs(ai): update quickstart and contributing (agent) 2026-01-25 14:26:24 +00:00
google-labs-jules[bot] e18a6a062c chore(ai): format sources (agent) 2026-01-25 13:43:02 +00:00
google-labs-jules[bot] bda4a63bc0 feat(ai): add minimal reproducers for known issues (agent)
Add minimal Playwright reproducers for:
- Popover demo 404 error (missing module)
- Sidebar layout regression on mobile
- Video Modal height regression on mobile

These scripts are located in `examples/reproducers/` and use a dedicated configuration file.
2026-01-25 12:24:05 +00:00
google-labs-jules[bot] 94f3aa59df chore(ai): security scan and dependency issues
- Generated artifacts/npm-audit.json
- Generated artifacts/npm-outdated.json
- Created issue drafts in artifacts/issues/ for blocked/major upgrades:
  - nostr-tools (Blocked by policy)
  - cross-env (Major v10)
  - tailwindcss (Major v4)
  - jsdom (Major v27)
  - esbuild (Major v0.27)
2026-01-25 09:29:59 +00:00
google-labs-jules[bot] 93b3434145 docs(ai): improve onboarding steps (agent)
- Audit onboarding process (`npm ci`, build, lint).
- Fix hex color lint failures by updating `scripts/check-hex.js` ignore list.
- Fix inline style lint failures by updating `scripts/check-inline-styles.mjs` allowlist.
- Fix raw tailwind colors in `js/ui/components/EmbedPlayerModal.js` by using semantic tokens.
- Add `ai/onboarding-report.md` detailing the audit.
2026-01-25 08:25:42 +00:00
google-labs-jules[bot] 70e63ca922 feat(test): add interop-test.mjs for Nostr integration testing
- Implements `scripts/agent/interop-test.mjs` to validate Nostr protocol interoperability.
- Uses `simple-relay.mjs` to spin up a local test relay (no public relay spam).
- Generates ephemeral keys for each run using `nostr-tools`.
- Verifies `VIDEO_POST` (Video Note) publishing and fetching.
- Verifies `VIEW_EVENT` publishing.
- Verifies Direct Message (DM) sending and listing (decryption).
- Polyfills browser globals (WebSocket, crypto, localStorage, IndexedDB) for Node.js execution.
2026-01-25 07:51:08 +00:00
google-labs-jules[bot] bfa333849a feat(ai): implement privacy-preserving telemetry aggregator script
- Enhance `scripts/agent/telemetry-aggregator.mjs` to parse TAP formatted unit test logs (e.g., `test_unit_debug.log`).
- Add logic to identify and group errors by stack trace fingerprint.
- Implement PII sanitization for IPs, emails, and keys.
- Generate a Markdown report in `ai/reports/` with prioritized issues.
- Generate a JSON artifact in `artifacts/` for machine consumption.
- Ensure telemetry is opt-in via `ENABLE_TELEMETRY` env var.
- Produce initial telemetry report `ai/reports/telemetry-20260125.md`.
2026-01-25 06:36:09 +00:00
google-labs-jules[bot] 5790b6e7c1 chore(ai): event schema validation tool + fixes
- Created `scripts/agent/validate-events.mjs` to validate all event builders.
- Fixed `buildViewEvent` to generate a fallback `d` tag for kind 30079 compliance.
- Relaxed `REPOST` schema validation to allow empty content (blind reposts), per NIP-18.
- Updated `docs/nostr-event-schemas.md` to reflect schema changes.
2026-01-25 05:29:32 +00:00
google-labs-jules[bot] 4c93080baa refactor(ai): extract ShareNostrController from js/app.js (agent) 2026-01-25 03:34:10 +00:00
thePR0M3TH3AN 7afe811b1f Merge pull request #1665 from PR0M3TH3AN/fix-video-modal-css-conflict-18316255251114241385
Fix video player modal layout by removing conflicting CSS overrides
2026-01-24 22:16:13 -05:00
google-labs-jules[bot] d06a4298ee fix(ai): remove video modal css overrides breaking layout (agent)
This change removes a block of CSS in `css/tailwind.source.css` that was incorrectly applying `!important` layout overrides to the main video modal (`.video-modal__*`, `#modalVideo`), causing visual regressions. These overrides were likely intended for the embed view but were scoped too broadly. `embed.html` uses distinct selectors and remains unaffected, as verified by visual tests.

- Removed destructive `!important` rules for `.video-modal__*` and `#modalVideo`.
- Preserved `.bv-logo__accent` theming rule.
- Rebuilt CSS.
2026-01-25 02:57:50 +00:00
thePR0M3TH3AN 7f38c4597b Merge pull request #1664 from PR0M3TH3AN/feature/s3-manifest-upload-v2-12799695231766651880
Support S3 Presigned Multipart Manifest Upload
2026-01-24 21:45:28 -05:00
google-labs-jules[bot] a33092fc47 feat(upload): support presigned multipart manifest for S3 uploads
- Updated `js/s3-quick.js` to support new manifest structure: `{ bucket, key, uploadId, parts: [{partNumber, url}] }`.
- Added logic to sort parts, upload chunks, collect ETags, and call `completeUrl` if present.
- Updated `js/ui/components/UploadModal.js` to handle manifest flow, validate new structure, and alert user if completion is manual (missing `completeUrl`).
- Updated `components/upload-modal.html` with new placeholder example and documentation note.
- Verified logic with reproduction script and UI with Playwright.
2026-01-25 02:44:49 +00:00
thePR0M3TH3AN 7132a80709 Merge pull request #1663 from PR0M3TH3AN/fix-pushstate-origin-977125356888089584
fix: prevent SecurityError in pushState when playing video on local origin
2026-01-24 21:39:21 -05:00
google-labs-jules[bot] ee0af68bfd fix: prevent SecurityError in pushState when playing video on local origin
When running the application locally (e.g., `127.0.0.1:5500`) but using a production configuration (`BITVID_WEBSITE_URL` pointing to `bitvid.network`), `playVideoByEventId` would attempt to `pushState` with the production URL. This triggers a browser `SecurityError` due to the origin mismatch, preventing the video modal from opening.

This change adds a check to normalize the `pushUrl`. If the target URL's origin differs from the current window's origin, it falls back to a relative path using `window.location.pathname` combined with the target's search parameters and hash. This ensures `pushState` always receives a safe, same-origin URL regardless of the environment configuration.
2026-01-25 02:33:30 +00:00
thePR0M3TH3AN 4560ca3ca6 Merge pull request #1662 from PR0M3TH3AN/fix-video-modal-display-17175209581181206635
Fix video player modal visibility by removing conflicting CSS rule
2026-01-24 21:19:25 -05:00
google-labs-jules[bot] 8de33b7cb1 fix(ui): remove display:none from #playerModal selector to fix modal visibility
The #playerModal ID selector in `css/tailwind.source.css` incorrectly set `display: none`. This ID selector has higher specificity than the `.hidden` utility class (applied by Tailwind) used by `VideoModal.js` to toggle visibility.

When `VideoModal.js` removed the `.hidden` class to show the modal, the ID selector's `display: none` remained active, keeping the modal hidden.

Also removed the `#playerModal.flex` rule as `.bv-modal` already provides flex behavior.

This fixes the issue where clicking a video card would trigger the logic but fail to display the player.
2026-01-25 02:16:32 +00:00
thePR0M3TH3AN feef662bf8 Merge pull request #1661 from PR0M3TH3AN/feat/s3-quick-upload-4202021437560592801
Add S3 quick upload with presigned manifest support
2026-01-24 20:42:50 -05:00
google-labs-jules[bot] adad6a07a4 feat: Add S3 quick upload with presigned manifest support
- Add `js/s3-quick.js` with `uploadWithManifest` and `uploadWithKeys`.
- Update `components/upload-modal.html` to add "Use presigned manifest" toggle and warning.
- Update `js/ui/components/UploadModal.js` to wire up the manifest upload flow.
- Add local persistence for quick S3 settings (though mainly handled by existing storage settings).
- Ensure keys are only used for client-side uploads or replaced by manifest flow.
2026-01-25 01:38:41 +00:00