flwr-nightly 1.26.0.dev20260117__tar.gz → 1.26.0.dev20260119__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/PKG-INFO +1 -1
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config_migration.py +3 -2
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config_utils.py +1 -8
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/flower_config.py +8 -7
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/pull.py +1 -4
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/typing.py +91 -22
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/utils.py +7 -9
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/constant.py +10 -0
- flwr_nightly-1.26.0.dev20260119/py/flwr/supercore/credential_store/__init__.py +33 -0
- flwr_nightly-1.26.0.dev20260119/py/flwr/supercore/credential_store/credential_store.py +34 -0
- flwr_nightly-1.26.0.dev20260119/py/flwr/supercore/credential_store/file_credential_store.py +76 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/sqlite_mixin.py +4 -7
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/state/schema/corestate_tables.py +16 -11
- flwr_nightly-1.26.0.dev20260119/py/flwr/supercore/state/schema/linkstate_tables.py +152 -0
- flwr_nightly-1.26.0.dev20260119/py/flwr/supercore/state/schema/objectstore_tables.py +90 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/pyproject.toml +1 -1
- flwr_nightly-1.26.0.dev20260117/py/flwr/supercore/state/schema/linkstate_tables.py +0 -152
- flwr_nightly-1.26.0.dev20260117/py/flwr/supercore/state/schema/objectstore_tables.py +0 -85
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/message_type.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/app/user_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/app_cmd/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/app_cmd/publish.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/app_cmd/review.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/federation/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/run_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/supernode/ls.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/supernode/register.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/supernode/unregister.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/client_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/clientapp/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/common/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/federation_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/federation_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/federation_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/bulyan.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/krum.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/multikrum.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/address.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/cli/flower_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/date.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/heartbeat.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/primitives/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/primitives/asymmetric.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/state/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/state/schema/README.md +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/state/schema/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/superexec/run_superexec.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/version.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/federation/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/federation/federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supernode/start_client_internal.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.26.0.
|
|
3
|
+
Version: 1.26.0.dev20260119
|
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
{flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config_migration.py
RENAMED
|
@@ -208,7 +208,7 @@ def migrate(
|
|
|
208
208
|
def migrate_if_legacy_usage(
|
|
209
209
|
superlink: str,
|
|
210
210
|
args: list[str],
|
|
211
|
-
) ->
|
|
211
|
+
) -> bool:
|
|
212
212
|
"""Migrate legacy TOML configuration to Flower config if legacy usage is
|
|
213
213
|
detected."""
|
|
214
214
|
# Trigger the same typer error when detecting unexpected extra args
|
|
@@ -217,9 +217,10 @@ def migrate_if_legacy_usage(
|
|
|
217
217
|
|
|
218
218
|
# Skip migration if no legacy usage is detected
|
|
219
219
|
if not _is_legacy_usage(superlink, args):
|
|
220
|
-
return
|
|
220
|
+
return False
|
|
221
221
|
|
|
222
222
|
migrate(
|
|
223
223
|
app=Path(superlink),
|
|
224
224
|
toml_federation=args[0] if len(args) == 1 else None,
|
|
225
225
|
)
|
|
226
|
+
return True
|
{flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/config_utils.py
RENAMED
|
@@ -307,16 +307,9 @@ def load_certificate_in_connection(
|
|
|
307
307
|
typer.Exit
|
|
308
308
|
If the configuration is invalid or the certificate file cannot be read.
|
|
309
309
|
"""
|
|
310
|
-
if connection.insecure is None:
|
|
311
|
-
raise ValueError(
|
|
312
|
-
f"SuperLink connection '{connection.name}' is missing insecure setting."
|
|
313
|
-
)
|
|
314
|
-
|
|
315
|
-
insecure = connection.insecure
|
|
316
|
-
|
|
317
310
|
# Process root certificates
|
|
318
311
|
if root_certificates := connection.root_certificates:
|
|
319
|
-
if insecure:
|
|
312
|
+
if connection.insecure:
|
|
320
313
|
typer.secho(
|
|
321
314
|
"❌ `root-certificates` were provided but the `insecure` parameter "
|
|
322
315
|
"is set to `True`.",
|
{flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/cli/flower_config.py
RENAMED
|
@@ -215,18 +215,19 @@ def serialize_superlink_connection(connection: SuperLinkConnection) -> dict[str,
|
|
|
215
215
|
dict[str, Any]
|
|
216
216
|
Dictionary representation suitable for TOML serialization.
|
|
217
217
|
"""
|
|
218
|
+
# pylint: disable=protected-access
|
|
218
219
|
conn_dict: dict[str, Any] = {
|
|
219
|
-
SuperLinkConnectionTomlKey.ADDRESS: connection.
|
|
220
|
-
SuperLinkConnectionTomlKey.ROOT_CERTIFICATES: connection.
|
|
221
|
-
SuperLinkConnectionTomlKey.INSECURE: connection.
|
|
222
|
-
SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH: connection.
|
|
223
|
-
SuperLinkConnectionTomlKey.FEDERATION: connection.
|
|
220
|
+
SuperLinkConnectionTomlKey.ADDRESS: connection._address,
|
|
221
|
+
SuperLinkConnectionTomlKey.ROOT_CERTIFICATES: connection._root_certificates,
|
|
222
|
+
SuperLinkConnectionTomlKey.INSECURE: connection._insecure,
|
|
223
|
+
SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH: connection._enable_account_auth,
|
|
224
|
+
SuperLinkConnectionTomlKey.FEDERATION: connection._federation,
|
|
224
225
|
}
|
|
225
226
|
# Remove None values
|
|
226
227
|
conn_dict = {k: v for k, v in conn_dict.items() if v is not None}
|
|
227
228
|
|
|
228
|
-
if connection.
|
|
229
|
-
options_dict = _serialize_simulation_options(connection.
|
|
229
|
+
if connection._options is not None:
|
|
230
|
+
options_dict = _serialize_simulation_options(connection._options)
|
|
230
231
|
conn_dict[SuperLinkConnectionTomlKey.OPTIONS] = options_dict
|
|
231
232
|
|
|
232
233
|
return conn_dict
|
|
@@ -40,10 +40,7 @@ from .utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
|
|
|
40
40
|
def pull( # pylint: disable=R0914
|
|
41
41
|
run_id: Annotated[
|
|
42
42
|
int,
|
|
43
|
-
typer.
|
|
44
|
-
"--run-id",
|
|
45
|
-
help="Run ID to pull artifacts from.",
|
|
46
|
-
),
|
|
43
|
+
typer.Argument(help="Run ID to pull artifacts from."),
|
|
47
44
|
],
|
|
48
45
|
app: Annotated[
|
|
49
46
|
Path,
|
|
@@ -23,6 +23,8 @@ from flwr.cli.constant import (
|
|
|
23
23
|
SuperLinkConnectionTomlKey,
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
+
_ERROR_MSG_FMT = "SuperLinkConnection.%s is None"
|
|
27
|
+
|
|
26
28
|
|
|
27
29
|
@dataclass
|
|
28
30
|
class SimulationClientResources:
|
|
@@ -94,59 +96,126 @@ class SuperLinkConnection:
|
|
|
94
96
|
"""SuperLink connection configuration for CLI commands."""
|
|
95
97
|
|
|
96
98
|
name: str
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
_address: str | None = None
|
|
100
|
+
_root_certificates: str | None = None
|
|
101
|
+
_insecure: bool | None = None
|
|
102
|
+
_enable_account_auth: bool | None = None
|
|
103
|
+
_federation: str | None = None
|
|
104
|
+
_options: SuperLinkSimulationOptions | None = None
|
|
105
|
+
|
|
106
|
+
# pylint: disable=too-many-arguments,too-many-positional-arguments
|
|
107
|
+
def __init__(
|
|
108
|
+
self,
|
|
109
|
+
name: str,
|
|
110
|
+
address: str | None = None,
|
|
111
|
+
root_certificates: str | None = None,
|
|
112
|
+
insecure: bool | None = None,
|
|
113
|
+
enable_account_auth: bool | None = None,
|
|
114
|
+
federation: str | None = None,
|
|
115
|
+
options: SuperLinkSimulationOptions | None = None,
|
|
116
|
+
) -> None:
|
|
117
|
+
self.name = name
|
|
118
|
+
self._address = address
|
|
119
|
+
self._root_certificates = root_certificates
|
|
120
|
+
self._insecure = insecure
|
|
121
|
+
self._enable_account_auth = enable_account_auth
|
|
122
|
+
self._federation = federation
|
|
123
|
+
self._options = options
|
|
124
|
+
|
|
125
|
+
self.__post_init__()
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def address(self) -> str:
|
|
129
|
+
"""Return the address."""
|
|
130
|
+
if self._address is None:
|
|
131
|
+
raise ValueError(_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.ADDRESS)
|
|
132
|
+
return self._address
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def root_certificates(self) -> str:
|
|
136
|
+
"""Return the root certificates."""
|
|
137
|
+
if self._root_certificates is None:
|
|
138
|
+
raise ValueError(
|
|
139
|
+
_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.ROOT_CERTIFICATES
|
|
140
|
+
)
|
|
141
|
+
return self._root_certificates
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def insecure(self) -> bool:
|
|
145
|
+
"""Return the insecure flag."""
|
|
146
|
+
if self._insecure is None:
|
|
147
|
+
raise ValueError(_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.INSECURE)
|
|
148
|
+
return self._insecure
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def enable_account_auth(self) -> bool:
|
|
152
|
+
"""Return the enable_account_auth flag."""
|
|
153
|
+
if self._enable_account_auth is None:
|
|
154
|
+
raise ValueError(
|
|
155
|
+
_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH
|
|
156
|
+
)
|
|
157
|
+
return self._enable_account_auth
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def federation(self) -> str:
|
|
161
|
+
"""Return the federation."""
|
|
162
|
+
if self._federation is None:
|
|
163
|
+
raise ValueError(_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.FEDERATION)
|
|
164
|
+
return self._federation
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def options(self) -> SuperLinkSimulationOptions:
|
|
168
|
+
"""Return the simulation options."""
|
|
169
|
+
if self._options is None:
|
|
170
|
+
raise ValueError(_ERROR_MSG_FMT % SuperLinkConnectionTomlKey.OPTIONS)
|
|
171
|
+
return self._options
|
|
103
172
|
|
|
104
173
|
def __post_init__(self) -> None:
|
|
105
174
|
"""Validate SuperLink connection configuration."""
|
|
106
175
|
err_prefix = f"Invalid value for key '%s' in connection '{self.name}': "
|
|
107
|
-
if self.
|
|
176
|
+
if self._address is not None and not isinstance(self._address, str):
|
|
108
177
|
raise ValueError(
|
|
109
178
|
err_prefix % SuperLinkConnectionTomlKey.ADDRESS
|
|
110
|
-
+ f"expected str, but got {type(self.
|
|
179
|
+
+ f"expected str, but got {type(self._address).__name__}."
|
|
111
180
|
)
|
|
112
|
-
if self.
|
|
113
|
-
self.
|
|
181
|
+
if self._root_certificates is not None and not isinstance(
|
|
182
|
+
self._root_certificates, str
|
|
114
183
|
):
|
|
115
184
|
raise ValueError(
|
|
116
185
|
err_prefix % SuperLinkConnectionTomlKey.ROOT_CERTIFICATES
|
|
117
|
-
+ f"expected str, but got {type(self.
|
|
186
|
+
+ f"expected str, but got {type(self._root_certificates).__name__}."
|
|
118
187
|
)
|
|
119
188
|
|
|
120
189
|
# Ensure root certificates path is absolute
|
|
121
|
-
if self.
|
|
122
|
-
if not Path(self.
|
|
190
|
+
if self._root_certificates is not None:
|
|
191
|
+
if not Path(self._root_certificates).is_absolute():
|
|
123
192
|
raise ValueError(
|
|
124
193
|
err_prefix % SuperLinkConnectionTomlKey.ROOT_CERTIFICATES
|
|
125
194
|
+ "expected absolute path, but got relative path "
|
|
126
|
-
f"'{self.
|
|
195
|
+
f"'{self._root_certificates}'."
|
|
127
196
|
)
|
|
128
197
|
|
|
129
|
-
if self.
|
|
198
|
+
if self._insecure is not None and not isinstance(self._insecure, bool):
|
|
130
199
|
raise ValueError(
|
|
131
200
|
err_prefix % SuperLinkConnectionTomlKey.INSECURE
|
|
132
|
-
+ f"expected bool, but got {type(self.
|
|
201
|
+
+ f"expected bool, but got {type(self._insecure).__name__}."
|
|
133
202
|
)
|
|
134
|
-
if self.
|
|
135
|
-
self.
|
|
203
|
+
if self._enable_account_auth is not None and not isinstance(
|
|
204
|
+
self._enable_account_auth, bool
|
|
136
205
|
):
|
|
137
206
|
raise ValueError(
|
|
138
207
|
err_prefix % SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH
|
|
139
|
-
+ f"expected bool, but got {type(self.
|
|
208
|
+
+ f"expected bool, but got {type(self._enable_account_auth).__name__}."
|
|
140
209
|
)
|
|
141
210
|
|
|
142
|
-
if self.
|
|
211
|
+
if self._federation is not None and not isinstance(self._federation, str):
|
|
143
212
|
raise ValueError(
|
|
144
213
|
err_prefix % SuperLinkConnectionTomlKey.FEDERATION
|
|
145
|
-
+ f"expected str, but got {type(self.
|
|
214
|
+
+ f"expected str, but got {type(self._federation).__name__}."
|
|
146
215
|
)
|
|
147
216
|
|
|
148
217
|
# The connection needs to have either an address or options (or both).
|
|
149
|
-
if self.
|
|
218
|
+
if self._address is None and self._options is None:
|
|
150
219
|
raise ValueError(
|
|
151
220
|
"Invalid SuperLink connection format: "
|
|
152
221
|
f"'{SuperLinkConnectionTomlKey.ADDRESS}' and/or "
|
|
@@ -458,13 +458,17 @@ def init_channel(
|
|
|
458
458
|
return channel
|
|
459
459
|
|
|
460
460
|
|
|
461
|
-
def init_channel_from_connection(
|
|
461
|
+
def init_channel_from_connection(
|
|
462
|
+
connection: SuperLinkConnection, auth_plugin: CliAuthPlugin | None = None
|
|
463
|
+
) -> grpc.Channel:
|
|
462
464
|
"""Initialize gRPC channel to the Control API.
|
|
463
465
|
|
|
464
466
|
Parameters
|
|
465
467
|
----------
|
|
466
468
|
connection : SuperLinkConnection
|
|
467
469
|
SuperLink connection configuration.
|
|
470
|
+
auth_plugin : CliAuthPlugin | None (default: None)
|
|
471
|
+
Authentication plugin instance for handling credentials.
|
|
468
472
|
|
|
469
473
|
Returns
|
|
470
474
|
-------
|
|
@@ -474,18 +478,12 @@ def init_channel_from_connection(connection: SuperLinkConnection) -> grpc.Channe
|
|
|
474
478
|
root_certificates_bytes = load_certificate_in_connection(connection)
|
|
475
479
|
|
|
476
480
|
# Load authentication plugin
|
|
477
|
-
auth_plugin
|
|
481
|
+
if auth_plugin is None:
|
|
482
|
+
auth_plugin = load_cli_auth_plugin_from_connection(connection)
|
|
478
483
|
|
|
479
484
|
# Load tokens
|
|
480
485
|
auth_plugin.load_tokens()
|
|
481
486
|
|
|
482
|
-
# Ensure address and insecure are set
|
|
483
|
-
if connection.address is None or connection.insecure is None:
|
|
484
|
-
raise ValueError(
|
|
485
|
-
f"Couldn't create channel. SuperLink connection '{connection.name}'"
|
|
486
|
-
" is missing address or insecure setting."
|
|
487
|
-
)
|
|
488
|
-
|
|
489
487
|
# Create the gRPC channel
|
|
490
488
|
channel = create_channel(
|
|
491
489
|
server_address=connection.address,
|
{flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260119}/py/flwr/supercore/constant.py
RENAMED
|
@@ -64,6 +64,16 @@ MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS = 3600
|
|
|
64
64
|
# System message type
|
|
65
65
|
SYSTEM_MESSAGE_TYPE = "system"
|
|
66
66
|
|
|
67
|
+
# SQLite PRAGMA settings for optimal performance and correctness
|
|
68
|
+
SQLITE_PRAGMAS = (
|
|
69
|
+
("journal_mode", "WAL"), # Enable Write-Ahead Logging for better concurrency
|
|
70
|
+
("synchronous", "NORMAL"),
|
|
71
|
+
("foreign_keys", "ON"),
|
|
72
|
+
("cache_size", "-64000"), # 64MB cache
|
|
73
|
+
("temp_store", "MEMORY"), # In-memory temp tables
|
|
74
|
+
("mmap_size", "268435456"), # 256MB memory-mapped I/O
|
|
75
|
+
)
|
|
76
|
+
|
|
67
77
|
|
|
68
78
|
class NodeStatus:
|
|
69
79
|
"""Event log writer types."""
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright 2026 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Credential store for Flower."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from .credential_store import CredentialStore
|
|
19
|
+
from .file_credential_store import FileCredentialStore
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_credential_store() -> CredentialStore:
|
|
23
|
+
"""Get the credential store instance.
|
|
24
|
+
|
|
25
|
+
Currently, only FileCredentialStore is implemented.
|
|
26
|
+
"""
|
|
27
|
+
return FileCredentialStore()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
__all__ = [
|
|
31
|
+
"CredentialStore",
|
|
32
|
+
"get_credential_store",
|
|
33
|
+
]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Copyright 2026 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""Abstract base classes for credential store."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from abc import ABC, abstractmethod
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CredentialStore(ABC):
|
|
22
|
+
"""Abstract base class for credential store."""
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def set(self, key: str, value: bytes) -> None:
|
|
26
|
+
"""Set a credential in the store."""
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def get(self, key: str) -> bytes | None:
|
|
30
|
+
"""Get a credential from the store."""
|
|
31
|
+
|
|
32
|
+
@abstractmethod
|
|
33
|
+
def delete(self, key: str) -> None:
|
|
34
|
+
"""Delete a credential from the store."""
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright 2026 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""File-based credential store implementation."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import base64
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import cast
|
|
21
|
+
|
|
22
|
+
import yaml
|
|
23
|
+
|
|
24
|
+
from ..utils import get_flwr_home
|
|
25
|
+
from .credential_store import CredentialStore
|
|
26
|
+
|
|
27
|
+
CREDENTIAL_FILE_PATH = get_flwr_home() / "credentials.yaml"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class FileCredentialStore(CredentialStore):
|
|
31
|
+
"""File-based credential store implementation."""
|
|
32
|
+
|
|
33
|
+
def __init__(self, file_path: Path | None = None) -> None:
|
|
34
|
+
"""Initialize the file credential store.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
file_path : Path | None
|
|
39
|
+
Path to the credentials file. If None, uses default path.
|
|
40
|
+
"""
|
|
41
|
+
self.file_path = file_path or CREDENTIAL_FILE_PATH
|
|
42
|
+
|
|
43
|
+
def _load_credentials(self) -> dict[str, str]:
|
|
44
|
+
"""Load credentials from file."""
|
|
45
|
+
if not self.file_path.exists():
|
|
46
|
+
return {}
|
|
47
|
+
with self.file_path.open("r", encoding="utf-8") as f:
|
|
48
|
+
data = yaml.safe_load(f)
|
|
49
|
+
return cast(dict[str, str], data) if data else {}
|
|
50
|
+
|
|
51
|
+
def _save_credentials(self, credentials: dict[str, str]) -> None:
|
|
52
|
+
"""Save credentials to file."""
|
|
53
|
+
self.file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
54
|
+
with self.file_path.open("w", encoding="utf-8") as f:
|
|
55
|
+
yaml.safe_dump(credentials, f)
|
|
56
|
+
|
|
57
|
+
def set(self, key: str, value: bytes) -> None:
|
|
58
|
+
"""Set a credential in the store."""
|
|
59
|
+
credentials = self._load_credentials()
|
|
60
|
+
credentials[key] = base64.b64encode(value).decode("utf-8")
|
|
61
|
+
self._save_credentials(credentials)
|
|
62
|
+
|
|
63
|
+
def get(self, key: str) -> bytes | None:
|
|
64
|
+
"""Get a credential from the store."""
|
|
65
|
+
credentials = self._load_credentials()
|
|
66
|
+
encoded_value = credentials.get(key)
|
|
67
|
+
if encoded_value is None:
|
|
68
|
+
return None
|
|
69
|
+
return base64.b64decode(encoded_value)
|
|
70
|
+
|
|
71
|
+
def delete(self, key: str) -> None:
|
|
72
|
+
"""Delete a credential from the store."""
|
|
73
|
+
credentials = self._load_credentials()
|
|
74
|
+
if key in credentials:
|
|
75
|
+
del credentials[key]
|
|
76
|
+
self._save_credentials(credentials)
|
|
@@ -23,6 +23,7 @@ from logging import DEBUG, ERROR
|
|
|
23
23
|
from typing import Any
|
|
24
24
|
|
|
25
25
|
from flwr.common.logger import log
|
|
26
|
+
from flwr.supercore.constant import SQLITE_PRAGMAS
|
|
26
27
|
|
|
27
28
|
DictOrTuple = tuple[Any, ...] | dict[str, Any]
|
|
28
29
|
|
|
@@ -92,13 +93,9 @@ class SqliteMixin(ABC):
|
|
|
92
93
|
)
|
|
93
94
|
"""
|
|
94
95
|
self._conn = sqlite3.connect(self.database_path)
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
self._conn.execute("PRAGMA foreign_keys = ON;")
|
|
99
|
-
self._conn.execute("PRAGMA cache_size = -64000;") # 64MB cache
|
|
100
|
-
self._conn.execute("PRAGMA temp_store = MEMORY;") # In-memory temp tables
|
|
101
|
-
self._conn.execute("PRAGMA mmap_size = 268435456;") # 256MB memory-mapped I/O
|
|
96
|
+
# Set SQLite pragmas for optimal performance and correctness
|
|
97
|
+
for pragma, value in SQLITE_PRAGMAS:
|
|
98
|
+
self._conn.execute(f"PRAGMA {pragma} = {value};")
|
|
102
99
|
self._conn.row_factory = dict_factory
|
|
103
100
|
|
|
104
101
|
if log_queries:
|
|
@@ -17,15 +17,20 @@
|
|
|
17
17
|
|
|
18
18
|
from sqlalchemy import Column, Float, Integer, MetaData, String, Table
|
|
19
19
|
|
|
20
|
-
corestate_metadata = MetaData()
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
def create_corestate_metadata() -> MetaData:
|
|
22
|
+
"""Create and return MetaData with CoreState table definitions."""
|
|
23
|
+
metadata = MetaData()
|
|
24
|
+
|
|
25
|
+
# --------------------------------------------------------------------------
|
|
26
|
+
# Table: token_store
|
|
27
|
+
# --------------------------------------------------------------------------
|
|
28
|
+
Table(
|
|
29
|
+
"token_store",
|
|
30
|
+
metadata,
|
|
31
|
+
Column("run_id", Integer, primary_key=True, nullable=True),
|
|
32
|
+
Column("token", String, unique=True, nullable=False),
|
|
33
|
+
Column("active_until", Float),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
return metadata
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Copyright 2026 Flower Labs GmbH. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
"""SQLAlchemy Core Table definitions for LinkState."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
from sqlalchemy import (
|
|
19
|
+
TIMESTAMP,
|
|
20
|
+
Column,
|
|
21
|
+
Float,
|
|
22
|
+
ForeignKey,
|
|
23
|
+
Index,
|
|
24
|
+
Integer,
|
|
25
|
+
LargeBinary,
|
|
26
|
+
MetaData,
|
|
27
|
+
String,
|
|
28
|
+
Table,
|
|
29
|
+
UniqueConstraint,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def create_linkstate_metadata() -> MetaData:
|
|
34
|
+
"""Create and return MetaData with LinkState table definitions."""
|
|
35
|
+
metadata = MetaData()
|
|
36
|
+
|
|
37
|
+
# --------------------------------------------------------------------------
|
|
38
|
+
# Table: node
|
|
39
|
+
# --------------------------------------------------------------------------
|
|
40
|
+
Table(
|
|
41
|
+
"node",
|
|
42
|
+
metadata,
|
|
43
|
+
Column("node_id", Integer, unique=True),
|
|
44
|
+
Column("owner_aid", String),
|
|
45
|
+
Column("owner_name", String),
|
|
46
|
+
Column("status", String),
|
|
47
|
+
Column("registered_at", String),
|
|
48
|
+
Column("last_activated_at", String, nullable=True),
|
|
49
|
+
Column("last_deactivated_at", String, nullable=True),
|
|
50
|
+
Column("unregistered_at", String, nullable=True),
|
|
51
|
+
Column("online_until", TIMESTAMP, nullable=True),
|
|
52
|
+
Column("heartbeat_interval", Float),
|
|
53
|
+
Column("public_key", LargeBinary, unique=True),
|
|
54
|
+
# Indexes
|
|
55
|
+
# Used in delete_node and get_node_info (security/filtering)
|
|
56
|
+
Index("idx_node_owner_aid", "owner_aid"),
|
|
57
|
+
# Used in get_nodes and activation checks (frequent filtering)
|
|
58
|
+
Index("idx_node_status", "status"),
|
|
59
|
+
# Used in heartbeat checks to efficiently find expired nodes
|
|
60
|
+
Index("idx_online_until", "online_until"),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# --------------------------------------------------------------------------
|
|
64
|
+
# Table: run
|
|
65
|
+
# --------------------------------------------------------------------------
|
|
66
|
+
Table(
|
|
67
|
+
"run",
|
|
68
|
+
metadata,
|
|
69
|
+
Column("run_id", Integer, unique=True),
|
|
70
|
+
Column("fab_id", String),
|
|
71
|
+
Column("fab_version", String),
|
|
72
|
+
Column("fab_hash", String),
|
|
73
|
+
Column("override_config", String),
|
|
74
|
+
Column("pending_at", String),
|
|
75
|
+
Column("starting_at", String),
|
|
76
|
+
Column("running_at", String),
|
|
77
|
+
Column("finished_at", String),
|
|
78
|
+
Column("sub_status", String),
|
|
79
|
+
Column("details", String),
|
|
80
|
+
Column("federation", String),
|
|
81
|
+
Column("federation_options", LargeBinary),
|
|
82
|
+
Column("flwr_aid", String),
|
|
83
|
+
Column("bytes_sent", Integer, server_default="0"),
|
|
84
|
+
Column("bytes_recv", Integer, server_default="0"),
|
|
85
|
+
Column("clientapp_runtime", Float, server_default="0.0"),
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# --------------------------------------------------------------------------
|
|
89
|
+
# Table: logs
|
|
90
|
+
# --------------------------------------------------------------------------
|
|
91
|
+
Table(
|
|
92
|
+
"logs",
|
|
93
|
+
metadata,
|
|
94
|
+
Column("timestamp", Float),
|
|
95
|
+
Column("run_id", Integer, ForeignKey("run.run_id")),
|
|
96
|
+
Column("node_id", Integer),
|
|
97
|
+
Column("log", String),
|
|
98
|
+
# Composite PK
|
|
99
|
+
UniqueConstraint("timestamp", "run_id", "node_id"),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# --------------------------------------------------------------------------
|
|
103
|
+
# Table: context
|
|
104
|
+
# --------------------------------------------------------------------------
|
|
105
|
+
Table(
|
|
106
|
+
"context",
|
|
107
|
+
metadata,
|
|
108
|
+
Column("run_id", Integer, ForeignKey("run.run_id"), unique=True),
|
|
109
|
+
Column("context", LargeBinary),
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# --------------------------------------------------------------------------
|
|
113
|
+
# Table: message_ins
|
|
114
|
+
# --------------------------------------------------------------------------
|
|
115
|
+
Table(
|
|
116
|
+
"message_ins",
|
|
117
|
+
metadata,
|
|
118
|
+
Column("message_id", String, unique=True),
|
|
119
|
+
Column("group_id", String),
|
|
120
|
+
Column("run_id", Integer, ForeignKey("run.run_id")),
|
|
121
|
+
Column("src_node_id", Integer),
|
|
122
|
+
Column("dst_node_id", Integer),
|
|
123
|
+
Column("reply_to_message_id", String),
|
|
124
|
+
Column("created_at", Float),
|
|
125
|
+
Column("delivered_at", String),
|
|
126
|
+
Column("ttl", Float),
|
|
127
|
+
Column("message_type", String),
|
|
128
|
+
Column("content", LargeBinary, nullable=True),
|
|
129
|
+
Column("error", LargeBinary, nullable=True),
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# --------------------------------------------------------------------------
|
|
133
|
+
# Table: message_res
|
|
134
|
+
# --------------------------------------------------------------------------
|
|
135
|
+
Table(
|
|
136
|
+
"message_res",
|
|
137
|
+
metadata,
|
|
138
|
+
Column("message_id", String, unique=True),
|
|
139
|
+
Column("group_id", String),
|
|
140
|
+
Column("run_id", Integer, ForeignKey("run.run_id")),
|
|
141
|
+
Column("src_node_id", Integer),
|
|
142
|
+
Column("dst_node_id", Integer),
|
|
143
|
+
Column("reply_to_message_id", String),
|
|
144
|
+
Column("created_at", Float),
|
|
145
|
+
Column("delivered_at", String),
|
|
146
|
+
Column("ttl", Float),
|
|
147
|
+
Column("message_type", String),
|
|
148
|
+
Column("content", LargeBinary, nullable=True),
|
|
149
|
+
Column("error", LargeBinary, nullable=True),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return metadata
|