flwr-nightly 1.23.0.dev20251011__tar.gz → 1.23.0.dev20251014__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (435) hide show
  1. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/PKG-INFO +1 -1
  2. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/constant.py +1 -0
  3. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/app.py +34 -71
  4. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +39 -5
  5. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +1 -12
  6. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +10 -25
  7. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/linkstate.py +15 -16
  8. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +13 -22
  9. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/pyproject.toml +1 -1
  10. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/README.md +0 -0
  11. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/__init__.py +0 -0
  12. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/app/__init__.py +0 -0
  13. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/app/error.py +0 -0
  14. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/app/exception.py +0 -0
  15. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/app/metadata.py +0 -0
  16. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/__init__.py +0 -0
  17. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/app.py +0 -0
  18. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  19. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  20. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  21. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  22. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/build.py +0 -0
  23. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  24. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/config_utils.py +0 -0
  25. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/constant.py +0 -0
  26. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/example.py +0 -0
  27. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/install.py +0 -0
  28. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/log.py +0 -0
  29. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/login/__init__.py +0 -0
  30. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/login/login.py +0 -0
  31. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/ls.py +0 -0
  32. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/__init__.py +0 -0
  33. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/new.py +0 -0
  34. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/__init__.py +0 -0
  35. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  36. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  37. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  38. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  39. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  40. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  41. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  43. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  44. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
  45. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  47. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  48. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  49. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  50. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  51. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
  52. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  53. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  54. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -0
  55. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  57. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  58. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  59. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  60. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  61. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  62. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  65. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  66. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  67. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  68. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  69. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
  70. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -0
  73. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  75. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  76. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  77. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  78. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  79. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
  80. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -0
  83. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  84. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  85. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  86. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  87. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  88. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  89. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  90. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  91. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
  92. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  93. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  94. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -0
  95. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/pull.py +0 -0
  96. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/run/__init__.py +0 -0
  97. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/run/run.py +0 -0
  98. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/stop.py +0 -0
  99. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/supernode/__init__.py +0 -0
  100. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/supernode/create.py +0 -0
  101. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/supernode/delete.py +0 -0
  102. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/supernode/ls.py +0 -0
  103. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/cli/utils.py +0 -0
  104. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/__init__.py +0 -0
  105. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/client.py +0 -0
  106. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  107. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  108. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  109. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  110. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  111. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  112. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  113. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/message_handler/__init__.py +0 -0
  114. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/message_handler/message_handler.py +0 -0
  115. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/__init__.py +0 -0
  116. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/centraldp_mods.py +0 -0
  117. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/comms_mods.py +0 -0
  118. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/localdp_mod.py +0 -0
  119. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  120. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  121. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  122. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/mod/utils.py +0 -0
  123. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/numpy_client.py +0 -0
  124. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/rest_client/__init__.py +0 -0
  125. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/rest_client/connection.py +0 -0
  126. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/run_info_store.py +0 -0
  127. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/client/typing.py +0 -0
  128. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/__init__.py +0 -0
  129. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/client_app.py +0 -0
  130. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/mod/__init__.py +0 -0
  131. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  132. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  133. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/typing.py +0 -0
  134. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/clientapp/utils.py +0 -0
  135. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/__init__.py +0 -0
  136. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/address.py +0 -0
  137. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/args.py +0 -0
  138. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/config.py +0 -0
  139. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/context.py +0 -0
  140. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/date.py +0 -0
  141. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/differential_privacy.py +0 -0
  142. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/differential_privacy_constants.py +0 -0
  143. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/dp.py +0 -0
  144. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  145. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  146. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/exit/__init__.py +0 -0
  147. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/exit/exit.py +0 -0
  148. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/exit/exit_code.py +0 -0
  149. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/exit/exit_handler.py +0 -0
  150. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/exit/signal_handler.py +0 -0
  151. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/grpc.py +0 -0
  152. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/heartbeat.py +0 -0
  153. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/inflatable.py +0 -0
  154. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  155. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/inflatable_utils.py +0 -0
  156. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/logger.py +0 -0
  157. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/message.py +0 -0
  158. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/object_ref.py +0 -0
  159. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/parameter.py +0 -0
  160. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/pyproject.py +0 -0
  161. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/__init__.py +0 -0
  162. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/array.py +0 -0
  163. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/arraychunk.py +0 -0
  164. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/arrayrecord.py +0 -0
  165. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/configrecord.py +0 -0
  166. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/conversion_utils.py +0 -0
  167. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/metricrecord.py +0 -0
  168. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/recorddict.py +0 -0
  169. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/record/typeddict.py +0 -0
  170. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/recorddict_compat.py +0 -0
  171. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/retry_invoker.py +0 -0
  172. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  173. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  174. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  175. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  176. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  177. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  178. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  179. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  180. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/serde.py +0 -0
  181. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/serde_utils.py +0 -0
  182. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/telemetry.py +0 -0
  183. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/typing.py +0 -0
  184. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/common/version.py +0 -0
  185. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/__init__.py +0 -0
  186. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/client/__init__.py +0 -0
  187. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/client/app.py +0 -0
  188. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  189. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  190. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/common/__init__.py +0 -0
  191. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/server/__init__.py +0 -0
  192. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/server/app.py +0 -0
  193. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/compat/simulation/__init__.py +0 -0
  194. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/__init__.py +0 -0
  195. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/appio_pb2.py +0 -0
  196. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/appio_pb2.pyi +0 -0
  197. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/clientappio_pb2.py +0 -0
  200. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  201. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/control_pb2.py +0 -0
  204. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/control_pb2.pyi +0 -0
  205. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/control_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/error_pb2.py +0 -0
  208. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/error_pb2.pyi +0 -0
  209. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/error_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fab_pb2.py +0 -0
  212. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fab_pb2.pyi +0 -0
  213. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fleet_pb2.py +0 -0
  216. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fleet_pb2.pyi +0 -0
  217. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  220. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  221. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/heartbeat_pb2.py +0 -0
  224. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  225. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  226. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  227. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/log_pb2.py +0 -0
  228. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/log_pb2.pyi +0 -0
  229. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/log_pb2_grpc.py +0 -0
  230. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  231. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/message_pb2.py +0 -0
  232. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/message_pb2.pyi +0 -0
  233. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/message_pb2_grpc.py +0 -0
  234. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  235. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/node_pb2.py +0 -0
  236. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/node_pb2.pyi +0 -0
  237. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/node_pb2_grpc.py +0 -0
  238. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  239. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/recorddict_pb2.py +0 -0
  240. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  241. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  242. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  243. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/run_pb2.py +0 -0
  244. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/run_pb2.pyi +0 -0
  245. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/run_pb2_grpc.py +0 -0
  246. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  247. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/serverappio_pb2.py +0 -0
  248. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  249. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  250. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  251. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/simulationio_pb2.py +0 -0
  252. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  253. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  254. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  255. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/transport_pb2.py +0 -0
  256. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/transport_pb2.pyi +0 -0
  257. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  258. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  259. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/py.typed +0 -0
  260. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/__init__.py +0 -0
  261. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/client_manager.py +0 -0
  262. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/client_proxy.py +0 -0
  263. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/compat/__init__.py +0 -0
  264. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/compat/app.py +0 -0
  265. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/compat/app_utils.py +0 -0
  266. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  267. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/compat/legacy_context.py +0 -0
  268. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/criterion.py +0 -0
  269. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  270. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/grid/__init__.py +0 -0
  271. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/grid/grid.py +0 -0
  272. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/grid/grpc_grid.py +0 -0
  273. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/grid/inmemory_grid.py +0 -0
  274. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/history.py +0 -0
  275. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/run_serverapp.py +0 -0
  276. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/server.py +0 -0
  277. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/server_app.py +0 -0
  278. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/server_config.py +0 -0
  279. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/serverapp/__init__.py +0 -0
  280. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/serverapp/app.py +0 -0
  281. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/serverapp_components.py +0 -0
  282. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/__init__.py +0 -0
  283. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/aggregate.py +0 -0
  284. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/bulyan.py +0 -0
  285. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  286. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  287. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  288. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  289. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  290. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedadagrad.py +0 -0
  291. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedadam.py +0 -0
  292. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedavg.py +0 -0
  293. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedavg_android.py +0 -0
  294. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedavgm.py +0 -0
  295. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedmedian.py +0 -0
  296. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedopt.py +0 -0
  297. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedprox.py +0 -0
  298. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  299. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  300. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  301. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  302. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/fedyogi.py +0 -0
  303. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/krum.py +0 -0
  304. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/qfedavg.py +0 -0
  305. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/strategy/strategy.py +0 -0
  306. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/__init__.py +0 -0
  307. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  308. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  309. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  310. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  311. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  312. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  313. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  314. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  315. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  316. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  317. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  318. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  319. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  320. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  321. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  322. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  323. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  324. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  325. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  326. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  327. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  328. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  329. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  330. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  331. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  332. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  333. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  334. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/superlink/utils.py +0 -0
  335. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/typing.py +0 -0
  336. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/utils/__init__.py +0 -0
  337. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/utils/tensorboard.py +0 -0
  338. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/utils/validator.py +0 -0
  339. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/__init__.py +0 -0
  340. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/constant.py +0 -0
  341. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/default_workflows.py +0 -0
  342. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  343. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  344. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  345. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/__init__.py +0 -0
  346. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/exception.py +0 -0
  347. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/__init__.py +0 -0
  348. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  349. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  350. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  351. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  352. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  353. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  354. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  355. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  356. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  357. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  358. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  359. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  360. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  361. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  362. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/krum.py +0 -0
  363. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  364. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  365. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/result.py +0 -0
  366. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/strategy.py +0 -0
  367. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  368. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/__init__.py +0 -0
  369. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/app.py +0 -0
  370. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/legacy_app.py +0 -0
  371. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  372. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  373. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  374. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/ray_transport/utils.py +0 -0
  375. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/run_simulation.py +0 -0
  376. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/simulation/simulationio_connection.py +0 -0
  377. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/__init__.py +0 -0
  378. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/app_utils.py +0 -0
  379. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/cli/__init__.py +0 -0
  380. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  381. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/constant.py +0 -0
  382. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/corestate/__init__.py +0 -0
  383. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/corestate/corestate.py +0 -0
  384. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/ffs/__init__.py +0 -0
  385. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  386. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/ffs/ffs.py +0 -0
  387. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  388. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  389. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  390. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  391. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  392. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  393. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/object_store/__init__.py +0 -0
  394. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  395. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/object_store/object_store.py +0 -0
  396. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  397. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/object_store/utils.py +0 -0
  398. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/primitives/__init__.py +0 -0
  399. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/primitives/asymmetric.py +0 -0
  400. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/__init__.py +0 -0
  401. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  402. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  403. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  404. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  405. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  406. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  407. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  408. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supercore/utils.py +0 -0
  409. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/__init__.py +0 -0
  410. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  411. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  412. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  413. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  414. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  415. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/__init__.py +0 -0
  416. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  417. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  418. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  419. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  420. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  421. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  422. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/__init__.py +0 -0
  423. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/cli/__init__.py +0 -0
  424. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  425. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  426. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/nodestate/__init__.py +0 -0
  427. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  428. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  429. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  430. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/runtime/__init__.py +0 -0
  431. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  432. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/servicer/__init__.py +0 -0
  433. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  434. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  435. {flwr_nightly-1.23.0.dev20251011 → flwr_nightly-1.23.0.dev20251014}/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.dev20251011
