flwr-nightly 1.23.0.dev20251009__tar.gz → 1.23.0.dev20251011__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 (436) hide show
  1. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/PKG-INFO +1 -1
  2. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/supernode/create.py +7 -7
  3. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/supernode/ls.py +13 -4
  4. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/exit/exit_code.py +10 -0
  5. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/control_pb2.py +6 -6
  6. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/control_pb2.pyi +5 -0
  7. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/node_pb2.py +2 -2
  8. flwr_nightly-1.23.0.dev20251011/py/flwr/proto/node_pb2.pyi +69 -0
  9. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/vce/vce_api.py +3 -0
  10. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +70 -23
  11. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/linkstate.py +34 -0
  12. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +134 -53
  13. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/constant.py +15 -0
  14. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/control_servicer.py +73 -47
  15. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/pyproject.toml +1 -1
  16. flwr_nightly-1.23.0.dev20251009/py/flwr/proto/node_pb2.pyi +0 -60
  17. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/README.md +0 -0
  18. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/__init__.py +0 -0
  19. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/app/__init__.py +0 -0
  20. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/app/error.py +0 -0
  21. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/app/exception.py +0 -0
  22. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/app/metadata.py +0 -0
  23. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/__init__.py +0 -0
  24. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/app.py +0 -0
  25. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  26. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  27. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  28. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  29. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/build.py +0 -0
  30. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  31. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/config_utils.py +0 -0
  32. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/constant.py +0 -0
  33. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/example.py +0 -0
  34. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/install.py +0 -0
  35. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/log.py +0 -0
  36. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/login/__init__.py +0 -0
  37. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/login/login.py +0 -0
  38. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/ls.py +0 -0
  39. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/__init__.py +0 -0
  40. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/new.py +0 -0
  41. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/__init__.py +0 -0
  42. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  43. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  44. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  45. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  46. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  47. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  48. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  50. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  51. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -0
  52. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  54. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  55. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  56. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  57. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  58. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -0
  59. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  60. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  61. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -0
  62. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  64. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  65. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  66. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  67. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  68. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  69. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  70. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  71. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  72. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  73. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  74. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  75. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  76. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -0
  77. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  78. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  79. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -0
  80. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  81. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  82. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  83. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  84. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  85. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  86. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -0
  87. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  88. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  89. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -0
  90. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  91. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  92. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  93. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  94. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  95. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  96. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  97. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  98. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -0
  99. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  100. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  101. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -0
  102. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/pull.py +0 -0
  103. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/run/__init__.py +0 -0
  104. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/run/run.py +0 -0
  105. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/stop.py +0 -0
  106. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/supernode/__init__.py +0 -0
  107. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/supernode/delete.py +0 -0
  108. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/cli/utils.py +0 -0
  109. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/__init__.py +0 -0
  110. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/client.py +0 -0
  111. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  112. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  113. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  114. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  115. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  116. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  117. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  118. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/message_handler/__init__.py +0 -0
  119. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/message_handler/message_handler.py +0 -0
  120. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/__init__.py +0 -0
  121. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/centraldp_mods.py +0 -0
  122. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/comms_mods.py +0 -0
  123. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/localdp_mod.py +0 -0
  124. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  125. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  126. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  127. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/mod/utils.py +0 -0
  128. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/numpy_client.py +0 -0
  129. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/rest_client/__init__.py +0 -0
  130. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/rest_client/connection.py +0 -0
  131. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/run_info_store.py +0 -0
  132. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/client/typing.py +0 -0
  133. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/__init__.py +0 -0
  134. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/client_app.py +0 -0
  135. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/mod/__init__.py +0 -0
  136. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  137. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  138. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/typing.py +0 -0
  139. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/clientapp/utils.py +0 -0
  140. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/__init__.py +0 -0
  141. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/address.py +0 -0
  142. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/args.py +0 -0
  143. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/config.py +0 -0
  144. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/constant.py +0 -0
  145. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/context.py +0 -0
  146. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/date.py +0 -0
  147. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/differential_privacy.py +0 -0
  148. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/differential_privacy_constants.py +0 -0
  149. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/dp.py +0 -0
  150. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  151. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  152. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/exit/__init__.py +0 -0
  153. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/exit/exit.py +0 -0
  154. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/exit/exit_handler.py +0 -0
  155. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/exit/signal_handler.py +0 -0
  156. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/grpc.py +0 -0
  157. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/heartbeat.py +0 -0
  158. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/inflatable.py +0 -0
  159. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  160. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/inflatable_utils.py +0 -0
  161. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/logger.py +0 -0
  162. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/message.py +0 -0
  163. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/object_ref.py +0 -0
  164. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/parameter.py +0 -0
  165. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/pyproject.py +0 -0
  166. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/__init__.py +0 -0
  167. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/array.py +0 -0
  168. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/arraychunk.py +0 -0
  169. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/arrayrecord.py +0 -0
  170. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/configrecord.py +0 -0
  171. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/conversion_utils.py +0 -0
  172. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/metricrecord.py +0 -0
  173. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/recorddict.py +0 -0
  174. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/record/typeddict.py +0 -0
  175. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/recorddict_compat.py +0 -0
  176. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/retry_invoker.py +0 -0
  177. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  178. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  179. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  180. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  181. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  182. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  183. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  184. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  185. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/serde.py +0 -0
  186. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/serde_utils.py +0 -0
  187. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/telemetry.py +0 -0
  188. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/typing.py +0 -0
  189. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/common/version.py +0 -0
  190. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/__init__.py +0 -0
  191. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/client/__init__.py +0 -0
  192. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/client/app.py +0 -0
  193. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  194. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  195. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/common/__init__.py +0 -0
  196. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/server/__init__.py +0 -0
  197. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/server/app.py +0 -0
  198. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/compat/simulation/__init__.py +0 -0
  199. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/__init__.py +0 -0
  200. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/appio_pb2.py +0 -0
  201. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/appio_pb2.pyi +0 -0
  202. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/clientappio_pb2.py +0 -0
  205. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  206. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/control_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/error_pb2.py +0 -0
  211. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/error_pb2.pyi +0 -0
  212. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/error_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fab_pb2.py +0 -0
  215. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fab_pb2.pyi +0 -0
  216. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fleet_pb2.py +0 -0
  219. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fleet_pb2.pyi +0 -0
  220. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  223. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  224. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/heartbeat_pb2.py +0 -0
  227. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  228. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/log_pb2.py +0 -0
  231. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/log_pb2.pyi +0 -0
  232. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/log_pb2_grpc.py +0 -0
  233. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  234. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/message_pb2.py +0 -0
  235. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/message_pb2.pyi +0 -0
  236. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/message_pb2_grpc.py +0 -0
  237. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  238. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/node_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/recorddict_pb2.py +0 -0
  241. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  242. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  243. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  244. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/run_pb2.py +0 -0
  245. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/run_pb2.pyi +0 -0
  246. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/run_pb2_grpc.py +0 -0
  247. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  248. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/serverappio_pb2.py +0 -0
  249. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  250. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  251. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  252. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/simulationio_pb2.py +0 -0
  253. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  254. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  255. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  256. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/transport_pb2.py +0 -0
  257. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/transport_pb2.pyi +0 -0
  258. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  259. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  260. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/py.typed +0 -0
  261. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/__init__.py +0 -0
  262. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/app.py +0 -0
  263. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/client_manager.py +0 -0
  264. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/client_proxy.py +0 -0
  265. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/compat/__init__.py +0 -0
  266. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/compat/app.py +0 -0
  267. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/compat/app_utils.py +0 -0
  268. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  269. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/compat/legacy_context.py +0 -0
  270. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/criterion.py +0 -0
  271. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  272. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/grid/__init__.py +0 -0
  273. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/grid/grid.py +0 -0
  274. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/grid/grpc_grid.py +0 -0
  275. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/grid/inmemory_grid.py +0 -0
  276. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/history.py +0 -0
  277. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/run_serverapp.py +0 -0
  278. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/server.py +0 -0
  279. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/server_app.py +0 -0
  280. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/server_config.py +0 -0
  281. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/serverapp/__init__.py +0 -0
  282. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/serverapp/app.py +0 -0
  283. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/serverapp_components.py +0 -0
  284. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/__init__.py +0 -0
  285. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/aggregate.py +0 -0
  286. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/bulyan.py +0 -0
  287. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  288. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  289. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  290. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  291. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  292. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedadagrad.py +0 -0
  293. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedadam.py +0 -0
  294. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedavg.py +0 -0
  295. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedavg_android.py +0 -0
  296. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedavgm.py +0 -0
  297. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedmedian.py +0 -0
  298. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedopt.py +0 -0
  299. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedprox.py +0 -0
  300. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  301. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  302. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  303. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  304. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/fedyogi.py +0 -0
  305. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/krum.py +0 -0
  306. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/qfedavg.py +0 -0
  307. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/strategy/strategy.py +0 -0
  308. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/__init__.py +0 -0
  309. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  310. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  311. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  312. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  313. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  314. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  315. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  316. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  317. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  318. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  319. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
  320. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  321. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  322. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  323. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  324. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  325. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  326. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  327. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  328. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  329. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  330. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  331. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  332. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  333. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  334. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  335. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  336. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  337. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/superlink/utils.py +0 -0
  338. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/typing.py +0 -0
  339. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/utils/__init__.py +0 -0
  340. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/utils/tensorboard.py +0 -0
  341. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/utils/validator.py +0 -0
  342. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/__init__.py +0 -0
  343. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/constant.py +0 -0
  344. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/default_workflows.py +0 -0
  345. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  346. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  347. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  348. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/__init__.py +0 -0
  349. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/exception.py +0 -0
  350. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/__init__.py +0 -0
  351. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  352. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  353. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  354. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  355. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  356. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  357. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  358. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  359. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  360. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  361. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  362. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  363. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  364. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  365. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/krum.py +0 -0
  366. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  367. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  368. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/result.py +0 -0
  369. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/strategy.py +0 -0
  370. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  371. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/__init__.py +0 -0
  372. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/app.py +0 -0
  373. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/legacy_app.py +0 -0
  374. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  375. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  376. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  377. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/ray_transport/utils.py +0 -0
  378. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/run_simulation.py +0 -0
  379. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/simulation/simulationio_connection.py +0 -0
  380. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/__init__.py +0 -0
  381. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/app_utils.py +0 -0
  382. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/cli/__init__.py +0 -0
  383. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  384. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/corestate/__init__.py +0 -0
  385. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/corestate/corestate.py +0 -0
  386. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/ffs/__init__.py +0 -0
  387. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  388. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/ffs/ffs.py +0 -0
  389. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  390. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  391. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  392. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  393. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  394. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  395. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/object_store/__init__.py +0 -0
  396. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  397. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/object_store/object_store.py +0 -0
  398. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  399. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/object_store/utils.py +0 -0
  400. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/primitives/__init__.py +0 -0
  401. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/primitives/asymmetric.py +0 -0
  402. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/__init__.py +0 -0
  403. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  404. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  405. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  406. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  407. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  408. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  409. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  410. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supercore/utils.py +0 -0
  411. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/__init__.py +0 -0
  412. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  413. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  414. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  415. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  416. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  417. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/__init__.py +0 -0
  418. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  419. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  420. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  421. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  422. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  423. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/__init__.py +0 -0
  424. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/cli/__init__.py +0 -0
  425. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  426. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  427. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/nodestate/__init__.py +0 -0
  428. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  429. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  430. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  431. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/runtime/__init__.py +0 -0
  432. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  433. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/servicer/__init__.py +0 -0
  434. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  435. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  436. {flwr_nightly-1.23.0.dev20251009 → flwr_nightly-1.23.0.dev20251011}/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.dev20251009
