flwr-nightly 1.15.0.dev20250107__tar.gz → 1.15.0.dev20250108__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 (327) hide show
  1. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/PKG-INFO +3 -3
  2. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/pyproject.toml +3 -3
  3. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/cli_user_auth_interceptor.py +6 -2
  4. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/login/login.py +11 -4
  5. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/utils.py +4 -4
  6. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/auth_plugin/auth_plugin.py +33 -23
  7. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/constant.py +2 -0
  8. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/typing.py +20 -0
  9. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/exec_pb2.py +12 -24
  10. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/exec_pb2.pyi +27 -54
  11. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/app.py +11 -13
  12. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +8 -9
  13. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/exec_servicer.py +23 -2
  14. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/LICENSE +0 -0
  15. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/README.md +0 -0
  16. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/__init__.py +0 -0
  17. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/__init__.py +0 -0
  18. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/app.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/build.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/config_utils.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/example.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/install.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/log.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/login/__init__.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/ls.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/__init__.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/new.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  30. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  31. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  32. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  33. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  34. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  35. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  36. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  37. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  38. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  39. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  48. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/run/__init__.py +0 -0
  81. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/run/run.py +0 -0
  82. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/cli/stop.py +0 -0
  83. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/__init__.py +0 -0
  84. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/app.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/client.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/client_app.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/clientapp/__init__.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/clientapp/app.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/clientapp/utils.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_client/connection.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/heartbeat.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/message_handler/__init__.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/__init__.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/comms_mods.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/mod/utils.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/nodestate/__init__.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/numpy_client.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/rest_client/__init__.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/rest_client/connection.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/run_info_store.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/supernode/__init__.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/supernode/app.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/client/typing.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/__init__.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/address.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/args.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/context.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/date.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/differential_privacy.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/dp.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/exit_handlers.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/grpc.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/logger.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/message.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/object_ref.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/parameter.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/pyproject.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/__init__.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/configsrecord.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/conversion_utils.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/metricsrecord.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/parametersrecord.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/recordset.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/record/typeddict.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/recordset_compat.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/retry_invoker.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/serde.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/telemetry.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/common/version.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/__init__.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  163. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  165. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/error_pb2.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/error_pb2.pyi +0 -0
  167. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fab_pb2.py +0 -0
  172. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  173. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fleet_pb2.py +0 -0
  176. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  177. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  180. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  181. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/log_pb2.py +0 -0
  184. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/log_pb2.pyi +0 -0
  185. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/message_pb2.py +0 -0
  188. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/message_pb2.pyi +0 -0
  189. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/node_pb2.py +0 -0
  192. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/node_pb2.pyi +0 -0
  193. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/recordset_pb2.py +0 -0
  196. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  197. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/run_pb2.py +0 -0
  200. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/run_pb2.pyi +0 -0
  201. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  204. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  205. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  208. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  209. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/task_pb2.py +0 -0
  212. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/task_pb2.pyi +0 -0
  213. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/transport_pb2.py +0 -0
  216. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  217. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/py.typed +0 -0
  220. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/__init__.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/client_manager.py +0 -0
  222. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/client_proxy.py +0 -0
  223. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/compat/__init__.py +0 -0
  224. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/compat/app.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/compat/app_utils.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/compat/legacy_context.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/criterion.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/driver/__init__.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/driver/driver.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/history.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/run_serverapp.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/server.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/server_app.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/server_config.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/serverapp/__init__.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/serverapp/app.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/serverapp_components.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/__init__.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/aggregate.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/bulyan.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedadam.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedavg.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedopt.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedprox.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/krum.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/strategy/strategy.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/__init__.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/superlink/utils.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/typing.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/utils/__init__.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/utils/tensorboard.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/utils/validator.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/constant.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/app.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/legacy_app.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/run_simulation.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/__init__.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/app.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/deployment.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/exec_grpc.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/executor.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250108}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250107
3
+ Version: 1.15.0.dev20250108
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
43
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
44
44
  Requires-Dist: requests (>=2.31.0,<3.0.0)
45
45
  Requires-Dist: rich (>=13.5.0,<14.0.0)
46
- Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
+ Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
47
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
48
48
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
49
49
  Requires-Dist: typer (>=0.12.5,<0.13.0)
50
- Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
50
+ Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
51
51
  Project-URL: Documentation, https://flower.ai