3
+ Version: 1.23.0.dev20251014
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
@@ -157,6 +157,7 @@ RUN_ID_NOT_FOUND_MESSAGE = "Run ID not found"
157
157
  NO_ACCOUNT_AUTH_MESSAGE = "ControlServicer initialized without account authentication"
158
158
  NO_ARTIFACT_PROVIDER_MESSAGE = "ControlServicer initialized without artifact provider"
159
159
  PULL_UNFINISHED_RUN_MESSAGE = "Cannot pull artifacts for an unfinished run"
160
+ SUPERNODE_NOT_CREATED_FROM_CLI_MESSAGE = "Invalid SuperNode credentials"
160
161
  PUBLIC_KEY_ALREADY_IN_USE_MESSAGE = "Public key already in use"
161
162
  PUBLIC_KEY_NOT_VALID = "The provided public key is not valid"
162
163
  NODE_NOT_FOUND_MESSAGE = "Node ID not found for account"
@@ -16,22 +16,19 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import csv
20
19
  import importlib.util
21
20
  import os
22
21
  import subprocess
23
22
  import sys
24
23
  import threading
25
24
  from collections.abc import Sequence
26
- from logging import DEBUG, INFO, WARN
25
+ from logging import INFO, WARN
27
26
  from pathlib import Path
