flwr-nightly 1.26.0.dev20260117__tar.gz → 1.26.0.dev20260120__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 (410) hide show
  1. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/PKG-INFO +1 -1
  2. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/config_migration.py +99 -46
  3. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/config_utils.py +1 -8
  4. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/flower_config.py +3 -2
  5. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/pull.py +1 -4
  6. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/typing.py +64 -8
  7. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/utils.py +8 -10
  8. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/constant.py +10 -0
  9. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/credential_store/__init__.py +33 -0
  10. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/credential_store/credential_store.py +34 -0
  11. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/credential_store/file_credential_store.py +76 -0
  12. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/sql_mixin.py +253 -0
  13. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/sqlite_mixin.py +4 -7
  14. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/state/schema/corestate_tables.py +16 -11
  15. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/state/schema/linkstate_tables.py +152 -0
  16. flwr_nightly-1.26.0.dev20260120/py/flwr/supercore/state/schema/objectstore_tables.py +90 -0
  17. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/pyproject.toml +1 -1
  18. flwr_nightly-1.26.0.dev20260117/py/flwr/supercore/state/schema/linkstate_tables.py +0 -152
  19. flwr_nightly-1.26.0.dev20260117/py/flwr/supercore/state/schema/objectstore_tables.py +0 -85
  20. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/README.md +0 -0
  21. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/__init__.py +0 -0
  22. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/__init__.py +0 -0
  23. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/error.py +0 -0
  24. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/exception.py +0 -0
  25. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/message_type.py +0 -0
  26. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/metadata.py +0 -0
  27. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/app/user_config.py +0 -0
  28. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/__init__.py +0 -0
  29. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/app.py +0 -0
  30. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/app_cmd/__init__.py +0 -0
  31. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/app_cmd/publish.py +0 -0
  32. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/app_cmd/review.py +0 -0
  33. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  34. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/auth_plugin/auth_plugin.py +0 -0
  35. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/auth_plugin/noop_auth_plugin.py +0 -0
  36. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  37. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/build.py +0 -0
  38. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/cli_account_auth_interceptor.py +0 -0
  39. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/config/__init__.py +0 -0
  40. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/config/ls.py +0 -0
  41. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/constant.py +0 -0
  42. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/example.py +0 -0
  43. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/federation/__init__.py +0 -0
  44. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/federation/ls.py +0 -0
  45. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/install.py +0 -0
  46. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/log.py +0 -0
  47. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/login/__init__.py +0 -0
  48. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/login/login.py +0 -0
  49. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/ls.py +0 -0
  50. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/new/__init__.py +0 -0
  51. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/new/new.py +0 -0
  52. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/run/__init__.py +0 -0
  53. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/run/run.py +0 -0
  54. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/run_utils.py +0 -0
  55. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/stop.py +0 -0
  56. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/supernode/__init__.py +0 -0
  57. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/supernode/ls.py +0 -0
  58. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/supernode/register.py +0 -0
  59. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/cli/supernode/unregister.py +0 -0
  60. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/__init__.py +0 -0
  61. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/client.py +0 -0
  62. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  63. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  64. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  65. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  66. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  67. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  68. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/grpc_rere_client/node_auth_client_interceptor.py +0 -0
  69. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/message_handler/__init__.py +0 -0
  70. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/message_handler/message_handler.py +0 -0
  71. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/__init__.py +0 -0
  72. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/centraldp_mods.py +0 -0
  73. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/comms_mods.py +0 -0
  74. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/localdp_mod.py +0 -0
  75. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  76. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  77. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  78. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/mod/utils.py +0 -0
  79. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/numpy_client.py +0 -0
  80. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/rest_client/__init__.py +0 -0
  81. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/rest_client/connection.py +0 -0
  82. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/run_info_store.py +0 -0
  83. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/client/typing.py +0 -0
  84. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/__init__.py +0 -0
  85. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/client_app.py +0 -0
  86. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/mod/__init__.py +0 -0
  87. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/mod/centraldp_mods.py +0 -0
  88. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/mod/localdp_mod.py +0 -0
  89. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/typing.py +0 -0
  90. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/clientapp/utils.py +0 -0
  91. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/__init__.py +0 -0
  92. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/args.py +0 -0
  93. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/config.py +0 -0
  94. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/constant.py +0 -0
  95. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/context.py +0 -0
  96. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/differential_privacy.py +0 -0
  97. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/differential_privacy_constants.py +0 -0
  98. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/dp.py +0 -0
  99. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  100. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  101. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/exit/__init__.py +0 -0
  102. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/exit/exit.py +0 -0
  103. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/exit/exit_code.py +0 -0
  104. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/exit/exit_handler.py +0 -0
  105. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/exit/signal_handler.py +0 -0
  106. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/grpc.py +0 -0
  107. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/inflatable.py +0 -0
  108. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  109. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/inflatable_utils.py +0 -0
  110. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/logger.py +0 -0
  111. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/message.py +0 -0
  112. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/object_ref.py +0 -0
  113. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/parameter.py +0 -0
  114. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/__init__.py +0 -0
  115. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/array.py +0 -0
  116. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/arraychunk.py +0 -0
  117. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/arrayrecord.py +0 -0
  118. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/configrecord.py +0 -0
  119. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/conversion_utils.py +0 -0
  120. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/metricrecord.py +0 -0
  121. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/recorddict.py +0 -0
  122. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/record/typeddict.py +0 -0
  123. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/recorddict_compat.py +0 -0
  124. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/retry_invoker.py +0 -0
  125. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  126. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  127. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  128. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  129. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  130. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  131. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  132. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  133. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/serde.py +0 -0
  134. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/serde_utils.py +0 -0
  135. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/telemetry.py +0 -0
  136. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/common/typing.py +0 -0
  137. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/__init__.py +0 -0
  138. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/client/__init__.py +0 -0
  139. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/client/app.py +0 -0
  140. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  141. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  142. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/common/__init__.py +0 -0
  143. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/common/constant.py +0 -0
  144. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/server/__init__.py +0 -0
  145. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/server/app.py +0 -0
  146. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/compat/simulation/__init__.py +0 -0
  147. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/__init__.py +0 -0
  148. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/appio_pb2.py +0 -0
  149. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/appio_pb2.pyi +0 -0
  150. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  151. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  152. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/clientappio_pb2.py +0 -0
  153. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  154. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  155. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  156. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/control_pb2.py +0 -0
  157. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/control_pb2.pyi +0 -0
  158. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/control_pb2_grpc.py +0 -0
  159. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  160. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/error_pb2.py +0 -0
  161. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/error_pb2.pyi +0 -0
  162. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/error_pb2_grpc.py +0 -0
  163. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  164. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fab_pb2.py +0 -0
  165. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fab_pb2.pyi +0 -0
  166. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  167. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  168. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/federation_pb2.py +0 -0
  169. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/federation_pb2.pyi +0 -0
  170. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/federation_pb2_grpc.py +0 -0
  171. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/federation_pb2_grpc.pyi +0 -0
  172. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fleet_pb2.py +0 -0
  173. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fleet_pb2.pyi +0 -0
  174. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  177. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  178. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/heartbeat_pb2.py +0 -0
  181. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  182. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/log_pb2.py +0 -0
  185. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/log_pb2.pyi +0 -0
  186. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/log_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/message_pb2.py +0 -0
  189. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/message_pb2.pyi +0 -0
  190. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/message_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/node_pb2.py +0 -0
  193. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/node_pb2.pyi +0 -0
  194. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/node_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/recorddict_pb2.py +0 -0
  197. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  198. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/run_pb2.py +0 -0
  201. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/run_pb2.pyi +0 -0
  202. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/run_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/serverappio_pb2.py +0 -0
  205. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  206. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/simulationio_pb2.py +0 -0
  209. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  210. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/transport_pb2.py +0 -0
  213. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/transport_pb2.pyi +0 -0
  214. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/py.typed +0 -0
  217. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/__init__.py +0 -0
  218. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/app.py +0 -0
  219. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/client_manager.py +0 -0
  220. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/client_proxy.py +0 -0
  221. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/compat/__init__.py +0 -0
  222. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/compat/app.py +0 -0
  223. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/compat/app_utils.py +0 -0
  224. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  225. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/compat/legacy_context.py +0 -0
  226. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/criterion.py +0 -0
  227. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  228. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/grid/__init__.py +0 -0
  229. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/grid/grid.py +0 -0
  230. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/grid/grpc_grid.py +0 -0
  231. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/grid/inmemory_grid.py +0 -0
  232. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/history.py +0 -0
  233. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/run_serverapp.py +0 -0
  234. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/server.py +0 -0
  235. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/server_app.py +0 -0
  236. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/server_config.py +0 -0
  237. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/serverapp/__init__.py +0 -0
  238. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/serverapp/app.py +0 -0
  239. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/serverapp_components.py +0 -0
  240. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/__init__.py +0 -0
  241. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/aggregate.py +0 -0
  242. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/bulyan.py +0 -0
  243. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  244. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  245. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  246. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  247. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  248. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedadagrad.py +0 -0
  249. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedadam.py +0 -0
  250. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedavg.py +0 -0
  251. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedavg_android.py +0 -0
  252. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedavgm.py +0 -0
  253. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedmedian.py +0 -0
  254. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedopt.py +0 -0
  255. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedprox.py +0 -0
  256. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  257. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  258. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  259. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  260. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/fedyogi.py +0 -0
  261. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/krum.py +0 -0
  262. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/qfedavg.py +0 -0
  263. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/strategy/strategy.py +0 -0
  264. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/__init__.py +0 -0
  265. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  266. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  267. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  268. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  269. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  270. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  271. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  272. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  273. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  274. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  275. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +0 -0
  276. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  277. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  278. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  279. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  280. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  281. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  282. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  283. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  284. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  285. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  286. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  287. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  288. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  289. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  290. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  291. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  292. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  293. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  294. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  295. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  296. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  297. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/superlink/utils.py +0 -0
  298. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/typing.py +0 -0
  299. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/utils/__init__.py +0 -0
  300. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/utils/tensorboard.py +0 -0
  301. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/utils/validator.py +0 -0
  302. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/__init__.py +0 -0
  303. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/constant.py +0 -0
  304. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/default_workflows.py +0 -0
  305. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  306. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  307. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  308. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/__init__.py +0 -0
  309. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/exception.py +0 -0
  310. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/__init__.py +0 -0
  311. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/bulyan.py +0 -0
  312. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/dp_adaptive_clipping.py +0 -0
  313. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/dp_fixed_clipping.py +0 -0
  314. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedadagrad.py +0 -0
  315. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedadam.py +0 -0
  316. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedavg.py +0 -0
  317. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedavgm.py +0 -0
  318. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedmedian.py +0 -0
  319. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedopt.py +0 -0
  320. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedprox.py +0 -0
  321. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedtrimmedavg.py +0 -0
  322. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedxgb_bagging.py +0 -0
  323. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedxgb_cyclic.py +0 -0
  324. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/fedyogi.py +0 -0
  325. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/krum.py +0 -0
  326. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/multikrum.py +0 -0
  327. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/qfedavg.py +0 -0
  328. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/result.py +0 -0
  329. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/strategy.py +0 -0
  330. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/serverapp/strategy/strategy_utils.py +0 -0
  331. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/__init__.py +0 -0
  332. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/app.py +0 -0
  333. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/legacy_app.py +0 -0
  334. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  335. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  336. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  337. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/ray_transport/utils.py +0 -0
  338. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/run_simulation.py +0 -0
  339. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/simulation/simulationio_connection.py +0 -0
  340. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/__init__.py +0 -0
  341. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/address.py +0 -0
  342. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/app_utils.py +0 -0
  343. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/cli/__init__.py +0 -0
  344. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/cli/flower_superexec.py +0 -0
  345. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/corestate/__init__.py +0 -0
  346. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/corestate/corestate.py +0 -0
  347. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/corestate/in_memory_corestate.py +0 -0
  348. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/corestate/sqlite_corestate.py +0 -0
  349. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/date.py +0 -0
  350. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/ffs/__init__.py +0 -0
  351. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  352. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/ffs/ffs.py +0 -0
  353. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  354. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  355. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/grpc_health/health_server.py +0 -0
  356. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  357. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/heartbeat.py +0 -0
  358. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  359. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  360. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/object_store/__init__.py +0 -0
  361. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  362. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/object_store/object_store.py +0 -0
  363. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  364. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/object_store/sqlite_object_store.py +0 -0
  365. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/primitives/__init__.py +0 -0
  366. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/primitives/asymmetric.py +0 -0
  367. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/primitives/asymmetric_ed25519.py +0 -0
  368. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/state/__init__.py +0 -0
  369. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/state/schema/README.md +0 -0
  370. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/state/schema/__init__.py +0 -0
  371. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/__init__.py +0 -0
  372. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/__init__.py +0 -0
  373. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +0 -0
  374. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +0 -0
  375. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  376. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +0 -0
  377. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/plugin/simulation_exec_plugin.py +0 -0
  378. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/superexec/run_superexec.py +0 -0
  379. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/utils.py +0 -0
  380. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supercore/version.py +0 -0
  381. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/__init__.py +0 -0
  382. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/artifact_provider/__init__.py +0 -0
  383. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/artifact_provider/artifact_provider.py +0 -0
  384. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/auth_plugin/__init__.py +0 -0
  385. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/auth_plugin/auth_plugin.py +0 -0
  386. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/auth_plugin/noop_auth_plugin.py +0 -0
  387. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/federation/__init__.py +0 -0
  388. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/federation/federation_manager.py +0 -0
  389. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/federation/noop_federation_manager.py +0 -0
  390. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/__init__.py +0 -0
  391. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  392. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/control_account_auth_interceptor.py +0 -0
  393. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  394. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  395. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  396. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  397. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/__init__.py +0 -0
  398. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/cli/__init__.py +0 -0
  399. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  400. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  401. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/nodestate/__init__.py +0 -0
  402. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  403. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  404. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  405. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/runtime/__init__.py +0 -0
  406. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/runtime/run_clientapp.py +0 -0
  407. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/servicer/__init__.py +0 -0
  408. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  409. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +0 -0
  410. {flwr_nightly-1.26.0.dev20260117 → flwr_nightly-1.26.0.dev20260120}/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.dev20260117
