flwr-nightly 1.26.0.dev20260129__py3-none-any.whl → 1.26.0.dev20260130__py3-none-any.whl

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.
flwr/cli/build.py CHANGED
@@ -106,7 +106,7 @@ def build(
106
106
  if app is None:
107
107
  app = Path.cwd()
108
108
 
109
- app = app.resolve()
109
+ app = app.expanduser().resolve()
110
110
  if not app.is_dir():
111
111
  raise click.ClickException(
112
112
  f"The path {app} is not a valid path to a Flower app."
@@ -125,7 +125,7 @@ def _migrate_pyproject_toml_to_flower_config(
125
125
  if cert_path := toml_fed_config.get("root-certificates"):
126
126
  if not Path(cert_path).is_absolute():
127
127
  toml_fed_config["root-certificates"] = str(
128
- (app / cert_path).resolve()
128
+ (app / cert_path).expanduser().resolve()
129
129
  )
130
130
  # Parse and write SuperLink connection
131
131
  conn = parse_superlink_connection(toml_fed_config, name)
@@ -223,7 +223,7 @@ def migrate(
223
223
  # Determine app path for migration
224
224
  arg1 = positional_arg_1
225
225
  app = Path(arg1) if arg1 else Path(".")
226
- app = app.resolve()
226
+ app = app.expanduser().resolve()
227
227
 
228
228
  # Check if migration is applicable and if legacy usage is detected
229
229
  is_migratable, reason = _is_migratable(app)
flwr/cli/install.py CHANGED
@@ -63,7 +63,7 @@ def install(
63
63
  if source is None:
64
64
  source = Path(typer.prompt("Enter the source FAB file"))
65
65
 
66
- source = source.resolve()
66
+ source = source.expanduser().resolve()
67
67
  if not source.exists() or not source.is_file():
68
68
  raise click.ClickException(
69
69
  f"The source {source} does not exist or is not a file."
flwr/cli/run/run.py CHANGED
@@ -125,11 +125,11 @@ def run(
125
125
 
126
126
  # Validate TOML configuration for local app
127
127
  else:
128
+ app = app.expanduser().resolve() # Resolve path to absolute
128
129
  config, warnings = load_and_validate(app / FAB_CONFIG_FILE)
129
130
  if warnings:
130
131
  typer.secho(
131
- "Missing recommended fields in Flower App configuration "
132
- "(pyproject.toml):\n"
132
+ f"Flower App configuration warnings in '{app / FAB_CONFIG_FILE}':\n"
133
133
  + "\n".join([f"- {line}" for line in warnings]),
134
134
  fg=typer.colors.YELLOW,
135
135
  bold=True,
@@ -66,8 +66,7 @@ def register( # pylint: disable=R0914
66
66
  ) -> None:
67
67
  """Add a SuperNode to the federation."""
68
68
  # Load public key
69
- public_key_path = Path(public_key)
70
- public_key_bytes = try_load_public_key(public_key_path)
69
+ public_key_bytes = try_load_public_key(public_key.expanduser())
71
70
 
72
71
  with cli_output_handler(output_format=output_format) as is_json:
73
72
  # Migrate legacy usage if any
@@ -136,7 +136,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
136
136
  confirm_message_received : Callable[[str], None]
137
137
  """
138
138
  if isinstance(root_certificates, str):
139
- root_certificates = Path(root_certificates).read_bytes()
139
+ root_certificates = Path(root_certificates).expanduser().read_bytes()
140
140
 
141
141
  # Automatic node auth: generate keys if user didn't provide any
142
142
  self_registered = False
flwr/common/args.py CHANGED
@@ -95,7 +95,7 @@ def try_obtain_root_certificates(
95
95
  log(ERROR, "Path argument `--root-certificates` does not point to a file.")
96
96
  sys.exit(1)
97
97
  else:
98
- root_certificates = Path(root_cert_path).read_bytes()
98
+ root_certificates = Path(root_cert_path).expanduser().read_bytes()
99
99
  log(
100
100
  DEBUG,
101
101
  "Starting secure HTTPS channel to %s "
@@ -129,9 +129,9 @@ def try_obtain_server_certificates(
129
129
  if not isfile(args.ssl_keyfile):
130
130
  sys.exit("Path argument `--ssl-keyfile` does not point to a file.")
131
131
  certificates = (
132
- Path(args.ssl_ca_certfile).read_bytes(), # CA certificate
133
- Path(args.ssl_certfile).read_bytes(), # server certificate
134
- Path(args.ssl_keyfile).read_bytes(), # server private key
132
+ Path(args.ssl_ca_certfile).expanduser().read_bytes(), # CA certificate
133
+ Path(args.ssl_certfile).expanduser().read_bytes(), # server certificate
134
+ Path(args.ssl_keyfile).expanduser().read_bytes(), # server private key
135
135
  )
136
136
  return certificates
137
137
  if args.ssl_certfile or args.ssl_keyfile or args.ssl_ca_certfile:
flwr/common/config.py CHANGED
@@ -42,7 +42,7 @@ T_dict = TypeVar("T_dict", bound=dict[str, Any]) # pylint: disable=invalid-name
42
42
 
43
43
  def get_flwr_dir(provided_path: str | None = None) -> Path:
44
44
  """Return the Flower home directory based on env variables."""
45
- if provided_path is None or not Path(provided_path).is_dir():
45
+ if provided_path is None or not Path(provided_path).expanduser().is_dir():
46
46
  return Path(
47
47
  os.getenv(
48
48
  FLWR_HOME,
@@ -213,7 +213,7 @@ def parse_config_args(config: list[str] | None, flatten: bool = True) -> dict[st
213
213
 
214
214
  # Handle if .toml file is passed
215
215
  if len(config) == 1 and config[0].endswith(".toml"):
216
- with Path(config[0]).open("rb") as config_file:
216
+ with Path(config[0]).expanduser().open("rb") as config_file:
217
217
  overrides = flatten_dict(tomli.load(config_file))
218
218
  return overrides
219
219
 
flwr/common/exit/exit.py CHANGED
@@ -87,9 +87,6 @@ def flwr_exit(
87
87
  # Log the exit message
88
88
  log(log_level, exit_message)
89
89
 
90
- # Trigger exit handlers
91
- trigger_exit_handlers()
92
-
93
90
  # Start a daemon thread to force exit if graceful exit fails
94
91
  def force_exit() -> None:
95
92
  time.sleep(FORCE_EXIT_TIMEOUT_SECONDS)
@@ -97,6 +94,9 @@ def flwr_exit(
97
94
 
98
95
  threading.Thread(target=force_exit, daemon=True).start()
99
96
 
97
+ # Trigger exit handlers
98
+ trigger_exit_handlers()
99
+
100
100
  # Exit
101
101
  sys.exit(sys_exit_code)
102
102
 
flwr/common/logger.py CHANGED
@@ -385,7 +385,7 @@ def start_log_uploader(
385
385
  ) -> threading.Thread:
386
386
  """Start the log uploader thread and return it."""
387
387
  thread = threading.Thread(
388
- target=_log_uploader, args=(log_queue, node_id, run_id, stub)
388
+ target=_log_uploader, args=(log_queue, node_id, run_id, stub), daemon=True
389
389
  )
390
390
  thread.start()
391
391
  return thread
flwr/server/app.py CHANGED
@@ -485,7 +485,7 @@ def _load_control_auth_plugins(
485
485
  }
486
486
  # Load YAML file
487
487
  else:
488
- with Path(config_path).open("r", encoding="utf-8") as file:
488
+ with Path(config_path).expanduser().open("r", encoding="utf-8") as file:
489
489
  config = yaml.safe_load(file)
490
490
 
491
491
  def _load_plugin(
@@ -144,6 +144,10 @@ def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
144
144
  exit_code = ExitCode.SUCCESS
145
145
 
146
146
  def on_exit() -> None:
147
+ # Set Grpc max retries to 1 to avoid blocking on exit
148
+ if grid:
149
+ grid._retry_invoker.max_tries = 1
150
+
147
151
  # Stop heartbeat sender
148
152
  if heartbeat_sender and heartbeat_sender.is_running:
149
153
  heartbeat_sender.stop()
@@ -154,10 +158,13 @@ def run_serverapp( # pylint: disable=R0913, R0914, R0915, R0917, W0212
154
158
 
155
159
  # Update run status
156
160
  if run and run_status and grid:
157
- run_status_proto = run_status_to_proto(run_status)
158
- grid._stub.UpdateRunStatus(
159
- UpdateRunStatusRequest(run_id=run.run_id, run_status=run_status_proto)
160
- )
161
+ try:
162
+ req = UpdateRunStatusRequest(
163
+ run_id=run.run_id, run_status=run_status_to_proto(run_status)
164
+ )
165
+ grid._stub.UpdateRunStatus(req)
166
+ except grpc.RpcError:
167
+ pass
161
168
 
162
169
  # Close the Grpc connection
163
170
  if grid:
@@ -56,20 +56,28 @@ class LinkStateFactory:
56
56
 
57
57
  def state(self) -> LinkState:
58
58
  """Return a State instance and create it, if necessary."""
59
+ # Return cached state if it exists
60
+ if self.state_instance is not None:
61
+ if self.database == FLWR_IN_MEMORY_DB_NAME:
62
+ log(DEBUG, "Using InMemoryState")
63
+ else:
64
+ log(DEBUG, "Using SqlLinkState")
65
+ return self.state_instance
66
+
59
67
  # Get the ObjectStore instance
60
68
  object_store = self.objectstore_factory.store()
61
69
 
62
70
  # InMemoryState
63
71
  if self.database == FLWR_IN_MEMORY_DB_NAME:
64
- if self.state_instance is None:
65
- self.state_instance = InMemoryLinkState(
66
- self.federation_manager, object_store
67
- )
72
+ self.state_instance = InMemoryLinkState(
73
+ self.federation_manager, object_store
74
+ )
68
75
  log(DEBUG, "Using InMemoryState")
69
76
  return self.state_instance
70
77
 
71
78
  # SqlLinkState
72
79
  state = SqlLinkState(self.database, self.federation_manager, object_store)
73
80
  state.initialize()
81
+ self.state_instance = state
74
82
  log(DEBUG, "Using SqlLinkState")
75
83
  return state
@@ -33,7 +33,7 @@ class DiskFfs(Ffs): # pylint: disable=R0904
33
33
  base_dir : str
34
34
  The base directory to store the objects.
35
35
  """
36
- self.base_dir = Path(base_dir)
36
+ self.base_dir = Path(base_dir).expanduser()
37
37
 
38
38
  def put(self, content: bytes, meta: dict[str, str]) -> str:
39
39
  """Store bytes and metadata and return key (hash of content).
@@ -49,15 +49,23 @@ class ObjectStoreFactory:
49
49
  ObjectStore
50
50
  An ObjectStore instance for storing objects by object_id.
51
51
  """
52
+ # Return cached store if it exists
53
+ if self.store_instance is not None:
54
+ if self.database == FLWR_IN_MEMORY_DB_NAME:
55
+ log(DEBUG, "Using InMemoryObjectStore")
56
+ else:
57
+ log(DEBUG, "Using SqlObjectStore")
58
+ return self.store_instance
59
+
52
60
  # InMemoryObjectStore
53
61
  if self.database == FLWR_IN_MEMORY_DB_NAME:
54
- if self.store_instance is None:
55
- self.store_instance = InMemoryObjectStore()
62
+ self.store_instance = InMemoryObjectStore()
56
63
  log(DEBUG, "Using InMemoryObjectStore")
57
64
  return self.store_instance
58
65
 
59
66
  # SqlObjectStore
60
67
  store = SqlObjectStore(self.database)
61
68
  store.initialize()
69
+ self.store_instance = store
62
70
  log(DEBUG, "Using SqlObjectStore")
63
71
  return store
@@ -30,6 +30,7 @@ from sqlalchemy.orm import Session, sessionmaker
30
30
 
31
31
  from flwr.common.logger import log
32
32
  from flwr.supercore.constant import FLWR_IN_MEMORY_SQLITE_DB_URL, SQLITE_PRAGMAS
33
+ from flwr.supercore.state.alembic.utils import run_migrations
33
34
 
34
35
  _current_session: ContextVar[Session | None] = ContextVar(
35
36
  "current_sqlalchemy_session",
@@ -193,9 +194,14 @@ class SqlMixin(ABC):
193
194
  # Create session factory
194
195
  self._session_factory = sessionmaker(bind=self._engine)
195
196
 
196
- # Create tables defined in metadata (idempotent - only creates missing tables)
197
- if (metadata := self.get_metadata()) is not None:
197
+ # Create database
198
+ metadata: MetaData | None = self.get_metadata()
199
+ if metadata and self.database_url == FLWR_IN_MEMORY_SQLITE_DB_URL:
200
+ # In-memory databases: create tables directly from SQLAlchemy metadata
198
201
  metadata.create_all(self._engine)
202
+ else:
203
+ # File-based databases: use Alembic migrations for schema versioning
204
+ run_migrations(self._engine)
199
205
 
200
206
  # Get all table names using inspector
201
207
  inspector = inspect(self._engine)
@@ -233,7 +233,7 @@ def _try_setup_client_authentication(
233
233
 
234
234
  try:
235
235
  ssh_private_key = load_ssh_private_key(
236
- Path(args.auth_supernode_private_key).read_bytes(),
236
+ Path(args.auth_supernode_private_key).expanduser().read_bytes(),
237
237
  None,
238
238
  )
239
239
  if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
@@ -260,6 +260,7 @@ def _try_obtain_trusted_entities(
260
260
  """Validate and return the trust entities."""
261
261
  if not trusted_entities_path:
262
262
  return None
263
+ trusted_entities_path = trusted_entities_path.expanduser()
263
264
  if not trusted_entities_path.is_file():
264
265
  flwr_exit(
265
266
  ExitCode.SUPERNODE_INVALID_TRUSTED_ENTITIES,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.26.0.dev20260129
3
+ Version: 1.26.0.dev20260130
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
@@ -14,18 +14,18 @@ flwr/cli/auth_plugin/__init__.py,sha256=qpebWV9uLpx72_J8yTVgT1DlH2Y9MK_RraDoTYEq
14
14
  flwr/cli/auth_plugin/auth_plugin.py,sha256=CKGsk0RvSmKPDfz5RsQIE_w1bWROBSOoVydbub4Z-I8,2813
15
15
  flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=GKrZ97w7NoZGn2r6gzqtMvyeHXeIkNKCLTfT_NHaiwg,3209
16
16
  flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=1gN00FifSrhUA5s5uaE_GpQ3N7U8fQec4PXlSJr50RU,5975
17
- flwr/cli/build.py,sha256=u3oheZ3cVthWSy0X39d-iwFSh0zebCUNsEtK5hRSCy8,9994
17
+ flwr/cli/build.py,sha256=Zfy6SfuhnkfVt0nccfrX-lWxNgtzhhG-OTSXG0VFfLQ,10007
18
18
  flwr/cli/cli_account_auth_interceptor.py,sha256=mXgxThpZjU_2Xlae9xT8ewOw60GeE64comDd57asLIY,3680
19
19
  flwr/cli/config/__init__.py,sha256=46z6whA3hvKkl9APRs-UG7Ym3K9VOqKx_pYcgelRjtE,788
20
20
  flwr/cli/config/ls.py,sha256=14JvV7llvhKozz19eIrrrWxR6WeXyko8apPFiq4P08E,2661
21
- flwr/cli/config_migration.py,sha256=Qhi_ZCQhTSgA3NNGwc9yltkT9u2Jwbzvsw6bnhpdUWE,10621
21
+ flwr/cli/config_migration.py,sha256=Lc_y6zebVBgRr6JdiPJcyroUjuOG0k7UQEbqISUPC2E,10647
22
22
  flwr/cli/config_utils.py,sha256=LNmbPODWefsEtt4ov63BFtuTcK1Pb8Z-AHt1_haWWdA,7841
23
23
  flwr/cli/constant.py,sha256=MYLI7m9ntwWNkFgEEtKVo1JWX3umf_0EdqY8nJy-83Y,3525
24
24
  flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
25
25
  flwr/cli/federation/__init__.py,sha256=okxswL4fAjApI9gV_alU1lRkTUcQRbwlzvtUTLz61fE,793
26
26
  flwr/cli/federation/ls.py,sha256=VwoM0BrlcvQvE4oGqFol4sAI9JqtR32SYN5gzDfmVPY,10144
27
27
  flwr/cli/flower_config.py,sha256=YQfuFGW52jf6EoAxWrXQYw6lmuH0j2qsZ0twHRLxx4k,15278
28
- flwr/cli/install.py,sha256=GRjDf9TNd-te9EQadiqxhkAWVI7rXE6p6xUmB8MccUw,9111
28
+ flwr/cli/install.py,sha256=AKjJxDr_kBJirpqMg_EemlP23CfH5UF3h5IjtJQ_xPs,9124
29
29
  flwr/cli/log.py,sha256=BPA0dvGlXx5PrtURPua5fJyF7iVrb28K4fEY2Uth0EE,7317
30
30
  flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
31
31
  flwr/cli/login/login.py,sha256=o-jm5QRMIpivE8kpY7cPTGbr7nQhsyFYaftMtBaaT0s,3649
@@ -34,12 +34,12 @@ flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
34
34
  flwr/cli/new/new.py,sha256=15phs5dhEpo7ORs7uulGzHWtW9W5ZGn0EKFE_T5WXb8,7829
35
35
  flwr/cli/pull.py,sha256=XzBvLrdYGrSCuky5OoCEU4V9UR9QlyZMT7Tj-W6wSw0,2946
36
36
  flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
37
- flwr/cli/run/run.py,sha256=aoWZT0pQPbYnLobkDykddjJ5RgAL-RXpt9-Spi9I_wI,8765
37
+ flwr/cli/run/run.py,sha256=qavtddUCqNWv8V_FjW3ho9GLwTxQf6bIJuZirMTK9LE,8807
38
38
  flwr/cli/run_utils.py,sha256=ZnlBOqFfRxVEPZKR_9zYrynNcohiCFY8QN6OFyOCrQs,5082
39
39
  flwr/cli/stop.py,sha256=c5e2gTumMT6pKr7ESIXZ-IbLY6fEOfWbkesvQeAfaSQ,3934
40
40
  flwr/cli/supernode/__init__.py,sha256=DBkjoPo2hS2Y-ghJxwLbrAbCQFBgD82_Itl2_892UBo,917
41
41
  flwr/cli/supernode/ls.py,sha256=mmpwIpwp5YZSdq3gDlv0h8QpKoMBgZWrMrvJm_ltiRw,7594
42
- flwr/cli/supernode/register.py,sha256=_nHLCngBJyB3qGWUfMcEYGMVOdSn1nh-5X8cYFZfEG0,4755
42
+ flwr/cli/supernode/register.py,sha256=HzgJ1Q8Mlx7oJE-2kRLbIX2OrQP7wM0IeywirLqyz9Y,4724
43
43
  flwr/cli/supernode/unregister.py,sha256=ha8-oTXA4NW8xHLyQPHn-e0f7-9bF2QyjXxUD299O6s,2938
44
44
  flwr/cli/typing.py,sha256=xGAIv9mAVzs6UXapzu4i8bQ-MckzHMSihtLcnu5SWGU,7562
45
45
  flwr/cli/utils.py,sha256=PEzRVZPaLBxF-9yTAkl3mi--z_W2eC9JOHoMoQHBuYw,17251
@@ -49,7 +49,7 @@ flwr/client/dpfedavg_numpy_client.py,sha256=ELDHyEJcTB-FlLhHC-JXy8HuB3ZFHfT0HL3g
49
49
  flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
50
50
  flwr/client/grpc_adapter_client/connection.py,sha256=rr3NA7d-BYsWNTu1VRE9966FxToLLECLBAVNhf5uFoo,4242
51
51
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
52
- flwr/client/grpc_rere_client/connection.py,sha256=JTcNI-J3Mwln4qKerImsqzgV1iavhlraTq_1vgmwglg,13819
52
+ flwr/client/grpc_rere_client/connection.py,sha256=0IU1X5W1H8D1Lit6_-sJIPLRyfpOv10AGOsQboZTg7E,13832
53
53
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=HR6P604_RZa6CRd0tf2Nmcw5e5puRIAryWQrq64yxyw,7568
54
54
  flwr/client/grpc_rere_client/node_auth_client_interceptor.py,sha256=rIUo64KOSYMC-GlfTvIYgeouAX8i6eOd5Rq2Yi9UFMY,2437
55
55
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
@@ -75,8 +75,8 @@ flwr/clientapp/mod/localdp_mod.py,sha256=CHh0SJOSWSD6In9p9yOFbE7S4eH1m-aQcStT8ZI
75
75
  flwr/clientapp/typing.py,sha256=Ld2rsD40SvIRD1Z_IdAGaYSbRtkgXZ5CPFIkJJ3Ao-A,862
76
76
  flwr/clientapp/utils.py,sha256=UEb3DFpAsAaG1ARU34D3L8njn4k1iPg-qpHl_Hyo8zA,4340
77
77
  flwr/common/__init__.py,sha256=7Rf7Ti78N7vUydpIZ2b-1im6ciWz0G5_w91N9YEPsLM,4195
78
- flwr/common/args.py,sha256=smdDpQbWOOmOt5uVpeY2oF-VjaNUR9U3iCqvlQJyr-Q,5818
79
- flwr/common/config.py,sha256=YmIO0OU-jC1trcUPh3Fo6emf_2shDcy5Rc2cAOtTujM,13695
78
+ flwr/common/args.py,sha256=4m368Vm-9UEHbJI5S3pgjF6Kf9jZ6pNsQOLrH1av3tI,5870
79
+ flwr/common/config.py,sha256=A0pqN12KDGhhkwvwrPgdlfa3Msm6llyFILx0W9fTUDc,13721
80
80
  flwr/common/constant.py,sha256=W_6nBuZOagCsx4w8ZcrrEmyDRAekTGyMhmJycgq7tIQ,10146
81
81
  flwr/common/context.py,sha256=pnFVcn-X0XKK1giw82I54meNodJJEoUwZ-NpkzT37zo,2421
82
82
  flwr/common/differential_privacy.py,sha256=HiW2qQa5mCQfE0oePapFp3q0uZzjoHKthp5UrkRFtY8,6143
@@ -85,7 +85,7 @@ flwr/common/dp.py,sha256=ftqWheOICK5N_zPaofnbFb474lMb5w9lclwxf5DKY0w,1978
85
85
  flwr/common/event_log_plugin/__init__.py,sha256=ts3VAL3Fk6Grp1EK_1Qg_V-BfOof9F86iBx4rbrEkyo,838
86
86
  flwr/common/event_log_plugin/event_log_plugin.py,sha256=uJYR363nVzjfJePay3UHwaifwgBx2rAbKHHAuQC10VU,2014
87
87
  flwr/common/exit/__init__.py,sha256=8W7xaO1iw0vacgmQW7FTFbSh7csNv6XfsgIlnIbNF6U,978
88
- flwr/common/exit/exit.py,sha256=EBHZos4EhZLxW1lmZXDVlFUOf0_eTQ1FxzQiZ466hZ0,4018
88
+ flwr/common/exit/exit.py,sha256=cyvHiznpsbESOdhWbBhWGUiVa83dr_1nZ2ia_m6B4fk,4018
89
89
  flwr/common/exit/exit_code.py,sha256=xpvi_3UOhf6AT8pR0ZGXyBxWfnuFFE50O1cKqOGVxxE,7000
90
90
  flwr/common/exit/exit_handler.py,sha256=zUAXHtp4rYK_sbkgsqS5zrVAzJUiSBrB-a4Ay3vSPE8,2302
91
91
  flwr/common/exit/signal_handler.py,sha256=o_e33v9kP0jz13q-8BZDrKF7vNCzOApvDPZ3-nTXfIc,3697
@@ -93,7 +93,7 @@ flwr/common/grpc.py,sha256=8XoMTA5rJMze8fG6vOs1g4_rkxMhfpvMEYJPnqYPi2g,9799
93
93
  flwr/common/inflatable.py,sha256=GDL9oBKs16_yyVdlH6kBf493O5xll_h9V7XB5Mpx1Hc,9524
94
94
  flwr/common/inflatable_protobuf_utils.py,sha256=GTX9yoEAXhKPwcKc4ltmJHUvARFsC4qvkoNCMHqpVtc,5065
95
95
  flwr/common/inflatable_utils.py,sha256=nooSMLLiOcHGqFx9n1Il_dAp76JIKyc36ibnkijwELE,19540
96
- flwr/common/logger.py,sha256=nAfGWqT6b39tzEPe74L7qCgyPmxeJNYwVvTyHi5Tb-4,12981
96
+ flwr/common/logger.py,sha256=kyeiusWV5T-FsG8wc21n_CBokuwg1S_YCerVp0a1MrE,12994
97
97
  flwr/common/message.py,sha256=uKQ4-gMt62zVuPfke4JmcB9q-yN9kMGTsSUUF9fnH-4,19915
98
98
  flwr/common/object_ref.py,sha256=aw6BLQlZRVqcfuyX2bScc71ZTRZtrBIAHyxYfplTkNE,9081
99
99
  flwr/common/parameter.py,sha256=UVw6sOgehEFhFs4uUCMl2kfVq1PD6ncmWgPLMsZPKPE,2095
@@ -201,7 +201,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=jYsbV3KYdp4TaNfWxv3ljFEvB-Yjsa8MIPtTH-vV
201
201
  flwr/proto/transport_pb2_grpc.pyi,sha256=qd2cOXq6HBZtwRfPpKuni27NGMJCAxyP5R95Vk8WWDU,2073
202
202
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
203
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
204
- flwr/server/app.py,sha256=90rGFbhQw0vDrVDamqBVIm0RtUDfUUdUcXc9WpU7BKI,31678
204
+ flwr/server/app.py,sha256=Q4p3_-ft63L8psN9pOFTL7FvnyMhcky6GNI_cjdQqSw,31691
205
205
  flwr/server/client_manager.py,sha256=3WOqNWh5dlqPRG-DMGwXiyvGNEYS_jKqXKkFIkMqWLQ,6187
206
206
  flwr/server/client_proxy.py,sha256=QS_RGgjSZ8V4StAHH8zc7W9_os2FyO4wNqkbylQMBTY,2341
207
207
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -221,7 +221,7 @@ flwr/server/server.py,sha256=Oqv3WZ92KN9XTS6vqcYFTEvJM0sHZfkUmNM8xgbhZBE,17698
221
221
  flwr/server/server_app.py,sha256=udSNhp5Syg0XJj-AnfqPGkBkg9zuPaSgm1LCL_4PYkc,9469
222
222
  flwr/server/server_config.py,sha256=anmj2Rf18kM1chyl-9myRLDS77YVKTS6MpsDh2nIFOY,1318
223
223
  flwr/server/serverapp/__init__.py,sha256=xcC0T_MQSMS9cicUzUUpMNCOsF2d8Oh_8jvnoBLuZvo,800
224
- flwr/server/serverapp/app.py,sha256=pVbVwskQHULC5lvL-uDbKK67LVbYoJpT-H_e-w89qFU,9975
224
+ flwr/server/serverapp/app.py,sha256=-88vN2d-7FtqV9L--nvcVpYHNLgfG-Jd0tYQEAmA6lw,10163
225
225
  flwr/server/serverapp_components.py,sha256=b8GbqXkiEsiOw61gGITVj6eFpl66upEf7eMjDu1Oo-M,2078
226
226
  flwr/server/strategy/__init__.py,sha256=HhsSWMWaC7oCb2g7Kqn1MBKdrfvgi8VxACy9ZL706Q0,2836
227
227
  flwr/server/strategy/aggregate.py,sha256=ebIKolvRzSGwVKbxSZtofGSQAIT8LRddMW2c33mXQ2w,14070
@@ -271,7 +271,7 @@ flwr/server/superlink/fleet/vce/vce_api.py,sha256=A62Vx3r71bNI-v10IUen_27fDJoYXs
271
271
  flwr/server/superlink/linkstate/__init__.py,sha256=KSUCjOfJlW1g6GAjlqK3mTviqLvJLuQEzSJwO27Qokg,1052
272
272
  flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=1-aaSwad77SeYND3HEF2041KNG5ZA-8i1RcheYZMNq8,31689
273
273
  flwr/server/superlink/linkstate/linkstate.py,sha256=Zz2vBI0QFFnptCUIeNjqQCbpCvMMzfsZluprEMkkHio,16809
274
- flwr/server/superlink/linkstate/linkstate_factory.py,sha256=BTzPIqrWa797YKdOEHt0iu4ujxRcK4FNvUgjsOYQfMs,2859
274
+ flwr/server/superlink/linkstate/linkstate_factory.py,sha256=CgAoYgisVOrHQizN6u6_L-iKZdv5mgBszag6LgAfe3w,3139
275
275
  flwr/server/superlink/linkstate/sql_linkstate.py,sha256=ziZvpEQBVV9GSxjHiS0fAyaY1G7x4y6XKlNLH-c_4TQ,48727
276
276
  flwr/server/superlink/linkstate/utils.py,sha256=IA1mKKhGVBPoD61VXKFa8dZ_prnfuyWIuKAeeHPLmuE,16000
277
277
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
@@ -338,7 +338,7 @@ flwr/supercore/credential_store/credential_store.py,sha256=m_YHW0_A8CBfuRVq-GJgG
338
338
  flwr/supercore/credential_store/file_credential_store.py,sha256=PeWuigqtMGMYnj_tKnWtlmJtu7OLuVaOB4D9GS47lHc,2771
339
339
  flwr/supercore/date.py,sha256=NsadFTzy6LMRB9zNeEV1szvzwQT45wC639P9kBTRZK4,1213
340
340
  flwr/supercore/ffs/__init__.py,sha256=U3KXwG_SplEvchat27K0LYPoPHzh-cwwT_NHsGlYMt8,908
341
- flwr/supercore/ffs/disk_ffs.py,sha256=IWFjikDs8BOfHIgFgOGI6p4Xl7U3n8lGbocmIibepcg,3241
341
+ flwr/supercore/ffs/disk_ffs.py,sha256=WTgK7A15EkHcBZTEQEKl1YdfJj8vRfCwJk7cnnHE4oo,3254
342
342
  flwr/supercore/ffs/ffs.py,sha256=Q71OLKYIuuhe_XDTqku03qozUfDBQ5Lxg-MbpGDPHlk,2364
343
343
  flwr/supercore/ffs/ffs_factory.py,sha256=tPwVDWMddgo45X8tk1lBCTkmJenWBbRagjWfx7UsYuE,1459
344
344
  flwr/supercore/grpc_health/__init__.py,sha256=rCPZ7ucPY9NXBWuhb9iKs2D-yZ0rQ5YkJ7LlOeahN9A,948
@@ -350,12 +350,12 @@ flwr/supercore/license_plugin/license_plugin.py,sha256=BFhlCH5v9KKuY7crVCsi8fuYe
350
350
  flwr/supercore/object_store/__init__.py,sha256=cdfPAmjINY6iOp8oI_LdcVh2simg469Mkdl4LLV4kHI,911
351
351
  flwr/supercore/object_store/in_memory_object_store.py,sha256=-DU6n1Ef3EmllHY9SzeXw57ftoU0mR_6or4NIDSZlcs,9322
352
352
  flwr/supercore/object_store/object_store.py,sha256=XLo-xe258TmCel9dNLCJepFjXaQtEi0wBqzU9YsyJVg,5221
353
- flwr/supercore/object_store/object_store_factory.py,sha256=gFATFiSdKIcwL_sjk2OMbpi3Fb5_C6K3sdTRxNbi-SY,2308
353
+ flwr/supercore/object_store/object_store_factory.py,sha256=RByhm8Ow6TxmklP1MTluaze3v5kw0O1CILrA7Y0nWMg,2604
354
354
  flwr/supercore/object_store/sql_object_store.py,sha256=ZBmyc3a_GXZFNaefDCxhrri-_BgcQPOj7OtUfrPcjKo,10130
355
355
  flwr/supercore/primitives/__init__.py,sha256=Tx8GOjnmMo8Y74RsDGrMpfr-E0Nl8dcUDF784_ge6F8,745
356
356
  flwr/supercore/primitives/asymmetric.py,sha256=1643niHYj3uEbfPd06VuMHwN3tKVwg0uVyR3RhTdWIU,3778
357
357
  flwr/supercore/primitives/asymmetric_ed25519.py,sha256=eIhOTMibQW0FJX4MXdplHdL3HcfCiKuFu2mQ8GQTUz8,5025
358
- flwr/supercore/sql_mixin.py,sha256=dAK_NCnXa0Ili0N5vYgQ9dlVOE-KeiQCRc2Z0RcS0sU,11765
358
+ flwr/supercore/sql_mixin.py,sha256=lI-7kCudH2f8XEpxoeJsqYr0iA1grGeogwnu_4JHHqE,12058
359
359
  flwr/supercore/state/__init__.py,sha256=FkKhsNVM4LjlRlOgXTz6twINmw5ohIUKS_OER0BNo_w,724
360
360
  flwr/supercore/state/alembic/__init__.py,sha256=pC-y-xsfgi9YwCrqnt814yOJ9ytlDRUFGqOY6Qzt-_U,746
361
361
  flwr/supercore/state/alembic/env.py,sha256=8zrPVosMxLqZ8CAhS7PHOlMU2Vr-LEt7gSCN4UYSAJg,3913
@@ -396,7 +396,7 @@ flwr/superlink/servicer/control/control_license_interceptor.py,sha256=8d28soJ0mL
396
396
  flwr/superlink/servicer/control/control_servicer.py,sha256=s9LgpbXUGU7DYwOvFUzNjgyKEWHyjPJQeUfp-XXUBWM,25523
397
397
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
398
398
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
399
- flwr/supernode/cli/flower_supernode.py,sha256=1HdhlGaVo51_7w3AL1hE5zfIVJMow0Ngi_F3Js01djs,10815
399
+ flwr/supernode/cli/flower_supernode.py,sha256=LhciYbUwUfvkR4hiHxizERhQzpqZOAG9d6qVm6-V4jY,10891
400
400
  flwr/supernode/cli/flwr_clientapp.py,sha256=W3tAyqSfeHbPhqBC4Pfo9bsyFdkBKPqdKlhGmeUKwKg,3173
401
401
  flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
402
402
  flwr/supernode/nodestate/in_memory_nodestate.py,sha256=DBhpDsPmitkOr86pW78_0aiG_jWgjjCXerFONXsyOSE,10578
@@ -408,7 +408,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
408
408
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
409
409
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=rRL4CQ0L78jF_p0ct4-JMGREt6wWRy__wy4czF4f54Y,11639
410
410
  flwr/supernode/start_client_internal.py,sha256=3MkeDiWZr-SsvACuuAxJi8nYw6GYNKOO6q8b36E3R9k,26250
411
- flwr_nightly-1.26.0.dev20260129.dist-info/METADATA,sha256=NbKTb0Td1o6FqIV5yayWIBxPmZTa77sbO_eGmst0wEM,14439
412
- flwr_nightly-1.26.0.dev20260129.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
413
- flwr_nightly-1.26.0.dev20260129.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
414
- flwr_nightly-1.26.0.dev20260129.dist-info/RECORD,,
411
+ flwr_nightly-1.26.0.dev20260130.dist-info/METADATA,sha256=qlSBZYQkTLRBbGqzPTIrx7Ml1-tp9kVzKsj9zy66N7c,14439
412
+ flwr_nightly-1.26.0.dev20260130.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
413
+ flwr_nightly-1.26.0.dev20260130.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
414
+ flwr_nightly-1.26.0.dev20260130.dist-info/RECORD,,