28
27
  from time import sleep
29
28
  from typing import Callable, Optional, TypeVar, cast
30
29
 
31
30
  import grpc
32
31
  import yaml
33
- from cryptography.hazmat.primitives.asymmetric import ec
34
- from cryptography.hazmat.primitives.serialization import load_ssh_public_key
35
32
 
36
33
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
37
34
  from flwr.common.address import parse_address
@@ -61,6 +58,7 @@ from flwr.common.event_log_plugin import EventLogWriterPlugin
61
58
  from flwr.common.exit import ExitCode, flwr_exit, register_signal_handlers
62
59
  from flwr.common.grpc import generic_create_grpc_server
63
60
  from flwr.common.logger import log
61
+ from flwr.common.version import package_version
64
62
  from flwr.proto.fleet_pb2_grpc import ( # pylint: disable=E0611
65
63
  add_FleetServicer_to_server,
66
64
  )
@@ -69,7 +67,6 @@ from flwr.server.fleet_event_log_interceptor import FleetEventLogInterceptor
69
67
  from flwr.supercore.ffs import FfsFactory
70
68
  from flwr.supercore.grpc_health import add_args_health, run_health_server_grpc_no_tls
71
69
  from flwr.supercore.object_store import ObjectStoreFactory
72
- from flwr.supercore.primitives.asymmetric import public_key_to_bytes
73
70
  from flwr.superlink.artifact_provider import ArtifactProvider
