flwr-nightly 1.23.0.dev20251008__tar.gz → 1.23.0.dev20251009__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.
Files changed (437) hide show
  1. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/PKG-INFO +1 -1
  2. flwr_nightly-1.23.0.dev20251009/py/flwr/cli/supernode/create.py +184 -0
  3. flwr_nightly-1.23.0.dev20251009/py/flwr/cli/supernode/delete.py +136 -0
  4. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/utils.py +37 -11
  5. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/constant.py +3 -0
  6. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/control_pb2.py +1 -1
  7. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/control_pb2.pyi +2 -2
  8. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/node_pb2.py +2 -2
  9. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/node_pb2.pyi +4 -1
  10. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
  11. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/vce/vce_api.py +4 -1
  12. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +22 -36
  13. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/linkstate.py +20 -10
  14. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +19 -42
  15. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/primitives/asymmetric.py +8 -0
  16. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/control_servicer.py +55 -2
  17. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/pyproject.toml +1 -1
  18. flwr_nightly-1.23.0.dev20251008/py/flwr/cli/supernode/create.py +0 -58
  19. flwr_nightly-1.23.0.dev20251008/py/flwr/cli/supernode/delete.py +0 -58
  20. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/README.md +0 -0
  21. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/__init__.py +0 -0
  22. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/app/__init__.py +0 -0
  23. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/app/error.py +0 -0
  24. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/app/exception.py +0 -0
  25. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/app/metadata.py +0 -0
  26. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/__init__.py +0 -0
  27. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/app.py +0 -0
  28. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  29. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  30. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  31. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  32. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/build.py +0 -0
  33. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  34. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/config_utils.py +0 -0
  35. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/constant.py +0 -0
  36. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/example.py +0 -0
  37. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/install.py +0 -0
  38. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/log.py +0 -0
  39. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/login/__init__.py +0 -0
  40. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/login/login.py +0 -0
  41. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/ls.py +0 -0
  42. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/__init__.py +0 -0
  43. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/new.py +0 -0
  44. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/__init__.py +0 -0
  45. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  46. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  47. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  48. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  49. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  50. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  51. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  53. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  54. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
  55. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  57. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  58. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  59. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  60. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  61. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
  62. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  63. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  64. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -0
  65. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  67. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  68. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  69. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  70. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  71. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  72. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  75. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  76. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  77. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  78. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  79. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
  80. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -0
  83. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  84. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  85. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  86. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  87. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  88. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  89. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
  90. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  91. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  92. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -0
  93. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  94. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  95. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  96. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  97. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  98. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  99. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  100. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  101. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
  102. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  103. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  104. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -0
  105. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/pull.py +0 -0
  106. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/run/__init__.py +0 -0
  107. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/run/run.py +0 -0
  108. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/stop.py +0 -0
  109. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/supernode/__init__.py +0 -0
  110. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/cli/supernode/ls.py +0 -0
  111. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/__init__.py +0 -0
  112. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/client.py +0 -0
  113. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  114. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  115. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  116. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  117. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  118. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  119. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  120. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/message_handler/__init__.py +0 -0
  121. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/message_handler/message_handler.py +0 -0
  122. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/__init__.py +0 -0
  123. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/centraldp_mods.py +0 -0
  124. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/comms_mods.py +0 -0
  125. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/localdp_mod.py +0 -0
  126. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  127. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  128. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  129. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/mod/utils.py +0 -0
  130. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/numpy_client.py +0 -0
  131. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/rest_client/__init__.py +0 -0
  132. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/rest_client/connection.py +0 -0
  133. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/run_info_store.py +0 -0
  134. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/client/typing.py +0 -0
  135. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/__init__.py +0 -0
  136. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/client_app.py +0 -0
  137. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/mod/__init__.py +0 -0
  138. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  139. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  140. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/typing.py +0 -0
  141. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/clientapp/utils.py +0 -0
  142. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/__init__.py +0 -0
  143. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/address.py +0 -0
  144. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/args.py +0 -0
  145. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/config.py +0 -0
  146. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/context.py +0 -0
  147. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/date.py +0 -0
  148. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/differential_privacy.py +0 -0
  149. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/differential_privacy_constants.py +0 -0
  150. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/dp.py +0 -0
  151. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  152. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  153. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/exit/__init__.py +0 -0
  154. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/exit/exit.py +0 -0
  155. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/exit/exit_code.py +0 -0
  156. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/exit/exit_handler.py +0 -0
  157. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/exit/signal_handler.py +0 -0
  158. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/grpc.py +0 -0
  159. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/heartbeat.py +0 -0
  160. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/inflatable.py +0 -0
  161. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  162. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/inflatable_utils.py +0 -0
  163. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/logger.py +0 -0
  164. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/message.py +0 -0
  165. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/object_ref.py +0 -0
  166. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/parameter.py +0 -0
  167. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/pyproject.py +0 -0
  168. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/__init__.py +0 -0
  169. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/array.py +0 -0
  170. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/arraychunk.py +0 -0
  171. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/arrayrecord.py +0 -0
  172. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/configrecord.py +0 -0
  173. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/conversion_utils.py +0 -0
  174. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/metricrecord.py +0 -0
  175. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/recorddict.py +0 -0
  176. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/record/typeddict.py +0 -0
  177. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/recorddict_compat.py +0 -0
  178. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/retry_invoker.py +0 -0
  179. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  180. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  181. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  182. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  183. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  184. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  185. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  186. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  187. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/serde.py +0 -0
  188. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/serde_utils.py +0 -0
  189. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/telemetry.py +0 -0
  190. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/typing.py +0 -0
  191. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/common/version.py +0 -0
  192. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/__init__.py +0 -0
  193. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/client/__init__.py +0 -0
  194. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/client/app.py +0 -0
  195. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  196. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  197. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/common/__init__.py +0 -0
  198. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/server/__init__.py +0 -0
  199. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/server/app.py +0 -0
  200. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/compat/simulation/__init__.py +0 -0
  201. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/__init__.py +0 -0
  202. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/appio_pb2.py +0 -0
  203. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/appio_pb2.pyi +0 -0
  204. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/clientappio_pb2.py +0 -0
  207. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  208. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/control_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/error_pb2.py +0 -0
  213. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/error_pb2.pyi +0 -0
  214. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/error_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fab_pb2.py +0 -0
  217. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fab_pb2.pyi +0 -0
  218. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fleet_pb2.py +0 -0
  221. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fleet_pb2.pyi +0 -0
  222. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  225. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  226. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/heartbeat_pb2.py +0 -0
  229. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  230. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/log_pb2.py +0 -0
  233. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/log_pb2.pyi +0 -0
  234. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/log_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/message_pb2.py +0 -0
  237. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/message_pb2.pyi +0 -0
  238. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/message_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/node_pb2_grpc.py +0 -0
  241. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  242. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/recorddict_pb2.py +0 -0
  243. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  244. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  245. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  246. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/run_pb2.py +0 -0
  247. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/run_pb2.pyi +0 -0
  248. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/run_pb2_grpc.py +0 -0
  249. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  250. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/serverappio_pb2.py +0 -0
  251. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  252. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  253. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  254. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/simulationio_pb2.py +0 -0
  255. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  256. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  257. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  258. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/transport_pb2.py +0 -0
  259. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/transport_pb2.pyi +0 -0
  260. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  261. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  262. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/py.typed +0 -0
  263. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/__init__.py +0 -0
  264. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/app.py +0 -0
  265. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/client_manager.py +0 -0
  266. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/client_proxy.py +0 -0
  267. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/compat/__init__.py +0 -0
  268. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/compat/app.py +0 -0
  269. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/compat/app_utils.py +0 -0
  270. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  271. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/compat/legacy_context.py +0 -0
  272. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/criterion.py +0 -0
  273. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  274. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/grid/__init__.py +0 -0
  275. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/grid/grid.py +0 -0
  276. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/grid/grpc_grid.py +0 -0
  277. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/grid/inmemory_grid.py +0 -0
  278. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/history.py +0 -0
  279. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/run_serverapp.py +0 -0
  280. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/server.py +0 -0
  281. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/server_app.py +0 -0
  282. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/server_config.py +0 -0
  283. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/serverapp/__init__.py +0 -0
  284. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/serverapp/app.py +0 -0
  285. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/serverapp_components.py +0 -0
  286. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/__init__.py +0 -0
  287. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/aggregate.py +0 -0
  288. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/bulyan.py +0 -0
  289. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  290. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  291. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  292. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  293. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  294. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedadagrad.py +0 -0
  295. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedadam.py +0 -0
  296. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedavg.py +0 -0
  297. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedavg_android.py +0 -0
  298. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedavgm.py +0 -0
  299. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedmedian.py +0 -0
  300. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedopt.py +0 -0
  301. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedprox.py +0 -0
  302. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  303. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  304. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  305. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  306. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/fedyogi.py +0 -0
  307. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/krum.py +0 -0
  308. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/qfedavg.py +0 -0
  309. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/strategy/strategy.py +0 -0
  310. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/__init__.py +0 -0
  311. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  312. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  313. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  314. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  315. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  316. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  317. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  318. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  319. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  320. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  321. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
  322. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  323. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  324. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  325. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  326. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  327. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  328. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  329. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  330. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  331. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  332. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  333. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  334. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  335. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  336. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  337. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  338. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/superlink/utils.py +0 -0
  339. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/typing.py +0 -0
  340. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/utils/__init__.py +0 -0
  341. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/utils/tensorboard.py +0 -0
  342. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/utils/validator.py +0 -0
  343. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/__init__.py +0 -0
  344. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/constant.py +0 -0
  345. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/default_workflows.py +0 -0
  346. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  347. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  348. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  349. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/__init__.py +0 -0
  350. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/exception.py +0 -0
  351. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/__init__.py +0 -0
  352. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  353. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  354. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  355. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  356. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  357. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  358. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  359. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  360. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  361. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  362. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  363. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  364. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  365. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  366. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/krum.py +0 -0
  367. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  368. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  369. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/result.py +0 -0
  370. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/strategy.py +0 -0
  371. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  372. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/__init__.py +0 -0
  373. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/app.py +0 -0
  374. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/legacy_app.py +0 -0
  375. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  376. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  377. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  378. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/ray_transport/utils.py +0 -0
  379. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/run_simulation.py +0 -0
  380. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/simulation/simulationio_connection.py +0 -0
  381. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/__init__.py +0 -0
  382. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/app_utils.py +0 -0
  383. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/cli/__init__.py +0 -0
  384. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  385. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/constant.py +0 -0
  386. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/corestate/__init__.py +0 -0
  387. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/corestate/corestate.py +0 -0
  388. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/ffs/__init__.py +0 -0
  389. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  390. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/ffs/ffs.py +0 -0
  391. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  392. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  393. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  394. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  395. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  396. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  397. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/object_store/__init__.py +0 -0
  398. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  399. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/object_store/object_store.py +0 -0
  400. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  401. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/object_store/utils.py +0 -0
  402. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/primitives/__init__.py +0 -0
  403. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/__init__.py +0 -0
  404. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  405. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  406. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  407. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  408. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  409. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  410. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  411. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supercore/utils.py +0 -0
  412. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/__init__.py +0 -0
  413. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  414. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  415. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  416. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  417. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  418. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/__init__.py +0 -0
  419. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  420. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  421. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  422. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  423. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  424. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/__init__.py +0 -0
  425. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/cli/__init__.py +0 -0
  426. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  427. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  428. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/nodestate/__init__.py +0 -0
  429. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  430. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  431. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  432. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/runtime/__init__.py +0 -0
  433. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  434. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/servicer/__init__.py +0 -0
  435. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  436. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  437. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251009}/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.dev20251008
