flwr-nightly 1.20.0.dev20250618__tar.gz → 1.20.0.dev20250619__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 (367) hide show
  1. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/PKG-INFO +1 -1
  2. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/build.py +14 -4
  3. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/connection.py +0 -24
  4. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/rest_client/connection.py +0 -24
  5. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/constant.py +1 -0
  6. flwr_nightly-1.20.0.dev20250619/py/flwr/proto/clientappio_pb2.py +49 -0
  7. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2.pyi +0 -17
  8. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2_grpc.py +0 -34
  9. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -13
  10. flwr_nightly-1.20.0.dev20250619/py/flwr/supercore/utils.py +32 -0
  11. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_servicer.py +9 -0
  12. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/flower_supernode.py +0 -7
  13. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/flwr_clientapp.py +2 -1
  14. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/runtime/run_clientapp.py +7 -2
  15. flwr_nightly-1.20.0.dev20250619/py/flwr/supernode/servicer/clientappio/__init__.py +22 -0
  16. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/servicer/clientappio/clientappio_servicer.py +10 -91
  17. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/start_client_internal.py +89 -66
  18. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/pyproject.toml +1 -1
  19. flwr_nightly-1.20.0.dev20250618/py/flwr/proto/clientappio_pb2.py +0 -53
  20. flwr_nightly-1.20.0.dev20250618/py/flwr/supernode/servicer/clientappio/__init__.py +0 -24
  21. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/README.md +0 -0
  22. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/__init__.py +0 -0
  23. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/__init__.py +0 -0
  24. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/error.py +0 -0
  25. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/app/metadata.py +0 -0
  26. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/__init__.py +0 -0
  27. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/app.py +0 -0
  28. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  29. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  30. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  31. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/config_utils.py +0 -0
  32. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/constant.py +0 -0
  33. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/example.py +0 -0
  34. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/install.py +0 -0
  35. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/log.py +0 -0
  36. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/login/__init__.py +0 -0
  37. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/login/login.py +0 -0
  38. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/ls.py +0 -0
  39. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/__init__.py +0 -0
  40. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/new.py +0 -0
  41. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/__init__.py +0 -0
  42. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  43. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  44. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  45. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  46. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  47. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/__init__.py +0 -0
  48. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  50. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  51. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  53. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  54. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  55. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  56. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  57. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  58. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  59. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  61. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  62. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  63. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  64. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  65. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  66. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  68. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  69. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  70. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  71. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  72. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  73. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  74. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  75. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  76. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  77. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  78. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  79. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  80. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  81. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  82. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  83. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  84. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  85. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  86. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  87. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  88. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  89. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  90. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  91. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  92. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  93. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/run/__init__.py +0 -0
  94. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/run/run.py +0 -0
  95. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/stop.py +0 -0
  96. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/cli/utils.py +0 -0
  97. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/__init__.py +0 -0
  98. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/client.py +0 -0
  99. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/client_app.py +0 -0
  100. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/clientapp/__init__.py +0 -0
  101. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/clientapp/utils.py +0 -0
  102. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  103. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  104. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  105. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  106. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  107. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  108. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/message_handler/__init__.py +0 -0
  109. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/message_handler/message_handler.py +0 -0
  110. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/__init__.py +0 -0
  111. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/centraldp_mods.py +0 -0
  112. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/comms_mods.py +0 -0
  113. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/localdp_mod.py +0 -0
  114. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  115. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  116. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  117. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/mod/utils.py +0 -0
  118. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/numpy_client.py +0 -0
  119. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/rest_client/__init__.py +0 -0
  120. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/run_info_store.py +0 -0
  121. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/client/typing.py +0 -0
  122. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/clientapp/__init__.py +0 -0
  123. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/__init__.py +0 -0
  124. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/address.py +0 -0
  125. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/args.py +0 -0
  126. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/auth_plugin/__init__.py +0 -0
  127. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  128. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/config.py +0 -0
  129. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  135. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  136. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/__init__.py +0 -0
  137. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/exit.py +0 -0
  138. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit/exit_code.py +0 -0
  139. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/exit_handlers.py +0 -0
  140. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/grpc.py +0 -0
  141. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/heartbeat.py +0 -0
  142. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable.py +0 -0
  143. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_grpc_utils.py +0 -0
  144. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_rest_utils.py +0 -0
  145. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/inflatable_utils.py +0 -0
  146. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/logger.py +0 -0
  147. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/message.py +0 -0
  148. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/object_ref.py +0 -0
  149. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/parameter.py +0 -0
  150. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/pyproject.py +0 -0
  151. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/__init__.py +0 -0
  152. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/array.py +0 -0
  153. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/arrayrecord.py +0 -0
  154. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/configrecord.py +0 -0
  155. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/conversion_utils.py +0 -0
  156. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/metricrecord.py +0 -0
  157. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/recorddict.py +0 -0
  158. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/record/typeddict.py +0 -0
  159. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/recorddict_compat.py +0 -0
  160. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/retry_invoker.py +0 -0
  161. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/__init__.py +0 -0
  162. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  163. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  164. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  165. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  166. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/quantization.py +0 -0
  167. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  168. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  169. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/serde.py +0 -0
  170. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/serde_utils.py +0 -0
  171. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/telemetry.py +0 -0
  172. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/typing.py +0 -0
  173. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/common/version.py +0 -0
  174. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/__init__.py +0 -0
  175. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/__init__.py +0 -0
  176. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/app.py +0 -0
  177. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/grpc_client/__init__.py +0 -0
  178. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/client/grpc_client/connection.py +0 -0
  179. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/common/__init__.py +0 -0
  180. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/server/__init__.py +0 -0
  181. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/server/app.py +0 -0
  182. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/compat/simulation/__init__.py +0 -0
  183. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/__init__.py +0 -0
  184. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2.py +0 -0
  185. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2.pyi +0 -0
  186. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2.py +0 -0
  189. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2.pyi +0 -0
  190. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2.py +0 -0
  193. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2.pyi +0 -0
  194. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2.py +0 -0
  197. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2.pyi +0 -0
  198. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  201. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  202. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2.py +0 -0
  205. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2.pyi +0 -0
  206. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/heartbeat_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2.py +0 -0
  209. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2.pyi +0 -0
  210. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2.py +0 -0
  213. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2.pyi +0 -0
  214. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2.py +0 -0
  217. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2.pyi +0 -0
  218. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2.py +0 -0
  221. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  222. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2.py +0 -0
  225. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2.pyi +0 -0
  226. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2_grpc.py +0 -0
  227. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  228. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2.py +0 -0
  229. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  230. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  231. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  232. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2.py +0 -0
  233. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  234. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  235. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  236. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2.py +0 -0
  237. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2.pyi +0 -0
  238. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  239. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  240. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/py.typed +0 -0
  241. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/__init__.py +0 -0
  242. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/app.py +0 -0
  243. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/client_manager.py +0 -0
  244. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/client_proxy.py +0 -0
  245. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/__init__.py +0 -0
  246. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/app.py +0 -0
  247. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/app_utils.py +0 -0
  248. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  249. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/compat/legacy_context.py +0 -0
  250. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/criterion.py +0 -0
  251. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  252. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/__init__.py +0 -0
  253. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/grid.py +0 -0
  254. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/grpc_grid.py +0 -0
  255. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/grid/inmemory_grid.py +0 -0
  256. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/history.py +0 -0
  257. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/run_serverapp.py +0 -0
  258. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server.py +0 -0
  259. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server_app.py +0 -0
  260. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/server_config.py +0 -0
  261. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp/__init__.py +0 -0
  262. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp/app.py +0 -0
  263. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/serverapp_components.py +0 -0
  264. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/__init__.py +0 -0
  265. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/aggregate.py +0 -0
  266. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/bulyan.py +0 -0
  267. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  268. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  269. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  270. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  271. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  272. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedadagrad.py +0 -0
  273. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedadam.py +0 -0
  274. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavg.py +0 -0
  275. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavg_android.py +0 -0
  276. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedavgm.py +0 -0
  277. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedmedian.py +0 -0
  278. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedopt.py +0 -0
  279. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedprox.py +0 -0
  280. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  281. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  282. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  283. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  284. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/fedyogi.py +0 -0
  285. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/krum.py +0 -0
  286. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/qfedavg.py +0 -0
  287. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/strategy/strategy.py +0 -0
  288. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/__init__.py +0 -0
  289. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/__init__.py +0 -0
  290. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  291. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  292. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  293. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  294. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  295. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  296. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  297. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  298. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  299. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  300. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  301. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  302. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  303. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  304. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  305. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  306. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  307. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  308. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  309. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  310. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  311. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  312. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  313. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  314. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/linkstate/utils.py +0 -0
  315. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  316. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  317. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  318. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/__init__.py +0 -0
  319. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  320. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  321. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/superlink/utils.py +0 -0
  322. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/typing.py +0 -0
  323. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/__init__.py +0 -0
  324. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/tensorboard.py +0 -0
  325. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/utils/validator.py +0 -0
  326. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/__init__.py +0 -0
  327. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/constant.py +0 -0
  328. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/default_workflows.py +0 -0
  329. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  330. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  331. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  332. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/serverapp/__init__.py +0 -0
  333. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/__init__.py +0 -0
  334. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/app.py +0 -0
  335. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/legacy_app.py +0 -0
  336. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/__init__.py +0 -0
  337. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  338. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  339. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/ray_transport/utils.py +0 -0
  340. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/run_simulation.py +0 -0
  341. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/simulation/simulationio_connection.py +0 -0
  342. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/__init__.py +0 -0
  343. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/__init__.py +0 -0
  344. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/disk_ffs.py +0 -0
  345. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/ffs.py +0 -0
  346. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/ffs/ffs_factory.py +0 -0
  347. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/__init__.py +0 -0
  348. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/in_memory_object_store.py +0 -0
  349. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/object_store.py +0 -0
  350. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supercore/object_store/object_store_factory.py +0 -0
  351. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/__init__.py +0 -0
  352. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/app.py +0 -0
  353. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/deployment.py +0 -0
  354. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
  355. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_grpc.py +0 -0
  356. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  357. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/executor.py +0 -0
  358. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superexec/simulation.py +0 -0
  359. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/superlink/__init__.py +0 -0
  360. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/__init__.py +0 -0
  361. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/cli/__init__.py +0 -0
  362. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/__init__.py +0 -0
  363. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/in_memory_nodestate.py +0 -0
  364. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/nodestate.py +0 -0
  365. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/nodestate/nodestate_factory.py +0 -0
  366. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/runtime/__init__.py +0 -0
  367. {flwr_nightly-1.20.0.dev20250618 → flwr_nightly-1.20.0.dev20250619}/py/flwr/supernode/servicer/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.20.0.dev20250618
