flwr-nightly 1.21.0.dev20250807__tar.gz → 1.21.0.dev20250809__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 (392) hide show
  1. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/PKG-INFO +1 -1
  2. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/constant.py +16 -0
  3. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/telemetry.py +4 -0
  4. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp/app.py +34 -10
  5. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +2 -2
  6. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +2 -2
  7. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +43 -14
  8. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/app_utils.py +62 -0
  9. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/cli/__init__.py +22 -0
  10. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/cli/flower_superexec.py +91 -0
  11. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/corestate/corestate.py +3 -2
  12. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/plugin/__init__.py +2 -0
  13. flwr_nightly-1.21.0.dev20250807/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py → flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/base_exec_plugin.py +9 -5
  14. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/clientapp_exec_plugin.py +28 -0
  15. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/plugin/serverapp_exec_plugin.py +28 -0
  16. flwr_nightly-1.21.0.dev20250809/py/flwr/supercore/superexec/run_superexec.py +113 -0
  17. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/in_memory_nodestate.py +2 -2
  18. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/runtime/run_clientapp.py +3 -38
  19. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +2 -7
  20. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/pyproject.toml +2 -1
  21. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/README.md +0 -0
  22. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/__init__.py +0 -0
  24. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/error.py +0 -0
  25. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/app/metadata.py +0 -0
  26. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/__init__.py +0 -0
  27. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/app.py +0 -0
  28. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  29. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  30. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/build.py +0 -0
  31. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  32. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/config_utils.py +0 -0
  33. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/constant.py +0 -0
  34. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/example.py +0 -0
  35. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/install.py +0 -0
  36. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/log.py +0 -0
  37. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/login/__init__.py +0 -0
  38. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/login/login.py +0 -0
  39. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/ls.py +0 -0
  40. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/__init__.py +0 -0
  41. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/new.py +0 -0
  42. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/__init__.py +0 -0
  43. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  44. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  45. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  46. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  47. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  48. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  49. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  51. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  52. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  54. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  55. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  56. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  57. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  58. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  59. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  60. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  62. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  63. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  64. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  65. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  66. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  67. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  68. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  69. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  70. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  71. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  72. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  73. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  74. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  75. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  76. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  77. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  78. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  79. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  80. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  81. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  82. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  83. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  84. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  85. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  86. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  87. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  88. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  89. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  90. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  91. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  92. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  93. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  94. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/run/__init__.py +0 -0
  95. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/run/run.py +0 -0
  96. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/stop.py +0 -0
  97. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/cli/utils.py +0 -0
  98. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/__init__.py +0 -0
  99. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/client.py +0 -0
  100. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/client_app.py +0 -0
  101. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/clientapp/__init__.py +0 -0
  102. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/clientapp/utils.py +0 -0
  103. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  104. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  105. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  106. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  107. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  108. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/connection.py +0 -0
  109. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  110. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/message_handler/__init__.py +0 -0
  111. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/message_handler/message_handler.py +0 -0
  112. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/__init__.py +0 -0
  113. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/centraldp_mods.py +0 -0
  114. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/comms_mods.py +0 -0
  115. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/localdp_mod.py +0 -0
  116. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  117. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  118. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  119. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/mod/utils.py +0 -0
  120. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/numpy_client.py +0 -0
  121. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/rest_client/__init__.py +0 -0
  122. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/rest_client/connection.py +0 -0
  123. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/run_info_store.py +0 -0
  124. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/client/typing.py +0 -0
  125. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/clientapp/__init__.py +0 -0
  126. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/__init__.py +0 -0
  127. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/address.py +0 -0
  128. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/args.py +0 -0
  129. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/auth_plugin/__init__.py +0 -0
  130. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  131. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/config.py +0 -0
  132. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/context.py +0 -0
  133. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/date.py +0 -0
  134. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/differential_privacy.py +0 -0
  135. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/differential_privacy_constants.py +0 -0
  136. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/dp.py +0 -0
  137. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  138. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  139. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/__init__.py +0 -0
  140. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/exit.py +0 -0
  141. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit/exit_code.py +0 -0
  142. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/exit_handlers.py +0 -0
  143. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/grpc.py +0 -0
  144. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/heartbeat.py +0 -0
  145. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable.py +0 -0
  146. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable_protobuf_utils.py +0 -0
  147. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/inflatable_utils.py +0 -0
  148. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/logger.py +0 -0
  149. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/message.py +0 -0
  150. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/object_ref.py +0 -0
  151. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/parameter.py +0 -0
  152. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/pyproject.py +0 -0
  153. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/__init__.py +0 -0
  154. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/array.py +0 -0
  155. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/arraychunk.py +0 -0
  156. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/arrayrecord.py +0 -0
  157. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/configrecord.py +0 -0
  158. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/conversion_utils.py +0 -0
  159. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/metricrecord.py +0 -0
  160. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/recorddict.py +0 -0
  161. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/record/typeddict.py +0 -0
  162. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/recorddict_compat.py +0 -0
  163. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/retry_invoker.py +0 -0
  164. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  165. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  166. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  167. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  168. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  169. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  170. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  171. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  172. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/serde.py +0 -0
  173. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/serde_utils.py +0 -0
  174. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/typing.py +0 -0
  175. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/common/version.py +0 -0
  176. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/__init__.py +0 -0
  177. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/__init__.py +0 -0
  178. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/app.py +0 -0
  179. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  180. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  181. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/common/__init__.py +0 -0
  182. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/server/__init__.py +0 -0
  183. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/server/app.py +0 -0
  184. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/compat/simulation/__init__.py +0 -0
  185. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/__init__.py +0 -0
  186. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2.py +0 -0
  187. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2.pyi +0 -0
  188. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/appio_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2.py +0 -0
  191. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  192. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2.py +0 -0
  195. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2.pyi +0 -0
  196. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/control_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2.py +0 -0
  199. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2.pyi +0 -0
  200. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2.py +0 -0
  203. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2.pyi +0 -0
  204. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2.py +0 -0
  207. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2.pyi +0 -0
  208. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  211. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  212. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2.py +0 -0
  215. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  216. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2.py +0 -0
  219. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2.pyi +0 -0
  220. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2.py +0 -0
  223. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2.pyi +0 -0
  224. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2.py +0 -0
  227. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2.pyi +0 -0
  228. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2.py +0 -0
  231. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  232. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  233. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  234. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2.py +0 -0
  235. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2.pyi +0 -0
  236. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2_grpc.py +0 -0
  237. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  238. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2.py +0 -0
  239. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  240. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  241. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  242. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2.py +0 -0
  243. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  244. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  245. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  246. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2.py +0 -0
  247. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2.pyi +0 -0
  248. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  249. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  250. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/py.typed +0 -0
  251. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/__init__.py +0 -0
  252. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/app.py +0 -0
  253. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/client_manager.py +0 -0
  254. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/client_proxy.py +0 -0
  255. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/__init__.py +0 -0
  256. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/app.py +0 -0
  257. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/app_utils.py +0 -0
  258. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  259. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/compat/legacy_context.py +0 -0
  260. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/criterion.py +0 -0
  261. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  262. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/__init__.py +0 -0
  263. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/grid.py +0 -0
  264. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/grpc_grid.py +0 -0
  265. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/grid/inmemory_grid.py +0 -0
  266. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/history.py +0 -0
  267. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/run_serverapp.py +0 -0
  268. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server.py +0 -0
  269. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server_app.py +0 -0
  270. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/server_config.py +0 -0
  271. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp/__init__.py +0 -0
  272. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/serverapp_components.py +0 -0
  273. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/__init__.py +0 -0
  274. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/aggregate.py +0 -0
  275. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/bulyan.py +0 -0
  276. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  277. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  278. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  279. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  280. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  281. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedadagrad.py +0 -0
  282. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedadam.py +0 -0
  283. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavg.py +0 -0
  284. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavg_android.py +0 -0
  285. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedavgm.py +0 -0
  286. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedmedian.py +0 -0
  287. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedopt.py +0 -0
  288. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedprox.py +0 -0
  289. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  290. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  291. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  292. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  293. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/fedyogi.py +0 -0
  294. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/krum.py +0 -0
  295. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/qfedavg.py +0 -0
  296. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/strategy/strategy.py +0 -0
  297. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/__init__.py +0 -0
  298. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  299. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  300. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  301. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  302. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  303. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  304. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  305. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  306. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  307. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  308. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  309. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  310. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  311. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  312. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  313. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  314. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  315. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  316. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  317. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  318. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  319. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  320. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  321. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  322. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  323. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  324. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  325. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  326. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  327. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/superlink/utils.py +0 -0
  328. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/typing.py +0 -0
  329. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/__init__.py +0 -0
  330. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/tensorboard.py +0 -0
  331. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/utils/validator.py +0 -0
  332. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/__init__.py +0 -0
  333. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/constant.py +0 -0
  334. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/default_workflows.py +0 -0
  335. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  336. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  337. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  338. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/serverapp/__init__.py +0 -0
  339. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/__init__.py +0 -0
  340. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/app.py +0 -0
  341. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/legacy_app.py +0 -0
  342. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  343. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  344. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  345. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/ray_transport/utils.py +0 -0
  346. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/run_simulation.py +0 -0
  347. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/simulation/simulationio_connection.py +0 -0
  348. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/__init__.py +0 -0
  349. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/corestate/__init__.py +0 -0
  350. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/__init__.py +0 -0
  351. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  352. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/ffs.py +0 -0
  353. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  354. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/grpc_health/__init__.py +0 -0
  355. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/grpc_health/simple_health_servicer.py +0 -0
  356. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/license_plugin/__init__.py +0 -0
  357. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/license_plugin/license_plugin.py +0 -0
  358. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/__init__.py +0 -0
  359. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  360. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/object_store.py +0 -0
  361. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  362. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/object_store/utils.py +0 -0
  363. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/__init__.py +0 -0
  364. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/superexec/plugin/exec_plugin.py +0 -0
  365. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supercore/utils.py +0 -0
  366. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/__init__.py +0 -0
  367. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/deployment.py +0 -0
  368. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superexec/simulation.py +0 -0
  369. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/__init__.py +0 -0
  370. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/__init__.py +0 -0
  371. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/app.py +0 -0
  372. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/deployment.py +0 -0
  373. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/executor.py +0 -0
  374. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/executor/simulation.py +0 -0
  375. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/__init__.py +0 -0
  376. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/__init__.py +0 -0
  377. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_event_log_interceptor.py +0 -0
  378. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_grpc.py +0 -0
  379. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_license_interceptor.py +0 -0
  380. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_servicer.py +0 -0
  381. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/superlink/servicer/control/control_user_auth_interceptor.py +0 -0
  382. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/__init__.py +0 -0
  383. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/__init__.py +0 -0
  384. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/flower_supernode.py +0 -0
  385. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/cli/flwr_clientapp.py +0 -0
  386. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/__init__.py +0 -0
  387. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  388. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  389. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/runtime/__init__.py +0 -0
  390. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/__init__.py +0 -0
  391. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/py/flwr/supernode/servicer/clientappio/__init__.py +0 -0
  392. {flwr_nightly-1.21.0.dev20250807 → flwr_nightly-1.21.0.dev20250809}/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.21.0.dev20250807
