flwr-nightly 1.23.0.dev20251008__tar.gz → 1.23.0.dev20251010__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.dev20251010}/PKG-INFO +1 -1
  2. flwr_nightly-1.23.0.dev20251010/py/flwr/cli/supernode/create.py +184 -0
  3. flwr_nightly-1.23.0.dev20251010/py/flwr/cli/supernode/delete.py +136 -0
  4. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/utils.py +37 -11
  5. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/constant.py +3 -0
  6. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/exit/exit_code.py +10 -0
  7. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/control_pb2.py +1 -1
  8. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/control_pb2.pyi +2 -2
  9. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/node_pb2.py +2 -2
  10. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/node_pb2.pyi +4 -1
  11. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +5 -3
  12. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/vce/vce_api.py +4 -1
  13. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +22 -36
  14. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/linkstate.py +20 -10
  15. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +19 -42
  16. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/primitives/asymmetric.py +8 -0
  17. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/control_servicer.py +55 -2
  18. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/pyproject.toml +1 -1
  19. flwr_nightly-1.23.0.dev20251008/py/flwr/cli/supernode/create.py +0 -58
  20. flwr_nightly-1.23.0.dev20251008/py/flwr/cli/supernode/delete.py +0 -58
  21. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/README.md +0 -0
  22. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/app/__init__.py +0 -0
  24. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/app/error.py +0 -0
  25. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/app/exception.py +0 -0
  26. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/app/metadata.py +0 -0
  27. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/__init__.py +0 -0
  28. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/app.py +0 -0
  29. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  30. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  31. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  32. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  33. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/build.py +0 -0
  34. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  35. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/config_utils.py +0 -0
  36. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/constant.py +0 -0
  37. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/example.py +0 -0
  38. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/install.py +0 -0
  39. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/log.py +0 -0
  40. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/login/__init__.py +0 -0
  41. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/login/login.py +0 -0
  42. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/ls.py +0 -0
  43. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/__init__.py +0 -0
  44. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/new.py +0 -0
  45. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/__init__.py +0 -0
  46. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  47. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  48. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  49. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  50. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  51. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  52. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  54. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  55. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
  56. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  58. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  59. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  60. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  61. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  62. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
  63. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  64. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  65. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -0
  66. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  68. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  69. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  70. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  71. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  72. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  73. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  77. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
  81. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  82. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  83. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -0
  84. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  85. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  86. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  87. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  88. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  89. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  90. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
  91. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  92. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  93. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -0
  94. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  95. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  96. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  97. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  98. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  99. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  100. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  101. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  102. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
  103. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  104. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  105. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -0
  106. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/pull.py +0 -0
  107. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/run/__init__.py +0 -0
  108. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/run/run.py +0 -0
  109. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/stop.py +0 -0
  110. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/supernode/__init__.py +0 -0
  111. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/cli/supernode/ls.py +0 -0
  112. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/__init__.py +0 -0
  113. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/client.py +0 -0
  114. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  115. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  116. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  117. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  118. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  119. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  120. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  121. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/message_handler/__init__.py +0 -0
  122. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/message_handler/message_handler.py +0 -0
  123. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/__init__.py +0 -0
  124. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/centraldp_mods.py +0 -0
  125. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/comms_mods.py +0 -0
  126. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/localdp_mod.py +0 -0
  127. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  128. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  129. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  130. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/mod/utils.py +0 -0
  131. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/numpy_client.py +0 -0
  132. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/rest_client/__init__.py +0 -0
  133. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/rest_client/connection.py +0 -0
  134. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/run_info_store.py +0 -0
  135. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/client/typing.py +0 -0
  136. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/__init__.py +0 -0
  137. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/client_app.py +0 -0
  138. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/mod/__init__.py +0 -0
  139. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  140. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  141. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/typing.py +0 -0
  142. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/clientapp/utils.py +0 -0
  143. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/__init__.py +0 -0
  144. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/address.py +0 -0
  145. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/args.py +0 -0
  146. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/config.py +0 -0
  147. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/context.py +0 -0
  148. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/date.py +0 -0
  149. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/differential_privacy.py +0 -0
  150. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/differential_privacy_constants.py +0 -0
  151. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/dp.py +0 -0
  152. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  153. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  154. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/exit/__init__.py +0 -0
  155. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/exit/exit.py +0 -0
  156. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/exit/exit_handler.py +0 -0
  157. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/exit/signal_handler.py +0 -0
  158. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/grpc.py +0 -0
  159. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/heartbeat.py +0 -0
  160. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/inflatable.py +0 -0
  161. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  162. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/inflatable_utils.py +0 -0
  163. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/logger.py +0 -0
  164. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/message.py +0 -0
  165. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/object_ref.py +0 -0
  166. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/parameter.py +0 -0
  167. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/pyproject.py +0 -0
  168. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/__init__.py +0 -0
  169. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/array.py +0 -0
  170. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/arraychunk.py +0 -0
  171. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/arrayrecord.py +0 -0
  172. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/configrecord.py +0 -0
  173. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/conversion_utils.py +0 -0
  174. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/metricrecord.py +0 -0
  175. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/recorddict.py +0 -0
  176. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/record/typeddict.py +0 -0
  177. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/recorddict_compat.py +0 -0
  178. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/retry_invoker.py +0 -0
  179. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  180. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  181. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  182. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  183. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  184. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  185. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  186. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  187. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/serde.py +0 -0
  188. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/serde_utils.py +0 -0
  189. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/telemetry.py +0 -0
  190. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/typing.py +0 -0
  191. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/common/version.py +0 -0
  192. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/__init__.py +0 -0
  193. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/client/__init__.py +0 -0
  194. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/client/app.py +0 -0
  195. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  196. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  197. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/common/__init__.py +0 -0
  198. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/server/__init__.py +0 -0
  199. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/server/app.py +0 -0
  200. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/compat/simulation/__init__.py +0 -0
  201. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/__init__.py +0 -0
  202. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/appio_pb2.py +0 -0
  203. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/appio_pb2.pyi +0 -0
  204. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/clientappio_pb2.py +0 -0
  207. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  208. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/control_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/error_pb2.py +0 -0
  213. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/error_pb2.pyi +0 -0
  214. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/error_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fab_pb2.py +0 -0
  217. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fab_pb2.pyi +0 -0
  218. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fleet_pb2.py +0 -0
  221. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fleet_pb2.pyi +0 -0
  222. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  225. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  226. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/heartbeat_pb2.py +0 -0
  229. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  230. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/log_pb2.py +0 -0
  233. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/log_pb2.pyi +0 -0
  234. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/log_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/message_pb2.py +0 -0
  237. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/message_pb2.pyi +0 -0
  238. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/message_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/node_pb2_grpc.py +0 -0
  241. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  242. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/recorddict_pb2.py +0 -0
  243. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  244. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  245. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  246. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/run_pb2.py +0 -0
  247. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/run_pb2.pyi +0 -0
  248. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/run_pb2_grpc.py +0 -0
  249. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  250. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/serverappio_pb2.py +0 -0
  251. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  252. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  253. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  254. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/simulationio_pb2.py +0 -0
  255. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  256. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  257. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  258. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/transport_pb2.py +0 -0
  259. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/transport_pb2.pyi +0 -0
  260. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  261. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  262. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/py.typed +0 -0
  263. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/__init__.py +0 -0
  264. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/app.py +0 -0
  265. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/client_manager.py +0 -0
  266. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/client_proxy.py +0 -0
  267. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/compat/__init__.py +0 -0
  268. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/compat/app.py +0 -0
  269. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/compat/app_utils.py +0 -0
  270. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  271. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/compat/legacy_context.py +0 -0
  272. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/criterion.py +0 -0
  273. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  274. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/grid/__init__.py +0 -0
  275. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/grid/grid.py +0 -0
  276. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/grid/grpc_grid.py +0 -0
  277. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/grid/inmemory_grid.py +0 -0
  278. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/history.py +0 -0
  279. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/run_serverapp.py +0 -0
  280. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/server.py +0 -0
  281. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/server_app.py +0 -0
  282. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/server_config.py +0 -0
  283. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/serverapp/__init__.py +0 -0
  284. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/serverapp/app.py +0 -0
  285. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/serverapp_components.py +0 -0
  286. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/__init__.py +0 -0
  287. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/aggregate.py +0 -0
  288. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/bulyan.py +0 -0
  289. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  290. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  291. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  292. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  293. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  294. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedadagrad.py +0 -0
  295. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedadam.py +0 -0
  296. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedavg.py +0 -0
  297. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedavg_android.py +0 -0
  298. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedavgm.py +0 -0
  299. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedmedian.py +0 -0
  300. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedopt.py +0 -0
  301. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedprox.py +0 -0
  302. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  303. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  304. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  305. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  306. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/fedyogi.py +0 -0
  307. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/krum.py +0 -0
  308. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/qfedavg.py +0 -0
  309. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/strategy/strategy.py +0 -0
  310. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/__init__.py +0 -0
  311. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  312. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  313. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/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.dev20251010}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  315. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/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.dev20251010}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  317. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/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.dev20251010}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  319. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  320. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  321. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/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.dev20251010}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  323. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  324. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  325. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  326. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  327. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  328. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  329. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  330. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  331. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  332. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  333. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  334. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  335. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  336. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  337. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  338. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/superlink/utils.py +0 -0
  339. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/typing.py +0 -0
  340. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/utils/__init__.py +0 -0
  341. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/utils/tensorboard.py +0 -0
  342. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/utils/validator.py +0 -0
  343. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/__init__.py +0 -0
  344. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/constant.py +0 -0
  345. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/default_workflows.py +0 -0
  346. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  347. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  348. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  349. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/__init__.py +0 -0
  350. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/exception.py +0 -0
  351. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/__init__.py +0 -0
  352. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  353. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  354. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  355. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  356. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  357. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  358. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  359. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  360. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  361. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  362. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  363. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  364. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  365. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  366. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/krum.py +0 -0
  367. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  368. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  369. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/result.py +0 -0
  370. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/strategy.py +0 -0
  371. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  372. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/__init__.py +0 -0
  373. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/app.py +0 -0
  374. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/legacy_app.py +0 -0
  375. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  376. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  377. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  378. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/ray_transport/utils.py +0 -0
  379. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/run_simulation.py +0 -0
  380. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/simulation/simulationio_connection.py +0 -0
  381. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/__init__.py +0 -0
  382. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/app_utils.py +0 -0
  383. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/cli/__init__.py +0 -0
  384. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  385. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/constant.py +0 -0
  386. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/corestate/__init__.py +0 -0
  387. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/corestate/corestate.py +0 -0
  388. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/ffs/__init__.py +0 -0
  389. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  390. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/ffs/ffs.py +0 -0
  391. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  392. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  393. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  394. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  395. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  396. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  397. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/object_store/__init__.py +0 -0
  398. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  399. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/object_store/object_store.py +0 -0
  400. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  401. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/object_store/utils.py +0 -0
  402. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/primitives/__init__.py +0 -0
  403. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/__init__.py +0 -0
  404. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  405. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  406. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  407. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  408. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  409. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  410. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  411. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supercore/utils.py +0 -0
  412. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/__init__.py +0 -0
  413. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  414. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  415. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  416. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  417. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  418. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/__init__.py +0 -0
  419. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  420. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  421. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  422. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  423. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  424. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/__init__.py +0 -0
  425. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/cli/__init__.py +0 -0
  426. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  427. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  428. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/nodestate/__init__.py +0 -0
  429. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  430. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  431. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  432. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/runtime/__init__.py +0 -0
  433. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  434. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/servicer/__init__.py +0 -0
  435. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  436. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  437. {flwr_nightly-1.23.0.dev20251008 → flwr_nightly-1.23.0.dev20251010}/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.dev20251010
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.exceptions import UnsupportedAlgorithm
25
+ from cryptography.hazmat.primitives import serialization
26
+ from cryptography.hazmat.primitives.asymmetric import ec
27
+ from rich.console import Console
28
+
29
+ from flwr.cli.config_utils import (
30
+ exit_if_no_address,
31
+ load_and_validate,
32
+ process_loaded_project_config,
33
+ validate_federation_in_project_config,
34
+ )
35
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
36
+ from flwr.common.exit import ExitCode, flwr_exit
37
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
38
+ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
39
+ CreateNodeCliRequest,
40
+ CreateNodeCliResponse,
41
+ )
42
+ from flwr.proto.control_pb2_grpc import ControlStub
43
+ from flwr.supercore.primitives.asymmetric import public_key_to_bytes, uses_nist_ec_curve
44
+
45
+ from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
46
+
47
+
48
+ def create( # pylint: disable=R0914
49
+ public_key: Annotated[
50
+ Path,
51
+ typer.Argument(
52
+ help="Path to a P-384 (or any other NIST EC curve) public key file.",
53
+ ),
54
+ ],
55
+ app: Annotated[
56
+ Path,
57
+ typer.Argument(help="Path of the Flower project"),
58
+ ] = Path("."),
59
+ federation: Annotated[
60
+ Optional[str],
61
+ typer.Argument(help="Name of the federation"),
62
+ ] = None,
63
+ output_format: Annotated[
64
+ str,
65
+ typer.Option(
66
+ "--format",
67
+ case_sensitive=False,
68
+ help="Format output using 'default' view or 'json'",
69
+ ),
70
+ ] = CliOutputFormat.DEFAULT,
71
+ ) -> None:
72
+ """Add a SuperNode to the federation."""
73
+ suppress_output = output_format == CliOutputFormat.JSON
74
+ captured_output = io.StringIO()
75
+
76
+ # Load public key
77
+ public_key_path = Path(public_key)
78
+ public_key_bytes = try_load_public_key(public_key_path)
79
+
80
+ try:
81
+ if suppress_output:
82
+ redirect_output(captured_output)
83
+
84
+ # Load and validate federation config
85
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
86
+
87
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
88
+ config, errors, warnings = load_and_validate(path=pyproject_path)
89
+ config = process_loaded_project_config(config, errors, warnings)
90
+ federation, federation_config = validate_federation_in_project_config(
91
+ federation, config
92
+ )
93
+ exit_if_no_address(federation_config, "supernode create")
94
+
95
+ channel = None
96
+ try:
97
+ auth_plugin = load_cli_auth_plugin(app, federation, federation_config)
98
+ channel = init_channel(app, federation_config, auth_plugin)
99
+ stub = ControlStub(channel) # pylint: disable=unused-variable # noqa: F841
100
+
101
+ _create_node(
102
+ stub=stub, public_key=public_key_bytes, output_format=output_format
103
+ )
104
+
105
+ except ValueError as err:
106
+ typer.secho(
107
+ f"❌ {err}",
108
+ fg=typer.colors.RED,
109
+ bold=True,
110
+ )
111
+ raise typer.Exit(code=1) from err
112
+ finally:
113
+ if channel:
114
+ channel.close()
115
+
116
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
117
+ if suppress_output:
118
+ restore_output()
119
+ e_message = captured_output.getvalue()
120
+ print_json_error(e_message, err)
121
+ else:
122
+ typer.secho(
123
+ f"{err}",
124
+ fg=typer.colors.RED,
125
+ bold=True,
126
+ )
127
+ finally:
128
+ if suppress_output:
129
+ restore_output()
130
+ captured_output.close()
131
+
132
+
133
+ def _create_node(stub: ControlStub, public_key: bytes, output_format: str) -> None:
134
+ """Create a node."""
135
+ with flwr_cli_grpc_exc_handler():
136
+ response: CreateNodeCliResponse = stub.CreateNodeCli(
137
+ request=CreateNodeCliRequest(public_key=public_key)
138
+ )
139
+ if response.node_id:
140
+ typer.secho(
141
+ f"✅ Node {response.node_id} created successfully.", fg=typer.colors.GREEN
142
+ )
143
+ if output_format == CliOutputFormat.JSON:
144
+ run_output = json.dumps(
145
+ {
146
+ "success": True,
147
+ "node-id": response.node_id,
148
+ }
149
+ )
150
+ restore_output()
151
+ Console().print_json(run_output)
152
+ else:
153
+ typer.secho("❌ Node couldn't be created.", fg=typer.colors.RED)
154
+
155
+
156
+ def try_load_public_key(public_key_path: Path) -> bytes:
157
+ """Try to load a public key from a file."""
158
+ if not public_key_path.exists():
159
+ typer.secho(
160
+ f"❌ Public key file '{public_key_path}' does not exist.",
161
+ fg=typer.colors.RED,
162
+ bold=True,
163
+ )
164
+ raise typer.Exit(code=1)
165
+
166
+ with open(public_key_path, "rb") as key_file:
167
+ try:
168
+ public_key = serialization.load_ssh_public_key(key_file.read())
169
+
170
+ if not isinstance(public_key, ec.EllipticCurvePublicKey):
171
+ raise ValueError(f"Not an EC public key, got {type(public_key)}")
172
+
173
+ # Verify it's one of the approved NIST curves
174
+ if not uses_nist_ec_curve(public_key):
175
+ raise ValueError(
176
+ f"EC curve {public_key.curve.name} is not an approved NIST curve"
177
+ )
178
+
179
+ except (ValueError, UnsupportedAlgorithm) as err:
180
+ flwr_exit(
181
+ ExitCode.FLWRCLI_NODE_AUTH_PUBLIC_KEY_INVALID,
182
+ str(err),
183
+ )
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:
@@ -47,6 +47,9 @@ class ExitCode:
47
47
  # SuperExec-specific exit codes (400-499)
