Skip to content

feat(live): add go live spaces beta foundations#2812

Draft
rabble wants to merge 46 commits into
mainfrom
codex/live-spaces-v1
Draft

feat(live): add go live spaces beta foundations#2812
rabble wants to merge 46 commits into
mainfrom
codex/live-spaces-v1

Conversation

@rabble
Copy link
Copy Markdown
Member

@rabble rabble commented Apr 6, 2026

Closes #2813

Summary

  • add the approved go live spaces spec and implementation plan, plus explicit live feature flags and the LiveKit client dependency
  • add the live domain layer: Nostr room/session/presence/chat models and codec, backend and LiveKit service boundaries, repositories, and Riverpod wiring
  • add Task 5 state management with live discovery, room, chat, and host blocs/cubit plus focused tests for the new live stack

Test Plan

  • Resolving dependencies...
    Downloading packages...
    _fe_analyzer_shared 91.0.0 (98.0.0 available)
    _flutterfire_internals 1.3.66 (1.3.68 available)
    alchemist 0.12.1 (0.14.0 available)
    analyzer 8.4.0 (12.0.0 available)
    analyzer_buffer 0.1.11 (0.3.1 available)
    analyzer_plugin 0.13.10 (0.14.7 available)
    ! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
    app_links 6.4.1 (7.0.0 available)
    archive 4.0.7 (4.0.9 available)
    async 2.13.0 (2.13.1 available)
    audio_session 0.2.2 (0.2.3 available)
    bip340 0.3.0 (0.3.1 available)
    build 4.0.3 (4.0.5 available)
    build_config 1.2.0 (1.3.0 available)
    build_runner 2.10.4 (2.13.1 available)
    built_value 8.12.1 (8.12.5 available)
    cli_launcher 0.3.2+1 (0.3.3+1 available)
    code_builder 4.11.0 (4.11.1 available)
    ! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
    connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
    cookie_jar 4.0.8 (4.0.9 available)
    cross_file 0.3.5+1 (0.3.5+2 available)
    ! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
    cupertino_icons 1.0.8 (1.0.9 available)
    custom_lint_core 0.8.1 (0.8.2 available)
    custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
    dart_style 3.1.3 (3.1.8 available)
    dbus 0.7.11 (0.7.12 available)
    dev_build 1.1.3+1 (1.1.5+2 available)
    ! device_info_plus 10.1.2 (overridden) (12.4.0 available)
    dio 5.9.0 (5.9.2 available)
    dio_cookie_manager 3.3.0 (3.4.0 available)
    dio_web_adapter 2.1.1 (2.1.2 available)
    drift 2.30.0 (2.32.1 available)
    drift_dev 2.30.0 (2.32.1 available)
    drift_flutter 0.2.8 (0.3.0 available)
    ffi 2.1.5 (2.2.0 available)
    file_picker 10.3.8 (11.0.1 available)
    file_selector_android 0.5.2+4 (0.5.2+5 available)
    firebase_analytics 12.1.2 (12.2.0 available)
    firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
    firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
    firebase_core 4.4.0 (4.6.0 available)
    firebase_core_platform_interface 6.0.2 (6.0.3 available)
    firebase_core_web 3.4.0 (3.5.1 available)
    firebase_crashlytics 5.0.7 (5.1.0 available)
    firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
    firebase_performance 0.11.1+4 (0.11.2 available)
    firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
    firebase_performance_web 0.1.8+2 (0.1.8+4 available)
    flutter_local_notifications 19.5.0 (21.0.0 available)
    flutter_local_notifications_linux 6.0.0 (8.0.0 available)
    flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
    flutter_local_notifications_windows 1.0.3 (3.0.0 available)
    flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
    flutter_riverpod 3.0.3 (3.3.1 available)
    flutter_secure_storage 9.2.4 (10.0.0 available)
    flutter_secure_storage_linux 1.2.3 (3.0.0 available)
    flutter_secure_storage_macos 3.1.3 (4.0.0 available)
    flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
    flutter_secure_storage_web 1.2.1 (2.1.0 available)
    flutter_secure_storage_windows 3.1.2 (4.1.0 available)
    flutter_svg 2.2.3 (2.2.4 available)
    flutter_web_auth_2 4.1.0 (5.0.1 available)
    flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
    flutter_webrtc 1.2.0 (1.4.1 available)
    freezed 3.2.3 (3.2.5 available)
    go_router 16.3.0 (17.2.0 available)
    golden_toolkit 0.15.0 (discontinued)
    google_fonts 6.3.3 (8.0.2 available)
    hive_ce 2.16.0 (2.19.3 available)
    hive_ce_flutter 2.3.3 (2.3.4 available)
    hive_ce_generator 1.10.0 (1.11.1 available)
    image 4.7.2 (4.8.0 available)
    image_picker_android 0.8.13+10 (0.8.13+16 available)
    image_picker_ios 0.8.13+3 (0.8.13+6 available)
    intl 0.19.0 (0.20.2 available)
    isolate_channel 0.2.2+1 (0.6.1 available)
    js 0.6.7 (0.7.2 available)
    json_annotation 4.9.0 (4.11.0 available)
    json_serializable 6.11.2 (6.13.1 available)
    lints 6.0.0 (6.1.0 available)
    livekit_client 2.5.3 (2.7.0 available)
    melos 7.3.0 (7.5.1 available)
    ! meta 1.17.0 (overridden) (1.18.2 available)
    mockito 5.6.1 (5.6.4 available)
    mustache_template 2.0.2 (2.0.4 available)
    package_info_plus 9.0.0 (9.0.1 available)
    path_provider_android 2.2.22 (2.2.23 available)
    path_provider_foundation 2.5.1 (2.6.0 available)
    patrol 4.2.0 (4.5.0 available)
    patrol_finders 3.1.0 (3.2.0 available)
    patrol_log 0.7.1 (0.8.0 available)
    petitparser 7.0.1 (7.0.2 available)
    pointycastle 3.9.1 (4.0.0 available)
    posix 6.0.3 (6.5.0 available)
    pro_image_editor 12.0.13 (12.1.0 available)
    process_run 1.2.4 (1.3.2 available)
    protobuf 4.2.0 (6.0.0 available)
    riverpod 3.0.3 (3.2.1 available)
    riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
    riverpod_annotation 3.0.3 (4.0.2 available)
    riverpod_generator 3.0.3 (4.0.3 available)
    ! rxdart 0.28.0 (overridden)
    share_plus 12.0.1 (12.0.2 available)
    shared_preferences 2.5.4 (2.5.5 available)
    shared_preferences_android 2.4.18 (2.4.23 available)
    shared_preferences_platform_interface 2.4.1 (2.4.2 available)
    shelf_web_socket 2.0.1 (3.0.0 available)
    skeletonizer 2.1.2 (2.1.3 available)
    source_gen 4.1.1 (4.2.2 available)
    source_helper 1.3.8 (1.3.11 available)
    source_span 1.10.1 (1.10.2 available)
    sqflite_android 2.4.2+2 (2.4.2+3 available)
    sqflite_common_ffi 2.3.6 (2.4.0+2 available)
    sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
    sqlite3 2.9.4 (3.3.0 available)
    sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
    sqlparser 0.42.1 (0.44.3 available)
    test 1.30.0 (1.31.0 available)
    test_api 0.7.10 (0.7.11 available)
    test_core 0.6.16 (0.6.17 available)
    timezone 0.10.1 (0.11.0 available)
    unique_names_generator 3.0.0 (3.1.2 available)
    url_launcher_android 6.3.28 (6.3.29 available)
    url_launcher_ios 6.3.6 (6.4.1 available)
    url_launcher_web 2.4.1 (2.4.2 available)
    uuid 4.5.2 (4.5.3 available)
    vector_graphics 1.1.19 (1.1.21 available)
    vector_graphics_compiler 1.1.19 (1.2.0 available)
    vector_math 2.2.0 (2.3.0 available)
    video_player 2.10.1 (2.11.1 available)
    video_player_android 2.9.1 (2.9.5 available)
    video_player_avfoundation 2.8.8 (2.9.4 available)
    wakelock_plus 1.4.0 (1.5.1 available)
    wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
    watcher 1.2.0 (1.2.1 available)
    webview_flutter_android 4.10.13 (4.10.15 available)
    webview_flutter_platform_interface 2.14.0 (2.15.1 available)
    webview_flutter_wkwebview 3.24.1 (3.24.2 available)
    win32 5.15.0 (6.0.0 available)
    win32_registry 1.1.5 (3.0.2 available)
    yaml_edit 2.2.3 (2.2.4 available)
    Got dependencies!
    1 package is discontinued.
    139 packages have newer versions incompatible with dependency constraints.
    Try flutter pub outdated for more information.
    Analyzing 8 items...
    No issues found! (ran in 3.9s)
  • Resolving dependencies...
    Downloading packages...
    _fe_analyzer_shared 91.0.0 (98.0.0 available)
    _flutterfire_internals 1.3.66 (1.3.68 available)
    alchemist 0.12.1 (0.14.0 available)
    analyzer 8.4.0 (12.0.0 available)
    analyzer_buffer 0.1.11 (0.3.1 available)
    analyzer_plugin 0.13.10 (0.14.7 available)
    ! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
    app_links 6.4.1 (7.0.0 available)
    archive 4.0.7 (4.0.9 available)
    async 2.13.0 (2.13.1 available)
    audio_session 0.2.2 (0.2.3 available)
    bip340 0.3.0 (0.3.1 available)
    build 4.0.3 (4.0.5 available)
    build_config 1.2.0 (1.3.0 available)
    build_runner 2.10.4 (2.13.1 available)
    built_value 8.12.1 (8.12.5 available)
    cli_launcher 0.3.2+1 (0.3.3+1 available)
    code_builder 4.11.0 (4.11.1 available)
    ! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
    connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
    cookie_jar 4.0.8 (4.0.9 available)
    cross_file 0.3.5+1 (0.3.5+2 available)
    ! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
    cupertino_icons 1.0.8 (1.0.9 available)
    custom_lint_core 0.8.1 (0.8.2 available)
    custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
    dart_style 3.1.3 (3.1.8 available)
    dbus 0.7.11 (0.7.12 available)
    dev_build 1.1.3+1 (1.1.5+2 available)
    ! device_info_plus 10.1.2 (overridden) (12.4.0 available)
    dio 5.9.0 (5.9.2 available)
    dio_cookie_manager 3.3.0 (3.4.0 available)
    dio_web_adapter 2.1.1 (2.1.2 available)
    drift 2.30.0 (2.32.1 available)
    drift_dev 2.30.0 (2.32.1 available)
    drift_flutter 0.2.8 (0.3.0 available)
    ffi 2.1.5 (2.2.0 available)
    file_picker 10.3.8 (11.0.1 available)
    file_selector_android 0.5.2+4 (0.5.2+5 available)
    firebase_analytics 12.1.2 (12.2.0 available)
    firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
    firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
    firebase_core 4.4.0 (4.6.0 available)
    firebase_core_platform_interface 6.0.2 (6.0.3 available)
    firebase_core_web 3.4.0 (3.5.1 available)
    firebase_crashlytics 5.0.7 (5.1.0 available)
    firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
    firebase_performance 0.11.1+4 (0.11.2 available)
    firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
    firebase_performance_web 0.1.8+2 (0.1.8+4 available)
    flutter_local_notifications 19.5.0 (21.0.0 available)
    flutter_local_notifications_linux 6.0.0 (8.0.0 available)
    flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
    flutter_local_notifications_windows 1.0.3 (3.0.0 available)
    flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
    flutter_riverpod 3.0.3 (3.3.1 available)
    flutter_secure_storage 9.2.4 (10.0.0 available)
    flutter_secure_storage_linux 1.2.3 (3.0.0 available)
    flutter_secure_storage_macos 3.1.3 (4.0.0 available)
    flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
    flutter_secure_storage_web 1.2.1 (2.1.0 available)
    flutter_secure_storage_windows 3.1.2 (4.1.0 available)
    flutter_svg 2.2.3 (2.2.4 available)
    flutter_web_auth_2 4.1.0 (5.0.1 available)
    flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
    flutter_webrtc 1.2.0 (1.4.1 available)
    freezed 3.2.3 (3.2.5 available)
    go_router 16.3.0 (17.2.0 available)
    golden_toolkit 0.15.0 (discontinued)
    google_fonts 6.3.3 (8.0.2 available)
    hive_ce 2.16.0 (2.19.3 available)
    hive_ce_flutter 2.3.3 (2.3.4 available)
    hive_ce_generator 1.10.0 (1.11.1 available)
    image 4.7.2 (4.8.0 available)
    image_picker_android 0.8.13+10 (0.8.13+16 available)
    image_picker_ios 0.8.13+3 (0.8.13+6 available)
    intl 0.19.0 (0.20.2 available)
    isolate_channel 0.2.2+1 (0.6.1 available)
    js 0.6.7 (0.7.2 available)
    json_annotation 4.9.0 (4.11.0 available)
    json_serializable 6.11.2 (6.13.1 available)
    lints 6.0.0 (6.1.0 available)
    livekit_client 2.5.3 (2.7.0 available)
    melos 7.3.0 (7.5.1 available)
    ! meta 1.17.0 (overridden) (1.18.2 available)
    mockito 5.6.1 (5.6.4 available)
    mustache_template 2.0.2 (2.0.4 available)
    package_info_plus 9.0.0 (9.0.1 available)
    path_provider_android 2.2.22 (2.2.23 available)
    path_provider_foundation 2.5.1 (2.6.0 available)
    patrol 4.2.0 (4.5.0 available)
    patrol_finders 3.1.0 (3.2.0 available)
    patrol_log 0.7.1 (0.8.0 available)
    petitparser 7.0.1 (7.0.2 available)
    pointycastle 3.9.1 (4.0.0 available)
    posix 6.0.3 (6.5.0 available)
    pro_image_editor 12.0.13 (12.1.0 available)
    process_run 1.2.4 (1.3.2 available)
    protobuf 4.2.0 (6.0.0 available)
    riverpod 3.0.3 (3.2.1 available)
    riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
    riverpod_annotation 3.0.3 (4.0.2 available)
    riverpod_generator 3.0.3 (4.0.3 available)
    ! rxdart 0.28.0 (overridden)
    share_plus 12.0.1 (12.0.2 available)
    shared_preferences 2.5.4 (2.5.5 available)
    shared_preferences_android 2.4.18 (2.4.23 available)
    shared_preferences_platform_interface 2.4.1 (2.4.2 available)
    shelf_web_socket 2.0.1 (3.0.0 available)
    skeletonizer 2.1.2 (2.1.3 available)
    source_gen 4.1.1 (4.2.2 available)
    source_helper 1.3.8 (1.3.11 available)
    source_span 1.10.1 (1.10.2 available)
    sqflite_android 2.4.2+2 (2.4.2+3 available)
    sqflite_common_ffi 2.3.6 (2.4.0+2 available)
    sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
    sqlite3 2.9.4 (3.3.0 available)
    sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
    sqlparser 0.42.1 (0.44.3 available)
    test 1.30.0 (1.31.0 available)
    test_api 0.7.10 (0.7.11 available)
    test_core 0.6.16 (0.6.17 available)
    timezone 0.10.1 (0.11.0 available)
    unique_names_generator 3.0.0 (3.1.2 available)
    url_launcher_android 6.3.28 (6.3.29 available)
    url_launcher_ios 6.3.6 (6.4.1 available)
    url_launcher_web 2.4.1 (2.4.2 available)
    uuid 4.5.2 (4.5.3 available)
    vector_graphics 1.1.19 (1.1.21 available)
    vector_graphics_compiler 1.1.19 (1.2.0 available)
    vector_math 2.2.0 (2.3.0 available)
    video_player 2.10.1 (2.11.1 available)
    video_player_android 2.9.1 (2.9.5 available)
    video_player_avfoundation 2.8.8 (2.9.4 available)
    wakelock_plus 1.4.0 (1.5.1 available)
    wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
    watcher 1.2.0 (1.2.1 available)
    webview_flutter_android 4.10.13 (4.10.15 available)
    webview_flutter_platform_interface 2.14.0 (2.15.1 available)
    webview_flutter_wkwebview 3.24.1 (3.24.2 available)
    win32 5.15.0 (6.0.0 available)
    win32_registry 1.1.5 (3.0.2 available)
    yaml_edit 2.2.3 (2.2.4 available)
    Got dependencies!
    1 package is discontinued.
    139 packages have newer versions incompatible with dependency constraints.
    Try flutter pub outdated for more information.
    00:00 +0: loading /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart
    00:00 +0: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then success with active and upcoming rooms grouped by session status
    00:00 +1: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then failure when the repository throws
    00:00 +2: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc start subscribes to chat updates and exposes ready state
    00:00 +3: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc send request trims content and publishes the message
    00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (setUpAll)
    00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
    00:00 +5: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request emits failure when token fetch fails
    00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (tearDownAll)
    00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (setUpAll)
    00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit title updates drive form validity
    00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit validates the title before creating a room
    00:00 +8: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit creates a room draft, publishes the room and session, and marks success
    00:00 +9: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (tearDownAll)
    00:00 +9: All tests passed!
  • 🚀 Running pre-push checks...
    🔀 Checking for merge conflicts with main...
    ✅ No merge conflicts with main