3
+ Version: 1.23.0.dev20251009
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,184 @@
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 create` command."""
16
+
17
+
18
+ import io
19
+ import json
20
+ from pathlib import Path
21
+ from typing import Annotated, Optional
22
+
23
+ import typer
24
+ from cryptography.hazmat.primitives import serialization
25
+ from cryptography.hazmat.primitives.asymmetric import ec
26
+ from rich.console import Console
27
+
28
+ from flwr.cli.config_utils import (
29
+ exit_if_no_address,
30
+ load_and_validate,
31
+ process_loaded_project_config,
32
+ validate_federation_in_project_config,
33
+ )
34
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
35
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
36
+ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
37
+ CreateNodeCliRequest,
38
+ CreateNodeCliResponse,
39
+ )
40
+ from flwr.proto.control_pb2_grpc import ControlStub
41
+ from flwr.supercore.primitives.asymmetric import public_key_to_bytes, uses_nist_ec_curve
42
+
43
+ from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
44
+
45
+
46
+ def create( # pylint: disable=R0914
47
+ public_key: Annotated[
48
+ Path,
49
+ typer.Argument(
50
+ help="Path to a P-384 (or any other NIST EC curve) public key file.",
51
+ ),
52
+ ],
53
+ app: Annotated[
54
+ Path,
55
+ typer.Argument(help="Path of the Flower project"),
56
+ ] = Path("."),
57
+ federation: Annotated[
58
+ Optional[str],
59
+ typer.Argument(help="Name of the federation"),
60
+ ] = None,
61
+ output_format: Annotated[
62
+ str,
63
+ typer.Option(
64
+ "--format",
65
+ case_sensitive=False,
66
+ help="Format output using 'default' view or 'json'",
67
+ ),
68
+ ] = CliOutputFormat.DEFAULT,
69
+ ) -> None:
70
+ """Add a SuperNode to the federation."""
71
+ suppress_output = output_format == CliOutputFormat.JSON
72
+ captured_output = io.StringIO()
73
+
74
+ # Load public key
75
+ public_key_path = Path(public_key)
76
+ public_key_bytes = try_load_public_key(public_key_path)
77
+
78
+ try:
79
+ if suppress_output:
80
+ redirect_output(captured_output)
81
+
82
+ # Load and validate federation config
83
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
84
+
85
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
86
+ config, errors, warnings = load_and_validate(path=pyproject_path)
87
+ config = process_loaded_project_config(config, errors, warnings)
88
+ federation, federation_config = validate_federation_in_project_config(
89
+ federation, config
90
+ )
91
+ exit_if_no_address(federation_config, "supernode create")
92
+
93
+ channel = None
94
+ try:
95
+ auth_plugin = load_cli_auth_plugin(app, federation, federation_config)
96
+ channel = init_channel(app, federation_config, auth_plugin)
97
+ stub = ControlStub(channel) # pylint: disable=unused-variable # noqa: F841
98
+
99
+ _create_node(
100
+ stub=stub, public_key=public_key_bytes, output_format=output_format
101
+ )
102
+
103
+ except ValueError as err:
104
+ typer.secho(
105
+ f"❌ {err}",
106
+ fg=typer.colors.RED,
107
+ bold=True,
108
+ )
109
+ raise typer.Exit(code=1) from err
110
+ finally:
111
+ if channel:
112
+ channel.close()
113
+
114
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
115
+ if suppress_output:
116
+ restore_output()
117
+ e_message = captured_output.getvalue()
118
+ print_json_error(e_message, err)
119
+ else:
120
+ typer.secho(
121
+ f"{err}",
122
+ fg=typer.colors.RED,
123
+ bold=True,
124
+ )
125
+ finally:
126
+ if suppress_output:
127
+ restore_output()
128
+ captured_output.close()
129
+
130
+
131
+ def _create_node(stub: ControlStub, public_key: bytes, output_format: str) -> None:
132
+ """Create a node."""
133
+ with flwr_cli_grpc_exc_handler():
134
+ response: CreateNodeCliResponse = stub.CreateNodeCli(
135
+ request=CreateNodeCliRequest(public_key=public_key)
136
+ )
137
+ if response.node_id:
138
+ typer.secho(
139
+ f"✅ Node {response.node_id} created successfully.", fg=typer.colors.GREEN
140
+ )
141
+ if output_format == CliOutputFormat.JSON:
142
+ run_output = json.dumps(
143
+ {
144
+ "success": True,
145
+ "node-id": response.node_id,
146
+ }
147
+ )
148
+ restore_output()
149
+ Console().print_json(run_output)
150
+ else:
151
+ typer.secho("❌ Node couldn't be created.", fg=typer.colors.RED)
152
+
153
+
154
+ def try_load_public_key(public_key_path: Path) -> bytes:
155
+ """Try to load a public key from a file."""
156
+ if not public_key_path.exists():
157
+ typer.secho(
158
+ f"❌ Public key file '{public_key_path}' does not exist.",
159
+ fg=typer.colors.RED,
160
+ bold=True,
161
+ )
162
+ raise typer.Exit(code=1)
163
+
164
+ with open(public_key_path, "rb") as key_file:
165
+ try:
166
+ public_key = serialization.load_pem_public_key(key_file.read())
167
+
168
+ if not isinstance(public_key, ec.EllipticCurvePublicKey):
169
+ raise ValueError(f"Not an EC public key, got {type(public_key)}")
170
+
171
+ # Verify it's one of the approved NIST curves
172
+ if not uses_nist_ec_curve(public_key):
173
+ raise ValueError(
174
+ f"EC curve {public_key.curve.name} is not an approved NIST curve"
175
+ )
176
+
177
+ except ValueError as err:
178
+ typer.secho(
179
+ f"❌ Unable to load public key from '{public_key_path}': {err}",
180
+ fg=typer.colors.RED,
181
+ bold=True,
182
+ )
183
+ raise typer.Exit(code=1) from err
184
+ return public_key_to_bytes(public_key)
@@ -0,0 +1,136 @@
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 delete` command."""
16
+
17
+
18
+ import io
19
+ import json
20
+ from pathlib import Path
21
+ from typing import Annotated, Optional
22
+
23
+ import typer
24
+ from rich.console import Console
25
+
26
+ from flwr.cli.config_utils import (
27
+ exit_if_no_address,
28
+ load_and_validate,
29
+ process_loaded_project_config,
30
+ validate_federation_in_project_config,
31
+ )
32
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
33
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
34
+ from flwr.proto.control_pb2 import DeleteNodeCliRequest # pylint: disable=E0611
35
+ from flwr.proto.control_pb2_grpc import ControlStub
36
+
37
+ from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
38
+
39
+
40
+ def delete( # pylint: disable=R0914
41
+ node_id: Annotated[
42
+ int,
43
+ typer.Argument(
44
+ help="ID of the SuperNode to remove.",
45
+ ),
46
+ ],
47
+ app: Annotated[
48
+ Path,
49
+ typer.Argument(help="Path of the Flower project"),
50
+ ] = Path("."),
51
+ federation: Annotated[
52
+ Optional[str],
53
+ typer.Argument(help="Name of the federation"),
54
+ ] = None,
55
+ output_format: Annotated[
56
+ str,
57
+ typer.Option(
58
+ "--format",
59
+ case_sensitive=False,
60
+ help="Format output using 'default' view or 'json'",
61
+ ),
62
+ ] = CliOutputFormat.DEFAULT,
63
+ ) -> None:
64
+ """Remove a SuperNode from the federation."""
65
+ suppress_output = output_format == CliOutputFormat.JSON
66
+ captured_output = io.StringIO()
67
+
68
+ try:
69
+ if suppress_output:
70
+ redirect_output(captured_output)
71
+
72
+ # Load and validate federation config
73
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
74
+
75
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
76
+ config, errors, warnings = load_and_validate(path=pyproject_path)
77
+ config = process_loaded_project_config(config, errors, warnings)
78
+ federation, federation_config = validate_federation_in_project_config(
79
+ federation, config
80
+ )
81
+ exit_if_no_address(federation_config, "supernode remove")
82
+
83
+ channel = None
84
+ try:
85
+ auth_plugin = load_cli_auth_plugin(app, federation, federation_config)
86
+ channel = init_channel(app, federation_config, auth_plugin)
87
+ stub = ControlStub(channel) # pylint: disable=unused-variable # noqa: F841
88
+
89
+ _delete_node(stub=stub, node_id=node_id, output_format=output_format)
90
+
91
+ except ValueError as err:
92
+ typer.secho(
93
+ f"❌ {err}",
94
+ fg=typer.colors.RED,
95
+ bold=True,
96
+ )
97
+ raise typer.Exit(code=1) from err
98
+ finally:
99
+ if channel:
100
+ channel.close()
101
+
102
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
103
+ if suppress_output:
104
+ restore_output()
105
+ e_message = captured_output.getvalue()
106
+ print_json_error(e_message, err)
107
+ else:
108
+ typer.secho(
109
+ f"{err}",
110
+ fg=typer.colors.RED,
111
+ bold=True,
112
+ )
113
+ finally:
114
+ if suppress_output:
115
+ restore_output()
116
+ captured_output.close()
117
+
118
+
119
+ def _delete_node(
120
+ stub: ControlStub,
121
+ node_id: int,
122
+ output_format: str,
123
+ ) -> None:
124
+ """Delete a SuperNode from the federation."""
125
+ with flwr_cli_grpc_exc_handler():
126
+ stub.DeleteNodeCli(request=DeleteNodeCliRequest(node_id=node_id))
127
+ typer.secho(f"✅ SuperNode {node_id} deleted successfully.", fg=typer.colors.GREEN)
128
+ if output_format == CliOutputFormat.JSON:
129
+ run_output = json.dumps(
130
+ {
131
+ "success": True,
132
+ "node-id": node_id,
133
+ }
134
+ )
135
+ restore_output()
136
+ Console().print_json(run_output)
@@ -32,6 +32,9 @@ from flwr.common.constant import (
32
32
  FLWR_DIR,
33
33
  NO_ACCOUNT_AUTH_MESSAGE,
34
34
  NO_ARTIFACT_PROVIDER_MESSAGE,
35
+ NODE_NOT_FOUND_MESSAGE,
36
+ PUBLIC_KEY_ALREADY_IN_USE_MESSAGE,
37
+ PUBLIC_KEY_NOT_VALID,
35
38
  PULL_UNFINISHED_RUN_MESSAGE,
36
39
  RUN_ID_NOT_FOUND_MESSAGE,
37
40
  AuthnType,
@@ -293,7 +296,7 @@ def init_channel(
293
296
 
294
297
 
295
298
  @contextmanager
296
- def flwr_cli_grpc_exc_handler() -> Iterator[None]:
299
+ def flwr_cli_grpc_exc_handler() -> Iterator[None]: # pylint: disable=too-many-branches
297
300
  """Context manager to handle specific gRPC errors.