3
+ Version: 1.20.0.dev20250619
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
@@ -25,7 +25,12 @@ import pathspec
25
25
  import tomli_w
26
26
  import typer
27
27
 
28
- from flwr.common.constant import FAB_ALLOWED_EXTENSIONS, FAB_DATE, FAB_HASH_TRUNCATION
28
+ from flwr.common.constant import (
29
+ FAB_ALLOWED_EXTENSIONS,
30
+ FAB_DATE,
31
+ FAB_HASH_TRUNCATION,
32
+ FAB_MAX_SIZE,
33
+ )
29
34
 
30
35
  from .config_utils import load as load_toml
31
36
  from .config_utils import load_and_validate
@@ -57,7 +62,7 @@ def build(
57
62
  Optional[Path],
58
63
  typer.Option(help="Path of the Flower App to bundle into a FAB"),
59
64
  ] = None,
60
- ) -> tuple[str, str]:
65
+ ) -> None:
61
66
  """Build a Flower App into a Flower App Bundle (FAB).
62
67
 
63
68
  You can run ``flwr build`` without any arguments to bundle the app located in the
@@ -119,8 +124,6 @@ def build(
119
124
  f"🎊 Successfully built {fab_filename}", fg=typer.colors.GREEN, bold=True
120
125
  )
121
126
 
122
- return fab_filename, fab_hash
123
-
124
127
 
125
128
  def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
126
129
  """Build a FAB in memory and return the bytes, hash, and config.
