Commit Graph
14822 Commits
Author SHA1 Message Date
Crowdin Bot ea74be65cf New Crowdin translations by GitHub Action 2026-06-10 23:30:11 +00:00
Crowdin Bot b94803b701 New Crowdin translations by GitHub Action 2026-06-10 18:49:25 +00:00
davotoulaandClaude Opus 4.8 9fd53b6461 feat: add cs, de, sv, pt-BR translations for chat history and reply search strings
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 20:45:28 +02:00
David KasparandGitHub 84c1f4f533 Merge pull request #3169 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-10 20:38:46 +02:00
Crowdin Bot e1835e5584 New Crowdin translations by GitHub Action 2026-06-10 18:38:37 +00:00
Vitor PamplonaandGitHub 1d98583f28 Merge pull request #3171 from vitorpamplona/claude/intelligent-newton-8qgvo8
Extract Marmot group message composer to ViewModel
2026-06-10 14:35:50 -04:00
Vitor PamplonaandGitHub 3393469a41 Merge pull request #3170 from vitorpamplona/claude/upbeat-einstein-fn5a3j
fix: treat kind-9 ChatEvent as a chat kind for inline chat-style quotes
2026-06-10 14:30:51 -04:00
Claude 51eecbc557 Merge remote-tracking branch 'origin/main' into claude/intelligent-newton-8qgvo8 2026-06-10 18:26:08 +00:00
Claude 908bc58190 test: lock in reorder-only semantics of mention priority ranking
Extracts the priority sort into rankPriorityFirst() and covers: priority
users move to the top, stable order within both groups, no injection of
non-matching priority keys, and untouched list when priority is empty.
2026-06-10 18:25:57 +00:00
Vitor PamplonaandGitHub 33f305b58e Merge pull request #3167 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-10 14:23:36 -04:00
Claude 14cb06d081 fix: treat kind-9 ChatEvent as a chat kind for inline chat-style quotes
The MLS/Marmot inner message kind was missing from isChatEvent, so a
chat message quoted inside an MLS chatroom message still rendered as the
default NoteCompose card instead of the chat reply design.

https://claude.ai/code/session_01DSQW7kku5cGEL36icXg6BC
2026-06-10 18:23:15 +00:00
Vitor PamplonaandGitHub 5e6c8ce641 Merge pull request #3168 from vitorpamplona/claude/upbeat-einstein-fn5a3j
Add InlineQuoteRenderer strategy for customizing quoted notes
2026-06-10 14:23:08 -04:00
Claude fde5818044 refactor: extract MarmotNewMessageViewModel for the MLS composer
Moves the Marmot composer's inline state (message TextFieldState,
reply state, upload state, @-mention suggestion wiring, send) into a
ViewModel mirroring ChatNewMessageViewModel / ChannelNewMessageViewModel /
NestNewMessageViewModel, so all four chat types share the same
init/load structure. No behavior change.
2026-06-10 17:43:30 +00:00
Claude 6f79779885 feat: mark conversation participants with an 'In this chat' chip in mention suggestions
Renders a small chip on suggestion rows whose pubkey is in the
suggestion state's priorityPubkeys set, unless the caller supplies
its own trailingContent. Priority keys only reorder and label the
users that already matched the search — they never inject results.
2026-06-10 17:40:52 +00:00
Claude c5147b1203 fix: treat kind-9 ChatEvent as a chat kind for inline chat-style quotes
The MLS/Marmot inner message kind was missing from isChatEvent, so a
chat message quoted inside an MLS chatroom message still rendered as the
default NoteCompose card instead of the chat reply design.

https://claude.ai/code/session_01DSQW7kku5cGEL36icXg6BC
2026-06-10 17:37:33 +00:00
Claude b79ab1214c refactor: address review findings on mention tagging and suggestions
- Move NewMessageTagger from the Marmot composer into
  AccountViewModel.sendMarmotGroupMessage so every send path gets
  mention rewriting + p-tagging, not just the chat composer.