74
71
  from flwr.superlink.auth_plugin import (
75
72
  ControlAuthnPlugin,
@@ -214,6 +211,27 @@ def run_superlink() -> None:
214
211
  log(WARN, "The `--artifact-provider-config` flag is highly experimental.")
215
212
  artifact_provider = get_ee_artifact_provider(cfg_path)
216
213
 
214
+ # If supernode authentication is disabled, warn users
215
+ enable_supernode_auth: bool = args.enable_supernode_auth
216
+ if not enable_supernode_auth:
217
+ log(
218
+ WARN,
219
+ "SuperNode authentication is disabled. The SuperLink will accept "
220
+ "connections from any SuperNode.",
221
+ )
222
+
223
+ if args.auth_list_public_keys:
224
+ url_v = f"https://flower.ai/docs/framework/v{package_version}/en/"
225
+ page = "how-to-authenticate-supernodes.html"
226
+ flwr_exit(
227
+ ExitCode.SUPERLINK_INVALID_ARGS,
228
+ "The `--auth-list-public-keys` "
229
+ "argument is no longer supported. To enable SuperNode authentication, "
230
+ "use the `--enable-supernode-auth` flag and use the Flower CLI to register "
231
+ "SuperNodes by supplying their public keys. Please refer"
232
+ f" to the Flower documentation for more information: {url_v}{page}",
233
+ )
234
+
217
235
  # Initialize StateFactory
218
236
  state_factory = LinkStateFactory(args.database)
219
237
 
@@ -309,22 +327,8 @@ def run_superlink() -> None:
309
327
  fleet_thread.start()
310
328
  bckg_threads.append(fleet_thread)
311
329
  elif args.fleet_api_type == TRANSPORT_TYPE_GRPC_RERE:
312
- node_public_keys = _try_load_public_keys_node_authentication(args)
313
- auto_auth = True
314
- if node_public_keys is not None:
315
- auto_auth = False
316
- state = state_factory.state()
317
- state.clear_supernode_auth_keys()
318
- state.store_node_public_keys(node_public_keys)
319
- log(
320
- INFO,
321
- "Node authentication enabled with %d known public keys",
322
- len(node_public_keys),
323
- )
324
- else:
325
- log(DEBUG, "Automatic node authentication enabled")
326
330
 
327
- interceptors = [NodeAuthServerInterceptor(state_factory, auto_auth)]
331
+ interceptors = [NodeAuthServerInterceptor(state_factory)]
328
332
  if getattr(args, "enable_event_log", None):
329
333
  fleet_log_plugin = _try_obtain_fleet_event_log_writer_plugin()
330
334
  if fleet_log_plugin is not None:
@@ -336,6 +340,7 @@ def run_superlink() -> None:
336
340
  state_factory=state_factory,
337
341
  ffs_factory=ffs_factory,
338
342
  objectstore_factory=objectstore_factory,
343
+ enable_supernode_auth=enable_supernode_auth,
339
344
  certificates=certificates,
340
345
  interceptors=interceptors,
341
346
  )
@@ -346,6 +351,7 @@ def run_superlink() -> None:
346
351
  state_factory=state_factory,
347
352
  ffs_factory=ffs_factory,
348
353
  objectstore_factory=objectstore_factory,
354
+ enable_supernode_auth=enable_supernode_auth,
349
355
  certificates=certificates,
350
356
  )
351
357
  grpc_servers.append(fleet_server)
@@ -403,48 +409,6 @@ def _format_address(address: str) -> tuple[str, str, int]:
403
409
  return (f"[{host}]:{port}" if is_v6 else f"{host}:{port}", host, port)
404
410
 
405
411
 
