From a38f417e5dae0ecbcefded49aaae84bf3dced144 Mon Sep 17 00:00:00 2001 From: Chris Nojima Date: Tue, 7 Apr 2026 11:25:02 -0400 Subject: [PATCH 01/30] HOTPOT next 670 clean --- .../skills/migrate-to-static-config/SKILL.md | 13 + .../agents/openai.yaml | 4 + .../references/react-navigation-7.md | 809 ++ .../references/react-navigation-8.md | 767 ++ .../react-native-best-practices/README.md | 95 + .../react-native-best-practices/SKILL.md | 23 + .../react-native-best-practices | 1 + .../references/animations/SKILL.md | 28 + .../animations/animation-functions.md | 168 + .../animations/animations-performance.md | 189 + .../references/animations/animations.md | 285 + .../animations/canvas-animations.md | 467 ++ .../references/animations/canvas-atlas.md | 89 + .../references/animations/gpu-animations.md | 393 + .../animations/layout-animations.md | 149 + .../animations/scroll-and-events.md | 185 + .../references/animations/svg-animations.md | 75 + .../references/audio/SKILL.md | 30 + .../references/audio/audio.md | 182 + .../references/audio/effects-and-analysis.md | 358 + .../references/audio/playback.md | 313 + .../references/audio/recording.md | 298 + .../audio/system-and-notifications.md | 418 + .../references/audio/worklets.md | 236 + .../references/gestures/SKILL.md | 111 + .../gestures/continuous-gestures.md | 278 + .../gestures/gesture-composition.md | 211 + .../references/gestures/gestures.md | 240 + .../gestures/swipeable-and-drawer.md | 155 + .../references/gestures/tap-handling.md | 145 + .../references/gestures/testing.md | 149 + .../references/multithreading/SKILL.md | 77 + .../multithreading/setup-and-advanced.md | 248 + .../multithreading/shared-memory.md | 182 + .../multithreading/threading-api.md | 259 + .../references/on-device-ai/SKILL.md | 75 + .../references/on-device-ai/llm.md | 400 + .../references/on-device-ai/setup.md | 312 + .../references/on-device-ai/speech.md | 322 + .../references/on-device-ai/vision.md | 440 ++ .../references/rich-text/SKILL.md | 302 + .../references/svg/SKILL.md | 17 + .../references/svg/svg.md | 190 + .../references/svg/when-to-use.md | 45 + .../skills/upgrade-react-navigation/SKILL.md | 15 + .../agents/openai.yaml | 4 + .../references/upgrade-6-to-7.md | 321 + .../references/upgrade-7-to-8.md | 417 + .../vercel-react-best-practices/AGENTS.md | 3750 +++++++++ .../vercel-react-best-practices/README.md | 123 + .../vercel-react-best-practices/SKILL.md | 148 + .../rules/_sections.md | 46 + .../rules/_template.md | 28 + .../rules/advanced-effect-event-deps.md | 56 + .../rules/advanced-event-handler-refs.md | 55 + .../rules/advanced-init-once.md | 42 + .../rules/advanced-use-latest.md | 39 + .../rules/async-api-routes.md | 38 + .../async-cheap-condition-before-await.md | 37 + .../rules/async-defer-await.md | 82 + .../rules/async-dependencies.md | 51 + .../rules/async-parallel.md | 28 + .../rules/async-suspense-boundaries.md | 99 + .../rules/bundle-barrel-imports.md | 60 + .../rules/bundle-conditional.md | 31 + .../rules/bundle-defer-third-party.md | 49 + .../rules/bundle-dynamic-imports.md | 35 + .../rules/bundle-preload.md | 50 + .../rules/client-event-listeners.md | 74 + .../rules/client-localstorage-schema.md | 71 + .../rules/client-passive-event-listeners.md | 48 + .../rules/client-swr-dedup.md | 56 + .../rules/js-batch-dom-css.md | 107 + .../rules/js-cache-function-results.md | 80 + .../rules/js-cache-property-access.md | 28 + .../rules/js-cache-storage.md | 70 + .../rules/js-combine-iterations.md | 32 + .../rules/js-early-exit.md | 50 + .../rules/js-flatmap-filter.md | 60 + .../rules/js-hoist-regexp.md | 45 + .../rules/js-index-maps.md | 37 + .../rules/js-length-check-first.md | 49 + .../rules/js-min-max-loop.md | 82 + .../rules/js-request-idle-callback.md | 105 + .../rules/js-set-map-lookups.md | 24 + .../rules/js-tosorted-immutable.md | 57 + .../rules/rendering-activity.md | 26 + .../rules/rendering-animate-svg-wrapper.md | 47 + .../rules/rendering-conditional-render.md | 40 + .../rules/rendering-content-visibility.md | 38 + .../rules/rendering-hoist-jsx.md | 46 + .../rules/rendering-hydration-no-flicker.md | 82 + .../rendering-hydration-suppress-warning.md | 30 + .../rules/rendering-resource-hints.md | 85 + .../rules/rendering-script-defer-async.md | 68 + .../rules/rendering-svg-precision.md | 28 + .../rules/rendering-usetransition-loading.md | 75 + .../rules/rerender-defer-reads.md | 39 + .../rules/rerender-dependencies.md | 45 + .../rules/rerender-derived-state-no-effect.md | 40 + .../rules/rerender-derived-state.md | 29 + .../rules/rerender-functional-setstate.md | 74 + .../rules/rerender-lazy-state-init.md | 58 + .../rules/rerender-memo-with-default-value.md | 38 + .../rules/rerender-memo.md | 44 + .../rules/rerender-move-effect-to-event.md | 45 + .../rules/rerender-no-inline-components.md | 82 + .../rerender-simple-expression-in-memo.md | 35 + .../rules/rerender-split-combined-hooks.md | 64 + .../rules/rerender-transitions.md | 40 + .../rules/rerender-use-deferred-value.md | 59 + .../rerender-use-ref-transient-values.md | 73 + .../rules/server-after-nonblocking.md | 73 + .../rules/server-auth-actions.md | 96 + .../rules/server-cache-lru.md | 41 + .../rules/server-cache-react.md | 76 + .../rules/server-dedup-props.md | 65 + .../rules/server-hoist-static-io.md | 149 + .../rules/server-no-shared-module-state.md | 50 + .../rules/server-parallel-fetching.md | 83 + .../rules/server-parallel-nested-fetching.md | 34 + .../rules/server-serialization.md | 38 + .../vercel-react-native-skills/AGENTS.md | 2897 +++++++ .../vercel-react-native-skills/README.md | 165 + .../vercel-react-native-skills/SKILL.md | 121 + .../rules/_sections.md | 86 + .../rules/_template.md | 28 + .../rules/animation-derived-value.md | 53 + .../rules/animation-gesture-detector-press.md | 95 + .../rules/animation-gpu-properties.md | 65 + .../design-system-compound-components.md | 66 + .../rules/fonts-config-plugin.md | 71 + .../rules/imports-design-system-folder.md | 68 + .../rules/js-hoist-intl.md | 61 + .../rules/list-performance-callbacks.md | 44 + .../list-performance-function-references.md | 132 + .../rules/list-performance-images.md | 53 + .../rules/list-performance-inline-objects.md | 97 + .../rules/list-performance-item-expensive.md | 94 + .../rules/list-performance-item-memo.md | 82 + .../rules/list-performance-item-types.md | 104 + .../rules/list-performance-virtualize.md | 67 + .../rules/monorepo-native-deps-in-app.md | 46 + .../monorepo-single-dependency-versions.md | 63 + .../rules/navigation-native-navigators.md | 188 + .../react-compiler-destructure-functions.md | 50 + ...react-compiler-reanimated-shared-values.md | 48 + .../rules/react-state-dispatcher.md | 91 + .../rules/react-state-fallback.md | 56 + .../rules/react-state-minimize.md | 65 + .../rules/rendering-no-falsy-and.md | 74 + .../rules/rendering-text-in-text-component.md | 36 + .../rules/scroll-position-no-state.md | 82 + .../rules/state-ground-truth.md | 80 + .../rules/ui-expo-image.md | 66 + .../rules/ui-image-gallery.md | 104 + .../rules/ui-measure-views.md | 78 + .../rules/ui-menus.md | 174 + .../rules/ui-native-modals.md | 77 + .../rules/ui-pressable.md | 61 + .../rules/ui-safe-area-scroll.md | 65 + .../rules/ui-scrollview-content-inset.md | 45 + .../rules/ui-styling.md | 87 + .claude-plugin/plugin.json | 4 + .claude/hooks/pre-commit-check.sh | 20 + .claude/settings.json | 34 + .claude/skills | 1 + .gitignore | 4 +- AGENTS.md | 14 + CLAUDE.md | 19 + go/auth/credential_authority_test.go | 6 +- go/avatars/fileurilze_nix.go | 1 - go/avatars/fileurlize_windows.go | 1 - go/avatars/fullcaching.go | 27 +- go/avatars/simple.go | 7 +- go/avatars/srv.go | 4 +- go/avatars/urlcaching.go | 7 +- go/bind/dns_ios.go | 1 - go/bind/dns_other.go | 1 - go/bind/keybase.go | 10 +- go/bind/keystore_android.go | 1 - go/bind/notifications.go | 45 + go/blindtree/defaults.go | 4 +- go/blindtree/values.go | 2 +- go/blindtree/values_test.go | 2 +- go/chat/archive.go | 1 - go/chat/attachment_httpsrv.go | 14 +- go/chat/attachments/audio.go | 6 +- go/chat/attachments/preview.go | 14 +- go/chat/attachments/preview_android.go | 1 - go/chat/attachments/preview_darwin.go | 1 - go/chat/attachments/preview_darwin_ios.go | 1 - go/chat/attachments/preview_darwin_noios.go | 1 - go/chat/attachments/preview_dummy.go | 1 - go/chat/attachments/quarantine.go | 1 - go/chat/attachments/quarantine_darwin.go | 1 - go/chat/attachments/quarantine_windows.go | 1 - go/chat/attachments/utils.go | 2 +- go/chat/botcommands_test.go | 2 +- go/chat/boxer.go | 14 +- go/chat/boxer_canned_test.go | 2 +- go/chat/commands/giphy_test.go | 2 +- go/chat/convdevstorage.go | 8 +- go/chat/convloader.go | 5 +- go/chat/convloader_test.go | 10 +- go/chat/convsource_test.go | 6 +- go/chat/devstorage.go | 4 +- go/chat/emojisource.go | 5 +- go/chat/ephemeral_purge_tracker.go | 4 +- go/chat/ephemeral_purger.go | 4 +- go/chat/ephemeral_purger_test.go | 2 +- go/chat/errors.go | 12 +- go/chat/flip/chat_test.go | 8 +- go/chat/flip/dealer.go | 2 +- go/chat/flip/dealer_test.go | 4 +- go/chat/flip/flip.go | 2 +- go/chat/flip/msgpack.go | 4 +- go/chat/flip/prng.go | 2 +- go/chat/flip/prng_test.go | 2 +- go/chat/flip/prot.go | 2 +- go/chat/flipmanager.go | 6 +- go/chat/flipmanager_test.go | 4 +- go/chat/gallery_test.go | 2 +- go/chat/globals/context.go | 2 +- go/chat/globals/context_test.go | 4 +- go/chat/helper.go | 2 +- go/chat/helper_test.go | 6 +- go/chat/identify.go | 2 +- go/chat/inboxsource_test.go | 2 +- go/chat/journey_card_manager.go | 28 +- go/chat/livelocation_test.go | 2 +- go/chat/localizer.go | 2 +- go/chat/maps/livelocation.go | 2 +- go/chat/maps/srv.go | 4 +- go/chat/maps/track.go | 2 +- go/chat/pager/pager.go | 8 +- go/chat/participantsource.go | 13 +- go/chat/push.go | 14 +- go/chat/remoteclient.go | 10 +- go/chat/replyto_test.go | 2 +- go/chat/retry_test.go | 10 +- go/chat/s3/s3.go | 17 +- go/chat/search/indexer.go | 6 +- go/chat/search/regexp_searcher.go | 10 +- go/chat/search/session.go | 10 +- go/chat/search/storage.go | 5 +- go/chat/search/utils.go | 5 +- go/chat/search_test.go | 6 +- go/chat/sender.go | 2 +- go/chat/sender_test.go | 25 +- go/chat/server.go | 5 +- go/chat/server_test.go | 59 +- go/chat/signencrypt/codec.go | 6 +- go/chat/signencrypt/codec_test.go | 8 +- go/chat/signencrypt/example/main.go | 2 +- go/chat/storage/basebox.go | 4 +- go/chat/storage/blockengine_memcache.go | 4 +- go/chat/storage/checkers.go | 2 +- go/chat/storage/errors.go | 2 +- go/chat/storage/inbox.go | 5 +- go/chat/storage/inbox_test.go | 8 +- go/chat/storage/outbox_test.go | 10 +- go/chat/storage/storage.go | 17 +- go/chat/storage/storage_test.go | 6 +- go/chat/subteam_rename_test.go | 2 +- go/chat/tlf.go | 2 +- go/chat/transcripts_test.go | 2 +- go/chat/types/interfaces.go | 12 +- go/chat/uiinboxloader.go | 11 +- go/chat/uiinboxloader_test.go | 8 +- go/chat/uithreadloader.go | 2 +- go/chat/unfurl/cache.go | 4 +- go/chat/unfurl/extractor_test.go | 7 +- go/chat/unfurl/settings_test.go | 4 +- go/chat/unfurl/unfurler_test.go | 2 +- go/chat/unfurl_test.go | 4 +- go/chat/utils/utils.go | 34 +- go/chat/wallet/parser.go | 2 +- go/chat/wallet/sender.go | 8 +- go/chatrender/chat_cli_rendering.go | 11 +- go/citogo/main.go | 2 +- go/client/chat_api_handler.go | 2 +- go/client/chat_api_listen_display.go | 9 +- go/client/chat_svc_handler.go | 7 +- go/client/cmd_chat_addtochannel.go | 4 +- go/client/cmd_chat_api_listen.go | 8 +- go/client/cmd_chat_removefromchannel.go | 4 +- go/client/cmd_chat_retention.go | 2 +- go/client/cmd_chat_search_profile.go | 1 - go/client/cmd_contacts_debug.go | 1 - go/client/cmd_ctl_autostart.go | 1 - go/client/cmd_ctl_nix.go | 1 - go/client/cmd_ctl_restart.go | 1 - go/client/cmd_ctl_restart_osx.go | 1 - go/client/cmd_ctl_start.go | 1 - go/client/cmd_ctl_start_osx.go | 5 +- go/client/cmd_ctl_stop.go | 1 - go/client/cmd_ctl_stop_osx.go | 1 - go/client/cmd_ctl_watchdog.go | 8 +- go/client/cmd_decrypt.go | 2 +- go/client/cmd_device_remove.go | 10 +- go/client/cmd_fuse_osx.go | 1 - go/client/cmd_install_osx.go | 1 - go/client/cmd_kbfs_mount.go | 1 - go/client/cmd_launchd_osx.go | 1 - go/client/cmd_pipe_owner.go | 1 - go/client/cmd_rekey.go | 1 - go/client/cmd_rekey_devel.go | 1 - go/client/cmd_rekey_trigger.go | 1 - go/client/cmd_show_notifications.go | 2 +- go/client/cmd_sigs_list.go | 4 +- go/client/cmd_simplefs_sync_enable.go | 9 +- go/client/cmd_stress.go | 5 +- go/client/cmd_team_add_members_bulk.go | 4 +- go/client/cmd_team_ftl.go | 4 +- go/client/cmd_wallet_cancel_all.go | 2 +- go/client/cmd_wallet_history.go | 2 +- go/client/cmd_wot_list.go | 2 +- go/client/color.go | 6 +- go/client/commands_devel.go | 1 - go/client/commands_nix.go | 1 - go/client/commands_osx.go | 1 - go/client/commands_production.go | 1 - go/client/commands_windows.go | 1 - go/client/contact_settings_api_handler.go | 2 +- go/client/display_nix.go | 1 - go/client/fork_server.go | 2 +- go/client/json_api_common.go | 16 +- go/client/kvstore_api_handler.go | 2 +- go/client/markup.go | 2 +- go/client/passphrase_prompt.go | 2 +- go/client/pgp_ui.go | 4 +- .../platform_specific_ctl_commands_linux.go | 1 - .../platform_specific_ctl_commands_other.go | 1 - go/client/provision_ui.go | 2 +- go/client/simplefs_ls.go | 12 +- go/client/stellar_common.go | 4 +- go/client/team_api_handler.go | 2 +- go/client/ui.go | 8 +- go/client/wallet_api_handler.go | 2 +- go/client/wallet_api_listen_display.go | 6 +- go/contacts/contacts.go | 5 +- go/contacts/mocks.go | 1 - go/encrypteddb/db.go | 8 +- go/encrypteddb/file.go | 4 +- go/engine/account_delete_test.go | 1 - go/engine/background_task.go | 2 +- go/engine/bug_3964_repairman_test.go | 32 +- go/engine/concurrency_test.go | 16 +- go/engine/deprovision_test.go | 2 +- go/engine/device_add.go | 2 +- go/engine/engine.go | 7 +- go/engine/favorite_add.go | 2 +- go/engine/features_test.go | 2 +- go/engine/kex2_provisionee.go | 2 +- go/engine/login_provision.go | 6 +- go/engine/login_test.go | 16 +- go/engine/logout.go | 11 +- go/engine/merkle_client_historical_test.go | 6 +- go/engine/paperkey_test.go | 2 +- go/engine/passphrase_change_test.go | 4 +- go/engine/pgp_import_key.go | 2 +- go/engine/provision_utils.go | 2 +- go/engine/puk_upgrade_background_test.go | 4 +- go/engine/scanproofs.go | 2 +- go/engine/template.go | 1 - go/engine/template_test.go | 1 - go/engine/track_test.go | 2 +- go/engine/wot_react.go | 2 +- go/engine/wot_vouch.go | 2 +- go/ephemeral/device_ek_storage.go | 22 +- go/ephemeral/device_ek_storage_test.go | 2 +- go/ephemeral/lib.go | 4 +- go/ephemeral/team_ek.go | 2 +- go/ephemeral/teambot_ek.go | 2 +- go/ephemeral/user_ek_box_storage.go | 12 +- go/ephemeral/user_ek_box_storage_test.go | 2 +- go/externals/implicit_team_test.go | 8 +- go/externals/proof_checkers_devel.go | 1 - go/externals/proof_checkers_production.go | 1 - go/externals/proof_service_rooter.go | 1 - go/externalstest/test_common.go | 1 - go/git/get.go | 2 +- go/go.mod | 1 + go/gregor/client/client.go | 2 +- go/home/home.go | 5 +- go/install/fuse_status_darwin.go | 1 - go/install/fuse_status_darwin_test.go | 1 - go/install/fuse_status_default.go | 1 - go/install/fuse_status_windows.go | 1 - go/install/install.go | 8 +- go/install/install_darwin_test.go | 1 - go/install/install_darwinwindows.go | 1 - go/install/install_default.go | 1 - go/install/install_nix.go | 1 - go/install/install_test.go | 1 - go/install/install_unix.go | 1 - go/install/install_windows_test.go | 1 - go/install/libnativeinstaller/app.go | 8 +- go/install/stop_darwin.go | 1 - go/install/stop_nix.go | 1 - go/install/stop_windows.go | 1 - go/install/terminate_mobile.go | 1 - go/install/terminate_nonmobile.go | 1 - go/install/update.go | 1 - go/install/winversion.go | 1 - go/jsonhelpers/json_helpers.go | 4 +- go/kbcrypto/signature_prefix_devel.go | 1 - go/kbcrypto/signature_prefix_production.go | 1 - go/kbfs/cache/cache.go | 2 +- go/kbfs/cache/size_utils.go | 2 +- go/kbfs/data/bcache.go | 2 +- go/kbfs/data/bcache_test.go | 4 +- go/kbfs/data/block_tree.go | 23 +- go/kbfs/data/block_types.go | 5 +- go/kbfs/data/block_types_test.go | 5 +- go/kbfs/data/bsplitter_simple.go | 9 +- go/kbfs/data/data_types.go | 2 +- go/kbfs/data/dirty_bcache.go | 12 +- go/kbfs/data/file_data.go | 10 +- go/kbfs/data/file_data_test.go | 28 +- go/kbfs/data/path_part_string.go | 4 +- go/kbfs/dokan/cgo.go | 1 - go/kbfs/dokan/debug_none.go | 5 +- go/kbfs/dokan/debug_stderr.go | 1 - go/kbfs/dokan/dokan_test.go | 1 - go/kbfs/dokan/filesystem.go | 2 +- go/kbfs/dokan/loaddll.go | 1 - go/kbfs/dokan/testfs_test.go | 1 - go/kbfs/dokan/winacl/debug.go | 1 - go/kbfs/dokan/winacl/dummy.go | 1 - go/kbfs/idutil/data_types.go | 14 +- go/kbfs/idutil/local.go | 19 +- go/kbfs/ioutil/is_exist_default.go | 1 - go/kbfs/ioutil/json.go | 4 +- go/kbfs/kbfsblock/id_test.go | 2 +- go/kbfs/kbfsblock/quota.go | 2 +- go/kbfs/kbfsblock/server_errors.go | 4 +- go/kbfs/kbfscodec/codec.go | 16 +- go/kbfs/kbfscodec/codec_msgpack.go | 30 +- go/kbfs/kbfscodec/codec_msgpack_test.go | 2 +- go/kbfs/kbfscodec/mock_codec.go | 6 +- go/kbfs/kbfscodec/unknown_fields_test_util.go | 2 +- go/kbfs/kbfscrypto/auth_token.go | 5 +- go/kbfs/kbfscrypto/crypto_key_types.go | 2 +- go/kbfs/kbfscrypto/crypto_key_types_test.go | 58 +- go/kbfs/kbfscrypto/pad_test.go | 2 +- go/kbfs/kbfsdokan/defaults.go | 1 - go/kbfs/kbfsdokan/defaults_production.go | 1 - go/kbfs/kbfsdokan/defaults_staging.go | 1 - go/kbfs/kbfsedits/tlf_history.go | 4 +- go/kbfs/kbfsedits/tlf_history_test.go | 4 +- go/kbfs/kbfsedits/user_history.go | 9 +- go/kbfs/kbfsedits/user_history_test.go | 6 +- go/kbfs/kbfsfuse/defaults.go | 1 - go/kbfs/kbfsfuse/defaults_production.go | 1 - go/kbfs/kbfsfuse/defaults_staging.go | 1 - go/kbfs/kbfsfuse/main.go | 1 - go/kbfs/kbfsgit/runner.go | 7 +- go/kbfs/kbfsgit/runner_test.go | 4 +- go/kbfs/kbfsmd/key_bundle.go | 9 +- go/kbfs/kbfsmd/key_bundle_v3.go | 4 +- go/kbfs/kbfsmd/merkle_leaf.go | 4 +- go/kbfs/kbfsmd/root_metadata_test.go | 2 - go/kbfs/kbfsmd/root_metadata_v2.go | 7 +- go/kbfs/kbfsmd/root_metadata_v2_test.go | 7 +- go/kbfs/kbfsmd/root_metadata_v3.go | 15 +- go/kbfs/kbfsmd/server_errors.go | 4 +- go/kbfs/kbfssync/repeated_wait_group_test.go | 8 +- go/kbfs/kbfssync/semaphore_test.go | 8 +- go/kbfs/kbfstool/md_dump.go | 10 +- go/kbfs/ldbutils/count_meter.go | 2 +- go/kbfs/ldbutils/count_meter_test.go | 2 +- go/kbfs/libdokan/createfile_test.go | 1 - go/kbfs/libdokan/dokan_info.go | 2 +- go/kbfs/libdokan/dummy.go | 1 - go/kbfs/libdokan/fs.go | 4 +- go/kbfs/libdokan/mount_test.go | 1 - go/kbfs/libdokan/new_folder_name.go | 1 - go/kbfs/libdokan/noexec_test.go | 1 - go/kbfs/libfs/file_info.go | 4 +- go/kbfs/libfs/fs.go | 6 +- go/kbfs/libfs/json.go | 2 +- go/kbfs/libfs/profilelist.go | 8 +- go/kbfs/libfs/wrapped_read_file_info.go | 2 +- go/kbfs/libfuse/alias.go | 1 - go/kbfs/libfuse/archive_reltime_file.go | 1 - go/kbfs/libfuse/block_size.go | 1 - go/kbfs/libfuse/common.go | 1 - go/kbfs/libfuse/constants_darwin.go | 1 - go/kbfs/libfuse/debug.go | 9 +- go/kbfs/libfuse/debug_server_file.go | 1 - go/kbfs/libfuse/dir.go | 1 - go/kbfs/libfuse/error_file.go | 1 - go/kbfs/libfuse/errors.go | 1 - go/kbfs/libfuse/external_file.go | 1 - go/kbfs/libfuse/file.go | 1 - go/kbfs/libfuse/file_info_file.go | 1 - go/kbfs/libfuse/folderlist.go | 1 - go/kbfs/libfuse/fs.go | 1 - go/kbfs/libfuse/fs_darwin.go | 1 - go/kbfs/libfuse/fs_default.go | 1 - go/kbfs/libfuse/journal_control_file.go | 1 - go/kbfs/libfuse/metrics_file.go | 1 - go/kbfs/libfuse/mount_test.go | 10 +- go/kbfs/libfuse/mounter.go | 1 - go/kbfs/libfuse/mounter_non_osx.go | 1 - go/kbfs/libfuse/open_file_count_file.go | 1 - go/kbfs/libfuse/platform_flags_non_osx.go | 1 - go/kbfs/libfuse/platform_flags_osx.go | 1 - go/kbfs/libfuse/prefetch_file.go | 1 - go/kbfs/libfuse/profilelist.go | 1 - go/kbfs/libfuse/quarantine.go | 1 - go/kbfs/libfuse/quarantine_darwin.go | 1 - go/kbfs/libfuse/quarantine_others.go | 1 - go/kbfs/libfuse/reclaim_quota_file.go | 1 - go/kbfs/libfuse/rekey_file.go | 1 - go/kbfs/libfuse/reset_caches_file.go | 1 - go/kbfs/libfuse/special_files.go | 1 - go/kbfs/libfuse/special_read_file.go | 1 - go/kbfs/libfuse/start.go | 1 - go/kbfs/libfuse/status_file.go | 1 - go/kbfs/libfuse/symlink.go | 1 - go/kbfs/libfuse/sync_control_file.go | 1 - go/kbfs/libfuse/sync_from_server_file.go | 1 - go/kbfs/libfuse/tlf.go | 1 - go/kbfs/libfuse/tlf_edit_history_file.go | 1 - go/kbfs/libfuse/unstage_file.go | 1 - go/kbfs/libfuse/updates_file.go | 1 - go/kbfs/libfuse/user_edit_history_file.go | 1 - go/kbfs/libgit/autogit_manager.go | 15 +- go/kbfs/libgit/autogit_node_wrappers.go | 4 +- go/kbfs/libgit/browser.go | 8 +- go/kbfs/libgit/browser_file.go | 10 +- go/kbfs/libgit/browser_file_info.go | 2 +- go/kbfs/libgit/diff_file_info.go | 2 +- go/kbfs/libgit/lfs_file_info.go | 2 +- go/kbfs/libgit/repo_test.go | 3 +- go/kbfs/libgit/submodule_file_info.go | 2 +- go/kbfs/libkbfs/backpressure_disk_limiter.go | 2 +- .../libkbfs/backpressure_disk_limiter_test.go | 8 +- go/kbfs/libkbfs/block_journal.go | 9 +- go/kbfs/libkbfs/block_ops_test.go | 6 +- go/kbfs/libkbfs/block_put_state_memory.go | 14 +- go/kbfs/libkbfs/block_ref_map.go | 5 +- go/kbfs/libkbfs/block_retrieval_heap.go | 4 +- go/kbfs/libkbfs/block_retrieval_queue.go | 6 +- .../libkbfs/block_retrieval_worker_test.go | 4 +- go/kbfs/libkbfs/block_util.go | 5 +- go/kbfs/libkbfs/channels.go | 6 +- go/kbfs/libkbfs/chat_local.go | 5 +- go/kbfs/libkbfs/choosedefaultmount_nix.go | 1 - go/kbfs/libkbfs/choosedefaultmount_windows.go | 1 - go/kbfs/libkbfs/coalescing_context_test.go | 3 +- go/kbfs/libkbfs/config_local.go | 5 +- go/kbfs/libkbfs/conflict_resolver.go | 18 +- go/kbfs/libkbfs/conflict_resolver_test.go | 4 +- go/kbfs/libkbfs/connection_status.go | 5 +- go/kbfs/libkbfs/cr_actions.go | 9 +- go/kbfs/libkbfs/cr_chains.go | 41 +- go/kbfs/libkbfs/cr_chains_test.go | 4 +- go/kbfs/libkbfs/crypto_client_test.go | 20 +- go/kbfs/libkbfs/crypto_common_test.go | 7 +- .../default_blocks_in_mem_cache_386.go | 1 - .../default_blocks_in_mem_cache_64bit.go | 1 - go/kbfs/libkbfs/disk_block_cache.go | 6 +- go/kbfs/libkbfs/disk_block_cache_test.go | 14 +- go/kbfs/libkbfs/disk_block_cache_wrapped.go | 9 +- go/kbfs/libkbfs/disk_journal.go | 6 +- go/kbfs/libkbfs/disk_journal_test.go | 8 +- go/kbfs/libkbfs/disk_limiter.go | 2 +- go/kbfs/libkbfs/disk_limits_unix.go | 1 - go/kbfs/libkbfs/fetch_decider.go | 4 +- go/kbfs/libkbfs/flag_size.go | 2 +- go/kbfs/libkbfs/folder_block_manager.go | 34 +- go/kbfs/libkbfs/folder_block_manager_test.go | 4 +- go/kbfs/libkbfs/folder_block_ops.go | 5 +- go/kbfs/libkbfs/folder_branch_ops.go | 12 +- go/kbfs/libkbfs/folder_branch_status.go | 4 +- go/kbfs/libkbfs/folder_branch_status_test.go | 2 +- go/kbfs/libkbfs/journal_manager.go | 12 +- go/kbfs/libkbfs/journal_manager_test.go | 3 +- go/kbfs/libkbfs/journal_manager_util.go | 5 +- go/kbfs/libkbfs/journal_md_ops_test.go | 2 +- go/kbfs/libkbfs/kbfs_cr_test.go | 10 +- go/kbfs/libkbfs/kbfs_ops.go | 5 +- go/kbfs/libkbfs/kbfs_ops_concur_test.go | 42 +- go/kbfs/libkbfs/kbfs_ops_test.go | 4 +- go/kbfs/libkbfs/kbfs_service.go | 4 +- go/kbfs/libkbfs/keybase_daemon_local.go | 2 +- go/kbfs/libkbfs/keybase_daemon_rpc_test.go | 18 +- go/kbfs/libkbfs/keybase_service_base.go | 21 +- go/kbfs/libkbfs/keycache_test.go | 4 +- go/kbfs/libkbfs/md_id_journal.go | 2 +- go/kbfs/libkbfs/md_journal_test.go | 9 +- go/kbfs/libkbfs/md_ops.go | 5 +- go/kbfs/libkbfs/md_ops_test.go | 10 +- go/kbfs/libkbfs/md_util.go | 7 +- go/kbfs/libkbfs/mdserver_memory.go | 5 +- go/kbfs/libkbfs/ops.go | 32 +- go/kbfs/libkbfs/ops_test.go | 31 +- go/kbfs/libkbfs/prefetcher.go | 2 +- go/kbfs/libkbfs/rekey_queue_test.go | 2 +- go/kbfs/libkbfs/root_metadata_test.go | 3 - go/kbfs/libkbfs/safe_test_reporter_test.go | 4 +- go/kbfs/libkbfs/semaphore_disk_limiter.go | 2 +- go/kbfs/libkbfs/sigpwr_supported.go | 1 - go/kbfs/libkbfs/sigpwr_unsupported.go | 1 - go/kbfs/libkbfs/subscription_manager_test.go | 14 +- go/kbfs/libkbfs/test_common.go | 14 +- go/kbfs/libkbfs/tlf_journal_test.go | 38 +- go/kbfs/libkbfs/trace_logger.go | 2 +- go/kbfs/libkbfs/unflushed_path_cache.go | 11 +- go/kbfs/libkbfs/util.go | 4 +- .../libkbfs/verify_local_block_id_devel.go | 1 - .../verify_local_block_id_production.go | 1 - .../libpages/config/per_path_configs_v1.go | 2 +- go/kbfs/libpages/server.go | 4 +- go/kbfs/libpages/stats_mysql_test.go | 1 - go/kbfs/libpages/stats_test.go | 2 +- go/kbfs/metricsutil/registry_to_map.go | 12 +- go/kbfs/metricsutil/write_metrics.go | 4 +- go/kbfs/redirector/disable_dumpable.go | 1 - go/kbfs/redirector/disable_dumpable_linux.go | 1 - go/kbfs/redirector/main.go | 1 - go/kbfs/search/doc_types.go | 16 +- go/kbfs/search/indexed_block_db.go | 2 +- go/kbfs/search/indexer.go | 2 +- go/kbfs/search/mapping.go | 2 +- go/kbfs/simplefs/archive.go | 5 +- go/kbfs/simplefs/platform.go | 1 - go/kbfs/simplefs/platform_windows.go | 1 - go/kbfs/simplefs/simplefs.go | 11 +- go/kbfs/simplefs/simplefs_test.go | 7 +- go/kbfs/simplefs/upload_manager.go | 2 +- go/kbfs/stderrutils/dup_stderr_nix.go | 1 - go/kbfs/sysutils/pid_path_others.go | 1 - go/kbfs/test/benchmark_test.go | 4 +- go/kbfs/test/dsl_test.go | 16 +- go/kbfs/test/engine.go | 4 +- go/kbfs/test/engine_libkbfs.go | 2 +- go/kbfs/test/fast_forward_test.go | 2 +- go/kbfs/test/journal_test.go | 14 +- go/kbfs/test/qr_test.go | 2 +- go/kbfs/test/run_dokan_test.go | 1 - go/kbfs/test/run_fuse_test.go | 1 - go/kbfs/test/run_kbfs_test.go | 1 - go/kbfs/test/simple_nonfuse_test.go | 1 - go/kbfs/test/truncate_test.go | 2 +- go/kbfs/tlf/handle.go | 8 +- go/kbfs/tlf/handle_extension.go | 8 +- go/kbfs/tlfhandle/handle.go | 17 +- go/kbfs/tlfhandle/identify_util.go | 5 +- go/kbhttp/manager/manager.go | 4 +- go/kbhttp/srv.go | 2 +- go/kbnm/findbin_nix.go | 1 - go/kbnm/findbin_windows.go | 1 - go/kbnm/handler.go | 2 +- go/kbnm/hostmanifest/whitelist_darwin.go | 1 - go/kbnm/hostmanifest/whitelist_nix.go | 1 - go/kbnm/main.go | 10 +- go/kbtest/chat.go | 8 +- go/kbtime/humanize_test.go | 1 - go/kex2/base.go | 2 +- go/kex2/provisionee.go | 2 +- go/kex2/provisioner.go | 2 +- go/kex2/rpc_test.go | 14 +- go/kex2/transport_test.go | 6 +- go/keybase/generate_windows.go | 1 - go/launchd/launchd.go | 13 +- go/launchd/launchd_test.go | 3 +- go/libcmdline/fork_nix.go | 1 - go/libcmdline/fork_windows.go | 1 - go/libkb/api.go | 22 +- go/libkb/api_stub.go | 1 - go/libkb/api_stub_html.go | 1 - go/libkb/assertion.go | 16 +- go/libkb/basex.go | 2 +- go/libkb/bgticker_test.go | 2 +- go/libkb/burst_cache.go | 6 +- go/libkb/chain_link_v2.go | 2 +- go/libkb/chain_link_v2_test.go | 4 +- go/libkb/client.go | 6 +- go/libkb/config.go | 8 +- go/libkb/constants_brew.go | 1 - go/libkb/constants_devel.go | 1 - go/libkb/constants_nonbrew.go | 1 - go/libkb/constants_nonproduction.go | 1 - go/libkb/constants_production.go | 1 - go/libkb/constants_staging.go | 1 - go/libkb/context.go | 12 +- go/libkb/db.go | 28 +- go/libkb/deprovision.go | 2 +- go/libkb/disable_backup_darwin.go | 1 - go/libkb/disable_backup_darwin_test.go | 1 - go/libkb/disable_backup_default.go | 1 - go/libkb/env.go | 2 +- go/libkb/env_default.go | 1 - go/libkb/env_ios.go | 1 - go/libkb/env_windows_test.go | 1 - go/libkb/erasable_kv_store.go | 14 +- go/libkb/erasable_kv_store_test.go | 2 +- go/libkb/errors.go | 26 +- go/libkb/features.go | 18 +- go/libkb/file_test.go | 4 +- go/libkb/flock_nix.go | 1 - go/libkb/flock_windows.go | 1 - go/libkb/flock_windows_test.go | 1 - go/libkb/generickey.go | 2 +- go/libkb/globals.go | 14 +- go/libkb/gpg_cli_test.go | 2 +- go/libkb/home_nix_test.go | 1 - go/libkb/home_windows_test.go | 1 - go/libkb/id_table.go | 10 +- go/libkb/interfaces.go | 46 +- go/libkb/json.go | 24 +- go/libkb/json_test.go | 4 +- go/libkb/keyfamily.go | 41 +- go/libkb/leveldb_cleaner.go | 4 +- go/libkb/link_cache.go | 2 +- go/libkb/link_cache_test.go | 8 +- go/libkb/lksec.go | 2 +- go/libkb/loaduser_test.go | 2 +- go/libkb/login_session_test.go | 2 +- go/libkb/loopback.go | 9 +- go/libkb/markup.go | 2 +- go/libkb/merkle_client.go | 2 +- go/libkb/merkle_reset_chain.go | 4 +- go/libkb/net_context.go | 2 +- go/libkb/osv_darwin.go | 1 - go/libkb/osv_fallback.go | 1 - go/libkb/osv_nix.go | 1 - go/libkb/osv_windows.go | 1 - go/libkb/paperkey_phrase.go | 2 +- go/libkb/passphrase_helper.go | 4 +- go/libkb/passphrase_login.go | 2 +- go/libkb/per_user_key.go | 7 +- go/libkb/pgp_key_test.go | 2 +- go/libkb/pipeowner_windows.go | 1 - go/libkb/ptrace_osx.go | 1 - go/libkb/ptrace_other.go | 1 - go/libkb/remote_proof_links.go | 9 +- go/libkb/rpc_exim.go | 10 +- go/libkb/saferdllloading_dummy.go | 1 - go/libkb/saltpack_test.go | 2 +- go/libkb/secret_store.go | 13 +- go/libkb/secret_store_android.go | 1 - go/libkb/secret_store_common.go | 1 - go/libkb/secret_store_darwin.go | 7 +- go/libkb/secret_store_darwin_devel.go | 1 - go/libkb/secret_store_darwin_production.go | 1 - go/libkb/secret_store_darwin_test.go | 5 +- go/libkb/secret_store_external.go | 1 - go/libkb/secret_store_ios.go | 1 - go/libkb/secret_store_linux.go | 1 - go/libkb/secret_store_osx.go | 1 - go/libkb/secret_store_other.go | 1 - go/libkb/secret_store_secretservice.go | 1 - go/libkb/secret_store_secretservice_test.go | 1 - go/libkb/secret_store_test.go | 4 +- go/libkb/secret_store_upgradeable_test.go | 6 +- go/libkb/secwords.go | 2 +- go/libkb/service_info.go | 2 +- go/libkb/sig_chain_test.go | 46 +- go/libkb/socket_nix.go | 1 - go/libkb/socket_windows.go | 1 - go/libkb/socket_windows_test.go | 1 - go/libkb/test_common.go | 23 +- go/libkb/upak_loader_test.go | 4 +- go/libkb/util.go | 49 +- go/libkb/util_nix.go | 1 - go/libkb/util_test.go | 8 +- go/libkb/util_windows.go | 1 - go/libkb/vdebug.go | 10 +- go/libkb/version.go | 2 +- go/libkb/vlock.go | 2 +- go/libkb/warning.go | 2 +- go/libkb/wot.go | 8 +- go/logger/adapter.go | 24 +- go/logger/context_with_logging.go | 14 +- go/logger/file.go | 2 +- go/logger/formats_nix.go | 1 - go/logger/formats_windows.go | 1 - go/logger/logger.go | 66 +- go/logger/null.go | 34 +- go/logger/output_nix.go | 1 - go/logger/output_windows.go | 1 - go/logger/redirect_stderr_dummy.go | 1 - go/logger/redirect_stderr_linux.go | 1 - go/logger/redirect_stderr_nix.go | 1 - go/logger/rpc_adapter.go | 32 +- go/logger/single_context_logger.go | 32 +- go/logger/standard.go | 61 +- go/logger/test_logger.go | 54 +- go/lru/disk_lru.go | 10 +- go/lru/lru.go | 8 +- go/lru/lru_test.go | 6 +- go/merkle/types.go | 2 +- go/merkle/util_test.go | 1 - go/merklestore/store.go | 2 +- go/merkletree2/config.go | 14 +- go/merkletree2/encoders.go | 20 +- go/merkletree2/interfaces.go | 2 +- go/merkletree2/tree.go | 6 +- go/merkletree2/tree_test.go | 2 +- go/merkletree2/util_for_test.go | 32 +- go/minterm/minterm_nix.go | 1 - go/minterm/minterm_windows.go | 1 - go/mounter/mounter.go | 6 +- go/mounter/mounter_nix.go | 1 - go/mounter/mounter_non_osx.go | 1 - go/mounter/mounter_osx.go | 1 - go/mounter/mounter_windows.go | 1 - go/msgpack/msgpack.go | 8 +- go/offline/rpc_cache.go | 18 +- go/offline/rpc_cache_test.go | 6 +- go/pinentry/pinentry_nix.go | 1 - go/pinentry/pinentry_osx.go | 1 - go/pinentry/pinentry_windows.go | 1 - go/pinentry/pinentry_x11.go | 1 - go/profiling/timetracer.go | 6 +- go/protocol/chat1/api.go | 5 +- go/protocol/chat1/blocking.go | 8 +- go/protocol/chat1/chat_ui.go | 200 +- go/protocol/chat1/commands.go | 5 +- go/protocol/chat1/common.go | 14 +- go/protocol/chat1/decorate.go | 2 +- go/protocol/chat1/emoji.go | 5 +- go/protocol/chat1/extras.go | 68 +- go/protocol/chat1/gregor.go | 5 +- go/protocol/chat1/local.go | 812 +- go/protocol/chat1/notify.go | 176 +- go/protocol/chat1/remote.go | 320 +- go/protocol/chat1/unfurl.go | 14 +- go/protocol/chat1/wallet.go | 2 +- go/protocol/gregor1/auth.go | 8 +- go/protocol/gregor1/auth_internal.go | 11 +- go/protocol/gregor1/auth_update.go | 8 +- go/protocol/gregor1/common.go | 5 +- go/protocol/gregor1/extras.go | 9 +- go/protocol/gregor1/incoming.go | 65 +- go/protocol/gregor1/outgoing.go | 8 +- go/protocol/gregor1/remind.go | 14 +- go/protocol/kbgitkbfs1/disk_block_cache.go | 32 +- go/protocol/keybase1/account.go | 101 +- go/protocol/keybase1/airdrop.go | 14 +- go/protocol/keybase1/apiserver.go | 32 +- go/protocol/keybase1/appstate.go | 14 +- go/protocol/keybase1/audit.go | 26 +- go/protocol/keybase1/avatars.go | 14 +- go/protocol/keybase1/backend_common.go | 5 +- go/protocol/keybase1/badger.go | 11 +- go/protocol/keybase1/block.go | 116 +- go/protocol/keybase1/bot.go | 26 +- go/protocol/keybase1/btc.go | 8 +- go/protocol/keybase1/common.go | 5 +- go/protocol/keybase1/config.go | 218 +- go/protocol/keybase1/constants.go | 5 +- go/protocol/keybase1/contacts.go | 26 +- go/protocol/keybase1/crypto.go | 32 +- go/protocol/keybase1/cryptocurrency.go | 8 +- go/protocol/keybase1/ctl.go | 83 +- go/protocol/keybase1/debugging.go | 26 +- go/protocol/keybase1/delegate_ui_ctl.go | 89 +- go/protocol/keybase1/device.go | 41 +- go/protocol/keybase1/emails.go | 50 +- go/protocol/keybase1/ephemeral.go | 5 +- go/protocol/keybase1/extras.go | 26 +- go/protocol/keybase1/favorite.go | 20 +- go/protocol/keybase1/featured_bot.go | 20 +- go/protocol/keybase1/fs.go | 8 +- go/protocol/keybase1/git.go | 77 +- go/protocol/keybase1/gpg_common.go | 5 +- go/protocol/keybase1/gpg_ui.go | 47 +- go/protocol/keybase1/gregor.go | 41 +- go/protocol/keybase1/gregor_ui.go | 14 +- go/protocol/keybase1/home.go | 38 +- go/protocol/keybase1/home_ui.go | 11 +- go/protocol/keybase1/identify.go | 38 +- go/protocol/keybase1/identify3.go | 20 +- go/protocol/keybase1/identify3_common.go | 5 +- go/protocol/keybase1/identify3_ui.go | 44 +- go/protocol/keybase1/identify_common.go | 5 +- go/protocol/keybase1/identify_ui.go | 107 +- .../keybase1/implicit_team_migration.go | 14 +- go/protocol/keybase1/incoming-share.go | 26 +- go/protocol/keybase1/install.go | 44 +- go/protocol/keybase1/invite_friends.go | 26 +- go/protocol/keybase1/kbfs.go | 95 +- go/protocol/keybase1/kbfs_common.go | 5 +- go/protocol/keybase1/kbfs_git.go | 20 +- go/protocol/keybase1/kbfsmount.go | 50 +- go/protocol/keybase1/kex2provisionee.go | 14 +- go/protocol/keybase1/kex2provisionee2.go | 14 +- go/protocol/keybase1/kex2provisioner.go | 11 +- go/protocol/keybase1/kvstore.go | 32 +- go/protocol/keybase1/log.go | 14 +- go/protocol/keybase1/log_ui.go | 8 +- go/protocol/keybase1/login.go | 97 +- go/protocol/keybase1/login_ui.go | 62 +- go/protocol/keybase1/logsend.go | 11 +- go/protocol/keybase1/merkle.go | 14 +- go/protocol/keybase1/merkle_store.go | 5 +- go/protocol/keybase1/metadata.go | 182 +- go/protocol/keybase1/metadata_update.go | 20 +- go/protocol/keybase1/network_stats.go | 5 +- go/protocol/keybase1/notify_app.go | 11 +- go/protocol/keybase1/notify_audit.go | 14 +- go/protocol/keybase1/notify_badges.go | 8 +- .../keybase1/notify_can_user_perform.go | 8 +- go/protocol/keybase1/notify_ctl.go | 8 +- go/protocol/keybase1/notify_device_clone.go | 8 +- go/protocol/keybase1/notify_email.go | 14 +- go/protocol/keybase1/notify_ephemeral.go | 20 +- go/protocol/keybase1/notify_favorites.go | 8 +- go/protocol/keybase1/notify_featuredbots.go | 8 +- go/protocol/keybase1/notify_fs.go | 65 +- go/protocol/keybase1/notify_fs_request.go | 14 +- go/protocol/keybase1/notify_invite_friends.go | 8 +- go/protocol/keybase1/notify_keyfamily.go | 8 +- go/protocol/keybase1/notify_paperkey.go | 8 +- go/protocol/keybase1/notify_pgp.go | 11 +- go/protocol/keybase1/notify_phone.go | 8 +- go/protocol/keybase1/notify_runtimestats.go | 8 +- go/protocol/keybase1/notify_saltpack.go | 20 +- go/protocol/keybase1/notify_service.go | 20 +- go/protocol/keybase1/notify_session.go | 23 +- go/protocol/keybase1/notify_simple_fs.go | 8 +- go/protocol/keybase1/notify_team.go | 71 +- go/protocol/keybase1/notify_teambot.go | 14 +- go/protocol/keybase1/notify_tracking.go | 20 +- go/protocol/keybase1/notify_users.go | 26 +- go/protocol/keybase1/os.go | 5 +- go/protocol/keybase1/paperprovision.go | 8 +- go/protocol/keybase1/passphrase_common.go | 5 +- go/protocol/keybase1/pgp.go | 110 +- go/protocol/keybase1/pgp_ui.go | 38 +- go/protocol/keybase1/phone_numbers.go | 50 +- go/protocol/keybase1/pprof.go | 32 +- go/protocol/keybase1/process.go | 5 +- go/protocol/keybase1/prove.go | 38 +- go/protocol/keybase1/prove_common.go | 5 +- go/protocol/keybase1/prove_ui.go | 56 +- go/protocol/keybase1/provision_ui.go | 62 +- go/protocol/keybase1/quota.go | 8 +- go/protocol/keybase1/reachability.go | 26 +- go/protocol/keybase1/rekey.go | 38 +- go/protocol/keybase1/rekey_ui.go | 23 +- go/protocol/keybase1/reset.go | 5 +- go/protocol/keybase1/revoke.go | 20 +- go/protocol/keybase1/saltpack.go | 98 +- go/protocol/keybase1/saltpack_ui.go | 20 +- go/protocol/keybase1/scanproofs.go | 8 +- go/protocol/keybase1/secret_ui.go | 8 +- go/protocol/keybase1/secretkeys.go | 8 +- go/protocol/keybase1/selfprovision.go | 8 +- go/protocol/keybase1/session.go | 17 +- go/protocol/keybase1/signup.go | 32 +- go/protocol/keybase1/sigs.go | 14 +- go/protocol/keybase1/simple_fs.go | 512 +- go/protocol/keybase1/stream_ui.go | 26 +- go/protocol/keybase1/teambot.go | 5 +- go/protocol/keybase1/teams.go | 407 +- go/protocol/keybase1/teams_ui.go | 20 +- go/protocol/keybase1/teamsearch.go | 8 +- go/protocol/keybase1/test.go | 35 +- go/protocol/keybase1/tlf.go | 20 +- go/protocol/keybase1/tlf_keys.go | 14 +- go/protocol/keybase1/track.go | 38 +- go/protocol/keybase1/ui.go | 8 +- go/protocol/keybase1/upk.go | 5 +- go/protocol/keybase1/user.go | 182 +- go/protocol/keybase1/usersearch.go | 20 +- go/protocol/keybase1/wot.go | 32 +- go/protocol/stellar1/bundle.go | 11 +- go/protocol/stellar1/common.go | 5 +- go/protocol/stellar1/gregor.go | 5 +- go/protocol/stellar1/local.go | 503 +- go/protocol/stellar1/notify.go | 44 +- go/protocol/stellar1/remote.go | 185 +- go/protocol/stellar1/ui.go | 8 +- go/pvl/api_stub.go | 1 - go/pvl/debug.go | 6 +- go/pvl/helpers.go | 8 +- go/pvl/interp.go | 4 +- go/pvl/interp_data_for_test.go | 1 - go/pvl/interp_test.go | 4 +- go/pvl/registers_test.go | 2 +- go/release/github/actions.go | 8 +- go/release/github/api.go | 4 +- go/release/update/s3.go | 4 +- go/runtimestats/stats.go | 2 +- go/runtimestats/stats_darwin.go | 1 - go/runtimestats/stats_other.go | 1 - go/saltpackkeys/saltpack_keyfinder_devel.go | 1 - .../saltpack_keyfinder_production.go | 1 - .../saltpack_mock_pseudonym_resolver.go | 1 - go/service/apiserver.go | 2 +- go/service/canceling.go | 2 +- go/service/config.go | 2 +- go/service/ctl_nix.go | 1 - go/service/ctl_other.go | 1 - go/service/debugging.go | 4 +- go/service/debugging_devel.go | 12 +- go/service/debugging_production.go | 1 - go/service/gregor.go | 16 +- go/service/gregor_test.go | 10 +- go/service/identify.go | 7 +- go/service/interesting_test.go | 2 +- go/service/kbfs.go | 2 +- go/service/kbfs_mount_nix.go | 1 - go/service/kbfs_mount_windows.go | 1 - go/service/kvstore_test.go | 4 +- go/service/log_fwd.go | 4 +- go/service/log_ui.go | 14 +- go/service/saltpack.go | 10 +- go/service/teams.go | 2 +- go/service/test_handler.go | 2 +- go/service/tracker_loader.go | 2 +- go/service/ui_router.go | 5 +- go/service/user.go | 2 +- go/service/usersearch_test.go | 10 +- go/sig3/errors.go | 6 +- go/sig3/prot.go | 2 +- go/sig3/sig3.go | 4 +- go/sig3/sig3_test.go | 2 +- go/spotty/spotty_nix.go | 1 - go/spotty/spotty_windows.go | 1 - go/status/log_send_desktop.go | 12 +- go/status/log_send_mobile.go | 1 - go/status/status_darwin.go | 1 - go/status/status_nix.go | 1 - go/status/status_test.go | 2 +- go/status/status_windows.go | 1 - go/status/utils.go | 8 +- go/stellar/autoclaim.go | 4 +- go/stellar/batch.go | 4 +- go/stellar/batch_multi.go | 6 +- go/stellar/bpc.go | 10 +- go/stellar/build.go | 6 +- go/stellar/global.go | 4 +- go/stellar/loader.go | 4 +- go/stellar/loader_test.go | 6 +- go/stellar/stellar.go | 6 +- go/stellar/stellarsvc/anchor.go | 14 +- go/stellar/stellarsvc/batch_test.go | 2 +- go/stellar/stellarsvc/remote_mock_test.go | 2 +- go/stellar/stellarsvc/seqno_test.go | 4 +- go/stellar/stellarsvc/service.go | 2 +- go/stellar/stellarsvc/service_devel.go | 1 - go/stellar/stellarsvc/service_production.go | 1 - go/stellar/stellarsvc/service_test.go | 8 +- go/stellar/time_cache.go | 14 +- go/stellar/time_cache_test.go | 4 +- go/stellar/wallet_state.go | 10 +- go/systemd/systemd_linux.go | 1 - go/systemd/systemd_other.go | 1 - go/systests/common_test.go | 6 +- go/systests/config_test.go | 6 +- go/systests/contacts_test.go | 2 +- go/systests/ctl_test.go | 6 +- go/systests/delegate_id3_ui_test.go | 2 +- go/systests/device_common_test.go | 6 +- go/systests/gregor_test.go | 2 +- go/systests/home_test.go | 2 +- go/systests/multiuser_common_test.go | 12 +- go/systests/passphrase_test.go | 4 +- go/systests/rekey_test.go | 4 +- go/systests/retry_test.go | 16 +- go/systests/stellar_client_test.go | 140 +- go/systests/stellar_test.go | 12 +- go/systests/team_open_test.go | 2 +- go/systests/team_reset_test.go | 4 +- go/systests/team_tx_test.go | 4 +- go/systests/teambot_test.go | 8 +- go/systests/teams_test.go | 22 +- go/systests/tracking_test.go | 2 +- go/systests/treeloader_test.go | 7 +- go/systests/user_test.go | 4 +- go/teambot/featuredbot.go | 2 +- go/teambot/member_keyer.go | 2 +- go/teambot/scoring.go | 2 +- go/teams/audit.go | 2 +- go/teams/audit_test.go | 2 +- go/teams/box_audit.go | 2 +- go/teams/box_audit_test.go | 10 +- go/teams/chain.go | 10 +- go/teams/chain_parse.go | 2 +- go/teams/chain_test.go | 10 +- go/teams/common_test.go | 2 +- go/teams/create.go | 4 +- go/teams/create_test.go | 2 +- go/teams/errors.go | 16 +- go/teams/ftl.go | 4 +- go/teams/ftl_test.go | 10 +- go/teams/get_test.go | 10 +- go/teams/hidden/errors.go | 10 +- go/teams/hidden/loader.go | 5 +- go/teams/hidden_loader_test.go | 4 +- go/teams/implicit.go | 4 +- go/teams/implicit_test.go | 8 +- go/teams/invite_test.go | 2 +- go/teams/list_test.go | 1 - go/teams/loader.go | 6 +- go/teams/loader2.go | 21 +- go/teams/loader_chain_test.go | 2 +- go/teams/loader_ctx_test.go | 4 +- go/teams/loader_test.go | 6 +- go/teams/member_set.go | 17 +- go/teams/member_test.go | 18 +- go/teams/opensearch/scoring.go | 4 +- go/teams/proofs.go | 2 +- go/teams/rename.go | 2 +- go/teams/resolve.go | 1 - go/teams/rotate_hidden_test.go | 10 +- go/teams/rotate_test.go | 4 +- go/teams/seitan.go | 2 +- go/teams/seitan_v2_test.go | 2 +- go/teams/service_helper.go | 15 +- go/teams/teams.go | 11 +- go/teams/transactions.go | 11 +- go/teams/treeloader.go | 1 - go/tlfupgrade/tlfupgrade.go | 2 +- go/tools/systemd/main.go | 1 - go/uidmap/hardcoded_uids.go | 2 +- go/uidmap/hardcoded_uids_test.go | 2 +- go/uidmap/uidmap.go | 5 +- go/uidmap/uidmap_test.go | 4 +- go/updater/command/command.go | 15 +- go/updater/command/command_unix_test.go | 1 - go/updater/command/command_windows_test.go | 1 - go/updater/keybase/context.go | 12 +- go/updater/keybase/context_darwin_test.go | 1 - go/updater/keybase/platform_darwin.go | 2 +- go/updater/keybase/platform_darwin_test.go | 1 - go/updater/keybase/platform_linux_test.go | 1 - go/updater/keybase/platform_windows_test.go | 1 - go/updater/process/process.go | 8 +- go/updater/process/process_test.go | 2 +- go/updater/saltpack/saltpack.go | 4 +- go/updater/service/logger.go | 16 +- go/updater/service/pid.go | 1 - go/updater/service/service.go | 12 +- go/updater/service/service_nix.go | 1 - go/updater/service/service_windows.go | 1 - go/updater/sources/log.go | 8 +- go/updater/updater.go | 12 +- go/updater/updater_test.go | 6 +- go/updater/util/log.go | 8 +- go/updater/util/unzip.go | 2 +- go/updater/util/unzip_nix_test.go | 1 - go/updater/watchdog/watchdog.go | 8 +- go/updater/watchdog/watchdog_test.go | 5 +- protocol/.gitignore | 2 + protocol/Makefile | 33 +- protocol/avdl/keybase1/login.avdl | 1 + protocol/bin/enabled-calls.json | 872 ++- protocol/bin/flow.js | 718 -- protocol/bin/generate-ts.ts | 995 +++ protocol/json/keybase1/login.json | 4 + protocol/package.json | 15 +- protocol/tsconfig.json | 50 + protocol/yarn.lock | 93 +- .../react-native-kb/android/CMakeLists.txt | 6 +- .../react-native-kb/android/cpp-adapter.cpp | 201 +- .../com/reactnativekb/DarkModePrefHelper.kt | 2 - .../com/reactnativekb/DarkModePreference.kt | 2 - .../main/java/com/reactnativekb/GuiConfig.kt | 14 +- .../main/java/com/reactnativekb/KbModule.kt | 422 +- .../main/java/com/reactnativekb/KbPackage.kt | 13 +- .../java/com/reactnativekb/NativeLogger.kt | 7 +- .../java/com/reactnativekb/PathResolver.kt | 92 +- .../com/reactnativekb/ReadFileAsString.kt | 29 +- .../react-native-kb/cpp/msgpack-safe.hpp | 19 + .../react-native-kb/cpp/react-native-kb.cpp | 412 +- .../react-native-kb/cpp/react-native-kb.h | 68 +- .../react-native-kb/ios/KBJSScheduler.cpp | 26 - rnmodules/react-native-kb/ios/KBJSScheduler.h | 29 - rnmodules/react-native-kb/ios/Kb.h | 3 +- rnmodules/react-native-kb/ios/Kb.mm | 214 +- .../react-native-kb/react-native-kb.podspec | 6 +- rnmodules/react-native-kb/src/NativeKb.ts | 5 - rnmodules/react-native-kb/src/index.tsx | 57 +- .../performance/perf-inbox-scroll.yaml | 29 + .../performance/perf-teams-scroll.yaml | 29 + .../performance/perf-thread-scroll.yaml | 20 + shared/.maestro/subflows/escape-to-tabs.yaml | 15 + .../.maestro/subflows/navigate-to-chat.yaml | 13 + .../.maestro/subflows/navigate-to-teams.yaml | 13 + .../.maestro/subflows/navigate-to-thread.yaml | 23 + shared/.maestro/visual-diff/nav-chat.yaml | 6 + shared/.maestro/visual-diff/nav-files.yaml | 6 + .../.maestro/visual-diff/nav-more-back.yaml | 10 + .../.maestro/visual-diff/nav-more-crypto.yaml | 9 + .../visual-diff/nav-more-devices.yaml | 5 + shared/.maestro/visual-diff/nav-more-git.yaml | 5 + .../visual-diff/nav-more-settings.yaml | 6 + shared/.maestro/visual-diff/nav-more.yaml | 8 + shared/.maestro/visual-diff/nav-people.yaml | 6 + shared/.maestro/visual-diff/nav-teams.yaml | 6 + .../visual-diff/visual-diff-tabs.yaml | 104 + shared/README.md | 25 +- shared/actions/engine-gen-gen.tsx | 2184 ------ shared/actions/json/engine-gen.json | 657 -- shared/actions/json/remote.json | 57 - shared/android/app/build.gradle | 24 +- .../ossifrage/ChatBroadcastReceiver.kt | 44 +- .../CustomBitmapMemoryCacheParamsSupplier.kt | 11 +- .../ossifrage/KBInstallReferrerListener.kt | 8 +- .../io/keybase/ossifrage/KBPushNotifier.kt | 29 +- .../io/keybase/ossifrage/KBReactPackage.kt | 5 +- .../java/io/keybase/ossifrage/KeyStore.kt | 15 +- .../KeybasePushNotificationListenerService.kt | 22 +- .../java/io/keybase/ossifrage/MainActivity.kt | 45 +- .../io/keybase/ossifrage/MainApplication.kt | 39 +- .../ossifrage/keystore/KeyStoreHelper.kt | 39 +- .../keybase/ossifrage/modules/NativeLogger.kt | 2 +- .../ossifrage/modules/StorybookConstants.kt | 4 +- .../keybase/ossifrage/util/DeviceLockType.kt | 39 +- shared/android/build.gradle | 2 +- shared/android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- shared/app.json | 14 + shared/app/global-errors.tsx | 321 + shared/app/global-errors/hook.tsx | 103 - shared/app/global-errors/index.d.ts | 3 - shared/app/global-errors/index.desktop.tsx | 185 - shared/app/global-errors/index.native.tsx | 105 - shared/app/index.native.tsx | 33 +- shared/app/main.desktop.tsx | 27 +- shared/app/out-of-date.tsx | 77 +- shared/app/runtime-stats.tsx | 2 +- shared/babel.config.js | 92 +- shared/chat/audio/amptracker.tsx | 2 +- shared/chat/audio/audio-player.tsx | 25 +- shared/chat/audio/audio-recorder.native.tsx | 345 +- shared/chat/audio/audio-send.native.tsx | 9 +- shared/chat/audio/audio-video.desktop.tsx | 23 +- shared/chat/audio/audio-video.native.tsx | 68 +- shared/chat/avatars.tsx | 73 +- shared/chat/blocking/block-modal.tsx | 273 +- shared/chat/blocking/invitation-to-block.tsx | 25 +- shared/chat/chat-button.tsx | 4 +- .../attachment-fullscreen/hooks.tsx | 35 +- .../attachment-fullscreen/index.desktop.tsx | 229 +- .../attachment-fullscreen/index.native.tsx | 160 +- .../conversation/attachment-get-titles.tsx | 143 +- .../chat/conversation/bot/channel-picker.tsx | 13 +- shared/chat/conversation/bot/confirm.tsx | 13 +- shared/chat/conversation/bot/install.tsx | 295 +- shared/chat/conversation/bot/search.tsx | 141 +- shared/chat/conversation/bot/team-picker.tsx | 35 +- shared/chat/conversation/bottom-banner.tsx | 51 +- shared/chat/conversation/command-markdown.tsx | 6 +- shared/chat/conversation/command-status.tsx | 14 +- shared/chat/conversation/container.tsx | 2 +- shared/chat/conversation/error.tsx | 19 +- shared/chat/conversation/fwd-msg.tsx | 44 +- shared/chat/conversation/giphy/hooks.tsx | 2 +- .../chat/conversation/giphy/index.desktop.tsx | 28 +- .../chat/conversation/giphy/index.native.tsx | 5 +- .../chat/conversation/header-area/index.d.ts | 4 +- .../conversation/header-area/index.native.tsx | 121 +- .../conversation/info-panel/add-people.tsx | 58 +- .../info-panel/add-to-channel.tsx | 150 +- .../conversation/info-panel/attachments.tsx | 86 +- shared/chat/conversation/info-panel/bot.tsx | 68 +- .../chat/conversation/info-panel/common.tsx | 11 +- .../chat/conversation/info-panel/header.tsx | 82 +- shared/chat/conversation/info-panel/index.tsx | 32 +- .../chat/conversation/info-panel/members.tsx | 11 +- shared/chat/conversation/info-panel/menu.tsx | 116 +- .../conversation/info-panel/participant.tsx | 2 +- .../info-panel/settings/index.tsx | 63 +- .../info-panel/settings/min-writer-role.tsx | 38 +- .../info-panel/settings/notifications.tsx | 4 +- .../conversation/input-area/container.tsx | 7 +- .../input-area/filepicker-popup/index.d.ts | 2 +- .../filepicker-popup/index.native.tsx | 32 +- .../input-area/location-popup.d.ts | 3 + .../input-area/location-popup.desktop.tsx | 2 + .../input-area/location-popup.native.tsx | 161 + .../input-area/location-popup.tsx | 141 - .../input-area/{normal2 => normal}/index.tsx | 205 +- .../input-area/normal/input.d.ts} | 27 +- .../input-area/normal/input.desktop.tsx | 673 ++ .../input.native.tsx} | 606 +- .../max-input-area-context.tsx | 0 .../moremenu-popup.native.tsx} | 8 +- .../set-explode-popup/hooks.tsx | 27 +- .../set-explode-popup/index.d.ts | 0 .../set-explode-popup/index.desktop.tsx | 4 +- .../set-explode-popup/index.native.tsx | 20 +- .../input-area/{normal2 => normal}/typing.tsx | 29 +- .../input-area/normal2/platform-input.d.ts | 24 - .../normal2/platform-input.desktop.tsx | 575 -- .../chat/conversation/input-area/preview.tsx | 8 +- .../input-area/suggestors/channels.tsx | 4 +- .../input-area/suggestors/commands.tsx | 12 +- .../input-area/suggestors/common.tsx | 32 +- .../input-area/suggestors/emoji.tsx | 23 +- .../input-area/suggestors/index.tsx | 283 +- .../input-area/suggestors/shared.tsx | 18 - .../suggestors/suggestion-list.desktop.tsx | 24 +- .../suggestors/suggestion-list.native.tsx | 3 +- .../input-area/suggestors/users.tsx | 32 +- shared/chat/conversation/list-area/hooks.tsx | 11 +- .../conversation/list-area/index.desktop.tsx | 368 +- .../conversation/list-area/index.native.tsx | 116 +- .../conversation/list-area/jump-to-recent.tsx | 4 - shared/chat/conversation/load-status.tsx | 2 +- .../messages/account-payment/container.tsx | 14 +- .../messages/account-payment/wrapper.tsx | 7 +- .../messages/attachment/audio.tsx | 6 +- .../conversation/messages/attachment/file.tsx | 109 +- .../messages/attachment/image/imageimpl.d.ts | 3 + .../{image2 => image}/imageimpl.desktop.tsx | 16 +- .../{image2 => image}/imageimpl.native.tsx | 6 +- .../messages/attachment/image/index.tsx | 89 + .../{image2 => image}/use-state.tsx | 2 +- .../messages/attachment/image2/imageimpl.d.ts | 3 - .../messages/attachment/image2/index.tsx | 93 - .../messages/attachment/shared.tsx | 138 +- .../messages/attachment/video/index.tsx | 79 +- .../messages/attachment/video/use-state.tsx | 2 +- .../attachment/video/videoimpl.desktop.tsx | 34 +- .../attachment/video/videoimpl.native.tsx | 64 +- .../messages/attachment/wrapper.tsx | 43 +- .../conversation/messages/cards/hello-bot.tsx | 9 +- .../conversation/messages/cards/make-team.tsx | 6 +- .../conversation/messages/cards/new-chat.tsx | 9 +- .../messages/cards/team-journey/container.tsx | 48 +- .../messages/cards/team-journey/wrapper.tsx | 5 +- .../chat/conversation/messages/emoji-row.tsx | 81 +- .../conversation/messages/ids-context.tsx | 7 +- .../messages/message-popup/attachment.tsx | 36 +- .../message-popup/exploding-header.tsx | 32 +- .../messages/message-popup/header.tsx | 48 +- .../messages/message-popup/hooks.tsx | 89 +- .../messages/message-popup/index.tsx | 88 +- .../messages/message-popup/journeycard.tsx | 12 +- .../messages/message-popup/reactionitem.tsx | 6 +- .../messages/message-popup/text.tsx | 64 +- .../chat/conversation/messages/pin/index.tsx | 2 +- .../conversation/messages/pin/wrapper.tsx | 13 +- .../messages/placeholder/wrapper.tsx | 11 +- .../conversation/messages/react-button.tsx | 33 +- .../messages/reaction-tooltip.tsx | 30 +- .../conversation/messages/reactions-rows.tsx | 53 +- .../chat/conversation/messages/reset-user.tsx | 33 +- .../messages/retention-notice.tsx | 22 +- .../conversation/messages/separator-utils.ts | 76 + .../chat/conversation/messages/separator.tsx | 358 +- .../messages/set-channelname/wrapper.tsx | 13 +- .../messages/set-description/wrapper.tsx | 13 +- .../messages/special-bottom-message.tsx | 7 +- .../messages/special-top-message.tsx | 54 +- .../system-added-to-team/container.tsx | 54 +- .../messages/system-added-to-team/wrapper.tsx | 7 +- .../messages/system-change-avatar/index.tsx | 2 +- .../messages/system-change-avatar/wrapper.tsx | 7 +- .../system-change-retention/container.tsx | 27 +- .../system-change-retention/wrapper.tsx | 7 +- .../messages/system-create-team/container.tsx | 19 +- .../messages/system-create-team/wrapper.tsx | 7 +- .../messages/system-git-push/container.tsx | 47 +- .../messages/system-git-push/wrapper.tsx | 7 +- .../system-invite-accepted/container.tsx | 19 +- .../system-invite-accepted/wrapper.tsx | 7 +- .../messages/system-joined/container.tsx | 19 +- .../messages/system-joined/wrapper.tsx | 7 +- .../messages/system-left/container.tsx | 7 +- .../messages/system-left/wrapper.tsx | 7 +- .../messages/system-new-channel/container.tsx | 37 +- .../messages/system-new-channel/wrapper.tsx | 7 +- .../container.tsx | 2 +- .../messages/system-profile-reset-notice.tsx | 2 +- .../messages/system-sbs-resolve/container.tsx | 2 +- .../messages/system-sbs-resolve/wrapper.tsx | 9 +- .../system-simple-to-complex/container.tsx | 15 +- .../system-simple-to-complex/wrapper.tsx | 7 +- .../messages/system-text/container.tsx | 5 +- .../messages/system-text/wrapper.tsx | 7 +- .../system-users-added-to-conv/container.tsx | 10 +- .../system-users-added-to-conv/wrapper.tsx | 7 +- .../conversation/messages/text/bottom.tsx | 28 +- .../messages/text/coinflip/errors.tsx | 41 +- .../messages/text/coinflip/index.tsx | 60 +- .../messages/text/coinflip/participants.tsx | 8 +- .../messages/text/coinflip/results.tsx | 5 +- .../chat/conversation/messages/text/reply.tsx | 70 +- .../text/unfurl/prompt-list/container.tsx | 16 +- .../text/unfurl/prompt-list/prompt.tsx | 4 +- .../text/unfurl/unfurl-list/generic.tsx | 34 +- .../text/unfurl/unfurl-list/giphy.tsx | 29 +- .../text/unfurl/unfurl-list/image/index.tsx | 12 +- .../unfurl-list/image/video.desktop.tsx | 13 +- .../unfurl/unfurl-list/image/video.native.tsx | 69 +- .../text/unfurl/unfurl-list/index.tsx | 10 +- .../text/unfurl/unfurl-list/map-popup.tsx | 47 +- .../messages/text/unfurl/unfurl-list/map.tsx | 12 +- .../text/unfurl/unfurl-list/use-state.tsx | 13 +- .../conversation/messages/text/wrapper.tsx | 96 +- .../conversation/messages/wrapper/edited.tsx | 38 +- .../exploding-height-retainer/container.tsx | 8 +- .../index.desktop.tsx | 47 +- .../index.native.tsx | 31 +- .../messages/wrapper/exploding-meta.tsx | 128 +- .../conversation/messages/wrapper/index.tsx | 4 +- .../wrapper/long-pressable/index.d.ts | 2 +- .../wrapper/long-pressable/index.desktop.tsx | 8 +- .../wrapper/long-pressable/index.native.tsx | 99 +- .../long-pressable/swipeable.native.tsx | 106 - .../messages/wrapper/send-indicator.tsx | 10 +- .../conversation/messages/wrapper/sent.tsx | 4 +- .../conversation/messages/wrapper/wrapper.tsx | 165 +- shared/chat/conversation/no-conversation.tsx | 5 +- shared/chat/conversation/normal/container.tsx | 45 +- shared/chat/conversation/normal/context.tsx | 43 +- .../conversation/normal/index.desktop.tsx | 65 +- .../chat/conversation/normal/index.native.tsx | 87 +- shared/chat/conversation/pinned-message.tsx | 62 +- shared/chat/conversation/rekey/container.tsx | 12 +- .../conversation/rekey/enter-paper-key.tsx | 2 +- .../rekey/participant-rekey.desktop.tsx | 57 +- .../rekey/participant-rekey.native.tsx | 38 +- .../conversation/rekey/you-rekey.desktop.tsx | 21 +- .../conversation/rekey/you-rekey.native.tsx | 22 +- shared/chat/conversation/reply-preview.tsx | 28 +- shared/chat/conversation/search.tsx | 114 +- shared/chat/conversation/you-are-reset.tsx | 26 +- shared/chat/create-channel/hooks.tsx | 75 +- shared/chat/create-channel/index.desktop.tsx | 40 +- shared/chat/create-channel/index.native.tsx | 76 +- shared/chat/delete-history-warning.tsx | 30 +- shared/chat/emoji-picker/container.tsx | 116 +- shared/chat/emoji-picker/index.tsx | 29 +- shared/chat/emoji-picker/skin-tone-picker.tsx | 30 +- shared/chat/emoji-picker/use-picker.tsx | 6 +- ...=> inbox-and-conversation-get-options.tsx} | 9 +- shared/chat/inbox-and-conversation-header.tsx | 85 +- ...ation-2.tsx => inbox-and-conversation.tsx} | 30 +- .../chat/inbox-search/background.desktop.tsx | 6 +- .../chat/inbox-search/background.native.tsx | 6 +- shared/chat/inbox-search/index.tsx | 197 +- shared/chat/inbox/container.tsx | 246 - shared/chat/inbox/defer-loading.tsx | 15 +- shared/chat/inbox/filter-row.tsx | 83 +- shared/chat/inbox/get-options.tsx | 28 +- shared/chat/inbox/index.d.ts | 19 +- shared/chat/inbox/index.desktop.tsx | 464 +- shared/chat/inbox/index.native.tsx | 378 +- shared/chat/inbox/list-helpers.tsx | 120 + shared/chat/inbox/new-chat-button.tsx | 161 +- shared/chat/inbox/row/big-team-channel.tsx | 126 +- shared/chat/inbox/row/big-team-header.tsx | 79 +- shared/chat/inbox/row/big-teams-divider.tsx | 27 +- shared/chat/inbox/row/big-teams-label.tsx | 23 +- shared/chat/inbox/row/build-team.tsx | 12 +- shared/chat/inbox/row/index.tsx | 33 +- shared/chat/inbox/row/opened-row-state.tsx | 8 +- shared/chat/inbox/row/sizes.tsx | 8 +- .../chat/inbox/row/small-team/bottom-line.tsx | 339 - shared/chat/inbox/row/small-team/contexts.tsx | 8 - shared/chat/inbox/row/small-team/index.tsx | 660 +- .../small-team/swipe-conv-actions/index.d.ts | 3 + .../swipe-conv-actions/index.native.tsx | 134 +- shared/chat/inbox/row/small-team/top-line.tsx | 195 - shared/chat/inbox/row/start-new-chat.tsx | 30 +- shared/chat/inbox/row/teams-divider.tsx | 41 +- shared/chat/inbox/rowitem.tsx | 36 + shared/chat/inbox/search-row.tsx | 74 +- shared/chat/inbox/unread-shortcut.tsx | 4 +- shared/chat/inbox/use-inbox-state.tsx | 113 + shared/chat/location-map.desktop.tsx | 10 +- shared/chat/location-map.native.tsx | 15 +- shared/chat/maybe-popup.tsx | 42 - shared/chat/new-team-dialog-container.tsx | 12 +- shared/chat/payments/status/index.tsx | 14 +- shared/chat/pdf/index.desktop.tsx | 56 +- shared/chat/pdf/index.native.tsx | 22 +- shared/chat/punycode-link-warning.tsx | 2 +- shared/chat/routes.tsx | 234 +- .../selectable-big-team-channel-container.tsx | 2 +- shared/chat/selectable-big-team-channel.tsx | 19 +- .../chat/selectable-small-team-container.tsx | 8 +- shared/chat/selectable-small-team.tsx | 16 +- .../conversation-list/choose-conversation.tsx | 32 +- .../conversation-list/conversation-list.tsx | 6 +- shared/chat/send-to-chat/index.tsx | 82 +- shared/chat/user-emoji.tsx | 85 + shared/common-adapters/animation.desktop.tsx | 10 +- shared/common-adapters/animation.native.tsx | 10 +- shared/common-adapters/avatar/avatar-line.tsx | 9 +- shared/common-adapters/avatar/avatar.css | 39 +- shared/common-adapters/avatar/hooks.tsx | 167 - .../avatar/icon-to-img-set.tsx | 86 + shared/common-adapters/avatar/index.d.ts | 15 +- .../common-adapters/avatar/index.desktop.tsx | 259 +- .../common-adapters/avatar/index.native.tsx | 272 +- shared/common-adapters/avatar/store.tsx | 7 +- .../common-adapters/back-button.desktop.tsx | 8 +- shared/common-adapters/back-button.native.tsx | 25 +- shared/common-adapters/badge.tsx | 8 +- shared/common-adapters/banner.tsx | 6 +- shared/common-adapters/box-grow.tsx | 10 +- shared/common-adapters/box.css | 87 +- shared/common-adapters/box.d.ts | 41 +- shared/common-adapters/box.desktop.tsx | 107 +- shared/common-adapters/box.native.tsx | 89 +- shared/common-adapters/button-bar.tsx | 31 +- shared/common-adapters/button.css | 84 +- shared/common-adapters/button.tsx | 665 +- shared/common-adapters/checkbox.desktop.tsx | 39 +- shared/common-adapters/choice-list.css | 8 +- .../common-adapters/choice-list.desktop.tsx | 61 +- shared/common-adapters/choice-list.native.tsx | 35 +- shared/common-adapters/clickable-box.d.ts | 6 +- .../common-adapters/clickable-box.desktop.tsx | 44 +- .../common-adapters/clickable-box.native.tsx | 27 +- shared/common-adapters/confirm-modal.tsx | 125 +- shared/common-adapters/copy-text.tsx | 75 +- .../common-adapters/copyable-text.native.tsx | 73 +- shared/common-adapters/divider.tsx | 5 +- .../common-adapters/drag-and-drop.desktop.tsx | 10 - shared/common-adapters/dropdown.tsx | 115 +- .../emoji/custom-emoji.desktop.tsx | 6 +- .../emoji/custom-emoji.native.tsx | 4 +- .../emoji/native-emoji.native.tsx | 5 +- shared/common-adapters/error-boundary.tsx | 28 +- .../common-adapters/floating-menu/context.tsx | 4 - .../common-adapters/floating-menu/index.tsx | 126 +- .../floating-menu/menu-layout/index.d.ts | 6 +- .../menu-layout/index.desktop.tsx | 39 +- .../menu-layout/index.native.tsx | 29 +- .../floating-picker.native.tsx | 47 +- shared/common-adapters/header-buttons.d.ts | 13 + .../header-buttons.desktop.tsx | 67 + .../common-adapters/header-buttons.native.tsx | 78 + shared/common-adapters/header-hoc/index.d.ts | 66 - .../header-hoc/index.desktop.tsx | 201 - .../header-hoc/index.native.tsx | 316 - shared/common-adapters/header-or-popup.tsx | 17 - shared/common-adapters/hot-key.desktop.tsx | 74 +- shared/common-adapters/icon-auto.tsx | 27 + shared/common-adapters/icon.d.ts | 53 - shared/common-adapters/icon.desktop.tsx | 266 - shared/common-adapters/icon.native.tsx | 243 - shared/common-adapters/icon.shared.tsx | 139 +- shared/common-adapters/icon.tsx | 105 + shared/common-adapters/image-icon.tsx | 79 + .../{image2.d.ts => image.d.ts} | 4 +- .../{image2.desktop.tsx => image.desktop.tsx} | 19 +- shared/common-adapters/image.native.tsx | 44 + shared/common-adapters/image2.native.tsx | 56 - shared/common-adapters/index-impl.js | 109 +- shared/common-adapters/index.d.ts | 47 +- shared/common-adapters/info-note.tsx | 6 +- shared/common-adapters/input.shared.tsx | 38 - shared/common-adapters/input2.desktop.tsx | 245 - shared/common-adapters/input2.native.tsx | 169 - shared/common-adapters/input3.d.ts | 108 + shared/common-adapters/input3.desktop.tsx | 201 + shared/common-adapters/input3.native.tsx | 152 + .../key-event-handler.desktop.tsx | 65 +- shared/common-adapters/labeled-input.tsx | 174 - shared/common-adapters/list-common.tsx | 72 + .../{list-item2.css => list-item.css} | 0 shared/common-adapters/list-item.d.ts | 22 - shared/common-adapters/list-item.desktop.tsx | 62 - shared/common-adapters/list-item.native.tsx | 73 - .../{list-item2.tsx => list-item.tsx} | 11 +- shared/common-adapters/list.d.ts | 92 +- shared/common-adapters/list.desktop.tsx | 132 +- shared/common-adapters/list.native.tsx | 97 +- shared/common-adapters/list2.d.ts | 55 - shared/common-adapters/list2.desktop.tsx | 111 - shared/common-adapters/list2.native.tsx | 84 - .../common-adapters/loading-line.desktop.tsx | 15 +- .../common-adapters/loading-line.native.tsx | 4 +- shared/common-adapters/markdown/channel.tsx | 23 +- ...i-parser.tsx => generate-emoji-parser.mts} | 8 +- .../common-adapters/markdown/index.test.tsx | 212 + shared/common-adapters/markdown/index.tsx | 134 +- .../markdown/maybe-mention/index.tsx | 7 +- .../markdown/maybe-mention/team.tsx | 18 +- .../markdown/maybe-mention/unknown.tsx | 13 +- shared/common-adapters/markdown/react.tsx | 16 +- .../service-decoration-parser.test.ts | 24 + .../markdown/service-decoration-parser.ts | 10 + .../markdown/service-decoration.tsx | 73 +- shared/common-adapters/markdown/spoiler.tsx | 29 +- shared/common-adapters/measure-ref.tsx | 24 +- shared/common-adapters/mention-container.tsx | 15 +- shared/common-adapters/mention.tsx | 2 +- shared/common-adapters/meta.tsx | 4 +- shared/common-adapters/mobile-popup.tsx | 55 - shared/common-adapters/modal.tsx | 353 - shared/common-adapters/modal2.tsx | 237 - shared/common-adapters/name-with-icon.tsx | 221 +- shared/common-adapters/new-input.tsx | 101 - shared/common-adapters/overlay/index.d.ts | 34 - .../common-adapters/overlay/index.desktop.tsx | 39 - .../common-adapters/overlay/index.native.tsx | 46 - shared/common-adapters/phone-input.tsx | 223 +- shared/common-adapters/placeholder.tsx | 5 +- shared/common-adapters/plain-input.d.ts | 160 - .../common-adapters/plain-input.desktop.tsx | 391 - shared/common-adapters/plain-input.native.tsx | 303 - shared/common-adapters/platform-icon.tsx | 14 +- shared/common-adapters/popup-dialog.d.ts | 20 - .../common-adapters/popup-dialog.desktop.tsx | 127 - .../common-adapters/popup-dialog.native.tsx | 37 - shared/common-adapters/popup-header-text.tsx | 38 - .../{ => popup}/bottom-sheet.d.ts | 0 .../popup/bottom-sheet.desktop.tsx | 6 + .../{ => popup}/bottom-sheet.native.tsx | 0 .../{ => popup}/floating-box/index.d.ts | 0 .../floating-box/index.desktop.tsx | 12 +- .../{ => popup}/floating-box/index.native.tsx | 11 +- .../relative-floating-box.desktop.tsx | 59 +- shared/common-adapters/popup/index.d.ts | 30 + .../common-adapters/popup/index.desktop.tsx | 130 + shared/common-adapters/popup/index.native.tsx | 124 + .../common-adapters/{ => popup}/use-popup.tsx | 13 +- shared/common-adapters/profile-card.tsx | 49 +- shared/common-adapters/progress-bar.tsx | 9 +- .../progress-indicator.desktop.tsx | 5 +- .../common-adapters/proof-broken-banner.tsx | 23 +- shared/common-adapters/reload.tsx | 111 +- shared/common-adapters/rich-button.tsx | 8 +- shared/common-adapters/safe-react-list.tsx | 57 - shared/common-adapters/save-indicator.tsx | 15 +- shared/common-adapters/scroll-view.d.ts | 3 +- .../common-adapters/scroll-view.desktop.tsx | 18 +- shared/common-adapters/scroll-view.native.tsx | 11 +- shared/common-adapters/search-filter.tsx | 127 +- shared/common-adapters/section-list.tsx | 16 +- shared/common-adapters/simple-toast.tsx | 7 +- .../common-adapters/switch-toggle.native.tsx | 7 +- shared/common-adapters/switch.tsx | 17 +- shared/common-adapters/tabs.tsx | 17 +- shared/common-adapters/team-with-popup.tsx | 26 +- shared/common-adapters/text-url.d.ts | 5 + shared/common-adapters/text-url.desktop.tsx | 17 + shared/common-adapters/text-url.native.tsx | 19 + shared/common-adapters/text.css | 209 +- shared/common-adapters/text.d.ts | 108 +- shared/common-adapters/text.desktop.tsx | 167 +- shared/common-adapters/text.meta.native.tsx | 677 +- shared/common-adapters/text.native.tsx | 149 +- shared/common-adapters/text.shared.tsx | 78 +- shared/common-adapters/text.styles.d.ts | 2 + ...ta.desktop.tsx => text.styles.desktop.tsx} | 34 +- shared/common-adapters/text.styles.native.tsx | 376 + shared/common-adapters/text2.d.ts | 22 - shared/common-adapters/text2.desktop.tsx | 49 - shared/common-adapters/text2.native.tsx | 64 - shared/common-adapters/timeline-marker.tsx | 14 +- shared/common-adapters/toast.desktop.tsx | 64 +- shared/common-adapters/toast.native.tsx | 29 +- shared/common-adapters/use-timers.tsx | 8 +- shared/common-adapters/usernames.tsx | 227 +- shared/common-adapters/video.desktop.tsx | 8 - shared/common-adapters/video.native.tsx | 50 +- shared/common-adapters/video.shared.tsx | 40 +- shared/common-adapters/waiting-button.tsx | 8 +- shared/common-adapters/wave-button.tsx | 46 +- shared/common-adapters/web-view.native.tsx | 30 +- .../common-adapters/with-tooltip.desktop.tsx | 65 +- .../common-adapters/with-tooltip.native.tsx | 26 +- .../zoomable-image.desktop.tsx | 46 +- .../common-adapters/zoomable-image.native.tsx | 84 +- shared/constants/active/index.tsx | 27 - shared/constants/archive/index.tsx | 476 -- shared/constants/archive/util.tsx | 15 - shared/constants/autoreset/util.tsx | 13 - shared/constants/bots/index.tsx | 186 - shared/constants/bots/util.tsx | 30 - shared/constants/{chat2 => chat}/common.tsx | 17 +- shared/constants/{chat2 => chat}/debug.tsx | 2 +- shared/constants/chat/index.tsx | 0 shared/constants/chat/layout.tsx | 5 + shared/constants/{chat2 => chat}/message.tsx | 49 +- shared/constants/{chat2 => chat}/meta.tsx | 21 +- shared/constants/chat2/convostate.tsx | 3397 -------- shared/constants/chat2/util.tsx | 61 - .../constants/{config/util.tsx => config.tsx} | 7 +- .../constants/{crypto/util.tsx => crypto.tsx} | 9 +- shared/constants/crypto/index.tsx | 683 -- shared/constants/deeplinks.tsx | 161 + shared/constants/deeplinks/index.tsx | 343 - shared/constants/deeplinks/util.tsx | 13 - shared/constants/devices/index.tsx | 137 - shared/constants/devices/util.tsx | 21 - shared/constants/engine/index.tsx | 84 - shared/constants/fs.tsx | 766 ++ shared/constants/fs/common.native.tsx | 69 - .../fs/platform-specific.android.tsx | 68 - shared/constants/fs/platform-specific.d.ts | 2 - .../fs/platform-specific.desktop.tsx | 310 - shared/constants/fs/platform-specific.ios.tsx | 2 - shared/constants/fs/util.tsx | 24 - shared/constants/git/index.tsx | 217 - shared/constants/git/util.tsx | 20 - shared/constants/index.tsx | 10 +- shared/constants/init/index.d.ts | 7 + shared/constants/init/index.desktop.tsx | 602 ++ .../index.native.tsx | 590 +- .../push-listener.native.tsx} | 78 +- shared/constants/init/shared.tsx | 855 ++ shared/constants/notifications/util.tsx | 69 - shared/constants/people/index.tsx | 558 -- shared/constants/people/util.tsx | 28 - shared/constants/pinentry/util.tsx | 28 - .../platform-specific/index.desktop.tsx | 292 - shared/constants/platform.d.ts | 1 + shared/constants/platform.desktop.tsx | 1 + shared/constants/platform.native.tsx | 37 +- shared/constants/profile/index.tsx | 750 -- shared/constants/react.tsx | 29 - shared/constants/recover-password/utils.tsx | 1 - .../remote-actions.tsx} | 11 +- shared/constants/remote.tsx | 2 +- shared/constants/router.tsx | 467 ++ shared/constants/router2/index.tsx | 183 - shared/constants/router2/util.tsx | 443 -- shared/constants/rpc-utils.tsx | 11 +- shared/constants/rpc/index.tsx | 189 + shared/constants/rpc/rpc-all-gen.tsx | 24 + shared/constants/rpc/rpc-chat-gen.tsx | 1786 +++++ shared/constants/rpc/rpc-gen.tsx | 3755 +++++++++ shared/constants/rpc/rpc-gregor-gen.tsx | 72 + shared/constants/rpc/rpc-stellar-gen.tsx | 387 + shared/constants/settings-chat/index.tsx | 153 - shared/constants/settings-invites/index.tsx | 179 - .../settings-notifications/index.tsx | 272 - shared/constants/settings-password/index.tsx | 164 - shared/constants/settings-phone/index.tsx | 285 - .../{settings/util.tsx => settings.tsx} | 21 - shared/constants/settings/index.tsx | 285 - shared/constants/signup/index.tsx | 326 - shared/constants/signup/util.tsx | 13 - shared/constants/store-registry.tsx | 353 - shared/constants/strings.tsx | 12 +- .../utils.tsx => team-building.tsx} | 4 +- .../constants/{teams/util.tsx => teams.tsx} | 25 +- shared/constants/tracker2/util.tsx | 36 - .../types/{chat2 => chat}/common.tsx | 0 .../constants/types/{chat2 => chat}/index.tsx | 15 +- .../types/{chat2 => chat}/message.tsx | 11 +- .../constants/types/{chat2 => chat}/meta.tsx | 0 shared/constants/types/chat2/rowitem.tsx | 63 - shared/constants/types/config.tsx | 6 +- shared/constants/types/crypto.tsx | 2 - shared/constants/types/devices.tsx | 23 +- shared/constants/types/fs.tsx | 6 +- shared/constants/types/git.tsx | 7 - shared/constants/types/index.tsx | 12 +- shared/constants/types/people.tsx | 2 +- shared/constants/types/push.tsx | 11 +- shared/constants/types/router.tsx | 105 + shared/constants/types/router2.tsx | 53 - shared/constants/types/rpc-all-gen.tsx | 10 - shared/constants/types/rpc-chat-gen.tsx | 1869 ----- shared/constants/types/rpc-gen.tsx | 4074 ---------- shared/constants/types/rpc-gregor-gen.tsx | 70 - shared/constants/types/rpc-stellar-gen.tsx | 408 - shared/constants/types/team-building.tsx | 4 +- shared/constants/types/teams.tsx | 4 +- .../types/{tracker2.tsx => tracker.tsx} | 2 +- shared/constants/types/wallets.tsx | 7 +- shared/constants/unlock-folders/index.tsx | 80 - shared/constants/unlock-folders/util.tsx | 30 - shared/constants/users/util.tsx | 14 - shared/constants/utils.tsx | 31 +- shared/constants/values.tsx | 9 + shared/constants/wallets/index.tsx | 77 - shared/constants/wallets/utils.tsx | 2 - shared/constants/whats-new/index.tsx | 55 - shared/constants/whats-new/utils.tsx | 69 - shared/crypto/decrypt.tsx | 253 + shared/crypto/encrypt.tsx | 643 ++ shared/crypto/helpers.ts | 203 + shared/crypto/hooks.test.tsx | 136 + shared/crypto/input.tsx | 301 +- shared/crypto/operations/decrypt.tsx | 67 - shared/crypto/operations/encrypt.tsx | 188 - shared/crypto/operations/sign.tsx | 90 - shared/crypto/operations/verify.tsx | 66 - shared/crypto/output.tsx | 341 +- shared/crypto/recipients.tsx | 63 +- shared/crypto/routes.tsx | 144 +- shared/crypto/sign.tsx | 273 + shared/crypto/sub-nav/index.desktop.tsx | 47 +- shared/crypto/sub-nav/left-nav.desktop.tsx | 9 +- shared/crypto/sub-nav/nav-row.tsx | 16 +- shared/crypto/verify.tsx | 250 + shared/css.d.ts | 1 + shared/deeplinks/error.tsx | 22 +- shared/desktop/app/app-events.desktop.tsx | 258 + shared/desktop/app/html-root.desktop.tsx | 15 +- shared/desktop/app/installer.desktop.tsx | 21 +- ...2.desktop.tsx => ipc-handlers.desktop.tsx} | 441 +- shared/desktop/app/ipctypes.tsx | 6 +- shared/desktop/app/main-window.desktop.tsx | 23 +- shared/desktop/app/menu-bar.desktop.tsx | 71 +- shared/desktop/app/menu-helper.desktop.tsx | 4 +- shared/desktop/app/node.desktop.tsx | 151 +- shared/desktop/electron-sums.mts | 10 + shared/desktop/electron-sums.tsx | 10 - shared/desktop/extract-electron-shasums.sh | 2 +- ...ackage.desktop.tsx => package.desktop.mts} | 33 +- .../remote/component-loader.desktop.tsx | 81 +- shared/desktop/remote/drag-header.desktop.tsx | 6 +- shared/desktop/remote/proxies.desktop.tsx | 9 +- .../remote/remote-component.desktop.tsx | 65 + shared/desktop/remote/store.desktop.tsx | 52 - .../remote/use-browser-window.desktop.tsx | 3 +- .../remote/use-serialize-props.desktop.tsx | 55 +- shared/desktop/renderer/container.desktop.tsx | 31 - shared/desktop/renderer/main.desktop.tsx | 2 +- shared/desktop/renderer/main2.desktop.tsx | 169 +- shared/desktop/renderer/preload.desktop.tsx | 18 +- .../renderer/remote-event-handler.desktop.tsx | 204 + shared/desktop/renderer/style.css | 52 +- shared/desktop/webpack.config.babel.d.ts | 2 - shared/desktop/webpack.config.babel.js | 385 - shared/desktop/webpack.config.mts | 432 ++ .../yarn-helper/action-creator-creator.tsx | 206 - .../yarn-helper/{build.tsx => build.mts} | 16 +- shared/desktop/yarn-helper/electron.mts | 233 + shared/desktop/yarn-helper/electron.tsx | 72 - .../yarn-helper/{font.tsx => font.mts} | 5 + .../yarn-helper/{index.tsx => index.mts} | 15 +- .../{log-to-trace.tsx => log-to-trace.mts} | 0 .../{prettier.tsx => prettier.mts} | 5 +- shared/devices/add-device.tsx | 53 +- shared/devices/device-icon.tsx | 13 +- shared/devices/device-page.tsx | 48 +- shared/devices/device-revoke.tsx | 135 +- shared/devices/index.tsx | 185 +- shared/devices/nav-header.tsx | 13 +- shared/devices/paper-key.tsx | 11 +- shared/devices/routes.tsx | 45 +- shared/devices/row.tsx | 25 +- shared/engine/index-impl.tsx | 120 +- shared/engine/index.d.ts | 4 +- shared/engine/index.desktop.tsx | 2 +- shared/engine/index.native.tsx | 2 +- shared/engine/index.platform.d.ts | 37 +- shared/engine/index.platform.desktop.tsx | 154 +- shared/engine/index.platform.native.tsx | 64 +- shared/engine/listener.tsx | 8 +- shared/engine/local-console.tsx | 16 - shared/engine/request.tsx | 3 - shared/engine/rpc-transport.test.ts | 136 + shared/engine/rpc-transport.ts | 491 ++ shared/engine/session-impl.tsx | 12 +- shared/engine/session.d.ts | 8 +- shared/engine/stats.tsx | 27 - shared/engine/transport-shared.tsx | 150 +- shared/engine/types.d.ts | 4 +- shared/eslint.config.mjs | 12 +- shared/fs/banner/conflict-banner.tsx | 41 +- shared/fs/banner/public-reminder.tsx | 17 +- shared/fs/banner/reset-banner.tsx | 73 +- .../container.tsx | 49 +- .../kext-permission-popup.tsx | 102 +- shared/fs/browser/destination-picker.tsx | 215 +- shared/fs/browser/index.tsx | 40 +- shared/fs/browser/offline.tsx | 12 +- shared/fs/browser/root.tsx | 82 +- shared/fs/browser/rows/common.tsx | 11 +- shared/fs/browser/rows/editing.tsx | 42 +- shared/fs/browser/rows/placeholder.tsx | 10 +- shared/fs/browser/rows/rows-container.tsx | 39 +- shared/fs/browser/rows/rows.tsx | 190 +- shared/fs/browser/rows/still.tsx | 16 +- shared/fs/browser/rows/tlf-type.tsx | 10 +- shared/fs/browser/rows/tlf.tsx | 19 +- shared/fs/common/comma-separated-name.tsx | 2 +- shared/fs/common/errs-container.tsx | 2 +- shared/fs/common/filename.tsx | 8 +- shared/fs/common/folder-view-filter-icon.tsx | 4 +- shared/fs/common/folder-view-filter.tsx | 28 +- shared/fs/common/hooks.tsx | 52 +- shared/fs/common/item-icon.tsx | 65 +- shared/fs/common/kbfs-path.tsx | 9 +- shared/fs/common/last-modified-line.tsx | 12 +- .../fs/common/open-in-system-file-manager.tsx | 14 +- shared/fs/common/path-info.tsx | 4 +- .../common/path-item-action/choose-view.tsx | 25 +- .../path-item-action/confirm-delete.tsx | 11 +- shared/fs/common/path-item-action/confirm.tsx | 41 +- shared/fs/common/path-item-action/header.tsx | 6 +- shared/fs/common/path-item-action/index.tsx | 103 +- shared/fs/common/path-item-action/layout.tsx | 2 +- .../path-item-action/menu-container.tsx | 85 +- shared/fs/common/path-item-info.tsx | 8 +- .../fs/common/path-status-icon-container.tsx | 4 +- shared/fs/common/path-status-icon.tsx | 10 +- shared/fs/common/pie-slice.tsx | 16 +- .../common/refresh-driver-status-on-mount.tsx | 9 +- shared/fs/common/sfmi-popup.tsx | 97 +- shared/fs/common/tlf-info-line-container.tsx | 6 +- shared/fs/common/tlf-info-line.tsx | 3 - shared/fs/common/upload-button.tsx | 71 +- shared/fs/common/upload-icon.tsx | 11 +- shared/fs/common/use-open.tsx | 33 +- shared/fs/filepreview/bare-preview.tsx | 25 +- shared/fs/filepreview/default-view.tsx | 7 +- shared/fs/filepreview/normal-preview.tsx | 17 +- shared/fs/filepreview/text-view.desktop.tsx | 4 +- shared/fs/filepreview/text-view.native.tsx | 4 - shared/fs/filepreview/view.tsx | 12 +- shared/fs/footer/download-wrapper.native.tsx | 16 +- shared/fs/footer/download.tsx | 22 +- shared/fs/footer/downloads.tsx | 7 +- shared/fs/footer/proof-broken.tsx | 4 +- shared/fs/footer/upload-container.tsx | 4 +- shared/fs/footer/upload.desktop.tsx | 25 +- shared/fs/footer/upload.native.tsx | 127 +- shared/fs/footer/use-upload-countdown.tsx | 44 +- shared/fs/index.tsx | 19 +- shared/fs/nav-header/actions.tsx | 17 +- shared/fs/nav-header/main-banner.tsx | 6 +- shared/fs/nav-header/mobile-header.tsx | 34 +- shared/fs/nav-header/title.tsx | 90 +- shared/fs/routes.tsx | 101 +- shared/fs/simple-screens/oops.tsx | 11 +- shared/fs/top-bar/index.tsx | 3 +- shared/fs/top-bar/loading.tsx | 4 +- shared/fs/top-bar/sort.tsx | 103 +- shared/fs/top-bar/sync-toggle.tsx | 71 +- shared/git/delete-repo.tsx | 73 +- shared/git/index.tsx | 221 +- shared/git/nav-header.tsx | 99 +- shared/git/new-repo.tsx | 71 +- shared/git/routes.tsx | 19 +- shared/git/row.tsx | 218 +- shared/git/select-channel.tsx | 86 +- shared/globals.d.ts | 8 +- shared/incoming-share/index.tsx | 244 +- shared/incoming-share/routes.tsx | 45 +- shared/ios/Keybase.xcodeproj/project.pbxproj | 23 +- .../xcschemes/KeybaseShare.xcscheme | 1 + shared/ios/Keybase/AppDelegate.swift | 276 +- shared/ios/Keybase/Fs.swift | 118 +- shared/ios/Keybase/Info.plist | 10 +- shared/ios/Keybase/PerfFPSMonitor.swift | 113 + shared/ios/Keybase/Pusher.swift | 25 +- .../ios/Keybase/ShareIntentDonatorImpl.swift | 35 +- shared/ios/KeybaseShare/Info.plist | 2 +- .../KeybaseShare/ShareViewController.swift | 46 +- shared/ios/Podfile | 26 +- shared/ios/Podfile.lock | 1089 ++- shared/jenkins_test.sh | 10 +- shared/jest.config.js | 35 + shared/jest.setup.js | 60 + shared/logger/index.tsx | 5 +- shared/login/forms/container.native.tsx | 4 +- shared/login/index.tsx | 4 +- shared/login/join-or-login.tsx | 37 +- shared/login/loading.tsx | 14 +- .../recover-password/device-selector.tsx | 14 +- shared/login/recover-password/error-modal.tsx | 38 +- shared/login/recover-password/error.tsx | 13 +- .../login/recover-password/explain-device.tsx | 15 +- shared/login/recover-password/paper-key.tsx | 40 +- shared/login/recover-password/password.tsx | 10 +- .../recover-password/prompt-reset-account.tsx | 8 +- .../prompt-reset-password.tsx | 8 +- .../recover-password/prompt-reset-shared.tsx | 25 +- shared/login/relogin/container.tsx | 40 +- shared/login/relogin/dropdown.native.tsx | 43 +- shared/login/relogin/index.desktop.tsx | 25 +- shared/login/relogin/index.native.tsx | 24 +- shared/login/reset/confirm.tsx | 91 +- shared/login/reset/modal.tsx | 80 +- shared/login/reset/password-enter.tsx | 25 +- shared/login/reset/password-known.tsx | 20 +- shared/login/reset/waiting.tsx | 24 +- shared/login/routes.tsx | 43 +- shared/login/signup/common.tsx | 13 - shared/login/signup/error.tsx | 18 +- shared/login/signup/routes.tsx | 7 +- shared/login/user-card/index.d.ts | 4 +- shared/login/user-card/index.desktop.tsx | 3 +- shared/login/user-card/index.native.tsx | 25 +- shared/menubar/chat-container.desktop.tsx | 87 - shared/menubar/files-container.desktop.tsx | 46 - shared/menubar/files.desktop.tsx | 237 - shared/menubar/index.desktop.tsx | 542 +- shared/menubar/main2.desktop.tsx | 20 +- shared/menubar/out-of-date.tsx | 2 +- shared/menubar/remote-container.desktop.tsx | 112 - shared/menubar/remote-proxy.desktop.tsx | 319 +- shared/menubar/remote-serializer.desktop.tsx | 273 - shared/metro.config.js | 14 +- .../framed-msgpack-rpc/index.d.ts | 89 - shared/override-d.ts/misc/index.d.ts | 27 - shared/package.json | 198 +- .../@legendapp+list+3.0.0-beta.43.patch | 14 + shared/patches/expo-image+55.0.6.patch | 31 + .../patches/expo-image-picker+17.0.10.patch | 13 - shared/patches/qrcode-generator+1.4.4.patch | 29 - shared/patches/react-list+0.8.18.patch | 12 - ...0.81.5.patch => react-native+0.83.4.patch} | 24 +- shared/people/announcement.tsx | 25 +- shared/people/container.tsx | 449 +- shared/people/follow-notification.tsx | 9 +- shared/people/follow-suggestions.tsx | 8 +- shared/people/index.d.ts | 10 +- shared/people/index.desktop.tsx | 8 +- shared/people/index.native.tsx | 5 +- shared/people/index.shared.tsx | 64 +- shared/people/item.tsx | 26 +- shared/people/routes.tsx | 37 +- shared/people/signup-email.tsx | 35 + shared/people/todo.tsx | 335 +- shared/perf/.gitignore | 2 + shared/perf/PERF-TESTING.md | 468 ++ shared/perf/compare-perf.js | 125 + shared/perf/desktop-perf-inject.js | 140 + shared/perf/react-profiler.tsx | 111 + shared/perf/run-desktop-cdp-profile.js | 150 + shared/perf/run-desktop-perf.js | 205 + shared/perf/run-maestro.sh | 277 + shared/perf/visual-diff-compare-ios.sh | 109 + shared/perf/visual-diff-compare.sh | 112 + shared/perf/visual-diff-take-ios.sh | 83 + shared/perf/visual-diff-take.js | 112 + shared/pinentry/index.desktop.tsx | 23 +- shared/pinentry/main2.desktop.tsx | 42 +- shared/pinentry/remote-container.desktop.tsx | 29 - shared/pinentry/remote-proxy.desktop.tsx | 11 +- shared/pinentry/remote-serializer.desktop.tsx | 57 - shared/profile/add-to-team.tsx | 282 +- shared/profile/confirm-or-pending.tsx | 92 - shared/profile/edit-avatar/hooks.tsx | 12 +- shared/profile/edit-avatar/index.desktop.tsx | 101 +- shared/profile/edit-avatar/index.native.tsx | 282 +- shared/profile/edit-profile.tsx | 61 +- shared/profile/generic/enter-username.tsx | 359 - shared/profile/generic/proofs-list.tsx | 1466 +++- shared/profile/generic/result.tsx | 97 - shared/profile/generic/shared.tsx | 5 +- shared/profile/modal.tsx | 13 +- shared/profile/pgp/choice/index.desktop.tsx | 328 +- shared/profile/pgp/finished/index.d.ts | 3 - shared/profile/pgp/finished/index.desktop.tsx | 97 - shared/profile/pgp/finished/index.native.tsx | 1 - shared/profile/pgp/generate/index.d.ts | 3 - shared/profile/pgp/generate/index.desktop.tsx | 27 - shared/profile/pgp/generate/index.native.tsx | 1 - shared/profile/pgp/import/index.desktop.tsx | 10 +- shared/profile/pgp/info/index.d.ts | 3 - shared/profile/pgp/info/index.desktop.tsx | 88 - shared/profile/pgp/info/index.native.tsx | 1 - shared/profile/pgp/no-pgp.native.tsx | 2 +- shared/profile/pgp/validation.ts | 22 + shared/profile/post-proof.tsx | 247 - shared/profile/proof-utils.ts | 30 + shared/profile/prove-enter-username.tsx | 174 - shared/profile/prove-website-choice.tsx | 13 +- shared/profile/revoke.tsx | 69 +- shared/profile/routes.tsx | 114 +- shared/profile/search.tsx | 2 +- shared/profile/showcase-team-offer.tsx | 57 +- shared/profile/user/actions/follow-button.tsx | 15 +- shared/profile/user/actions/index.tsx | 105 +- shared/profile/user/friend.tsx | 27 +- shared/profile/user/hooks.tsx | 18 +- shared/profile/user/index.tsx | 227 +- shared/profile/user/teams/index.tsx | 32 +- shared/provision/code-page/container.tsx | 155 +- shared/provision/code-page/qr-image.tsx | 20 +- shared/provision/code-page/qr-scan/hooks.tsx | 2 +- .../code-page/qr-scan/index.desktop.tsx | 4 +- .../code-page/qr-scan/index.native.tsx | 4 +- shared/provision/code-page/qr-scan/lines.tsx | 24 +- .../code-page/qr-scan/not-authorized.tsx | 8 +- .../code-page/qr-scan/scanner.native.tsx | 2 +- shared/provision/error.tsx | 32 +- shared/provision/forgot-username.tsx | 50 +- shared/provision/paper-key.tsx | 60 +- shared/provision/password.tsx | 19 +- shared/provision/routes-sub.tsx | 67 +- .../select-other-device-connected.tsx | 20 +- shared/provision/select-other-device.tsx | 150 +- shared/provision/set-public-name.tsx | 43 +- shared/provision/troubleshooting.tsx | 98 +- shared/provision/username-or-email.tsx | 50 +- shared/react-native/packageAndBuild.sh | 2 +- shared/router-v2/account-switcher/index.tsx | 45 +- shared/router-v2/common.d.ts | 18 +- shared/router-v2/common.desktop.tsx | 10 +- shared/router-v2/common.native.tsx | 58 +- shared/router-v2/header/index.desktop.tsx | 260 +- shared/router-v2/header/syncing-folders.tsx | 4 +- shared/router-v2/hooks.native.tsx | 218 +- .../router-v2/left-tab-navigator.desktop.tsx | 62 +- shared/router-v2/linking.tsx | 375 + shared/router-v2/react-navigation.d.ts | 10 + shared/router-v2/route-params.tsx | 94 +- shared/router-v2/router.css | 5 +- shared/router-v2/router.desktop.tsx | 203 +- shared/router-v2/router.native.tsx | 426 +- shared/router-v2/router.shared.tsx | 66 +- shared/router-v2/routes.tsx | 198 +- shared/router-v2/screen-layout.desktop.tsx | 371 +- shared/router-v2/screen-layout.native.tsx | 70 +- shared/router-v2/shim.d.ts | 36 - shared/router-v2/shim.desktop.tsx | 42 - shared/router-v2/shim.native.tsx | 40 - shared/router-v2/tab-bar.desktop.tsx | 264 +- shared/router-v2/tab-bar.native.tsx | 119 - shared/settings/about.tsx | 15 +- shared/settings/account/add-modals.tsx | 386 +- shared/settings/account/confirm-delete.tsx | 11 +- shared/settings/account/email-phone-row.tsx | 81 +- shared/settings/account/index.tsx | 58 +- shared/settings/account/use-add-email.tsx | 62 + shared/settings/advanced.tsx | 312 +- shared/settings/archive/index.tsx | 233 +- shared/settings/archive/modal.tsx | 257 +- shared/settings/chat.tsx | 245 +- shared/settings/common.desktop.tsx | 7 +- shared/settings/contacts-joined.tsx | 45 +- shared/settings/db-nuke.confirm.tsx | 24 +- .../check-passphrase.native.tsx | 109 +- shared/settings/delete-confirm/index.tsx | 12 +- .../settings/disable-cert-pinning-modal.tsx | 29 - shared/settings/display.tsx | 16 +- .../settings/feedback/container.desktop.tsx | 4 +- shared/settings/feedback/container.native.tsx | 83 +- shared/settings/feedback/index.tsx | 12 +- shared/settings/feedback/shared.tsx | 4 +- shared/settings/files/hooks.tsx | 2 +- shared/settings/files/index.desktop.tsx | 20 +- shared/settings/files/index.native.tsx | 4 +- shared/settings/files/refresh-settings.tsx | 2 +- shared/settings/group.tsx | 7 +- shared/settings/invite-generated/index.d.ts | 10 - .../invite-generated/index.desktop.tsx | 70 - .../invite-generated/index.native.tsx | 5 - shared/settings/invites/index.d.ts | 3 - shared/settings/invites/index.desktop.tsx | 254 - shared/settings/invites/index.native.tsx | 5 - shared/settings/load-settings.tsx | 46 + shared/settings/logout.tsx | 197 +- shared/settings/manage-contacts.tsx | 34 +- shared/settings/notifications/hooks.tsx | 39 +- .../settings/notifications/index.desktop.tsx | 13 +- .../settings/notifications/index.native.tsx | 36 +- shared/settings/notifications/push-prompt.tsx | 80 +- shared/settings/notifications/render.tsx | 46 +- .../use-notification-settings.test.ts | 357 + .../use-notification-settings.tsx | 289 + shared/settings/password.tsx | 252 +- shared/settings/proxy.tsx | 185 +- shared/settings/root-desktop-tablet.tsx | 56 +- shared/settings/root-phone.tsx | 87 +- shared/settings/routes.tsx | 188 +- .../settings/screenprotector/index.native.tsx | 5 +- shared/settings/sub-nav/left-nav.tsx | 33 +- shared/settings/sub-nav/settings-item.tsx | 16 +- shared/settings/subheading.desktop.tsx | 4 +- shared/settings/use-delete-account.tsx | 36 + shared/settings/use-password-check.tsx | 32 + shared/settings/use-request-logout.tsx | 35 + shared/signup/common.tsx | 243 +- shared/signup/device-name-draft.tsx | 13 + shared/signup/device-name.tsx | 134 +- shared/signup/email.tsx | 66 +- shared/signup/feedback.tsx | 4 +- shared/signup/phone-number/index.tsx | 57 +- .../signup/phone-number/use-verification.tsx | 93 + shared/signup/phone-number/verify-body.tsx | 35 +- shared/signup/phone-number/verify.tsx | 45 +- shared/signup/routes.tsx | 77 +- shared/signup/use-request-auto-invite.ts | 29 + shared/signup/username.tsx | 84 +- shared/stores/archive.tsx | 180 + .../index.tsx => stores/autoreset.tsx} | 84 +- .../chat2/index.tsx => stores/chat.tsx} | 709 +- .../config/index.tsx => stores/config.tsx} | 459 +- shared/stores/convostate.tsx | 3645 +++++++++ .../index.tsx => stores/current-user.tsx} | 11 +- .../daemon/index.tsx => stores/daemon.tsx} | 170 +- .../index.tsx => stores/darkmode.tsx} | 11 +- .../index.tsx => stores/followers.tsx} | 10 +- .../{constants/fs/index.tsx => stores/fs.tsx} | 1649 +--- shared/stores/inbox-rows.tsx | 157 + .../logout/index.tsx => stores/logout.tsx} | 32 +- shared/stores/modal-header.tsx | 66 + .../index.tsx => stores/notifications.tsx} | 49 +- shared/stores/people.tsx | 64 + .../index.tsx => stores/pinentry.tsx} | 15 +- .../index.tsx => stores/provision.tsx} | 264 +- shared/{constants => stores}/push.d.ts | 9 +- shared/{constants => stores}/push.desktop.tsx | 12 +- shared/{constants => stores}/push.native.tsx | 149 +- .../index.tsx => stores/recover-password.tsx} | 139 +- shared/stores/router.tsx | 51 + .../settings-contacts.d.ts | 6 +- .../settings-contacts.desktop.tsx | 4 +- .../settings-contacts.native.tsx | 50 +- .../index.tsx => stores/settings-email.tsx} | 93 +- shared/stores/settings-password.tsx | 60 + shared/stores/settings-phone.tsx | 121 + shared/stores/store-registry.tsx | 133 + .../index.tsx => stores/team-building.tsx} | 164 +- .../teams/index.tsx => stores/teams.tsx} | 760 +- shared/stores/tests/archive.test.ts | 51 + shared/stores/tests/autoreset.test.ts | 109 + shared/stores/tests/chat.test.ts | 68 + shared/stores/tests/config.test.ts | 117 + shared/stores/tests/convostate.test.ts | 597 ++ shared/stores/tests/crypto.test.ts | 71 + shared/stores/tests/current-user.test.ts | 42 + shared/stores/tests/daemon.test.ts | 52 + shared/stores/tests/darkmode.test.ts | 46 + shared/stores/tests/followers.test.ts | 32 + shared/stores/tests/fs.test.ts | 95 + shared/stores/tests/inbox-rows.test.ts | 79 + shared/stores/tests/logout.test.ts | 47 + shared/stores/tests/modal-header.test.ts | 54 + shared/stores/tests/notifications.test.ts | 87 + shared/stores/tests/people.test.ts | 39 + shared/stores/tests/profile.test.ts | 47 + shared/stores/tests/provision.test.ts | 87 + shared/stores/tests/push.desktop.test.ts | 29 + shared/stores/tests/recover-password.test.ts | 123 + shared/stores/tests/router.test.ts | 37 + .../tests/settings-contacts.desktop.test.ts | 53 + shared/stores/tests/settings-email.test.ts | 37 + shared/stores/tests/settings-password.test.ts | 34 + shared/stores/tests/settings-phone.test.ts | 50 + shared/stores/tests/settings.test.ts | 54 + shared/stores/tests/signup.test.ts | 38 + shared/stores/tests/team-building.test.ts | 93 + shared/stores/tests/teams.test.ts | 64 + shared/stores/tests/tracker.test.ts | 111 + shared/stores/tests/uint8array-usage.test.ts | 102 + shared/stores/tests/uint8array-util.test.ts | 26 + shared/stores/tests/unlock-folders.test.ts | 63 + shared/stores/tests/waiting.test.ts | 38 + .../tracker2/index.tsx => stores/tracker.tsx} | 118 +- shared/stores/unlock-folders.tsx | 32 + .../users/index.tsx => stores/users.tsx} | 71 +- .../waiting/index.tsx => stores/waiting.tsx} | 11 +- shared/styles/class-names.test.ts | 35 + shared/styles/class-names.ts | 82 + shared/styles/colors.tsx | 7 +- shared/styles/css.d.ts | 3 + shared/styles/index.d.ts | 8 +- shared/styles/index.desktop.tsx | 39 +- shared/styles/index.native.tsx | 4 +- shared/styles/shared.tsx | 4 +- shared/styles/style-sheet-proxy.tsx | 2 +- shared/styles/styles-base.tsx | 5 - .../team-building/alphabet-index.native.tsx | 15 +- .../team-building/contact-restricted.page.tsx | 4 +- shared/team-building/contact-restricted.tsx | 49 +- shared/team-building/contacts.tsx | 65 +- shared/team-building/continue-button.tsx | 3 - shared/team-building/email-search.tsx | 32 +- .../filtered-service-tab-bar.tsx | 20 +- shared/team-building/go-button.tsx | 28 +- shared/team-building/index.tsx | 338 +- shared/team-building/input.tsx | 17 +- shared/team-building/list-body.tsx | 587 +- shared/team-building/modal-header-props.tsx | 68 - shared/team-building/page.tsx | 161 +- shared/team-building/phone-search.tsx | 29 +- shared/team-building/recs-and-recos.tsx | 62 +- .../search-result/common-result.tsx | 184 +- .../search-result/hellobot-result.tsx | 10 +- .../search-result/people-result.tsx | 151 +- .../search-result/user-result.tsx | 8 +- .../search-result/you-result.tsx | 26 +- .../team-building/service-tab-bar.desktop.tsx | 117 +- .../team-building/service-tab-bar.native.tsx | 32 +- shared/team-building/shared.tsx | 36 +- shared/team-building/team-box.tsx | 39 +- shared/team-building/types.tsx | 30 - shared/team-building/user-bubble.tsx | 21 +- .../add-contacts.native.tsx | 112 +- shared/teams/add-members-wizard/add-email.tsx | 69 +- .../add-members-wizard/add-from-where.tsx | 69 +- shared/teams/add-members-wizard/add-phone.tsx | 80 +- shared/teams/add-members-wizard/confirm.tsx | 126 +- shared/teams/channel/create-channels.tsx | 99 +- shared/teams/channel/header.tsx | 32 +- shared/teams/channel/index.tsx | 65 +- shared/teams/channel/rows.tsx | 247 +- shared/teams/channel/tabs.tsx | 7 +- shared/teams/common/activity.tsx | 4 +- shared/teams/common/channel-hooks.tsx | 33 +- shared/teams/common/channels-widget.tsx | 15 +- shared/teams/common/contacts-list.native.tsx | 20 +- shared/teams/common/enable-contacts.tsx | 8 +- shared/teams/common/selection-popup.tsx | 34 +- shared/teams/common/use-autocompleter.tsx | 22 +- shared/teams/common/use-contacts.native.tsx | 13 +- shared/teams/common/use-team-link-popup.tsx | 15 +- .../teams/confirm-modals/confirm-kick-out.tsx | 15 +- .../confirm-remove-from-channel.tsx | 16 +- .../teams/confirm-modals/delete-channel.tsx | 10 +- .../really-leave-team/index.tsx | 32 +- .../really-leave-team/last-owner.tsx | 48 +- shared/teams/container.tsx | 77 +- shared/teams/delete-team.tsx | 12 +- shared/teams/edit-team-description.tsx | 96 +- shared/teams/emojis/add-alias.tsx | 22 +- shared/teams/emojis/add-emoji.tsx | 82 +- shared/teams/emojis/common.tsx | 69 +- shared/teams/emojis/use-emoji.tsx | 6 +- shared/teams/external-team.tsx | 19 +- shared/teams/get-options.tsx | 21 +- .../teams/invite-by-contact/index.native.tsx | 86 +- .../team-invite-by-contacts.native.tsx | 38 +- shared/teams/invite-by-email.tsx | 145 +- shared/teams/join-team/container.tsx | 233 +- shared/teams/join-team/join-from-invite.tsx | 178 +- shared/teams/main/banner.tsx | 25 +- shared/teams/main/footer.tsx | 12 +- shared/teams/main/index.tsx | 155 +- shared/teams/main/team-row.css | 15 + shared/teams/main/team-row.tsx | 275 +- shared/teams/new-team/index.tsx | 140 +- .../new-team/wizard/add-subteam-members.tsx | 89 +- .../teams/new-team/wizard/create-channels.tsx | 54 +- .../teams/new-team/wizard/create-subteams.tsx | 48 +- .../teams/new-team/wizard/make-big-team.tsx | 22 +- .../teams/new-team/wizard/new-team-info.tsx | 95 +- shared/teams/new-team/wizard/team-purpose.tsx | 37 +- shared/teams/rename-team.tsx | 140 +- shared/teams/role-button.tsx | 2 +- shared/teams/role-picker.tsx | 72 +- shared/teams/routes.tsx | 348 +- shared/teams/subscriber.tsx | 10 +- shared/teams/team/index.tsx | 174 +- shared/teams/team/member/add-to-channels.tsx | 260 +- shared/teams/team/member/edit-channel.tsx | 60 +- shared/teams/team/member/index.new.tsx | 74 +- shared/teams/team/menu-container.tsx | 12 +- shared/teams/team/new-header.tsx | 62 +- shared/teams/team/rows/bot-row/add-row.tsx | 4 +- shared/teams/team/rows/bot-row/bot.tsx | 82 +- shared/teams/team/rows/channel-row/add.tsx | 5 +- .../teams/team/rows/channel-row/channel.tsx | 48 +- shared/teams/team/rows/emoji-row/add.tsx | 16 +- shared/teams/team/rows/emoji-row/header.tsx | 1 - shared/teams/team/rows/emoji-row/item.tsx | 89 +- shared/teams/team/rows/empty-row.tsx | 19 +- shared/teams/team/rows/index.tsx | 85 +- shared/teams/team/rows/invite-row/invite.tsx | 16 +- shared/teams/team/rows/invite-row/request.tsx | 72 +- shared/teams/team/rows/member-row.tsx | 233 +- shared/teams/team/rows/subteam-row/add.tsx | 30 +- .../teams/team/settings-tab/channel-popup.tsx | 13 +- .../team/settings-tab/default-channels.tsx | 8 +- shared/teams/team/settings-tab/index.tsx | 120 +- .../team/settings-tab/open-team-warning.tsx | 91 +- .../team/settings-tab/retention/index.tsx | 73 +- .../settings-tab/retention/use-confirm.tsx | 4 +- .../team/settings-tab/retention/warning.tsx | 113 +- .../teams/team/settings-tab/use-settings.tsx | 6 +- shared/teams/team/tabs.tsx | 15 +- shared/teams/team/team-info.tsx | 138 +- shared/test/mocks/file.js | 1 + shared/test/mocks/logger.js | 17 + shared/test/mocks/react-native.js | 18 + shared/test/mocks/react-navigation-core.js | 94 + shared/test/mocks/style.js | 1 + shared/todo.txt | 6 +- shared/{tracker2 => tracker}/assertion.tsx | 225 +- shared/{tracker2 => tracker}/bio.tsx | 11 +- shared/tracker/index.desktop.tsx | 498 ++ shared/{tracker2 => tracker}/main.desktop.tsx | 0 shared/tracker/main2.desktop.tsx | 61 + .../remote-proxy.desktop.tsx | 53 +- shared/tracker2/index.desktop.tsx | 341 - shared/tracker2/main2.desktop.tsx | 23 - shared/tracker2/remote-container.desktop.tsx | 150 - shared/tracker2/remote-serializer.desktop.tsx | 206 - shared/tsconfig.json | 21 +- shared/unlock-folders/device-list.desktop.tsx | 8 +- shared/unlock-folders/index.desktop.tsx | 7 +- shared/unlock-folders/main2.desktop.tsx | 68 +- .../paper-key-input.desktop.tsx | 4 +- .../remote-container.desktop.tsx | 65 - .../unlock-folders/remote-proxy.desktop.tsx | 11 +- .../remote-serializer.desktop.tsx | 45 - shared/unlock-folders/success.desktop.tsx | 6 +- shared/util/audio.native.tsx | 16 +- shared/util/clear-logs.android.tsx | 5 - shared/util/clear-logs.d.ts | 2 - shared/util/clear-logs.desktop.tsx | 5 - shared/util/clear-logs.ios.tsx | 3 - shared/util/crop.tsx | 2 +- shared/util/debug-react.tsx | 33 +- shared/util/debug.tsx | 10 +- shared/util/electron.desktop.tsx | 13 +- shared/util/errors.tsx | 9 +- shared/util/expo-document-picker.native.tsx | 10 + shared/util/featured-bots.tsx | 96 + shared/util/hidden-string.d.ts | 6 - shared/util/hidden-string.desktop.tsx | 3 - shared/util/hidden-string.native.tsx | 3 - ...dden-string-impl.tsx => hidden-string.tsx} | 14 +- shared/util/misc.d.ts | 19 + shared/util/misc.desktop.tsx | 98 + shared/util/misc.native.tsx | 75 + shared/util/notify-popup.d.ts | 10 - shared/util/notify-popup.desktop.tsx | 54 - shared/util/notify-popup.native.tsx | 11 - shared/util/open-url.d.ts | 1 - shared/util/open-url.desktop.tsx | 3 - shared/util/open-url.native.tsx | 11 - shared/util/phone-numbers/index.tsx | 66 +- shared/util/pick-files.d.ts | 5 - shared/util/pick-files.desktop.tsx | 25 - shared/util/pick-files.native.tsx | 15 - .../platform-specific/index.d.ts | 3 +- .../util/platform-specific/index.desktop.tsx | 13 + .../util/platform-specific/index.native.tsx | 112 + .../input-monitor.desktop.tsx | 0 .../platform-specific/kbfs-notifications.tsx | 4 +- shared/util/qr-code.tsx | 643 ++ shared/util/rpcerror.tsx | 2 +- shared/util/safe-navigation.tsx | 18 +- shared/util/safe-submit.tsx | 17 +- shared/util/shallow-equal.test.ts | 50 + shared/util/shallow-equal.ts | 38 + shared/util/simple-validators.tsx | 4 +- shared/util/sms.d.ts | 3 - shared/util/sms.desktop.tsx | 6 - shared/util/sms.native.tsx | 12 - shared/util/uint8array.ts | 122 + shared/util/use-local-badging.tsx | 14 +- shared/util/use-rpc.tsx | 15 +- shared/util/util.tsx | 2 +- shared/util/uuid.ts | 14 + shared/util/zustand.tsx | 57 +- shared/wallets/account-page-header.tsx | 7 +- shared/wallets/account-utils.test.ts | 99 + shared/wallets/account-utils.ts | 32 + shared/wallets/index.tsx | 55 +- shared/wallets/really-remove-account.tsx | 44 +- shared/wallets/remove-account.tsx | 40 +- shared/wallets/routes.tsx | 14 +- shared/wallets/wallet-popup.tsx | 49 +- shared/whats-new/README.md | 43 - shared/whats-new/container.tsx | 47 - shared/whats-new/icon/icon.css | 3 - shared/whats-new/icon/index.tsx | 188 - shared/whats-new/icon/popup.d.ts | 13 - shared/whats-new/icon/popup.desktop.tsx | 31 - shared/whats-new/icon/popup.native.tsx | 2 - shared/whats-new/index.tsx | 129 - shared/whats-new/new-feature-row.tsx | 132 - shared/whats-new/versions.tsx | 209 - shared/yarn.lock | 6879 ++++++++++------- {skills => skill}/bumping-versions/SKILL.md | 0 skill/electron-screenshot/SKILL.md | 39 + skill/ios-screenshot/SKILL.md | 30 + skill/migrate-to-static-config | 1 + skill/playwright-cli/SKILL.md | 333 + .../references/request-mocking.md | 87 + .../playwright-cli/references/running-code.md | 232 + .../references/session-management.md | 169 + .../references/storage-state.md | 275 + .../references/test-generation.md | 88 + skill/playwright-cli/references/tracing.md | 139 + .../references/video-recording.md | 43 + skill/react-native-best-practices | 1 + skill/update-dependencies/SKILL.md | 81 + skill/upgrade-react-navigation | 1 + skill/vercel-react-best-practices | 1 + skill/vercel-react-native-skills | 1 + skill/visual-diff/SKILL.md | 84 + skill/zustand-store-pruning/SKILL.md | 187 + .../zustand-store-pruning/agents/openai.yaml | 4 + .../references/keybase-examples.md | 131 + .../references/store-checklist.md | 22 + skills-lock.json | 30 + 2490 files changed, 96264 insertions(+), 73183 deletions(-) create mode 100644 .agents/skills/migrate-to-static-config/SKILL.md create mode 100644 .agents/skills/migrate-to-static-config/agents/openai.yaml create mode 100644 .agents/skills/migrate-to-static-config/references/react-navigation-7.md create mode 100644 .agents/skills/migrate-to-static-config/references/react-navigation-8.md create mode 100644 .agents/skills/react-native-best-practices/README.md create mode 100644 .agents/skills/react-native-best-practices/SKILL.md create mode 120000 .agents/skills/react-native-best-practices/react-native-best-practices create mode 100644 .agents/skills/react-native-best-practices/references/animations/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/animation-functions.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/animations-performance.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/animations.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/canvas-animations.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/canvas-atlas.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/gpu-animations.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/layout-animations.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/scroll-and-events.md create mode 100644 .agents/skills/react-native-best-practices/references/animations/svg-animations.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/audio.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/effects-and-analysis.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/playback.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/recording.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/system-and-notifications.md create mode 100644 .agents/skills/react-native-best-practices/references/audio/worklets.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/continuous-gestures.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/gesture-composition.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/gestures.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/swipeable-and-drawer.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/tap-handling.md create mode 100644 .agents/skills/react-native-best-practices/references/gestures/testing.md create mode 100644 .agents/skills/react-native-best-practices/references/multithreading/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/multithreading/setup-and-advanced.md create mode 100644 .agents/skills/react-native-best-practices/references/multithreading/shared-memory.md create mode 100644 .agents/skills/react-native-best-practices/references/multithreading/threading-api.md create mode 100644 .agents/skills/react-native-best-practices/references/on-device-ai/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/on-device-ai/llm.md create mode 100644 .agents/skills/react-native-best-practices/references/on-device-ai/setup.md create mode 100644 .agents/skills/react-native-best-practices/references/on-device-ai/speech.md create mode 100644 .agents/skills/react-native-best-practices/references/on-device-ai/vision.md create mode 100644 .agents/skills/react-native-best-practices/references/rich-text/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/svg/SKILL.md create mode 100644 .agents/skills/react-native-best-practices/references/svg/svg.md create mode 100644 .agents/skills/react-native-best-practices/references/svg/when-to-use.md create mode 100644 .agents/skills/upgrade-react-navigation/SKILL.md create mode 100644 .agents/skills/upgrade-react-navigation/agents/openai.yaml create mode 100644 .agents/skills/upgrade-react-navigation/references/upgrade-6-to-7.md create mode 100644 .agents/skills/upgrade-react-navigation/references/upgrade-7-to-8.md create mode 100644 .agents/skills/vercel-react-best-practices/AGENTS.md create mode 100644 .agents/skills/vercel-react-best-practices/README.md create mode 100644 .agents/skills/vercel-react-best-practices/SKILL.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/_sections.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/_template.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-init-once.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-api-routes.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-defer-await.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-dependencies.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-parallel.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-conditional.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-preload.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-event-listeners.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-storage.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-early-exit.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-index-maps.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-length-check-first.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-activity.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-memo.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-transitions.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-auth-actions.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-cache-lru.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-cache-react.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-dedup-props.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-serialization.md create mode 100644 .agents/skills/vercel-react-native-skills/AGENTS.md create mode 100644 .agents/skills/vercel-react-native-skills/README.md create mode 100644 .agents/skills/vercel-react-native-skills/SKILL.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/_sections.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/_template.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/animation-derived-value.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/animation-gpu-properties.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/design-system-compound-components.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/fonts-config-plugin.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/imports-design-system-folder.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/js-hoist-intl.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-callbacks.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-function-references.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-images.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-item-memo.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-item-types.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/list-performance-virtualize.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/navigation-native-navigators.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/react-state-dispatcher.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/react-state-fallback.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/react-state-minimize.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/scroll-position-no-state.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/state-ground-truth.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-expo-image.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-image-gallery.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-measure-views.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-menus.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-native-modals.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-pressable.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md create mode 100644 .agents/skills/vercel-react-native-skills/rules/ui-styling.md create mode 100644 .claude-plugin/plugin.json create mode 100755 .claude/hooks/pre-commit-check.sh create mode 100644 .claude/settings.json create mode 120000 .claude/skills create mode 100644 AGENTS.md create mode 100644 CLAUDE.md delete mode 100644 protocol/bin/flow.js create mode 100644 protocol/bin/generate-ts.ts create mode 100644 protocol/tsconfig.json create mode 100644 rnmodules/react-native-kb/cpp/msgpack-safe.hpp delete mode 100644 rnmodules/react-native-kb/ios/KBJSScheduler.cpp delete mode 100644 rnmodules/react-native-kb/ios/KBJSScheduler.h create mode 100644 shared/.maestro/performance/perf-inbox-scroll.yaml create mode 100644 shared/.maestro/performance/perf-teams-scroll.yaml create mode 100644 shared/.maestro/performance/perf-thread-scroll.yaml create mode 100644 shared/.maestro/subflows/escape-to-tabs.yaml create mode 100644 shared/.maestro/subflows/navigate-to-chat.yaml create mode 100644 shared/.maestro/subflows/navigate-to-teams.yaml create mode 100644 shared/.maestro/subflows/navigate-to-thread.yaml create mode 100644 shared/.maestro/visual-diff/nav-chat.yaml create mode 100644 shared/.maestro/visual-diff/nav-files.yaml create mode 100644 shared/.maestro/visual-diff/nav-more-back.yaml create mode 100644 shared/.maestro/visual-diff/nav-more-crypto.yaml create mode 100644 shared/.maestro/visual-diff/nav-more-devices.yaml create mode 100644 shared/.maestro/visual-diff/nav-more-git.yaml create mode 100644 shared/.maestro/visual-diff/nav-more-settings.yaml create mode 100644 shared/.maestro/visual-diff/nav-more.yaml create mode 100644 shared/.maestro/visual-diff/nav-people.yaml create mode 100644 shared/.maestro/visual-diff/nav-teams.yaml create mode 100644 shared/.maestro/visual-diff/visual-diff-tabs.yaml delete mode 100644 shared/actions/engine-gen-gen.tsx delete mode 100644 shared/actions/json/engine-gen.json delete mode 100644 shared/actions/json/remote.json create mode 100644 shared/app.json create mode 100644 shared/app/global-errors.tsx delete mode 100644 shared/app/global-errors/hook.tsx delete mode 100644 shared/app/global-errors/index.d.ts delete mode 100644 shared/app/global-errors/index.desktop.tsx delete mode 100644 shared/app/global-errors/index.native.tsx create mode 100644 shared/chat/conversation/input-area/location-popup.d.ts create mode 100644 shared/chat/conversation/input-area/location-popup.desktop.tsx create mode 100644 shared/chat/conversation/input-area/location-popup.native.tsx delete mode 100644 shared/chat/conversation/input-area/location-popup.tsx rename shared/chat/conversation/input-area/{normal2 => normal}/index.tsx (66%) rename shared/{common-adapters/input2.d.ts => chat/conversation/input-area/normal/input.d.ts} (66%) create mode 100644 shared/chat/conversation/input-area/normal/input.desktop.tsx rename shared/chat/conversation/input-area/{normal2/platform-input.native.tsx => normal/input.native.tsx} (53%) rename shared/chat/conversation/input-area/{normal2 => normal}/max-input-area-context.tsx (100%) rename shared/chat/conversation/input-area/{normal2/moremenu-popup.tsx => normal/moremenu-popup.native.tsx} (79%) rename shared/chat/conversation/input-area/{normal2 => normal}/set-explode-popup/hooks.tsx (72%) rename shared/chat/conversation/input-area/{normal2 => normal}/set-explode-popup/index.d.ts (100%) rename shared/chat/conversation/input-area/{normal2 => normal}/set-explode-popup/index.desktop.tsx (95%) rename shared/chat/conversation/input-area/{normal2 => normal}/set-explode-popup/index.native.tsx (65%) rename shared/chat/conversation/input-area/{normal2 => normal}/typing.tsx (84%) delete mode 100644 shared/chat/conversation/input-area/normal2/platform-input.d.ts delete mode 100644 shared/chat/conversation/input-area/normal2/platform-input.desktop.tsx create mode 100644 shared/chat/conversation/messages/attachment/image/imageimpl.d.ts rename shared/chat/conversation/messages/attachment/{image2 => image}/imageimpl.desktop.tsx (62%) rename shared/chat/conversation/messages/attachment/{image2 => image}/imageimpl.native.tsx (67%) create mode 100644 shared/chat/conversation/messages/attachment/image/index.tsx rename shared/chat/conversation/messages/attachment/{image2 => image}/use-state.tsx (95%) delete mode 100644 shared/chat/conversation/messages/attachment/image2/imageimpl.d.ts delete mode 100644 shared/chat/conversation/messages/attachment/image2/index.tsx create mode 100644 shared/chat/conversation/messages/separator-utils.ts delete mode 100644 shared/chat/conversation/messages/wrapper/long-pressable/swipeable.native.tsx rename shared/chat/{inbox-and-conversation-2-get-options.tsx => inbox-and-conversation-get-options.tsx} (85%) rename shared/chat/{inbox-and-conversation-2.tsx => inbox-and-conversation.tsx} (72%) delete mode 100644 shared/chat/inbox/container.tsx create mode 100644 shared/chat/inbox/list-helpers.tsx delete mode 100644 shared/chat/inbox/row/small-team/bottom-line.tsx delete mode 100644 shared/chat/inbox/row/small-team/contexts.tsx delete mode 100644 shared/chat/inbox/row/small-team/top-line.tsx create mode 100644 shared/chat/inbox/rowitem.tsx create mode 100644 shared/chat/inbox/use-inbox-state.tsx delete mode 100644 shared/chat/maybe-popup.tsx create mode 100644 shared/chat/user-emoji.tsx delete mode 100644 shared/common-adapters/avatar/hooks.tsx create mode 100644 shared/common-adapters/avatar/icon-to-img-set.tsx delete mode 100644 shared/common-adapters/floating-menu/context.tsx create mode 100644 shared/common-adapters/header-buttons.d.ts create mode 100644 shared/common-adapters/header-buttons.desktop.tsx create mode 100644 shared/common-adapters/header-buttons.native.tsx delete mode 100644 shared/common-adapters/header-hoc/index.d.ts delete mode 100644 shared/common-adapters/header-hoc/index.desktop.tsx delete mode 100644 shared/common-adapters/header-hoc/index.native.tsx delete mode 100644 shared/common-adapters/header-or-popup.tsx create mode 100644 shared/common-adapters/icon-auto.tsx delete mode 100644 shared/common-adapters/icon.d.ts delete mode 100644 shared/common-adapters/icon.desktop.tsx delete mode 100644 shared/common-adapters/icon.native.tsx create mode 100644 shared/common-adapters/icon.tsx create mode 100644 shared/common-adapters/image-icon.tsx rename shared/common-adapters/{image2.d.ts => image.d.ts} (87%) rename shared/common-adapters/{image2.desktop.tsx => image.desktop.tsx} (73%) create mode 100644 shared/common-adapters/image.native.tsx delete mode 100644 shared/common-adapters/image2.native.tsx delete mode 100644 shared/common-adapters/input.shared.tsx delete mode 100644 shared/common-adapters/input2.desktop.tsx delete mode 100644 shared/common-adapters/input2.native.tsx create mode 100644 shared/common-adapters/input3.d.ts create mode 100644 shared/common-adapters/input3.desktop.tsx create mode 100644 shared/common-adapters/input3.native.tsx delete mode 100644 shared/common-adapters/labeled-input.tsx create mode 100644 shared/common-adapters/list-common.tsx rename shared/common-adapters/{list-item2.css => list-item.css} (100%) delete mode 100644 shared/common-adapters/list-item.d.ts delete mode 100644 shared/common-adapters/list-item.desktop.tsx delete mode 100644 shared/common-adapters/list-item.native.tsx rename shared/common-adapters/{list-item2.tsx => list-item.tsx} (97%) delete mode 100644 shared/common-adapters/list2.d.ts delete mode 100644 shared/common-adapters/list2.desktop.tsx delete mode 100644 shared/common-adapters/list2.native.tsx rename shared/common-adapters/markdown/{generate-emoji-parser.tsx => generate-emoji-parser.mts} (94%) create mode 100644 shared/common-adapters/markdown/index.test.tsx create mode 100644 shared/common-adapters/markdown/service-decoration-parser.test.ts create mode 100644 shared/common-adapters/markdown/service-decoration-parser.ts delete mode 100644 shared/common-adapters/mobile-popup.tsx delete mode 100644 shared/common-adapters/modal.tsx delete mode 100644 shared/common-adapters/modal2.tsx delete mode 100644 shared/common-adapters/new-input.tsx delete mode 100644 shared/common-adapters/overlay/index.d.ts delete mode 100644 shared/common-adapters/overlay/index.desktop.tsx delete mode 100644 shared/common-adapters/overlay/index.native.tsx delete mode 100644 shared/common-adapters/plain-input.d.ts delete mode 100644 shared/common-adapters/plain-input.desktop.tsx delete mode 100644 shared/common-adapters/plain-input.native.tsx delete mode 100644 shared/common-adapters/popup-dialog.d.ts delete mode 100644 shared/common-adapters/popup-dialog.desktop.tsx delete mode 100644 shared/common-adapters/popup-dialog.native.tsx delete mode 100644 shared/common-adapters/popup-header-text.tsx rename shared/common-adapters/{ => popup}/bottom-sheet.d.ts (100%) create mode 100644 shared/common-adapters/popup/bottom-sheet.desktop.tsx rename shared/common-adapters/{ => popup}/bottom-sheet.native.tsx (100%) rename shared/common-adapters/{ => popup}/floating-box/index.d.ts (100%) rename shared/common-adapters/{ => popup}/floating-box/index.desktop.tsx (77%) rename shared/common-adapters/{ => popup}/floating-box/index.native.tsx (81%) rename shared/common-adapters/{ => popup}/floating-box/relative-floating-box.desktop.tsx (87%) create mode 100644 shared/common-adapters/popup/index.d.ts create mode 100644 shared/common-adapters/popup/index.desktop.tsx create mode 100644 shared/common-adapters/popup/index.native.tsx rename shared/common-adapters/{ => popup}/use-popup.tsx (84%) delete mode 100644 shared/common-adapters/safe-react-list.tsx create mode 100644 shared/common-adapters/text-url.d.ts create mode 100644 shared/common-adapters/text-url.desktop.tsx create mode 100644 shared/common-adapters/text-url.native.tsx create mode 100644 shared/common-adapters/text.styles.d.ts rename shared/common-adapters/{text.meta.desktop.tsx => text.styles.desktop.tsx} (92%) create mode 100644 shared/common-adapters/text.styles.native.tsx delete mode 100644 shared/common-adapters/text2.d.ts delete mode 100644 shared/common-adapters/text2.desktop.tsx delete mode 100644 shared/common-adapters/text2.native.tsx delete mode 100644 shared/constants/active/index.tsx delete mode 100644 shared/constants/archive/index.tsx delete mode 100644 shared/constants/archive/util.tsx delete mode 100644 shared/constants/autoreset/util.tsx delete mode 100644 shared/constants/bots/index.tsx delete mode 100644 shared/constants/bots/util.tsx rename shared/constants/{chat2 => chat}/common.tsx (74%) rename shared/constants/{chat2 => chat}/debug.tsx (98%) create mode 100644 shared/constants/chat/index.tsx create mode 100644 shared/constants/chat/layout.tsx rename shared/constants/{chat2 => chat}/message.tsx (97%) rename shared/constants/{chat2 => chat}/meta.tsx (95%) delete mode 100644 shared/constants/chat2/convostate.tsx delete mode 100644 shared/constants/chat2/util.tsx rename shared/constants/{config/util.tsx => config.tsx} (77%) rename shared/constants/{crypto/util.tsx => crypto.tsx} (91%) delete mode 100644 shared/constants/crypto/index.tsx create mode 100644 shared/constants/deeplinks.tsx delete mode 100644 shared/constants/deeplinks/index.tsx delete mode 100644 shared/constants/deeplinks/util.tsx delete mode 100644 shared/constants/devices/index.tsx delete mode 100644 shared/constants/devices/util.tsx delete mode 100644 shared/constants/engine/index.tsx create mode 100644 shared/constants/fs.tsx delete mode 100644 shared/constants/fs/common.native.tsx delete mode 100644 shared/constants/fs/platform-specific.android.tsx delete mode 100644 shared/constants/fs/platform-specific.d.ts delete mode 100644 shared/constants/fs/platform-specific.desktop.tsx delete mode 100644 shared/constants/fs/platform-specific.ios.tsx delete mode 100644 shared/constants/fs/util.tsx delete mode 100644 shared/constants/git/index.tsx delete mode 100644 shared/constants/git/util.tsx create mode 100644 shared/constants/init/index.d.ts create mode 100644 shared/constants/init/index.desktop.tsx rename shared/constants/{platform-specific => init}/index.native.tsx (51%) rename shared/constants/{platform-specific/push.native.tsx => init/push-listener.native.tsx} (74%) create mode 100644 shared/constants/init/shared.tsx delete mode 100644 shared/constants/notifications/util.tsx delete mode 100644 shared/constants/people/index.tsx delete mode 100644 shared/constants/people/util.tsx delete mode 100644 shared/constants/pinentry/util.tsx delete mode 100644 shared/constants/platform-specific/index.desktop.tsx delete mode 100644 shared/constants/profile/index.tsx delete mode 100644 shared/constants/recover-password/utils.tsx rename shared/{actions/remote-gen.tsx => constants/remote-actions.tsx} (96%) create mode 100644 shared/constants/router.tsx delete mode 100644 shared/constants/router2/index.tsx delete mode 100644 shared/constants/router2/util.tsx create mode 100644 shared/constants/rpc/index.tsx create mode 100644 shared/constants/rpc/rpc-all-gen.tsx create mode 100644 shared/constants/rpc/rpc-chat-gen.tsx create mode 100644 shared/constants/rpc/rpc-gen.tsx create mode 100644 shared/constants/rpc/rpc-gregor-gen.tsx create mode 100644 shared/constants/rpc/rpc-stellar-gen.tsx delete mode 100644 shared/constants/settings-chat/index.tsx delete mode 100644 shared/constants/settings-invites/index.tsx delete mode 100644 shared/constants/settings-notifications/index.tsx delete mode 100644 shared/constants/settings-password/index.tsx delete mode 100644 shared/constants/settings-phone/index.tsx rename shared/constants/{settings/util.tsx => settings.tsx} (70%) delete mode 100644 shared/constants/settings/index.tsx delete mode 100644 shared/constants/signup/index.tsx delete mode 100644 shared/constants/signup/util.tsx delete mode 100644 shared/constants/store-registry.tsx rename shared/constants/{team-building/utils.tsx => team-building.tsx} (82%) rename shared/constants/{teams/util.tsx => teams.tsx} (82%) delete mode 100644 shared/constants/tracker2/util.tsx rename shared/constants/types/{chat2 => chat}/common.tsx (100%) rename shared/constants/types/{chat2 => chat}/index.tsx (94%) rename shared/constants/types/{chat2 => chat}/message.tsx (98%) rename shared/constants/types/{chat2 => chat}/meta.tsx (100%) delete mode 100644 shared/constants/types/chat2/rowitem.tsx create mode 100644 shared/constants/types/router.tsx delete mode 100644 shared/constants/types/router2.tsx delete mode 100644 shared/constants/types/rpc-all-gen.tsx delete mode 100644 shared/constants/types/rpc-chat-gen.tsx delete mode 100644 shared/constants/types/rpc-gen.tsx delete mode 100644 shared/constants/types/rpc-gregor-gen.tsx delete mode 100644 shared/constants/types/rpc-stellar-gen.tsx rename shared/constants/types/{tracker2.tsx => tracker.tsx} (98%) delete mode 100644 shared/constants/unlock-folders/index.tsx delete mode 100644 shared/constants/unlock-folders/util.tsx delete mode 100644 shared/constants/users/util.tsx delete mode 100644 shared/constants/wallets/index.tsx delete mode 100644 shared/constants/wallets/utils.tsx delete mode 100644 shared/constants/whats-new/index.tsx delete mode 100644 shared/constants/whats-new/utils.tsx create mode 100644 shared/crypto/decrypt.tsx create mode 100644 shared/crypto/encrypt.tsx create mode 100644 shared/crypto/helpers.ts create mode 100644 shared/crypto/hooks.test.tsx delete mode 100644 shared/crypto/operations/decrypt.tsx delete mode 100644 shared/crypto/operations/encrypt.tsx delete mode 100644 shared/crypto/operations/sign.tsx delete mode 100644 shared/crypto/operations/verify.tsx create mode 100644 shared/crypto/sign.tsx create mode 100644 shared/crypto/verify.tsx create mode 100644 shared/css.d.ts create mode 100644 shared/desktop/app/app-events.desktop.tsx rename shared/desktop/app/{node2.desktop.tsx => ipc-handlers.desktop.tsx} (60%) create mode 100644 shared/desktop/electron-sums.mts delete mode 100644 shared/desktop/electron-sums.tsx rename shared/desktop/{package.desktop.tsx => package.desktop.mts} (89%) create mode 100644 shared/desktop/remote/remote-component.desktop.tsx delete mode 100644 shared/desktop/remote/store.desktop.tsx delete mode 100644 shared/desktop/renderer/container.desktop.tsx create mode 100644 shared/desktop/renderer/remote-event-handler.desktop.tsx delete mode 100644 shared/desktop/webpack.config.babel.d.ts delete mode 100644 shared/desktop/webpack.config.babel.js create mode 100644 shared/desktop/webpack.config.mts delete mode 100644 shared/desktop/yarn-helper/action-creator-creator.tsx rename shared/desktop/yarn-helper/{build.tsx => build.mts} (66%) create mode 100644 shared/desktop/yarn-helper/electron.mts delete mode 100644 shared/desktop/yarn-helper/electron.tsx rename shared/desktop/yarn-helper/{font.tsx => font.mts} (98%) rename shared/desktop/yarn-helper/{index.tsx => index.mts} (93%) rename shared/desktop/yarn-helper/{log-to-trace.tsx => log-to-trace.mts} (100%) rename shared/desktop/yarn-helper/{prettier.tsx => prettier.mts} (91%) create mode 100644 shared/engine/rpc-transport.test.ts create mode 100644 shared/engine/rpc-transport.ts delete mode 100644 shared/engine/stats.tsx create mode 100644 shared/ios/Keybase/PerfFPSMonitor.swift create mode 100644 shared/jest.config.js create mode 100644 shared/jest.setup.js delete mode 100644 shared/menubar/chat-container.desktop.tsx delete mode 100644 shared/menubar/files-container.desktop.tsx delete mode 100644 shared/menubar/files.desktop.tsx delete mode 100644 shared/menubar/remote-container.desktop.tsx delete mode 100644 shared/menubar/remote-serializer.desktop.tsx delete mode 100644 shared/override-d.ts/framed-msgpack-rpc/index.d.ts create mode 100644 shared/patches/@legendapp+list+3.0.0-beta.43.patch create mode 100644 shared/patches/expo-image+55.0.6.patch delete mode 100644 shared/patches/expo-image-picker+17.0.10.patch delete mode 100644 shared/patches/qrcode-generator+1.4.4.patch delete mode 100644 shared/patches/react-list+0.8.18.patch rename shared/patches/{react-native+0.81.5.patch => react-native+0.83.4.patch} (53%) create mode 100644 shared/people/signup-email.tsx create mode 100644 shared/perf/.gitignore create mode 100644 shared/perf/PERF-TESTING.md create mode 100644 shared/perf/compare-perf.js create mode 100644 shared/perf/desktop-perf-inject.js create mode 100644 shared/perf/react-profiler.tsx create mode 100755 shared/perf/run-desktop-cdp-profile.js create mode 100644 shared/perf/run-desktop-perf.js create mode 100755 shared/perf/run-maestro.sh create mode 100755 shared/perf/visual-diff-compare-ios.sh create mode 100755 shared/perf/visual-diff-compare.sh create mode 100755 shared/perf/visual-diff-take-ios.sh create mode 100644 shared/perf/visual-diff-take.js delete mode 100644 shared/pinentry/remote-container.desktop.tsx delete mode 100644 shared/pinentry/remote-serializer.desktop.tsx delete mode 100644 shared/profile/confirm-or-pending.tsx delete mode 100644 shared/profile/generic/enter-username.tsx delete mode 100644 shared/profile/generic/result.tsx delete mode 100644 shared/profile/pgp/finished/index.d.ts delete mode 100644 shared/profile/pgp/finished/index.desktop.tsx delete mode 100644 shared/profile/pgp/finished/index.native.tsx delete mode 100644 shared/profile/pgp/generate/index.d.ts delete mode 100644 shared/profile/pgp/generate/index.desktop.tsx delete mode 100644 shared/profile/pgp/generate/index.native.tsx delete mode 100644 shared/profile/pgp/info/index.d.ts delete mode 100644 shared/profile/pgp/info/index.desktop.tsx delete mode 100644 shared/profile/pgp/info/index.native.tsx create mode 100644 shared/profile/pgp/validation.ts delete mode 100644 shared/profile/post-proof.tsx create mode 100644 shared/profile/proof-utils.ts delete mode 100644 shared/profile/prove-enter-username.tsx create mode 100644 shared/router-v2/linking.tsx create mode 100644 shared/router-v2/react-navigation.d.ts delete mode 100644 shared/router-v2/shim.d.ts delete mode 100644 shared/router-v2/shim.desktop.tsx delete mode 100644 shared/router-v2/shim.native.tsx delete mode 100644 shared/router-v2/tab-bar.native.tsx create mode 100644 shared/settings/account/use-add-email.tsx delete mode 100644 shared/settings/disable-cert-pinning-modal.tsx delete mode 100644 shared/settings/invite-generated/index.d.ts delete mode 100644 shared/settings/invite-generated/index.desktop.tsx delete mode 100644 shared/settings/invite-generated/index.native.tsx delete mode 100644 shared/settings/invites/index.d.ts delete mode 100644 shared/settings/invites/index.desktop.tsx delete mode 100644 shared/settings/invites/index.native.tsx create mode 100644 shared/settings/load-settings.tsx create mode 100644 shared/settings/notifications/use-notification-settings.test.ts create mode 100644 shared/settings/notifications/use-notification-settings.tsx create mode 100644 shared/settings/use-delete-account.tsx create mode 100644 shared/settings/use-password-check.tsx create mode 100644 shared/settings/use-request-logout.tsx create mode 100644 shared/signup/device-name-draft.tsx create mode 100644 shared/signup/phone-number/use-verification.tsx create mode 100644 shared/signup/use-request-auto-invite.ts create mode 100644 shared/stores/archive.tsx rename shared/{constants/autoreset/index.tsx => stores/autoreset.tsx} (69%) rename shared/{constants/chat2/index.tsx => stores/chat.tsx} (79%) rename shared/{constants/config/index.tsx => stores/config.tsx} (63%) create mode 100644 shared/stores/convostate.tsx rename shared/{constants/current-user/index.tsx => stores/current-user.tsx} (73%) rename shared/{constants/daemon/index.tsx => stores/daemon.tsx} (54%) rename shared/{constants/darkmode/index.tsx => stores/darkmode.tsx} (90%) rename shared/{constants/followers/index.tsx => stores/followers.tsx} (80%) rename shared/{constants/fs/index.tsx => stores/fs.tsx} (56%) create mode 100644 shared/stores/inbox-rows.tsx rename shared/{constants/logout/index.tsx => stores/logout.tsx} (66%) create mode 100644 shared/stores/modal-header.tsx rename shared/{constants/notifications/index.tsx => stores/notifications.tsx} (82%) create mode 100644 shared/stores/people.tsx rename shared/{constants/pinentry/index.tsx => stores/pinentry.tsx} (85%) rename shared/{constants/provision/index.tsx => stores/provision.tsx} (67%) rename shared/{constants => stores}/push.d.ts (75%) rename shared/{constants => stores}/push.desktop.tsx (67%) rename shared/{constants => stores}/push.native.tsx (68%) rename shared/{constants/recover-password/index.tsx => stores/recover-password.tsx} (68%) create mode 100644 shared/stores/router.tsx rename shared/{constants => stores}/settings-contacts.d.ts (89%) rename shared/{constants => stores}/settings-contacts.desktop.tsx (83%) rename shared/{constants => stores}/settings-contacts.native.tsx (84%) rename shared/{constants/settings-email/index.tsx => stores/settings-email.tsx} (53%) create mode 100644 shared/stores/settings-password.tsx create mode 100644 shared/stores/settings-phone.tsx create mode 100644 shared/stores/store-registry.tsx rename shared/{constants/team-building/index.tsx => stores/team-building.tsx} (73%) rename shared/{constants/teams/index.tsx => stores/teams.tsx} (79%) create mode 100644 shared/stores/tests/archive.test.ts create mode 100644 shared/stores/tests/autoreset.test.ts create mode 100644 shared/stores/tests/chat.test.ts create mode 100644 shared/stores/tests/config.test.ts create mode 100644 shared/stores/tests/convostate.test.ts create mode 100644 shared/stores/tests/crypto.test.ts create mode 100644 shared/stores/tests/current-user.test.ts create mode 100644 shared/stores/tests/daemon.test.ts create mode 100644 shared/stores/tests/darkmode.test.ts create mode 100644 shared/stores/tests/followers.test.ts create mode 100644 shared/stores/tests/fs.test.ts create mode 100644 shared/stores/tests/inbox-rows.test.ts create mode 100644 shared/stores/tests/logout.test.ts create mode 100644 shared/stores/tests/modal-header.test.ts create mode 100644 shared/stores/tests/notifications.test.ts create mode 100644 shared/stores/tests/people.test.ts create mode 100644 shared/stores/tests/profile.test.ts create mode 100644 shared/stores/tests/provision.test.ts create mode 100644 shared/stores/tests/push.desktop.test.ts create mode 100644 shared/stores/tests/recover-password.test.ts create mode 100644 shared/stores/tests/router.test.ts create mode 100644 shared/stores/tests/settings-contacts.desktop.test.ts create mode 100644 shared/stores/tests/settings-email.test.ts create mode 100644 shared/stores/tests/settings-password.test.ts create mode 100644 shared/stores/tests/settings-phone.test.ts create mode 100644 shared/stores/tests/settings.test.ts create mode 100644 shared/stores/tests/signup.test.ts create mode 100644 shared/stores/tests/team-building.test.ts create mode 100644 shared/stores/tests/teams.test.ts create mode 100644 shared/stores/tests/tracker.test.ts create mode 100644 shared/stores/tests/uint8array-usage.test.ts create mode 100644 shared/stores/tests/uint8array-util.test.ts create mode 100644 shared/stores/tests/unlock-folders.test.ts create mode 100644 shared/stores/tests/waiting.test.ts rename shared/{constants/tracker2/index.tsx => stores/tracker.tsx} (86%) create mode 100644 shared/stores/unlock-folders.tsx rename shared/{constants/users/index.tsx => stores/users.tsx} (59%) rename shared/{constants/waiting/index.tsx => stores/waiting.tsx} (87%) create mode 100644 shared/styles/class-names.test.ts create mode 100644 shared/styles/class-names.ts delete mode 100644 shared/team-building/modal-header-props.tsx create mode 100644 shared/teams/main/team-row.css create mode 100644 shared/test/mocks/file.js create mode 100644 shared/test/mocks/logger.js create mode 100644 shared/test/mocks/react-native.js create mode 100644 shared/test/mocks/react-navigation-core.js create mode 100644 shared/test/mocks/style.js rename shared/{tracker2 => tracker}/assertion.tsx (79%) rename shared/{tracker2 => tracker}/bio.tsx (91%) create mode 100644 shared/tracker/index.desktop.tsx rename shared/{tracker2 => tracker}/main.desktop.tsx (100%) create mode 100644 shared/tracker/main2.desktop.tsx rename shared/{tracker2 => tracker}/remote-proxy.desktop.tsx (56%) delete mode 100644 shared/tracker2/index.desktop.tsx delete mode 100644 shared/tracker2/main2.desktop.tsx delete mode 100644 shared/tracker2/remote-container.desktop.tsx delete mode 100644 shared/tracker2/remote-serializer.desktop.tsx delete mode 100644 shared/unlock-folders/remote-container.desktop.tsx delete mode 100644 shared/unlock-folders/remote-serializer.desktop.tsx delete mode 100644 shared/util/clear-logs.android.tsx delete mode 100644 shared/util/clear-logs.d.ts delete mode 100644 shared/util/clear-logs.desktop.tsx delete mode 100644 shared/util/clear-logs.ios.tsx create mode 100644 shared/util/expo-document-picker.native.tsx create mode 100644 shared/util/featured-bots.tsx delete mode 100644 shared/util/hidden-string.d.ts delete mode 100644 shared/util/hidden-string.desktop.tsx delete mode 100644 shared/util/hidden-string.native.tsx rename shared/util/{hidden-string-impl.tsx => hidden-string.tsx} (60%) create mode 100644 shared/util/misc.d.ts create mode 100644 shared/util/misc.desktop.tsx create mode 100644 shared/util/misc.native.tsx delete mode 100644 shared/util/notify-popup.d.ts delete mode 100644 shared/util/notify-popup.desktop.tsx delete mode 100644 shared/util/notify-popup.native.tsx delete mode 100644 shared/util/open-url.d.ts delete mode 100644 shared/util/open-url.desktop.tsx delete mode 100644 shared/util/open-url.native.tsx delete mode 100644 shared/util/pick-files.d.ts delete mode 100644 shared/util/pick-files.desktop.tsx delete mode 100644 shared/util/pick-files.native.tsx rename shared/{constants => util}/platform-specific/index.d.ts (87%) create mode 100644 shared/util/platform-specific/index.desktop.tsx create mode 100644 shared/util/platform-specific/index.native.tsx rename shared/{constants => util}/platform-specific/input-monitor.desktop.tsx (100%) rename shared/{constants => util}/platform-specific/kbfs-notifications.tsx (98%) create mode 100644 shared/util/qr-code.tsx create mode 100644 shared/util/shallow-equal.test.ts create mode 100644 shared/util/shallow-equal.ts delete mode 100644 shared/util/sms.d.ts delete mode 100644 shared/util/sms.desktop.tsx delete mode 100644 shared/util/sms.native.tsx create mode 100644 shared/util/uint8array.ts create mode 100644 shared/util/uuid.ts create mode 100644 shared/wallets/account-utils.test.ts create mode 100644 shared/wallets/account-utils.ts delete mode 100644 shared/whats-new/README.md delete mode 100644 shared/whats-new/container.tsx delete mode 100644 shared/whats-new/icon/icon.css delete mode 100644 shared/whats-new/icon/index.tsx delete mode 100644 shared/whats-new/icon/popup.d.ts delete mode 100644 shared/whats-new/icon/popup.desktop.tsx delete mode 100644 shared/whats-new/icon/popup.native.tsx delete mode 100644 shared/whats-new/index.tsx delete mode 100644 shared/whats-new/new-feature-row.tsx delete mode 100644 shared/whats-new/versions.tsx rename {skills => skill}/bumping-versions/SKILL.md (100%) create mode 100644 skill/electron-screenshot/SKILL.md create mode 100644 skill/ios-screenshot/SKILL.md create mode 120000 skill/migrate-to-static-config create mode 100644 skill/playwright-cli/SKILL.md create mode 100644 skill/playwright-cli/references/request-mocking.md create mode 100644 skill/playwright-cli/references/running-code.md create mode 100644 skill/playwright-cli/references/session-management.md create mode 100644 skill/playwright-cli/references/storage-state.md create mode 100644 skill/playwright-cli/references/test-generation.md create mode 100644 skill/playwright-cli/references/tracing.md create mode 100644 skill/playwright-cli/references/video-recording.md create mode 120000 skill/react-native-best-practices create mode 100644 skill/update-dependencies/SKILL.md create mode 120000 skill/upgrade-react-navigation create mode 120000 skill/vercel-react-best-practices create mode 120000 skill/vercel-react-native-skills create mode 100644 skill/visual-diff/SKILL.md create mode 100644 skill/zustand-store-pruning/SKILL.md create mode 100644 skill/zustand-store-pruning/agents/openai.yaml create mode 100644 skill/zustand-store-pruning/references/keybase-examples.md create mode 100644 skill/zustand-store-pruning/references/store-checklist.md create mode 100644 skills-lock.json diff --git a/.agents/skills/migrate-to-static-config/SKILL.md b/.agents/skills/migrate-to-static-config/SKILL.md new file mode 100644 index 000000000000..19a950fe24ae --- /dev/null +++ b/.agents/skills/migrate-to-static-config/SKILL.md @@ -0,0 +1,13 @@ +--- +name: migrate-to-static-config +description: Migrate React Navigation navigators from dynamic component based config to static object based config. +--- + +# Migrating to Static Config + +Check `@react-navigation/native` in `package.json` first. + +- If `7.x`, read `references/react-navigation-7.md` +- If `8.x`, read `references/react-navigation-8.md` + +Do not load both unless explicitly comparing versions. diff --git a/.agents/skills/migrate-to-static-config/agents/openai.yaml b/.agents/skills/migrate-to-static-config/agents/openai.yaml new file mode 100644 index 000000000000..523c537cc2d0 --- /dev/null +++ b/.agents/skills/migrate-to-static-config/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Migrate React Navigation to Static Config" + short_description: "Convert JSX navigators to static config" + default_prompt: "Use $migrate-to-static-config to migrate React Navigation navigators from dynamic JSX to static config." diff --git a/.agents/skills/migrate-to-static-config/references/react-navigation-7.md b/.agents/skills/migrate-to-static-config/references/react-navigation-7.md new file mode 100644 index 000000000000..60c90e14020d --- /dev/null +++ b/.agents/skills/migrate-to-static-config/references/react-navigation-7.md @@ -0,0 +1,809 @@ +# React Navigation 7.x Static Config Migration + +Use this file only when `@react-navigation/native` is on `7.x`. + +## Goal + +Convert React Navigation navigators from JSX-based dynamic setup to static configuration while preserving behavior, typing, and deep links. + +## When + +1. You are migrating screens to the static API in React Navigation 7.x. +2. The navigator's screen list is static and not built at runtime. +3. The navigator doesn't use dynamic variables or props that are not available in static config. + +## Prerequisites + +- The project is using React Navigation 7.x. +- The versions of `@react-navigation` packages are up-to-date with the published versions. + +## Structure + +1. Create a static navigator with `createXNavigator({ screens, groups, ... })`. +2. Each `screens` entry can be a component, a nested static navigator, or a screen config object. +3. `groups` define shared options and conditional rendering using `if`, and contain their own `screens`. +4. Screen config objects accept the same options as the dynamic `Screen` API, plus static-only additions such as `linking` and `if`. +5. When a screen needs a config object, use a plain screen config object. +6. A screen config `linking` can be a string path or an object with `path`, `parse`, `stringify`, and `exact`. + +## Workflow + +### 1. Identify static candidates + +A navigator is a static candidate if all its screens are known at build time. Look for: + +- **Convertible**: fixed `` elements, conditional rendering based on auth or feature flags (use `if` hooks), render callbacks passing extra props (use React context), navigators wrapped in providers or components using hooks for navigator-level props (use `.with()`) +- **Not convertible**: screen list built from runtime data such as mapping over an API response, screens added or removed based on values that can't be expressed as a hook returning a boolean. + +### 2. Convert navigator JSX to static config + +Convert the existing navigator first, then introduce screen config objects only where a screen needs options, listeners, params, IDs, linking, or `if`. + +Before: + +```tsx +const Stack = createNativeStackNavigator(); + +function MyStack() { + return ( + + + + + ); +} +``` + +After: + +```tsx +const MyStack = createNativeStackNavigator({ + screenOptions: { headerShown: false }, + screens: { + Home: HomeScreen, + Profile: { + screen: ProfileScreen, + options: { title: 'My Profile' }, + }, + }, +}); +``` + +Full screen config shape: + +```tsx +const MyStack = createNativeStackNavigator({ + screens: { + Example: { + screen: ScreenComponent, + options: ({ route, navigation, theme }) => ({ + title: route.name, + }), + listeners: ({ route, navigation }) => ({ + focus: () => {}, + }), + initialParams: {}, + getId: ({ params }) => params.id, + linking: { + path: 'pattern/:id', + parse: { id: Number }, + stringify: { id: (value) => String(value) }, + exact: true, + }, + if: useConditionHook, + layout: ({ children }) => children, + }, + }, +}); +``` + +Shorthand (component only, no config): `ScreenName: ScreenComponent` + +Nested static navigator: `ScreenName: AnotherStaticNavigator` + +### 3. Convert nested navigators + +Nested dynamic navigators rendered as components become nested config objects. + +Before: + +```tsx +const Tab = createBottomTabNavigator(); + +function HomeTabs() { + return ( + + + + + ); +} + +function RootStack() { + return ( + + + + ); +} +``` + +After: + +```tsx +const HomeTabs = createBottomTabNavigator({ + screens: { + Groups: GroupsScreen, + Chats: ChatsScreen, + }, +}); + +const RootStack = createNativeStackNavigator({ + screens: { + Home: HomeTabs, + }, +}); +``` + +### 4. Convert groups + +Before: + +```tsx +function RootStack() { + return ( + + + + + + + + + + ); +} +``` + +After: + +```tsx +const RootStack = createNativeStackNavigator({ + groups: { + Card: { + screenOptions: { headerStyle: { backgroundColor: 'red' } }, + screens: { + Home: HomeScreen, + Profile: ProfileScreen, + }, + }, + Modal: { + screenOptions: { presentation: 'modal' }, + screens: { + Settings: SettingsScreen, + }, + }, + }, +}); +``` + +Top-level `screens` and `screenOptions` handle the default group. + +Use `groups` when you need different shared options, conditional groups, grouped linking, or to logically group screens if the dynamic config already had such groups. + +### 5. Convert auth flows + +To migrate conditional screens from dynamic config, use static `if` hooks. The `if` property takes a user-defined hook that returns a boolean such as `useIsSignedIn` or `useIsSignedOut`. + +This prevents navigating to protected screens when signed out and unmounts auth screens after sign-in, so the back button cannot return to them. + +If you previously used `navigationKey` to reset a screen when auth state changes, duplicate the screen in both auth groups. The group name is used for the key, so switching groups resets the screen. For example, declare `Help` in both the signed-in and signed-out groups instead of using `navigationKey`. + +Loading UI should live outside the navigation tree, meaning outside `` / ``, not in a `Loading` screen or group. Keep `screens` and `groups` for actual navigable routes only. + +Use `.with()` for wrappers around a mounted navigator, not for boot or loading gates that should happen before rendering ``. + +```tsx +const App = () => { + const isLoading = useIsLoading(); + + if (isLoading) { + return ; + } + + return ; +}; +``` + +Before: + +```tsx +function App() { + const isSignedIn = useIsSignedIn(); + + return ( + + {isSignedIn ? ( + <> + + + + ) : ( + <> + + + + )} + + + ); +} +``` + +After: + +```tsx +const RootStack = createNativeStackNavigator({ + groups: { + SignedIn: { + if: useIsSignedIn, + screens: { + Home: HomeScreen, + Profile: ProfileScreen, + Help: HelpScreen, + }, + }, + SignedOut: { + if: useIsSignedOut, + screens: { + SignIn: SignInScreen, + SignUp: SignUpScreen, + Help: HelpScreen, + }, + }, + }, +}); +``` + +### 6. Use `.with()` for wrappers, providers, and dynamic navigator props + +If the dynamic navigator is rendered in a component that uses hooks for navigator-level behavior, or has wrappers around the mounted navigator, use `.with()` to provide this wrapper. This applies to navigator-level props such as `initialRouteName`, `backBehavior`, `screenOptions`, and `screenListeners` that are derived dynamically. + +#### Wrapping with a provider and dynamic options + +Before: + +```tsx +function MyStack() { + const someValue = useSomeHook(); + + return ( + + + + + + ); +} +``` + +After: + +```tsx +const MyStack = createNativeStackNavigator({ + screens: { + Home: HomeScreen, + }, +}).with(({ Navigator }) => { + const someValue = useSomeHook(); + + return ( + + + + ); +}); +``` + +#### Per-screen dynamic options via `screenOptions` callback + +If each screen has different options, use a `screenOptions` callback and switch on `route.name`. + +Before: + +```tsx +function MyStack() { + const getSomething = useSomeHook(); + + return ( + + + + + + + ); +} +``` + +After: + +```tsx +const MyStack = createNativeStackNavigator({ + screens: { + Home: HomeScreen, + Profile: ProfileScreen, + }, +}).with(({ Navigator }) => { + const getSomething = useSomeHook(); + + return ( + + { + switch (route.name) { + case 'Home': + return { + title: getSomething('First'), + }; + case 'Profile': + return { + title: getSomething('Second'), + }; + default: + return {}; + } + }} + /> + + ); +}); +``` + +#### Replacing render callbacks with context + +Static screens cannot receive extra props via render callbacks. Move the data to React context and provide it via `.with()`. + +Before: + +```tsx + + {(props) => } + +``` + +After: + +```tsx +const TokenContext = React.createContext(''); + +function ChatScreen() { + const token = React.useContext(TokenContext); + + return ; +} + +const MyStack = createNativeStackNavigator({ + screens: { + Chat: ChatScreen, + }, +}).with(({ Navigator }) => { + const token = useToken(); + + return ( + + + + ); +}); +``` + +### 7. Migrate screen-level linking + +Use screen-level `linking` to replace the old root `linking.config.screens` structure. + +Omit `linking` on a screen when the default kebab-case path is acceptable. If the path is identical to the auto path such as `Details` to `details`, remove the redundant `linking` entry. + +Add `linking` for custom paths or when you need path params with `parse` or `stringify`. + +Before: + +```tsx +const linking = { + prefixes: ['https://example.com'], + config: { + screens: { + Home: '', + Profile: { + path: 'user/:id', + parse: { id: Number }, + }, + Settings: 'settings', + }, + }, +}; +``` + +After: + +```tsx +const RootStack = createNativeStackNavigator({ + screens: { + Home: { + screen: HomeScreen, + linking: '', // explicit root path; omit if this is the first leaf screen or the initialRouteName + }, + Profile: { + screen: ProfileScreen, + linking: { + path: 'user/:id', + parse: { id: Number }, + }, + }, + Settings: SettingsScreen, + }, +}); +``` + +Linking paths are auto-generated for leaf screens using kebab-case of the screen name. The first leaf screen, or the `initialRouteName` if set, gets the path `/` unless you set an explicit empty path on another screen. + +To control auto-generated linking, pass `enabled` on the root `linking` prop: `enabled: 'auto'` generates paths for all leaf screens, and `enabled: false` disables linking entirely. + +If a screen previously had a custom path such as `linking: 'contacts'` and you remove it, the auto path becomes kebab-case of the screen name such as `TabContacts` to `tab-contacts`. This breaks existing URLs and deep links. Keep explicit `linking` when you need to preserve existing paths. + +If screens containing navigators have `linking` set to `''` or `'/'`, it is usually redundant and can be removed. + +Keep TypeScript param typing on the screen component with `StaticScreenProps`. Screen-level `linking` config is for URL parsing and serialization only. + +### 8. Update types + +#### Getting navigation and route access + +Use `StaticScreenProps` to type the screen's `route` prop. + +Use the default `useNavigation()` type provided through the global `ReactNavigation.RootParamList` augmentation for navigator-agnostic navigation calls. + +Prefer the screen `route` prop over `useRoute` when available. Use `useNavigationState` separately when you need navigation state. + +Before: + +```tsx +function ProfileScreen({ + navigation, + route, +}: NativeStackScreenProps) { + const id = route.params.id; + navigation.navigate('Home'); +} +``` + +After: + +```tsx +type ProfileScreenProps = StaticScreenProps<{ + id: string; +}>; + +function ProfileScreen({ route }: ProfileScreenProps) { + const navigation = useNavigation(); + const id = route.params.id; + + navigation.navigate('Home'); +} +``` + +Use `StaticScreenProps` to type the `route` prop. If you need navigator-specific APIs such as `push`, `pop`, `openDrawer`, or `setOptions`, you can manually annotate `useNavigation`, but this is not type-safe and should be kept to a minimum. + +If you need a navigator-specific navigation object: + +```tsx +type RootStackParamList = StaticParamList; + +type ProfileNavigationProp = NativeStackNavigationProp< + RootStackParamList, + 'Profile' +>; + +const navigation = useNavigation(); +``` + +#### Remove manual param lists + +Remove all hand-written param-list declarations created only to support dynamic typing. + +If a param list is absolutely necessary, derive it from the navigator type: + +```tsx +type SomeStackType = typeof SomeStack; +type SomeStackParamList = StaticParamList; +``` + +If a static navigator nests a dynamic navigator, annotate the dynamic navigator screen with `StaticScreenProps>` so the nesting is reflected in the root param list. + +For the root navigator, keep the single source of truth in the `RootParamList` augmentation shown below. + +Avoid circular dependencies by: + +- Using `StaticScreenProps` for screen params instead of shared hand-written param lists +- Using the default `useNavigation()` type where possible instead of navigator-specific aliases +- Deleting obsolete shared type files when they become empty + +#### Root type augmentation + +Place the global `RootParamList` augmentation next to the root static navigator. This is the single source of truth for the default types used by `useNavigation`, `Link`, refs, and related APIs. + +```tsx +const RootStack = createNativeStackNavigator({ + screens: { + // ... + }, +}); + +type RootStackParamList = StaticParamList; + +declare global { + namespace ReactNavigation { + interface RootParamList extends RootStackParamList {} + } +} +``` + +#### Typing params + +Use `StaticScreenProps` to annotate route params, including screens that use `linking`. + +A path such as `user/:userId` defines URL parsing and serialization. Keep the TypeScript param type on the screen component with `StaticScreenProps`. + +If the params are not strings, use `parse` and `stringify` in the `linking` config: + +```tsx +type ArticleScreenProps = StaticScreenProps<{ + date: Date; +}>; + +function ArticleScreen({ route }: ArticleScreenProps) { + return
; +} + +const RootStack = createNativeStackNavigator({ + screens: { + Article: { + screen: ArticleScreen, + linking: { + path: 'article/:date', + parse: { + date: (date: string) => new Date(date), + }, + stringify: { + date: (date: Date) => date.toISOString(), + }, + }, + }, + }, +}); +``` + +The runtime parsing comes from `linking`. The compile-time param type comes from `StaticScreenProps`. + +Avoid `any`, non-null assertions, and `as` assertions. + +#### Full before/after example + +Before: + +```tsx +type MyStackParamList = { + Article: { author: string }; + Albums: undefined; +}; + +const Stack = createNativeStackNavigator(); + +function ArticleScreen({ + navigation, + route, +}: NativeStackScreenProps) { + return