3
+ Version: 1.26.0.dev20260120
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
@@ -57,8 +57,11 @@ CLI_NOTICE = (
57
57
  )
58
58
 
59
59
 
60
- def _is_legacy_usage(superlink: str, args: list[str]) -> bool:
60
+ def _is_legacy_usage(superlink: str | None, args: list[str]) -> bool:
61
61
  """Check if legacy usage is detected in the given arguments."""
62
+ if superlink is None:
63
+ return False
64
+
62
65
  # If one and only one extra argument is given, assume legacy usage
63
66
  if len(args) == 1:
64
67
  return True
@@ -75,26 +78,34 @@ def _is_legacy_usage(superlink: str, args: list[str]) -> bool:
75
78
  return False
76
79
 
77
80
 
78
- def _check_is_migratable(app: Path) -> None:
79
- """Check if the given app path contains legacy TOML configuration."""
81
+ def _is_migratable(app: Path) -> tuple[bool, str | None]:
82
+ """Check if the given app path contains legacy TOML configuration.
83
+
84
+ Parameters
85
+ ----------
86
+ app : Path
87
+ Path to the Flower App.
88
+
89
+ Returns
90
+ -------
91
+ tuple[bool, str | None]
92
+ Returns (True, None) if migratable, else (False, reason).
93
+ """
80
94
  toml_path = app / "pyproject.toml"