48
48
  SUPEREXEC_INVALID_PLUGIN_CONFIG = 400
49
49
 
50
+ # FlowerCLI-specific exit codes (500-599)
51
+ FLWRCLI_NODE_AUTH_PUBLIC_KEY_INVALID = 500
52
+
50
53
  # Common exit codes (600-699)
51
54
  COMMON_ADDRESS_INVALID = 600
52
55
  COMMON_MISSING_EXTRA_REST = 601
@@ -116,6 +119,13 @@ EXIT_CODE_HELP = {
116
119
  ExitCode.SUPEREXEC_INVALID_PLUGIN_CONFIG: (
117
120
  "The YAML configuration for the SuperExec plugin is invalid."
118
121
  ),
122
+ # FlowerCLI-specific exit codes (500-599)
123
+ ExitCode.FLWRCLI_NODE_AUTH_PUBLIC_KEY_INVALID: (
124
+ "Node authentication requires a valid elliptic curve public key in the "
125
+ "SSH format and following a NIST standard elliptic curve (e.g. SECP384R1). "
126
+ "Please ensure that the file path points to a valid public key "
127
+ "file and try again."
128
+ ),
119
129
  # Common exit codes (600-699)
120
130
  ExitCode.COMMON_ADDRESS_INVALID: (
121
131
  "Please provide a valid URL, IPv4 or IPv6 address."
@@ -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
  )