- Pass the parent's MarmotGroupChatroom into the composer instead of
  re-fetching it from the group list.
- Bound the public-channel participant scan with a one-month cutoff
  (matches the recency-cutoff convention in ChannelObservers).
- Simplify the nests participant-set construction.
2026-06-10 17:24:27 +00:00
Claude 429aa4f4a6 fix: skip chat reply row when the reply is already cited inline in the message
In MLS kind-9 chats Note.replyTo keeps both replies and quotes (e and q
tags), so a message quoting another chat message rendered it twice: once
in the reply row and once at its inline nostr: mention. Render the reply
row only when the target is not cited in the content; the inline quote
renderer already draws it in place.

https://claude.ai/code/session_01DSQW7kku5cGEL36icXg6BC
2026-06-10 16:37:56 +00:00
Crowdin Bot 0800eecbe0 New Crowdin translations by GitHub Action 2026-06-10 16:36:02 +00:00
Claude bf0fa0c57e feat: rank conversation participants first in @-mention suggestions
Adds an optional priorityPubkeys supplier to UserSuggestionState that
stable-sorts search results so the current conversation's participants
appear before network-wide matches (ranking only, never filters).

Wired per chat context:
- MLS/Marmot groups: live MLS member list
- NIP-17 DMs/groups: the room's users
- Public chats (NIP-28): authors who have posted in the channel
- Nests audio rooms: MeetingSpaceEvent participants + host

https://claude.ai/code/session_013NWdjCSegsf2FYSPPANX3n
2026-06-10 16:34:09 +00:00
Vitor Pamplona b2ac311539 disabling relay logs for DMs 2026-06-10 12:30:49 -04:00
Vitor Pamplona 1e594a62c9 Removing warning 2026-06-10 12:30:49 -04:00
Claude 84e91833c4 feat: add @-mention user search and tagging to Marmot group chat composer
Brings the MLS/Marmot message composer to parity with NIP-17 DMs:
typing @ shows the shared user-suggestion dropdown (local cache +
NIP-05 resolution), selecting a user inserts @npub…, and on send
NewMessageTagger rewrites mentions into nostr: URIs and collects
the referenced users as p-tags on the inner kind:9 rumor. Mentions
stay inside the MLS ciphertext; the outer kind:445 is unchanged.

Also applies MentionPreservingInputTransformation and
UrlUserTagOutputTransformation to the field so mentions render
highlighted while composing, matching the DM editor.

https://claude.ai/code/session_013NWdjCSegsf2FYSPPANX3n
2026-06-10 15:35:03 +00:00
Claude 551705d14a refactor: render quote-mention leftover chars in DisplayFullNote, not the quote renderer
The trailing characters after a bech mention are part of the surrounding
text, so InlineQuoteRenderer implementations no longer receive extraChars;
DisplayFullNote draws them after delegating the note itself.

https://claude.ai/code/session_01DSQW7kku5cGEL36icXg6BC
2026-06-10 15:21:18 +00:00
Claude c88344c4c6 feat: render chat messages quoted inside chat bubbles with the chat reply design
Inline nostr: quotes used to always render through NoteCompose's quoted-note
card, even when the quoted event was itself a chat message shown inside a
chat bubble. Introduce an InlineQuoteRenderer strategy behind a
CompositionLocal: both rich-text paths (plain and markdown) funnel through
DisplayFullNote, which now reads LocalInlineQuoteRenderer, defaulting to the
existing NoteCompose card.

ChatroomMessageCompose provides a chat-aware renderer for everything inside a
bubble, so quoted chat events (NIP-17/NIP-04 DMs, NIP-28 channel messages,
NIP-53 live chat, ephemeral chat) reuse ChatroomMessageCompose with
innerQuote = true — the same design as the reply row — including
scroll-to-message on tap for quotes within the same room. Non-chat events and
not-yet-loaded quotes keep the default card.

