flwr-nightly 1.26.0.dev20260109__tar.gz → 1.26.0.dev20260113__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 (395) hide show
  1. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/PKG-INFO +2 -1
  2. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app.py +6 -6
  3. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +8 -1
  4. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/federation/__init__.py +0 -2
  5. flwr_nightly-1.26.0.dev20260109/py/flwr/cli/federation/show.py → flwr_nightly-1.26.0.dev20260113/py/flwr/cli/federation/ls.py +113 -70
  6. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/utils.py +215 -0
  7. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/constant.py +63 -0
  8. flwr_nightly-1.26.0.dev20260113/py/flwr/supercore/typing.py +97 -0
  9. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/utils.py +14 -0
  10. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +6 -4
  11. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/pyproject.toml +2 -1
  12. flwr_nightly-1.26.0.dev20260109/py/flwr/cli/federation/ls.py +0 -140
  13. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/README.md +0 -0
  14. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/__init__.py +0 -0
  15. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/__init__.py +0 -0
  16. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/error.py +0 -0
  17. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/exception.py +0 -0
  18. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/message_type.py +0 -0
  19. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/metadata.py +0 -0
  20. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/app/user_config.py +0 -0
  21. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/__init__.py +0 -0
  22. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/__init__.py +0 -0
  23. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/publish.py +0 -0
  24. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/app_cmd/review.py +0 -0
  25. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  26. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  27. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  28. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/build.py +0 -0
  29. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  30. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/config_utils.py +0 -0
  31. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/constant.py +0 -0
  32. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/example.py +0 -0
  33. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/install.py +0 -0
  34. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/log.py +0 -0
  35. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/login/__init__.py +0 -0
  36. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/login/login.py +0 -0
  37. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/ls.py +0 -0
  38. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/new/__init__.py +0 -0
  39. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/new/new.py +0 -0
  40. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/pull.py +0 -0
  41. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run/__init__.py +0 -0
  42. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run/run.py +0 -0
  43. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/run_utils.py +0 -0
  44. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/stop.py +0 -0
  45. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/__init__.py +0 -0
  46. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/ls.py +0 -0
  47. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/register.py +0 -0
  48. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/cli/supernode/unregister.py +0 -0
  49. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/__init__.py +0 -0
  50. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/client.py +0 -0
  51. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  52. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  53. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  54. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  55. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  56. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  57. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  58. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/message_handler/__init__.py +0 -0
  59. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/message_handler/message_handler.py +0 -0
  60. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/__init__.py +0 -0
  61. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/centraldp_mods.py +0 -0
  62. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/comms_mods.py +0 -0
  63. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/localdp_mod.py +0 -0
  64. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  65. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  66. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  67. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/mod/utils.py +0 -0
  68. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/numpy_client.py +0 -0
  69. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/rest_client/__init__.py +0 -0
  70. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/rest_client/connection.py +0 -0
  71. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/run_info_store.py +0 -0
  72. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/client/typing.py +0 -0
  73. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/__init__.py +0 -0
  74. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/client_app.py +0 -0
  75. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/__init__.py +0 -0
  76. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  77. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  78. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/typing.py +0 -0
  79. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/clientapp/utils.py +0 -0
  80. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/__init__.py +0 -0
  81. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/args.py +0 -0
  82. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/config.py +0 -0
  83. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/constant.py +0 -0
  84. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/context.py +0 -0
  85. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/differential_privacy.py +0 -0
  86. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/differential_privacy_constants.py +0 -0
  87. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/dp.py +0 -0
  88. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  89. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  90. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/__init__.py +0 -0
  91. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit.py +0 -0
  92. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit_code.py +0 -0
  93. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/exit_handler.py +0 -0
  94. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/exit/signal_handler.py +0 -0
  95. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/grpc.py +0 -0
  96. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable.py +0 -0
  97. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  98. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/inflatable_utils.py +0 -0
  99. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/logger.py +0 -0
  100. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/message.py +0 -0
  101. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/object_ref.py +0 -0
  102. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/parameter.py +0 -0
  103. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/__init__.py +0 -0
  104. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/array.py +0 -0
  105. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/arraychunk.py +0 -0
  106. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/arrayrecord.py +0 -0
  107. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/configrecord.py +0 -0
  108. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/conversion_utils.py +0 -0
  109. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/metricrecord.py +0 -0
  110. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/recorddict.py +0 -0
  111. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/record/typeddict.py +0 -0
  112. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/recorddict_compat.py +0 -0
  113. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/retry_invoker.py +0 -0
  114. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  115. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  116. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  117. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  118. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  119. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  120. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  121. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  122. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/serde.py +0 -0
  123. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/serde_utils.py +0 -0
  124. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/telemetry.py +0 -0
  125. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/common/typing.py +0 -0
  126. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/__init__.py +0 -0
  127. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/__init__.py +0 -0
  128. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/app.py +0 -0
  129. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  130. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  131. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/common/__init__.py +0 -0
  132. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/common/constant.py +0 -0
  133. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/server/__init__.py +0 -0
  134. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/server/app.py +0 -0
  135. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/compat/simulation/__init__.py +0 -0
  136. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/__init__.py +0 -0
  137. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2.py +0 -0
  138. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2.pyi +0 -0
  139. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  140. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  141. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2.py +0 -0
  142. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  143. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  144. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  145. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2.py +0 -0
  146. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2.pyi +0 -0
  147. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2_grpc.py +0 -0
  148. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  149. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2.py +0 -0
  150. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2.pyi +0 -0
  151. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2_grpc.py +0 -0
  152. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  153. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2.py +0 -0
  154. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2.pyi +0 -0
  155. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  156. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  157. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2.py +0 -0
  158. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2.pyi +0 -0
  159. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2_grpc.py +0 -0
  160. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
  161. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2.py +0 -0
  162. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2.pyi +0 -0
  163. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  166. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  167. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2.py +0 -0
  170. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  171. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2.py +0 -0
  174. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2.pyi +0 -0
  175. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2.py +0 -0
  178. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2.pyi +0 -0
  179. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2.py +0 -0
  182. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2.pyi +0 -0
  183. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2.py +0 -0
  186. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  187. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2.py +0 -0
  190. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2.pyi +0 -0
  191. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2.py +0 -0
  194. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  195. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2.py +0 -0
  198. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  199. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2.py +0 -0
  202. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2.pyi +0 -0
  203. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/py.typed +0 -0
  206. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/__init__.py +0 -0
  207. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/app.py +0 -0
  208. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/client_manager.py +0 -0
  209. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/client_proxy.py +0 -0
  210. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/__init__.py +0 -0
  211. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/app.py +0 -0
  212. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/app_utils.py +0 -0
  213. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  214. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/compat/legacy_context.py +0 -0
  215. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/criterion.py +0 -0
  216. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  217. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/__init__.py +0 -0
  218. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/grid.py +0 -0
  219. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/grpc_grid.py +0 -0
  220. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/grid/inmemory_grid.py +0 -0
  221. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/history.py +0 -0
  222. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/run_serverapp.py +0 -0
  223. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server.py +0 -0
  224. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server_app.py +0 -0
  225. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/server_config.py +0 -0
  226. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp/__init__.py +0 -0
  227. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp/app.py +0 -0
  228. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/serverapp_components.py +0 -0
  229. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/__init__.py +0 -0
  230. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/aggregate.py +0 -0
  231. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/bulyan.py +0 -0
  232. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  233. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  234. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  235. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  236. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  237. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedadagrad.py +0 -0
  238. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedadam.py +0 -0
  239. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavg.py +0 -0
  240. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavg_android.py +0 -0
  241. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedavgm.py +0 -0
  242. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedmedian.py +0 -0
  243. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedopt.py +0 -0
  244. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedprox.py +0 -0
  245. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  246. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  247. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  248. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  249. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/fedyogi.py +0 -0
  250. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/krum.py +0 -0
  251. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/qfedavg.py +0 -0
  252. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/strategy/strategy.py +0 -0
  253. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/__init__.py +0 -0
  254. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  255. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  256. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  257. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  258. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  259. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  260. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  261. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  262. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  263. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  264. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
  265. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  266. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  267. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  268. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  269. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  270. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  271. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  272. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  273. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  274. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  275. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  276. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  277. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  278. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  279. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  280. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  281. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  282. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  283. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  284. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  285. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  286. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/superlink/utils.py +0 -0
  287. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/typing.py +0 -0
  288. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/__init__.py +0 -0
  289. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/tensorboard.py +0 -0
  290. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/utils/validator.py +0 -0
  291. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/__init__.py +0 -0
  292. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/constant.py +0 -0
  293. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/default_workflows.py +0 -0
  294. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  295. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  296. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  297. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/__init__.py +0 -0
  298. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/exception.py +0 -0
  299. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/__init__.py +0 -0
  300. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  301. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  302. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  303. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  304. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  305. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  306. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  307. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  308. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  309. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  310. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  311. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  312. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  313. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  314. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/krum.py +0 -0
  315. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  316. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  317. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/result.py +0 -0
  318. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/strategy.py +0 -0
  319. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  320. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/__init__.py +0 -0
  321. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/app.py +0 -0
  322. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/legacy_app.py +0 -0
  323. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  324. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  325. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  326. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/ray_transport/utils.py +0 -0
  327. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/run_simulation.py +0 -0
  328. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/simulation/simulationio_connection.py +0 -0
  329. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/__init__.py +0 -0
  330. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/address.py +0 -0
  331. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/app_utils.py +0 -0
  332. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/cli/__init__.py +0 -0
  333. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  334. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/__init__.py +0 -0
  335. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/corestate.py +0 -0
  336. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
  337. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
  338. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/date.py +0 -0
  339. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/__init__.py +0 -0
  340. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  341. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/ffs.py +0 -0
  342. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  343. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  344. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  345. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  346. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/heartbeat.py +0 -0
  347. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  348. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  349. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/__init__.py +0 -0
  350. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  351. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/object_store.py +0 -0
  352. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  353. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
  354. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/__init__.py +0 -0
  355. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/asymmetric.py +0 -0
  356. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
  357. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/sqlite_mixin.py +0 -0
  358. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/__init__.py +0 -0
  359. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  360. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  361. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  362. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  363. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  364. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  365. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  366. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supercore/version.py +0 -0
  367. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/__init__.py +0 -0
  368. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  369. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  370. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  371. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  372. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  373. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/__init__.py +0 -0
  374. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/federation_manager.py +0 -0
  375. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
  376. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/__init__.py +0 -0
  377. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  378. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  379. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  380. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  381. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  382. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  383. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/__init__.py +0 -0
  384. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/__init__.py +0 -0
  385. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  386. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  387. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/__init__.py +0 -0
  388. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  389. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  390. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  391. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/runtime/__init__.py +0 -0
  392. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  393. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/__init__.py +0 -0
  394. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  395. {flwr_nightly-1.26.0.dev20260109 → flwr_nightly-1.26.0.dev20260113}/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.26.0.dev20260109