3
+ Version: 1.23.0.dev20251011
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
@@ -21,6 +21,7 @@ from pathlib import Path
21
21
  from typing import Annotated, Optional
22
22
 
23
23
  import typer
24
+ from cryptography.exceptions import UnsupportedAlgorithm
24
25
  from cryptography.hazmat.primitives import serialization
25
26
  from cryptography.hazmat.primitives.asymmetric import ec
26
27
  from rich.console import Console
@@ -32,6 +33,7 @@ from flwr.cli.config_utils import (
32
33
  validate_federation_in_project_config,
33
34
  )
34
35
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
36
+ from flwr.common.exit import ExitCode, flwr_exit
35
37
  from flwr.common.logger import print_json_error, redirect_output, restore_output
36
38
  from flwr.proto.control_pb2 import ( # pylint: disable=E0611
37
39
  CreateNodeCliRequest,
@@ -163,7 +165,7 @@ def try_load_public_key(public_key_path: Path) -> bytes:
163
165
 
164
166
  with open(public_key_path, "rb") as key_file:
165
167
  try:
166
- public_key = serialization.load_pem_public_key(key_file.read())
168
+ public_key = serialization.load_ssh_public_key(key_file.read())
167
169
 
168
170
  if not isinstance(public_key, ec.EllipticCurvePublicKey):
169
171
  raise ValueError(f"Not an EC public key, got {type(public_key)}")
@@ -174,11 +176,9 @@ def try_load_public_key(public_key_path: Path) -> bytes:
174
176
  f"EC curve {public_key.curve.name} is not an approved NIST curve"
175
177
  )
