flwr-nightly 1.26.0.dev20260115__tar.gz → 1.26.0.dev20260116__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 (403) hide show
  1. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/PKG-INFO +1 -1
  2. flwr_nightly-1.26.0.dev20260116/py/flwr/cli/config_migration.py +225 -0
  3. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/config_utils.py +60 -0
  4. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/flower_config.py +32 -8
  5. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/typing.py +22 -13
  6. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/utils.py +92 -1
  7. flwr_nightly-1.26.0.dev20260116/py/flwr/supercore/state/__init__.py +15 -0
  8. flwr_nightly-1.26.0.dev20260116/py/flwr/supercore/state/schema/README.md +39 -0
  9. flwr_nightly-1.26.0.dev20260116/py/flwr/supercore/state/schema/__init__.py +15 -0
  10. flwr_nightly-1.26.0.dev20260116/py/flwr/supercore/state/schema/corestate_tables.py +30 -0
  11. flwr_nightly-1.26.0.dev20260116/py/flwr/supercore/state/schema/objectstore_tables.py +85 -0
  12. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/pyproject.toml +1 -1
  13. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/README.md +0 -0
  14. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/__init__.py +0 -0
  15. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/__init__.py +0 -0
  16. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/error.py +0 -0
  17. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/exception.py +0 -0
  18. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/message_type.py +0 -0
  19. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/metadata.py +0 -0
  20. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/app/user_config.py +0 -0
  21. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/__init__.py +0 -0
  22. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/app.py +0 -0
  23. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/app_cmd/__init__.py +0 -0
  24. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/app_cmd/publish.py +0 -0
  25. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/app_cmd/review.py +0 -0
  26. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  27. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  28. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  29. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  30. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/build.py +0 -0
  31. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  32. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/config/__init__.py +0 -0
  33. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/config/ls.py +0 -0
  34. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/constant.py +0 -0
  35. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/example.py +0 -0
  36. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/federation/__init__.py +0 -0
  37. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/federation/ls.py +0 -0
  38. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/install.py +0 -0
  39. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/log.py +0 -0
  40. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/login/__init__.py +0 -0
  41. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/login/login.py +0 -0
  42. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/ls.py +0 -0
  43. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/new/__init__.py +0 -0
  44. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/new/new.py +0 -0
  45. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/pull.py +0 -0
  46. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/run/__init__.py +0 -0
  47. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/run/run.py +0 -0
  48. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/run_utils.py +0 -0
  49. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/stop.py +0 -0
  50. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/supernode/__init__.py +0 -0
  51. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/supernode/ls.py +0 -0
  52. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/supernode/register.py +0 -0
  53. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/cli/supernode/unregister.py +0 -0
  54. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/__init__.py +0 -0
  55. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/client.py +0 -0
  56. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  57. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  58. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  59. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  60. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  61. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  62. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  63. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/message_handler/__init__.py +0 -0
  64. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/message_handler/message_handler.py +0 -0
  65. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/__init__.py +0 -0
  66. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/centraldp_mods.py +0 -0
  67. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/comms_mods.py +0 -0
  68. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/localdp_mod.py +0 -0
  69. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  70. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  71. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  72. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/mod/utils.py +0 -0
  73. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/numpy_client.py +0 -0
  74. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/rest_client/__init__.py +0 -0
  75. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/rest_client/connection.py +0 -0
  76. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/run_info_store.py +0 -0
  77. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/client/typing.py +0 -0
  78. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/__init__.py +0 -0
  79. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/client_app.py +0 -0
  80. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/mod/__init__.py +0 -0
  81. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  82. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  83. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/typing.py +0 -0
  84. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/clientapp/utils.py +0 -0
  85. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/__init__.py +0 -0
  86. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/args.py +0 -0
  87. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/config.py +0 -0
  88. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/constant.py +0 -0
  89. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/context.py +0 -0
  90. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/differential_privacy.py +0 -0
  91. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/differential_privacy_constants.py +0 -0
  92. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/dp.py +0 -0
  93. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  94. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  95. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/exit/__init__.py +0 -0
  96. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/exit/exit.py +0 -0
  97. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/exit/exit_code.py +0 -0
  98. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/exit/exit_handler.py +0 -0
  99. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/exit/signal_handler.py +0 -0
  100. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/grpc.py +0 -0
  101. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/inflatable.py +0 -0
  102. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  103. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/inflatable_utils.py +0 -0
  104. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/logger.py +0 -0
  105. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/message.py +0 -0
  106. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/object_ref.py +0 -0
  107. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/parameter.py +0 -0
  108. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/__init__.py +0 -0
  109. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/array.py +0 -0
  110. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/arraychunk.py +0 -0
  111. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/arrayrecord.py +0 -0
  112. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/configrecord.py +0 -0
  113. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/conversion_utils.py +0 -0
  114. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/metricrecord.py +0 -0
  115. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/recorddict.py +0 -0
  116. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/record/typeddict.py +0 -0
  117. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/recorddict_compat.py +0 -0
  118. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/retry_invoker.py +0 -0
  119. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  120. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  121. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  122. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  123. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  124. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  125. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  126. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  127. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/serde.py +0 -0
  128. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/serde_utils.py +0 -0
  129. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/telemetry.py +0 -0
  130. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/common/typing.py +0 -0
  131. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/__init__.py +0 -0
  132. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/client/__init__.py +0 -0
  133. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/client/app.py +0 -0
  134. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  135. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  136. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/common/__init__.py +0 -0
  137. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/common/constant.py +0 -0
  138. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/server/__init__.py +0 -0
  139. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/server/app.py +0 -0
  140. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/compat/simulation/__init__.py +0 -0
  141. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/__init__.py +0 -0
  142. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/appio_pb2.py +0 -0
  143. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/appio_pb2.pyi +0 -0
  144. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  145. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  146. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/clientappio_pb2.py +0 -0
  147. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  148. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  149. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  150. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/control_pb2.py +0 -0
  151. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/control_pb2.pyi +0 -0
  152. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/control_pb2_grpc.py +0 -0
  153. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  154. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/error_pb2.py +0 -0
  155. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/error_pb2.pyi +0 -0
  156. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/error_pb2_grpc.py +0 -0
  157. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  158. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fab_pb2.py +0 -0
  159. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fab_pb2.pyi +0 -0
  160. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  161. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  162. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/federation_pb2.py +0 -0
  163. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/federation_pb2.pyi +0 -0
  164. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/federation_pb2_grpc.py +0 -0
  165. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
  166. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fleet_pb2.py +0 -0
  167. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fleet_pb2.pyi +0 -0
  168. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  169. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  170. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  171. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  172. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  173. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  174. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/heartbeat_pb2.py +0 -0
  175. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  176. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/log_pb2.py +0 -0
  179. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/log_pb2.pyi +0 -0
  180. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/log_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/message_pb2.py +0 -0
  183. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/message_pb2.pyi +0 -0
  184. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/message_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/node_pb2.py +0 -0
  187. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/node_pb2.pyi +0 -0
  188. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/node_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/recorddict_pb2.py +0 -0
  191. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  192. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/run_pb2.py +0 -0
  195. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/run_pb2.pyi +0 -0
  196. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/run_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/serverappio_pb2.py +0 -0
  199. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  200. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/simulationio_pb2.py +0 -0
  203. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  204. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/transport_pb2.py +0 -0
  207. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/transport_pb2.pyi +0 -0
  208. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/py.typed +0 -0
  211. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/__init__.py +0 -0
  212. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/app.py +0 -0
  213. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/client_manager.py +0 -0
  214. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/client_proxy.py +0 -0
  215. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/compat/__init__.py +0 -0
  216. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/compat/app.py +0 -0
  217. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/compat/app_utils.py +0 -0
  218. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  219. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/compat/legacy_context.py +0 -0
  220. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/criterion.py +0 -0
  221. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  222. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/grid/__init__.py +0 -0
  223. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/grid/grid.py +0 -0
  224. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/grid/grpc_grid.py +0 -0
  225. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/grid/inmemory_grid.py +0 -0
  226. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/history.py +0 -0
  227. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/run_serverapp.py +0 -0
  228. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/server.py +0 -0
  229. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/server_app.py +0 -0
  230. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/server_config.py +0 -0
  231. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/serverapp/__init__.py +0 -0
  232. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/serverapp/app.py +0 -0
  233. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/serverapp_components.py +0 -0
  234. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/__init__.py +0 -0
  235. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/aggregate.py +0 -0
  236. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/bulyan.py +0 -0
  237. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  238. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  239. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  240. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  241. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  242. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedadagrad.py +0 -0
  243. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedadam.py +0 -0
  244. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedavg.py +0 -0
  245. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedavg_android.py +0 -0
  246. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedavgm.py +0 -0
  247. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedmedian.py +0 -0
  248. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedopt.py +0 -0
  249. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedprox.py +0 -0
  250. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  251. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  252. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  253. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  254. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/fedyogi.py +0 -0
  255. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/krum.py +0 -0
  256. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/qfedavg.py +0 -0
  257. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/strategy/strategy.py +0 -0
  258. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/__init__.py +0 -0
  259. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  260. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  261. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  262. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  263. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  264. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  265. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  266. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  267. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  268. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  269. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
  270. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  271. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  272. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  273. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  274. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  275. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  276. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  277. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  278. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  279. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  280. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  281. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  282. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  283. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  284. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  285. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  286. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  287. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  288. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  289. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  290. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  291. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/superlink/utils.py +0 -0
  292. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/typing.py +0 -0
  293. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/utils/__init__.py +0 -0
  294. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/utils/tensorboard.py +0 -0
  295. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/utils/validator.py +0 -0
  296. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/__init__.py +0 -0
  297. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/constant.py +0 -0
  298. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/default_workflows.py +0 -0
  299. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  300. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  301. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  302. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/__init__.py +0 -0
  303. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/exception.py +0 -0
  304. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/__init__.py +0 -0
  305. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  306. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  307. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  308. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  309. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  310. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  311. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  312. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  313. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  314. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  315. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  316. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  317. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  318. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  319. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/krum.py +0 -0
  320. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  321. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  322. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/result.py +0 -0
  323. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/strategy.py +0 -0
  324. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  325. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/__init__.py +0 -0
  326. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/app.py +0 -0
  327. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/legacy_app.py +0 -0
  328. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  329. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  330. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  331. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/ray_transport/utils.py +0 -0
  332. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/run_simulation.py +0 -0
  333. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/simulation/simulationio_connection.py +0 -0
  334. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/__init__.py +0 -0
  335. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/address.py +0 -0
  336. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/app_utils.py +0 -0
  337. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/cli/__init__.py +0 -0
  338. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  339. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/constant.py +0 -0
  340. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/corestate/__init__.py +0 -0
  341. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/corestate/corestate.py +0 -0
  342. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
  343. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
  344. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/date.py +0 -0
  345. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/ffs/__init__.py +0 -0
  346. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  347. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/ffs/ffs.py +0 -0
  348. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  349. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  350. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  351. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  352. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/heartbeat.py +0 -0
  353. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  354. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  355. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/object_store/__init__.py +0 -0
  356. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  357. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/object_store/object_store.py +0 -0
  358. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  359. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
  360. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/primitives/__init__.py +0 -0
  361. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/primitives/asymmetric.py +0 -0
  362. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
  363. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/sqlite_mixin.py +0 -0
  364. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/__init__.py +0 -0
  365. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  366. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  367. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  368. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  369. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  370. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  371. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  372. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/utils.py +0 -0
  373. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supercore/version.py +0 -0
  374. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/__init__.py +0 -0
  375. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  376. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  377. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  378. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  379. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  380. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/federation/__init__.py +0 -0
  381. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/federation/federation_manager.py +0 -0
  382. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
  383. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/__init__.py +0 -0
  384. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  385. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  386. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  387. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  388. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  389. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  390. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/__init__.py +0 -0
  391. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/cli/__init__.py +0 -0
  392. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  393. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  394. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/nodestate/__init__.py +0 -0
  395. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  396. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  397. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  398. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/runtime/__init__.py +0 -0
  399. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  400. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/servicer/__init__.py +0 -0
  401. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  402. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  403. {flwr_nightly-1.26.0.dev20260115 → flwr_nightly-1.26.0.dev20260116}/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.dev20260115
