flwr-nightly 1.23.0.dev20251005__tar.gz → 1.23.0.dev20251007__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.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/PKG-INFO +1 -1
- flwr_nightly-1.23.0.dev20251007/py/flwr/cli/supernode/ls.py +258 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_rere_client/client_interceptor.py +1 -4
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_rere_client/connection.py +1 -3
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +7 -5
- flwr_nightly-1.23.0.dev20251007/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +76 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2.py +2 -2
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2.pyi +10 -7
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/app.py +1 -3
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -4
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +4 -2
- flwr_nightly-1.23.0.dev20251007/py/flwr/supercore/primitives/__init__.py +15 -0
- flwr_nightly-1.23.0.dev20251005/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py → flwr_nightly-1.23.0.dev20251007/py/flwr/supercore/primitives/asymmetric.py +2 -57
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/control_servicer.py +57 -1
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/pyproject.toml +1 -1
- flwr_nightly-1.23.0.dev20251005/py/flwr/cli/supernode/ls.py +0 -51
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/README.md +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/app/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/app/error.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/app/exception.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/app/metadata.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/pull.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/supernode/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/supernode/create.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/supernode/delete.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/client_app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/mod/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/typing.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/clientapp/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/constant.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/event_log_plugin/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/exit/exit_handler.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/exit/signal_handler.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/heartbeat.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/inflatable.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/inflatable_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/array.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/arraychunk.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/arrayrecord.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/configrecord.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/metricrecord.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/recorddict.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/recorddict_compat.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/serde_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/client/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/common/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/server/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/server/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/compat/simulation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/appio_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/appio_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/appio_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/control_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/control_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/control_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/heartbeat_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/recorddict_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/recorddict_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/py.typed +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/compat/grid_client_proxy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/grid/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/grid/grid.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/grid/grpc_grid.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/grid/inmemory_grid.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/exception.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/bulyan.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedadam.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedopt.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedprox.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/krum.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/multikrum.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/result.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/strategy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/app_utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/cli/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/cli/flower_superexec.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/constant.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/corestate/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/corestate/corestate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/ffs/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/ffs/ffs.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/grpc_health/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/grpc_health/health_server.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/license_plugin/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/object_store/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/object_store/object_store.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/object_store/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/superexec/run_superexec.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supercore/utils.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/cli/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/cli/flower_supernode.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/nodestate/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/runtime/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/servicer/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
- {flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/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.23.0.
|
3
|
+
Version: 1.23.0.dev20251007
|
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
|
@@ -0,0 +1,258 @@
|
|
1
|
+
# Copyright 2025 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
|
+
"""Flower command line interface `supernode list` command."""
|
16
|
+
|
17
|
+
|
18
|
+
import io
|
19
|
+
import json
|
20
|
+
from datetime import datetime, timedelta
|
21
|
+
from pathlib import Path
|
22
|
+
from typing import Annotated, Optional, cast
|
23
|
+
|
24
|
+
import typer
|
25
|
+
from rich.console import Console
|
26
|
+
from rich.table import Table
|
27
|
+
from rich.text import Text
|
28
|
+
|
29
|
+
from flwr.cli.config_utils import (
|
30
|
+
exit_if_no_address,
|
31
|
+
load_and_validate,
|
32
|
+
process_loaded_project_config,
|
33
|
+
validate_federation_in_project_config,
|
34
|
+
)
|
35
|
+
from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
|
36
|
+
from flwr.common.date import format_timedelta, isoformat8601_utc
|
37
|
+
from flwr.common.logger import print_json_error, redirect_output, restore_output
|
38
|
+
from flwr.proto.control_pb2 import ( # pylint: disable=E0611
|
39
|
+
ListNodesCliRequest,
|
40
|
+
ListNodesCliResponse,
|
41
|
+
)
|
42
|
+
from flwr.proto.control_pb2_grpc import ControlStub
|
43
|
+
from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
|
44
|
+
|
45
|
+
from ..utils import flwr_cli_grpc_exc_handler, init_channel, try_obtain_cli_auth_plugin
|
46
|
+
|
47
|
+
_NodeListType = tuple[int, str, str, str, str, str, str, str]
|
48
|
+
|
49
|
+
|
50
|
+
def ls( # pylint: disable=R0914
|
51
|
+
ctx: typer.Context,
|
52
|
+
app: Annotated[
|
53
|
+
Path,
|
54
|
+
typer.Argument(help="Path of the Flower project"),
|
55
|
+
] = Path("."),
|
56
|
+
federation: Annotated[
|
57
|
+
Optional[str],
|
58
|
+
typer.Argument(help="Name of the federation"),
|
59
|
+
] = None,
|
60
|
+
output_format: Annotated[
|
61
|
+
str,
|
62
|
+
typer.Option(
|
63
|
+
"--format",
|
64
|
+
case_sensitive=False,
|
65
|
+
help="Format output using 'default' view or 'json'",
|
66
|
+
),
|
67
|
+
] = CliOutputFormat.DEFAULT,
|
68
|
+
verbose: Annotated[
|
69
|
+
bool,
|
70
|
+
typer.Option(
|
71
|
+
"--verbose",
|
72
|
+
"-v",
|
73
|
+
help="Enable verbose output",
|
74
|
+
),
|
75
|
+
] = False,
|
76
|
+
) -> None:
|
77
|
+
"""List SuperNodes in the federation."""
|
78
|
+
# Resolve command used (list or ls)
|
79
|
+
command_name = cast(str, ctx.command.name) if ctx.command else "ls"
|
80
|
+
|
81
|
+
suppress_output = output_format == CliOutputFormat.JSON
|
82
|
+
captured_output = io.StringIO()
|
83
|
+
try:
|
84
|
+
if suppress_output:
|
85
|
+
redirect_output(captured_output)
|
86
|
+
typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
|
87
|
+
|
88
|
+
pyproject_path = app / FAB_CONFIG_FILE if app else None
|
89
|
+
config, errors, warnings = load_and_validate(path=pyproject_path)
|
90
|
+
config = process_loaded_project_config(config, errors, warnings)
|
91
|
+
federation, federation_config = validate_federation_in_project_config(
|
92
|
+
federation, config
|
93
|
+
)
|
94
|
+
exit_if_no_address(federation_config, f"supernode {command_name}")
|
95
|
+
channel = None
|
96
|
+
try:
|
97
|
+
auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
|
98
|
+
channel = init_channel(app, federation_config, auth_plugin)
|
99
|
+
stub = ControlStub(channel)
|
100
|
+
typer.echo("📄 Listing all nodes...")
|
101
|
+
formatted_nodes = _list_nodes(stub)
|
102
|
+
restore_output()
|
103
|
+
if output_format == CliOutputFormat.JSON:
|
104
|
+
Console().print_json(_to_json(formatted_nodes, verbose=verbose))
|
105
|
+
else:
|
106
|
+
Console().print(_to_table(formatted_nodes, verbose=verbose))
|
107
|
+
|
108
|
+
finally:
|
109
|
+
if channel:
|
110
|
+
channel.close()
|
111
|
+
except (typer.Exit, Exception) as err: # pylint: disable=broad-except
|
112
|
+
if suppress_output:
|
113
|
+
restore_output()
|
114
|
+
e_message = captured_output.getvalue()
|
115
|
+
print_json_error(e_message, err)
|
116
|
+
else:
|
117
|
+
typer.secho(
|
118
|
+
f"{err}",
|
119
|
+
fg=typer.colors.RED,
|
120
|
+
bold=True,
|
121
|
+
)
|
122
|
+
finally:
|
123
|
+
if suppress_output:
|
124
|
+
restore_output()
|
125
|
+
captured_output.close()
|
126
|
+
|
127
|
+
|
128
|
+
def _list_nodes(stub: ControlStub) -> list[_NodeListType]:
|
129
|
+
"""List all nodes."""
|
130
|
+
with flwr_cli_grpc_exc_handler():
|
131
|
+
res: ListNodesCliResponse = stub.ListNodesCli(ListNodesCliRequest())
|
132
|
+
|
133
|
+
return _format_nodes(list(res.nodes_info), res.now)
|
134
|
+
|
135
|
+
|
136
|
+
def _format_nodes(
|
137
|
+
nodes_info: list[NodeInfo], now_isoformat: str
|
138
|
+
) -> list[_NodeListType]:
|
139
|
+
"""Format node information for display."""
|
140
|
+
|
141
|
+
def _format_datetime(dt_str: Optional[str]) -> str:
|
142
|
+
dt = datetime.fromisoformat(dt_str) if dt_str else None
|
143
|
+
return isoformat8601_utc(dt).replace("T", " ") if dt else "N/A"
|
144
|
+
|
145
|
+
formatted_nodes: list[_NodeListType] = []
|
146
|
+
# Add rows
|
147
|
+
for node in sorted(nodes_info, key=lambda x: datetime.fromisoformat(x.created_at)):
|
148
|
+
|
149
|
+
# Calculate elapsed times
|
150
|
+
elapsed_time_activated = timedelta()
|
151
|
+
if node.last_activated_at:
|
152
|
+
end_time = datetime.fromisoformat(now_isoformat)
|
153
|
+
elapsed_time_activated = end_time - datetime.fromisoformat(
|
154
|
+
node.last_activated_at
|
155
|
+
)
|
156
|
+
|
157
|
+
formatted_nodes.append(
|
158
|
+
(
|
159
|
+
node.node_id,
|
160
|
+
node.owner_aid,
|
161
|
+
node.status,
|
162
|
+
_format_datetime(node.created_at),
|
163
|
+
_format_datetime(node.last_activated_at),
|
164
|
+
_format_datetime(node.last_deactivated_at),
|
165
|
+
_format_datetime(node.deleted_at),
|
166
|
+
format_timedelta(elapsed_time_activated),
|
167
|
+
)
|
168
|
+
)
|
169
|
+
|
170
|
+
return formatted_nodes
|
171
|
+
|
172
|
+
|
173
|
+
def _to_table(nodes_info: list[_NodeListType], verbose: bool) -> Table:
|
174
|
+
"""Format the provided node list to a rich Table."""
|
175
|
+
table = Table(header_style="bold cyan", show_lines=True)
|
176
|
+
|
177
|
+
# Add columns
|
178
|
+
table.add_column(
|
179
|
+
Text("Node ID", justify="center"), style="bright_white", no_wrap=True
|
180
|
+
)
|
181
|
+
table.add_column(Text("Owner", justify="center"), style="dim white")
|
182
|
+
table.add_column(Text("Status", justify="center"))
|
183
|
+
table.add_column(Text("Elapsed", justify="center"))
|
184
|
+
table.add_column(Text("Status Changed @", justify="center"), style="dim white")
|
185
|
+
|
186
|
+
for row in nodes_info:
|
187
|
+
(
|
188
|
+
node_id,
|
189
|
+
owner_aid,
|
190
|
+
status,
|
191
|
+
_,
|
192
|
+
last_activated_at,
|
193
|
+
last_deactivated_at,
|
194
|
+
deleted_at,
|
195
|
+
elapse_activated,
|
196
|
+
) = row
|
197
|
+
|
198
|
+
if status == "online":
|
199
|
+
status_style = "green"
|
200
|
+
time_at = last_activated_at
|
201
|
+
elif status == "offline":
|
202
|
+
status_style = "bright_yellow"
|
203
|
+
time_at = last_deactivated_at
|
204
|
+
elif status == "deleted":
|
205
|
+
if not verbose:
|
206
|
+
continue
|
207
|
+
status_style = "red"
|
208
|
+
time_at = deleted_at
|
209
|
+
elif status == "created":
|
210
|
+
status_style = "blue"
|
211
|
+
time_at = "N/A"
|
212
|
+
else:
|
213
|
+
raise ValueError(f"Unexpected node status '{status}'")
|
214
|
+
|
215
|
+
formatted_row = (
|
216
|
+
f"[bold]{node_id}[/bold]",
|
217
|
+
f"{owner_aid}",
|
218
|
+
f"[{status_style}]{status}",
|
219
|
+
f"[cyan]{elapse_activated}[/cyan]" if status == "online" else "",
|
220
|
+
time_at,
|
221
|
+
)
|
222
|
+
table.add_row(*formatted_row)
|
223
|
+
|
224
|
+
return table
|
225
|
+
|
226
|
+
|
227
|
+
def _to_json(nodes_info: list[_NodeListType], verbose: bool) -> str:
|
228
|
+
"""Format node list to a JSON formatted string."""
|
229
|
+
nodes_list = []
|
230
|
+
for row in nodes_info:
|
231
|
+
(
|
232
|
+
node_id,
|
233
|
+
owner_aid,
|
234
|
+
status,
|
235
|
+
created_at,
|
236
|
+
activated_at,
|
237
|
+
deactivated_at,
|
238
|
+
deleted_at,
|
239
|
+
elapse_activated,
|
240
|
+
) = row
|
241
|
+
|
242
|
+
if status == "deleted" and not verbose:
|
243
|
+
continue
|
244
|
+
|
245
|
+
nodes_list.append(
|
246
|
+
{
|
247
|
+
"node-id": node_id,
|
248
|
+
"owner-aid": owner_aid,
|
249
|
+
"status": status,
|
250
|
+
"created-at": created_at,
|
251
|
+
"online-at": activated_at,
|
252
|
+
"online-elapsed": elapse_activated,
|
253
|
+
"offline-at": deactivated_at,
|
254
|
+
"deleted-at": deleted_at,
|
255
|
+
}
|
256
|
+
)
|
257
|
+
|
258
|
+
return json.dumps({"success": True, "nodes": nodes_list})
|
@@ -23,10 +23,7 @@ from google.protobuf.message import Message as GrpcMessage
|
|
23
23
|
|
24
24
|
from flwr.common import now
|
25
25
|
from flwr.common.constant import PUBLIC_KEY_HEADER, SIGNATURE_HEADER, TIMESTAMP_HEADER
|
26
|
-
from flwr.
|
27
|
-
public_key_to_bytes,
|
28
|
-
sign_message,
|
29
|
-
)
|
26
|
+
from flwr.supercore.primitives.asymmetric import public_key_to_bytes, sign_message
|
30
27
|
|
31
28
|
|
32
29
|
class AuthenticateClientInterceptor(grpc.UnaryUnaryClientInterceptor): # type: ignore
|
@@ -36,9 +36,6 @@ from flwr.common.inflatable_protobuf_utils import (
|
|
36
36
|
from flwr.common.logger import log
|
37
37
|
from flwr.common.message import Message, remove_content_from_message
|
38
38
|
from flwr.common.retry_invoker import RetryInvoker, _wrap_stub
|
39
|
-
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
40
|
-
generate_key_pairs,
|
41
|
-
)
|
42
39
|
from flwr.common.serde import message_from_proto, message_to_proto, run_from_proto
|
43
40
|
from flwr.common.typing import Fab, Run
|
44
41
|
from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
|
@@ -58,6 +55,7 @@ from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
|
58
55
|
from flwr.proto.message_pb2 import ObjectTree # pylint: disable=E0611
|
59
56
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
60
57
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
58
|
+
from flwr.supercore.primitives.asymmetric import generate_key_pairs
|
61
59
|
|
62
60
|
from .client_interceptor import AuthenticateClientInterceptor
|
63
61
|
from .grpc_adapter import GrpcAdapter
|
@@ -35,14 +35,9 @@ from flwr.common.constant import MessageType
|
|
35
35
|
from flwr.common.logger import log
|
36
36
|
from flwr.common.secure_aggregation.crypto.shamir import create_shares
|
37
37
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
38
|
-
bytes_to_private_key,
|
39
|
-
bytes_to_public_key,
|
40
38
|
decrypt,
|
41
39
|
encrypt,
|
42
|
-
generate_key_pairs,
|
43
40
|
generate_shared_key,
|
44
|
-
private_key_to_bytes,
|
45
|
-
public_key_to_bytes,
|
46
41
|
)
|
47
42
|
from flwr.common.secure_aggregation.ndarrays_arithmetic import (
|
48
43
|
factor_combine,
|
@@ -64,6 +59,13 @@ from flwr.common.secure_aggregation.secaggplus_utils import (
|
|
64
59
|
share_keys_plaintext_separate,
|
65
60
|
)
|
66
61
|
from flwr.common.typing import ConfigRecordValues
|
62
|
+
from flwr.supercore.primitives.asymmetric import (
|
63
|
+
bytes_to_private_key,
|
64
|
+
bytes_to_public_key,
|
65
|
+
generate_key_pairs,
|
66
|
+
private_key_to_bytes,
|
67
|
+
public_key_to_bytes,
|
68
|
+
)
|
67
69
|
|
68
70
|
|
69
71
|
@dataclass
|
flwr_nightly-1.23.0.dev20251007/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# Copyright 2025 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
|
+
"""Symmetric encryption."""
|
16
|
+
|
17
|
+
|
18
|
+
import base64
|
19
|
+
|
20
|
+
from cryptography.exceptions import InvalidSignature
|
21
|
+
from cryptography.fernet import Fernet
|
22
|
+
from cryptography.hazmat.primitives import hashes, hmac
|
23
|
+
from cryptography.hazmat.primitives.asymmetric import ec
|
24
|
+
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
|
25
|
+
|
26
|
+
|
27
|
+
def generate_shared_key(
|
28
|
+
private_key: ec.EllipticCurvePrivateKey, public_key: ec.EllipticCurvePublicKey
|
29
|
+
) -> bytes:
|
30
|
+
"""Generate a shared key from a private key (i.e., a secret key) and a public key.
|
31
|
+
|
32
|
+
Generate shared key by exchange function and key derivation function Key derivation
|
33
|
+
function is needed to obtain final shared key of exactly 32 bytes
|
34
|
+
"""
|
35
|
+
# Generate a 32 byte urlsafe(for fernet) shared key
|
36
|
+
# from own private key and another public key
|
37
|
+
shared_key = private_key.exchange(ec.ECDH(), public_key)
|
38
|
+
derived_key = HKDF(
|
39
|
+
algorithm=hashes.SHA256(),
|
40
|
+
length=32,
|
41
|
+
salt=None,
|
42
|
+
info=None,
|
43
|
+
).derive(shared_key)
|
44
|
+
return base64.urlsafe_b64encode(derived_key)
|
45
|
+
|
46
|
+
|
47
|
+
def encrypt(key: bytes, plaintext: bytes) -> bytes:
|
48
|
+
"""Encrypt plaintext using 32-byte key with Fernet."""
|
49
|
+
# The input key must be url safe
|
50
|
+
fernet = Fernet(key)
|
51
|
+
return fernet.encrypt(plaintext)
|
52
|
+
|
53
|
+
|
54
|
+
def decrypt(key: bytes, ciphertext: bytes) -> bytes:
|
55
|
+
"""Decrypt ciphertext using 32-byte key with Fernet."""
|
56
|
+
# The input key must be url safe
|
57
|
+
fernet = Fernet(key)
|
58
|
+
return fernet.decrypt(ciphertext)
|
59
|
+
|
60
|
+
|
61
|
+
def compute_hmac(key: bytes, message: bytes) -> bytes:
|
62
|
+
"""Compute hmac of a message using key as hash."""
|
63
|
+
computed_hmac = hmac.HMAC(key, hashes.SHA256())
|
64
|
+
computed_hmac.update(message)
|
65
|
+
return computed_hmac.finalize()
|
66
|
+
|
67
|
+
|
68
|
+
def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
|
69
|
+
"""Verify hmac of a message using key as hash."""
|
70
|
+
computed_hmac = hmac.HMAC(key, hashes.SHA256())
|
71
|
+
computed_hmac.update(message)
|
72
|
+
try:
|
73
|
+
computed_hmac.verify(hmac_value)
|
74
|
+
return True
|
75
|
+
except InvalidSignature:
|
76
|
+
return False
|
{flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2.py
RENAMED
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"\x17\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/node.proto\x12\nflwr.proto\"\x17\n\x04Node\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\xd0\x01\n\x08NodeInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x11\n\towner_aid\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\t\x12\x19\n\x11last_activated_at\x18\x05 \x01(\t\x12\x1b\n\x13last_deactivated_at\x18\x06 \x01(\t\x12\x12\n\ndeleted_at\x18\x07 \x01(\t\x12\x14\n\x0conline_until\x18\x08 \x01(\x02\x12\x1a\n\x12heartbeat_interval\x18\t \x01(\x02\x62\x06proto3')
|
18
18
|
|
19
19
|
_globals = globals()
|
20
20
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -24,5 +24,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
24
24
|
_globals['_NODE']._serialized_start=37
|
25
25
|
_globals['_NODE']._serialized_end=60
|
26
26
|
_globals['_NODEINFO']._serialized_start=63
|
27
|
-
_globals['_NODEINFO']._serialized_end=
|
27
|
+
_globals['_NODEINFO']._serialized_end=271
|
28
28
|
# @@protoc_insertion_point(module_scope)
|
{flwr_nightly-1.23.0.dev20251005 → flwr_nightly-1.23.0.dev20251007}/py/flwr/proto/node_pb2.pyi
RENAMED
@@ -25,17 +25,19 @@ class NodeInfo(google.protobuf.message.Message):
|
|
25
25
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
26
26
|
NODE_ID_FIELD_NUMBER: builtins.int
|
27
27
|
OWNER_AID_FIELD_NUMBER: builtins.int
|
28
|
+
STATUS_FIELD_NUMBER: builtins.int
|
28
29
|
CREATED_AT_FIELD_NUMBER: builtins.int
|
29
|
-
|
30
|
-
|
30
|
+
LAST_ACTIVATED_AT_FIELD_NUMBER: builtins.int
|
31
|
+
LAST_DEACTIVATED_AT_FIELD_NUMBER: builtins.int
|
31
32
|
DELETED_AT_FIELD_NUMBER: builtins.int
|
32
33
|
ONLINE_UNTIL_FIELD_NUMBER: builtins.int
|
33
34
|
HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
|
34
35
|
node_id: builtins.int
|
35
36
|
owner_aid: typing.Text
|
37
|
+
status: typing.Text
|
36
38
|
created_at: typing.Text
|
37
|
-
|
38
|
-
|
39
|
+
last_activated_at: typing.Text
|
40
|
+
last_deactivated_at: typing.Text
|
39
41
|
deleted_at: typing.Text
|
40
42
|
online_until: builtins.float
|
41
43
|
heartbeat_interval: builtins.float
|
@@ -43,12 +45,13 @@ class NodeInfo(google.protobuf.message.Message):
|
|
43
45
|
*,
|
44
46
|
node_id: builtins.int = ...,
|
45
47
|
owner_aid: typing.Text = ...,
|
48
|
+
status: typing.Text = ...,
|
46
49
|
created_at: typing.Text = ...,
|
47
|
-
|
48
|
-
|
50
|
+
last_activated_at: typing.Text = ...,
|
51
|
+
last_deactivated_at: typing.Text = ...,
|
49
52
|
deleted_at: typing.Text = ...,
|
50
53
|
online_until: builtins.float = ...,
|
51
54
|
heartbeat_interval: builtins.float = ...,
|
52
55
|
) -> None: ...
|
53
|
-
def ClearField(self, field_name: typing_extensions.Literal["
|
56
|
+
def ClearField(self, field_name: typing_extensions.Literal["created_at",b"created_at","deleted_at",b"deleted_at","heartbeat_interval",b"heartbeat_interval","last_activated_at",b"last_activated_at","last_deactivated_at",b"last_deactivated_at","node_id",b"node_id","online_until",b"online_until","owner_aid",b"owner_aid","status",b"status"]) -> None: ...
|
54
57
|
global___NodeInfo = NodeInfo
|
@@ -59,9 +59,6 @@ from flwr.common.event_log_plugin import EventLogWriterPlugin
|
|
59
59
|
from flwr.common.exit import ExitCode, flwr_exit, register_signal_handlers
|
60
60
|
from flwr.common.grpc import generic_create_grpc_server
|
61
61
|
from flwr.common.logger import log
|
62
|
-
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
63
|
-
public_key_to_bytes,
|
64
|
-
)
|
65
62
|
from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
|
66
63
|
add_FleetServicer_to_server,
|
67
64
|
)
|
@@ -70,6 +67,7 @@ from flwr.server.fleet_event_log_interceptor import FleetEventLogInterceptor
|
|
70
67
|
from flwr.supercore.ffs import FfsFactory
|
71
68
|
from flwr.supercore.grpc_health import add_args_health, run_health_server_grpc_no_tls
|
72
69
|
from flwr.supercore.object_store import ObjectStoreFactory
|
70
|
+
from flwr.supercore.primitives.asymmetric import public_key_to_bytes
|
73
71
|
from flwr.superlink.artifact_provider import ArtifactProvider
|
74
72
|
from flwr.superlink.auth_plugin import ControlAuthnPlugin, ControlAuthzPlugin
|
75
73
|
from flwr.superlink.servicer.control import run_control_api_grpc
|
@@ -29,15 +29,12 @@ from flwr.common.constant import (
|
|
29
29
|
TIMESTAMP_HEADER,
|
30
30
|
TIMESTAMP_TOLERANCE,
|
31
31
|
)
|
32
|
-
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
33
|
-
bytes_to_public_key,
|
34
|
-
verify_signature,
|
35
|
-
)
|
36
32
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
37
33
|
CreateNodeRequest,
|
38
34
|
CreateNodeResponse,
|
39
35
|
)
|
40
36
|
from flwr.server.superlink.linkstate import LinkStateFactory
|
37
|
+
from flwr.supercore.primitives.asymmetric import bytes_to_public_key, verify_signature
|
41
38
|
|
42
39
|
MIN_TIMESTAMP_DIFF = -SYSTEM_TIME_TOLERANCE
|
43
40
|
MAX_TIMESTAMP_DIFF = TIMESTAMP_TOLERANCE + SYSTEM_TIME_TOLERANCE
|
@@ -35,8 +35,6 @@ from flwr.common import (
|
|
35
35
|
)
|
36
36
|
from flwr.common.secure_aggregation.crypto.shamir import combine_shares
|
37
37
|
from flwr.common.secure_aggregation.crypto.symmetric_encryption import (
|
38
|
-
bytes_to_private_key,
|
39
|
-
bytes_to_public_key,
|
40
38
|
generate_shared_key,
|
41
39
|
)
|
42
40
|
from flwr.common.secure_aggregation.ndarrays_arithmetic import (
|
@@ -56,6 +54,10 @@ from flwr.common.secure_aggregation.secaggplus_utils import pseudo_rand_gen
|
|
56
54
|
from flwr.server.client_proxy import ClientProxy
|
57
55
|
from flwr.server.compat.legacy_context import LegacyContext
|
58
56
|
from flwr.server.grid import Grid
|
57
|
+
from flwr.supercore.primitives.asymmetric import (
|
58
|
+
bytes_to_private_key,
|
59
|
+
bytes_to_public_key,
|
60
|
+
)
|
59
61
|
|
60
62
|
from ..constant import MAIN_CONFIGS_RECORD, MAIN_PARAMS_RECORD
|
61
63
|
from ..constant import Key as WorkflowKey
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright 2025 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
|
+
"""Cryptographic primitives for the Flower infrastructure."""
|
@@ -12,17 +12,14 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""
|
15
|
+
"""Asymmetric cryptography utilities."""
|
16
16
|
|
17
17
|
|
18
|
-
import base64
|
19
18
|
from typing import cast
|
20
19
|
|
21
20
|
from cryptography.exceptions import InvalidSignature
|
22
|
-
from cryptography.
|
23
|
-
from cryptography.hazmat.primitives import hashes, hmac, serialization
|
21
|
+
from cryptography.hazmat.primitives import hashes, serialization
|
24
22
|
from cryptography.hazmat.primitives.asymmetric import ec
|
25
|
-
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
|
26
23
|
|
27
24
|
|
28
25
|
def generate_key_pairs() -> (
|
@@ -67,58 +64,6 @@ def bytes_to_public_key(public_key_bytes: bytes) -> ec.EllipticCurvePublicKey:
|
|
67
64
|
)
|
68
65
|
|
69
66
|
|
70
|
-
def generate_shared_key(
|
71
|
-
private_key: ec.EllipticCurvePrivateKey, public_key: ec.EllipticCurvePublicKey
|
72
|
-
) -> bytes:
|
73
|
-
"""Generate a shared key from a private key (i.e., a secret key) and a public key.
|
74
|
-
|
75
|
-
Generate shared key by exchange function and key derivation function Key derivation
|
76
|
-
function is needed to obtain final shared key of exactly 32 bytes
|
77
|
-
"""
|
78
|
-
# Generate a 32 byte urlsafe(for fernet) shared key
|
79
|
-
# from own private key and another public key
|
80
|
-
shared_key = private_key.exchange(ec.ECDH(), public_key)
|
81
|
-
derived_key = HKDF(
|
82
|
-
algorithm=hashes.SHA256(),
|
83
|
-
length=32,
|
84
|
-
salt=None,
|
85
|
-
info=None,
|
86
|
-
).derive(shared_key)
|
87
|
-
return base64.urlsafe_b64encode(derived_key)
|
88
|
-
|
89
|
-
|
90
|
-
def encrypt(key: bytes, plaintext: bytes) -> bytes:
|
91
|
-
"""Encrypt plaintext using 32-byte key with Fernet."""
|
92
|
-
# The input key must be url safe
|
93
|
-
fernet = Fernet(key)
|
94
|
-
return fernet.encrypt(plaintext)
|
95
|
-
|
96
|
-
|
97
|
-
def decrypt(key: bytes, ciphertext: bytes) -> bytes:
|
98
|
-
"""Decrypt ciphertext using 32-byte key with Fernet."""
|
99
|
-
# The input key must be url safe
|
100
|
-
fernet = Fernet(key)
|
101
|
-
return fernet.decrypt(ciphertext)
|
102
|
-
|
103
|
-
|
104
|
-
def compute_hmac(key: bytes, message: bytes) -> bytes:
|
105
|
-
"""Compute hmac of a message using key as hash."""
|
106
|
-
computed_hmac = hmac.HMAC(key, hashes.SHA256())
|
107
|
-
computed_hmac.update(message)
|
108
|
-
return computed_hmac.finalize()
|
109
|
-
|
110
|
-
|
111
|
-
def verify_hmac(key: bytes, message: bytes, hmac_value: bytes) -> bool:
|
112
|
-
"""Verify hmac of a message using key as hash."""
|
113
|
-
computed_hmac = hmac.HMAC(key, hashes.SHA256())
|
114
|
-
computed_hmac.update(message)
|
115
|
-
try:
|
116
|
-
computed_hmac.verify(hmac_value)
|
117
|
-
return True
|
118
|
-
except InvalidSignature:
|
119
|
-
return False
|
120
|
-
|
121
|
-
|
122
67
|
def sign_message(private_key: ec.EllipticCurvePrivateKey, message: bytes) -> bytes:
|
123
68
|
"""Sign a message using the provided EC private key.
|
124
69
|
|