https://claude.ai/code/session_01DSQW7kku5cGEL36icXg6BC
2026-06-10 14:59:36 +00:00
Vitor PamplonaandGitHub e41169efbf Merge pull request #3164 from vitorpamplona/claude/focused-faraday-z9zs87
Work around Compose ui-uikit prebuilt cache linking failure
2026-06-09 19:29:00 -04:00
Claude 84497bbd47 perf(commons): index URLs by first char in fixMissingSpaces
fixMissingSpaces runs on the main thread once per rendered note. The scan
introduced in the previous commit re-tested every detected URL at every
character position (and allocated an iterator per position via firstOrNull),
i.e. O(N*U*L) for a note with U URLs — noticeable on large notes that carry
many links.

Bucket the URLs by their first character once up front and only attempt a
match at positions whose character can actually start a URL; every other
character now costs a single map lookup, keeping the pass linear in the text
length for typical content. Buckets stay longest-first so prefix URLs still
don't shadow longer ones, so the output is identical (verified against the
commons richtext JVM corpus).
2026-06-09 22:52:00 +00:00
Claude f42cc836aa fix(commons): make fixMissingSpaces work on Kotlin/Native (iOS)
RichTextParser.fixMissingSpaces used a Regex of the form
`([^ \n])?(urls)([^ \n])?` to insert spaces around URLs glued to
neighbouring text. Kotlin/Native's regex engine fails to backtrack the
optional `([^ \n])?` capture groups to zero width, so on iOS every URL was
corrupted (e.g. "https://x" became "h https://x"). That broke the
downstream segmenter, which is why :commons:iosSimulatorArm64Test reported
19 failures across the RichText/Gallery/Pdf/F4a parsers once the test binary
finally linked.

Replace the regex with a direct left-to-right scan that inserts a single
space wherever a detected URL touches a non-space/non-newline neighbour. The
scan is engine-independent, so it behaves identically on JVM and Native.
Verified equivalent to the old behaviour across the full commons richtext
JVM corpus, and the new FixMissingSpacesTest pins the cases on every target
(including iosSimulatorArm64).
2026-06-09 22:42:50 +00:00
Claude 9671fc4d04 fix(commons): disable native cache for iOS test binary to fix ui-uikit link
The :commons:linkDebugTestIosSimulatorArm64 CI step fails under Xcode 16.4
with 'Undefined symbols: _OBJC_CLASS_$_UIViewLayoutRegion'. The symbol is
referenced by the prebuilt Kotlin/Native cache of Compose Multiplatform's
org.jetbrains.compose.ui:ui-uikit (CMPLayoutRegion), which was built against
a newer simulator SDK (18.5) than the test binary is linked for (14.0).

Disable the native compiler cache for the iOS test binaries so ui-uikit
recompiles against the active SDK, where UIViewLayoutRegion resolves. The
DisableCacheInKotlinVersion guard re-surfaces the workaround once we move
past Kotlin 2.3.21 so it can be removed when the cache is fixed upstream.
2026-06-09 21:44:11 +00:00
Vitor PamplonaandGitHub a7e892dc7c Merge pull request #3160 from davotoula/chore/remove-tarsosdsp-gpl
Replace GPLv3 TarsosDSP with an in-house pitch shifter
2026-06-09 17:09:11 -04:00
Vitor PamplonaandGitHub d8a37dfb0d Merge pull request #3163 from vitorpamplona/claude/nifty-cray-h4ctiu
Add NIP-14 group subjects and improve DM group creation UX
2026-06-09 17:08:53 -04:00
Claude 85f9998463 revert: drop ChatroomList.changes flow and the screen's reactive use
Backs out the reactive list-refresh plumbing added in the prior commit:
removes the `changes` SharedFlow from the shared `ChatroomList` (restoring
it to its original form) and reverts Desktop `ChatroomListState` to its
original 2s poll. Room assembly is expected to move to a LocalCache.observe
approach on both platforms later, which would supersede this.

Keeps the independent Desktop list improvements (per-room unread tracking
and the mute/acceptable filter), which don't depend on the flow.