📁 Changed files:
mobile/lib/blocs/go_live/go_live_cubit.dart
mobile/lib/blocs/go_live/go_live_state.dart
mobile/lib/blocs/live_chat/live_chat_bloc.dart
mobile/lib/blocs/live_chat/live_chat_event.dart
mobile/lib/blocs/live_chat/live_chat_state.dart
mobile/lib/blocs/live_discovery/live_discovery_bloc.dart
mobile/lib/blocs/live_discovery/live_discovery_event.dart
mobile/lib/blocs/live_discovery/live_discovery_state.dart
mobile/lib/blocs/live_room/live_room_bloc.dart
mobile/lib/blocs/live_room/live_room_event.dart
... and 32 more

🧬 Verifying generated files...
✅ Generated files OK

🧪 Running tests for changed files:
test/blocs/go_live/go_live_cubit_test.dart
test/blocs/live_chat/live_chat_bloc_test.dart
test/blocs/live_discovery/live_discovery_bloc_test.dart
test/blocs/live_room/live_room_bloc_test.dart
test/core/feature_flag_test.dart
... and 11 more test files

🏃 Executing tests...
Resolving dependencies...
Downloading packages...
_fe_analyzer_shared 91.0.0 (98.0.0 available)
_flutterfire_internals 1.3.66 (1.3.68 available)
alchemist 0.12.1 (0.14.0 available)
analyzer 8.4.0 (12.0.0 available)
analyzer_buffer 0.1.11 (0.3.1 available)
analyzer_plugin 0.13.10 (0.14.7 available)
! app_device_integrity 1.1.0 from path overrides/app_device_integrity-1.1.0 (overridden)
app_links 6.4.1 (7.0.0 available)
archive 4.0.7 (4.0.9 available)
async 2.13.0 (2.13.1 available)
audio_session 0.2.2 (0.2.3 available)
bip340 0.3.0 (0.3.1 available)
build 4.0.3 (4.0.5 available)
build_config 1.2.0 (1.3.0 available)
build_runner 2.10.4 (2.13.1 available)
built_value 8.12.1 (8.12.5 available)
cli_launcher 0.3.2+1 (0.3.3+1 available)
code_builder 4.11.0 (4.11.1 available)
! connectivity_plus 7.0.0 (overridden) (7.1.0 available)
connectivity_plus_platform_interface 2.0.1 (2.1.0 available)
cookie_jar 4.0.8 (4.0.9 available)
cross_file 0.3.5+1 (0.3.5+2 available)
! cryptography_flutter 2.3.2 from path overrides/cryptography_flutter-2.3.2 (overridden)
cupertino_icons 1.0.8 (1.0.9 available)
custom_lint_core 0.8.1 (0.8.2 available)
custom_lint_visitor 1.0.0+8.4.0 (1.0.0+9.0.0 available)
dart_style 3.1.3 (3.1.8 available)
dbus 0.7.11 (0.7.12 available)
dev_build 1.1.3+1 (1.1.5+2 available)
! device_info_plus 10.1.2 (overridden) (12.4.0 available)
dio 5.9.0 (5.9.2 available)
dio_cookie_manager 3.3.0 (3.4.0 available)
dio_web_adapter 2.1.1 (2.1.2 available)
drift 2.30.0 (2.32.1 available)
drift_dev 2.30.0 (2.32.1 available)
drift_flutter 0.2.8 (0.3.0 available)
ffi 2.1.5 (2.2.0 available)
file_picker 10.3.8 (11.0.1 available)
file_selector_android 0.5.2+4 (0.5.2+5 available)
firebase_analytics 12.1.2 (12.2.0 available)
firebase_analytics_platform_interface 5.0.6 (5.1.0 available)
firebase_analytics_web 0.6.1+2 (0.6.1+4 available)
firebase_core 4.4.0 (4.6.0 available)
firebase_core_platform_interface 6.0.2 (6.0.3 available)
firebase_core_web 3.4.0 (3.5.1 available)
firebase_crashlytics 5.0.7 (5.1.0 available)
firebase_crashlytics_platform_interface 3.8.17 (3.8.19 available)
firebase_performance 0.11.1+4 (0.11.2 available)
firebase_performance_platform_interface 0.1.6+4 (0.1.6+6 available)
firebase_performance_web 0.1.8+2 (0.1.8+4 available)
flutter_local_notifications 19.5.0 (21.0.0 available)
flutter_local_notifications_linux 6.0.0 (8.0.0 available)
flutter_local_notifications_platform_interface 9.1.0 (11.0.0 available)
flutter_local_notifications_windows 1.0.3 (3.0.0 available)
flutter_plugin_android_lifecycle 2.0.33 (2.0.34 available)
flutter_riverpod 3.0.3 (3.3.1 available)
flutter_secure_storage 9.2.4 (10.0.0 available)
flutter_secure_storage_linux 1.2.3 (3.0.0 available)
flutter_secure_storage_macos 3.1.3 (4.0.0 available)
flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available)
flutter_secure_storage_web 1.2.1 (2.1.0 available)
flutter_secure_storage_windows 3.1.2 (4.1.0 available)
flutter_svg 2.2.3 (2.2.4 available)
flutter_web_auth_2 4.1.0 (5.0.1 available)
flutter_web_auth_2_platform_interface 4.1.0 (5.0.0 available)
flutter_webrtc 1.2.0 (1.4.1 available)
freezed 3.2.3 (3.2.5 available)
go_router 16.3.0 (17.2.0 available)
golden_toolkit 0.15.0 (discontinued)
google_fonts 6.3.3 (8.0.2 available)
hive_ce 2.16.0 (2.19.3 available)
hive_ce_flutter 2.3.3 (2.3.4 available)
hive_ce_generator 1.10.0 (1.11.1 available)
image 4.7.2 (4.8.0 available)
image_picker_android 0.8.13+10 (0.8.13+16 available)
image_picker_ios 0.8.13+3 (0.8.13+6 available)
intl 0.19.0 (0.20.2 available)
isolate_channel 0.2.2+1 (0.6.1 available)
js 0.6.7 (0.7.2 available)
json_annotation 4.9.0 (4.11.0 available)
json_serializable 6.11.2 (6.13.1 available)
lints 6.0.0 (6.1.0 available)
livekit_client 2.5.3 (2.7.0 available)
melos 7.3.0 (7.5.1 available)
! meta 1.17.0 (overridden) (1.18.2 available)
mockito 5.6.1 (5.6.4 available)
mustache_template 2.0.2 (2.0.4 available)
package_info_plus 9.0.0 (9.0.1 available)
path_provider_android 2.2.22 (2.2.23 available)
path_provider_foundation 2.5.1 (2.6.0 available)
patrol 4.2.0 (4.5.0 available)
patrol_finders 3.1.0 (3.2.0 available)
patrol_log 0.7.1 (0.8.0 available)
petitparser 7.0.1 (7.0.2 available)
pointycastle 3.9.1 (4.0.0 available)
posix 6.0.3 (6.5.0 available)
pro_image_editor 12.0.13 (12.1.0 available)
process_run 1.2.4 (1.3.2 available)
protobuf 4.2.0 (6.0.0 available)
riverpod 3.0.3 (3.2.1 available)
riverpod_analyzer_utils 1.0.0-dev.7 (1.0.0-dev.9 available)
riverpod_annotation 3.0.3 (4.0.2 available)
riverpod_generator 3.0.3 (4.0.3 available)
! rxdart 0.28.0 (overridden)
share_plus 12.0.1 (12.0.2 available)
shared_preferences 2.5.4 (2.5.5 available)
shared_preferences_android 2.4.18 (2.4.23 available)
shared_preferences_platform_interface 2.4.1 (2.4.2 available)
shelf_web_socket 2.0.1 (3.0.0 available)
skeletonizer 2.1.2 (2.1.3 available)
source_gen 4.1.1 (4.2.2 available)
source_helper 1.3.8 (1.3.11 available)
source_span 1.10.1 (1.10.2 available)
sqflite_android 2.4.2+2 (2.4.2+3 available)
sqflite_common_ffi 2.3.6 (2.4.0+2 available)
sqflite_common_ffi_web 0.4.5+4 (1.1.1 available)
sqlite3 2.9.4 (3.3.0 available)
sqlite3_flutter_libs 0.5.41 (0.6.0+eol available)
sqlparser 0.42.1 (0.44.3 available)
test 1.30.0 (1.31.0 available)
test_api 0.7.10 (0.7.11 available)
test_core 0.6.16 (0.6.17 available)
timezone 0.10.1 (0.11.0 available)
unique_names_generator 3.0.0 (3.1.2 available)
url_launcher_android 6.3.28 (6.3.29 available)
url_launcher_ios 6.3.6 (6.4.1 available)
url_launcher_web 2.4.1 (2.4.2 available)
uuid 4.5.2 (4.5.3 available)
vector_graphics 1.1.19 (1.1.21 available)
vector_graphics_compiler 1.1.19 (1.2.0 available)
vector_math 2.2.0 (2.3.0 available)
video_player 2.10.1 (2.11.1 available)
video_player_android 2.9.1 (2.9.5 available)
video_player_avfoundation 2.8.8 (2.9.4 available)
wakelock_plus 1.4.0 (1.5.1 available)
wakelock_plus_platform_interface 1.3.0 (1.4.0 available)
watcher 1.2.0 (1.2.1 available)
webview_flutter_android 4.10.13 (4.10.15 available)
webview_flutter_platform_interface 2.14.0 (2.15.1 available)
webview_flutter_wkwebview 3.24.1 (3.24.2 available)
win32 5.15.0 (6.0.0 available)
win32_registry 1.1.5 (3.0.2 available)
yaml_edit 2.2.3 (2.2.4 available)
Got dependencies!
1 package is discontinued.
139 packages have newer versions incompatible with dependency constraints.
Try flutter pub outdated for more information.
00:00 +0: loading /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart
00:00 +0: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc start subscribes to chat updates and exposes ready state
00:00 +1: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_chat/live_chat_bloc_test.dart: LiveChatBloc send request trims content and publishes the message
00:00 +2: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then success with active and upcoming rooms grouped by session status
00:00 +3: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_discovery/live_discovery_bloc_test.dart: LiveDiscoveryBloc emits loading then failure when the repository throws
00:00 +4: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_chat_message_test.dart: LiveChatMessage extracts the session id from a session address
00:00 +5: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_presence_test.dart: LivePresence maps coarse Nostr roles to stage and audience permissions
00:00 +6: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_presence_test.dart: LivePresence keeps audience hand-raise state separate from publish ability
00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (setUpAll)
00:00 +7: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit title updates drive form validity
00:00 +8: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit validates the title before creating a room
00:00 +9: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit submit creates a room draft, publishes the room and session, and marks success
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/go_live/go_live_cubit_test.dart: GoLiveCubit (tearDownAll)
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc (setUpAll)
00:00 +10: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_room_test.dart: LiveRoom builds an addressable room identifier from host pubkey and room id
00:00 +11: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
00:00 +12: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request watches room state, fetches a token, and exposes host speaker state
00:00 +13: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/blocs/live_room/live_room_bloc_test.dart: LiveRoomBloc join request emits failure when token fetch fails
00:00 +14: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum should have display names
00:00 +15: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +16: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +17: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +18: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +19: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +20: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession flags a live session as active
00:00 +21: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum integratedApps flag should have correct metadata
00:00 +22: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/models/live/live_session_test.dart: LiveSession parses session status values case-insensitively
00:00 +23: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/core/feature_flag_test.dart: FeatureFlag enum should provide meaningful descriptions
00:01 +24: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository (setUpAll)
00:01 +24: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository watchChatMessages emits queried messages and live chat updates for a session
00:01 +25: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository publishMessage signs with the client signer and publishes the chat event
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_chat_repository_test.dart: LiveChatRepository (tearDownAll)
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers (setUpAll)
00:01 +26: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers exposes live services and repositories from the dedicated provider file
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/providers/live_providers_test.dart: live providers (tearDownAll)
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository (setUpAll)
00:01 +27: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository watchPublicRooms emits the queried rooms and live subscription updates
00:01 +28: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository watchSessions filters by room address and emits live updates
00:01 +29: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository publishRoom signs with the client signer and sends the event
00:01 +30: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository publishSession and publishPresence route through the codec and Nostr client
00:01 +31: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/repositories/live_repository_test.dart: LiveRepository (tearDownAll)
00:01 +31: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live room event from kind 30312
00:01 +32: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses NIP-53 room tags when title is published as room
00:01 +33: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec builds a signed room event from a live room model
00:01 +34: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live session event from kind 30313
00:02 +35: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live presence event from kind 10312
00:02 +36: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_nostr_codec_test.dart: LiveNostrCodec parses a live chat message from kind 1311
00:02 +37: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should read from environment variables
00:02 +38: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide defaults when env vars not set
00:02 +39: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should have debug tools enabled by default in debug builds
00:02 +40: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide all flags with defaults
00:02 +41: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should return consistent values
00:02 +42: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration should provide environment variable key mapping
00:02 +43: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration integratedApps should default to false
00:02 +44: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/build_config_test.dart: BuildConfiguration integratedApps should map to FF_INTEGRATED_APPS env var
00:02 +45: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_api_service_test.dart: (setUpAll)
00:02 +45: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/live_api_service_test.dart: LiveApiService createRoomDraft posts room metadata and parses the response
00:02 +46: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +47: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +48: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +49: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +50: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService connect uses the token boundary and publishes connected state
00:02 +51: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService publishLocalTracks delegates camera and microphone toggles
00:02 +52: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService switchCamera delegates to the room client
00:02 +53: /Users/rabble/code/divine/divine-mobile/.worktrees/live-spaces-v1/mobile/test/services/livekit_room_service_test.dart: LiveKitRoomService disconnect resets the state to disconnected
00:02 +54: All tests passed!