298
301
 
299
302
  It catches grpc.RpcError exceptions with UNAUTHENTICATED, UNIMPLEMENTED,
@@ -351,16 +354,21 @@ def flwr_cli_grpc_exc_handler() -> Iterator[None]:
351
354
  bold=True,
352
355
  )
353
356
  raise typer.Exit(code=1) from None
354
- if (
355
- e.code() == grpc.StatusCode.NOT_FOUND
356
- and e.details() == RUN_ID_NOT_FOUND_MESSAGE # pylint: disable=E1101
357
- ):
358
- typer.secho(
359
- "❌ Run ID not found.",
360
- fg=typer.colors.RED,
361
- bold=True,
362
- )
363
- raise typer.Exit(code=1) from None
357
+ if e.code() == grpc.StatusCode.NOT_FOUND:
358
+ if e.details() == RUN_ID_NOT_FOUND_MESSAGE: # pylint: disable=E1101
359
+ typer.secho(
360
+ "❌ Run ID not found.",
361
+ fg=typer.colors.RED,
362
+ bold=True,
363
+ )
364
+ raise typer.Exit(code=1) from None
365
+ if e.details() == NODE_NOT_FOUND_MESSAGE: # pylint: disable=E1101
366
+ typer.secho(
367
+ "❌ Node ID not found for this account.",
368
+ fg=typer.colors.RED,
369
+ bold=True,
370
+ )
371
+ raise typer.Exit(code=1) from None
364
372
  if e.code() == grpc.StatusCode.FAILED_PRECONDITION:
365
373
  if e.details() == PULL_UNFINISHED_RUN_MESSAGE: # pylint: disable=E1101
366
374
  typer.secho(
@@ -370,4 +378,22 @@ def flwr_cli_grpc_exc_handler() -> Iterator[None]:
370
378
  bold=True,
371
379
  )
372
380
  raise typer.Exit(code=1) from None
381
+ if (
382
+ e.details() == PUBLIC_KEY_ALREADY_IN_USE_MESSAGE
383
+ ): # pylint: disable=E1101
384
+ typer.secho(
385
+ "❌ The provided public key is already in use by another "
386
+ "SuperNode.",
387
+ fg=typer.colors.RED,
388
+ bold=True,
389
+ )
390
+ raise typer.Exit(code=1) from None
391
+ if e.details() == PUBLIC_KEY_NOT_VALID: # pylint: disable=E1101
392
+ typer.secho(
393
+ "❌ The provided public key is invalid. Please provide a valid "
394
+ "NIST EC public key.",
395
+ fg=typer.colors.RED,
396
+ bold=True,
397
+ )
398
+ raise typer.Exit(code=1) from None
373
399
  raise
@@ -157,6 +157,9 @@ 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
+ PUBLIC_KEY_ALREADY_IN_USE_MESSAGE = "Public key already in use"
161
+ PUBLIC_KEY_NOT_VALID = "The provided public key is not valid"
162
+ NODE_NOT_FOUND_MESSAGE = "Node ID not found for account"
160
163
 
