Commit Graph

13591 Commits

Author SHA1 Message Date
Claude ec92a82e4e fix(nests): pin the interop harness's moq-relay to the version moq-auth expects
The local Docker interop stack builds moq-relay from a `./moq` checkout
that NostrNestsHarness cloned at unpinned `main` (~0.10.25+), while
nostrnests's moq-auth sidecar mints tokens for moq-relay 0.10.10 — the
version nostrnests pins in their own nests-relay/Dockerfile.relay. The
JWKS/JWT-signature handling drifted across those releases, so the relay
rejected every connection with `failed to decode the token` even though
the QUIC/TLS/WebTransport handshake completed cleanly.

Pin DEFAULT_MOQ_REVISION to the moq-relay-v0.10.10 release tag so the
harness builds the relay moq-auth was written against, and fetch tags so
the tag is checkout-able on a pre-existing clone.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 22:51:37 +00:00
Claude 692a385f5b diag(nests): include the resolved socket target in handshake failures
A stalled/failed QUIC handshake gave no hint whether the socket connected
over IPv4 or fell into the ::1 blackhole. The HandshakeFailed messages
now carry `socket=<addr>:<port> sni=<host>` so the failure itself shows
which address resolvePreferIpv4 picked.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 22:02:27 +00:00
Claude 6a60918cc6 fix(nests): connect over a resolved IPv4 address while keeping hostname SNI
After switching the dev harness to `localhost`, the QUIC handshake still
stalled and the relay logged nothing at all — packets weren't reaching
it. `localhost` resolves to ::1 first on most systems, and IPv6 loopback
isn't reliably routable (Docker's IPv6 UDP port-forwarding silently
blackholes), so the UDP socket was connecting into a hole.