✅ All tests passed!
branch 'codex/live-spaces-v1' set up to track 'origin/codex/live-spaces-v1'. (pre-push hook reran the changed live/model/repository/service/feature-flag tests and passed)

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Member

@NotThatKindOfDrLiz NotThatKindOfDrLiz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pushing this through. The overall layer split is thoughtful, and there is a lot of solid groundwork here across models, codec, repositories, tests, and UI scaffolding.

I do think we should hold merge on a few correctness/integration blockers before we stack more work on top of this.

  1. Live API integration is not wired to the approved backend contract yet.
    The current LiveApiService is still pointed at the generic AppConfig.backendBaseUrl and sends plain JSON headers. The approved live-server contract for this feature is a dedicated control-plane service at https://live.api.divine.video, and authenticated endpoints are expected to use NIP-98.

That means the current client implementation is not just incomplete stylistically; it is pointed at the wrong service boundary and is missing the auth mechanism the backend contract expects for:

  • POST /v1/live/rooms
  • POST /v1/live/rooms/:roomId/sessions
  • POST /v1/live/rooms/:roomId/join
  • POST /v1/live/rooms/:roomId/sessions/:sessionId/end

I think we should fix this in this PR by:

  • adding dedicated live API config instead of deriving from BACKEND_URL
  • wiring NIP-98 for authenticated live control-plane requests
  • updating the tests around LiveApiService to reflect the signed request contract
  1. Speaker promotion is missing the backend-authoritative role-grant call.
    Right now host promote/demote actions update Nostr session state, but the approved backend design makes speaker publish permission server-authoritative. In other words, publishing a speaker roster change is not sufficient on its own to guarantee a promoted speaker can actually receive a publish-capable join token.