161
164
 
162
165
  class MessageType:
@@ -19,7 +19,7 @@ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
19
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
20
20
 
21
21
 
22
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\"*\n\x14\x43reateNodeCliRequest\x12\x12\n\npublic_key\x18\x01 \x01(\t\"9\n\x15\x43reateNodeCliResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"\'\n\x14\x44\x65leteNodeCliRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x17\n\x15\x44\x65leteNodeCliResponse\"\x15\n\x13ListNodesCliRequest\"M\n\x14ListNodesCliResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xc5\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12V\n\rCreateNodeCli\x12 .flwr.proto.CreateNodeCliRequest\x1a!.flwr.proto.CreateNodeCliResponse\"\x00\x12V\n\rDeleteNodeCli\x12 .flwr.proto.DeleteNodeCliRequest\x1a!.flwr.proto.DeleteNodeCliResponse\"\x00\x12S\n\x0cListNodesCli\x12\x1f.flwr.proto.ListNodesCliRequest\x1a .flwr.proto.ListNodesCliResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/control.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1b\x66lwr/proto/recorddict.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x15\x66lwr/proto/node.proto\"\xfa\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x34\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x18.flwr.proto.ConfigRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8b\x01\n\x17GetLoginDetailsResponse\x12\x12\n\nauthn_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"&\n\x14PullArtifactsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"1\n\x15PullArtifactsResponse\x12\x10\n\x03url\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x06\n\x04_url\"*\n\x14\x43reateNodeCliRequest\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\"9\n\x15\x43reateNodeCliResponse\x12\x14\n\x07node_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_node_id\"\'\n\x14\x44\x65leteNodeCliRequest\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\"\x17\n\x15\x44\x65leteNodeCliResponse\"\x15\n\x13ListNodesCliRequest\"M\n\x14ListNodesCliResponse\x12(\n\nnodes_info\x18\x01 \x03(\x0b\x32\x14.flwr.proto.NodeInfo\x12\x0b\n\x03now\x18\x02 \x01(\t2\xc5\x06\n\x07\x43ontrol\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x12V\n\rPullArtifacts\x12 .flwr.proto.PullArtifactsRequest\x1a!.flwr.proto.PullArtifactsResponse\"\x00\x12V\n\rCreateNodeCli\x12 .flwr.proto.CreateNodeCliRequest\x1a!.flwr.proto.CreateNodeCliResponse\"\x00\x12V\n\rDeleteNodeCli\x12 .flwr.proto.DeleteNodeCliRequest\x1a!.flwr.proto.DeleteNodeCliResponse\"\x00\x12S\n\x0cListNodesCli\x12\x1f.flwr.proto.ListNodesCliRequest\x1a .flwr.proto.ListNodesCliResponse\"\x00\x62\x06proto3')
23
23
 