QuicWebTransportFactory.connect now resolves the authority host to a
concrete address preferring IPv4 for the UDP socket target, while still
passing the original hostname as the TLS SNI server name — so SNI keeps
matching the server certificate and stays a legal RFC 6066 host_name.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 21:51:35 +00:00
Claude ed1f10c071 fix(quic): omit IP-literal SNI, bound the handshake, fix dev harness host
Three findings from the local nests interop hang (relay logged "Illegal
SNI extension: ignoring IP address presented as hostname"):

- TlsClientHello sent the connect host verbatim as TLS SNI, including
  IP literals. RFC 6066 §3 forbids IP literals in server_name; a strict
  relay (rustls) discards the extension, ends up with no SNI to select
  its certificate on, and the handshake stalls. Both ClientHello
  builders now omit server_name when the host is an IP literal
  (new isIpLiteralHostname predicate).

- QuicWebTransportFactory.connect never bounded awaitHandshake() — only
  readConnectResponse had a timeout — so a stalled handshake hung
  connect() indefinitely. It now fails fast after connectTimeoutMillis
  with a message naming the likely cause.

- NostrNestsHarness pointed moqEndpoint at 127.0.0.1, which forced the
  IP-literal SNI path against the dev relay. Switched to localhost: a
  valid hostname that matches the relay's generated dev cert and still
  resolves to loopback.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 21:41:07 +00:00
Claude 806d357569 diag(nests): explain why a WebTransport CONNECT failed instead of bare :status=0
QuicWebTransportFactory threw `:status=0` for every distinct CONNECT
failure mode — relay never answered, relay FIN'd the request bidi with
no H3 response, relay sent a HEADERS frame lacking :status, or the whole
connection was torn down by a CONNECTION_CLOSE. The four cases need
different fixes but produced identical, undiagnosable errors.

readConnectResponse now records bytes/H3-frames seen on the request
stream and reports which of those cases occurred; the thrown exception
also carries a connection-state snapshot (conn.status, closeReason,
closeErrorCode, requestStreamClosed) captured before driver.close(), so
a relay CONNECTION_CLOSE (e.g. H3_SETTINGS_ERROR from a rejected SETTINGS
frame) is distinguishable from a request-stream-only close.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 21:23:24 +00:00
Claude 6b8467bde3 test(nests): measure end-to-end send→arrival audio latency in interop sweeps
SendTraceScenario already swept framesPerGroup and recorded per-frame
send durations + arrival wall-times, but never correlated them — so it
could verify frame delivery but not the send-side latency a listener
perceives. Record each frame's send wall-clock timestamp and derive the
true send→arrival latency (time-to-first-frame + p50/p99/min/max) per
subscriber. With framesPerGroup > 1 this surfaces the batching window
(~framesPerGroup * cadence) as the latency floor.

Add framesPerGroup=10 and =50 (the production default) sweep entries to
both the prod and local-harness suites so the batching-vs-latency
tradeoff curve is visible in one run.

https://claude.ai/code/session_01PoQupfdoKU3ryQwLwTeXeM
2026-05-14 20:46:27 +00:00
Vitor Pamplona 5f89648c54 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2026-05-14 15:42:22 -04:00
Vitor Pamplona bb934cfc07 Fixing nests scrolling bar 2026-05-14 15:40:47 -04:00
Vitor Pamplona f2068d6ac3 Merge pull request #2901 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-05-14 15:24:24 -04:00
Crowdin Bot a42e759d01 New Crowdin translations by GitHub Action 2026-05-14 19:23:21 +00:00
Vitor Pamplona e609fcdd38 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2026-05-14 15:20:26 -04:00
Vitor Pamplona 0fcbfef72c Merge pull request #2898 from vitorpamplona/claude/fix-audio-replay-bug-ztEPz
Drop stale groups on reconnect to prevent audio replay
2026-05-14 15:14:26 -04:00
Vitor Pamplona 30df95d4d6 Merge pull request #2900 from davotoula/fix/relay-broadcast-cycle
bugfix: break a-tag cycle in computeRelayListToBroadcast
2026-05-14 15:14:08 -04:00
Vitor Pamplona a474282b8e Fixes bottom bar look to match previous colors 2026-05-14 15:12:55 -04:00
David Kaspar 7ed37e818f Merge pull request #2899 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-05-14 21:04:39 +02:00
Crowdin Bot 961cce7f18 New Crowdin translations by GitHub Action 2026-05-14 18:54:14 +00:00
davotoula a1aa9ebb02 fix(account): break a-tag cycle in computeRelayListToBroadcast
An addressable event whose `a` tags reach itself — directly (self-mention)
or via any cycle of other in-cache events — would recurse unbounded
through `AddressHintProvider` / `EventHintProvider` branches and crash
with StackOverflowError on publish (`signAndComputeBroadcast` →
`computeRelayListToBroadcast`). The crash was reproducible on the device
when publishing a kind-1 note that referenced an article whose own event
carries a self `a` tag (e.g. YakiHonne-authored long-form posts include
their own naddr in their `a` tags).
2026-05-14 20:53:28 +02:00
davotoula 7dbb78644a i18n: translate compose/profile-UI/security/nest strings into cs/de/pt-BR/sv
Adds Czech, German, Brazilian Portuguese, and Swedish translations
for 19 new keys covering auto-create-drafts compose settings,
profile-UI section toggles, security-screen empty states and
section headers, external-resource comment scopes, and nest
host-action failure toasts.
2026-05-14 20:50:48 +02:00
Vitor Pamplona 08adffb862 Merge pull request #2897 from vitorpamplona/claude/drag-drop-corner-icon-EoFbd
Move drag gesture detection to icon Box in VideoPlayerButtonItemCard
2026-05-14 14:46:43 -04:00
Vitor Pamplona 35be1aafd4 Merge pull request #2896 from vitorpamplona/claude/enable-client-tag-security-filters-i0rRK
Invert client tag setting: add instead of disable
2026-05-14 14:45:43 -04:00
Claude 39f2b939c3 fix: drop stale relay-replayed groups on Nests listener reconnect
On every re-subscribe (listener reconnect or publisher-cycle), the
moq-lite relay re-serves its cached latest group from the first frame.
The wrapper forwarded it straight into the decoder, so in a fully-muted
room the same old clip looped once per reconnect. Track the highest
group sequence delivered by prior subscriptions and drop any group not
strictly newer, mirroring kixelated/hang's Container.Consumer.#run.

https://claude.ai/code/session_01G9h2dzkEj6Y2F1Yr2kCojp
2026-05-14 18:43:53 +00:00
Vitor Pamplona 06f3a6bc85 Merge pull request #2895 from vitorpamplona/claude/fix-stage-position-swap-4f6nI
Remove speaker reordering in stage grid to prevent UI shuffle
2026-05-14 14:43:41 -04:00
Claude 35dfa119c3 fix: restrict video player button reordering drag to the drag handle
Move the detectDragGestures pointerInput from the whole button card to
the six-dot drag handle icon so drag-and-drop reordering activates only
when the user grabs the handle.

https://claude.ai/code/session_01Jyu8dLYN7MXVNaVZE3u2M9
2026-05-14 18:41:18 +00:00
David Kaspar 467028138c Merge pull request #2892 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-05-14 20:37:35 +02:00
Claude 2408c43918 fix: stop reordering Nest stage members by speaking state
Members were sorted to float the current speaker to the top, so a
member jumped to the front when they started talking and slid back
~250ms after they stopped — a constant shuffle in any active room.
The speaking state is already shown in-place via the mic badge and
audio-level ring, so keep members in their stable arrival order.

https://claude.ai/code/session_01GvvNS1FRn6gGvHRC7dgEtP
2026-05-14 18:35:40 +00:00
Crowdin Bot 87b6bae6da New Crowdin translations by GitHub Action 2026-05-14 18:34:30 +00:00
Vitor Pamplona be891cb828 Merge pull request #2894 from vitorpamplona/claude/review-appimage-structure-193mv
Move packaging/appimage to desktopApp/packaging/appimage
2026-05-14 14:32:52 -04:00
Claude 1a8e349e9f feat(privacy): enable NIP-89 client tag by default and move to Compose settings
Convert the per-account `disableClientTag` toggle into a positive
`addClientTag` setting that defaults to enabled, and relocate it from the
Security Filters screen to the Compose Settings page.

https://claude.ai/code/session_01TkmBzzEz3kKnrjpbrKCpsf
2026-05-14 18:29:28 +00:00
Vitor Pamplona d8d077b4e7 Merge pull request #2893 from vitorpamplona/claude/add-nav-padding-J2XWn
Fix IME padding in HiddenWordsScreen using WindowInsets
2026-05-14 14:23:14 -04:00
Claude 3ff721b31a refactor: move packaging/appimage into desktopApp module
The AppImage build inputs (AppRun, .desktop entry, icon, and the
CI-fetched linuxdeploy binary) are consumed only by desktopApp's
createReleaseAppImage task. Co-locating them under
desktopApp/packaging/appimage/ removes the `../` path escape from the
build script and keeps all desktop packaging assets inside the module.

https://claude.ai/code/session_0137ULcfJkASmfmffFBdW8ac
2026-05-14 18:21:28 +00:00
Claude 8df02cf8f8 fix: pad Hidden Words screen for bottom nav and gesture bars
The bottom add-word text field sat behind the phone's navigation
and gesture bars. Apply the union of navigation bar and IME insets
to the bottom bar so it clears the system bars and rises with the
keyboard without a double-counted gap.

https://claude.ai/code/session_01KPkQbS9SYTigkkzYGU97Sz
2026-05-14 18:21:12 +00:00
Vitor Pamplona b385088c95 more lints 2026-05-14 13:22:03 -04:00
Vitor Pamplona 76c7c1575e removes incorrect test 2026-05-14 13:13:51 -04:00
Vitor Pamplona 4a71d890cb Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2026-05-14 13:13:39 -04:00
Vitor Pamplona b28f0d246d Overriding the new PiP function 2026-05-14 12:17:09 -04:00
Vitor Pamplona 5d060899c2 additional linting 2026-05-14 12:11:39 -04:00
Vitor Pamplona d60dcf9c79 update dependencies 2026-05-14 12:06:55 -04:00
Vitor Pamplona 93c6010e19 liniting 2026-05-14 12:05:17 -04:00
Vitor Pamplona 0a330f18b0 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2026-05-14 11:54:16 -04:00
Vitor Pamplona 449fbb2f79 Merge pull request #2891 from vitorpamplona/claude/comment-reply-context-XMBOV
Display external identifier scopes in NIP-22 comments
2026-05-14 11:46:19 -04:00
Claude b7ead41145 fix: use lambda for generic RootIdentifierTag.match call
RootIdentifierTag is generic, so the `::match` method reference failed
JVM compilation. Call it through a lambda like the rest of CommentEvent.

https://claude.ai/code/session_01ArHkNXu1ANrVGZAyMWg4Xu
2026-05-14 15:28:53 +00:00
Claude a690777ef6 feat: show external-id scope as reply context for NIP-22 comments
A Comment event (kind 1111) scoped to an external identifier (`I` tag)
previously rendered as a bare text post and landed in the Home "New
Threads" feed. Treat it as a reply to that external scope: it now shows
in the conversations feed and renders a typed chip (hashtag, geohash,
url, or generic) above the comment text.

https://claude.ai/code/session_01ArHkNXu1ANrVGZAyMWg4Xu
2026-05-14 15:05:04 +00:00
Vitor Pamplona 47a5f19050 Removes unneeded strings 2026-05-14 10:31:45 -04:00
Vitor Pamplona f7f4107ad7 Merge pull request #2886 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-05-14 10:00:28 -04:00
Crowdin Bot 1c59849fe4 New Crowdin translations by GitHub Action 2026-05-14 13:38:40 +00:00
Vitor Pamplona 56ca4214fe Merge pull request #2890 from vitorpamplona/claude/standardize-nav-behavior-cA6mg
Add bottom navigation bar to ScheduledPostsScreen
2026-05-14 09:36:56 -04:00
Claude 2a5e95f4cf fix: standardize ScheduledPosts nav-shell behavior
ScheduledPostsScreen used a plain Scaffold with no bottom bar and an
unconditional back arrow, so a user who pinned it to the bottom nav got
a back arrow and no bottom bar instead of the standard tab-root shell.

Add AppBottomBar(Route.ScheduledPosts) and gate the back arrow on
nav.canPop(), matching every other bottom-nav-eligible screen: back
arrow + no bottom bar when entered from the drawer, no back arrow +
bottom bar when entered from the bottom nav.

https://claude.ai/code/session_01WZXxqCGYT4JEQBwwBNiUjm
2026-05-14 13:26:47 +00:00
Vitor Pamplona fe9764072f Merge pull request #2887 from vitorpamplona/claude/add-zap-button-nest-KoZG4
feat(nests): add a zap button to the room action bar
2026-05-14 09:21:46 -04:00
Claude 4a3cea85cb fix(nests): clear zap spinner on wallet handoff; move overlay off the hand badge
NestZapButton had no ObserveZapIconState fallback (unlike NoteCompose's
ZapReaction), so after onPayViaIntent handed the invoice to an external
wallet the progress spinner stayed up indefinitely in the long-lived
NestActivity. Reset zappingProgress to 0 on every onPayViaIntent path.

The floating zap overlay was anchored TopEnd, colliding with the
hand-raise badge — and since the merge made zaps float from the
zapper's avatar (a likely hand-raiser), that overlap would be common.
Moved it to TopCenter, the only badge-free anchor.

Also dropped dead state (zapStartingTime / the non-animated
animatedProgress alias) and corrected stale comments left over from
the sender-grouping merge.

https://claude.ai/code/session_01EW11kUdiEYPuPti7vtD2AR
2026-05-14 13:19:44 +00:00
Vitor Pamplona f19964da81 Merge pull request #2889 from vitorpamplona/claude/review-skills-library-86OMY
Add technique-layer Compose and Kotlin skills
2026-05-14 09:11:10 -04:00