176
178
 
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,
179
+ except (ValueError, UnsupportedAlgorithm) as err:
180
+ flwr_exit(
181
+ ExitCode.FLWRCLI_NODE_AUTH_PUBLIC_KEY_INVALID,
182
+ str(err),
182
183
  )
183
- raise typer.Exit(code=1) from err
184
184
  return public_key_to_bytes(public_key)
@@ -47,7 +47,7 @@ from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugi
47
47
  _NodeListType = tuple[int, str, str, str, str, str, str, str]
48
48
 
49
49
 
50
- def ls( # pylint: disable=R0914
50
+ def ls( # pylint: disable=R0914, R0913, R0917
51
51
  ctx: typer.Context,
52
52
  app: Annotated[
53
53
  Path,
@@ -73,6 +73,13 @@ def ls( # pylint: disable=R0914
73
73
  help="Enable verbose output",
74
74
  ),
75
75
  ] = False,
76
+ dry_run: Annotated[
77
+ bool,
78
+ typer.Option(
79
+ "--dry-run",
80
+ help="Simulate the command without contacting any SuperNodes",
81
+ ),
82
+ ] = False,
76
83
  ) -> None:
77
84
  """List SuperNodes in the federation."""
78
85
  # Resolve command used (list or ls)
@@ -98,7 +105,7 @@ def ls( # pylint: disable=R0914
98
105
  channel = init_channel(app, federation_config, auth_plugin)
99
106
  stub = ControlStub(channel)
100
107
  typer.echo("📄 Listing all nodes...")
101
- formatted_nodes = _list_nodes(stub)
108
+ formatted_nodes = _list_nodes(stub, dry_run=dry_run)
102
109
  restore_output()
103
110
  if output_format == CliOutputFormat.JSON:
104
111
  Console().print_json(_to_json(formatted_nodes, verbose=verbose))
@@ -125,10 +132,12 @@ def ls( # pylint: disable=R0914
125
132
  captured_output.close()
126
133
 
127
134
 
128
- def _list_nodes(stub: ControlStub) -> list[_NodeListType]:
135
+ def _list_nodes(stub: ControlStub, dry_run: bool) -> list[_NodeListType]:
129
136
  """List all nodes."""
130
137
  with flwr_cli_grpc_exc_handler():
131
- res: ListNodesCliResponse = stub.ListNodesCli(ListNodesCliRequest())
138
+ res: ListNodesCliResponse = stub.ListNodesCli(
139
+ ListNodesCliRequest(dry_run=dry_run)
140
+ )
132
141
 
133
142
  return _format_nodes(list(res.nodes_info), res.now)
134
143
 
@@ -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(\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')
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\"&\n\x13ListNodesCliRequest\x12\x0f\n\x07\x64ry_run\x18\x01 \x01(\x08\"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)
@@ -71,9 +71,9 @@ if _descriptor._USE_C_DESCRIPTORS == False:
71
71
  _globals['_DELETENODECLIRESPONSE']._serialized_start=1398
72
72
  _globals['_DELETENODECLIRESPONSE']._serialized_end=1421
73
73
  _globals['_LISTNODESCLIREQUEST']._serialized_start=1423
74
- _globals['_LISTNODESCLIREQUEST']._serialized_end=1444
75
- _globals['_LISTNODESCLIRESPONSE']._serialized_start=1446
76
- _globals['_LISTNODESCLIRESPONSE']._serialized_end=1523
77
- _globals['_CONTROL']._serialized_start=1526
78
- _globals['_CONTROL']._serialized_end=2363
74
+ _globals['_LISTNODESCLIREQUEST']._serialized_end=1461
75
+ _globals['_LISTNODESCLIRESPONSE']._serialized_start=1463
76
+ _globals['_LISTNODESCLIRESPONSE']._serialized_end=1540
77
+ _globals['_CONTROL']._serialized_start=1543
78
+ _globals['_CONTROL']._serialized_end=2380
79
79
  # @@protoc_insertion_point(module_scope)
@@ -279,8 +279,13 @@ global___DeleteNodeCliResponse = DeleteNodeCliResponse
279
279
 
280
280
  class ListNodesCliRequest(google.protobuf.message.Message):
281
281
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
282
+ DRY_RUN_FIELD_NUMBER: builtins.int
283
+ dry_run: builtins.bool
282
284
  def __init__(self,
285
+ *,
286
+ dry_run: builtins.bool = ...,
283
287
  ) -> None: ...
288
+ def ClearField(self, field_name: typing_extensions.Literal["dry_run",b"dry_run"]) -> None: ...
284
289
  global___ListNodesCliRequest = ListNodesCliRequest
285
290
 
286
291
  class ListNodesCliResponse(google.protobuf.message.Message):
@@ -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\"\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')
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\"\xc6\x02\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\x1e\n\x11last_activated_at\x18\x05 \x01(\tH\x00\x88\x01\x01\x12 \n\x13last_deactivated_at\x18\x06 \x01(\tH\x01\x88\x01\x01\x12\x17\n\ndeleted_at\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x19\n\x0conline_until\x18\x08 \x01(\x01H\x03\x88\x01\x01\x12\x1a\n\x12heartbeat_interval\x18\t \x01(\x01\x12\x12\n\npublic_key\x18\n \x01(\x0c\x42\x14\n\x12_last_activated_atB\x16\n\x14_last_deactivated_atB\r\n\x0b_deleted_atB\x0f\n\r_online_untilb\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=291
27
+ _globals['_NODEINFO']._serialized_end=389
28
28
  # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,69 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import google.protobuf.descriptor
7
+ import google.protobuf.message
8
+ import typing
9
+ import typing_extensions
10
+
11
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
12
+
13
+ class Node(google.protobuf.message.Message):
14
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
15
+ NODE_ID_FIELD_NUMBER: builtins.int
16
+ node_id: builtins.int
17
+ def __init__(self,
18
+ *,
19
+ node_id: builtins.int = ...,
20
+ ) -> None: ...
21
+ def ClearField(self, field_name: typing_extensions.Literal["node_id",b"node_id"]) -> None: ...
22
+ global___Node = Node
23
+
24
+ class NodeInfo(google.protobuf.message.Message):
25
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
26
+ NODE_ID_FIELD_NUMBER: builtins.int
27
+ OWNER_AID_FIELD_NUMBER: builtins.int
28
+ STATUS_FIELD_NUMBER: builtins.int
29
+ CREATED_AT_FIELD_NUMBER: builtins.int
30
+ LAST_ACTIVATED_AT_FIELD_NUMBER: builtins.int
31
+ LAST_DEACTIVATED_AT_FIELD_NUMBER: builtins.int
32
+ DELETED_AT_FIELD_NUMBER: builtins.int
33
+ ONLINE_UNTIL_FIELD_NUMBER: builtins.int
34
+ HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
35
+ PUBLIC_KEY_FIELD_NUMBER: builtins.int
36
+ node_id: builtins.int
37
+ owner_aid: typing.Text
38
+ status: typing.Text
39
+ created_at: typing.Text
40
+ last_activated_at: typing.Text
41
+ last_deactivated_at: typing.Text
42
+ deleted_at: typing.Text
43
+ online_until: builtins.float
44
+ heartbeat_interval: builtins.float
45
+ public_key: builtins.bytes
46
+ def __init__(self,
47
+ *,
48
+ node_id: builtins.int = ...,
49
+ owner_aid: typing.Text = ...,
50
+ status: typing.Text = ...,
51
+ created_at: typing.Text = ...,
52
+ last_activated_at: typing.Optional[typing.Text] = ...,
53
+ last_deactivated_at: typing.Optional[typing.Text] = ...,
54
+ deleted_at: typing.Optional[typing.Text] = ...,
55
+ online_until: typing.Optional[builtins.float] = ...,
56
+ heartbeat_interval: builtins.float = ...,
57
+ public_key: builtins.bytes = ...,
58
+ ) -> None: ...
59
+ def HasField(self, field_name: typing_extensions.Literal["_deleted_at",b"_deleted_at","_last_activated_at",b"_last_activated_at","_last_deactivated_at",b"_last_deactivated_at","_online_until",b"_online_until","deleted_at",b"deleted_at","last_activated_at",b"last_activated_at","last_deactivated_at",b"last_deactivated_at","online_until",b"online_until"]) -> builtins.bool: ...
60
+ def ClearField(self, field_name: typing_extensions.Literal["_deleted_at",b"_deleted_at","_last_activated_at",b"_last_activated_at","_last_deactivated_at",b"_last_deactivated_at","_online_until",b"_online_until","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: ...
61
+ @typing.overload
62
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_deleted_at",b"_deleted_at"]) -> typing.Optional[typing_extensions.Literal["deleted_at"]]: ...
63
+ @typing.overload
64
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_last_activated_at",b"_last_activated_at"]) -> typing.Optional[typing_extensions.Literal["last_activated_at"]]: ...
65
+ @typing.overload
66
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_last_deactivated_at",b"_last_deactivated_at"]) -> typing.Optional[typing_extensions.Literal["last_deactivated_at"]]: ...
67
+ @typing.overload
68
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_online_until",b"_online_until"]) -> typing.Optional[typing_extensions.Literal["online_until"]]: ...
69
+ global___NodeInfo = NodeInfo
@@ -63,6 +63,9 @@ def _register_nodes(
63
63
  secrets.token_bytes(32),
64
64
  heartbeat_interval=HEARTBEAT_MAX_INTERVAL,
65
65
  )
66
+ state.acknowledge_node_heartbeat(
67
+ node_id=node_id, heartbeat_interval=HEARTBEAT_MAX_INTERVAL
68
+ )
66
69
  nodes_mapping[node_id] = i
67
70
  log(DEBUG, "Registered %i nodes", len(nodes_mapping))
68
71
  return nodes_mapping
@@ -19,7 +19,9 @@ import secrets
19
19
  import threading
20
20
  from bisect import bisect_right
21
21
  from collections import defaultdict
22
+ from collections.abc import Sequence
22
23
  from dataclasses import dataclass, field
24
+ from datetime import datetime
23
25
  from logging import ERROR, WARNING
24
26
  from typing import Optional
25
27
 
@@ -41,6 +43,7 @@ from flwr.common.typing import Run, RunStatus, UserConfig
41
43
  from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
42
44
  from flwr.server.superlink.linkstate.linkstate import LinkState
43
45
  from flwr.server.utils import validate_message
46
+ from flwr.supercore.constant import NodeStatus
44
47
 
45
48
  from .utils import (
46
49
  check_node_availability_for_in_message,
@@ -346,17 +349,16 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
346
349
  if public_key in self.registered_node_public_keys:
347
350
  raise ValueError("Public key already in use")
348
351
 
349
- # Mark the node online until now().timestamp() + heartbeat_interval
350
- current = now()
352
+ # The node is not activated upon creation
351
353
  self.nodes[node_id] = NodeInfo(
352
354
  node_id=node_id,
353
- owner_aid=owner_aid, # Unused for now
354
- status="created", # Unused for now
355
- created_at=current.isoformat(), # Unused for now
356
- last_activated_at=current.isoformat(), # Unused for now
357
- last_deactivated_at="", # Unused for now
358
- deleted_at="", # Unused for now
359
- online_until=current.timestamp() + heartbeat_interval,
355
+ owner_aid=owner_aid,
356
+ status=NodeStatus.CREATED,
357
+ created_at=now().isoformat(),
358
+ last_activated_at=None,
359
+ last_deactivated_at=None,
360
+ deleted_at=None,
361
+ online_until=None,
360
362
  heartbeat_interval=heartbeat_interval,
361
363
  public_key=public_key,
362
364
  )
@@ -367,13 +369,18 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
367
369
  def delete_node(self, owner_aid: str, node_id: int) -> None:
368
370
  """Delete a node."""
369
371
  with self.lock:
370
- if node_id not in self.nodes or owner_aid != self.nodes[node_id].owner_aid:
372
+ if (
373
+ not (node := self.nodes.get(node_id))
374
+ or node.status == NodeStatus.DELETED
375
+ or owner_aid != self.nodes[node_id].owner_aid
376
+ ):
371
377
  raise ValueError(
372
- f"Node ID {node_id} not found or unauthorized deletion attempt."
378
+ f"Node ID {node_id} already deleted, not found or unauthorized "
379
+ "deletion attempt."
373
380
  )
374
381
 
375
- node = self.nodes.pop(node_id)
376
- self.registered_node_public_keys.discard(node.public_key)
382
+ node.status = NodeStatus.DELETED
383
+ node.deleted_at = now().isoformat()
377
384
 
378
385
  def get_nodes(self, run_id: int) -> set[int]:
379
386
  """Return all available nodes.
@@ -386,19 +393,51 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
386
393
  with self.lock:
387
394
  if run_id not in self.run_ids:
388
395
  return set()
389
- current_time = now().timestamp()
390
396
  return {
391
- info.node_id
392
- for info in self.nodes.values()
393
- if info.online_until > current_time
397
+ node.node_id
398
+ for node in self.get_node_info(statuses=[NodeStatus.ONLINE])
394
399
  }
395
400
 
401
+ def get_node_info(
402
+ self,
403
+ *,
404
+ node_ids: Optional[Sequence[int]] = None,
405
+ owner_aids: Optional[Sequence[str]] = None,
406
+ statuses: Optional[Sequence[str]] = None,
407
+ ) -> Sequence[NodeInfo]:
408
+ """Retrieve information about nodes based on the specified filters."""
409
+ with self.lock:
410
+ self._check_and_tag_deactivated_nodes()
411
+ result = []
412
+ for node in self.nodes.values():
413
+ if node_ids is not None and node.node_id not in node_ids:
414
+ continue
415
+ if owner_aids is not None and node.owner_aid not in owner_aids:
416
+ continue
417
+ if statuses is not None and node.status not in statuses:
418
+ continue
419
+ result.append(node)
420
+ return result
421
+
422
+ def _check_and_tag_deactivated_nodes(self) -> None:
423
+ with self.lock:
424
+ # Set all nodes of "online" status to "offline" if they've offline
425
+ current_ts = now().timestamp()
426
+ for node in self.nodes.values():
427
+ if node.status == NodeStatus.ONLINE:
428
+ if node.online_until <= current_ts:
429
+ node.status = NodeStatus.OFFLINE
430
+ node.last_deactivated_at = datetime.fromtimestamp(
431
+ node.online_until
432
+ ).isoformat()
433
+
396
434
  def get_node_public_key(self, node_id: int) -> bytes:
397
435
  """Get `public_key` for the specified `node_id`."""
398
436
  with self.lock:
399
- if (node := self.nodes.get(node_id)) is None:
437
+ if (
438
+ node := self.nodes.get(node_id)
439
+ ) is None or node.status == NodeStatus.DELETED:
400
440
  raise ValueError(f"Node ID {node_id} not found")
401
-
402
441
  return node.public_key
403
442
 
404
443
  # pylint: disable=too-many-arguments,too-many-positional-arguments
@@ -606,11 +645,19 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
606
645
  the node is marked as offline.
607
646
  """
608
647
  with self.lock:
609
- if info := self.nodes.get(node_id):
610
- info.online_until = (
611
- now().timestamp() + HEARTBEAT_PATIENCE * heartbeat_interval
648
+ if (node := self.nodes.get(node_id)) and node.status != NodeStatus.DELETED:
649
+ current_dt = now()
650
+
651
+ # Set timestamp if the status changes
652
+ if node.status != NodeStatus.ONLINE: # offline or created
653
+ node.status = NodeStatus.ONLINE
654
+ node.last_activated_at = current_dt.isoformat()
655
+
656
+ # Refresh `online_until` and `heartbeat_interval`
657
+ node.online_until = (
658
+ current_dt.timestamp() + HEARTBEAT_PATIENCE * heartbeat_interval
612
659
  )
613
- info.heartbeat_interval = heartbeat_interval
660
+ node.heartbeat_interval = heartbeat_interval
614
661
  return True
615
662
  return False
616
663
 
@@ -16,11 +16,13 @@
16
16
 
17
17
 
18
18
  import abc
19
+ from collections.abc import Sequence
19
20
  from typing import Optional
20
21
 
21
22
  from flwr.common import Context, Message
22
23
  from flwr.common.record import ConfigRecord
23
24
  from flwr.common.typing import Run, RunStatus, UserConfig
25
+ from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
24
26
  from flwr.supercore.corestate import CoreState
25
27
 
26
28
 
@@ -147,6 +149,38 @@ class LinkState(CoreState): # pylint: disable=R0904
147
149
  an empty `Set` MUST be returned.
148
150
  """
149
151
 
152
+ @abc.abstractmethod
153
+ def get_node_info(
154
+ self,
155
+ *,
156
+ node_ids: Optional[Sequence[int]] = None,
157
+ owner_aids: Optional[Sequence[str]] = None,
158
+ statuses: Optional[Sequence[str]] = None,
159
+ ) -> Sequence[NodeInfo]:
160
+ """Retrieve information about nodes based on the specified filters.
161
+
162
+ If a filter is set to None, it is ignored.
163
+ If multiple filters are provided, they are combined using AND logic.
164
+
165
+ Parameters
166
+ ----------
167
+ node_ids : Optional[Sequence[int]] (default: None)
168
+ Sequence of node IDs to filter by. If a sequence is provided,
169
+ it is treated as an OR condition.
170
+ owner_aids : Optional[Sequence[str]] (default: None)
171
+ Sequence of owner account IDs to filter by. If a sequence is provided,
172
+ it is treated as an OR condition.
173
+ statuses : Optional[Sequence[str]] (default: None)
174
+ Sequence of node status values (e.g., "created", "activated")
175
+ to filter by. If a sequence is provided, it is treated as an OR condition.
176
+
177
+ Returns
178
+ -------
179
+ Sequence[NodeInfo]
180
+ A sequence of NodeInfo objects representing the nodes matching
181
+ the specified filters.
182
+ """
183
+
150
184
  @abc.abstractmethod
151
185
  def get_node_public_key(self, node_id: int) -> bytes:
152
186
  """Get `public_key` for the specified `node_id`.