3
+ Version: 1.21.0.dev20250809
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
@@ -259,3 +259,19 @@ class EventLogWriterType:
259
259
  def __new__(cls) -> EventLogWriterType:
260
260
  """Prevent instantiation."""
261
261
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
262
+
263
+
264
+ class ExecPluginType:
265
+ """SuperExec plugin types."""
266
+
267
+ CLIENT_APP = "clientapp"
268
+
269
+ def __new__(cls) -> ExecPluginType:
270
+ """Prevent instantiation."""
271
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
272
+
273
+ @staticmethod
274
+ def all() -> list[str]:
275
+ """Return all SuperExec plugin types."""
276
+ # Filter all constants (uppercase) of the class
277
+ return [v for k, v in vars(ExecPluginType).items() if k.isupper()]
@@ -181,6 +181,10 @@ class EventType(str, Enum):
181
181
  RUN_SUPERNODE_ENTER = auto()
182
182
  RUN_SUPERNODE_LEAVE = auto()
183
183
 
184
+ # CLI: `flower-superexec`
185
+ RUN_SUPEREXEC_ENTER = auto()
186
+ RUN_SUPEREXEC_LEAVE = auto()
187
+
184
188
 
185
189
  # Use the ThreadPoolExecutor with max_workers=1 to have a queue