https://claude.ai/code/session_01VEukNczAYxNLBjLnqVEoZd
2026-06-09 20:57:45 +00:00
Vitor PamplonaandGitHub ff71bc1401 Merge pull request #3162 from vitorpamplona/claude/trusting-archimedes-hduulo
Replace String.format with toString(16).padStart in test helpers
2026-06-09 16:56:30 -04:00
Claude a6e9439c6d fix: use multiplatform hex padding in room state tests
String.format is JVM-only and broke the iOS Klib compile of commonTest.
Replace "%064x".format(...) with toString(16).padStart(64, '0').
2026-06-09 20:45:17 +00:00
Vitor PamplonaandGitHub 39d36441d4 Merge pull request #3159 from vitorpamplona/claude/brave-lovelace-d1rap2
fix(commons): make commonTest compile for iOS targets
2026-06-09 16:24:54 -04:00
Vitor PamplonaandGitHub 30dcd3aead Merge pull request #3161 from vitorpamplona/claude/friendly-mayer-g3lhj1
Count NIP-18 quote-reposts as boosts of quoted notes
2026-06-09 16:20:52 -04:00
Claude ed37020fbf ci: run shared commonTest on iOS for :commons
The test-quartz-ios job only compiled :commons production code for iOS
(compileKotlinIos*), never the commonTest source set, so a test using a
JVM-only API compiled fine on JVM/Android and shipped green while silently
breaking compileTestKotlinIosSimulatorArm64.

Mirror the quartz step: run :commons:iosSimulatorArm64Test (compiles +
runs the shared commonTest suite on the simulator) and
:commons:compileTestKotlinIosArm64 (device-only compile drift). This keeps
commonTest KMP-clean going forward.
2026-06-09 20:20:29 +00:00
Claude 1fbefb2efe feat(desktop): bring group DM parity with Android
Makes the Desktop DM client a first-class group participant and tightens
the shared/Desktop DM paths so they match Android behavior.

- commons ChatNewMessageState: actually attach the composed NIP-14 subject
  to sent messages (the field was previously collected but dropped).
- commons ChatroomList: emit a `changes` SharedFlow on add/remove so list
  UIs can refresh reactively; dedupe the User overloads onto the room ones.
- Desktop NewDmDialog: multi-recipient selection (chips + confirm button) so
  a Desktop user can start a group, not only a 1:1.
- Desktop ChatPane/ChatroomHeader: show a group's NIP-14 subject in the
  header and add a rename dialog that broadcasts a subject change to all
  members.
- Desktop Main.kt DM ingest: route any ChatroomKeyable inner event into the
  room (covers kind 14/15 and future variants) and store self-authored
  NIP-37 drafts instead of dropping them.
- Desktop ChatroomListState: refresh reactively off ChatroomList.changes
  (with a slower safety poll), track real per-room unread via a last-seen
  mark, and hide rooms whose latest message isn't acceptable (mute/filter).

https://claude.ai/code/session_01VEukNczAYxNLBjLnqVEoZd
2026-06-09 20:16:55 +00:00
Claude 10f369c43c feat(model): count NIP-18 quote-reposts in the repost counter
A kind:1 note carrying a `q` tag is a quote-repost of the quoted note,
but Amethyst's reaction-row repost counter reads `Note.boosts`, which
only collected kind:6/kind:16 reposts. Quote-reposts were treated purely
as inline citations (stripped by `tagsWithoutCitations()`), so they never
appeared in the quoted note's repost count.