@@ -193,6 +196,13 @@ def build_fab(app: Path) -> tuple[bytes, str, dict[str, Any]]:
193
196
  write_to_zip(fab_file, ".info/CONTENT", list_file_content)
194
197
 
195
198
  fab_bytes = fab_buffer.getvalue()
199
+ if len(fab_bytes) > FAB_MAX_SIZE:
200
+ raise ValueError(
201
+ f"FAB size exceeds maximum allowed size of {FAB_MAX_SIZE:,} bytes."
202
+ "To reduce the package size, consider ignoring unnecessary files "
203
+ "via your `.gitignore` file or excluding them from the build."
204
+ )
205
+
196
206
  fab_hash = hashlib.sha256(fab_bytes).hexdigest()
197
207
 
198
208
  return fab_bytes, fab_hash, config
@@ -17,7 +17,6 @@
17
17
 
18
18
  from collections.abc import Iterator, Sequence
19
19
  from contextlib import contextmanager
20
- from copy import copy
21
20
  from logging import DEBUG, ERROR
22
21
  from pathlib import Path
23
22
  from typing import Callable, Optional, Union, cast
@@ -25,8 +24,6 @@ from typing import Callable, Optional, Union, cast
25
24
  import grpc
26
25
  from cryptography.hazmat.primitives.asymmetric import ec
27
26
 
28
- from flwr.app.metadata import Metadata
29
- from flwr.client.message_handler.message_handler import validate_out_message
30
27
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
31
28
  from flwr.common.constant import HEARTBEAT_CALL_TIMEOUT, HEARTBEAT_DEFAULT_INTERVAL
32
29
  from flwr.common.grpc import create_channel, on_channel_state_change
@@ -163,7 +160,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
163
160
  if adapter_cls is None:
164
161
  adapter_cls = FleetStub
165
162
  stub = adapter_cls(channel)
166
- metadata: Optional[Metadata] = None
167
163
  node: Optional[Node] = None
168
164
 
169
165
  def _should_giveup_fn(e: Exception) -> bool:
@@ -300,10 +296,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
300
296
  # Inject
301
297
  in_message.metadata.__dict__["_message_id"] = msg_id
302
298
 
303
- # Remember `metadata` of the in message
304
- nonlocal metadata
305
- metadata = copy(in_message.metadata) if in_message else None
306
-
307
299
  # Return the message if available
308
300
  return in_message
309
301
 
@@ -314,19 +306,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
314
306
  log(ERROR, "Node instance missing")
315
307
  return
316
308
 