186
190
  # and also ensure that telemetry calls are not blocking.
@@ -20,7 +20,6 @@ import gc
20
20
  from logging import DEBUG, ERROR, INFO
21
21
  from pathlib import Path
22
22
  from queue import Queue
23
- from time import sleep
24
23
  from typing import Optional
25
24
 
26
25
  from flwr.cli.config_utils import get_fab_metadata
@@ -64,6 +63,7 @@ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
64
63
  from flwr.proto.run_pb2 import UpdateRunStatusRequest # pylint: disable=E0611
65
64
  from flwr.server.grid.grpc_grid import GrpcGrid
66
65
  from flwr.server.run_serverapp import run as run_
66
+ from flwr.supercore.app_utils import simple_get_token, start_parent_process_monitor
67
67
 
68
68
 
69
69
  def flwr_serverapp() -> None:
@@ -91,23 +91,31 @@ def flwr_serverapp() -> None:
91
91
  run_serverapp(
92
92
  serverappio_api_address=args.serverappio_api_address,
93
93
  log_queue=log_queue,
94
+ token=args.token,
94
95
  run_once=args.run_once,
95
96
  flwr_dir=args.flwr_dir,
96
97
  certificates=None,
98
+ parent_pid=args.parent_pid,
97
99
  )
98
100
 