406
- def _try_load_public_keys_node_authentication(
407
- args: argparse.Namespace,
408
- ) -> Optional[set[bytes]]:
409
- """Return a set of node public keys."""
410
- if args.auth_superlink_private_key or args.auth_superlink_public_key:
411
- log(
412
- WARN,
413
- "The `--auth-superlink-private-key` and `--auth-superlink-public-key` "
414
- "arguments are deprecated and will be removed in a future release. Node "
415
- "authentication no longer requires these arguments.",
416
- )
417
-
418
- if not args.auth_list_public_keys:
419
- return None
420
-
421
- node_keys_file_path = Path(args.auth_list_public_keys)
422
- if not node_keys_file_path.exists():
423
- sys.exit(
424
- "The provided path to the known public keys CSV file does not exist: "
425
- f"{node_keys_file_path}. "
426
- "Please provide the CSV file path containing known public keys "
427
- "to '--auth-list-public-keys'."
428
- )
429
-
430
- node_public_keys: set[bytes] = set()
431
-
432
- with open(node_keys_file_path, newline="", encoding="utf-8") as csvfile:
433
- reader = csv.reader(csvfile)
434
- for row in reader:
435
- for element in row:
436
- public_key = load_ssh_public_key(element.encode())
437
- if isinstance(public_key, ec.EllipticCurvePublicKey):
438
- node_public_keys.add(public_key_to_bytes(public_key))
439
- else:
440
- sys.exit(
441
- "Error: Unable to parse the public keys in the CSV "
442
- "file. Please ensure that the CSV file path points to a valid "
443
- "known SSH public keys files and try again."
444
- )
445
- return node_public_keys
446
-
447
-
448
412
  def _load_control_auth_plugins(
449
413
  config_path: Optional[str], verify_tls_cert: bool
450
414
  ) -> tuple[ControlAuthnPlugin, ControlAuthzPlugin]:
@@ -538,6 +502,7 @@ def _run_fleet_api_grpc_rere( # pylint: disable=R0913, R0917
538
502
  state_factory: LinkStateFactory,
539
503
  ffs_factory: FfsFactory,
540
504
  objectstore_factory: ObjectStoreFactory,
505
+ enable_supernode_auth: bool,
541
506
  certificates: Optional[tuple[bytes, bytes, bytes]],
542
507
  interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None,
543
508
  ) -> grpc.Server:
@@ -547,6 +512,7 @@ def _run_fleet_api_grpc_rere( # pylint: disable=R0913, R0917
547
512
  state_factory=state_factory,
548
513
  ffs_factory=ffs_factory,
549
514
  objectstore_factory=objectstore_factory,
515
+ enable_supernode_auth=enable_supernode_auth,
550
516
  )
551
517
  fleet_add_servicer_to_server_fn = add_FleetServicer_to_server