The live-server contract calls for:

  • PUT /v1/live/rooms/:roomId/participants/:pubkey/role

Without that follow-up, I think we risk a broken path where the UI and Nostr state say “speaker” but the backend still refuses to mint a publish-capable token.

I would like us to wire that host promote/demote flow before merge, or explicitly cut the feature scope so invited/published speakers are not presented as working yet.

  1. A few side-effecting bloc events need serialization/dropping rather than default concurrent handling.
    I do not think every handler in the live blocs needs a transformer, but I do think some of the important ones do.

In particular, repeated taps / reconnect churn on these paths can duplicate network or media actions:

  • room join / reconnect
  • end session
  • chat send
  • camera/mic toggle actions

At minimum I think we should add explicit transformers or equivalent guards for the events that perform network/media side effects so we do not end up with overlapping joins, duplicate end-session calls, or out-of-order chat sends.

Everything else I noticed I would treat as follow-up debt, not a reason to block this PR by itself:

  • Riverpod is still being used for new live feature wiring instead of moving fully to BLoC-oriented DI
  • several live bloc states store errorMessage strings
  • LiveRoomBloc is carrying some meaningful private mutable state that probably belongs in state over time
  • some widget-level business logic should migrate downward later
  • raw pubkeys and magic live kind numbers should get cleaned up
  • the docs in this PR include absolute local paths that should be scrubbed