99
101
  # Restore stdout/stderr
100
102
  restore_output()
101
103
 
102
104
 
103
- def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
105
+ def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
104
106
  serverappio_api_address: str,
105
107
  log_queue: Queue[Optional[str]],
106
108
  run_once: bool,
109
+ token: Optional[str] = None,
107
110
  flwr_dir: Optional[str] = None,
108
111
  certificates: Optional[bytes] = None,
112
+ parent_pid: Optional[int] = None,
109
113
  ) -> None:
110
114
  """Run Flower ServerApp process."""
115
+ # Monitor the main process in case of SIGKILL
116
+ if parent_pid is not None:
117
+ start_parent_process_monitor(parent_pid)
118
+
111
119
  # Resolve directory where FABs are installed
112
120
  flwr_dir_ = get_flwr_dir(flwr_dir)
113
121
  log_uploader = None
@@ -126,15 +134,15 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
126
134
  root_certificates=certificates,
127
135
  )
128
136
 
137
+ # If token is not set, loop until token is received from SuperLink
138
+ if token is None:
139
+ log(DEBUG, "[flwr-serverapp] Request token")
140
+ token = simple_get_token(grid._stub)
141
+
129
142
  # Pull ServerAppInputs from LinkState
130
- req = PullAppInputsRequest()
143
+ req = PullAppInputsRequest(token=token)
131
144
  log(DEBUG, "[flwr-serverapp] Pull ServerAppInputs")
132
145
  res: PullAppInputsResponse = grid._stub.PullAppInputs(req)
133
- if not res.HasField("run"):
134
- sleep(3)
135
- run_status = None
136
- continue
137
-
138
146
  context = context_from_proto(res.context)
139
147
  run = run_from_proto(res.run)
140
148
  fab = fab_from_proto(res.fab)
@@ -209,7 +217,9 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
209
217
  # Send resulting context
210
218
  context_proto = context_to_proto(updated_context)
211
219
  log(DEBUG, "[flwr-serverapp] Will push ServerAppOutputs")
212
- out_req = PushAppOutputsRequest(run_id=run.run_id, context=context_proto)
220
+ out_req = PushAppOutputsRequest(
221
+ token=token, run_id=run.run_id, context=context_proto
222
+ )
213
223
  _ = grid._stub.PushAppOutputs(out_req)