3
+ Version: 1.26.0.dev20260116
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -0,0 +1,225 @@
1
+ # Copyright 2026 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Utilities for migrating old TOML configurations to Flower config."""
16
+
17
+
18
+ import re
19
+ from pathlib import Path
20
+ from typing import Any
21
+
22
+ import click
23
+ import typer
24
+
25
+ from .config_utils import load_and_validate, validate_federation_in_project_config
26
+ from .flower_config import (
27
+ init_flwr_config,
28
+ parse_superlink_connection,
29
+ set_default_superlink_connection,
30
+ write_superlink_connection,
31
+ )
32
+
33
+ CONFIG_MIGRATION_NOTICE = """
34
+ ##################################################################
35
+ # CONFIGURATION MIGRATION NOTICE:
36
+ #
37
+ # What was previously called "federation config" for SuperLink
38
+ # connections in pyproject.toml has been renamed and moved.
39
+ #
40
+ # These settings are now **SuperLink connection configuration**
41
+ # and are defined in the Flower configuration file.
42
+ #
43
+ # The entries below are commented out intentionally and are kept
44
+ # only as a migration reference.
45
+ #
46
+ # Docs: <link to Flower config docs>
47
+ ##################################################################
48
+
49
+ """
50
+
51
+ CLI_NOTICE = (
52
+ typer.style("\n🌸 Heads up from Flower!\n\n", fg=typer.colors.MAGENTA, bold=True)
53
+ + "We detected legacy usage of this command that relies on connection\n"
54
+ + "settings from your pyproject.toml.\n\n"
55
+ + "Flower will migrate any relevant settings to the new Flower config.\n\n"
56
+ + "Learn more: https://flower.ai/docs\n"
57
+ )
58
+
59
+
60
+ def _is_legacy_usage(superlink: str, args: list[str]) -> bool:
61
+ """Check if legacy usage is detected in the given arguments."""
62
+ # If one and only one extra argument is given, assume legacy usage
63
+ if len(args) == 1:
64
+ return True
65
+
66
+ # If the `superlink` looks like a path, assume legacy usage
67
+ pth = Path(superlink)
68
+ if pth.is_absolute() or len(pth.parts) > 1 or superlink in (".", ".."):
69
+ return True
70
+
71
+ # Lastly, check if a pyproject.toml file exists at the given superlink
72
+ if (pth / "pyproject.toml").exists():
73
+ return True
74
+
75
+ return False
76
+
77
+
78
+ def _check_is_migratable(app: Path) -> None:
79
+ """Check if the given app path contains legacy TOML configuration."""
80
+ toml_path = app / "pyproject.toml"
81
+ if not toml_path.exists():
82
+ raise FileNotFoundError(f"No pyproject.toml found in '{app}'")
83
+ config, errors, _ = load_and_validate(toml_path, check_module=False)
84
+ if config is None:
85
+ raise ValueError(f"Failed to load TOML configuration: {toml_path}")
86
+ if errors:
87
+ raise ValueError(
88
+ f"Invalid TOML configuration found in '{toml_path}':\n"
89
+ + "\n".join(f"- {err}" for err in errors)
90
+ )
91
+ try:
92
+ _ = config["tool"]["flwr"]["federations"]
93
+ return
94
+ except KeyError:
95
+ raise ValueError(
96
+ f"No '[tool.flwr.federations]' section found in '{toml_path}'"
97
+ ) from None
98
+
99
+
100
+ def _migrate_pyproject_toml_to_flower_config(
101
+ app: Path, toml_federation: str | None
102
+ ) -> tuple[list[str], str | None]:
103
+ """Migrate old TOML configuration to Flower config."""
104
+ # Load and validate the old TOML configuration
105
+ toml_path = app / "pyproject.toml"
106
+ config, _, _ = load_and_validate(toml_path, check_module=False)
107
+ if config is None:
108
+ raise ValueError(f"Failed to load TOML configuration: {toml_path}")
109
+ validate_federation_in_project_config(toml_federation, config)
110
+
111
+ # Construct SuperLinkConnection
112
+ toml_federations: dict[str, Any] = config["tool"]["flwr"]["federations"]
113
+ migrated_conn_names: list[str] = []
114
+ for name, toml_fed_config in toml_federations.items():
115
+ if isinstance(toml_fed_config, dict):
116
+ # Resolve relative root-certificates path
117
+ if cert_path := toml_fed_config.get("root-certificates"):
118
+ if not Path(cert_path).is_absolute():
119
+ toml_fed_config["root-certificates"] = str(
120
+ (app / cert_path).resolve()
121
+ )
122
+ # Parse and write SuperLink connection
123
+ conn = parse_superlink_connection(toml_fed_config, name)
124
+ write_superlink_connection(conn)
125
+ migrated_conn_names.append(name)
126
+
127
+ # Set default federation if applicable
128
+ default_toml_federation: str | None = toml_federations.get("default")
129
+ if default_toml_federation in toml_federations:
130
+ set_default_superlink_connection(default_toml_federation)
131
+
132
+ return migrated_conn_names, default_toml_federation
133
+
134
+
135
+ def _comment_out_legacy_toml_config(app: Path) -> None:
136
+ """Comment out legacy TOML configuration in pyproject.toml."""
137
+ # Read pyproject.toml lines
138
+ toml_path = app / "pyproject.toml"
139
+ lines = toml_path.read_text(encoding="utf-8").splitlines(keepends=True)
140
+ section_pattern = re.compile(r"\s*\[(.*)\]")
141
+
142
+ # Comment out the [tool.flwr.federations] section
143
+ notice_added = False
144
+ in_federation_section = False
145
+ with toml_path.open("w", encoding="utf-8") as f:
146
+ for line in lines:
147
+ # Detect section headers
148
+ if match := section_pattern.match(line):
149
+ section = match.group(1)
150
+ in_federation_section = section.startswith("tool.flwr.federations")
151
+
152
+ # Comment out lines in the federation section
153
+ if in_federation_section:
154
+ if not notice_added:
155
+ f.write(CONFIG_MIGRATION_NOTICE)
156
+ notice_added = True
157
+ # Preserve empty lines and comment out others
158
+ f.write(f"# {line}" if line.strip() != "" else line)
159
+ else:
160
+ f.write(line)
161
+
162
+
163
+ def migrate(
164
+ app: Path,
165
+ toml_federation: str | None,
166
+ ) -> None:
167
+ """Migrate legacy TOML configuration to Flower config."""
168
+ # Initialize Flower config
169
+ init_flwr_config()
170
+
171
+ # Print migration notice
172
+ typer.echo(CLI_NOTICE)
173
+
174
+ # Check if migration is applicable
175
+ app = app.resolve()
176
+ try:
177
+ _check_is_migratable(app)
178
+ except (FileNotFoundError, ValueError) as e:
179
+ raise click.ClickException(f"Cannot migrate configuration:\n{e}") from e
180
+
181
+ try:
182
+ migrated_conns, default_conn = _migrate_pyproject_toml_to_flower_config(
183
+ app, toml_federation
184
+ )
185
+ except Exception as e:
186
+ raise click.ClickException(
187
+ f"Failed to migrate legacy TOML configuration to Flower config:\n{e!r}"
188
+ ) from e
189
+
190
+ typer.secho("✅ Migration completed successfully!\n", fg=typer.colors.GREEN)
191
+
192
+ # Print migrated connections
193
+ typer.secho("Migrated SuperLink connections:", fg=typer.colors.BLUE)
194
+ for conn_name in migrated_conns:
195
+ typer.secho(f" {conn_name}", fg=typer.colors.GREEN, nl=False)
196
+ if conn_name == default_conn:
197
+ typer.secho(" (default)", fg=typer.colors.WHITE, nl=False)
198
+ typer.echo()
199
+
200
+ # print usage
201
+ typer.secho("\nYou should now use the Flower CLI as follows:")
202
+ ctx = click.get_current_context()
203
+ typer.secho(ctx.get_usage() + "\n", bold=True)
204
+
205
+ _comment_out_legacy_toml_config(app)
206
+
207
+
208
+ def migrate_if_legacy_usage(
209
+ superlink: str,
210
+ args: list[str],
211
+ ) -> None:
212
+ """Migrate legacy TOML configuration to Flower config if legacy usage is
213
+ detected."""
214
+ # Trigger the same typer error when detecting unexpected extra args
215
+ if len(args) > 1:
216
+ raise click.UsageError(f"Got unexpected extra arguments ({' '.join(args[1:])})")
217
+
218
+ # Skip migration if no legacy usage is detected
219
+ if not _is_legacy_usage(superlink, args):
220
+ return
221
+
222
+ migrate(
223
+ app=Path(superlink),
224
+ toml_federation=args[0] if len(args) == 1 else None,
225
+ )
@@ -21,6 +21,7 @@ from typing import Any
21
21
  import tomli