552
518
  fleet_grpc_server = generic_create_grpc_server(
@@ -565,11 +531,13 @@ def _run_fleet_api_grpc_rere( # pylint: disable=R0913, R0917
565
531
  return fleet_grpc_server
566
532
 
567
533
 
534
+ # pylint: disable=R0913, R0917
568
535
  def _run_fleet_api_grpc_adapter(
569
536
  address: str,
570
537
  state_factory: LinkStateFactory,
571
538
  ffs_factory: FfsFactory,
572
539
  objectstore_factory: ObjectStoreFactory,
540
+ enable_supernode_auth: bool,
573
541
  certificates: Optional[tuple[bytes, bytes, bytes]],
574
542
  ) -> grpc.Server:
575
543
  """Run Fleet API (GrpcAdapter)."""
@@ -578,6 +546,7 @@ def _run_fleet_api_grpc_adapter(
578
546
  state_factory=state_factory,
579
547
  ffs_factory=ffs_factory,
580
548
  objectstore_factory=objectstore_factory,
549
+ enable_supernode_auth=enable_supernode_auth,
581
550
  )
582
551
  fleet_add_servicer_to_server_fn = add_GrpcAdapterServicer_to_server
583
552
  fleet_grpc_server = generic_create_grpc_server(
@@ -722,18 +691,12 @@ def _add_args_common(parser: argparse.ArgumentParser) -> None:
722
691
  parser.add_argument(
723
692
  "--auth-list-public-keys",
724
693
  type=str,
725
- help="A CSV file (as a path str) containing a list of known public "
726
- "keys to enable authentication.",
727
- )
728
- parser.add_argument(
729
- "--auth-superlink-private-key",
730
- type=str,
731
694
  help="This argument is deprecated and will be removed in a future release.",
732
695
  )
733
696
  parser.add_argument(
734
- "--auth-superlink-public-key",
735
- type=str,
736
- help="This argument is deprecated and will be removed in a future release.",
697
+ "--enable-supernode-auth",
698
+ action="store_true",
699
+ help="Enable supernode authentication.",
737
700
  )
738
701
 
739
702
 
@@ -15,11 +15,12 @@
15
15
  """Fleet API gRPC request-response servicer."""
16
16
 
17
17
 
18
- from logging import DEBUG, INFO
18
+ from logging import DEBUG, ERROR, INFO
19
19
 
20
20
  import grpc
21
21
  from google.protobuf.json_format import MessageToDict
22
22
 
23
+ from flwr.common.constant import SUPERNODE_NOT_CREATED_FROM_CLI_MESSAGE
23
24
  from flwr.common.inflatable import UnexpectedObjectContentError
24
25
  from flwr.common.logger import log
25
26
  from flwr.common.typing import InvalidRunStatusException
@@ -47,6 +48,7 @@ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
47
48
  PushObjectRequest,
48
49
  PushObjectResponse,
49
50
  )
51
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
50
52
  from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
51
53
  from flwr.server.superlink.fleet.message_handler import message_handler
52
54
  from flwr.server.superlink.linkstate import LinkStateFactory
@@ -63,10 +65,12 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
63
65
  state_factory: LinkStateFactory,
64
66
  ffs_factory: FfsFactory,
65
67
  objectstore_factory: ObjectStoreFactory,
68
+ enable_supernode_auth: bool,
66
69
  ) -> None:
67
70
  self.state_factory = state_factory
68
71
  self.ffs_factory = ffs_factory
69
72
  self.objectstore_factory = objectstore_factory
73
+ self.enable_supernode_auth = enable_supernode_auth
70
74
 
71
75
  def CreateNode(
72
76
  self, request: CreateNodeRequest, context: grpc.ServicerContext
@@ -79,10 +83,28 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
79
83
  )
80
84
  log(DEBUG, "[Fleet.CreateNode] Request: %s", MessageToDict(request))
81
85
  try:
82
- response = message_handler.create_node(
83
- request=request,
84
- state=self.state_factory.state(),
85
- )
86
+
87
+ state = self.state_factory.state()
88
+
89
+ # Check if public key is already in use
90
+ if node_id := state.get_node_id_by_public_key(request.public_key):
91
+ # Prepare response with existing node_id
92
+ response = CreateNodeResponse(node=Node(node_id=node_id))
93
+ else:
94
+ if self.enable_supernode_auth:
95
+ # When SuperNode authentication is enabled,
96
+ # only SuperNodes created from the CLI are allowed to
97
+ # stablish a connection with the Fleet API
98
+ log(ERROR, SUPERNODE_NOT_CREATED_FROM_CLI_MESSAGE)
99
+ raise ValueError(SUPERNODE_NOT_CREATED_FROM_CLI_MESSAGE)
100
+
101
+ # When SuperNode authentication is disabled, auto-auth
102
+ # allows creating a new node
103
+ response = message_handler.create_node(
104
+ request=request,
105
+ state=state,
106
+ )
107
+
86
108
  except ValueError as e:
87
109
  # Public key already in use
88
110
  context.abort(grpc.StatusCode.FAILED_PRECONDITION, str(e))
@@ -96,6 +118,18 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
96
118
  """."""
97
119
  log(INFO, "[Fleet.DeleteNode] Delete node_id=%s", request.node.node_id)
98
120
  log(DEBUG, "[Fleet.DeleteNode] Request: %s", MessageToDict(request))
121
+ # This shall be refactored when renaming `Fleet.Create/DeleteNode`
122
+ # to `Fleet.Activate/DeactivateNode`
123
+ if self.enable_supernode_auth:
124
+ # SuperNodes can only be deleted from the CLI
125
+ # We simply acknowledge the heartbeat with interval 0
126
+ # to mark the node as offline
127
+ state = self.state_factory.state()
128
+ state.acknowledge_node_heartbeat(
129
+ node_id=request.node.node_id, heartbeat_interval=0
130
+ )
131
+ return DeleteNodeResponse()
132
+
99
133
  return message_handler.delete_node(
100
134
  request=request,
101
135
  state=self.state_factory.state(),
@@ -54,15 +54,10 @@ class NodeAuthServerInterceptor(grpc.ServerInterceptor): # type: ignore
54
54
  ----------
55
55
  state_factory : LinkStateFactory
56
56
  A factory for creating new instances of LinkState.
57
- auto_auth : bool (default: False)
58
- If True, nodes are authenticated without requiring their public keys to be
59
- pre-stored in the LinkState. If False, only nodes with pre-stored public keys
60
- can be authenticated.
61
57
  """
62
58
 
63
- def __init__(self, state_factory: LinkStateFactory, auto_auth: bool = False):
59
+ def __init__(self, state_factory: LinkStateFactory):
64
60
  self.state_factory = state_factory
65
- self.auto_auth = auto_auth
66
61
 
67
62
  def intercept_service( # pylint: disable=too-many-return-statements
68
63
  self,
@@ -79,7 +74,6 @@ class NodeAuthServerInterceptor(grpc.ServerInterceptor): # type: ignore
79
74
  if not handler_call_details.method.startswith("/flwr.proto.Fleet/"):
80
75
  return continuation(handler_call_details)
81
76
 
82
- state = self.state_factory.state()
83
77
  metadata_dict = dict(handler_call_details.invocation_metadata)
84
78
 
85
79
  # Retrieve info from the metadata
@@ -90,11 +84,6 @@ class NodeAuthServerInterceptor(grpc.ServerInterceptor): # type: ignore
90
84
  except KeyError:
91
85
  return _unary_unary_rpc_terminator("Missing authentication metadata")
92
86
 
93
- if not self.auto_auth:
94
- # Abort the RPC call if the node public key is not found
95
- if node_pk_bytes not in state.get_node_public_keys():
96
- return _unary_unary_rpc_terminator("Public key not recognized")
97
-
98
87
  # Verify the signature
99
88
  node_pk = bytes_to_public_key(node_pk_bytes)
100
89
  if not verify_signature(node_pk, timestamp_iso.encode("ascii"), signature):
@@ -21,7 +21,7 @@ from bisect import bisect_right
21
21
  from collections import defaultdict
22
22
  from collections.abc import Sequence
23
23
  from dataclasses import dataclass, field
24
- from datetime import datetime
24
+ from datetime import datetime, timezone
25
25
  from logging import ERROR, WARNING
26
26
  from typing import Optional
27
27
 
@@ -74,7 +74,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
74
74
 
75
75
  # Map node_id to NodeInfo
76
76
  self.nodes: dict[int, NodeInfo] = {}
77
- self.registered_node_public_keys: set[bytes] = set()
77
+ self.node_public_key_to_node_id: dict[bytes, int] = {}
78
78
  self.owner_to_node_ids: dict[str, set[int]] = {} # Quick lookup
79
79
 
80
80
  # Map run_id to RunRecord
@@ -346,7 +346,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
346
346
  if node_id in self.nodes:
347
347
  log(ERROR, "Unexpected node registration failure.")
348
348
  return 0
349
- if public_key in self.registered_node_public_keys:
349
+ if public_key in self.node_public_key_to_node_id:
350
350
  raise ValueError("Public key already in use")
351
351
 
352
352
  # The node is not activated upon creation
@@ -362,7 +362,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
362
362
  heartbeat_interval=heartbeat_interval,
363
363
  public_key=public_key,
364
364
  )
365
- self.registered_node_public_keys.add(public_key)
365
+ self.node_public_key_to_node_id[public_key] = node_id
366
366
  self.owner_to_node_ids.setdefault(owner_aid, set()).add(node_id)
367
367
  return node_id
368
368
 
@@ -428,7 +428,7 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
428
428
  if node.online_until <= current_ts:
429
429
  node.status = NodeStatus.OFFLINE
430
430
  node.last_deactivated_at = datetime.fromtimestamp(
431
- node.online_until
431
+ node.online_until, tz=timezone.utc
432
432
  ).isoformat()
433
433
 
434
434
  def get_node_public_key(self, node_id: int) -> bytes:
@@ -440,6 +440,11 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
440
440
  raise ValueError(f"Node ID {node_id} not found")
441
441
  return node.public_key
442
442
 
443
+ def get_node_id_by_public_key(self, public_key: bytes) -> Optional[int]:
444
+ """Get `node_id` for the specified `public_key`."""
445
+ with self.lock:
446
+ return self.node_public_key_to_node_id.get(public_key)
447
+
443
448
  # pylint: disable=too-many-arguments,too-many-positional-arguments
444
449
  def create_run(
445
450
  self,
@@ -486,26 +491,6 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
486
491
  log(ERROR, "Unexpected run creation failure.")
487
492
  return 0
488
493
 
489
- def clear_supernode_auth_keys(self) -> None:
490
- """Clear stored `node_public_keys` in the link state if any."""
491
- with self.lock:
492
- self.node_public_keys.clear()
493
-
494
- def store_node_public_keys(self, public_keys: set[bytes]) -> None:
495
- """Store a set of `node_public_keys` in the link state."""
496
- with self.lock:
497
- self.node_public_keys.update(public_keys)
498
-
499
- def store_node_public_key(self, public_key: bytes) -> None:
500
- """Store a `node_public_key` in the link state."""
501
- with self.lock:
502
- self.node_public_keys.add(public_key)
503
-
504
- def get_node_public_keys(self) -> set[bytes]:
505
- """Retrieve all currently stored `node_public_keys` as a set."""
506
- with self.lock:
507
- return self.node_public_keys.copy()
508
-
509
494
  def get_run_ids(self, flwr_aid: Optional[str]) -> set[int]:
510
495
  """Retrieve all run IDs if `flwr_aid` is not specified.
511
496
 
@@ -149,6 +149,21 @@ class LinkState(CoreState): # pylint: disable=R0904
149
149
  an empty `Set` MUST be returned.
150
150
  """
151
151
 
152
+ @abc.abstractmethod
153
+ def get_node_id_by_public_key(self, public_key: bytes) -> Optional[int]:
154
+ """Get `node_id` for the specified `public_key`.
155
+
156
+ Parameters
157
+ ----------
158
+ public_key : bytes
159
+ The public key of the node whose information is to be retrieved.
160
+
161
+ Returns
162
+ -------
163
+ Optional[int]
164
+ The `node_id` associated with the specified `public_key`.
165
+ """
166
+
152
167
  @abc.abstractmethod
153
168
  def get_node_info(
154
169
  self,
@@ -298,22 +313,6 @@ class LinkState(CoreState): # pylint: disable=R0904
298
313
  The federation options for the run if it exists; None otherwise.
299
314
  """
300
315
 
301
- @abc.abstractmethod
302
- def clear_supernode_auth_keys(self) -> None:
303
- """Clear stored `node_public_keys` in the link state if any."""
304
-
305
- @abc.abstractmethod
306
- def store_node_public_keys(self, public_keys: set[bytes]) -> None:
307
- """Store a set of `node_public_keys` in the link state."""
308
-
309
- @abc.abstractmethod
310
- def store_node_public_key(self, public_key: bytes) -> None:
311
- """Store a `node_public_key` in the link state."""
312
-
313
- @abc.abstractmethod
314
- def get_node_public_keys(self) -> set[bytes]:
315
- """Retrieve all currently stored `node_public_keys` as a set."""
316
-
317
316
  @abc.abstractmethod
318
317
  def acknowledge_node_heartbeat(
319
318
  self, node_id: int, heartbeat_interval: float
@@ -784,6 +784,19 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
784
784
  # Return the public key
785
785
  return cast(bytes, rows[0]["public_key"])
786
786
 
787
+ def get_node_id_by_public_key(self, public_key: bytes) -> Optional[int]:
788
+ """Get `node_id` for the specified `public_key`."""
789
+ query = "SELECT node_id FROM node WHERE public_key = ? AND status != ?;"
790
+ rows = self.query(query, (public_key, NodeStatus.DELETED))
791
+
792
+ # If no result is found, return None
793
+ if not rows:
794
+ return None
795
+
796
+ # Convert sint64 node_id to uint64
797
+ node_id = convert_sint64_to_uint64(rows[0]["node_id"])
798
+ return node_id
799
+
787
800
  # pylint: disable=too-many-arguments,too-many-positional-arguments
788
801
  def create_run(
789
802
  self,
@@ -835,28 +848,6 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
835
848
  log(ERROR, "Unexpected run creation failure.")
836
849
  return 0
837
850
 
838
- def clear_supernode_auth_keys(self) -> None:
839
- """Clear stored `node_public_keys` in the link state if any."""
840
- self.query("DELETE FROM public_key;")
841
-
842
- def store_node_public_keys(self, public_keys: set[bytes]) -> None:
843
- """Store a set of `node_public_keys` in the link state."""
844
- query = "INSERT INTO public_key (public_key) VALUES (?)"
845
- data = [(key,) for key in public_keys]
846
- self.query(query, data)
847
-
848
- def store_node_public_key(self, public_key: bytes) -> None:
849
- """Store a `node_public_key` in the link state."""
850
- query = "INSERT INTO public_key (public_key) VALUES (:public_key)"
851
- self.query(query, {"public_key": public_key})
852
-
853
- def get_node_public_keys(self) -> set[bytes]:
854
- """Retrieve all currently stored `node_public_keys` as a set."""
855
- query = "SELECT public_key FROM public_key"
856
- rows = self.query(query)
857
- result: set[bytes] = {row["public_key"] for row in rows}
858
- return result
859
-
860
851
  def get_run_ids(self, flwr_aid: Optional[str]) -> set[int]:
861
852
  """Retrieve all run IDs if `flwr_aid` is not specified.
862
853
 
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.23.0.dev20251011"
7
+ version = "1.23.0.dev20251014"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]