24
24
  _globals = globals()
25
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -239,10 +239,10 @@ global___PullArtifactsResponse = PullArtifactsResponse
239
239
  class CreateNodeCliRequest(google.protobuf.message.Message):
240
240
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
241
241
  PUBLIC_KEY_FIELD_NUMBER: builtins.int
242
- public_key: typing.Text
242
+ public_key: builtins.bytes
243
243
  def __init__(self,
244
244
  *,
245
- public_key: typing.Text = ...,
245
+ public_key: builtins.bytes = ...,
246
246
  ) -> None: ...
247
247
  def ClearField(self, field_name: typing_extensions.Literal["public_key",b"public_key"]) -> None: ...
248
248
  global___CreateNodeCliRequest = CreateNodeCliRequest
@@ -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\"\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(\x01\x12\x1a\n\x12heartbeat_interval\x18\t \x01(\x01\x62\x06proto3')
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\"\xe4\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(\x01\x12\x1a\n\x12heartbeat_interval\x18\t \x01(\x01\x12\x12\n\npublic_key\x18\n \x01(\x0c\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=271
27
+ _globals['_NODEINFO']._serialized_end=291
28
28
  # @@protoc_insertion_point(module_scope)
@@ -32,6 +32,7 @@ class NodeInfo(google.protobuf.message.Message):
32
32
  DELETED_AT_FIELD_NUMBER: builtins.int