52
52
  Project-URL: Repository, https://github.com/adap/flower
53
53
  Description-Content-Type: text/markdown
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250107"
7
+ version = "1.15.0.dev20250108"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -83,8 +83,8 @@ requests = "^2.31.0"
83
83
  # Optional dependencies (Simulation Engine)
84
84
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
85
85
  # Optional dependencies (REST transport layer)
86
- starlette = { version = "^0.31.0", optional = true }
87
- uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
86
+ starlette = { version = "^0.45.2", optional = true }
87
+ uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
88
88
 
89
89
  [tool.poetry.extras]
90
90
  simulation = ["ray"]
@@ -54,8 +54,12 @@ class CliUserAuthInterceptor(
54
54
 
55
55
  response = continuation(details, request)
56
56
  if response.initial_metadata():
57
- retrieved_metadata = dict(response.initial_metadata())
58
- self.auth_plugin.store_tokens(retrieved_metadata)
57
+ credentials = self.auth_plugin.read_tokens_from_metadata(
58
+ response.initial_metadata()
59
+ )
60
+ # The metadata contains tokens only if they have been refreshed
61
+ if credentials is not None:
62
+ self.auth_plugin.store_tokens(credentials)
59
63
 
60
64
  return response
61
65
 
@@ -26,7 +26,7 @@ from flwr.cli.config_utils import (
26
26
  process_loaded_project_config,
27
27
  validate_federation_in_project_config,
28
28
  )
29
- from flwr.common.constant import AUTH_TYPE
29
+ from flwr.common.typing import UserAuthLoginDetails
30
30
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
31
31
  GetLoginDetailsRequest,
32
32
  GetLoginDetailsResponse,
@@ -64,7 +64,7 @@ def login( # pylint: disable=R0914
64
64
  login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
65
65
 
66
66
  # Get the auth plugin
67
- auth_type = login_response.login_details.get(AUTH_TYPE)
67
+ auth_type = login_response.auth_type
68
68
  auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
69
69
  if auth_plugin is None:
70
70
  typer.secho(
@@ -75,7 +75,14 @@ def login( # pylint: disable=R0914
75
75
  raise typer.Exit(code=1)
76
76
 
77
77
  # Login
78
- auth_config = auth_plugin.login(dict(login_response.login_details), stub)
78
+ details = UserAuthLoginDetails(
79
+ auth_type=login_response.auth_type,
80
+ device_code=login_response.device_code,
81
+ verification_uri_complete=login_response.verification_uri_complete,
82
+ expires_in=login_response.expires_in,
83
+ interval=login_response.interval,
84
+ )
85
+ credentials = auth_plugin.login(details, stub)
79
86
 
80
87
  # Store the tokens
81
- auth_plugin.store_tokens(auth_config)
88
+ auth_plugin.store_tokens(credentials)
@@ -223,19 +223,19 @@ def try_obtain_cli_auth_plugin(
223
223
  config_path = get_user_auth_config_path(root_dir, federation)
224
224
 
225
225
  # Load the config file if it exists
226
- config: dict[str, Any] = {}
226
+ json_file: dict[str, Any] = {}
227
227
  if config_path.exists():
228
228
  with config_path.open("r", encoding="utf-8") as file:
229
- config = json.load(file)
229
+ json_file = json.load(file)
230
230
  # This is the case when the user auth is not enabled
231
231
  elif auth_type is None:
232
232
  return None
233
233
 
234
234
  # Get the auth type from the config if not provided
235
235
  if auth_type is None:
236
- if AUTH_TYPE not in config:
236
+ if AUTH_TYPE not in json_file:
237
237
  return None
238
- auth_type = config[AUTH_TYPE]
238
+ auth_type = json_file[AUTH_TYPE]
239
239
 
240
240
  # Retrieve auth plugin class and instantiate it
241
241
  try:
@@ -18,26 +18,31 @@
18
18
  from abc import ABC, abstractmethod
19
19
  from collections.abc import Sequence
20
20
  from pathlib import Path
21
- from typing import Any, Optional, Union
21
+ from typing import Optional, Union
22
22
 
23
23
  from flwr.proto.exec_pb2_grpc import ExecStub
24
24
 
25
+ from ..typing import UserAuthCredentials, UserAuthLoginDetails
26
+
25
27
 
26
28
  class ExecAuthPlugin(ABC):
27
29
  """Abstract Flower Auth Plugin class for ExecServicer.
28
30
 
29
31
  Parameters
30
32
  ----------
31
- config : dict[str, Any]
32
- The authentication configuration loaded from a YAML file.
33
+ user_auth_config_path : Path
34
+ Path to the YAML file containing the authentication configuration.
33
35
  """
34
36
 
35
37
  @abstractmethod
36
- def __init__(self, config: dict[str, Any]):
38
+ def __init__(
39
+ self,
40
+ user_auth_config_path: Path,
41
+ ):
37
42
  """Abstract constructor."""
38
43
 
39
44
  @abstractmethod
40
- def get_login_details(self) -> dict[str, str]:
45
+ def get_login_details(self) -> Optional[UserAuthLoginDetails]:
41
46
  """Get the login details."""
42
47
 
43
48
  @abstractmethod
@@ -47,7 +52,7 @@ class ExecAuthPlugin(ABC):
47
52
  """Validate authentication tokens in the provided metadata."""
48
53
 
49
54
  @abstractmethod
50
- def get_auth_tokens(self, auth_details: dict[str, str]) -> dict[str, str]:
55
+ def get_auth_tokens(self, device_code: str) -> Optional[UserAuthCredentials]:
51
56
  """Get authentication tokens."""
52
57
 
53
58
  @abstractmethod
@@ -62,50 +67,55 @@ class CliAuthPlugin(ABC):
62
67
 
63
68
  Parameters
64
69
  ----------
65
- user_auth_config_path : Path
66
- The path to the user's authentication configuration file.
70
+ credentials_path : Path
71
+ Path to the user's authentication credentials file.
67
72
  """
68
73
 
69
74
  @staticmethod
70
75
  @abstractmethod
71
76
  def login(
72
- login_details: dict[str, str],
77
+ login_details: UserAuthLoginDetails,
73
78
  exec_stub: ExecStub,
74
- ) -> dict[str, Any]:
75
- """Authenticate the user with the SuperLink.
79
+ ) -> UserAuthCredentials:
80
+ """Authenticate the user and retrieve authentication credentials.
76
81
 
77
82
  Parameters
78
83
  ----------
79
- login_details : dict[str, str]
80
- A dictionary containing the user's login details.
84
+ login_details : UserAuthLoginDetails
85
+ An object containing the user's login details.
81
86
  exec_stub : ExecStub
82
- An instance of `ExecStub` used for communication with the SuperLink.
87
+ A stub for executing RPC calls to the server.
83
88
 
84
89
  Returns
85
90
  -------
86
- user_auth_config : dict[str, Any]
87
- A dictionary containing the user's authentication configuration
88
- in JSON format.
91
+ UserAuthCredentials
92
+ The authentication credentials obtained after login.
89
93
  """
90
94
 
91
95
  @abstractmethod
92
- def __init__(self, user_auth_config_path: Path):
96
+ def __init__(self, credentials_path: Path):
93
97
  """Abstract constructor."""
94
98
 
95
99
  @abstractmethod
96
- def store_tokens(self, user_auth_config: dict[str, Any]) -> None:
97
- """Store authentication tokens from the provided user_auth_config.
100
+ def store_tokens(self, credentials: UserAuthCredentials) -> None:
101
+ """Store authentication tokens to the `credentials_path`.
98
102
 
99
- The configuration, including tokens, will be saved as a JSON file
100
- at `user_auth_config_path`.
103
+ The credentials, including tokens, will be saved as a JSON file
104
+ at `credentials_path`.
101
105
  """
102
106
 
103
107
  @abstractmethod
104
108
  def load_tokens(self) -> None:
105
- """Load authentication tokens from the user_auth_config_path."""
109
+ """Load authentication tokens from the `credentials_path`."""
106
110
 
107
111
  @abstractmethod
108
112
  def write_tokens_to_metadata(
109
113
  self, metadata: Sequence[tuple[str, Union[str, bytes]]]
110
114
  ) -> Sequence[tuple[str, Union[str, bytes]]]:
111
115
  """Write authentication tokens to the provided metadata."""
116
+
117
+ @abstractmethod
118
+ def read_tokens_from_metadata(
119
+ self, metadata: Sequence[tuple[str, Union[str, bytes]]]
120
+ ) -> Optional[UserAuthCredentials]:
121
+ """Read authentication tokens from the provided metadata."""
@@ -114,6 +114,8 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
114
114
  # Constants for user authentication
115
115
  CREDENTIALS_DIR = ".credentials"
116
116
  AUTH_TYPE = "auth_type"
117
+ ACCESS_TOKEN_KEY = "access_token"
118
+ REFRESH_TOKEN_KEY = "refresh_token"
117
119
 
118
120
 
119
121
  class MessageType:
@@ -266,3 +266,23 @@ class InvalidRunStatusException(BaseException):
266
266
  def __init__(self, message: str) -> None:
267
267
  super().__init__(message)
268
268
  self.message = message
269
+
270
+
271
+ # OIDC user authentication types
272
+ @dataclass
273
+ class UserAuthLoginDetails:
274
+ """User authentication login details."""
275
+
276
+ auth_type: str
277
+ device_code: str
278
+ verification_uri_complete: str
279
+ expires_in: int
280
+ interval: int
281
+
282
+
283
+ @dataclass
284
+ class UserAuthCredentials:
285
+ """User authentication tokens."""
286
+
287
+ access_token: str
288
+ refresh_token: str
@@ -18,7 +18,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
18
18
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x9c\x01\n\x17GetLoginDetailsResponse\x12L\n\rlogin_details\x18\x01 \x03(\x0b\x32\x35.flwr.proto.GetLoginDetailsResponse.LoginDetailsEntry\x1a\x33\n\x11LoginDetailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x93\x01\n\x14GetAuthTokensRequest\x12G\n\x0c\x61uth_details\x18\x01 \x03(\x0b\x32\x31.flwr.proto.GetAuthTokensRequest.AuthDetailsEntry\x1a\x32\n\x10\x41uthDetailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x92\x01\n\x15GetAuthTokensResponse\x12\x46\n\x0b\x61uth_tokens\x18\x01 \x03(\x0b\x32\x31.flwr.proto.GetAuthTokensResponse.AuthTokensEntry\x1a\x31\n\x0f\x41uthTokensEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x32\xe5\x03\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\"\x18\n\x16GetLoginDetailsRequest\"\x8a\x01\n\x17GetLoginDetailsResponse\x12\x11\n\tauth_type\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65vice_code\x18\x02 \x01(\t\x12!\n\x19verification_uri_complete\x18\x03 \x01(\t\x12\x12\n\nexpires_in\x18\x04 \x01(\x03\x12\x10\n\x08interval\x18\x05 \x01(\x03\"+\n\x14GetAuthTokensRequest\x12\x13\n\x0b\x64\x65vice_code\x18\x01 \x01(\t\"D\n\x15GetAuthTokensResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x15\n\rrefresh_token\x18\x02 \x01(\t\" \n\x0eStopRunRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"\"\n\x0fStopRunResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x32\xe5\x03\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12\x44\n\x07StopRun\x12\x1a.flwr.proto.StopRunRequest\x1a\x1b.flwr.proto.StopRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x12\\\n\x0fGetLoginDetails\x12\".flwr.proto.GetLoginDetailsRequest\x1a#.flwr.proto.GetLoginDetailsResponse\"\x00\x12V\n\rGetAuthTokens\x12 .flwr.proto.GetAuthTokensRequest\x1a!.flwr.proto.GetAuthTokensResponse\"\x00\x62\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -29,12 +29,6 @@ if _descriptor._USE_C_DESCRIPTORS == False:
29
29
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_options = b'8\001'
30
30
  _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._options = None
31
31
  _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_options = b'8\001'
32
- _globals['_GETLOGINDETAILSRESPONSE_LOGINDETAILSENTRY']._options = None
33
- _globals['_GETLOGINDETAILSRESPONSE_LOGINDETAILSENTRY']._serialized_options = b'8\001'
34
- _globals['_GETAUTHTOKENSREQUEST_AUTHDETAILSENTRY']._options = None
35
- _globals['_GETAUTHTOKENSREQUEST_AUTHDETAILSENTRY']._serialized_options = b'8\001'
36
- _globals['_GETAUTHTOKENSRESPONSE_AUTHTOKENSENTRY']._options = None
37
- _globals['_GETAUTHTOKENSRESPONSE_AUTHTOKENSENTRY']._serialized_options = b'8\001'
38
32
  _globals['_STARTRUNREQUEST']._serialized_start=138
39
33
  _globals['_STARTRUNREQUEST']._serialized_end=389
40
34
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=316
@@ -54,21 +48,15 @@ if _descriptor._USE_C_DESCRIPTORS == False:
54
48
  _globals['_GETLOGINDETAILSREQUEST']._serialized_start=784
55
49
  _globals['_GETLOGINDETAILSREQUEST']._serialized_end=808
56
50
  _globals['_GETLOGINDETAILSRESPONSE']._serialized_start=811
57
- _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=967
58
- _globals['_GETLOGINDETAILSRESPONSE_LOGINDETAILSENTRY']._serialized_start=916
59
- _globals['_GETLOGINDETAILSRESPONSE_LOGINDETAILSENTRY']._serialized_end=967
60
- _globals['_GETAUTHTOKENSREQUEST']._serialized_start=970
61
- _globals['_GETAUTHTOKENSREQUEST']._serialized_end=1117
62
- _globals['_GETAUTHTOKENSREQUEST_AUTHDETAILSENTRY']._serialized_start=1067
63
- _globals['_GETAUTHTOKENSREQUEST_AUTHDETAILSENTRY']._serialized_end=1117
64
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=1120
65
- _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1266
66
- _globals['_GETAUTHTOKENSRESPONSE_AUTHTOKENSENTRY']._serialized_start=1217
67
- _globals['_GETAUTHTOKENSRESPONSE_AUTHTOKENSENTRY']._serialized_end=1266
68
- _globals['_STOPRUNREQUEST']._serialized_start=1268
69
- _globals['_STOPRUNREQUEST']._serialized_end=1300
70
- _globals['_STOPRUNRESPONSE']._serialized_start=1302
71
- _globals['_STOPRUNRESPONSE']._serialized_end=1336
72
- _globals['_EXEC']._serialized_start=1339
73
- _globals['_EXEC']._serialized_end=1824
51
+ _globals['_GETLOGINDETAILSRESPONSE']._serialized_end=949
52
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_start=951
53
+ _globals['_GETAUTHTOKENSREQUEST']._serialized_end=994
54
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_start=996
55
+ _globals['_GETAUTHTOKENSRESPONSE']._serialized_end=1064
56
+ _globals['_STOPRUNREQUEST']._serialized_start=1066
57
+ _globals['_STOPRUNREQUEST']._serialized_end=1098
58
+ _globals['_STOPRUNRESPONSE']._serialized_start=1100
59
+ _globals['_STOPRUNRESPONSE']._serialized_end=1134
60
+ _globals['_EXEC']._serialized_start=1137
61
+ _globals['_EXEC']._serialized_end=1622
74
62
  # @@protoc_insertion_point(module_scope)
@@ -143,77 +143,50 @@ global___GetLoginDetailsRequest = GetLoginDetailsRequest
143
143
 
144
144
  class GetLoginDetailsResponse(google.protobuf.message.Message):
145
145
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
146
- class LoginDetailsEntry(google.protobuf.message.Message):
147
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
148
- KEY_FIELD_NUMBER: builtins.int
149
- VALUE_FIELD_NUMBER: builtins.int
150
- key: typing.Text
151
- value: typing.Text
152
- def __init__(self,
153
- *,
154
- key: typing.Text = ...,
155
- value: typing.Text = ...,
156
- ) -> None: ...
157
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
158
-
159
- LOGIN_DETAILS_FIELD_NUMBER: builtins.int
160
- @property
161
- def login_details(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]: ...
146
+ AUTH_TYPE_FIELD_NUMBER: builtins.int
147
+ DEVICE_CODE_FIELD_NUMBER: builtins.int
148
+ VERIFICATION_URI_COMPLETE_FIELD_NUMBER: builtins.int
149
+ EXPIRES_IN_FIELD_NUMBER: builtins.int
150
+ INTERVAL_FIELD_NUMBER: builtins.int
151
+ auth_type: typing.Text
152
+ device_code: typing.Text
153
+ verification_uri_complete: typing.Text
154
+ expires_in: builtins.int
155
+ interval: builtins.int
162
156
  def __init__(self,
163
157
  *,
164
- login_details: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
158
+ auth_type: typing.Text = ...,
159
+ device_code: typing.Text = ...,
160
+ verification_uri_complete: typing.Text = ...,
161
+ expires_in: builtins.int = ...,
162
+ interval: builtins.int = ...,
165
163
  ) -> None: ...
166
- def ClearField(self, field_name: typing_extensions.Literal["login_details",b"login_details"]) -> None: ...
164
+ def ClearField(self, field_name: typing_extensions.Literal["auth_type",b"auth_type","device_code",b"device_code","expires_in",b"expires_in","interval",b"interval","verification_uri_complete",b"verification_uri_complete"]) -> None: ...
167
165
  global___GetLoginDetailsResponse = GetLoginDetailsResponse
168
166
 
169
167
  class GetAuthTokensRequest(google.protobuf.message.Message):
170
168
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
171
- class AuthDetailsEntry(google.protobuf.message.Message):
172
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
173
- KEY_FIELD_NUMBER: builtins.int
174
- VALUE_FIELD_NUMBER: builtins.int
175
- key: typing.Text
176
- value: typing.Text
177
- def __init__(self,
178
- *,
179
- key: typing.Text = ...,
180
- value: typing.Text = ...,
181
- ) -> None: ...
182
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
183
-
184
- AUTH_DETAILS_FIELD_NUMBER: builtins.int
185
- @property
186
- def auth_details(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]: ...
169
+ DEVICE_CODE_FIELD_NUMBER: builtins.int
170
+ device_code: typing.Text
187
171
  def __init__(self,
188
172
  *,
189
- auth_details: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
173
+ device_code: typing.Text = ...,
190
174
  ) -> None: ...
191
- def ClearField(self, field_name: typing_extensions.Literal["auth_details",b"auth_details"]) -> None: ...
175
+ def ClearField(self, field_name: typing_extensions.Literal["device_code",b"device_code"]) -> None: ...
192
176
  global___GetAuthTokensRequest = GetAuthTokensRequest
193
177
 
194
178
  class GetAuthTokensResponse(google.protobuf.message.Message):
195
179
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
196
- class AuthTokensEntry(google.protobuf.message.Message):
197
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
198
- KEY_FIELD_NUMBER: builtins.int
199
- VALUE_FIELD_NUMBER: builtins.int
200
- key: typing.Text
201
- value: typing.Text
202
- def __init__(self,
203
- *,
204
- key: typing.Text = ...,
205
- value: typing.Text = ...,
206
- ) -> None: ...
207
- def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
208
-
209
- AUTH_TOKENS_FIELD_NUMBER: builtins.int
210
- @property
211
- def auth_tokens(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, typing.Text]: ...
180
+ ACCESS_TOKEN_FIELD_NUMBER: builtins.int
181
+ REFRESH_TOKEN_FIELD_NUMBER: builtins.int
182
+ access_token: typing.Text
183
+ refresh_token: typing.Text
212
184
  def __init__(self,
213
185
  *,
214
- auth_tokens: typing.Optional[typing.Mapping[typing.Text, typing.Text]] = ...,
186
+ access_token: typing.Text = ...,
187
+ refresh_token: typing.Text = ...,
215
188
  ) -> None: ...
216
- def ClearField(self, field_name: typing_extensions.Literal["auth_tokens",b"auth_tokens"]) -> None: ...
189
+ def ClearField(self, field_name: typing_extensions.Literal["access_token",b"access_token","refresh_token",b"refresh_token"]) -> None: ...
217
190
  global___GetAuthTokensResponse = GetAuthTokensResponse
218
191
 
219
192
  class StopRunRequest(google.protobuf.message.Message):
@@ -263,11 +263,10 @@ def run_superlink() -> None:
263
263
  # Obtain certificates
264
264
  certificates = try_obtain_server_certificates(args, args.fleet_api_type)
265
265
 
266
- user_auth_config = _try_obtain_user_auth_config(args)
267
266
  auth_plugin: Optional[ExecAuthPlugin] = None
268
- # user_auth_config is None only if the args.user_auth_config is not provided
269
- if user_auth_config is not None:
270
- auth_plugin = _try_obtain_exec_auth_plugin(user_auth_config)
267
+ # Load the auth plugin if the args.user_auth_config is provided
268
+ if cfg_path := getattr(args, "user_auth_config", None):
269
+ auth_plugin = _try_obtain_exec_auth_plugin(Path(cfg_path))
271
270
 
272
271
  # Initialize StateFactory
273
272
  state_factory = LinkStateFactory(args.database)
@@ -584,21 +583,20 @@ def _try_setup_node_authentication(
584
583
  )
585
584
 
586
585
 
587
- def _try_obtain_user_auth_config(args: argparse.Namespace) -> Optional[dict[str, Any]]:
588
- if getattr(args, "user_auth_config", None) is not None:
589
- with open(args.user_auth_config, encoding="utf-8") as file:
590
- config: dict[str, Any] = yaml.safe_load(file)
591
- return config
592
- return None
586
+ def _try_obtain_exec_auth_plugin(config_path: Path) -> Optional[ExecAuthPlugin]:
587
+ # Load YAML file
588
+ with config_path.open("r", encoding="utf-8") as file:
589
+ config: dict[str, Any] = yaml.safe_load(file)
593
590
 
594
-
595
- def _try_obtain_exec_auth_plugin(config: dict[str, Any]) -> Optional[ExecAuthPlugin]:
591
+ # Load authentication configuration
596
592
  auth_config: dict[str, Any] = config.get("authentication", {})
597
593
  auth_type: str = auth_config.get(AUTH_TYPE, "")
594
+
595
+ # Load authentication plugin
598
596
  try:
599
597
  all_plugins: dict[str, type[ExecAuthPlugin]] = get_exec_auth_plugins()
600
598
  auth_plugin_class = all_plugins[auth_type]
601
- return auth_plugin_class(config=auth_config)
599
+ return auth_plugin_class(user_auth_config_path=config_path)
602
600
  except KeyError:
603
601
  if auth_type != "":
604
602
  sys.exit(
@@ -982,17 +982,16 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
982
982
  """Acknowledge a ping received from a node, serving as a heartbeat."""
983
983
  sint64_node_id = convert_uint64_to_sint64(node_id)
984
984
 
985
- # Update `online_until` and `ping_interval` for the given `node_id`
986
- query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?;"
987
- try:
988
- self.query(
989
- query, (time.time() + ping_interval, ping_interval, sint64_node_id)
990
- )
991
- return True
992
- except sqlite3.IntegrityError:
993
- log(ERROR, "`node_id` does not exist.")
985
+ # Check if the node exists in the `node` table
986
+ query = "SELECT 1 FROM node WHERE node_id = ?"
987
+ if not self.query(query, (sint64_node_id,)):
994
988
  return False
995
989
 
990
+ # Update `online_until` and `ping_interval` for the given `node_id`
991
+ query = "UPDATE node SET online_until = ?, ping_interval = ? WHERE node_id = ?"
992
+ self.query(query, (time.time() + ping_interval, ping_interval, sint64_node_id))
993
+ return True
994
+
996
995
  def get_serverapp_context(self, run_id: int) -> Optional[Context]:
997
996
  """Get the context for the specified `run_id`."""
998
997
  # Retrieve context if any
@@ -181,8 +181,20 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
181
181
  "ExecServicer initialized without user authentication",
182
182
  )
183
183
  raise grpc.RpcError() # This line is unreachable
184
+
185
+ # Get login details
186
+ details = self.auth_plugin.get_login_details()
187
+
188
+ # Return empty response if details is None
189
+ if details is None:
190
+ return GetLoginDetailsResponse()
191
+
184
192
  return GetLoginDetailsResponse(
185
- login_details=self.auth_plugin.get_login_details()
193
+ auth_type=details.auth_type,
194
+ device_code=details.device_code,
195
+ verification_uri_complete=details.verification_uri_complete,
196
+ expires_in=details.expires_in,
197
+ interval=details.interval,
186
198
  )
187
199
 
188
200
  def GetAuthTokens(
@@ -196,8 +208,17 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
196
208
  "ExecServicer initialized without user authentication",
197
209
  )
198
210
  raise grpc.RpcError() # This line is unreachable
211
+
212
+ # Get auth tokens
213
+ credentials = self.auth_plugin.get_auth_tokens(request.device_code)
214
+
215
+ # Return empty response if credentials is None
216
+ if credentials is None:
217
+ return GetAuthTokensResponse()
218
+
199
219
  return GetAuthTokensResponse(
200
- auth_tokens=self.auth_plugin.get_auth_tokens(dict(request.auth_details))
220
+ access_token=credentials.access_token,
221
+ refresh_token=credentials.refresh_token,
201
222
  )
202
223
 
203
224