317
- # Get the metadata of the incoming message
318
- nonlocal metadata
319
- if metadata is None:
320
- log(ERROR, "No current message")
321
- return
322
-
323
- # Set message_id
324
- message.metadata.__dict__["_message_id"] = message.object_id
325
- # Validate out message
326
- if not validate_out_message(message, metadata):
327
- log(ERROR, "Invalid out message")
328
- return
329
-
330
309
  with no_object_id_recompute():
331
310
  # Get all nested objects
332
311
  all_objects = get_all_nested_objects(message)
@@ -358,9 +337,6 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
358
337
  )
359
338
  log(DEBUG, "Pushed %s objects to servicer.", len(objs_to_push))
360
339
 
361
- # Cleanup
362
- metadata = None
363
-
364
340
  def get_run(run_id: int) -> Run:
365
341
  # Call FleetAPI
366
342
  get_run_request = GetRunRequest(node=node, run_id=run_id)
@@ -16,7 +16,6 @@
16
16
 
17
17
  from collections.abc import Iterator
18
18
  from contextlib import contextmanager
19
- from copy import copy
20
19
  from logging import DEBUG, ERROR, INFO, WARN
21
20
  from typing import Callable, Optional, TypeVar, Union, cast
22
21
 
@@ -24,8 +23,6 @@ from cryptography.hazmat.primitives.asymmetric import ec
24
23
  from google.protobuf.message import Message as GrpcMessage
25
24
  from requests.exceptions import ConnectionError as RequestsConnectionError
26
25
 
27
- from flwr.app.metadata import Metadata
28
- from flwr.client.message_handler.message_handler import validate_out_message
29
26
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
30
27
  from flwr.common.constant import HEARTBEAT_DEFAULT_INTERVAL
31
28
  from flwr.common.exit import ExitCode, flwr_exit
@@ -178,7 +175,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
178
175
  log(ERROR, "Client authentication is not supported for this transport type.")
179
176
 
180
177
  # Shared variables for inner functions
181
- metadata: Optional[Metadata] = None
182
178
  node: Optional[Node] = None
183
179
 
184
180
  ###########################################################################
@@ -367,10 +363,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
367
363
  # Inject
368
364
  in_message.metadata.__dict__["_message_id"] = msg_id
369
365
 
370
- # Remember `metadata` of the in message
371
- nonlocal metadata
372
- metadata = copy(in_message.metadata) if in_message else None
373
-
374
366
  return in_message
375
367
 
376
368
  def send(message: Message) -> None:
@@ -380,19 +372,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
380
372
  log(ERROR, "Node instance missing")
381
373
  return
382
374
 
383
- # Get incoming message
384
- nonlocal metadata
385
- if metadata is None:
386
- log(ERROR, "No current message")
387
- return
388
-
389
- # Set message_id
390
- message.metadata.__dict__["_message_id"] = message.object_id
391
- # Validate out message
392
- if not validate_out_message(message, metadata):
393
- log(ERROR, "Invalid out message")
394
- return
395
-
396
375
  with no_object_id_recompute():
397
376
  # Get all nested objects
398
377
  all_objects = get_all_nested_objects(message)
@@ -450,9 +429,6 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
450
429
  )
451
430
  log(ERROR, str(e))
452
431
 
453
- # Cleanup
454
- metadata = None
455
-
456
432
  def get_run(run_id: int) -> Run:
457
433
  # Construct the request
458
434
  req = GetRunRequest(node=node, run_id=run_id)
@@ -74,6 +74,7 @@ FAB_ALLOWED_EXTENSIONS = {".py", ".toml", ".md"}
74
74
  FAB_CONFIG_FILE = "pyproject.toml"
75
75
  FAB_DATE = (2024, 10, 1, 0, 0, 0)
76
76
  FAB_HASH_TRUNCATION = 8
77
+ FAB_MAX_SIZE = 10 * 1024 * 1024 # 10 MB
77
78
  FLWR_DIR = ".flwr" # The default Flower directory: ~/.flwr/
78
79
  FLWR_HOME = "FLWR_HOME" # If set, override the default Flower directory
79
80
 