81
95
  if not toml_path.exists():
82
- raise FileNotFoundError(f"No pyproject.toml found in '{app}'")
96
+ return False, f"No pyproject.toml found in '{app}'"
83
97
  config, errors, _ = load_and_validate(toml_path, check_module=False)
84
98
  if config is None:
85
- raise ValueError(f"Failed to load TOML configuration: {toml_path}")
99
+ return False, f"Failed to load TOML configuration: {toml_path}"
86
100
  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
- )
101
+ err_msg = f"Invalid TOML configuration found in '{toml_path}':\n"
102
+ err_msg += "\n".join(f"- {err}" for err in errors)
103
+ return False, err_msg
91
104
  try:
92
105
  _ = config["tool"]["flwr"]["federations"]
93
- return
106
+ return True, None
94
107
  except KeyError:
95
- raise ValueError(
96
- f"No '[tool.flwr.federations]' section found in '{toml_path}'"
97
- ) from None
108
+ return False, f"No '[tool.flwr.federations]' section found in '{toml_path}'"
98
109
 
99
110
 
100
111
  def _migrate_pyproject_toml_to_flower_config(
@@ -161,23 +172,81 @@ def _comment_out_legacy_toml_config(app: Path) -> None:
161
172
 
162
173
 
163
174
  def migrate(
164
- app: Path,
165
- toml_federation: str | None,
175
+ superlink: str | None,
176
+ args: list[str],
177
+ ignore_legacy_usage: bool = False,
166
178
  ) -> None:
167
- """Migrate legacy TOML configuration to Flower config."""
179
+ """Migrate legacy TOML configuration to Flower config.
180
+
181
+ Migrates SuperLink connection settings from `[tool.flwr.federations]` in
182
+ pyproject.toml to the new Flower config format when legacy usage is detected
183
+ or the migration is applicable.
184
+
185
+ `flwr run` should call `migrate(superlink, [], ignore_legacy_usage=True)` to skip
186
+ legacy usage check. Other CLI commands should call `migrate(superlink, ctx.args)`.
187
+
188
+ Parameters
189
+ ----------
190
+ superlink : str | None
191
+ Value of the `[SUPERLINK]` argument provided to the CLI command.
192
+ args : list[str]
193
+ Additional arguments. In legacy usage, this is the TOML federation name.
194
+ ignore_legacy_usage : bool (default: False)
195
+ Set to `True` only for `flwr run` command to skip legacy usage check.
196
+
197
+ Raises
198
+ ------
199
+ click.UsageError
200
+ If more than one extra argument is provided.
201
+ click.ClickException
202
+ If legacy usage detected but migration fails.
203
+
204
+ Examples
205
+ --------
206
+ The following usages will trigger migration if applicable:
207
+ - `flwr <CMD> . my-federation`
208
+ - `flwr <CMD> ./my-app`
209
+ - `flwr <CMD>`
210
+
211
+ The following usages will NOT trigger migration:
212
+ - `flwr <CMD> named-conn`
213
+
214
+ Notes
215
+ -----
216
+ This function will NOT return when legacy usage is detected to force the user
217
+ to adapt to the new usage pattern after migration.
218
+ """
168
219
  # Initialize Flower config
169
220
  init_flwr_config()
170
221
 
171
- # Print migration notice
172
- typer.echo(CLI_NOTICE)
222
+ # Trigger the same typer error when detecting unexpected extra args
223
+ if len(args) > 1:
224
+ raise click.UsageError(f"Got unexpected extra arguments ({' '.join(args[1:])})")
173
225
 
174
- # Check if migration is applicable
226
+ # Determine app path for migration
227
+ app = Path(superlink) if superlink else Path(".")
175
228
  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
229
 
230
+ # Check if migration is applicable and if legacy usage is detected
231
+ is_migratable, reason = _is_migratable(app)
232
+ is_legacy = _is_legacy_usage(superlink, args) if not ignore_legacy_usage else False
233
+
234
+ # Print notice once if legacy usage detected or migration is applicable
235
+ if is_legacy or is_migratable:
236
+ typer.echo(CLI_NOTICE)
237
+
238
+ if not is_migratable:
239
+ # Raise error if legacy usage is detected but migration is not applicable
240
+ if is_legacy:
241
+ raise click.ClickException(
242
+ f"Cannot migrate configuration:\n{reason}. \nThis is expected if the "
243
+ "migration has been previously carried out. Use `--help` after your "
244
+ "command to see the new usage pattern."
245
+ )
246
+ return # Nothing to migrate
247
+
248
+ # Perform migration
249
+ toml_federation = args[0] if len(args) == 1 else None
181
250
  try:
182
251
  migrated_conns, default_conn = _migrate_pyproject_toml_to_flower_config(
183
252
  app, toml_federation
@@ -197,29 +266,13 @@ def migrate(
197
266
  typer.secho(" (default)", fg=typer.colors.WHITE, nl=False)
198
267
  typer.echo()
199
268
 
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
269
  _comment_out_legacy_toml_config(app)
206
270
 
271
+ if is_legacy:
272
+ # print usage
273
+ typer.secho("\nYou should now use the Flower CLI as follows:")
274
+ ctx = click.get_current_context()
275
+ typer.secho(ctx.get_usage() + "\n", bold=True)
207
276
 
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
- )
277
+ # Abort if legacy usage is detected to force user to adapt to new usage
278
+ raise typer.Exit(code=1)
@@ -307,16 +307,9 @@ def load_certificate_in_connection(
307
307
  typer.Exit
308
308
  If the configuration is invalid or the certificate file cannot be read.
309
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
310
  # Process root certificates
318
311
  if root_certificates := connection.root_certificates:
319
- if insecure:
312
+ if connection.insecure:
320
313
  typer.secho(
321
314
  "❌ `root-certificates` were provided but the `insecure` parameter "
322
315
  "is set to `True`.",
@@ -215,11 +215,12 @@ def serialize_superlink_connection(connection: SuperLinkConnection) -> dict[str,
215
215
  dict[str, Any]
216
216
  Dictionary representation suitable for TOML serialization.
217
217
  """
218
+ # pylint: disable=protected-access
218
219
  conn_dict: dict[str, Any] = {
219
220
  SuperLinkConnectionTomlKey.ADDRESS: connection.address,
220
221
  SuperLinkConnectionTomlKey.ROOT_CERTIFICATES: connection.root_certificates,
221
- SuperLinkConnectionTomlKey.INSECURE: connection.insecure,
222
- SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH: connection.enable_account_auth,
222
+ SuperLinkConnectionTomlKey.INSECURE: connection._insecure,
223
+ SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH: connection._enable_account_auth,
223
224
  SuperLinkConnectionTomlKey.FEDERATION: connection.federation,
224
225
  }
225
226
  # Remove None values
@@ -40,10 +40,7 @@ from .utils import flwr_cli_grpc_exc_handler, init_channel, load_cli_auth_plugin
40
40
  def pull( # pylint: disable=R0914
41
41
  run_id: Annotated[
42
42
  int,
43
- typer.Option(
44
- "--run-id",
45
- help="Run ID to pull artifacts from.",
46
- ),
43
+ typer.Argument(help="Run ID to pull artifacts from."),
47
44
  ],
48
45
  app: Annotated[
49
46
  Path,
@@ -23,6 +23,8 @@ from flwr.cli.constant import (
23
23
  SuperLinkConnectionTomlKey,
24
24
  )
25
25
 
26
+ _ERROR_MSG_FMT = "SuperLinkConnection.%s is None"
27
+
26
28
 
27
29
  @dataclass
28
30
  class SimulationClientResources:
@@ -91,16 +93,70 @@ class SuperLinkSimulationOptions:
91
93
 
92
94
  @dataclass
93
95
  class SuperLinkConnection:
94
- """SuperLink connection configuration for CLI commands."""
96
+ """SuperLink connection configuration for CLI commands.
97
+
98
+ Attributes
99
+ ----------
100
+ name : str
101
+ The name of the connection configuration.
102
+ address : str
103
+ The address of the SuperLink (Control API).
104
+ root_certificates : str
105
+ The absolute path to the root CA certificate file.
106
+ insecure : bool (default: False)
107
+ Whether to use an insecure channel. If True, the
108
+ connection will not use TLS encryption.
109
+ enable_account_auth : bool (default: False)
110
+ Whether to enable account authentication.
111
+ federation : str
112
+ The name of the federation to interface with.
113
+ options : SuperLinkSimulationOptions
114
+ Configuration options for the simulation runtime.
115
+ """
95
116
 
96
117
  name: str
97
118
  address: str | None = None
98
119
  root_certificates: str | None = None
99
- insecure: bool | None = None
100
- enable_account_auth: bool | None = None
120
+ _insecure: bool | None = None
121
+ _enable_account_auth: bool | None = None
101
122
  federation: str | None = None
102
123
  options: SuperLinkSimulationOptions | None = None
103
124
 
125
+ # pylint: disable=too-many-arguments,too-many-positional-arguments
126
+ def __init__(
127
+ self,
128
+ name: str,
129
+ address: str | None = None,
130
+ root_certificates: str | None = None,
131
+ insecure: bool | None = None,
132
+ enable_account_auth: bool | None = None,
133
+ federation: str | None = None,
134
+ options: SuperLinkSimulationOptions | None = None,
135
+ ) -> None:
136
+ self.name = name
137
+ self.address = address
138
+ self.root_certificates = root_certificates
139
+ self._insecure = insecure
140
+ self._enable_account_auth = enable_account_auth
141
+ self.federation = federation
142
+ self.options = options
143
+
144
+ self.__post_init__()
145
+
146
+ @property
147
+ def insecure(self) -> bool:
148
+ """Return the insecure flag or its default (False) if unset."""
149
+ if self._insecure is None:
150
+ return False
151
+ return self._insecure
152
+
153
+ @property
154
+ def enable_account_auth(self) -> bool:
155
+ """Return the enable_account_auth flag or its default (False) if unset."""
156
+ if self._enable_account_auth is None:
157
+ return False
158
+ return self._enable_account_auth
159
+
104
160
  def __post_init__(self) -> None:
105
161
  """Validate SuperLink connection configuration."""
106
162
  err_prefix = f"Invalid value for key '%s' in connection '{self.name}': "
@@ -126,17 +182,17 @@ class SuperLinkConnection:
126
182
  f"'{self.root_certificates}'."
127
183
  )
128
184
 
129
- if self.insecure is not None and not isinstance(self.insecure, bool):
185
+ if self._insecure is not None and not isinstance(self._insecure, bool):
130
186
  raise ValueError(
131
187
  err_prefix % SuperLinkConnectionTomlKey.INSECURE
132
- + f"expected bool, but got {type(self.insecure).__name__}."
188
+ + f"expected bool, but got {type(self._insecure).__name__}."
133
189
  )
134
- if self.enable_account_auth is not None and not isinstance(
135
- self.enable_account_auth, bool
190
+ if self._enable_account_auth is not None and not isinstance(
191
+ self._enable_account_auth, bool
136
192
  ):
137
193
  raise ValueError(
138
194
  err_prefix % SuperLinkConnectionTomlKey.ENABLE_ACCOUNT_AUTH
139
- + f"expected bool, but got {type(self.enable_account_auth).__name__}."
195
+ + f"expected bool, but got {type(self._enable_account_auth).__name__}."
140
196
  )
141
197
 
142
198
  if self.federation is not None and not isinstance(self.federation, str):
@@ -458,13 +458,17 @@ def init_channel(
458
458
  return channel
459
459
 
460
460
 
461
- def init_channel_from_connection(connection: SuperLinkConnection) -> grpc.Channel:
461
+ def init_channel_from_connection(
462
+ connection: SuperLinkConnection, auth_plugin: CliAuthPlugin | None = None
463
+ ) -> grpc.Channel:
462
464
  """Initialize gRPC channel to the Control API.
463
465
 
464
466
  Parameters
465
467
  ----------
466
468
  connection : SuperLinkConnection
467
469
  SuperLink connection configuration.
470
+ auth_plugin : CliAuthPlugin | None (default: None)
471
+ Authentication plugin instance for handling credentials.
468
472
 
469
473
  Returns
470
474
  -------
@@ -474,21 +478,15 @@ def init_channel_from_connection(connection: SuperLinkConnection) -> grpc.Channe
474
478
  root_certificates_bytes = load_certificate_in_connection(connection)
475
479
 
476
480
  # Load authentication plugin
477
- auth_plugin = load_cli_auth_plugin_from_connection(connection)
481
+ if auth_plugin is None:
482
+ auth_plugin = load_cli_auth_plugin_from_connection(connection)
478
483
 
479
484
  # Load tokens
480
485
  auth_plugin.load_tokens()
481
486
 
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
487
  # Create the gRPC channel
490
488
  channel = create_channel(
491
- server_address=connection.address,
489
+ server_address=connection.address, # type: ignore
492
490
  insecure=connection.insecure,
493
491
  root_certificates=root_certificates_bytes,
494
492
  max_message_length=GRPC_MAX_MESSAGE_LENGTH,
@@ -64,6 +64,16 @@ MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS = 3600
64
64
  # System message type
65
65
  SYSTEM_MESSAGE_TYPE = "system"
66
66
 
67
+ # SQLite PRAGMA settings for optimal performance and correctness
68
+ SQLITE_PRAGMAS = (
69
+ ("journal_mode", "WAL"), # Enable Write-Ahead Logging for better concurrency
70
+ ("synchronous", "NORMAL"),
71
+ ("foreign_keys", "ON"),
72
+ ("cache_size", "-64000"), # 64MB cache
73
+ ("temp_store", "MEMORY"), # In-memory temp tables
74
+ ("mmap_size", "268435456"), # 256MB memory-mapped I/O
75
+ )
76
+
67
77
 
68
78
  class NodeStatus:
69
79
  """Event log writer types."""
@@ -0,0 +1,33 @@
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
+ """Credential store for Flower."""
16
+
17
+
18
+ from .credential_store import CredentialStore
19
+ from .file_credential_store import FileCredentialStore
20
+
21
+
22
+ def get_credential_store() -> CredentialStore:
23
+ """Get the credential store instance.
24
+
25
+ Currently, only FileCredentialStore is implemented.
26
+ """
27
+ return FileCredentialStore()
28
+
29
+
30
+ __all__ = [
31
+ "CredentialStore",
32
+ "get_credential_store",
33
+ ]
@@ -0,0 +1,34 @@
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
+ """Abstract base classes for credential store."""
16
+
17
+
18
+ from abc import ABC, abstractmethod
19
+
20
+
21
+ class CredentialStore(ABC):
22
+ """Abstract base class for credential store."""
23
+
24
+ @abstractmethod
25
+ def set(self, key: str, value: bytes) -> None:
26
+ """Set a credential in the store."""
27
+
28
+ @abstractmethod
29
+ def get(self, key: str) -> bytes | None:
30
+ """Get a credential from the store."""
31
+
32
+ @abstractmethod
33
+ def delete(self, key: str) -> None:
34
+ """Delete a credential from the store."""
@@ -0,0 +1,76 @@
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
+ """File-based credential store implementation."""
16
+
17
+
18
+ import base64
19
+ from pathlib import Path
20
+ from typing import cast
21
+
22
+ import yaml
23
+
24
+ from ..utils import get_flwr_home
25
+ from .credential_store import CredentialStore
26
+
27
+ CREDENTIAL_FILE_PATH = get_flwr_home() / "credentials.yaml"
28
+
29
+
30
+ class FileCredentialStore(CredentialStore):
31
+ """File-based credential store implementation."""
32
+
33
+ def __init__(self, file_path: Path | None = None) -> None:
34
+ """Initialize the file credential store.
35
+
36
+ Parameters
37
+ ----------
38
+ file_path : Path | None
39
+ Path to the credentials file. If None, uses default path.
40
+ """
41
+ self.file_path = file_path or CREDENTIAL_FILE_PATH
42
+
43
+ def _load_credentials(self) -> dict[str, str]:
44
+ """Load credentials from file."""
45
+ if not self.file_path.exists():
46
+ return {}
47
+ with self.file_path.open("r", encoding="utf-8") as f:
48
+ data = yaml.safe_load(f)
49
+ return cast(dict[str, str], data) if data else {}
50
+
51
+ def _save_credentials(self, credentials: dict[str, str]) -> None:
52
+ """Save credentials to file."""
53
+ self.file_path.parent.mkdir(parents=True, exist_ok=True)
54
+ with self.file_path.open("w", encoding="utf-8") as f:
55
+ yaml.safe_dump(credentials, f)
56
+
57
+ def set(self, key: str, value: bytes) -> None:
58
+ """Set a credential in the store."""
59
+ credentials = self._load_credentials()
60
+ credentials[key] = base64.b64encode(value).decode("utf-8")
61
+ self._save_credentials(credentials)
62
+
63
+ def get(self, key: str) -> bytes | None:
64
+ """Get a credential from the store."""
65
+ credentials = self._load_credentials()
66
+ encoded_value = credentials.get(key)
67
+ if encoded_value is None:
68
+ return None
69
+ return base64.b64decode(encoded_value)
70
+
71
+ def delete(self, key: str) -> None:
72
+ """Delete a credential from the store."""
73
+ credentials = self._load_credentials()
74
+ if key in credentials:
75
+ del credentials[key]
76
+ self._save_credentials(credentials)