33
33
  ONLINE_UNTIL_FIELD_NUMBER: builtins.int
34
34
  HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
35
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
35
36
  node_id: builtins.int
36
37
  owner_aid: typing.Text
37
38
  status: typing.Text
@@ -41,6 +42,7 @@ class NodeInfo(google.protobuf.message.Message):
41
42
  deleted_at: typing.Text
42
43
  online_until: builtins.float
43
44
  heartbeat_interval: builtins.float
45
+ public_key: builtins.bytes
44
46
  def __init__(self,
45
47
  *,
46
48
  node_id: builtins.int = ...,
@@ -52,6 +54,7 @@ class NodeInfo(google.protobuf.message.Message):
52
54
  deleted_at: typing.Text = ...,
53
55
  online_until: builtins.float = ...,
54
56
  heartbeat_interval: builtins.float = ...,
57
+ public_key: builtins.bytes = ...,
55
58
  ) -> None: ...
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: ...
59
+ 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","public_key",b"public_key","status",b"status"]) -> None: ...
57
60
  global___NodeInfo = NodeInfo
@@ -18,7 +18,7 @@ from logging import ERROR
18
18
  from typing import Optional
19
19
 
20
20
  from flwr.common import Message, log
21
- from flwr.common.constant import Status
21
+ from flwr.common.constant import NOOP_FLWR_AID, Status
22
22
  from flwr.common.inflatable import UnexpectedObjectContentError