But the three items above feel materially different: they affect whether this branch is aligned to the backend we said we are building and whether the core live flows behave correctly under real usage.

If you want, I’m happy to help split the follow-up debt out into separate issues after those blockers are addressed.

@rabble rabble marked this pull request as draft April 9, 2026 04:28
@rabble
Copy link
Copy Markdown
Member Author

rabble commented Apr 28, 2026

Foundations match the multi-doc plan: feature flags, LiveKit dep, Nostr live models + codec, repositories, Riverpod wiring, and Task-5 BLoCs (discovery, room, chat, host) with focused tests. CI is red on 4 of 8 test shards plus the umbrella Mobile CI job — that's broad enough to suggest a compile or shared-init failure, not a single bad test. Combined with the existing CHANGES_REQUESTED state, this needs a rebase + shard-level triage before another review pass.

@rabble rabble force-pushed the codex/live-spaces-v1 branch from 9b8036e to 5a26798 Compare May 6, 2026 15:09
@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


Codex seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 6, 2026

Mobile PR Preview

Preview refreshed for 5a26798

Last refresh: 5a26798 at 2026-05-06 15:15:27 UTC (preview run)

Property Value
Preview URL https://14087618.openvine-app.pages.dev
Pages project openvine-app
Preview branch pr-2812
PR branch codex/live-spaces-v1
Commit 5a26798