214
224
 
215
225
  run_status = RunStatus(Status.FINISHED, SubStatus.COMPLETED, "")
@@ -250,8 +260,9 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
250
260
  if grid:
251
261
  grid.close()
252
262
 
253
- # Clean up the Context
263
+ # Clean up the Context and the token
254
264
  context = None
265
+ token = None
255
266
  gc.collect()
256
267
 
257
268
  event(
@@ -276,6 +287,19 @@ def _parse_args_run_flwr_serverapp() -> argparse.ArgumentParser:
276
287
  help="Address of SuperLink's ServerAppIo API (IPv4, IPv6, or a domain name)."
277
288
  f"By default, it is set to {SERVERAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
278
289
  )
290
+ parser.add_argument(
291
+ "--token",
292
+ type=str,
293
+ required=False,
294
+ help="Unique token generated by SuperNode for each ServerApp execution",
295
+ )
296
+ parser.add_argument(
297
+ "--parent-pid",
298
+ type=int,
299
+ default=None,
300
+ help="The PID of the parent process. When set, the process will terminate "
301
+ "when the parent process exits.",
302
+ )
279
303
  parser.add_argument(
280
304
  "--run-once",
281
305
  action="store_true",
@@ -686,12 +686,12 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
686
686
  latest_timestamp = run.logs[-1][0] if index < len(run.logs) else 0.0
687
687
  return "".join(log for _, log in run.logs[index:]), latest_timestamp
688
688
 
689
- def create_token(self, run_id: int) -> str:
689
+ def create_token(self, run_id: int) -> Optional[str]:
690
690
  """Create a token for the given run ID."""
691
691
  token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
692
692
  with self.lock_token_store:
693
693
  if run_id in self.token_store:
694
- raise ValueError("Token already created for this run ID")
694
+ return None # Token already created for this run ID
695
695
  self.token_store[run_id] = token
696
696
  self.token_to_run_id[token] = run_id
697
697
  return token
@@ -1148,7 +1148,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
1148
1148
 
1149
1149
  return message_ins
1150
1150
 
1151
- def create_token(self, run_id: int) -> str:
1151
+ def create_token(self, run_id: int) -> Optional[str]:
1152
1152
  """Create a token for the given run ID."""
1153
1153
  token = secrets.token_hex(FLWR_APP_TOKEN_LENGTH) # Generate a random token
1154
1154
  query = "INSERT INTO token_store (run_id, token) VALUES (:run_id, :token);"
@@ -1156,7 +1156,7 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
1156
1156
  try:
1157
1157
  self.query(query, data)
1158
1158
  except sqlite3.IntegrityError:
1159
- raise ValueError("Token already created for this run ID") from None
1159
+ return None # Token already created for this run ID
1160
1160
  return token
1161
1161
 
1162
1162
  def verify_token(self, run_id: int, token: str) -> bool:
@@ -114,21 +114,35 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
114
114
  context: grpc.ServicerContext,
115
115
  ) -> ListAppsToLaunchResponse:
116
116
  """Get run IDs with pending messages."""
117
- log(DEBUG, "ClientAppIo.ListAppsToLaunch")
117
+ log(DEBUG, "ServerAppIoServicer.ListAppsToLaunch")
118
118
 
119
- context.abort(
120
- grpc.StatusCode.UNIMPLEMENTED, "ListAppsToLaunch is not implemented"
121
- )
122
- raise NotImplementedError
119
+ # Initialize state connection
120
+ state = self.state_factory.state()
121
+
122
+ # Get IDs of runs in pending status
123
+ run_ids = state.get_run_ids(flwr_aid=None)
124
+ pending_run_ids = []
125
+ for run_id, status in state.get_run_status(run_ids).items():
126
+ if status.status == Status.PENDING:
127
+ pending_run_ids.append(run_id)
128
+
129
+ # Return run IDs
130
+ return ListAppsToLaunchResponse(run_ids=pending_run_ids)
123
131
 
124
132
  def RequestToken(
125
133
  self, request: RequestTokenRequest, context: grpc.ServicerContext
126
134
  ) -> RequestTokenResponse:
127
135
  """Request token."""
128
- log(DEBUG, "ClientAppIo.RequestToken")
136
+ log(DEBUG, "ServerAppIoServicer.RequestToken")
137
+
138
+ # Initialize state connection
139
+ state = self.state_factory.state()
140
+
141
+ # Attempt to create a token for the provided run ID
142
+ token = state.create_token(request.run_id)
129
143
 
130
- context.abort(grpc.StatusCode.UNIMPLEMENTED, "RequestToken is not implemented")
131
- raise NotImplementedError
144
+ # Return the token
145
+ return RequestTokenResponse(token=token or "")
132
146
 
133
147
  def GetNodes(
134
148
  self, request: GetNodesRequest, context: grpc.ServicerContext
@@ -315,14 +329,11 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
315
329
  # Init access to LinkState
316
330
  state = self.state_factory.state()
317
331
 
332
+ # Validate the token
333
+ run_id = self._verify_token(request.token, context)
334
+
318
335
  # Lock access to LinkState, preventing obtaining the same pending run_id
319
336
  with self.lock:
320
- # Attempt getting the run_id of a pending run
321
- run_id = state.get_pending_run_id()
322
- # If there's no pending run, return an empty response
323
- if run_id is None:
324
- return PullAppInputsResponse()
325
-
326
337
  # Init access to Ffs
327
338
  ffs = self.ffs_factory.ffs()
328
339
 
@@ -353,6 +364,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
353
364
  """Push ServerApp process outputs."""
354
365
  log(DEBUG, "ServerAppIoServicer.PushAppOutputs")
355
366
 
367
+ # Validate the token
368
+ run_id = self._verify_token(request.token, context)
369
+
356
370
  # Init state and store
357
371
  state = self.state_factory.state()
358
372
  store = self.objectstore_factory.store()
@@ -367,6 +381,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
367
381
  )
368
382
 
369
383
  state.set_serverapp_context(request.run_id, context_from_proto(request.context))
384
+
385
+ # Remove the token
386
+ state.delete_token(run_id)
370
387
  return PushAppOutputsResponse()
371
388
 