LocalCache now adds a `q`-tagged note as a boost of each quoted note when
consuming text notes/comments, and detaches it on deletion. The quoted
note is deliberately kept out of `replyTo` so the quote still renders as a
root post in the home feed (`Note.isNewThread`). The same wiring is added
to DesktopLocalCache for parity, with tests pinning the behavior using the
exact event reported.
2026-06-09 20:15:19 +00:00
davotoula 26fc0ea7bf docs(claude): require a license check when adding any dependency 2026-06-09 22:10:55 +02:00
David KasparandGitHub 445702a34a Merge pull request #3158 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-09 22:02:02 +02:00
davotoula 66c345717c Code review fixes:
- honor cancellation in voice anonymizer
- reuse shared Hann window and drop vestigial progress callback
2026-06-09 22:00:29 +02:00
davotoula 190316eb28 Replace GPLv3 TarsosDSP with in-house pitch shifter 2026-06-09 21:59:50 +02:00
Claude fc4f7a03fc fix(commons): make commonTest compile for iOS targets
The commons commonTest source set is shared across all KMP targets,
including the iosArm64/iosSimulatorArm64 spike, but several tests still
reached for JVM-only APIs that don't resolve on Kotlin/Native:

- JUnit (`org.junit.*`, `junit.framework.TestCase`) → kotlin.test, with
  message arguments moved from first (JUnit) to last (kotlin.test).
- `assertArrayEquals` → `assertContentEquals`.
- `@JvmStatic` on the `android.util.Log` test stub → removed (it only
  affects JVM bytecode; companion calls work without it).
- `seg.javaClass.simpleName` → `seg::class.simpleName!!`.
- A test function name containing `()` (illegal on Native) → renamed.
- `String(CharArray, offset, count)` → `CharArray.concatToString`.

CliffDetectorTest exercises `computeStalledSpeakers`/`defaultCliffBackoffMs`,
which live in the jvmAndroid-only NestViewModel and are invisible to iOS,
so it moves to jvmTest alongside NestViewModelTest.
2026-06-09 19:26:04 +00:00
Crowdin Bot 673a12452d New Crowdin translations by GitHub Action 2026-06-09 19:08:10 +00:00
Vitor PamplonaandGitHub 3dfe418150 Merge pull request #3151 from vitorpamplona/claude/relay-message-pagination-LMqSQ
DM history: per-relay backward paging, live-tail split + prune-aware window realignment
2026-06-09 15:05:58 -04:00
Vitor PamplonaandGitHub 696be6181e Merge pull request #3157 from davotoula/fix/latex-rendering
Inline LaTeX — render wrapped equations, upgrade renderer, baseline alignment
2026-06-09 15:05:31 -04:00
Vitor PamplonaandClaude Opus 4.8 39eb25bc17 fix(commons): show "N relays" on every history marker count chip
The in-stream loading marker spelled out "N relays" only for the fully-loaded
(done) chip; active frontiers showed a bare count ("Loading: ↓ 8"). Use the
relays plural for the count fallback on every state so a count chip always reads
as a sentence ("Loading: ↓ 8 relays"). 1–2 short host names still spell out.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 14:17:07 -04:00
David KasparandGitHub 022aec6474 Merge pull request #3156 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-09 20:13:51 +02:00
Vitor PamplonaandClaude Opus 4.8 75315095ee refactor(commons): collapse pager status flows into one PagingStatus snapshot
BackwardRelayPager exposed five independently-updated StateFlows (exhausted,
relayCount, stalledCount, reachedBack, relayProgress) that are all recomputed
together on every page settle. Co-located consumers therefore paid up to five
separate recompositions per settle and could observe a torn read (e.g. an
updated relayCount against a still-stale relayProgress).

Combine them into one atomic PagingStatus snapshot, emitted by a single
publish(), collected once. updateStatus()/recomputeExhausted() merge into that
publish() (exhausted computed inline). loadingMore stays separate: its falling
edge is debounced on its own timer in PerRelayLoadTracker, decoupled from the
status recompute, so folding it in would miss that delayed transition.

Threaded through the 3 history managers and the 3 feed consumers
(ChatroomListFeedView, ChatroomView, LoadingReplyNote): 12 collectors -> 4 at
the heaviest views.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 14:13:26 -04:00
davotoula c8de54d1c2 fix(math): align inline equations to the text baseline 2026-06-09 19:51:31 +02:00