Adds full protocol support for NIP-C0 code snippet events following the
same structure used for NIP-88 polls.
Quartz (quartz/nipC0CodeSnippets/):
- CodeSnippetEvent (kind:1337) with accessors for all optional metadata
- TagArrayExt: parse language, extension, name, description, runtime,
license, deps (repeatable), and repo from tag arrays
- TagArrayBuilderExt: typed builder functions for CodeSnippetEvent
- Tag classes: LanguageTag (l), ExtensionTag, SnippetNameTag (name),
SnippetDescriptionTag (description), RuntimeTag, LicenseTag, DepTag,
RepoTag
EventFactory: register kind 1337 → CodeSnippetEvent
LocalCache: add consume(CodeSnippetEvent) and dispatch in when block
https://claude.ai/code/session_013ykLNfJNdwWpXh8ZhZaSXY
Covers the full expect/actual contract across all platforms (Android,
JVM, iOS):
- round-trip for empty, single-char, simple, unicode, and JSON strings
- repetitive input compresses to a smaller size
- gzip magic number (0x1F 0x8B) present in compressed output
- compressed bytes differ from raw input bytes
- decompress of invalid data throws an exception
- special/control characters survive a round-trip
https://claude.ai/code/session_0125CGfu6aMAnSv6ZzAxFHvV
Uses platform.zlib (built-in on all Apple targets) via Kotlin/Native
cinterop to provide the actual GZip implementation:
- compress: deflateInit2 with windowBits=31 (MAX_WBITS+16) for gzip
format; deflateBound gives a tight upper-bound so a single Z_FINISH
call is always enough – no output loop required.
- decompress: inflateInit2 with windowBits=47 (MAX_WBITS+32) for
automatic gzip/zlib format detection; output is collected in
fixed-size chunks to handle arbitrary decompressed sizes.
https://claude.ai/code/session_0125CGfu6aMAnSv6ZzAxFHvV
- ChessPosition: include all fields in equals/hashCode
- AcceptedGamesRegistry: add thread safety with synchronized
- ChessEventBroadcaster: use valid filter for connection trigger
- ChessEventBroadcaster: fix misleading relayResults
- Remove println debug logging from ChessSubscription/Broadcaster
- UserProfileScreen: use proper JSON parsing via MetadataEvent
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add focused game mode to ChessPollingDelegate: when viewing a game,
only that game is polled instead of all active games
- Fix pawn promotion by parsing promotion suffix in publishMove
(e.g., "e8q" -> "e8" + QUEEN)
- Add game end overlay with victory/defeat/draw celebration
- Remove all debug println statements for production readiness
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ChessLobbyState with completedGames, replaceGameState(), moveToCompleted()
- Add challengerAvatarUrl to ChessChallenge
- Add CompletedGame data class for game history
Platform Adapters:
- AndroidChessAdapter: AndroidChessPublisher, AndroidRelayFetcher, AndroidMetadataProvider
- DesktopChessAdapter: DesktopChessPublisher, DesktopRelayFetcher, DesktopMetadataProvider
Shared Infrastructure:
- ChessRelayFetchHelper for one-shot relay queries
- IUserMetadataProvider interface for platform-specific metadata
- ChessFilterBuilder with simple filter methods for fetchers
- ChessSubscriptionController interface for subscription management
Fix ChessSubscription.kt to remove broken dataSources().chess reference
(subscriptions now managed by ChessLobbyLogic)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* 'main' of https://github.com/vitorpamplona/amethyst: (48 commits)
Use accountViewModel.viewModelScope instead of rememberCoroutineScope() to allow download/share to finish even when controls auto-close.
Add content parameter to allow sharing of video from video player
New Crowdin translations by GitHub Action
- use a valid hex key - check the value of the tags
Fixed NullPointerException when filter contain tags
Fix assertEquals order
fix Jackson deserialization for empty Filters and add regression test
New Crowdin translations by GitHub Action
Consume File.delete() return values Extract duplicated "https://" literal into a private const val HTTPS_PREFIX
New Crowdin translations by GitHub Action
New Crowdin translations by GitHub Action
New Crowdin translations by GitHub Action
Load and save payment targets
refactor(commons): migrate from Moko to Compose Multiplatform Resources
feat(broadcast): Enhance retry, multi-broadcast UI, and post tracking (#1682)
wip: Add BroadcastTracker to AccountViewModel (#1682)
feat(broadcast): Add transparent event broadcasting feedback (#1682)
Enabled the reactions expand control for zapraisers even when there are no zaps
New Crowdin translations by GitHub Action
refactor to reduce complexity encodePcmToAac
...
# Conflicts:
# amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/CardFeedState.kt