372
389
  def UpdateRunStatus(
@@ -534,6 +551,18 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
534
551
 
535
552
  return ConfirmMessageReceivedResponse()
536
553
 
554
+ def _verify_token(self, token: str, context: grpc.ServicerContext) -> int:
555
+ """Verify the token and return the associated run ID."""
556
+ state = self.state_factory.state()
557
+ run_id = state.get_run_id_by_token(token)
558
+ if run_id is None or not state.verify_token(run_id, token):
559
+ context.abort(
560
+ grpc.StatusCode.PERMISSION_DENIED,
561
+ "Invalid token.",
562
+ )
563
+ raise RuntimeError("This line should never be reached.")
564
+ return run_id
565
+
537
566
 
538
567
  def _raise_if(validation_error: bool, request_name: str, detail: str) -> None:
539
568
  """Raise a `ValueError` with a detailed message if a validation error occurs."""
@@ -0,0 +1,62 @@
1
+ # Copyright 2025 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
+ """Utility functions for app processes."""
16
+
17
+
18
+ import os
19
+ import threading
20
+ import time
21
+ from typing import Union
22
+
23
+ from flwr.proto.appio_pb2 import ( # pylint: disable=E0611
24
+ ListAppsToLaunchRequest,
25
+ ListAppsToLaunchResponse,
26
+ RequestTokenRequest,
27
+ RequestTokenResponse,
28
+ )
29
+ from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
30
+ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub
31
+
32
+
33
+ def start_parent_process_monitor(
34
+ parent_pid: int,
35
+ ) -> None:
36
+ """Monitor the parent process and exit if it terminates."""
37
+
38
+ def monitor() -> None:
39
+ while True:
40
+ time.sleep(0.2)
41
+ if os.getppid() != parent_pid:
42
+ os.kill(os.getpid(), 9)
43
+
44
+ threading.Thread(target=monitor, daemon=True).start()
45
+
46
+
47
+ def simple_get_token(stub: Union[ClientAppIoStub, ServerAppIoStub]) -> str:
48
+ """Get a token from SuperLink/SuperNode.
49
+
50
+ This shall be removed once the SuperExec is fully implemented.
51
+ """
52
+ while True:
53
+ res: ListAppsToLaunchResponse = stub.ListAppsToLaunch(ListAppsToLaunchRequest())
54
+
55
+ for run_id in res.run_ids:
56
+ tk_res: RequestTokenResponse = stub.RequestToken(
57
+ RequestTokenRequest(run_id=run_id)
58
+ )
59
+ if tk_res.token:
60
+ return tk_res.token
61
+
62
+ time.sleep(1) # Wait before retrying to get run IDs
@@ -0,0 +1,22 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower command line interface for shared infrastructure components."""
16
+
17
+
18
+ from .flower_superexec import flower_superexec
19
+
20
+ __all__ = [
21
+ "flower_superexec",
22
+ ]
@@ -0,0 +1,91 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """`flower-superexec` command."""
16
+
17
+
18
+ import argparse
19
+ from logging import INFO
20
+
21
+ from flwr.common import EventType, event
22
+ from flwr.common.constant import ExecPluginType
23
+ from flwr.common.logger import log
24
+ from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
25
+ from flwr.supercore.superexec.plugin import ClientAppExecPlugin, ExecPlugin
26
+ from flwr.supercore.superexec.run_superexec import run_superexec
27
+
28
+
29
+ def flower_superexec() -> None:
30
+ """Run `flower-superexec` command."""
31
+ args = _parse_args().parse_args()
32
+
33
+ # Log the first message after parsing arguments in case of `--help`
34
+ log(INFO, "Starting Flower SuperExec")
35
+
36
+ # Trigger telemetry event
37
+ event(EventType.RUN_SUPEREXEC_ENTER, {"plugin_type": args.plugin_type})
38
+
39
+ # Get the plugin class and stub class based on the plugin type
40
+ plugin_class, stub_class = _get_plugin_and_stub_class(args.plugin_type)
41
+ run_superexec(
42
+ plugin_class=plugin_class,
43
+ stub_class=stub_class, # type: ignore
44
+ appio_api_address=args.appio_api_address,
45
+ flwr_dir=args.flwr_dir,
46
+ )
47
+
48
+
49
+ def _parse_args() -> argparse.ArgumentParser:
50
+ """Parse `flower-superexec` command line arguments."""
51
+ parser = argparse.ArgumentParser(
52
+ description="Run Flower SuperExec.",
53
+ )
54
+ parser.add_argument(
55
+ "--appio-api-address", type=str, required=True, help="Address of the AppIO API"
56
+ )
57
+ parser.add_argument(
58
+ "--plugin-type",
59
+ type=str,
60
+ choices=ExecPluginType.all(),
61
+ required=True,
62
+ help="The type of plugin to use.",
63
+ )
64
+ parser.add_argument(
65
+ "--insecure",
66
+ action="store_true",
67
+ help="Connect to the AppIO API without TLS. "
68
+ "Data transmitted between the client and server is not encrypted. "
69
+ "Use this flag only if you understand the risks.",
70
+ )
71
+ parser.add_argument(
72
+ "--flwr-dir",
73
+ default=None,
74
+ help="""The path containing installed Flower Apps.
75
+ By default, this value is equal to:
76
+
77
+ - `$FLWR_HOME/` if `$FLWR_HOME` is defined
78
+ - `$XDG_DATA_HOME/.flwr/` if `$XDG_DATA_HOME` is defined
79
+ - `$HOME/.flwr/` in all other cases
80
+ """,
81
+ )
82
+ return parser
83
+
84
+
85
+ def _get_plugin_and_stub_class(
86
+ plugin_type: str,
87
+ ) -> tuple[type[ExecPlugin], type[object]]:
88
+ """Get the plugin class and stub class based on the plugin type."""
89
+ if plugin_type == ExecPluginType.CLIENT_APP:
90
+ return ClientAppExecPlugin, ClientAppIoStub
91
+ raise ValueError(f"Unknown plugin type: {plugin_type}")
@@ -23,7 +23,7 @@ class CoreState(ABC):
23
23
  """Abstract base class for core state."""
24
24
 
25
25
  @abstractmethod
26
- def create_token(self, run_id: int) -> str:
26
+ def create_token(self, run_id: int) -> Optional[str]:
27
27
  """Create a token for the given run ID.
28
28
 
29
29
  Parameters
@@ -34,7 +34,8 @@ class CoreState(ABC):
34
34
  Returns
35
35
  -------
36
36
  str
37
- A unique token associated with the run ID.
37
+ The newly generated token if one does not already exist
38
+ for the given run ID, otherwise None.
38
39
  """
39
40
 
40
41
  @abstractmethod
@@ -17,8 +17,10 @@
17
17
 
18
18
  from .clientapp_exec_plugin import ClientAppExecPlugin
19
19
  from .exec_plugin import ExecPlugin
20
+ from .serverapp_exec_plugin import ServerAppExecPlugin
20
21
 
21
22
  __all__ = [
22
23
  "ClientAppExecPlugin",
23
24
  "ExecPlugin",
25
+ "ServerAppExecPlugin",
24
26
  ]
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Simple Flower SuperExec plugin for ClientApp."""
15
+ """Simple base Flower SuperExec plugin for app processes."""
16
16
 
17
17
 
18
18
  import os
@@ -23,12 +23,16 @@ from typing import Optional
23
23
  from .exec_plugin import ExecPlugin
24
24
 
25
25
 
26
- class ClientAppExecPlugin(ExecPlugin):
27
- """Simple Flower SuperExec plugin for ClientApp.
26
+ class BaseExecPlugin(ExecPlugin):
27
+ """Simple Flower SuperExec plugin for app processes.
28
28
 
29
29
  The plugin always selects the first candidate run ID.
30
30
  """
31
31
 
32
+ # Placeholders to be defined in subclasses
33
+ command = ""
34
+ appio_api_address_arg = ""
35
+
32
36
  def select_run_id(self, candidate_run_ids: Sequence[int]) -> Optional[int]:
33
37
  """Select a run ID to execute from a sequence of candidates."""
34
38
  if not candidate_run_ids:
@@ -37,8 +41,8 @@ class ClientAppExecPlugin(ExecPlugin):
37
41
 
38
42
  def launch_app(self, token: str, run_id: int) -> None:
39
43
  """Launch the application associated with a given run ID and token."""
40
- cmds = ["flwr-clientapp", "--insecure"]
41
- cmds += ["--clientappio-api-address", self.appio_api_address]
44
+ cmds = [self.command, "--insecure"]
45
+ cmds += [self.appio_api_address_arg, self.appio_api_address]
42
46
  cmds += ["--token", token]
43
47
  cmds += ["--parent-pid", str(os.getpid())]
44
48
  cmds += ["--flwr-dir", self.flwr_dir]
@@ -0,0 +1,28 @@
1
+ # Copyright 2025 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
+ """Simple Flower SuperExec plugin for ClientApp."""
16
+
17
+
18
+ from .base_exec_plugin import BaseExecPlugin
19
+
20
+
21
+ class ClientAppExecPlugin(BaseExecPlugin):
22
+ """Simple Flower SuperExec plugin for ClientApp.
23
+
24
+ The plugin always selects the first candidate run ID.
25
+ """
26
+
27
+ command = "flwr-clientapp"
28
+ appio_api_address_arg = "--clientappio-api-address"
@@ -0,0 +1,28 @@
1
+ # Copyright 2025 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
+ """Simple Flower SuperExec plugin for ServerApp."""
16
+
17
+
18
+ from .base_exec_plugin import BaseExecPlugin
19
+
20
+
21
+ class ServerAppExecPlugin(BaseExecPlugin):
22
+ """Simple Flower SuperExec plugin for ServerApp.
23
+
24
+ The plugin always selects the first candidate run ID.
25
+ """
26
+
27
+ command = "flwr-serverapp"
28
+ appio_api_address_arg = "--serverappio-api-address"