@@ -0,0 +1,49 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/clientappio.proto
4
+ # Protobuf Python Version: 4.25.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
17
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
18
+
19
+
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/clientappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x18\x66lwr/proto/message.proto\"%\n#GetRunIdsWithPendingMessagesRequest\"7\n$GetRunIdsWithPendingMessagesResponse\x12\x0f\n\x07run_ids\x18\x01 \x03(\x04\"%\n\x13RequestTokenRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"%\n\x14RequestTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\"W\n\x15\x43lientAppOutputStatus\x12-\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x1f.flwr.proto.ClientAppOutputCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"+\n\x1aPullClientAppInputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\"\xa5\x01\n\x1bPullClientAppInputsResponse\x12$\n\x07message\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x04 \x01(\x0b\x32\x0f.flwr.proto.Fab\"x\n\x1bPushClientAppOutputsRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12$\n\x07message\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Message\x12$\n\x07\x63ontext\x18\x03 \x01(\x0b\x32\x13.flwr.proto.Context\"Q\n\x1cPushClientAppOutputsResponse\x12\x31\n\x06status\x18\x01 \x01(\x0b\x32!.flwr.proto.ClientAppOutputStatus*L\n\x13\x43lientAppOutputCode\x12\x0b\n\x07SUCCESS\x10\x00\x12\x15\n\x11\x44\x45\x41\x44LINE_EXCEEDED\x10\x01\x12\x11\n\rUNKNOWN_ERROR\x10\x02\x32\xbf\x03\n\x0b\x43lientAppIo\x12\x83\x01\n\x1cGetRunIdsWithPendingMessages\x12/.flwr.proto.GetRunIdsWithPendingMessagesRequest\x1a\x30.flwr.proto.GetRunIdsWithPendingMessagesResponse\"\x00\x12S\n\x0cRequestToken\x12\x1f.flwr.proto.RequestTokenRequest\x1a .flwr.proto.RequestTokenResponse\"\x00\x12h\n\x13PullClientAppInputs\x12&.flwr.proto.PullClientAppInputsRequest\x1a\'.flwr.proto.PullClientAppInputsResponse\"\x00\x12k\n\x14PushClientAppOutputs\x12\'.flwr.proto.PushClientAppOutputsRequest\x1a(.flwr.proto.PushClientAppOutputsResponse\"\x00\x62\x06proto3')
21
+
22
+ _globals = globals()
23
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
24
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.clientappio_pb2', _globals)
25
+ if _descriptor._USE_C_DESCRIPTORS == False:
26
+ DESCRIPTOR._options = None
27
+ _globals['_CLIENTAPPOUTPUTCODE']._serialized_start=795
28
+ _globals['_CLIENTAPPOUTPUTCODE']._serialized_end=871
29
+ _globals['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_start=114
30
+ _globals['_GETRUNIDSWITHPENDINGMESSAGESREQUEST']._serialized_end=151
31
+ _globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_start=153
32
+ _globals['_GETRUNIDSWITHPENDINGMESSAGESRESPONSE']._serialized_end=208
33
+ _globals['_REQUESTTOKENREQUEST']._serialized_start=210
34
+ _globals['_REQUESTTOKENREQUEST']._serialized_end=247
35
+ _globals['_REQUESTTOKENRESPONSE']._serialized_start=249
36
+ _globals['_REQUESTTOKENRESPONSE']._serialized_end=286
37
+ _globals['_CLIENTAPPOUTPUTSTATUS']._serialized_start=288
38
+ _globals['_CLIENTAPPOUTPUTSTATUS']._serialized_end=375
39
+ _globals['_PULLCLIENTAPPINPUTSREQUEST']._serialized_start=377
40
+ _globals['_PULLCLIENTAPPINPUTSREQUEST']._serialized_end=420
41
+ _globals['_PULLCLIENTAPPINPUTSRESPONSE']._serialized_start=423
42
+ _globals['_PULLCLIENTAPPINPUTSRESPONSE']._serialized_end=588
43
+ _globals['_PUSHCLIENTAPPOUTPUTSREQUEST']._serialized_start=590
44
+ _globals['_PUSHCLIENTAPPOUTPUTSREQUEST']._serialized_end=710
45
+ _globals['_PUSHCLIENTAPPOUTPUTSRESPONSE']._serialized_start=712
46
+ _globals['_PUSHCLIENTAPPOUTPUTSRESPONSE']._serialized_end=793
47
+ _globals['_CLIENTAPPIO']._serialized_start=874
48
+ _globals['_CLIENTAPPIO']._serialized_end=1321
49
+ # @@protoc_insertion_point(module_scope)
@@ -88,23 +88,6 @@ class ClientAppOutputStatus(google.protobuf.message.Message):
88
88
  def ClearField(self, field_name: typing_extensions.Literal["code",b"code","message",b"message"]) -> None: ...
89
89
  global___ClientAppOutputStatus = ClientAppOutputStatus
90
90
 
91
- class GetTokenRequest(google.protobuf.message.Message):
92
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
93
- def __init__(self,
94
- ) -> None: ...
95
- global___GetTokenRequest = GetTokenRequest
96
-
97
- class GetTokenResponse(google.protobuf.message.Message):
98
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
99
- TOKEN_FIELD_NUMBER: builtins.int
100
- token: builtins.int
101
- def __init__(self,
102
- *,
103
- token: builtins.int = ...,
104
- ) -> None: ...
105
- def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
106
- global___GetTokenResponse = GetTokenResponse
107
-
108
91
  class PullClientAppInputsRequest(google.protobuf.message.Message):
109
92
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
110
93
  TOKEN_FIELD_NUMBER: builtins.int
@@ -24,11 +24,6 @@ class ClientAppIoStub(object):
24
24
  request_serializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.SerializeToString,
25
25
  response_deserializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.FromString,
26
26
  )