@rabble
Copy link
Copy Markdown
Member Author

rabble commented May 11, 2026

Draft review notes

This is a broad and promising Live/Spaces foundation, but it should stay draft. The largest blockers are around session atomicity, routing/deep-link safety, moderation semantics, BLoC state conventions, and l10n/accessibility.

Top findings

  • High: Go Live can publish a public Nostr “live” session before backend start succeeds.

    • mobile/lib/blocs/go_live/go_live_cubit.dart
    • submit() publishes the room/session before liveApiService.startSession(). If backend start fails, clients can discover a live Nostr session with no corresponding backend/LiveKit session. Consider confirming backend session first, or publishing a non-live draft and announcing live only after backend success.
  • High: Route/share identifiers are not URL-encoded.

    • live_room_page.dart, live_room_detail_page.dart, and share URL construction interpolate roomId / sessionId directly into paths. Nostr d tags can contain path-sensitive characters. Use Uri.encodeComponent / decode at route boundaries.
  • High: Several live routes depend on extra objects for correct behavior.

    • Project routing rules prefer URL/deep-link-safe state. The fallback fetch path only searches a limited public room list, so direct links may fail for rooms outside that query window.
  • High: Moderation controls look authoritative but appear mostly local UI state.

    • LiveRoomBloc mute/remove/chat mute mostly update local arrays. If this does not revoke LiveKit permissions, disconnect participants, or publish moderation events, the UI should not imply room-wide enforcement.
  • High: BLoC states store user-facing error strings and BLoCs emit hardcoded copy.

    • Examples include go-live/live-room/live-chat state and cubits. Repo rules require status enums + addError(), with UI mapping to localized copy.
  • Medium: LiveRoomPage constructs BLoCs in state with ref.read(...), capturing Riverpod-provided dependencies that can change on auth/account transitions. Prefer a Page/View split with BlocProvider keyed on watched dependency identity or an explicit recreate strategy.

  • Medium: New live UI is almost entirely hardcoded English and needs an l10n pass before ready.

Security/privacy/accessibility notes

  • Share URLs should encode IDs for safety and correctness.
  • Host moderation must be server/media-layer enforced or clearly described as local-only.
  • Camera/mic permission changes need manual verification on macOS/iOS/Android.
  • The many new interactive controls need a focused accessibility pass for semantic labels, announcements on async events, participant labels, and large-text behavior.

Readiness

Before moving out of draft, I’d want: atomic live session creation, URL-safe routing/share links, reduced reliance on extra, clear moderation enforcement semantics, BLoC error-state cleanup, l10n/accessibility passes, stale Riverpod dependency capture fixed, and platform camera/mic flows manually verified.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(live): add go live spaces beta foundations

3 participants