22
22
  import typer
23
23
 
24
+ from flwr.cli.typing import SuperLinkConnection
24
25
  from flwr.common.config import (
25
26
  fuse_dicts,
26
27
  get_fab_config,
@@ -283,6 +284,65 @@ def validate_certificate_in_federation_config(
283
284
  return insecure, root_certificates_bytes
284
285
 
285
286
 
287
+ def load_certificate_in_connection(
288
+ connection: SuperLinkConnection,
289
+ ) -> bytes | None:
290
+ """Validate TLS-related settings and load root certificates if provided.
291
+
292
+ Parameters
293
+ ----------
294
+ connection : SuperLinkConnection
295
+ The SuperLink connection configuration.
296
+
297
+ Returns
298
+ -------
299
+ bytes | None
300
+ The loaded root certificate bytes if a custom certificate is configured.
301
+ None if TLS is disabled or if gRPC should use its default trust store.
302
+
303
+ Raises
304
+ ------
305
+ ValueError
306
+ If required TLS settings are missing.
307
+ typer.Exit
308
+ If the configuration is invalid or the certificate file cannot be read.
309
+ """
310
+ if connection.insecure is None:
311
+ raise ValueError(
312
+ f"SuperLink connection '{connection.name}' is missing insecure setting."
313
+ )
314
+
315
+ insecure = connection.insecure
316
+
317
+ # Process root certificates
318
+ if root_certificates := connection.root_certificates:
319
+ if insecure:
320
+ typer.secho(
321
+ "❌ `root-certificates` were provided but the `insecure` parameter "
322
+ "is set to `True`.",
323
+ fg=typer.colors.RED,
324
+ bold=True,
325
+ err=True,
326
+ )
327
+ raise typer.Exit(code=1)
328
+
329
+ # TLS is enabled with self-signed certificates: attempt to read the file
330
+ try:
331
+ root_certificates_bytes = Path(root_certificates).read_bytes()
332
+ except Exception as e:
333
+ typer.secho(
334
+ f"❌ Failed to read certificate file `{root_certificates}`: {e}",
335
+ fg=typer.colors.RED,
336
+ bold=True,
337
+ err=True,
338
+ )
339
+ raise typer.Exit(code=1) from e
340
+ else:
341
+ root_certificates_bytes = None
342
+
343
+ return root_certificates_bytes
344
+
345
+
286
346
  def exit_if_no_address(federation_config: dict[str, Any], cmd: str) -> None:
287
347
  """Exit if the provided federation_config has no "address" key.
288
348
 
@@ -234,7 +234,7 @@ def serialize_superlink_connection(connection: SuperLinkConnection) -> dict[str,
234
234
 
235
235
  def read_superlink_connection(
236
236
  connection_name: str | None = None,
237
- ) -> SuperLinkConnection | None:
237
+ ) -> SuperLinkConnection:
238
238
  """Read a SuperLink connection from the Flower configuration file.
239
239
 
240
240
  Parameters
@@ -245,9 +245,8 @@ def read_superlink_connection(
245
245
 
246
246
  Returns
247
247
  -------
248
- SuperLinkConnection | None
249
- The SuperLink connection, or None if the config file is missing or the
250
- requested connection (or default) cannot be found.
248
+ SuperLinkConnection
249
+ The SuperLink connection.
251
250
 
252
251
  Raises
253
252
  ------
@@ -345,10 +344,29 @@ def write_superlink_connection(connection: SuperLinkConnection) -> None:
345
344
  # Add/update the connection
346
345
  superlink_config[connection.name] = conn_dict
347
346
 
348
- # Flatten SuperLink connections
349
- for name in list(superlink_config.keys()):
350
- if isinstance(superlink_config[name], dict):
351
- superlink_config[name] = flatten_dict(superlink_config[name])
347
+ # Write back to file
348
+ write_flower_config(toml_dict)
349
+
350
+
351
+ def set_default_superlink_connection(connection_name: str) -> None:
352
+ """Set the default SuperLink connection."""
353
+ toml_dict, _ = read_flower_config()
354
+
355
+ # Get superlink section
356
+ superlink_config = toml_dict[SuperLinkConnectionTomlKey.SUPERLINK]
357
+
358
+ # Check if the connection exists
359
+ if connection_name not in superlink_config:
360
+ typer.secho(
361
+ f"❌ SuperLink connection '{connection_name}' not found in the Flower "
362
+ "configuration file. Cannot set as default.",
363
+ fg=typer.colors.RED,
364
+ err=True,
365
+ )
366
+ raise typer.Exit(code=1)
367
+
368
+ # Set default connection
369
+ superlink_config[SuperLinkConnectionTomlKey.DEFAULT] = connection_name
352
370
 
353
371
  # Write back to file
354
372
  write_flower_config(toml_dict)
@@ -402,6 +420,12 @@ def write_flower_config(toml_dict: dict[str, Any]) -> Path:
402
420
  """
403
421
  config_path = get_flwr_home() / FLOWER_CONFIG_FILE
404
422
 
423
+ # Flatten SuperLink connections
424
+ superlink_config: dict[str, Any] = toml_dict[SuperLinkConnectionTomlKey.SUPERLINK]
425
+ for name in list(superlink_config.keys()):
426
+ if isinstance(superlink_config[name], dict):
427
+ superlink_config[name] = flatten_dict(superlink_config[name])
428
+
405
429
  # Get the standard TOML text
406
430
  toml_content = tomli_w.dumps(toml_dict)
407
431
 
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  from dataclasses import dataclass
19
+ from pathlib import Path
19
20
 
20
21
  from flwr.cli.constant import (
21
22
  DEFAULT_SIMULATION_BACKEND_NAME,
@@ -102,38 +103,46 @@ class SuperLinkConnection:
102
103
 
103
104
  def __post_init__(self) -> None:
104
105
  """Validate SuperLink connection configuration."""
106
+ err_prefix = f"Invalid value for key '%s' in connection '{self.name}': "
105
107
  if self.address is not None and not isinstance(self.address, str):
106
108
  raise ValueError(
107
- f"Invalid value for key '{SuperLinkConnectionTomlKey.ADDRESS}': "
108
- f"expected str, but got {type(self.address).__name__}."
109
+ err_prefix % SuperLinkConnectionTomlKey.ADDRESS
110
+ + f"expected str, but got {type(self.address).__name__}."
109
111
  )
110
112
  if self.root_certificates is not None and not isinstance(
111
113
  self.root_certificates, str
112
114
  ):
113
115
  raise ValueError(
114
- "Invalid value for key "
115
- f"'{SuperLinkConnectionTomlKey.ROOT_CERTIFICATES}': "
116
- f"expected str, but got {type(self.root_certificates).__name__}."
116
+ err_prefix % SuperLinkConnectionTomlKey.ROOT_CERTIFICATES
117
+ + f"expected str, but got {type(self.root_certificates).__name__}."
117
118
  )
119
+
120
+ # Ensure root certificates path is absolute
121
+ if self.root_certificates is not None:
122
+ if not Path(self.root_certificates).is_absolute():
123
+ raise ValueError(
124
+ err_prefix % SuperLinkConnectionTomlKey.ROOT_CERTIFICATES
125
+ + "expected absolute path, but got relative path "
126
+ f"'{self.root_certificates}'."
127
+ )
128
+
118
129
  if self.insecure is not None and not isinstance(self.insecure, bool):
119
130
  raise ValueError(
120
- f"Invalid value for key '{SuperLinkConnectionTomlKey.INSECURE}': "
121
- f"but got {type(self.insecure).__name__}."
131
+ err_prefix % SuperLinkConnectionTomlKey.INSECURE
132
+ + f"expected bool, but got {type(self.insecure).__name__}."
122
133
  )
123
134
  if self.enable_account_auth is not None and not isinstance(
124
135
  self.enable_account_auth, bool
125
136
  ):
126
137
  raise ValueError(
127
- "Invalid value for key "
128
- f"'{SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH}': "
129
- f"expected bool, but got {type(self.enable_account_auth).__name__}."
138
+ err_prefix % SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH
139
+ + f"expected bool, but got {type(self.enable_account_auth).__name__}."
130
140
  )
131
141
 
132
142
  if self.federation is not None and not isinstance(self.federation, str):
133
143
  raise ValueError(
134
- "Invalid value for key "
135
- f"'{SuperLinkConnectionTomlKey.FEDERATION}': "
136
- f"expected str, but got {type(self.federation).__name__}."
144
+ err_prefix % SuperLinkConnectionTomlKey.FEDERATION
145
+ + f"expected str, but got {type(self.federation).__name__}."
137
146
  )
138
147
 
139
148
  # The connection needs to have either an address or options (or both).
@@ -27,6 +27,7 @@ import grpc
27
27
  import pathspec
28
28
  import typer
29
29
 
30
+ from flwr.cli.typing import SuperLinkConnection
30
31
  from flwr.common.constant import (
31
32
  ACCESS_TOKEN_KEY,
32
33
  AUTHN_TYPE_JSON_KEY,
@@ -47,10 +48,14 @@ from flwr.common.grpc import (
47
48
  create_channel,
48
49
  on_channel_state_change,
49
50
  )
51
+ from flwr.supercore.utils import get_flwr_home
50
52
 
51
53
  from .auth_plugin import CliAuthPlugin, get_cli_plugin_class
52
54
  from .cli_account_auth_interceptor import CliAccountAuthInterceptor
53
- from .config_utils import validate_certificate_in_federation_config
55
+ from .config_utils import (
56
+ load_certificate_in_connection,
57
+ validate_certificate_in_federation_config,
58
+ )
54
59
 
55
60
 
56
61
  def prompt_text(
@@ -369,6 +374,52 @@ def load_cli_auth_plugin(
369
374
  raise typer.Exit(code=1) from None
370
375
 
371
376
 
377
+ def load_cli_auth_plugin_from_connection(
378
+ connection: SuperLinkConnection,
379
+ authn_type: str | None = None,
380
+ ) -> CliAuthPlugin:
381
+ """Load the CLI-side account auth plugin for the given connection.
382
+
383
+ Parameters
384
+ ----------
385
+ connection : SuperLinkConnection
386
+ The SuperLink connection configuration.
387
+ authn_type : str | None
388
+ Authentication type. If None, will be determined from config.
389
+
390
+ Returns
391
+ -------
392
+ CliAuthPlugin
393
+ The loaded authentication plugin instance.
394
+
395
+ Raises
396
+ ------
397
+ typer.Exit
398
+ If the authentication type is unknown.
399
+ """
400
+ # Locate the credentials directory
401
+ flwr_dir = get_flwr_home()
402
+ credentials_dir = flwr_dir / CREDENTIALS_DIR
403
+ credentials_dir.mkdir(parents=True, exist_ok=True)
404
+
405
+ # Find the path to the account auth config file
406
+ config_path = get_account_auth_config_path(flwr_dir, connection.name)
407
+
408
+ # Determine the auth type if not provided
409
+ if authn_type is None:
410
+ authn_type = AuthnType.NOOP
411
+ if connection.enable_account_auth:
412
+ authn_type = retrieve_authn_type(config_path)
413
+
414
+ # Retrieve auth plugin class and instantiate it
415
+ try:
416
+ auth_plugin_class = get_cli_plugin_class(authn_type)
417
+ return auth_plugin_class(config_path)
418
+ except ValueError:
419
+ typer.echo(f"❌ Unknown account authentication type: {authn_type}")
420
+ raise typer.Exit(code=1) from None
421
+
422
+
372
423
  def init_channel(
373
424
  app: Path, federation_config: dict[str, Any], auth_plugin: CliAuthPlugin
374
425
  ) -> grpc.Channel:
@@ -407,6 +458,46 @@ def init_channel(
407
458
  return channel
408
459
 
409
460
 
461
+ def init_channel_from_connection(connection: SuperLinkConnection) -> grpc.Channel:
462
+ """Initialize gRPC channel to the Control API.
463
+
464
+ Parameters
465
+ ----------
466
+ connection : SuperLinkConnection
467
+ SuperLink connection configuration.
468
+
469
+ Returns
470
+ -------
471
+ grpc.Channel
472
+ Configured gRPC channel with authentication interceptors.
473
+ """
474
+ root_certificates_bytes = load_certificate_in_connection(connection)
475
+
476
+ # Load authentication plugin
477
+ auth_plugin = load_cli_auth_plugin_from_connection(connection)
478
+
479
+ # Load tokens
480
+ auth_plugin.load_tokens()
481
+
482
+ # Ensure address and insecure are set
483
+ if connection.address is None or connection.insecure is None:
484
+ raise ValueError(
485
+ f"Couldn't create channel. SuperLink connection '{connection.name}'"
486
+ " is missing address or insecure setting."
487
+ )
488
+
489
+ # Create the gRPC channel
490
+ channel = create_channel(
491
+ server_address=connection.address,
492
+ insecure=connection.insecure,
493
+ root_certificates=root_certificates_bytes,
494
+ max_message_length=GRPC_MAX_MESSAGE_LENGTH,
495
+ interceptors=[CliAccountAuthInterceptor(auth_plugin)],
496
+ )
497
+ channel.subscribe(on_channel_state_change)
498
+ return channel
499
+
500
+
410
501
  @contextmanager
411
502
  def flwr_cli_grpc_exc_handler() -> Iterator[None]: # pylint: disable=too-many-branches
412
503
  """Context manager to handle specific gRPC errors.
@@ -0,0 +1,15 @@
1
+ # Copyright 2026 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower SuperCore state components."""
@@ -0,0 +1,39 @@
1
+ # State Entity Relationship Diagram
2
+
3
+ ## Schema
4
+
5
+ ```mermaid
6
+
7
+ ---
8
+ config:
9
+ layout: elk
10
+ ---
11
+ erDiagram
12
+ object_children {
13
+ VARCHAR child_id PK,FK
14
+ VARCHAR parent_id PK,FK
15
+ }
16
+
17
+ objects {
18
+ VARCHAR object_id PK "nullable"
19
+ BLOB content "nullable"
20
+ INTEGER is_available
21
+ INTEGER ref_count
22
+ }
23
+
24
+ run_objects {
25
+ VARCHAR object_id PK,FK
26
+ INTEGER run_id PK
27
+ }
28
+
29
+ token_store {
30
+ INTEGER run_id PK "nullable"
31
+ FLOAT active_until "nullable"
32
+ VARCHAR token UK
33
+ }
34
+
35
+ objects ||--o| object_children : parent_id
36
+ objects ||--o| object_children : child_id
37
+ objects ||--o| run_objects : object_id
38
+
39
+ ```
@@ -0,0 +1,15 @@
1
+ # Copyright 2026 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower SQLAlchemy database schema."""
@@ -0,0 +1,30 @@
1
+ # Copyright 2026 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """SQLAlchemy Core Table definitions for CoreState."""
16
+
17
+ from sqlalchemy import Column, Float, Integer, MetaData, String, Table
18
+
19
+ corestate_metadata = MetaData()
20
+
21
+ # ------------------------------------------------------------------------------
22
+ # Table: token_store
23
+ # ------------------------------------------------------------------------------
24
+ token_store = Table(
25
+ "token_store",
26
+ corestate_metadata,
27
+ Column("run_id", Integer, primary_key=True, nullable=True),
28
+ Column("token", String, unique=True, nullable=False),
29
+ Column("active_until", Float),
30
+ )