27
- self.GetToken = channel.unary_unary(
28
- '/flwr.proto.ClientAppIo/GetToken',
29
- request_serializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.SerializeToString,
30
- response_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.FromString,
31
- )
32
27
  self.PullClientAppInputs = channel.unary_unary(
33
28
  '/flwr.proto.ClientAppIo/PullClientAppInputs',
34
29
  request_serializer=flwr_dot_proto_dot_clientappio__pb2.PullClientAppInputsRequest.SerializeToString,
@@ -58,13 +53,6 @@ class ClientAppIoServicer(object):
58
53
  context.set_details('Method not implemented!')
59
54
  raise NotImplementedError('Method not implemented!')
60
55
 
61
- def GetToken(self, request, context):
62
- """Get token
63
- """
64
- context.set_code(grpc.StatusCode.UNIMPLEMENTED)
65
- context.set_details('Method not implemented!')
66
- raise NotImplementedError('Method not implemented!')
67
-
68
56
  def PullClientAppInputs(self, request, context):
69
57
  """Pull client app inputs
70
58
  """
@@ -92,11 +80,6 @@ def add_ClientAppIoServicer_to_server(servicer, server):
92
80
  request_deserializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenRequest.FromString,
93
81
  response_serializer=flwr_dot_proto_dot_clientappio__pb2.RequestTokenResponse.SerializeToString,
94
82
  ),
