From 6fb4ccc79a0f21fe8fd086f61132263ff5435f70 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 16 Apr 2026 18:12:14 -0500 Subject: [PATCH] chore(license): add SPDX license identifiers to various files, standardizing licensing terms across the project --- .../app/src/main/python/meshchat_wrapper.py | 2 + cx_setup.py | 2 + meshchatx/__init__.py | 2 + meshchatx/meshchat.py | 77 +++++++++++++------ meshchatx/src/__init__.py | 2 + meshchatx/src/backend/__init__.py | 2 + meshchatx/src/backend/announce_handler.py | 2 + meshchatx/src/backend/announce_manager.py | 2 + meshchatx/src/backend/archiver_manager.py | 2 + meshchatx/src/backend/async_utils.py | 2 + .../src/backend/auto_propagation_manager.py | 2 + meshchatx/src/backend/bot_handler.py | 2 + meshchatx/src/backend/bot_process.py | 2 + meshchatx/src/backend/bot_templates.py | 2 + meshchatx/src/backend/colour_utils.py | 3 + meshchatx/src/backend/community_interfaces.py | 2 + .../backend/community_interfaces_directory.py | 2 + meshchatx/src/backend/config_manager.py | 3 + meshchatx/src/backend/database/__init__.py | 2 + .../src/backend/database/access_attempts.py | 2 + meshchatx/src/backend/database/announces.py | 2 + meshchatx/src/backend/database/config.py | 2 + meshchatx/src/backend/database/contacts.py | 2 + .../src/backend/database/crash_history.py | 2 + meshchatx/src/backend/database/debug_logs.py | 2 + .../src/backend/database/legacy_migrator.py | 2 + .../src/backend/database/map_drawings.py | 2 + meshchatx/src/backend/database/messages.py | 2 + meshchatx/src/backend/database/misc.py | 2 + meshchatx/src/backend/database/provider.py | 2 + meshchatx/src/backend/database/ringtones.py | 2 + meshchatx/src/backend/database/schema.py | 2 + meshchatx/src/backend/database/stickers.py | 2 + meshchatx/src/backend/database/telemetry.py | 2 + meshchatx/src/backend/database/telephone.py | 2 + meshchatx/src/backend/database/voicemails.py | 2 + meshchatx/src/backend/docs_manager.py | 2 + meshchatx/src/backend/forwarding_manager.py | 2 + meshchatx/src/backend/identity_context.py | 2 + meshchatx/src/backend/identity_manager.py | 2 + meshchatx/src/backend/integrity_manager.py | 2 + .../src/backend/interface_config_parser.py | 2 + meshchatx/src/backend/interface_editor.py | 3 + .../interfaces/WebsocketClientInterface.py | 2 + .../interfaces/WebsocketServerInterface.py | 2 + meshchatx/src/backend/interfaces/__init__.py | 2 + meshchatx/src/backend/licenses_collector.py | 2 + meshchatx/src/backend/lxmf_message_fields.py | 2 + meshchatx/src/backend/lxmf_utils.py | 2 + meshchatx/src/backend/map_manager.py | 2 + meshchatx/src/backend/markdown_renderer.py | 2 + meshchatx/src/backend/meshchat_utils.py | 2 + meshchatx/src/backend/message_handler.py | 2 + meshchatx/src/backend/nomadnet_downloader.py | 2 + meshchatx/src/backend/nomadnet_utils.py | 3 + meshchatx/src/backend/page_node.py | 2 + meshchatx/src/backend/page_node_manager.py | 2 + .../src/backend/persistent_log_handler.py | 2 + meshchatx/src/backend/recovery/__init__.py | 2 + .../src/backend/recovery/crash_recovery.py | 2 + .../src/backend/recovery/health_monitor.py | 2 + meshchatx/src/backend/ringtone_manager.py | 2 + meshchatx/src/backend/rncp_handler.py | 2 + meshchatx/src/backend/rnpath_handler.py | 2 + meshchatx/src/backend/rnpath_trace_handler.py | 2 + meshchatx/src/backend/rnprobe_handler.py | 2 + meshchatx/src/backend/rnstatus_handler.py | 2 + meshchatx/src/backend/sideband_commands.py | 2 + meshchatx/src/backend/sticker_utils.py | 2 + meshchatx/src/backend/telemetry_utils.py | 2 + meshchatx/src/backend/telephone_manager.py | 2 + meshchatx/src/backend/translator_handler.py | 2 + meshchatx/src/backend/voicemail_manager.py | 2 + meshchatx/src/backend/web_audio_bridge.py | 2 + meshchatx/src/env_utils.py | 2 + meshchatx/src/frontend/components/App.vue | 2 + .../src/frontend/components/CardStack.vue | 2 + .../frontend/components/ChangelogModal.vue | 2 + .../components/ColourPickerDropdown.vue | 2 + .../frontend/components/CommandPalette.vue | 2 + .../src/frontend/components/ConfirmDialog.vue | 2 + .../src/frontend/components/DropDownMenu.vue | 2 + .../frontend/components/DropDownMenuItem.vue | 2 + .../src/frontend/components/IconButton.vue | 2 + .../components/IntegrityWarningModal.vue | 2 + .../frontend/components/LanguageSelector.vue | 2 + .../src/frontend/components/LxmfUserIcon.vue | 2 + .../components/MaterialDesignIcon.vue | 2 + .../frontend/components/NotificationBell.vue | 2 + .../src/frontend/components/SidebarLink.vue | 2 + meshchatx/src/frontend/components/Toast.vue | 2 + .../src/frontend/components/TutorialModal.vue | 2 + .../frontend/components/about/AboutPage.vue | 2 + .../components/archives/ArchiveSidebar.vue | 2 + .../components/archives/ArchivesPage.vue | 2 + .../src/frontend/components/auth/AuthPage.vue | 2 + .../components/blocked/BlockedPage.vue | 2 + .../frontend/components/call/CallOverlay.vue | 2 + .../src/frontend/components/call/CallPage.vue | 2 + .../components/call/RingtoneEditor.vue | 2 + .../components/call/RingtoneEditorModal.vue | 2 + .../components/contacts/ContactsPage.vue | 2 + .../contextmenu/ContextMenuDivider.vue | 2 + .../contextmenu/ContextMenuItem.vue | 2 + .../contextmenu/ContextMenuPanel.vue | 2 + .../contextmenu/ContextMenuSectionLabel.vue | 2 + .../components/debug/DebugLogsPage.vue | 2 + .../src/frontend/components/docs/DocsPage.vue | 2 + .../frontend/components/forms/FormLabel.vue | 2 + .../components/forms/FormSubLabel.vue | 2 + .../src/frontend/components/forms/Toggle.vue | 2 + .../components/forwarder/ForwarderPage.vue | 2 + .../interfaces/AddInterfacePage.vue | 2 + .../interfaces/ExpandingSection.vue | 2 + .../interfaces/ImportInterfacesModal.vue | 2 + .../components/interfaces/Interface.vue | 2 + .../components/interfaces/InterfacesPage.vue | 2 + .../components/layout/AppShellBanners.vue | 2 + .../components/licenses/LicensesPage.vue | 2 + .../src/frontend/components/map/MapPage.vue | 2 + .../src/frontend/components/map/MiniChat.vue | 2 + .../components/messages/AddAudioButton.vue | 2 + .../components/messages/AddImageButton.vue | 2 + .../messages/AudioWaveformPlayer.vue | 2 + .../messages/ConversationDropDownMenu.vue | 2 + .../messages/ConversationMessageEntry.vue | 2 + .../ConversationMessageListVirtual.vue | 2 + .../messages/ConversationPeerHeader.vue | 2 + .../messages/ConversationViewer.vue | 2 + .../components/messages/MessagesPage.vue | 2 + .../components/messages/MessagesSidebar.vue | 2 + .../components/messages/PaperMessageModal.vue | 2 + .../components/messages/SendMessageButton.vue | 2 + .../micron-editor/MicronEditorPage.vue | 2 + .../network-visualiser/NetworkVisualiser.vue | 2 + .../NetworkVisualiserPage.vue | 2 + .../internal/NetworkVisualiserLegend.vue | 2 + .../NetworkVisualiserLoadingOverlay.vue | 2 + .../internal/NetworkVisualiserToolbar.vue | 2 + .../nomadnetwork/NomadNetworkPage.vue | 2 + .../nomadnetwork/NomadNetworkSidebar.vue | 2 + .../components/page-nodes/PageNodesPage.vue | 2 + .../src/frontend/components/ping/PingPage.vue | 2 + .../components/profile/ProfileIconPage.vue | 2 + .../PropagationNodesPage.vue | 2 + .../src/frontend/components/rncp/RNCPPage.vue | 2 + .../components/rnprobe/RNProbePage.vue | 2 + .../components/rnstatus/RNStatusPage.vue | 2 + .../components/settings/IdentitiesPage.vue | 2 + .../components/settings/SettingsPage.vue | 2 + .../settings/SettingsSectionBlock.vue | 2 + .../components/settings/ShortcutRecorder.vue | 2 + .../frontend/components/tools/BotsPage.vue | 2 + .../components/tools/PaperMessagePage.vue | 2 + .../frontend/components/tools/RNPathPage.vue | 2 + .../components/tools/RNPathTracePage.vue | 2 + .../components/tools/RNodeFlasherPage.vue | 2 + .../frontend/components/tools/ToolsPage.vue | 2 + .../components/translator/TranslatorPage.vue | 2 + meshchatx/src/path_utils.py | 2 + meshchatx/src/ssl_self_signed.py | 2 + meshchatx/src/version.py | 2 + scripts/build_community_interfaces_json.py | 2 + scripts/ci/slsa-predicate.py | 2 + scripts/generate_locale_template.py | 2 + scripts/move_wheels.py | 2 + tests/__init__.py | 2 + tests/backend/__init__.py | 2 + tests/backend/api_json_contract_schemas.py | 2 + tests/backend/benchmark_db_lite.py | 2 + tests/backend/benchmarking_utils.py | 2 + tests/backend/conftest.py | 2 + tests/backend/http_api_contract_helpers.py | 2 + tests/backend/map_benchmarks.py | 2 + tests/backend/memory_benchmarks.py | 2 + tests/backend/run_comprehensive_benchmarks.py | 2 + tests/backend/test_access_attempts_dao.py | 2 + .../test_access_attempts_enforcement.py | 2 + tests/backend/test_announce_dao_extended.py | 2 + tests/backend/test_announce_dao_trim.py | 2 + tests/backend/test_announce_flood_load.py | 2 + tests/backend/test_announce_fuzzing.py | 2 + tests/backend/test_announce_limits.py | 2 + .../backend/test_announce_manager_extended.py | 2 + tests/backend/test_api_json_contracts.py | 2 + tests/backend/test_app_endpoints.py | 2 + tests/backend/test_app_status_tracking.py | 2 + .../backend/test_archiver_manager_extended.py | 2 + tests/backend/test_auto_announce_schedule.py | 2 + tests/backend/test_auto_propagation.py | 2 + tests/backend/test_auto_propagation_api.py | 2 + tests/backend/test_backend_integrity.py | 2 + tests/backend/test_blackhole_logic.py | 2 + tests/backend/test_bot_handler_extended.py | 2 + tests/backend/test_colour_utils.py | 2 + tests/backend/test_community_interfaces.py | 2 + .../test_community_interfaces_directory.py | 2 + tests/backend/test_concurrency_stress.py | 2 + tests/backend/test_config_manager.py | 2 + tests/backend/test_contacts_custom_image.py | 2 + tests/backend/test_contacts_dao_boost.py | 2 + .../test_contacts_display_name_semantics.py | 2 + tests/backend/test_contacts_export_import.py | 2 + tests/backend/test_crash_history.py | 2 + tests/backend/test_crash_recovery.py | 2 + tests/backend/test_csp_logic.py | 2 + tests/backend/test_dao_fuzzing.py | 2 + tests/backend/test_database.py | 2 + tests/backend/test_database_evolution.py | 2 + tests/backend/test_database_provider_boost.py | 2 + tests/backend/test_database_robustness.py | 2 + tests/backend/test_database_snapshots.py | 2 + tests/backend/test_debug_logs.py | 2 + .../test_display_name_and_telemetry.py | 2 + tests/backend/test_display_name_fuzzing.py | 2 + tests/backend/test_docs_manager.py | 2 + tests/backend/test_emergency_mode.py | 2 + .../test_forwarding_manager_teardown.py | 2 + tests/backend/test_fuzzing.py | 2 + tests/backend/test_fuzzing_extended.py | 2 + tests/backend/test_fuzzing_telemetry.py | 2 + tests/backend/test_health_monitor.py | 2 + tests/backend/test_hex_identifier_utils.py | 2 + tests/backend/test_http_api_contract.py | 2 + tests/backend/test_http_auth_security.py | 2 + tests/backend/test_https_wss_side_sniffing.py | 2 + tests/backend/test_identity_restore.py | 2 + tests/backend/test_identity_switch.py | 2 + tests/backend/test_incoming_call_policy.py | 2 + tests/backend/test_integrity.py | 2 + tests/backend/test_integrity_extensive.py | 2 + tests/backend/test_interface_config_parser.py | 2 + tests/backend/test_interface_discovery.py | 2 + tests/backend/test_interface_editor.py | 2 + .../test_legacy_migration_sql_safety.py | 2 + tests/backend/test_licenses_api.py | 2 + tests/backend/test_licenses_collector.py | 2 + tests/backend/test_lifecycle.py | 2 + tests/backend/test_lxmf_attachments.py | 2 + tests/backend/test_lxmf_communication.py | 2 + tests/backend/test_lxmf_icons.py | 2 + tests/backend/test_lxmf_message_fields.py | 2 + tests/backend/test_lxmf_propagation_full.py | 2 + tests/backend/test_lxmf_reactions.py | 2 + tests/backend/test_lxmf_sync.py | 2 + tests/backend/test_lxmf_utils_boost.py | 2 + tests/backend/test_lxmf_utils_extended.py | 2 + tests/backend/test_lxst_integration.py | 2 + .../test_lxst_telephony_profiles_contract.py | 2 + tests/backend/test_maintenance.py | 2 + tests/backend/test_map_manager_extended.py | 2 + tests/backend/test_markdown_renderer.py | 2 + tests/backend/test_memory_profiling.py | 2 + .../test_mesh_page_file_path_security.py | 2 + tests/backend/test_meshchat_coverage.py | 2 + tests/backend/test_meshchat_utils.py | 2 + tests/backend/test_message_dao_extended.py | 2 + tests/backend/test_message_handler.py | 2 + .../backend/test_message_handler_extended.py | 2 + tests/backend/test_misc_dao_extended.py | 2 + tests/backend/test_nomadnet_downloader.py | 2 + .../backend/test_nomadnet_downloader_boost.py | 2 + .../test_notification_unread_semantics.py | 2 + tests/backend/test_notifications.py | 2 + .../test_package_version_resolution.py | 2 + tests/backend/test_page_node.py | 2 + tests/backend/test_page_node_manager.py | 2 + tests/backend/test_performance_bottlenecks.py | 2 + tests/backend/test_performance_hotpaths.py | 2 + .../test_propagation_nodes_robustness.py | 2 + tests/backend/test_property_based.py | 2 + tests/backend/test_reply_detection.py | 2 + tests/backend/test_reticulum_live_network.py | 2 + tests/backend/test_risky_inputs.py | 2 + tests/backend/test_rncp_handler_extended.py | 2 + tests/backend/test_rnpath_logic.py | 2 + tests/backend/test_rns_config_management.py | 22 ++++++ tests/backend/test_rns_lifecycle.py | 52 +++++++++++++ tests/backend/test_rnstatus_blackhole.py | 2 + tests/backend/test_rnstatus_formatting.py | 2 + .../backend/test_schema_migration_upgrade.py | 2 + tests/backend/test_search_integration.py | 2 + tests/backend/test_security_fuzzing.py | 2 + .../backend/test_security_path_and_backup.py | 2 + tests/backend/test_smoke_extended.py | 2 + tests/backend/test_ssl_custom_args.py | 2 + tests/backend/test_startup.py | 2 + tests/backend/test_startup_advanced.py | 2 + tests/backend/test_sticker_utils.py | 2 + tests/backend/test_stickers_dao.py | 2 + tests/backend/test_telemetry_dao_extended.py | 2 + tests/backend/test_telemetry_extended.py | 2 + tests/backend/test_telemetry_integration.py | 2 + tests/backend/test_telemetry_utils.py | 2 + .../test_telephone_api_json_contracts.py | 2 + tests/backend/test_telephone_audio_ws.py | 2 + tests/backend/test_telephone_dao.py | 2 + tests/backend/test_telephone_initiation.py | 2 + tests/backend/test_telephone_manager_boost.py | 2 + tests/backend/test_telephone_recorder.py | 2 + tests/backend/test_translator_handler.py | 2 + .../test_translator_handler_extended.py | 2 + tests/backend/test_voicemail_manager_boost.py | 2 + .../test_voicemail_manager_extended.py | 2 + tests/backend/test_web_audio_bridge.py | 2 + tests/backend/test_websocket_interfaces.py | 2 + tests/backend/test_websocket_scale.py | 2 + 307 files changed, 739 insertions(+), 24 deletions(-) diff --git a/android/app/src/main/python/meshchat_wrapper.py b/android/app/src/main/python/meshchat_wrapper.py index 081c3c7..2aa589a 100644 --- a/android/app/src/main/python/meshchat_wrapper.py +++ b/android/app/src/main/python/meshchat_wrapper.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import os import signal import sys diff --git a/cx_setup.py b/cx_setup.py index ad59ac3..694209f 100644 --- a/cx_setup.py +++ b/cx_setup.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import os import sys from pathlib import Path diff --git a/meshchatx/__init__.py b/meshchatx/__init__.py index 9cfe3a5..d3a3134 100644 --- a/meshchatx/__init__.py +++ b/meshchatx/__init__.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Reticulum MeshChatX - A mesh network communications app.""" __version__ = "4.5.0" diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py index 7713bbd..9763164 100644 --- a/meshchatx/meshchat.py +++ b/meshchatx/meshchat.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# SPDX-License-Identifier: 0BSD AND MIT import argparse import asyncio @@ -226,7 +227,9 @@ class ReticulumMeshChat: rns_loglevel: str | None = None, ): self.running = True - self.reticulum_config_dir = reticulum_config_dir + self.reticulum_config_dir = self._normalize_reticulum_config_dir( + reticulum_config_dir, + ) self.storage_dir = storage_dir or os.path.join("storage") self.ssl_cert_path = ssl_cert_path self.ssl_key_path = ssl_key_path @@ -525,6 +528,30 @@ class ReticulumMeshChat: return os.path.join(self.public_dir_override, filename) return get_file_path(os.path.join("public", filename)) + @staticmethod + def _normalize_reticulum_config_dir(config_candidate: str | None) -> str: + """Normalize Reticulum config candidate to a config directory path.""" + candidate = config_candidate + if not candidate: + candidate = ( + getattr(RNS.Reticulum, "configdir", None) + or os.path.dirname(getattr(RNS.Reticulum, "configpath", "") or "") + or os.path.expanduser("~/.reticulum") + ) + + candidate = os.path.expanduser(str(candidate)) + # Reticulum's config file is plaintext named "config" (no extension). + # If a file path is provided, convert it to its parent directory. + if os.path.basename(candidate) == "config" and not os.path.isdir(candidate): + return os.path.dirname(candidate) or os.path.expanduser("~/.reticulum") + return candidate + + def _reticulum_config_file_path(self) -> str: + return os.path.join( + self._normalize_reticulum_config_dir(self.reticulum_config_dir), + "config", + ) + def backup_database(self, backup_path=None): if not self.database: raise RuntimeError("Database not initialized") @@ -540,12 +567,9 @@ class ReticulumMeshChat: If the config is missing or invalid, create a sane default. """ - config_dir = ( - self.reticulum_config_dir - or RNS.Reticulum.configpath - or os.path.expanduser("~/.reticulum") - ) - config_file = os.path.join(config_dir, "config") + config_dir = self._normalize_reticulum_config_dir(self.reticulum_config_dir) + self.reticulum_config_dir = config_dir + config_file = self._reticulum_config_file_path() should_recreate = False @@ -1060,13 +1084,9 @@ class ReticulumMeshChat: # Also check the config file for ports try: - config_dir = getattr(self, "reticulum_config_dir", None) - if not config_dir: - if hasattr(RNS.Reticulum, "configdir") and RNS.Reticulum.configdir: - config_dir = RNS.Reticulum.configdir - else: - config_dir = os.path.expanduser("~/.reticulum") - + config_dir = self._normalize_reticulum_config_dir( + getattr(self, "reticulum_config_dir", None), + ) config_path = os.path.join(config_dir, "config") if os.path.isfile(config_path): cp = configparser.ConfigParser() @@ -1101,8 +1121,6 @@ class ReticulumMeshChat: # Defaults rpc_addrs.append((("127.0.0.1", 37429), "AF_INET")) rpc_addrs.append((("127.0.0.1", 37428), "AF_INET")) - if platform.system() == "Linux": - rpc_addrs.append(("\0rns/default/rpc", "AF_UNIX")) for i in range(15): all_free = True @@ -1134,6 +1152,19 @@ class ReticulumMeshChat: f"RPC addr {addr_display} still in use... (attempt {i + 1}/15)", ) s.close() + is_abstract_unix_addr = ( + family == socket.AF_UNIX + and isinstance(addr, str) + and addr.startswith("\0") + ) + if is_abstract_unix_addr: + # Another local shared-instance daemon may own this address. + # Do not block reload on abstract UNIX sockets. + print( + f"Abstract RPC addr {addr_display} is occupied by another process; continuing reload.", + ) + continue + all_free = False # If we are stuck, try to force close the connection manually @@ -1528,7 +1559,9 @@ class ReticulumMeshChat: p = getattr(r, "configpath", None) if p: return str(p) - rd = getattr(self, "reticulum_config_dir", None) + rd = self._normalize_reticulum_config_dir( + getattr(self, "reticulum_config_dir", None), + ) if rd: return os.path.join(rd, "config") return None @@ -4461,13 +4494,9 @@ class ReticulumMeshChat: # Fallback to reading config if not found via connections if not shared_instance_address: try: - config_dir = getattr(self, "reticulum_config_dir", None) - if not config_dir: - config_dir = getattr( - RNS.Reticulum, - "configdir", - os.path.expanduser("~/.reticulum"), - ) + config_dir = self._normalize_reticulum_config_dir( + getattr(self, "reticulum_config_dir", None), + ) config_path = os.path.join(config_dir, "config") if os.path.isfile(config_path): diff --git a/meshchatx/src/__init__.py b/meshchatx/src/__init__.py index ca25e9c..2ee29f9 100644 --- a/meshchatx/src/__init__.py +++ b/meshchatx/src/__init__.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + import sys # NOTE: this class is required to be able to use print/log commands and have them flush to stdout and stderr immediately diff --git a/meshchatx/src/backend/__init__.py b/meshchatx/src/backend/__init__.py index a844222..1698256 100644 --- a/meshchatx/src/backend/__init__.py +++ b/meshchatx/src/backend/__init__.py @@ -1 +1,3 @@ +# SPDX-License-Identifier: 0BSD + """Backend utilities shared by the Reticulum MeshChatX CLI.""" diff --git a/meshchatx/src/backend/announce_handler.py b/meshchatx/src/backend/announce_handler.py index 0f2d468..4d312cb 100644 --- a/meshchatx/src/backend/announce_handler.py +++ b/meshchatx/src/backend/announce_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD AND MIT + # an announce handler that forwards announces to a provided callback for the provided aspect filter # this handler exists so we can have access to the original aspect, as this is not provided in the announce itself class AnnounceHandler: diff --git a/meshchatx/src/backend/announce_manager.py b/meshchatx/src/backend/announce_manager.py index a8c6a2f..5bbe252 100644 --- a/meshchatx/src/backend/announce_manager.py +++ b/meshchatx/src/backend/announce_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 from .database import Database diff --git a/meshchatx/src/backend/archiver_manager.py b/meshchatx/src/backend/archiver_manager.py index b91ba57..6ba4894 100644 --- a/meshchatx/src/backend/archiver_manager.py +++ b/meshchatx/src/backend/archiver_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import hashlib from .database import Database diff --git a/meshchatx/src/backend/async_utils.py b/meshchatx/src/backend/async_utils.py index 686028e..e19cccf 100644 --- a/meshchatx/src/backend/async_utils.py +++ b/meshchatx/src/backend/async_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD AND MIT + import asyncio import sys import threading diff --git a/meshchatx/src/backend/auto_propagation_manager.py b/meshchatx/src/backend/auto_propagation_manager.py index 5ee3b78..df53ef6 100644 --- a/meshchatx/src/backend/auto_propagation_manager.py +++ b/meshchatx/src/backend/auto_propagation_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import time diff --git a/meshchatx/src/backend/bot_handler.py b/meshchatx/src/backend/bot_handler.py index 610e886..4d49222 100644 --- a/meshchatx/src/backend/bot_handler.py +++ b/meshchatx/src/backend/bot_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import contextlib import json import logging diff --git a/meshchatx/src/backend/bot_process.py b/meshchatx/src/backend/bot_process.py index c5f53a7..0b71478 100644 --- a/meshchatx/src/backend/bot_process.py +++ b/meshchatx/src/backend/bot_process.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import argparse import contextlib import os diff --git a/meshchatx/src/backend/bot_templates.py b/meshchatx/src/backend/bot_templates.py index b7afba7..c9268c3 100644 --- a/meshchatx/src/backend/bot_templates.py +++ b/meshchatx/src/backend/bot_templates.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import re import time from datetime import datetime, timedelta diff --git a/meshchatx/src/backend/colour_utils.py b/meshchatx/src/backend/colour_utils.py index f1ae02d..5d49401 100644 --- a/meshchatx/src/backend/colour_utils.py +++ b/meshchatx/src/backend/colour_utils.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: 0BSD AND MIT + + class ColourUtils: @staticmethod def hex_colour_to_byte_array(hex_colour): diff --git a/meshchatx/src/backend/community_interfaces.py b/meshchatx/src/backend/community_interfaces.py index 69e8301..5069268 100644 --- a/meshchatx/src/backend/community_interfaces.py +++ b/meshchatx/src/backend/community_interfaces.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import json from pathlib import Path from typing import Any diff --git a/meshchatx/src/backend/community_interfaces_directory.py b/meshchatx/src/backend/community_interfaces_directory.py index 6ac23e5..2ed4fcc 100644 --- a/meshchatx/src/backend/community_interfaces_directory.py +++ b/meshchatx/src/backend/community_interfaces_directory.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Convert directory.rns.recipes listing rows into MeshChat interface preset dicts.""" from __future__ import annotations diff --git a/meshchatx/src/backend/config_manager.py b/meshchatx/src/backend/config_manager.py index 4464bc4..2751881 100644 --- a/meshchatx/src/backend/config_manager.py +++ b/meshchatx/src/backend/config_manager.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: 0BSD + + class ConfigManager: def __init__(self, db): self.db = db diff --git a/meshchatx/src/backend/database/__init__.py b/meshchatx/src/backend/database/__init__.py index ea88330..627d06a 100644 --- a/meshchatx/src/backend/database/__init__.py +++ b/meshchatx/src/backend/database/__init__.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import json import logging import os diff --git a/meshchatx/src/backend/database/access_attempts.py b/meshchatx/src/backend/database/access_attempts.py index 14b6418..4db9092 100644 --- a/meshchatx/src/backend/database/access_attempts.py +++ b/meshchatx/src/backend/database/access_attempts.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from __future__ import annotations import hashlib diff --git a/meshchatx/src/backend/database/announces.py b/meshchatx/src/backend/database/announces.py index e896d90..16f545a 100644 --- a/meshchatx/src/backend/database/announces.py +++ b/meshchatx/src/backend/database/announces.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/config.py b/meshchatx/src/backend/database/config.py index 3180fe8..5ea36dc 100644 --- a/meshchatx/src/backend/database/config.py +++ b/meshchatx/src/backend/database/config.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/contacts.py b/meshchatx/src/backend/database/contacts.py index c50b14c..db7cd0c 100644 --- a/meshchatx/src/backend/database/contacts.py +++ b/meshchatx/src/backend/database/contacts.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/crash_history.py b/meshchatx/src/backend/database/crash_history.py index 1bd5b66..703130d 100644 --- a/meshchatx/src/backend/database/crash_history.py +++ b/meshchatx/src/backend/database/crash_history.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import json from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/debug_logs.py b/meshchatx/src/backend/database/debug_logs.py index 9ee243a..39c3792 100644 --- a/meshchatx/src/backend/database/debug_logs.py +++ b/meshchatx/src/backend/database/debug_logs.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/legacy_migrator.py b/meshchatx/src/backend/database/legacy_migrator.py index 4eed978..bec7f72 100644 --- a/meshchatx/src/backend/database/legacy_migrator.py +++ b/meshchatx/src/backend/database/legacy_migrator.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import os import re diff --git a/meshchatx/src/backend/database/map_drawings.py b/meshchatx/src/backend/database/map_drawings.py index f195978..d3593b2 100644 --- a/meshchatx/src/backend/database/map_drawings.py +++ b/meshchatx/src/backend/database/map_drawings.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/messages.py b/meshchatx/src/backend/database/messages.py index 00d2689..5445f18 100644 --- a/meshchatx/src/backend/database/messages.py +++ b/meshchatx/src/backend/database/messages.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import json from datetime import UTC, datetime diff --git a/meshchatx/src/backend/database/misc.py b/meshchatx/src/backend/database/misc.py index 0b27b95..84a007e 100644 --- a/meshchatx/src/backend/database/misc.py +++ b/meshchatx/src/backend/database/misc.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/provider.py b/meshchatx/src/backend/database/provider.py index d46f4bc..b4b5069 100644 --- a/meshchatx/src/backend/database/provider.py +++ b/meshchatx/src/backend/database/provider.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import sqlite3 import threading import weakref diff --git a/meshchatx/src/backend/database/ringtones.py b/meshchatx/src/backend/database/ringtones.py index d65867b..aa540ae 100644 --- a/meshchatx/src/backend/database/ringtones.py +++ b/meshchatx/src/backend/database/ringtones.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from datetime import UTC, datetime from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/schema.py b/meshchatx/src/backend/database/schema.py index cbf4366..f3f959c 100644 --- a/meshchatx/src/backend/database/schema.py +++ b/meshchatx/src/backend/database/schema.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import re from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/stickers.py b/meshchatx/src/backend/database/stickers.py index ba31920..83e1c35 100644 --- a/meshchatx/src/backend/database/stickers.py +++ b/meshchatx/src/backend/database/stickers.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 import sqlite3 import time diff --git a/meshchatx/src/backend/database/telemetry.py b/meshchatx/src/backend/database/telemetry.py index c96fb87..dc7d23d 100644 --- a/meshchatx/src/backend/database/telemetry.py +++ b/meshchatx/src/backend/database/telemetry.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import json from datetime import UTC, datetime diff --git a/meshchatx/src/backend/database/telephone.py b/meshchatx/src/backend/database/telephone.py index b28f2cc..a45f568 100644 --- a/meshchatx/src/backend/database/telephone.py +++ b/meshchatx/src/backend/database/telephone.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/database/voicemails.py b/meshchatx/src/backend/database/voicemails.py index 3b39c5c..c062aa3 100644 --- a/meshchatx/src/backend/database/voicemails.py +++ b/meshchatx/src/backend/database/voicemails.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from .provider import DatabaseProvider diff --git a/meshchatx/src/backend/docs_manager.py b/meshchatx/src/backend/docs_manager.py index f2882c9..9b59acd 100644 --- a/meshchatx/src/backend/docs_manager.py +++ b/meshchatx/src/backend/docs_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import html import io diff --git a/meshchatx/src/backend/forwarding_manager.py b/meshchatx/src/backend/forwarding_manager.py index 93156b5..0577363 100644 --- a/meshchatx/src/backend/forwarding_manager.py +++ b/meshchatx/src/backend/forwarding_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 import contextlib import os diff --git a/meshchatx/src/backend/identity_context.py b/meshchatx/src/backend/identity_context.py index 3183d21..2de095c 100644 --- a/meshchatx/src/backend/identity_context.py +++ b/meshchatx/src/backend/identity_context.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import contextlib import os diff --git a/meshchatx/src/backend/identity_manager.py b/meshchatx/src/backend/identity_manager.py index bb0213e..816807e 100644 --- a/meshchatx/src/backend/identity_manager.py +++ b/meshchatx/src/backend/identity_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 import contextlib import json diff --git a/meshchatx/src/backend/integrity_manager.py b/meshchatx/src/backend/integrity_manager.py index 819636c..f524acc 100644 --- a/meshchatx/src/backend/integrity_manager.py +++ b/meshchatx/src/backend/integrity_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import fnmatch import hashlib import json diff --git a/meshchatx/src/backend/interface_config_parser.py b/meshchatx/src/backend/interface_config_parser.py index 24b8bf0..e66cb59 100644 --- a/meshchatx/src/backend/interface_config_parser.py +++ b/meshchatx/src/backend/interface_config_parser.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD AND MIT + import RNS.vendor.configobj diff --git a/meshchatx/src/backend/interface_editor.py b/meshchatx/src/backend/interface_editor.py index 65763c6..a6f59eb 100644 --- a/meshchatx/src/backend/interface_editor.py +++ b/meshchatx/src/backend/interface_editor.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: 0BSD AND MIT + + class InterfaceEditor: @staticmethod def update_value(interface_details: dict, data: dict, key: str): diff --git a/meshchatx/src/backend/interfaces/WebsocketClientInterface.py b/meshchatx/src/backend/interfaces/WebsocketClientInterface.py index 95a5210..14c36f1 100644 --- a/meshchatx/src/backend/interfaces/WebsocketClientInterface.py +++ b/meshchatx/src/backend/interfaces/WebsocketClientInterface.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD AND MIT + import threading import time diff --git a/meshchatx/src/backend/interfaces/WebsocketServerInterface.py b/meshchatx/src/backend/interfaces/WebsocketServerInterface.py index 40b3f04..2b7a548 100644 --- a/meshchatx/src/backend/interfaces/WebsocketServerInterface.py +++ b/meshchatx/src/backend/interfaces/WebsocketServerInterface.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD AND MIT + import threading import time diff --git a/meshchatx/src/backend/interfaces/__init__.py b/meshchatx/src/backend/interfaces/__init__.py index 8b8d1dd..a2ccb49 100644 --- a/meshchatx/src/backend/interfaces/__init__.py +++ b/meshchatx/src/backend/interfaces/__init__.py @@ -1 +1,3 @@ +# SPDX-License-Identifier: 0BSD + """Shared transport interfaces for MeshChatX.""" diff --git a/meshchatx/src/backend/licenses_collector.py b/meshchatx/src/backend/licenses_collector.py index e084fc3..0c92fc6 100644 --- a/meshchatx/src/backend/licenses_collector.py +++ b/meshchatx/src/backend/licenses_collector.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Collect third-party license metadata for Python (backend) and Node (frontend).""" from __future__ import annotations diff --git a/meshchatx/src/backend/lxmf_message_fields.py b/meshchatx/src/backend/lxmf_message_fields.py index 0d34b93..7a5f485 100644 --- a/meshchatx/src/backend/lxmf_message_fields.py +++ b/meshchatx/src/backend/lxmf_message_fields.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # helper class for passing around an lxmf audio field class LxmfAudioField: def __init__(self, audio_mode: int, audio_bytes: bytes): diff --git a/meshchatx/src/backend/lxmf_utils.py b/meshchatx/src/backend/lxmf_utils.py index 7c3d046..a1154bc 100644 --- a/meshchatx/src/backend/lxmf_utils.py +++ b/meshchatx/src/backend/lxmf_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 import json diff --git a/meshchatx/src/backend/map_manager.py b/meshchatx/src/backend/map_manager.py index 5befd34..65dfd81 100644 --- a/meshchatx/src/backend/map_manager.py +++ b/meshchatx/src/backend/map_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import base64 import math diff --git a/meshchatx/src/backend/markdown_renderer.py b/meshchatx/src/backend/markdown_renderer.py index 1c99b9d..ebf5f14 100644 --- a/meshchatx/src/backend/markdown_renderer.py +++ b/meshchatx/src/backend/markdown_renderer.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import html import re diff --git a/meshchatx/src/backend/meshchat_utils.py b/meshchatx/src/backend/meshchat_utils.py index 6d62f77..9f1e232 100644 --- a/meshchatx/src/backend/meshchat_utils.py +++ b/meshchatx/src/backend/meshchat_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import base64 import contextlib import json diff --git a/meshchatx/src/backend/message_handler.py b/meshchatx/src/backend/message_handler.py index 486a5d6..1d8edf3 100644 --- a/meshchatx/src/backend/message_handler.py +++ b/meshchatx/src/backend/message_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from .database import Database diff --git a/meshchatx/src/backend/nomadnet_downloader.py b/meshchatx/src/backend/nomadnet_downloader.py index 7f131c3..3d75053 100644 --- a/meshchatx/src/backend/nomadnet_downloader.py +++ b/meshchatx/src/backend/nomadnet_downloader.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import io import os diff --git a/meshchatx/src/backend/nomadnet_utils.py b/meshchatx/src/backend/nomadnet_utils.py index 62811c3..cf07419 100644 --- a/meshchatx/src/backend/nomadnet_utils.py +++ b/meshchatx/src/backend/nomadnet_utils.py @@ -1,3 +1,6 @@ +# SPDX-License-Identifier: 0BSD + + def convert_nomadnet_string_data_to_map(path_data: str | None): data = {} if path_data is not None: diff --git a/meshchatx/src/backend/page_node.py b/meshchatx/src/backend/page_node.py index d8af347..7545e4e 100644 --- a/meshchatx/src/backend/page_node.py +++ b/meshchatx/src/backend/page_node.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """PageNode: Serves Micron pages and files over RNS. Each PageNode owns an RNS Destination (SINGLE, IN) with the aspect diff --git a/meshchatx/src/backend/page_node_manager.py b/meshchatx/src/backend/page_node_manager.py index 9a85b4d..a16024e 100644 --- a/meshchatx/src/backend/page_node_manager.py +++ b/meshchatx/src/backend/page_node_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """PageNodeManager: Manages the lifecycle of multiple PageNode instances. Handles creation, deletion, persistence, start/stop, and announce diff --git a/meshchatx/src/backend/persistent_log_handler.py b/meshchatx/src/backend/persistent_log_handler.py index 49d7f16..5c86a60 100644 --- a/meshchatx/src/backend/persistent_log_handler.py +++ b/meshchatx/src/backend/persistent_log_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import collections import logging import math diff --git a/meshchatx/src/backend/recovery/__init__.py b/meshchatx/src/backend/recovery/__init__.py index 4a36ac2..63afd44 100644 --- a/meshchatx/src/backend/recovery/__init__.py +++ b/meshchatx/src/backend/recovery/__init__.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + from .crash_recovery import CrashRecovery from .health_monitor import HealthMonitor diff --git a/meshchatx/src/backend/recovery/crash_recovery.py b/meshchatx/src/backend/recovery/crash_recovery.py index bf47a12..953c2a7 100644 --- a/meshchatx/src/backend/recovery/crash_recovery.py +++ b/meshchatx/src/backend/recovery/crash_recovery.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Crash recovery and adaptive diagnostics for MeshChatX. Uses entropy, KL-divergence, and Bayesian weight learning. Crash history is diff --git a/meshchatx/src/backend/recovery/health_monitor.py b/meshchatx/src/backend/recovery/health_monitor.py index c874283..5a63100 100644 --- a/meshchatx/src/backend/recovery/health_monitor.py +++ b/meshchatx/src/backend/recovery/health_monitor.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Lightweight predictive health monitor. Runs as a daemon thread on a 5-minute interval, reading in-memory diff --git a/meshchatx/src/backend/ringtone_manager.py b/meshchatx/src/backend/ringtone_manager.py index 7a87b6e..0356fb1 100644 --- a/meshchatx/src/backend/ringtone_manager.py +++ b/meshchatx/src/backend/ringtone_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import os import shutil import subprocess diff --git a/meshchatx/src/backend/rncp_handler.py b/meshchatx/src/backend/rncp_handler.py index 6d7a372..fb095a0 100644 --- a/meshchatx/src/backend/rncp_handler.py +++ b/meshchatx/src/backend/rncp_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import contextlib import os diff --git a/meshchatx/src/backend/rnpath_handler.py b/meshchatx/src/backend/rnpath_handler.py index e58237d..fbd213b 100644 --- a/meshchatx/src/backend/rnpath_handler.py +++ b/meshchatx/src/backend/rnpath_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import RNS diff --git a/meshchatx/src/backend/rnpath_trace_handler.py b/meshchatx/src/backend/rnpath_trace_handler.py index 4563f15..44d6a01 100644 --- a/meshchatx/src/backend/rnpath_trace_handler.py +++ b/meshchatx/src/backend/rnpath_trace_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import time import traceback diff --git a/meshchatx/src/backend/rnprobe_handler.py b/meshchatx/src/backend/rnprobe_handler.py index 3c1f6e5..5dc5442 100644 --- a/meshchatx/src/backend/rnprobe_handler.py +++ b/meshchatx/src/backend/rnprobe_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import os import time diff --git a/meshchatx/src/backend/rnstatus_handler.py b/meshchatx/src/backend/rnstatus_handler.py index 3db5889..b65cb99 100644 --- a/meshchatx/src/backend/rnstatus_handler.py +++ b/meshchatx/src/backend/rnstatus_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import contextlib import time from typing import Any diff --git a/meshchatx/src/backend/sideband_commands.py b/meshchatx/src/backend/sideband_commands.py index d28d9f0..eb93367 100644 --- a/meshchatx/src/backend/sideband_commands.py +++ b/meshchatx/src/backend/sideband_commands.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: MIT + # https://github.com/markqvist/Sideband/blob/e515889e210037f881c201e0d627a7b09a48eb69/sbapp/sideband/sense.py#L11 class SidebandCommands: TELEMETRY_REQUEST = 0x01 diff --git a/meshchatx/src/backend/sticker_utils.py b/meshchatx/src/backend/sticker_utils.py index 28dd0bb..119fdbe 100644 --- a/meshchatx/src/backend/sticker_utils.py +++ b/meshchatx/src/backend/sticker_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Validation and hashing for user sticker images stored per identity.""" from __future__ import annotations diff --git a/meshchatx/src/backend/telemetry_utils.py b/meshchatx/src/backend/telemetry_utils.py index 8adaee3..324f23d 100644 --- a/meshchatx/src/backend/telemetry_utils.py +++ b/meshchatx/src/backend/telemetry_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import struct import time diff --git a/meshchatx/src/backend/telephone_manager.py b/meshchatx/src/backend/telephone_manager.py index 0cd840b..9a21b3f 100644 --- a/meshchatx/src/backend/telephone_manager.py +++ b/meshchatx/src/backend/telephone_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import base64 import contextlib diff --git a/meshchatx/src/backend/translator_handler.py b/meshchatx/src/backend/translator_handler.py index 0ff711e..fe07a6a 100644 --- a/meshchatx/src/backend/translator_handler.py +++ b/meshchatx/src/backend/translator_handler.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import concurrent.futures import os diff --git a/meshchatx/src/backend/voicemail_manager.py b/meshchatx/src/backend/voicemail_manager.py index 69481fd..5e57a9e 100644 --- a/meshchatx/src/backend/voicemail_manager.py +++ b/meshchatx/src/backend/voicemail_manager.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import contextlib import os import platform diff --git a/meshchatx/src/backend/web_audio_bridge.py b/meshchatx/src/backend/web_audio_bridge.py index bf6584e..828ae0e 100644 --- a/meshchatx/src/backend/web_audio_bridge.py +++ b/meshchatx/src/backend/web_audio_bridge.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + import asyncio import contextlib import json diff --git a/meshchatx/src/env_utils.py b/meshchatx/src/env_utils.py index 66fe859..4eabe4b 100644 --- a/meshchatx/src/env_utils.py +++ b/meshchatx/src/env_utils.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: 0BSD + """Environment variable parsing helpers.""" import os diff --git a/meshchatx/src/frontend/components/App.vue b/meshchatx/src/frontend/components/App.vue index c22f249..b7f3615 100644 --- a/meshchatx/src/frontend/components/App.vue +++ b/meshchatx/src/frontend/components/App.vue @@ -1,3 +1,5 @@ + +