23
23
  from flwr.common.serde import (
24
24
  fab_to_proto,
@@ -70,7 +70,9 @@ def create_node(
70
70
  ) -> CreateNodeResponse:
71
71
  """."""
72
72
  # Create node
73
- node_id = state.create_node(request.public_key, request.heartbeat_interval)
73
+ node_id = state.create_node(
74
+ NOOP_FLWR_AID, request.public_key, request.heartbeat_interval
75
+ )
74
76
  return CreateNodeResponse(node=Node(node_id=node_id))
75
77
 
76
78
 
@@ -81,7 +83,7 @@ def delete_node(request: DeleteNodeRequest, state: LinkState) -> DeleteNodeRespo
81
83
  return DeleteNodeResponse()
82
84
 
83
85
  # Update state
84
- state.delete_node(node_id=request.node.node_id)
86
+ state.delete_node(NOOP_FLWR_AID, node_id=request.node.node_id)
85
87
  return DeleteNodeResponse()
86
88
 
87
89
 
@@ -34,6 +34,7 @@ from flwr.clientapp.utils import get_load_client_app_fn
34
34
  from flwr.common import Message
35
35
  from flwr.common.constant import (
36
36
  HEARTBEAT_MAX_INTERVAL,
37
+ NOOP_FLWR_AID,
37
38
  NUM_PARTITIONS_KEY,
38
39
  PARTITION_ID_KEY,
39
40
  ErrorCode,
@@ -56,7 +57,9 @@ def _register_nodes(
56
57
  for i in range(num_nodes):
57
58
  node_id = state.create_node(
58
59
  # No node authentication in simulation;
59
- # use random bytes instead
60
+ # use NOOP_FLWR_AID as owner_aid and
61
+ # use random bytes as public key
62
+ NOOP_FLWR_AID,
60
63
  secrets.token_bytes(32),
61
64
  heartbeat_interval=HEARTBEAT_MAX_INTERVAL,
62
65
  )
@@ -69,10 +69,10 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
69
69
 
70
70
  def __init__(self) -> None:
71
71
 
72
- # Map node_id to (online_until, heartbeat_interval)
72
+ # Map node_id to NodeInfo
73
73
  self.nodes: dict[int, NodeInfo] = {}
74
- self.public_key_to_node_id: dict[bytes, int] = {}
75
- self.node_id_to_public_key: dict[int, bytes] = {}
74
+ self.registered_node_public_keys: set[bytes] = set()
75
+ self.owner_to_node_ids: dict[str, set[int]] = {} # Quick lookup
76
76
 
77
77
  # Map run_id to RunRecord
78
78
  self.run_ids: dict[int, RunRecord] = {}
@@ -330,7 +330,9 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
330
330
  """
331
331
  return len(self.message_res_store)
332
332
 
333
- def create_node(self, public_key: bytes, heartbeat_interval: float) -> int:
333
+ def create_node(
334
+ self, owner_aid: str, public_key: bytes, heartbeat_interval: float
335
+ ) -> int:
334
336
  """Create, store in the link state, and return `node_id`."""
335
337
  # Sample a random int64 as node_id
336
338
  node_id = generate_rand_int_from_bytes(
@@ -341,14 +343,14 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
341
343
  if node_id in self.nodes:
342
344
  log(ERROR, "Unexpected node registration failure.")
343
345
  return 0
344
- if public_key in self.public_key_to_node_id:
346
+ if public_key in self.registered_node_public_keys:
345
347
  raise ValueError("Public key already in use")
346
348
 
347
349
  # Mark the node online until now().timestamp() + heartbeat_interval
348
350
  current = now()
349
351
  self.nodes[node_id] = NodeInfo(
350
352
  node_id=node_id,
351
- owner_aid="", # Unused for now
353
+ owner_aid=owner_aid, # Unused for now
352
354
  status="created", # Unused for now
353
355
  created_at=current.isoformat(), # Unused for now
354
356
  last_activated_at=current.isoformat(), # Unused for now
@@ -356,22 +358,22 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
356
358
  deleted_at="", # Unused for now
357
359
  online_until=current.timestamp() + heartbeat_interval,
358
360
  heartbeat_interval=heartbeat_interval,
361
+ public_key=public_key,
359
362
  )
360
- self.public_key_to_node_id[public_key] = node_id
361
- self.node_id_to_public_key[node_id] = public_key
363
+ self.registered_node_public_keys.add(public_key)
364
+ self.owner_to_node_ids.setdefault(owner_aid, set()).add(node_id)
362
365
  return node_id
363
366
 
364
- def delete_node(self, node_id: int) -> None:
367
+ def delete_node(self, owner_aid: str, node_id: int) -> None:
365
368
  """Delete a node."""
366
369
  with self.lock:
367
- if node_id not in self.nodes:
368
- raise ValueError(f"Node {node_id} not found")
369
-
370
- # Remove node ID <> public key mappings
371
- if pk := self.node_id_to_public_key.pop(node_id, None):
372
- del self.public_key_to_node_id[pk]
370
+ if node_id not in self.nodes or owner_aid != self.nodes[node_id].owner_aid:
371
+ raise ValueError(
372
+ f"Node ID {node_id} not found or unauthorized deletion attempt."
373
+ )
373
374
 
374
- del self.nodes[node_id]
375
+ node = self.nodes.pop(node_id)
376
+ self.registered_node_public_keys.discard(node.public_key)
375
377
 
376
378
  def get_nodes(self, run_id: int) -> set[int]:
377
379
  """Return all available nodes.
@@ -391,29 +393,13 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
391
393
  if info.online_until > current_time
392
394
  }
393
395
 
394
- def set_node_public_key(self, node_id: int, public_key: bytes) -> None:
395
- """Set `public_key` for the specified `node_id`."""
396
- with self.lock:
397
- if node_id not in self.nodes:
398
- raise ValueError(f"Node {node_id} not found")
399
-
400
- if public_key in self.public_key_to_node_id:
401
- raise ValueError("Public key already in use")
402
-
403
- self.public_key_to_node_id[public_key] = node_id
404
- self.node_id_to_public_key[node_id] = public_key
405
-
406
- def get_node_public_key(self, node_id: int) -> Optional[bytes]:
396
+ def get_node_public_key(self, node_id: int) -> bytes:
407
397
  """Get `public_key` for the specified `node_id`."""
408
398
  with self.lock:
409
- if node_id not in self.nodes:
410
- raise ValueError(f"Node {node_id} not found")
411
-
412
- return self.node_id_to_public_key.get(node_id)
399
+ if (node := self.nodes.get(node_id)) is None:
400
+ raise ValueError(f"Node ID {node_id} not found")
413
401
 
414
- def get_node_id(self, node_public_key: bytes) -> Optional[int]:
415
- """Retrieve stored `node_id` filtered by `node_public_keys`."""
416
- return self.public_key_to_node_id.get(node_public_key)
402
+ return node.public_key
417
403
 
418
404
  # pylint: disable=too-many-arguments,too-many-positional-arguments
419
405
  def create_run(