95
- 'GetToken': grpc.unary_unary_rpc_method_handler(
96
- servicer.GetToken,
97
- request_deserializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.FromString,
98
- response_serializer=flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.SerializeToString,
99
- ),
100
83
  'PullClientAppInputs': grpc.unary_unary_rpc_method_handler(
101
84
  servicer.PullClientAppInputs,
102
85
  request_deserializer=flwr_dot_proto_dot_clientappio__pb2.PullClientAppInputsRequest.FromString,
@@ -151,23 +134,6 @@ class ClientAppIo(object):
151
134
  options, channel_credentials,
152
135
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
153
136
 
154
- @staticmethod
155
- def GetToken(request,
156
- target,
157
- options=(),
158
- channel_credentials=None,
159
- call_credentials=None,
160
- insecure=False,
161
- compression=None,
162
- wait_for_ready=None,
163
- timeout=None,
164
- metadata=None):
165
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.ClientAppIo/GetToken',
166
- flwr_dot_proto_dot_clientappio__pb2.GetTokenRequest.SerializeToString,
167
- flwr_dot_proto_dot_clientappio__pb2.GetTokenResponse.FromString,
168
- options, channel_credentials,
169
- insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
170
-
171
137
  @staticmethod
172
138
  def PullClientAppInputs(request,
173
139
  target,
@@ -18,11 +18,6 @@ class ClientAppIoStub:
18
18
  flwr.proto.clientappio_pb2.RequestTokenResponse]
19
19
  """Request token"""
20
20
 
21
- GetToken: grpc.UnaryUnaryMultiCallable[
22
- flwr.proto.clientappio_pb2.GetTokenRequest,
23
- flwr.proto.clientappio_pb2.GetTokenResponse]
24
- """Get token"""
25
-
26
21
  PullClientAppInputs: grpc.UnaryUnaryMultiCallable[
27
22
  flwr.proto.clientappio_pb2.PullClientAppInputsRequest,
28
23
  flwr.proto.clientappio_pb2.PullClientAppInputsResponse]
@@ -51,14 +46,6 @@ class ClientAppIoServicer(metaclass=abc.ABCMeta):
51
46
  """Request token"""
52
47
  pass
53
48
 
54
- @abc.abstractmethod
55
- def GetToken(self,
56
- request: flwr.proto.clientappio_pb2.GetTokenRequest,
57
- context: grpc.ServicerContext,
58
- ) -> flwr.proto.clientappio_pb2.GetTokenResponse:
59
- """Get token"""
60
- pass
61
-
62
49
  @abc.abstractmethod
63
50
  def PullClientAppInputs(self,
64
51
  request: flwr.proto.clientappio_pb2.PullClientAppInputsRequest,
@@ -0,0 +1,32 @@
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 the infrastructure."""
16
+
17
+
18
+ def mask_string(value: str, head: int = 4, tail: int = 4) -> str:
19
+ """Mask a string by preserving only the head and tail characters.
20
+
21
+ Mask a string for safe display by preserving the head and tail characters,
22
+ and replacing the middle with '...'. Useful for logging tokens, secrets,
23
+ or IDs without exposing sensitive data.
24
+
25
+ Notes
26
+ -----
27
+ If the string is shorter than the combined length of `head` and `tail`,
28
+ the original string is returned unchanged.
29
+ """
30
+ if len(value) <= head + tail:
31
+ return value
32
+ return f"{value[:head]}...{value[-tail:]}"
@@ -25,6 +25,7 @@ import grpc
25
25
  from flwr.common import now
26
26
  from flwr.common.auth_plugin import ExecAuthPlugin
27
27
  from flwr.common.constant import (
28
+ FAB_MAX_SIZE,
28
29
  LOG_STREAM_INTERVAL,
29
30
  RUN_ID_NOT_FOUND_MESSAGE,
30
31
  Status,
@@ -84,6 +85,14 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
84
85
  """Create run ID."""
85
86
  log(INFO, "ExecServicer.StartRun")
86
87
 
88
+ if len(request.fab.content) > FAB_MAX_SIZE:
89
+ log(
90
+ ERROR,
91
+ "FAB size exceeds maximum allowed size of %d bytes.",
92
+ FAB_MAX_SIZE,
93
+ )
94
+ return StartRunResponse()
95
+
87
96
  flwr_aid = shared_account_info.get().flwr_aid if self.auth_plugin else None
88
97
  run_id = self.executor.start_run(
89
98
  request.fab.content,
@@ -40,7 +40,6 @@ from flwr.common.constant import (
40
40
  TRANSPORT_TYPE_REST,
41
41
  )
42
42
  from flwr.common.exit import ExitCode, flwr_exit
43
- from flwr.common.exit_handlers import register_exit_handlers
44
43
  from flwr.common.logger import log
45
44
  from flwr.supernode.start_client_internal import start_client_internal
46
45
 
@@ -66,12 +65,6 @@ def flower_supernode() -> None:
66
65
 
67
66
  log(DEBUG, "Isolation mode: %s", args.isolation)
68
67
 
69
- # Register handlers for graceful shutdown
70
- register_exit_handlers(
71
- event_type=EventType.RUN_SUPERNODE_LEAVE,
72
- exit_message="SuperNode terminated gracefully.",
73
- )
74
-
75
68
  start_client_internal(
76
69
  server_address=args.superlink,
77
70
  transport=args.transport,
@@ -22,6 +22,7 @@ from flwr.common.args import add_args_flwr_app_common
22
22
  from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS
23
23
  from flwr.common.exit import ExitCode, flwr_exit
24
24
  from flwr.common.logger import log
25
+ from flwr.supercore.utils import mask_string
25
26
  from flwr.supernode.runtime.run_clientapp import run_clientapp
26
27
 
27
28
 
@@ -40,7 +41,7 @@ def flwr_clientapp() -> None:
40
41
  "`flwr-clientapp` will attempt to connect to SuperNode's "
41
42
  "ClientAppIo API at %s with token %s",
42
43
  args.clientappio_api_address,
43
- args.token,
44
+ mask_string(args.token) if args.token else "None",
44
45
  )
45
46
  run_clientapp(
46
47
  clientappio_api_address=args.clientappio_api_address,
@@ -56,6 +56,7 @@ from flwr.proto.clientappio_pb2 import (
56
56
  RequestTokenResponse,
57
57
  )
58
58
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
59
+ from flwr.supercore.utils import mask_string
59
60
 
60
61
 
61
62
  def run_clientapp( # pylint: disable=R0913, R0914, R0917
@@ -195,7 +196,8 @@ def pull_clientappinputs(
195
196
  stub: ClientAppIoStub, token: str
196
197
  ) -> tuple[Message, Context, Run, Optional[Fab]]:
197
198
  """Pull ClientAppInputs from SuperNode."""
198
- log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", token)
199
+ masked_token = mask_string(token)
200
+ log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", masked_token)
199
201
  try:
200
202
  res: PullClientAppInputsResponse = stub.PullClientAppInputs(
201
203
  PullClientAppInputsRequest(token=token)
@@ -214,7 +216,10 @@ def push_clientappoutputs(
214
216
  stub: ClientAppIoStub, token: str, message: Message, context: Context
215
217
  ) -> PushClientAppOutputsResponse:
216
218
  """Push ClientAppOutputs to SuperNode."""
217
- log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", token)
219
+ masked_token = mask_string(token)
220
+ log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", masked_token)
221
+ # Set message ID
222
+ message.metadata.__dict__["_message_id"] = message.object_id
218
223
  proto_message = message_to_proto(message)
219
224
  proto_context = context_to_proto(context)
220
225
 
@@ -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
+ """ClientAppIo API Servicer."""
16
+
17
+
18
+ from .clientappio_servicer import ClientAppIoServicer
19
+
20
+ __all__ = [
21
+ "ClientAppIoServicer",
22
+ ]
@@ -15,16 +15,14 @@
15
15
  """ClientAppIo API servicer."""
16
16
 
17
17
 
18
- from dataclasses import dataclass
19
- from logging import DEBUG, ERROR
20
- from typing import Optional, cast
18
+ from logging import DEBUG
19
+ from typing import cast
21
20
 
22
21
  import grpc
23
22
 
24
- from flwr.common import Context, Message, typing
23
+ from flwr.common import Context
25
24
  from flwr.common.logger import log
26
25
  from flwr.common.serde import (
27
- clientappstatus_to_proto,
28
26
  context_from_proto,
29
27
  context_to_proto,
30
28
  fab_to_proto,
@@ -39,8 +37,6 @@ from flwr.proto import clientappio_pb2_grpc
39
37
  from flwr.proto.clientappio_pb2 import ( # pylint: disable=E0401
40
38
  GetRunIdsWithPendingMessagesRequest,
41
39
  GetRunIdsWithPendingMessagesResponse,
42
- GetTokenRequest,
43
- GetTokenResponse,
44
40
  PullClientAppInputsRequest,
45
41
  PullClientAppInputsResponse,
46
42
  PushClientAppOutputsRequest,
@@ -53,24 +49,6 @@ from flwr.supercore.object_store import ObjectStoreFactory
53
49
  from flwr.supernode.nodestate import NodeStateFactory
54
50
 
55
51
 
56
- @dataclass
57
- class ClientAppInputs:
58
- """Specify the inputs to the ClientApp."""
59
-
60
- message: Message
61
- context: Context
62
- run: Run
63
- fab: Optional[Fab]
64
-
65
-
66
- @dataclass
67
- class ClientAppOutputs:
68
- """Specify the outputs from the ClientApp."""
69
-
70
- message: Message
71
- context: Context
72
-
73
-
74
52
  # pylint: disable=C0103,W0613,W0201
75
53
  class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
76
54
  """ClientAppIo API servicer."""
@@ -85,10 +63,6 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
85
63
  self.ffs_factory = ffs_factory
86
64
  self.objectstore_factory = objectstore_factory
87
65
 
88
- self.clientapp_input: Optional[ClientAppInputs] = None
89
- self.clientapp_output: Optional[ClientAppOutputs] = None
90
- self.token_returned: bool = False
91
-
92
66
  def GetRunIdsWithPendingMessages(
93
67
  self,
94
68
  request: GetRunIdsWithPendingMessagesRequest,
@@ -126,33 +100,6 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
126
100
  # Return the token
127
101
  return RequestTokenResponse(token=token)
128
102
 
129
- def GetToken(
130
- self, request: GetTokenRequest, context: grpc.ServicerContext
131
- ) -> GetTokenResponse:
132
- """Get token."""
133
- log(DEBUG, "ClientAppIo.GetToken")
134
-
135
- # Fail if no ClientAppInputs are available
136
- if self.clientapp_input is None:
137
- context.abort(
138
- grpc.StatusCode.FAILED_PRECONDITION,
139
- "No inputs available.",
140
- )
141
-
142
- # Fail if token was already returned in a previous call
143
- if self.token_returned:
144
- context.abort(
145
- grpc.StatusCode.FAILED_PRECONDITION,
146
- "Token already returned. A token can be returned only once.",
147
- )
148
-
149
- # If
150
- # - ClientAppInputs is set, and
151
- # - token hasn't been returned before,
152
- # return token
153
- self.token_returned = True
154
- return GetTokenResponse(token=123) # To be deleted
155
-
156
103
  def PullClientAppInputs(
157
104
  self, request: PullClientAppInputsRequest, context: grpc.ServicerContext
158
105
  ) -> PullClientAppInputsResponse:
@@ -203,40 +150,12 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
203
150
  )
204
151
  raise RuntimeError("This line should never be reached.")
205
152
 
206
- # Delete the token
207
- state.delete_token(run_id)
208
-
209
- # Preconditions met
210
- try:
211
- # Update Message and Context
212
- self.clientapp_output = ClientAppOutputs(
213
- message=message_from_proto(request.message),
214
- context=context_from_proto(request.context),
215
- )
216
-
217
- # Set status
218
- code = typing.ClientAppOutputCode.SUCCESS
219
- status = typing.ClientAppOutputStatus(code=code, message="Success")
220
- except Exception as e: # pylint: disable=broad-exception-caught
221
- log(ERROR, "ClientApp failed to push message to SuperNode, %s", e)
222
- code = typing.ClientAppOutputCode.UNKNOWN_ERROR
223
- status = typing.ClientAppOutputStatus(code=code, message="Unkonwn error")
224
-
225
- # Return status to ClientApp process
226
- proto_status = clientappstatus_to_proto(status=status)
227
- return PushClientAppOutputsResponse(status=proto_status)
153
+ # Save the message and context to the state
154
+ state.store_message(message_from_proto(request.message))
155
+ state.store_context(context_from_proto(request.context))
228
156
 
229
- def has_outputs(self) -> bool:
230
- """Check if ClientAppOutputs are available."""
231
- return self.clientapp_output is not None
232
-
233
- def get_outputs(self) -> ClientAppOutputs:
234
- """Get ClientApp outputs."""
235
- if self.clientapp_output is None:
236
- raise ValueError("ClientAppOutputs not set before calling `get_outputs`.")
237
-
238
- # Set outputs to a local variable and clear state
239
- output: ClientAppOutputs = self.clientapp_output
240
- self.clientapp_output = None
157
+ # Remove the token to make the run eligible for processing
158
+ # A run associated with a token cannot be handled until its token is cleared
159
+ state.delete_token(run_id)
241
160
 
242
- return output
161
+ return PushClientAppOutputsResponse()