3
+ Version: 1.26.0.dev20260113
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
@@ -30,6 +30,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Classifier: Typing :: Typed
31
31
  Provides-Extra: rest
32
32
  Provides-Extra: simulation
33
+ Requires-Dist: SQLAlchemy (>=2.0.45,<3.0.0)
33
34
  Requires-Dist: click (<8.2.0)
34
35
  Requires-Dist: cryptography (>=44.0.1,<45.0.0)
35
36
  Requires-Dist: grpcio (>=1.70.0,<2.0.0)
@@ -23,7 +23,6 @@ from .app_cmd import publish as app_publish
23
23
  from .app_cmd import review as app_review
24
24
  from .build import build
25
25
  from .federation import ls as federation_list
26
- from .federation import show as federation_show
27
26
  from .install import install
28
27
  from .log import log
29
28
  from .login import login
@@ -35,6 +34,7 @@ from .stop import stop
35
34
  from .supernode import ls as supernode_list
36
35
  from .supernode import register as supernode_register
37
36
  from .supernode import unregister as supernode_unregister
37
+ from .utils import init_flwr_config
38
38
 
39
39
  app = typer.Typer(
40
40
  help=typer.style(
@@ -80,14 +80,13 @@ federation_app.command("list")(federation_list)
80
80
  # Hide "ls" command (left as alias)
81
81
  federation_app.command(hidden=True)(federation_list)
82
82
  app.add_typer(federation_app, name="federation")
83
- federation_app.command()(federation_show)
84
83
 
85
84
  typer_click_object = get_command(app)
86
85
 
87
86
 
88
87
  @app.callback(invoke_without_command=True)
89
- def version_callback(
90
- ver: bool = typer.Option(
88
+ def main(
89
+ version: bool = typer.Option(
91
90
  None,
92
91
  "-V",
93
92
  "--version",
@@ -95,8 +94,9 @@ def version_callback(
95
94
  help="Show the version and exit.",
96
95
  ),
97
96
  ) -> None:
98
- """Print version."""
99
- if ver:
97
+ """Flower CLI."""
98
+ init_flwr_config()
99
+ if version:
100
100
  typer.secho(f"Flower version: {package_version}", fg="blue")
101
101
  raise typer.Exit()
102
102
 
@@ -17,6 +17,7 @@
17
17
 
18
18
  import json
19
19
  import time
20
+ import webbrowser
20
21
  from collections.abc import Sequence
21
22
  from pathlib import Path
22
23
  from typing import Any
@@ -75,11 +76,17 @@ class OidcCliPlugin(CliAuthPlugin):
75
76
  LoginError
76
77
  If authentication times out.
77
78
  """
79
+ # Prompt user to login via browser
80
+ webbrowser.open(login_details.verification_uri_complete)
78
81
  typer.secho(
79
- "Please log into your Flower account here: "
82
+ "A browser window has been opened for you to "
83
+ "log into your Flower account.\n"
84
+ "If it did not open automatically, use this URL:\n"
80
85
  f"{login_details.verification_uri_complete}",
81
86
  fg=typer.colors.BLUE,
82
87
  )
88
+
89
+ # Wait for user to complete login
83
90
  start_time = time.time()
84
91
  time.sleep(login_details.interval)
85
92
 
@@ -16,9 +16,7 @@
16
16
 
17
17
 
18
18
  from .ls import ls as ls
19
- from .show import show as show
20
19
 
21
20
  __all__ = [
22
21
  "ls",
23
- "show",
24
22
  ]
@@ -12,12 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Flower command line interface `federation show` command."""
15
+ """Flower command line interface `federation list` command."""
16
16
 
17
17
 
18
18
  import io
19
19
  from pathlib import Path
20
- from typing import Annotated, Any
20
+ from typing import Annotated, Any, cast
21
21
 
22
22
  import typer
23
23
  from rich.console import Console
@@ -35,24 +35,27 @@ from flwr.common.constant import FAB_CONFIG_FILE, NOOP_ACCOUNT_NAME, CliOutputFo
35
35
  from flwr.common.logger import print_json_error, redirect_output, restore_output
36
36
  from flwr.common.serde import run_from_proto
37
37
  from flwr.proto.control_pb2 import ( # pylint: disable=E0611
38
+ ListFederationsRequest,
39
+ ListFederationsResponse,
38
40
  ShowFederationRequest,
39
41
  ShowFederationResponse,
40
42
  )
41
43
  from flwr.proto.control_pb2_grpc import ControlStub
44
+ from flwr.proto.federation_pb2 import Federation # pylint: disable=E0611
42
45
  from flwr.proto.node_pb2 import NodeInfo # pylint: disable=E0611
43
- from flwr.supercore.constant import NOOP_FEDERATION
44
46
  from flwr.supercore.utils import humanize_duration
45
47
 
46
48
  from ..run_utils import RunRow, format_runs
47
49
  from ..utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
48
50
 
49
51
 
50
- def show( # pylint: disable=R0914, R0913, R0917
52
+ def ls( # pylint: disable=R0914, R0913, R0917, R0912
53
+ ctx: typer.Context,
51
54
  app: Annotated[
52
55
  Path,
53
56
  typer.Argument(help="Path of the Flower project"),
54
57
  ] = Path("."),
55
- federation: Annotated[
58
+ toml_federation: Annotated[
56
59
  str | None,
57
60
  typer.Argument(help="Name of the federation"),
58
61
  ] = None,
@@ -64,12 +67,19 @@ def show( # pylint: disable=R0914, R0913, R0917
64
67
  help="Format output using 'default' view or 'json'",
65
68
  ),
66
69
  ] = CliOutputFormat.DEFAULT,
70
+ federation: Annotated[
71
+ str | None,
72
+ typer.Option(
73
+ "--federation",
74
+ case_sensitive=False,
75
+ help="Name of the federation to display",
76
+ ),
77
+ ] = None,
67
78
  ) -> None:
68
- """Show details of a federation.
79
+ """List available federations."""
80
+ # Resolve command used (list or ls)
81
+ command_name = cast(str, ctx.command.name) if ctx.command else "ls"
69
82
 
70
- Display comprehensive information about a federation including its members,
71
- registered SuperNodes, and runs.
72
- """
73
83
  suppress_output = output_format == CliOutputFormat.JSON
74
84
  captured_output = io.StringIO()
75
85
  try:
@@ -80,25 +90,41 @@ def show( # pylint: disable=R0914, R0913, R0917
80
90
  pyproject_path = app / FAB_CONFIG_FILE if app else None
81
91
  config, errors, warnings = load_and_validate(pyproject_path, check_module=False)
82
92
  config = process_loaded_project_config(config, errors, warnings)
83
- federation, federation_config = validate_federation_in_project_config(
84
- federation, config
93
+ toml_federation_name, federation_config = validate_federation_in_project_config(
94
+ toml_federation, config
85
95
  )
86
- exit_if_no_address(federation_config, "federation show")
87
- real_federation: str = federation_config.get("federation", NOOP_FEDERATION)
96
+ exit_if_no_address(federation_config, f"federation {command_name}")
88
97
  channel = None
89
98
  try:
90
- auth_plugin = load_cli_auth_plugin(app, federation, federation_config)
99
+ auth_plugin = load_cli_auth_plugin(
100
+ app, toml_federation_name, federation_config
101
+ )
91
102
  channel = init_channel(app, federation_config, auth_plugin)
92
103
  stub = ControlStub(channel)
93
- typer.echo(f"📄 Showing '{real_federation}' federation ...")
94
- members, nodes, runs = _show_federation(stub, real_federation)
95
- restore_output()
96
- if output_format == CliOutputFormat.JSON:
97
- Console().print_json(data=_to_json(members, nodes, runs))
104
+
105
+ if federation:
106
+ # Show specific federation details
107
+ typer.echo(f"📄 Showing '{federation}' federation ...")
108
+ members, nodes, runs = _show_federation(stub, federation)
109
+
110
+ restore_output()
111
+ if output_format == CliOutputFormat.JSON:
112
+ Console().print_json(
113
+ data=_to_json(members=members, nodes=nodes, runs=runs)
114
+ )
115
+ else:
116
+ Console().print(_to_members_table(members))
117
+ Console().print(_to_nodes_table(nodes))
118
+ Console().print(_to_runs_table(runs))
98
119
  else:
99
- Console().print(_to_members_table(members))
100
- Console().print(_to_nodes_table(nodes))
101
- Console().print(_to_runs_table(runs))
120
+ # List federations
121
+ typer.echo("📄 Listing federations...")
122
+ federations = _list_federations(stub)
123
+ restore_output()
124
+ if output_format == CliOutputFormat.JSON:
125
+ Console().print_json(data=_to_json(federations=federations))
126
+ else:
127
+ Console().print(_to_table(federations))
102
128
  finally:
103
129
  if channel:
104
130
  channel.close()
@@ -120,6 +146,71 @@ def show( # pylint: disable=R0914, R0913, R0917
120
146
  captured_output.close()
121
147
 
122
148
 
149
+ def _list_federations(stub: ControlStub) -> list[Federation]:
150
+ """List all federations."""
151
+ with flwr_cli_grpc_exc_handler():
152
+ res: ListFederationsResponse = stub.ListFederations(ListFederationsRequest())
153
+
154
+ return list(res.federations)
155
+
156
+
157
+ def _to_table(federations: list[Federation]) -> Table:
158
+ """Format the provided federations list to a rich Table."""
159
+ table = Table(header_style="bold cyan", show_lines=True)
160
+
161
+ # Add columns
162
+ table.add_column(
163
+ Text("Federation", justify="center"), style="bright_black", no_wrap=True
164
+ )
165
+
166
+ for federation in federations:
167
+ table.add_row(federation.name)
168
+
169
+ return table
170
+
171
+
172
+ def _to_json(
173
+ federations: list[Federation] | None = None,
174
+ members: list[str] | None = None,
175
+ nodes: list[NodeInfo] | None = None,
176
+ runs: list[RunRow] | None = None,
177
+ ) -> list[dict[str, str]] | list[list[dict[str, Any]]]:
178
+ """Format the provided federations list to JSON serializable format."""
179
+ if federations is not None:
180
+ return [{"name": federation.name} for federation in federations]
181
+
182
+ if members is None or nodes is None or runs is None:
183
+ return []
184
+
185
+ members_list: list[dict[str, Any]] = []
186
+ nodes_list: list[dict[str, Any]] = []
187
+ runs_list: list[dict[str, Any]] = []
188
+
189
+ for member in members:
190
+ members_list.append({"member_id": member, "role": "Member"})
191
+
192
+ for node in nodes:
193
+ nodes_list.append(
194
+ {
195
+ "node_id": f"{node.node_id}",
196
+ "owner": node.owner_name,
197
+ "status": node.status,
198
+ }
199
+ )
200
+
201
+ for run in runs:
202
+ runs_list.append(
203
+ {
204
+ "run_id": f"{run.run_id}",
205
+ "app": f"@{run.fab_id}=={run.fab_version}",
206
+ "status": run.status_text,
207
+ "elapsed": run.elapsed,
208
+ }
209
+ )
210
+
211
+ return [members_list, nodes_list, runs_list]
212
+
213
+
123
214
  def _show_federation(
124
215
  stub: ControlStub, federation: str
125
216
  ) -> tuple[list[str], list[NodeInfo], list[RunRow]]:
@@ -268,51 +359,3 @@ def _to_runs_table(run_list: list[RunRow]) -> Table:
268
359
  table.add_row(*formatted_row)
269
360
 
270
361
  return table
271
-
272
-
273
- def _to_json(
274
- members: list[str], nodes: list[NodeInfo], runs: list[RunRow]
275
- ) -> list[list[dict[str, str]]]:
276
- """Format the provided federation information to JSON serializable format.
277
-
278
- Parameters
279
- ----------
280
- members : list[str]
281
- List of member account identifiers.
282
- nodes : list[NodeInfo]
283
- List of NodeInfo objects.
284
- runs : list[RunRow]
285
- List of RunRow objects.
286
-
287
- Returns
288
- -------
289
- list[list[dict[str, str]]]
290
- Nested list containing dictionaries for members, nodes, and runs.
291
- """
292
- members_list: list[dict[str, Any]] = []
293
- nodes_list: list[dict[str, Any]] = []
294
- runs_list: list[dict[str, Any]] = []
295
-
296
- for member in members:
297
- members_list.append({"member_id": member, "role": "Member"})
298
-
299
- for node in nodes:
300
- nodes_list.append(
301
- {
302
- "node_id": f"{node.node_id}",
303
- "owner": node.owner_name,
304
- "status": node.status,
305
- }
306
- )
307
-
308
- for run in runs:
309
- runs_list.append(
310
- {
311
- "run_id": f"{run.run_id}",
312
- "app": f"@{run.fab_id}=={run.fab_version}",
313
- "status": run.status_text,
314
- "elapsed": run.elapsed,
315
- }
316
- )
317
-
318
- return [members_list, nodes_list, runs_list]
@@ -25,6 +25,7 @@ from typing import Any, cast
25
25
 
26
26
  import grpc
27
27
  import pathspec
28
+ import tomli
28
29
  import typer
29
30
 
30
31
  from flwr.common.constant import (
@@ -47,6 +48,24 @@ from flwr.common.grpc import (
47
48
  create_channel,
48
49
  on_channel_state_change,
49
50
  )
51
+ from flwr.supercore.constant import (
52
+ DEFAULT_FLOWER_CONFIG_TOML,
53
+ DEFAULT_SIMULATION_BACKEND_NAME,
54
+ FLOWER_CONFIG_FILE,
55
+ SimulationBackendConfigTomlKey,
56
+ SimulationClientResourcesTomlKey,
57
+ SimulationInitArgsTomlKey,
58
+ SuperLinkConnectionTomlKey,
59
+ SuperLinkSimulationOptionsTomlKey,
60
+ )
61
+ from flwr.supercore.typing import (
62
+ SimulationBackendConfig,
63
+ SimulationClientResources,
64
+ SimulationInitArgs,
65
+ SuperLinkConnection,
66
+ SuperLinkSimulationOptions,
67
+ )
68
+ from flwr.supercore.utils import get_flwr_home
50
69
 
51
70
  from .auth_plugin import CliAuthPlugin, get_cli_plugin_class
52
71
  from .cli_account_auth_interceptor import CliAccountAuthInterceptor
@@ -620,3 +639,199 @@ def validate_credentials_content(creds_path: Path) -> str:
620
639
  raise typer.Exit(code=1)
621
640
 
622
641
  return creds[ACCESS_TOKEN_KEY]
642
+
643
+
644
+ def _parse_simulation_options(options: dict[str, Any]) -> SuperLinkSimulationOptions:
645
+ """Parse simulation options from a dictionary in a SuperLink connection."""
646
+ num_supernodes = options.get(SuperLinkSimulationOptionsTomlKey.NUM_SUPERNODES)
647
+ # Validation handled in SuperLinkSimulationOptions.__post_init__
648
+
649
+ backend_dict = options.get(SuperLinkSimulationOptionsTomlKey.BACKEND)
650
+ simulation_backend: SimulationBackendConfig | None = None
651
+
652
+ if isinstance(backend_dict, dict):
653
+ # Parse client resources
654
+ client_resources_dict = backend_dict.get(
655
+ SimulationBackendConfigTomlKey.CLIENT_RESOURCES
656
+ )
657
+ client_resources: SimulationClientResources | None = None
658
+ if isinstance(client_resources_dict, dict):
659
+ client_resources = SimulationClientResources(
660
+ num_cpus=client_resources_dict.get(
661
+ SimulationClientResourcesTomlKey.NUM_CPUS
662
+ ),
663
+ num_gpus=client_resources_dict.get(
664
+ SimulationClientResourcesTomlKey.NUM_GPUS
665
+ ),
666
+ )
667
+
668
+ # Parse init args
669
+ init_args_dict = backend_dict.get(SimulationBackendConfigTomlKey.INIT_ARGS)
670
+ init_args: SimulationInitArgs | None = None
671
+ if isinstance(init_args_dict, dict):
672
+ init_args = SimulationInitArgs(
673
+ num_cpus=init_args_dict.get(SimulationInitArgsTomlKey.NUM_CPUS),
674
+ num_gpus=init_args_dict.get(SimulationInitArgsTomlKey.NUM_GPUS),
675
+ logging_level=init_args_dict.get(
676
+ SimulationInitArgsTomlKey.LOGGING_LEVEL
677
+ ),
678
+ log_to_drive=init_args_dict.get(SimulationInitArgsTomlKey.LOG_TO_DRIVE),
679
+ )
680
+
681
+ simulation_backend = SimulationBackendConfig(
682
+ name=backend_dict.get(
683
+ SimulationBackendConfigTomlKey.NAME, DEFAULT_SIMULATION_BACKEND_NAME
684
+ ),
685
+ client_resources=client_resources,
686
+ init_args=init_args,
687
+ )
688
+
689
+ # Note: validation happens in SuperLinkSimulationOptions.__post_init__
690
+ return SuperLinkSimulationOptions(
691
+ num_supernodes=cast(int, num_supernodes),
692
+ backend=simulation_backend,
693
+ )
694
+
695
+
696
+ def init_flwr_config() -> None:
697
+ """Initialize the Flower configuration file."""
698
+ config_path = get_flwr_home() / FLOWER_CONFIG_FILE
699
+
700
+ if not config_path.exists():
701
+ # Create parent directory if it doesn't exist
702
+ config_path.parent.mkdir(parents=True, exist_ok=True)
703
+ # Write Flower config file
704
+ config_path.write_text(DEFAULT_FLOWER_CONFIG_TOML, encoding="utf-8")
705
+
706
+ typer.secho(
707
+ f"\nFlower configuration not found. Created default configuration"
708
+ f" at {config_path}\n",
709
+ )
710
+
711
+
712
+ def parse_superlink_connection(
713
+ conn_dict: dict[str, Any], name: str
714
+ ) -> SuperLinkConnection:
715
+ """Parse SuperLink connection configuration from a TOML dictionary.
716
+
717
+ Parameters
718
+ ----------
719
+ conn_dict : dict[str, Any]
720
+ The TOML configuration dictionary for the connection.
721
+ name : str
722
+ The name of the connection.
723
+
724
+ Returns
725
+ -------
726
+ SuperLinkConnection
727
+ The parsed SuperLink connection configuration.
728
+ """
729
+ # Check fields
730
+ address = conn_dict.get(SuperLinkConnectionTomlKey.ADDRESS)
731
+ root_certificates = conn_dict.get(SuperLinkConnectionTomlKey.ROOT_CERTIFICATES)
732
+ insecure = conn_dict.get(SuperLinkConnectionTomlKey.INSECURE)
733
+ enable_account_auth = conn_dict.get(SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH)
734
+ options = conn_dict.get("options")
735
+
736
+ is_address_setup = (
737
+ isinstance(address, str)
738
+ # root-certificates is optional in TOML (can be missing)
739
+ and isinstance(root_certificates, (str, type(None)))
740
+ and isinstance(insecure, bool)
741
+ and isinstance(enable_account_auth, bool)
742
+ )
743
+
744
+ is_simulation_setup = isinstance(options, dict)
745
+
746
+ if not (is_address_setup or is_simulation_setup):
747
+ raise ValueError("Invalid SuperLink connection format.")
748
+
749
+ simulation_options: SuperLinkSimulationOptions | None = None
750
+ if is_simulation_setup:
751
+ options = cast(dict[str, Any], options)
752
+ simulation_options = _parse_simulation_options(options)
753
+
754
+ # Build and return SuperLinkConnection
755
+ return SuperLinkConnection(
756
+ name=name,
757
+ address=address,
758
+ root_certificates=root_certificates,
759
+ insecure=insecure,
760
+ enable_account_auth=enable_account_auth,
761
+ options=simulation_options,
762
+ )
763
+
764
+
765
+ def read_superlink_connection(
766
+ connection_name: str | None = None,
767
+ ) -> SuperLinkConnection | None:
768
+ """Read a SuperLink connection from the Flower configuration file.
769
+
770
+ Parameters
771
+ ----------
772
+ connection_name : str | None
773
+ The name of the SuperLink connection to load. If None, the default connection
774
+ will be loaded.
775
+
776
+ Returns
777
+ -------
778
+ SuperLinkConnection | None
779
+ The SuperLink connection, or None if the config file is missing or the
780
+ requested connection (or default) cannot be found.
781
+
782
+ Raises
783
+ ------
784
+ typer.Exit
785
+ Raised if the configuration file is corrupted, or if the requested
786
+ connection (or default) cannot be found.
787
+ """
788
+ config_path = get_flwr_home() / FLOWER_CONFIG_FILE
789
+ if not config_path.exists():
790
+ return None
791
+
792
+ try:
793
+ with config_path.open("rb") as file:
794
+ toml_dict = tomli.load(file)
795
+
796
+ superlink_config = toml_dict.get(SuperLinkConnectionTomlKey.SUPERLINK, {})
797
+
798
+ # Load the default SuperLink connection when not provided
799
+ if connection_name is None:
800
+ connection_name = superlink_config.get(SuperLinkConnectionTomlKey.DEFAULT)
801
+
802
+ # Exit when no connection name is available
803
+ if connection_name is None:
804
+ typer.secho(
805
+ "❌ No SuperLink connection set. A SuperLink connection needs to be "
806
+ "provided or one must be set as default in the Flower "
807
+ f"configuration file ({config_path}). Specify a default SuperLink "
808
+ "connection by adding: \n\n[superlink]\ndefault = 'connection_name'\n\n"
809
+ f"to the Flower configuration file ({config_path}).",
810
+ fg=typer.colors.RED,
811
+ err=True,
812
+ )
813
+ raise typer.Exit(code=1)
814
+
815
+ # Try to find the connection in the superlink dict
816
+ connection_config = superlink_config.get(connection_name)
817
+
818
+ if not connection_config:
819
+ error_msg = (
820
+ f"❌ {'Default ' if connection_name else ''} SuperLink connection "
821
+ )
822
+ error_msg += (
823
+ f"'{connection_name}' not found in Flower Config ({config_path})"
824
+ )
825
+
826
+ typer.secho(error_msg, fg=typer.colors.RED, err=True)
827
+ raise typer.Exit(code=1)
828
+
829
+ return parse_superlink_connection(connection_config, name=connection_name)
830
+
831
+ except (tomli.TOMLDecodeError, KeyError, ValueError) as err:
832
+ typer.secho(
833
+ f"❌ SuperLink connection is corrupted: {err}",
834
+ fg=typer.colors.RED,
835
+ err=True,
836
+ )
837
+ raise typer.Exit(code=1) from err
@@ -60,6 +60,9 @@ FORCE_EXIT_TIMEOUT_SECONDS = 5 # Used in `flwr_exit` function
60
60
  # Constants for message processing timing
61
61
  MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS = 3600
62
62
 
63
+ # Constants for simulations
64
+ DEFAULT_SIMULATION_BACKEND_NAME = "ray"
65
+
63
66
  # System message type
64
67
  SYSTEM_MESSAGE_TYPE = "system"
65
68
 
@@ -75,3 +78,63 @@ class NodeStatus:
75
78
  def __new__(cls) -> NodeStatus:
76
79
  """Prevent instantiation."""
77
80
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
81
+
82
+
83
+ class SuperLinkConnectionTomlKey:
84
+ """TOML keys for SuperLink connection configuration."""
85
+
86
+ SUPERLINK = "superlink"
87
+ DEFAULT = "default"
88
+ ADDRESS = "address"
89
+ ROOT_CERTIFICATES = "root-certificates"
90
+ INSECURE = "insecure"
91
+ ENABLE_ACCOUNT_AUTH = "enable-account-auth"
92
+
93
+
94
+ class SimulationClientResourcesTomlKey:
95
+ """TOML keys for SimulationClientResources."""
96
+
97
+ NUM_CPUS = "num-cpus"
98
+ NUM_GPUS = "num-gpus"
99
+
100
+
101
+ class SimulationInitArgsTomlKey:
102
+ """TOML keys for SimulationInitArgs."""
103
+
104
+ NUM_CPUS = "num-cpus"
105
+ NUM_GPUS = "num-gpus"
106
+ LOGGING_LEVEL = "logging-level"
107
+ LOG_TO_DRIVE = "log-to-drive"
108
+
109
+
110
+ class SimulationBackendConfigTomlKey:
111
+ """TOML keys for SimulationBackendConfig."""
112
+
113
+ CLIENT_RESOURCES = "client-resources"
114
+ INIT_ARGS = "init-args"
115
+ NAME = "name"
116
+
117
+
118
+ class SuperLinkSimulationOptionsTomlKey:
119
+ """TOML keys for SuperLinkSimulationOptions."""
120
+
121
+ NUM_SUPERNODES = "num-supernodes"
122
+ BACKEND = "backend"
123
+
124
+
125
+ # CLI connection configuration file name
126
+ FLOWER_CONFIG_FILE = "config.toml"
127
+
128
+ # The default configuration for the Flower config file
129
+ DEFAULT_FLOWER_CONFIG_TOML = f"""[{SuperLinkConnectionTomlKey.SUPERLINK}]
130
+ {SuperLinkConnectionTomlKey.DEFAULT} = "local-simulation"
131
+
132
+ [{SuperLinkConnectionTomlKey.SUPERLINK}.supergrid]
133
+ {SuperLinkConnectionTomlKey.ADDRESS} = "supergrid.flower.ai"
134
+ {SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH} = true
135
+
136
+ [{SuperLinkConnectionTomlKey.SUPERLINK}.local-simulation]
137
+ options.num-supernodes = 10
138
+ options.backend.client-resources.num-cpus = 1
139
+ options.backend.client-resources.num-gpus = 0
140
+ """