langgraph-runtime-inmem 0.21.1__tar.gz → 0.22.1__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 (17) hide show
  1. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/.gitignore +4 -1
  2. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/PKG-INFO +1 -1
  3. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/__init__.py +3 -1
  4. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/checkpoint.py +94 -8
  5. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/ops.py +84 -39
  6. langgraph_runtime_inmem-0.22.1/langgraph_runtime_inmem/routes.py +39 -0
  7. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/uv.lock +76 -76
  8. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/Makefile +0 -0
  9. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/README.md +0 -0
  10. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/database.py +0 -0
  11. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/inmem_stream.py +0 -0
  12. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/lifespan.py +0 -0
  13. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/metrics.py +0 -0
  14. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/queue.py +0 -0
  15. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/retry.py +0 -0
  16. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/langgraph_runtime_inmem/store.py +0 -0
  17. {langgraph_runtime_inmem-0.21.1 → langgraph_runtime_inmem-0.22.1}/pyproject.toml +0 -0
@@ -66,4 +66,7 @@ pnpm-debug.log*
66
66
  *.db
67
67
  .notes/
68
68
  core/core-server
69
- core/bin/core-server
69
+ core/bin/core-server
70
+
71
+ # place to put some files for reference for AI coding agents
72
+ _ref/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-runtime-inmem
3
- Version: 0.21.1
3
+ Version: 0.22.1
4
4
  Summary: Inmem implementation for the LangGraph API server.
5
5
  Author-email: Will Fu-Hinthorn <will@langchain.dev>
6
6
  License: Elastic-2.0
@@ -6,10 +6,11 @@ from langgraph_runtime_inmem import (
6
6
  ops,
7
7
  queue,
8
8
  retry,
9
+ routes,
9
10
  store,
10
11
  )
11
12
 
12
- __version__ = "0.21.1"
13
+ __version__ = "0.22.1"
13
14
  __all__ = [
14
15
  "ops",
15
16
  "database",
@@ -19,5 +20,6 @@ __all__ = [
19
20
  "store",
20
21
  "queue",
21
22
  "metrics",
23
+ "routes",
22
24
  "__version__",
23
25
  ]
@@ -1,13 +1,21 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import functools
3
4
  import logging
4
5
  import os
6
+ import threading
5
7
  import typing
6
8
  import uuid
7
- from collections.abc import AsyncIterator
9
+ import weakref
10
+ from collections.abc import AsyncIterator, Callable
8
11
  from typing import Any
9
12
 
10
- from langgraph.checkpoint.memory import MemorySaver, PersistentDict
13
+ from langgraph.checkpoint.memory import (
14
+ InMemorySaver as InMemorySaverBase,
15
+ )
16
+ from langgraph.checkpoint.memory import (
17
+ PersistentDict,
18
+ )
11
19
 
12
20
  if typing.TYPE_CHECKING:
13
21
  from langchain_core.runnables import RunnableConfig
@@ -21,16 +29,28 @@ if typing.TYPE_CHECKING:
21
29
  logger = logging.getLogger(__name__)
22
30
 
23
31
  _EXCLUDED_KEYS = {"checkpoint_ns", "checkpoint_id", "run_id", "thread_id"}
32
+
33
+ # Configurable keys that are transient (per-request) and should not be persisted in checkpoints
34
+ _TRANSIENT_CONFIGURABLE_KEYS = frozenset(
35
+ {
36
+ "langgraph_request_id",
37
+ "langgraph_auth_user",
38
+ "langgraph_auth_user_id",
39
+ "langgraph_auth_permissions",
40
+ }
41
+ )
42
+
24
43
  DISABLE_FILE_PERSISTENCE = (
25
44
  os.getenv("LANGGRAPH_DISABLE_FILE_PERSISTENCE", "false").lower() == "true"
26
45
  )
27
46
 
28
47
 
29
- class InMemorySaver(MemorySaver):
48
+ class InMemorySaver(InMemorySaverBase):
30
49
  def __init__(
31
50
  self,
32
51
  *,
33
52
  serde: SerializerProtocol | None = None,
53
+ __persistence_hook__: Callable[[PersistentDict], None] | None = None,
34
54
  ) -> None:
35
55
  self.filename = os.path.join(".langgraph_api", ".langgraph_checkpoint.")
36
56
  i = 0
@@ -43,6 +63,8 @@ class InMemorySaver(MemorySaver):
43
63
  os.mkdir(".langgraph_api")
44
64
  thisfname = self.filename + str(i) + ".pckl"
45
65
  d = PersistentDict(*args, filename=thisfname)
66
+ if __persistence_hook__:
67
+ __persistence_hook__(d)
46
68
 
47
69
  try:
48
70
  d.load()
@@ -84,14 +106,26 @@ class InMemorySaver(MemorySaver):
84
106
  new_versions: dict[str, str | int | float],
85
107
  ) -> RunnableConfig:
86
108
  # TODO: Should this be done in OSS as well?
109
+ # Filter out transient fields that are request-scoped, not checkpoint-scoped
110
+ config_metadata = config.get("metadata", {})
87
111
  metadata = {
88
112
  **{
89
113
  k: v
90
114
  for k, v in config["configurable"].items()
91
- if not k.startswith("__") and k not in _EXCLUDED_KEYS
115
+ if not k.startswith("__")
116
+ and k not in _EXCLUDED_KEYS
117
+ and k not in _TRANSIENT_CONFIGURABLE_KEYS
118
+ },
119
+ **{
120
+ k: v
121
+ for k, v in config_metadata.items()
122
+ if k not in _TRANSIENT_CONFIGURABLE_KEYS
123
+ },
124
+ **{
125
+ k: v
126
+ for k, v in metadata.items()
127
+ if k not in _TRANSIENT_CONFIGURABLE_KEYS
92
128
  },
93
- **config.get("metadata", {}),
94
- **metadata,
95
129
  }
96
130
  if not isinstance(checkpoint["id"], uuid.UUID):
97
131
  # Avoid type inconsistencies
@@ -176,6 +210,15 @@ class InMemorySaver(MemorySaver):
176
210
  pending_writes=tuple_.pending_writes,
177
211
  )
178
212
 
213
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
214
+ global _ingestion_thread
215
+ if _ingestion_thread is not None:
216
+ logger.info("Stopping dev checkpoint ingestion loop")
217
+ _ingestion_thread[0].set()
218
+ _ingestion_thread[1].join()
219
+ _ingestion_thread = None
220
+ await super().__aexit__(exc_type, exc_val, exc_tb)
221
+
179
222
 
180
223
  MEMORY = None
181
224
 
@@ -183,12 +226,16 @@ MEMORY = None
183
226
  def Checkpointer(*args, unpack_hook=None, **kwargs):
184
227
  global MEMORY
185
228
  if MEMORY is None:
186
- MEMORY = InMemorySaver()
229
+ MEMORY = InMemorySaver(
230
+ __persistence_hook__=_hook,
231
+ )
187
232
  if unpack_hook is not None:
188
233
  from langgraph_api.serde import Serializer
189
234
 
190
235
  saver = InMemorySaver(
191
- serde=Serializer(__unpack_ext_hook__=unpack_hook), **kwargs
236
+ serde=Serializer(__unpack_ext_hook__=unpack_hook),
237
+ __persistence_hook__=_hook,
238
+ **kwargs,
192
239
  )
193
240
  saver.writes = MEMORY.writes
194
241
  saver.blobs = MEMORY.blobs
@@ -197,4 +244,43 @@ def Checkpointer(*args, unpack_hook=None, **kwargs):
197
244
  return MEMORY
198
245
 
199
246
 
247
+ _stores: dict[str, weakref.ref[PersistentDict]] = {}
248
+ _ingestion_thread: tuple[threading.Event, threading.Thread] | None = None
249
+ _ingestion_delay: int = 10
250
+
251
+
252
+ def _hook(d: PersistentDict):
253
+ global _ingestion_thread
254
+ _stores[d.filename] = weakref.ref(d)
255
+ if _ingestion_thread is None:
256
+ logger.info("Starting dev checkpoint ingestion loop")
257
+ stop_event = threading.Event()
258
+ _ingestion_thread = (
259
+ stop_event,
260
+ threading.Thread(
261
+ target=functools.partial(_ingestion_loop, stop_event), daemon=True
262
+ ),
263
+ )
264
+ _ingestion_thread[1].start()
265
+ pass
266
+
267
+
268
+ def _ingestion_loop(stop_event: threading.Event):
269
+ drop = set()
270
+ while not stop_event.wait(timeout=_ingestion_delay):
271
+ keys = list(_stores.keys())
272
+ for store_key in keys:
273
+ if store := _stores[store_key]():
274
+ store.sync()
275
+ continue
276
+ else:
277
+ drop.add(store_key)
278
+ if drop:
279
+ for store_key in drop:
280
+ del _stores[store_key]
281
+ drop.clear()
282
+ # Note: the checkpoints are flushed one last time upon exit.
283
+ logger.info("dev checkpoint ingestion loop exiting")
284
+
285
+
200
286
  __all__ = ["Checkpointer"]
@@ -10,7 +10,7 @@ import typing
10
10
  import uuid
11
11
  from collections import defaultdict
12
12
  from collections.abc import AsyncIterator, Sequence
13
- from contextlib import asynccontextmanager
13
+ from contextlib import AsyncExitStack, asynccontextmanager
14
14
  from datetime import UTC, datetime, timedelta
15
15
  from typing import Any, Literal, cast
16
16
  from uuid import UUID, uuid4
@@ -150,6 +150,8 @@ class Assistants(Authenticated):
150
150
  select: list[AssistantSelectField] | None = None,
151
151
  ctx: Auth.types.BaseAuthContext | None = None,
152
152
  ) -> tuple[AsyncIterator[Assistant], int]:
153
+ from langgraph_api.graph import GRAPHS
154
+
153
155
  metadata = metadata if metadata is not None else {}
154
156
  filters = await Assistants.handle_event(
155
157
  ctx,
@@ -159,6 +161,9 @@ class Assistants(Authenticated):
159
161
  ),
160
162
  )
161
163
 
164
+ if graph_id is not None and graph_id not in GRAPHS:
165
+ raise HTTPException(status_code=404, detail=f"Graph {graph_id} not found")
166
+
162
167
  # Get all assistants and filter them
163
168
  assistants = conn.store["assistants"]
164
169
  filtered_assistants = [
@@ -365,6 +370,8 @@ class Assistants(Authenticated):
365
370
  Returns:
366
371
  return the updated assistant model.
367
372
  """
373
+ from langgraph_api.graph import GRAPHS
374
+
368
375
  assistant_id = _ensure_uuid(assistant_id)
369
376
  metadata = metadata if metadata is not None else {}
370
377
  config = config if config is not None else {}
@@ -387,6 +394,9 @@ class Assistants(Authenticated):
387
394
  detail="Cannot specify both configurable and context. Prefer setting context alone. Context was introduced in LangGraph 0.6.0 and is the long term planned replacement for configurable.",
388
395
  )
389
396
 
397
+ if graph_id is not None and graph_id not in GRAPHS:
398
+ raise HTTPException(status_code=404, detail=f"Graph {graph_id} not found")
399
+
390
400
  # Keep config and context up to date with one another
391
401
  if config.get("configurable"):
392
402
  context = config["configurable"]
@@ -462,55 +472,85 @@ class Assistants(Authenticated):
462
472
 
463
473
  @staticmethod
464
474
  async def delete(
465
- conn: InMemConnectionProto,
475
+ conn: InMemConnectionProto | None,
466
476
  assistant_id: UUID,
467
477
  ctx: Auth.types.BaseAuthContext | None = None,
478
+ *,
479
+ delete_threads: bool = False,
468
480
  ) -> AsyncIterator[UUID]:
469
481
  """Delete an assistant by ID."""
470
- assistant_id = _ensure_uuid(assistant_id)
471
- filters = await Assistants.handle_event(
472
- ctx,
473
- "delete",
474
- Auth.types.AssistantsDelete(
475
- assistant_id=assistant_id,
476
- ),
477
- )
478
- assistant = next(
479
- (a for a in conn.store["assistants"] if a["assistant_id"] == assistant_id),
480
- None,
481
- )
482
+ async with AsyncExitStack() as stack:
483
+ if conn is None:
484
+ conn = await stack.enter_async_context(connect())
482
485
 
483
- if not assistant:
484
- raise HTTPException(
485
- status_code=404, detail=f"Assistant with ID {assistant_id} not found"
486
+ assistant_id = _ensure_uuid(assistant_id)
487
+ filters = await Assistants.handle_event(
488
+ ctx,
489
+ "delete",
490
+ Auth.types.AssistantsDelete(
491
+ assistant_id=assistant_id,
492
+ ),
486
493
  )
487
- elif filters and not _check_filter_match(assistant["metadata"], filters):
488
- raise HTTPException(
489
- status_code=404, detail=f"Assistant with ID {assistant_id} not found"
494
+ assistant = next(
495
+ (
496
+ a
497
+ for a in conn.store["assistants"]
498
+ if a["assistant_id"] == assistant_id
499
+ ),
500
+ None,
490
501
  )
491
502
 
492
- # Cancel all in-flight runs for this assistant before deletion
493
- await Runs.cancel(
494
- conn,
495
- assistant_id=assistant_id,
496
- action="interrupt",
497
- ctx=ctx,
498
- )
503
+ if not assistant:
504
+ raise HTTPException(
505
+ status_code=404,
506
+ detail=f"Assistant with ID {assistant_id} not found",
507
+ )
508
+ elif filters and not _check_filter_match(assistant["metadata"], filters):
509
+ raise HTTPException(
510
+ status_code=404,
511
+ detail=f"Assistant with ID {assistant_id} not found",
512
+ )
499
513
 
500
- conn.store["assistants"] = [
501
- a for a in conn.store["assistants"] if a["assistant_id"] != assistant_id
502
- ]
503
- # Cascade delete assistant versions
504
- conn.store["assistant_versions"] = [
505
- v
506
- for v in conn.store["assistant_versions"]
507
- if v["assistant_id"] != assistant_id
508
- ]
514
+ if delete_threads:
515
+ threads_to_delete = [
516
+ t["thread_id"]
517
+ for t in conn.store["threads"]
518
+ if t.get("metadata", {}).get("assistant_id") == str(assistant_id)
519
+ ]
520
+ for thread_id in threads_to_delete:
521
+ try:
522
+ async for _ in await Threads.delete(conn, thread_id, ctx=ctx):
523
+ pass
524
+ except HTTPException:
525
+ await logger.awarning(
526
+ "Skipping thread deletion during cascade delete (user lacks permission)",
527
+ thread_id=thread_id,
528
+ assistant_id=assistant_id,
529
+ )
509
530
 
510
- async def _yield_deleted():
511
- yield assistant_id
531
+ # 3. Cancel in-flight runs AFTER auth validation
532
+ await Runs.cancel(
533
+ conn,
534
+ assistant_id=assistant_id,
535
+ action="interrupt",
536
+ ctx=ctx,
537
+ )
512
538
 
513
- return _yield_deleted()
539
+ # 4. Delete assistant
540
+ conn.store["assistants"] = [
541
+ a for a in conn.store["assistants"] if a["assistant_id"] != assistant_id
542
+ ]
543
+ # Cascade delete assistant versions
544
+ conn.store["assistant_versions"] = [
545
+ v
546
+ for v in conn.store["assistant_versions"]
547
+ if v["assistant_id"] != assistant_id
548
+ ]
549
+
550
+ async def _yield_deleted():
551
+ yield assistant_id
552
+
553
+ return _yield_deleted()
514
554
 
515
555
  @staticmethod
516
556
  async def set_latest(
@@ -632,6 +672,8 @@ class Assistants(Authenticated):
632
672
  ctx: Auth.types.BaseAuthContext | None = None,
633
673
  ) -> int:
634
674
  """Get count of assistants."""
675
+ from langgraph_api.graph import GRAPHS
676
+
635
677
  metadata = metadata if metadata is not None else {}
636
678
  filters = await Assistants.handle_event(
637
679
  ctx,
@@ -641,6 +683,9 @@ class Assistants(Authenticated):
641
683
  ),
642
684
  )
643
685
 
686
+ if graph_id is not None and graph_id not in GRAPHS:
687
+ raise HTTPException(status_code=404, detail=f"Graph {graph_id} not found")
688
+
644
689
  count = 0
645
690
  for assistant in conn.store["assistants"]:
646
691
  if (
@@ -0,0 +1,39 @@
1
+ """Internal routes for inmem runtime (testing/debugging only)."""
2
+
3
+ import asyncio
4
+
5
+ from langgraph_runtime_inmem.database import connect
6
+
7
+
8
+ def get_internal_routes():
9
+ from langgraph_api.config import MIGRATIONS_PATH
10
+
11
+ if "__inmem" not in MIGRATIONS_PATH:
12
+ # not in a testing mode.
13
+ return []
14
+ from langgraph_api.route import ApiRequest, ApiResponse, ApiRoute
15
+
16
+ async def truncate(request: ApiRequest):
17
+ """Truncate all inmem data (for testing)."""
18
+ from langgraph_runtime.checkpoint import Checkpointer
19
+
20
+ await asyncio.to_thread(Checkpointer().clear)
21
+ async with connect() as conn:
22
+ await asyncio.to_thread(conn.clear)
23
+ return ApiResponse({"ok": True})
24
+
25
+ async def debug_get_raw_thread(request: ApiRequest):
26
+ """Return raw thread from store without decryption (for testing)."""
27
+ thread_id = request.path_params["thread_id"]
28
+ async with connect() as conn:
29
+ for thread in conn.store["threads"]:
30
+ if str(thread["thread_id"]) == thread_id:
31
+ return ApiResponse(thread)
32
+ return ApiResponse({"error": "not found"}, status_code=404)
33
+
34
+ return [
35
+ ApiRoute("/internal/truncate", truncate, methods=["POST"]),
36
+ ApiRoute(
37
+ "/internal/debug/thread/{thread_id}", debug_get_raw_thread, methods=["GET"]
38
+ ),
39
+ ]
@@ -13,15 +13,15 @@ wheels = [
13
13
 
14
14
  [[package]]
15
15
  name = "anyio"
16
- version = "4.12.0"
16
+ version = "4.12.1"
17
17
  source = { registry = "https://pypi.org/simple" }
18
18
  dependencies = [
19
19
  { name = "idna" },
20
20
  { name = "typing-extensions", marker = "python_full_version < '3.13'" },
21
21
  ]
22
- sdist = { url = "https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0", size = 228266, upload-time = "2025-11-28T23:37:38.911Z" }
22
+ sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" }
23
23
  wheels = [
24
- { url = "https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb", size = 113362, upload-time = "2025-11-28T23:36:57.897Z" },
24
+ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" },
25
25
  ]
26
26
 
27
27
  [[package]]
@@ -223,7 +223,7 @@ wheels = [
223
223
 
224
224
  [[package]]
225
225
  name = "langchain-core"
226
- version = "1.2.6"
226
+ version = "1.2.7"
227
227
  source = { registry = "https://pypi.org/simple" }
228
228
  dependencies = [
229
229
  { name = "jsonpatch" },
@@ -235,14 +235,14 @@ dependencies = [
235
235
  { name = "typing-extensions" },
236
236
  { name = "uuid-utils" },
237
237
  ]
238
- sdist = { url = "https://files.pythonhosted.org/packages/b9/ce/ba5ed5ea6df22965b2893c2ed28ebb456204962723d408904c4acfa5e942/langchain_core-1.2.6.tar.gz", hash = "sha256:b4e7841dd7f8690375aa07c54739178dc2c635147d475e0c2955bf82a1afa498", size = 833343, upload-time = "2026-01-02T21:35:44.749Z" }
238
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/0e/664d8d81b3493e09cbab72448d2f9d693d1fa5aa2bcc488602203a9b6da0/langchain_core-1.2.7.tar.gz", hash = "sha256:e1460639f96c352b4a41c375f25aeb8d16ffc1769499fb1c20503aad59305ced", size = 837039, upload-time = "2026-01-09T17:44:25.505Z" }
239
239
  wheels = [
240
- { url = "https://files.pythonhosted.org/packages/6f/40/0655892c245d8fbe6bca6d673ab5927e5c3ab7be143de40b52289a0663bc/langchain_core-1.2.6-py3-none-any.whl", hash = "sha256:aa6ed954b4b1f4504937fe75fdf674317027e9a91ba7a97558b0de3dc8004e34", size = 489096, upload-time = "2026-01-02T21:35:43.391Z" },
240
+ { url = "https://files.pythonhosted.org/packages/6e/6f/34a9fba14d191a67f7e2ee3dbce3e9b86d2fa7310e2c7f2c713583481bd2/langchain_core-1.2.7-py3-none-any.whl", hash = "sha256:452f4fef7a3d883357b22600788d37e3d8854ef29da345b7ac7099f33c31828b", size = 490232, upload-time = "2026-01-09T17:44:24.236Z" },
241
241
  ]
242
242
 
243
243
  [[package]]
244
244
  name = "langgraph"
245
- version = "1.0.5"
245
+ version = "1.0.6"
246
246
  source = { registry = "https://pypi.org/simple" }
247
247
  dependencies = [
248
248
  { name = "langchain-core" },
@@ -252,22 +252,22 @@ dependencies = [
252
252
  { name = "pydantic" },
253
253
  { name = "xxhash" },
254
254
  ]
255
- sdist = { url = "https://files.pythonhosted.org/packages/7d/47/28f4d4d33d88f69de26f7a54065961ac0c662cec2479b36a2db081ef5cb6/langgraph-1.0.5.tar.gz", hash = "sha256:7f6ae59622386b60fe9fa0ad4c53f42016b668455ed604329e7dc7904adbf3f8", size = 493969, upload-time = "2025-12-12T23:05:48.224Z" }
255
+ sdist = { url = "https://files.pythonhosted.org/packages/c2/9c/dac99ab1732e9fb2d3b673482ac28f02bee222c0319a3b8f8f73d90727e6/langgraph-1.0.6.tar.gz", hash = "sha256:dd8e754c76d34a07485308d7117221acf63990e7de8f46ddf5fe256b0a22e6c5", size = 495092, upload-time = "2026-01-12T20:33:30.778Z" }
256
256
  wheels = [
257
- { url = "https://files.pythonhosted.org/packages/23/1b/e318ee76e42d28f515d87356ac5bd7a7acc8bad3b8f54ee377bef62e1cbf/langgraph-1.0.5-py3-none-any.whl", hash = "sha256:b4cfd173dca3c389735b47228ad8b295e6f7b3df779aba3a1e0c23871f81281e", size = 157056, upload-time = "2025-12-12T23:05:46.499Z" },
257
+ { url = "https://files.pythonhosted.org/packages/10/45/9960747781416bed4e531ed0c6b2f2c739bc7b5397d8e92155463735a40e/langgraph-1.0.6-py3-none-any.whl", hash = "sha256:bcfce190974519c72e29f6e5b17f0023914fd6f936bfab8894083215b271eb89", size = 157356, upload-time = "2026-01-12T20:33:29.191Z" },
258
258
  ]
259
259
 
260
260
  [[package]]
261
261
  name = "langgraph-checkpoint"
262
- version = "3.0.1"
262
+ version = "4.0.0"
263
263
  source = { registry = "https://pypi.org/simple" }
264
264
  dependencies = [
265
265
  { name = "langchain-core" },
266
266
  { name = "ormsgpack" },
267
267
  ]
268
- sdist = { url = "https://files.pythonhosted.org/packages/0f/07/2b1c042fa87d40cf2db5ca27dc4e8dd86f9a0436a10aa4361a8982718ae7/langgraph_checkpoint-3.0.1.tar.gz", hash = "sha256:59222f875f85186a22c494aedc65c4e985a3df27e696e5016ba0b98a5ed2cee0", size = 137785, upload-time = "2025-11-04T21:55:47.774Z" }
268
+ sdist = { url = "https://files.pythonhosted.org/packages/98/76/55a18c59dedf39688d72c4b06af73a5e3ea0d1a01bc867b88fbf0659f203/langgraph_checkpoint-4.0.0.tar.gz", hash = "sha256:814d1bd050fac029476558d8e68d87bce9009a0262d04a2c14b918255954a624", size = 137320, upload-time = "2026-01-12T20:30:26.38Z" }
269
269
  wheels = [
270
- { url = "https://files.pythonhosted.org/packages/48/e3/616e3a7ff737d98c1bbb5700dd62278914e2a9ded09a79a1fa93cf24ce12/langgraph_checkpoint-3.0.1-py3-none-any.whl", hash = "sha256:9b04a8d0edc0474ce4eaf30c5d731cee38f11ddff50a6177eead95b5c4e4220b", size = 46249, upload-time = "2025-11-04T21:55:46.472Z" },
270
+ { url = "https://files.pythonhosted.org/packages/4a/de/ddd53b7032e623f3c7bcdab2b44e8bf635e468f62e10e5ff1946f62c9356/langgraph_checkpoint-4.0.0-py3-none-any.whl", hash = "sha256:3fa9b2635a7c5ac28b338f631abf6a030c3b508b7b9ce17c22611513b589c784", size = 46329, upload-time = "2026-01-12T20:30:25.2Z" },
271
271
  ]
272
272
 
273
273
  [[package]]
@@ -285,15 +285,15 @@ wheels = [
285
285
 
286
286
  [[package]]
287
287
  name = "langgraph-prebuilt"
288
- version = "1.0.5"
288
+ version = "1.0.6"
289
289
  source = { registry = "https://pypi.org/simple" }
290
290
  dependencies = [
291
291
  { name = "langchain-core" },
292
292
  { name = "langgraph-checkpoint" },
293
293
  ]
294
- sdist = { url = "https://files.pythonhosted.org/packages/46/f9/54f8891b32159e4542236817aea2ee83de0de18bce28e9bdba08c7f93001/langgraph_prebuilt-1.0.5.tar.gz", hash = "sha256:85802675ad778cc7240fd02d47db1e0b59c0c86d8369447d77ce47623845db2d", size = 144453, upload-time = "2025-11-20T16:47:39.23Z" }
294
+ sdist = { url = "https://files.pythonhosted.org/packages/3c/f5/8c75dace0d729561dce2966e630c5e312193df7e5df41a7e10cd7378c3a7/langgraph_prebuilt-1.0.6.tar.gz", hash = "sha256:c5f6cf0f5a0ac47643d2e26ae6faa38cb28885ecde67911190df9e30c4f72361", size = 162623, upload-time = "2026-01-12T20:31:28.425Z" }
295
295
  wheels = [
296
- { url = "https://files.pythonhosted.org/packages/87/5e/aeba4a5b39fe6e874e0dd003a82da71c7153e671312671a8dacc5cb7c1af/langgraph_prebuilt-1.0.5-py3-none-any.whl", hash = "sha256:22369563e1848862ace53fbc11b027c28dd04a9ac39314633bb95f2a7e258496", size = 35072, upload-time = "2025-11-20T16:47:38.187Z" },
296
+ { url = "https://files.pythonhosted.org/packages/26/6c/4045822b0630cfc0f8624c4499ceaf90644142143c063a8dc385a7424fc3/langgraph_prebuilt-1.0.6-py3-none-any.whl", hash = "sha256:9fdc35048ff4ac985a55bd2a019a86d45b8184551504aff6780d096c678b39ae", size = 35322, upload-time = "2026-01-12T20:31:27.161Z" },
297
297
  ]
298
298
 
299
299
  [[package]]
@@ -342,20 +342,20 @@ dev = [
342
342
 
343
343
  [[package]]
344
344
  name = "langgraph-sdk"
345
- version = "0.3.1"
345
+ version = "0.3.3"
346
346
  source = { registry = "https://pypi.org/simple" }
347
347
  dependencies = [
348
348
  { name = "httpx" },
349
349
  { name = "orjson" },
350
350
  ]
351
- sdist = { url = "https://files.pythonhosted.org/packages/a9/d3/b6be0b0aba2a53a8920a2b0b4328a83121ec03eea9952e576d06a4182f6f/langgraph_sdk-0.3.1.tar.gz", hash = "sha256:f6dadfd2444eeff3e01405a9005c95fb3a028d4bd954ebec80ea6150084f92bb", size = 130312, upload-time = "2025-12-18T22:11:47.42Z" }
351
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/0f/ed0634c222eed48a31ba48eab6881f94ad690d65e44fe7ca838240a260c1/langgraph_sdk-0.3.3.tar.gz", hash = "sha256:c34c3dce3b6848755eb61f0c94369d1ba04aceeb1b76015db1ea7362c544fb26", size = 130589, upload-time = "2026-01-13T00:30:43.894Z" }
352
352
  wheels = [
353
- { url = "https://files.pythonhosted.org/packages/ab/fe/0c1c9c01a154eba62b20b02fabe811fd94a2b810061ae9e4d8462b8cf85a/langgraph_sdk-0.3.1-py3-none-any.whl", hash = "sha256:0b856923bfd20bf3441ce9d03bef488aa333fb610e972618799a9d584436acad", size = 66517, upload-time = "2025-12-18T22:11:46.625Z" },
353
+ { url = "https://files.pythonhosted.org/packages/6e/be/4ad511bacfdd854afb12974f407cb30010dceb982dc20c55491867b34526/langgraph_sdk-0.3.3-py3-none-any.whl", hash = "sha256:a52ebaf09d91143e55378bb2d0b033ed98f57f48c9ad35c8f81493b88705fc7b", size = 67021, upload-time = "2026-01-13T00:30:42.264Z" },
354
354
  ]
355
355
 
356
356
  [[package]]
357
357
  name = "langsmith"
358
- version = "0.6.0"
358
+ version = "0.6.3"
359
359
  source = { registry = "https://pypi.org/simple" }
360
360
  dependencies = [
361
361
  { name = "httpx" },
@@ -367,9 +367,9 @@ dependencies = [
367
367
  { name = "uuid-utils" },
368
368
  { name = "zstandard" },
369
369
  ]
370
- sdist = { url = "https://files.pythonhosted.org/packages/5f/48/fb62df712cfd77804999f3bc08e3cba33ecb81064dd2973dd67cd68eaf93/langsmith-0.6.0.tar.gz", hash = "sha256:b60f1785aed4dac5e01f24db01aa18fa1af258bad4531e045e739438daa3f8c2", size = 883012, upload-time = "2026-01-02T18:42:13.721Z" }
370
+ sdist = { url = "https://files.pythonhosted.org/packages/da/02/ac91c812238cd232ff3270c253eea31b28253fdeb28df61571932cb26e88/langsmith-0.6.3.tar.gz", hash = "sha256:33246769c0bb24e2c17e0c34bb21931084437613cd37faf83bd0978a297b826f", size = 1739709, upload-time = "2026-01-14T19:26:23.529Z" }
371
371
  wheels = [
372
- { url = "https://files.pythonhosted.org/packages/10/c6/322df2c18ab462712c968415fb31779ed3e1fd1976357fd78f31f51b2632/langsmith-0.6.0-py3-none-any.whl", hash = "sha256:f7570175aed705b1f4c4dae724c07980a737b8b565252444d11394dda9931e8c", size = 283280, upload-time = "2026-01-02T18:42:11.966Z" },
372
+ { url = "https://files.pythonhosted.org/packages/ff/11/22a56b615f1ca84f65fda68b1a53b6e2765f2bdb1c6d885793430a664bfe/langsmith-0.6.3-py3-none-any.whl", hash = "sha256:44fdf8084165513e6bede9dda715e7b460b1b3f57ac69f2ca3f03afa911233ec", size = 282991, upload-time = "2026-01-14T19:26:21.882Z" },
373
373
  ]
374
374
 
375
375
  [[package]]
@@ -754,14 +754,14 @@ wheels = [
754
754
 
755
755
  [[package]]
756
756
  name = "pytest-watcher"
757
- version = "0.6.2"
757
+ version = "0.6.3"
758
758
  source = { registry = "https://pypi.org/simple" }
759
759
  dependencies = [
760
760
  { name = "watchdog" },
761
761
  ]
762
- sdist = { url = "https://files.pythonhosted.org/packages/14/e9/1d8fbe021f75b7f74a544b27bf893da44b2fe84199e2215fb648525b8f58/pytest_watcher-0.6.2.tar.gz", hash = "sha256:41f1fd244ee210d9399c57107692680ca02e519e3218be57d9b1c7a194dc87b1", size = 600866, upload-time = "2025-12-28T15:33:59.443Z" }
762
+ sdist = { url = "https://files.pythonhosted.org/packages/e6/d2/80606077b7fa8784417687f494ff801d7ab817d9a17fc94305811d5919bb/pytest_watcher-0.6.3.tar.gz", hash = "sha256:842dc904264df0ad2d5264153a66bb452fccfa46598cd6e0a5ef1d19afed9b13", size = 601878, upload-time = "2026-01-10T23:28:18.805Z" }
763
763
  wheels = [
764
- { url = "https://files.pythonhosted.org/packages/c4/3b/fd2bedafb1f4140b00230a4f46c50cebd65661b12f31d8201d24c9487564/pytest_watcher-0.6.2-py3-none-any.whl", hash = "sha256:c8cdf38db7b61f28a6657cf84ffbe856330e6fe619055000f27e87b8dc083c30", size = 11566, upload-time = "2025-12-28T15:33:58.257Z" },
764
+ { url = "https://files.pythonhosted.org/packages/fc/3f/172d73600ad2771774cda108efb813fc724fc345e5240a81a1085f1ade5d/pytest_watcher-0.6.3-py3-none-any.whl", hash = "sha256:83e7748c933087e8276edb6078663e6afa9926434b4fd8b85cf6b32b1d5bec89", size = 12431, upload-time = "2026-01-10T23:28:17.64Z" },
765
765
  ]
766
766
 
767
767
  [[package]]
@@ -848,28 +848,28 @@ wheels = [
848
848
 
849
849
  [[package]]
850
850
  name = "ruff"
851
- version = "0.14.10"
851
+ version = "0.14.11"
852
852
  source = { registry = "https://pypi.org/simple" }
853
- sdist = { url = "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4", size = 5859763, upload-time = "2025-12-18T19:28:57.98Z" }
853
+ sdist = { url = "https://files.pythonhosted.org/packages/d4/77/9a7fe084d268f8855d493e5031ea03fa0af8cc05887f638bf1c4e3363eb8/ruff-0.14.11.tar.gz", hash = "sha256:f6dc463bfa5c07a59b1ff2c3b9767373e541346ea105503b4c0369c520a66958", size = 5993417, upload-time = "2026-01-08T19:11:58.322Z" }
854
854
  wheels = [
855
- { url = "https://files.pythonhosted.org/packages/60/01/933704d69f3f05ee16ef11406b78881733c186fe14b6a46b05cfcaf6d3b2/ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49", size = 13527080, upload-time = "2025-12-18T19:29:25.642Z" },
856
- { url = "https://files.pythonhosted.org/packages/df/58/a0349197a7dfa603ffb7f5b0470391efa79ddc327c1e29c4851e85b09cc5/ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f", size = 13797320, upload-time = "2025-12-18T19:29:02.571Z" },
857
- { url = "https://files.pythonhosted.org/packages/7b/82/36be59f00a6082e38c23536df4e71cdbc6af8d7c707eade97fcad5c98235/ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d", size = 12918434, upload-time = "2025-12-18T19:28:51.202Z" },
858
- { url = "https://files.pythonhosted.org/packages/a6/00/45c62a7f7e34da92a25804f813ebe05c88aa9e0c25e5cb5a7d23dd7450e3/ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77", size = 13371961, upload-time = "2025-12-18T19:29:04.991Z" },
859
- { url = "https://files.pythonhosted.org/packages/40/31/a5906d60f0405f7e57045a70f2d57084a93ca7425f22e1d66904769d1628/ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a", size = 13275629, upload-time = "2025-12-18T19:29:21.381Z" },
860
- { url = "https://files.pythonhosted.org/packages/3e/60/61c0087df21894cf9d928dc04bcd4fb10e8b2e8dca7b1a276ba2155b2002/ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f", size = 14029234, upload-time = "2025-12-18T19:29:00.132Z" },
861
- { url = "https://files.pythonhosted.org/packages/44/84/77d911bee3b92348b6e5dab5a0c898d87084ea03ac5dc708f46d88407def/ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935", size = 15449890, upload-time = "2025-12-18T19:28:53.573Z" },
862
- { url = "https://files.pythonhosted.org/packages/e9/36/480206eaefa24a7ec321582dda580443a8f0671fdbf6b1c80e9c3e93a16a/ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e", size = 15123172, upload-time = "2025-12-18T19:29:23.453Z" },
863
- { url = "https://files.pythonhosted.org/packages/5c/38/68e414156015ba80cef5473d57919d27dfb62ec804b96180bafdeaf0e090/ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d", size = 14460260, upload-time = "2025-12-18T19:29:27.808Z" },
864
- { url = "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f", size = 14229978, upload-time = "2025-12-18T19:29:11.32Z" },
865
- { url = "https://files.pythonhosted.org/packages/51/eb/e8dd1dd6e05b9e695aa9dd420f4577debdd0f87a5ff2fedda33c09e9be8c/ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f", size = 14338036, upload-time = "2025-12-18T19:29:09.184Z" },
866
- { url = "https://files.pythonhosted.org/packages/6a/12/f3e3a505db7c19303b70af370d137795fcfec136d670d5de5391e295c134/ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d", size = 13264051, upload-time = "2025-12-18T19:29:13.431Z" },
867
- { url = "https://files.pythonhosted.org/packages/08/64/8c3a47eaccfef8ac20e0484e68e0772013eb85802f8a9f7603ca751eb166/ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405", size = 13283998, upload-time = "2025-12-18T19:29:06.994Z" },
868
- { url = "https://files.pythonhosted.org/packages/12/84/534a5506f4074e5cc0529e5cd96cfc01bb480e460c7edf5af70d2bcae55e/ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60", size = 13601891, upload-time = "2025-12-18T19:28:55.811Z" },
869
- { url = "https://files.pythonhosted.org/packages/0d/1e/14c916087d8598917dbad9b2921d340f7884824ad6e9c55de948a93b106d/ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830", size = 14336660, upload-time = "2025-12-18T19:29:16.531Z" },
870
- { url = "https://files.pythonhosted.org/packages/f2/1c/d7b67ab43f30013b47c12b42d1acd354c195351a3f7a1d67f59e54227ede/ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6", size = 13196187, upload-time = "2025-12-18T19:29:19.006Z" },
871
- { url = "https://files.pythonhosted.org/packages/fb/9c/896c862e13886fae2af961bef3e6312db9ebc6adc2b156fe95e615dee8c1/ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154", size = 14661283, upload-time = "2025-12-18T19:29:30.16Z" },
872
- { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" },
855
+ { url = "https://files.pythonhosted.org/packages/f0/a6/a4c40a5aaa7e331f245d2dc1ac8ece306681f52b636b40ef87c88b9f7afd/ruff-0.14.11-py3-none-linux_armv6l.whl", hash = "sha256:f6ff2d95cbd335841a7217bdfd9c1d2e44eac2c584197ab1385579d55ff8830e", size = 12951208, upload-time = "2026-01-08T19:12:09.218Z" },
856
+ { url = "https://files.pythonhosted.org/packages/5c/5c/360a35cb7204b328b685d3129c08aca24765ff92b5a7efedbdd6c150d555/ruff-0.14.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f6eb5c1c8033680f4172ea9c8d3706c156223010b8b97b05e82c59bdc774ee6", size = 13330075, upload-time = "2026-01-08T19:12:02.549Z" },
857
+ { url = "https://files.pythonhosted.org/packages/1b/9e/0cc2f1be7a7d33cae541824cf3f95b4ff40d03557b575912b5b70273c9ec/ruff-0.14.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f2fc34cc896f90080fca01259f96c566f74069a04b25b6205d55379d12a6855e", size = 12257809, upload-time = "2026-01-08T19:12:00.366Z" },
858
+ { url = "https://files.pythonhosted.org/packages/a7/e5/5faab97c15bb75228d9f74637e775d26ac703cc2b4898564c01ab3637c02/ruff-0.14.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53386375001773ae812b43205d6064dae49ff0968774e6befe16a994fc233caa", size = 12678447, upload-time = "2026-01-08T19:12:13.899Z" },
859
+ { url = "https://files.pythonhosted.org/packages/1b/33/e9767f60a2bef779fb5855cab0af76c488e0ce90f7bb7b8a45c8a2ba4178/ruff-0.14.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a697737dce1ca97a0a55b5ff0434ee7205943d4874d638fe3ae66166ff46edbe", size = 12758560, upload-time = "2026-01-08T19:11:42.55Z" },
860
+ { url = "https://files.pythonhosted.org/packages/eb/84/4c6cf627a21462bb5102f7be2a320b084228ff26e105510cd2255ea868e5/ruff-0.14.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6845ca1da8ab81ab1dce755a32ad13f1db72e7fba27c486d5d90d65e04d17b8f", size = 13599296, upload-time = "2026-01-08T19:11:30.371Z" },
861
+ { url = "https://files.pythonhosted.org/packages/88/e1/92b5ed7ea66d849f6157e695dc23d5d6d982bd6aa8d077895652c38a7cae/ruff-0.14.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e36ce2fd31b54065ec6f76cb08d60159e1b32bdf08507862e32f47e6dde8bcbf", size = 15048981, upload-time = "2026-01-08T19:12:04.742Z" },
862
+ { url = "https://files.pythonhosted.org/packages/61/df/c1bd30992615ac17c2fb64b8a7376ca22c04a70555b5d05b8f717163cf9f/ruff-0.14.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590bcc0e2097ecf74e62a5c10a6b71f008ad82eb97b0a0079e85defe19fe74d9", size = 14633183, upload-time = "2026-01-08T19:11:40.069Z" },
863
+ { url = "https://files.pythonhosted.org/packages/04/e9/fe552902f25013dd28a5428a42347d9ad20c4b534834a325a28305747d64/ruff-0.14.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53fe71125fc158210d57fe4da26e622c9c294022988d08d9347ec1cf782adafe", size = 14050453, upload-time = "2026-01-08T19:11:37.555Z" },
864
+ { url = "https://files.pythonhosted.org/packages/ae/93/f36d89fa021543187f98991609ce6e47e24f35f008dfe1af01379d248a41/ruff-0.14.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a35c9da08562f1598ded8470fcfef2afb5cf881996e6c0a502ceb61f4bc9c8a3", size = 13757889, upload-time = "2026-01-08T19:12:07.094Z" },
865
+ { url = "https://files.pythonhosted.org/packages/b7/9f/c7fb6ecf554f28709a6a1f2a7f74750d400979e8cd47ed29feeaa1bd4db8/ruff-0.14.11-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0f3727189a52179393ecf92ec7057c2210203e6af2676f08d92140d3e1ee72c1", size = 13955832, upload-time = "2026-01-08T19:11:55.064Z" },
866
+ { url = "https://files.pythonhosted.org/packages/db/a0/153315310f250f76900a98278cf878c64dfb6d044e184491dd3289796734/ruff-0.14.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eb09f849bd37147a789b85995ff734a6c4a095bed5fd1608c4f56afc3634cde2", size = 12586522, upload-time = "2026-01-08T19:11:35.356Z" },
867
+ { url = "https://files.pythonhosted.org/packages/2f/2b/a73a2b6e6d2df1d74bf2b78098be1572191e54bec0e59e29382d13c3adc5/ruff-0.14.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c61782543c1231bf71041461c1f28c64b961d457d0f238ac388e2ab173d7ecb7", size = 12724637, upload-time = "2026-01-08T19:11:47.796Z" },
868
+ { url = "https://files.pythonhosted.org/packages/f0/41/09100590320394401cd3c48fc718a8ba71c7ddb1ffd07e0ad6576b3a3df2/ruff-0.14.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82ff352ea68fb6766140381748e1f67f83c39860b6446966cff48a315c3e2491", size = 13145837, upload-time = "2026-01-08T19:11:32.87Z" },
869
+ { url = "https://files.pythonhosted.org/packages/3b/d8/e035db859d1d3edf909381eb8ff3e89a672d6572e9454093538fe6f164b0/ruff-0.14.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:728e56879df4ca5b62a9dde2dd0eb0edda2a55160c0ea28c4025f18c03f86984", size = 13850469, upload-time = "2026-01-08T19:12:11.694Z" },
870
+ { url = "https://files.pythonhosted.org/packages/4e/02/bb3ff8b6e6d02ce9e3740f4c17dfbbfb55f34c789c139e9cd91985f356c7/ruff-0.14.11-py3-none-win32.whl", hash = "sha256:337c5dd11f16ee52ae217757d9b82a26400be7efac883e9e852646f1557ed841", size = 12851094, upload-time = "2026-01-08T19:11:45.163Z" },
871
+ { url = "https://files.pythonhosted.org/packages/58/f1/90ddc533918d3a2ad628bc3044cdfc094949e6d4b929220c3f0eb8a1c998/ruff-0.14.11-py3-none-win_amd64.whl", hash = "sha256:f981cea63d08456b2c070e64b79cb62f951aa1305282974d4d5216e6e0178ae6", size = 14001379, upload-time = "2026-01-08T19:11:52.591Z" },
872
+ { url = "https://files.pythonhosted.org/packages/c4/1c/1dbe51782c0e1e9cfce1d1004752672d2d4629ea46945d19d731ad772b3b/ruff-0.14.11-py3-none-win_arm64.whl", hash = "sha256:649fb6c9edd7f751db276ef42df1f3df41c38d67d199570ae2a7bd6cbc3590f0", size = 12938644, upload-time = "2026-01-08T19:11:50.027Z" },
873
873
  ]
874
874
 
875
875
  [[package]]
@@ -887,15 +887,15 @@ wheels = [
887
887
 
888
888
  [[package]]
889
889
  name = "starlette"
890
- version = "0.50.0"
890
+ version = "0.51.0"
891
891
  source = { registry = "https://pypi.org/simple" }
892
892
  dependencies = [
893
893
  { name = "anyio" },
894
894
  { name = "typing-extensions", marker = "python_full_version < '3.13'" },
895
895
  ]
896
- sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" }
896
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/65/5a1fadcc40c5fdc7df421a7506b79633af8f5d5e3a95c3e72acacec644b9/starlette-0.51.0.tar.gz", hash = "sha256:4c4fda9b1bc67f84037d3d14a5112e523509c369d9d47b111b2f984b0cc5ba6c", size = 2647658, upload-time = "2026-01-10T20:23:15.043Z" }
897
897
  wheels = [
898
- { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" },
898
+ { url = "https://files.pythonhosted.org/packages/18/c4/09985a03dba389d4fe16a9014147a7b02fa76ef3519bf5846462a485876d/starlette-0.51.0-py3-none-any.whl", hash = "sha256:fb460a3d6fd3c958d729fdd96aee297f89a51b0181f16401fe8fd4cb6129165d", size = 74133, upload-time = "2026-01-10T20:23:13.445Z" },
899
899
  ]
900
900
 
901
901
  [[package]]
@@ -939,40 +939,40 @@ wheels = [
939
939
 
940
940
  [[package]]
941
941
  name = "urllib3"
942
- version = "2.6.2"
942
+ version = "2.6.3"
943
943
  source = { registry = "https://pypi.org/simple" }
944
- sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" }
944
+ sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
945
945
  wheels = [
946
- { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" },
946
+ { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
947
947
  ]
948
948
 
949
949
  [[package]]
950
950
  name = "uuid-utils"
951
- version = "0.12.0"
951
+ version = "0.13.0"
952
952
  source = { registry = "https://pypi.org/simple" }
953
- sdist = { url = "https://files.pythonhosted.org/packages/0b/0e/512fb221e4970c2f75ca9dae412d320b7d9ddc9f2b15e04ea8e44710396c/uuid_utils-0.12.0.tar.gz", hash = "sha256:252bd3d311b5d6b7f5dfce7a5857e27bb4458f222586bb439463231e5a9cbd64", size = 20889, upload-time = "2025-12-01T17:29:55.494Z" }
953
+ sdist = { url = "https://files.pythonhosted.org/packages/fe/8a/17b11768dcb473d3a255c02ffdd94fbd1b345c906efea0a39124dcbaed52/uuid_utils-0.13.0.tar.gz", hash = "sha256:4c17df6427a9e23a4cd7fb9ee1efb53b8abb078660b9bdb2524ca8595022dfe1", size = 21921, upload-time = "2026-01-08T15:48:10.841Z" }
954
954
  wheels = [
955
- { url = "https://files.pythonhosted.org/packages/8a/43/de5cd49a57b6293b911b6a9a62fc03e55db9f964da7d5882d9edbee1e9d2/uuid_utils-0.12.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3b9b30707659292f207b98f294b0e081f6d77e1fbc760ba5b41331a39045f514", size = 603197, upload-time = "2025-12-01T17:29:30.104Z" },
956
- { url = "https://files.pythonhosted.org/packages/02/fa/5fd1d8c9234e44f0c223910808cde0de43bb69f7df1349e49b1afa7f2baa/uuid_utils-0.12.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:add3d820c7ec14ed37317375bea30249699c5d08ff4ae4dbee9fc9bce3bfbf65", size = 305168, upload-time = "2025-12-01T17:29:31.384Z" },
957
- { url = "https://files.pythonhosted.org/packages/c8/c6/8633ac9942bf9dc97a897b5154e5dcffa58816ec4dd780b3b12b559ff05c/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8fce83ecb3b16af29c7809669056c4b6e7cc912cab8c6d07361645de12dd79", size = 340580, upload-time = "2025-12-01T17:29:32.362Z" },
958
- { url = "https://files.pythonhosted.org/packages/f3/88/8a61307b04b4da1c576373003e6d857a04dade52ab035151d62cb84d5cb5/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec921769afcb905035d785582b0791d02304a7850fbd6ce924c1a8976380dfc6", size = 346771, upload-time = "2025-12-01T17:29:33.708Z" },
959
- { url = "https://files.pythonhosted.org/packages/1c/fb/aab2dcf94b991e62aa167457c7825b9b01055b884b888af926562864398c/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f3b060330f5899a92d5c723547dc6a95adef42433e9748f14c66859a7396664", size = 474781, upload-time = "2025-12-01T17:29:35.237Z" },
960
- { url = "https://files.pythonhosted.org/packages/5a/7a/dbd5e49c91d6c86dba57158bbfa0e559e1ddf377bb46dcfd58aea4f0d567/uuid_utils-0.12.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:908dfef7f0bfcf98d406e5dc570c25d2f2473e49b376de41792b6e96c1d5d291", size = 343685, upload-time = "2025-12-01T17:29:36.677Z" },
961
- { url = "https://files.pythonhosted.org/packages/1a/19/8c4b1d9f450159733b8be421a4e1fb03533709b80ed3546800102d085572/uuid_utils-0.12.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c6a24148926bd0ca63e8a2dabf4cc9dc329a62325b3ad6578ecd60fbf926506", size = 366482, upload-time = "2025-12-01T17:29:37.979Z" },
962
- { url = "https://files.pythonhosted.org/packages/82/43/c79a6e45687647f80a159c8ba34346f287b065452cc419d07d2212d38420/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:64a91e632669f059ef605f1771d28490b1d310c26198e46f754e8846dddf12f4", size = 523132, upload-time = "2025-12-01T17:29:39.293Z" },
963
- { url = "https://files.pythonhosted.org/packages/5a/a2/b2d75a621260a40c438aa88593827dfea596d18316520a99e839f7a5fb9d/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:93c082212470bb4603ca3975916c205a9d7ef1443c0acde8fbd1e0f5b36673c7", size = 614218, upload-time = "2025-12-01T17:29:40.315Z" },
964
- { url = "https://files.pythonhosted.org/packages/13/6b/ba071101626edd5a6dabf8525c9a1537ff3d885dbc210540574a03901fef/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:431b1fb7283ba974811b22abd365f2726f8f821ab33f0f715be389640e18d039", size = 546241, upload-time = "2025-12-01T17:29:41.656Z" },
965
- { url = "https://files.pythonhosted.org/packages/01/12/9a942b81c0923268e6d85bf98d8f0a61fcbcd5e432fef94fdf4ce2ef8748/uuid_utils-0.12.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd7838c40149100299fa37cbd8bab5ee382372e8e65a148002a37d380df7c8", size = 511842, upload-time = "2025-12-01T17:29:43.107Z" },
966
- { url = "https://files.pythonhosted.org/packages/a9/a7/c326f5163dd48b79368b87d8a05f5da4668dd228a3f5ca9d79d5fee2fc40/uuid_utils-0.12.0-cp39-abi3-win32.whl", hash = "sha256:487f17c0fee6cbc1d8b90fe811874174a9b1b5683bf2251549e302906a50fed3", size = 179088, upload-time = "2025-12-01T17:29:44.492Z" },
967
- { url = "https://files.pythonhosted.org/packages/38/92/41c8734dd97213ee1d5ae435cf4499705dc4f2751e3b957fd12376f61784/uuid_utils-0.12.0-cp39-abi3-win_amd64.whl", hash = "sha256:9598e7c9da40357ae8fffc5d6938b1a7017f09a1acbcc95e14af8c65d48c655a", size = 183003, upload-time = "2025-12-01T17:29:45.47Z" },
968
- { url = "https://files.pythonhosted.org/packages/c9/f9/52ab0359618987331a1f739af837d26168a4b16281c9c3ab46519940c628/uuid_utils-0.12.0-cp39-abi3-win_arm64.whl", hash = "sha256:c9bea7c5b2aa6f57937ebebeee4d4ef2baad10f86f1b97b58a3f6f34c14b4e84", size = 182975, upload-time = "2025-12-01T17:29:46.444Z" },
969
- { url = "https://files.pythonhosted.org/packages/ef/f7/6c55b7722cede3b424df02ed5cddb25c19543abda2f95fa4cfc34a892ae5/uuid_utils-0.12.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e2209d361f2996966ab7114f49919eb6aaeabc6041672abbbbf4fdbb8ec1acc0", size = 593065, upload-time = "2025-12-01T17:29:47.507Z" },
970
- { url = "https://files.pythonhosted.org/packages/b8/40/ce5fe8e9137dbd5570e0016c2584fca43ad81b11a1cef809a1a1b4952ab7/uuid_utils-0.12.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d9636bcdbd6cfcad2b549c352b669412d0d1eb09be72044a2f13e498974863cd", size = 300047, upload-time = "2025-12-01T17:29:48.596Z" },
971
- { url = "https://files.pythonhosted.org/packages/fb/9b/31c5d0736d7b118f302c50214e581f40e904305d8872eb0f0c921d50e138/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cd8543a3419251fb78e703ce3b15fdfafe1b7c542cf40caf0775e01db7e7674", size = 335165, upload-time = "2025-12-01T17:29:49.755Z" },
972
- { url = "https://files.pythonhosted.org/packages/f6/5c/d80b4d08691c9d7446d0ad58fd41503081a662cfd2c7640faf68c64d8098/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e98db2d8977c052cb307ae1cb5cc37a21715e8d415dbc65863b039397495a013", size = 341437, upload-time = "2025-12-01T17:29:51.112Z" },
973
- { url = "https://files.pythonhosted.org/packages/f6/b3/9dccdc6f3c22f6ef5bd381ae559173f8a1ae185ae89ed1f39f499d9d8b02/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8f2bdf5e4ffeb259ef6d15edae92aed60a1d6f07cbfab465d836f6b12b48da8", size = 469123, upload-time = "2025-12-01T17:29:52.389Z" },
974
- { url = "https://files.pythonhosted.org/packages/fd/90/6c35ef65fbc49f8189729839b793a4a74a7dd8c5aa5eb56caa93f8c97732/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c3ec53c0cb15e1835870c139317cc5ec06e35aa22843e3ed7d9c74f23f23898", size = 335892, upload-time = "2025-12-01T17:29:53.44Z" },
975
- { url = "https://files.pythonhosted.org/packages/6b/c7/e3f3ce05c5af2bf86a0938d22165affe635f4dcbfd5687b1dacc042d3e0e/uuid_utils-0.12.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84e5c0eba209356f7f389946a3a47b2cc2effd711b3fc7c7f155ad9f7d45e8a3", size = 360693, upload-time = "2025-12-01T17:29:54.558Z" },
955
+ { url = "https://files.pythonhosted.org/packages/85/b8/d40848ca22781f206c60a1885fc737d2640392bd6b5792d455525accd89c/uuid_utils-0.13.0-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:83628283e977fb212e756bc055df8fdd2f9f589a2e539ba1abe755b8ce8df7a4", size = 602130, upload-time = "2026-01-08T15:47:34.877Z" },
956
+ { url = "https://files.pythonhosted.org/packages/40/b9/00a944b8096632ea12638181f8e294abcde3e3b8b5e29b777f809896f6ae/uuid_utils-0.13.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c47638ed6334ab19d80f73664f153b04bbb04ab8ce4298d10da6a292d4d21c47", size = 304213, upload-time = "2026-01-08T15:47:36.807Z" },
957
+ { url = "https://files.pythonhosted.org/packages/da/d7/07b36c33aef683b81c9afff3ec178d5eb39d325447a68c3c68a62e4abb32/uuid_utils-0.13.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:b276b538c57733ed406948584912da422a604313c71479654848b84b9e19c9b0", size = 340624, upload-time = "2026-01-08T15:47:38.821Z" },
958
+ { url = "https://files.pythonhosted.org/packages/7d/55/fcff2fff02a27866cb1a6614c9df2b3ace721f0a0aab2b7b8f5a7d4e4221/uuid_utils-0.13.0-cp39-abi3-manylinux_2_24_armv7l.whl", hash = "sha256:bdaf2b77e34b199cf04cde28399495fd1ed951de214a4ece1f3919b2f945bb06", size = 346705, upload-time = "2026-01-08T15:47:40.397Z" },
959
+ { url = "https://files.pythonhosted.org/packages/41/48/67438506c2bb8bee1b4b00d7c0b3ff866401b4790849bf591d654d4ea0bc/uuid_utils-0.13.0-cp39-abi3-manylinux_2_24_i686.whl", hash = "sha256:eb2f0baf81e82f9769a7684022dca8f3bf801ca1574a3e94df1876e9d6f9271e", size = 366023, upload-time = "2026-01-08T15:47:42.662Z" },
960
+ { url = "https://files.pythonhosted.org/packages/8b/d7/2d91ce17f62fd764d593430de296b70843cc25229c772453f7261de9e6a8/uuid_utils-0.13.0-cp39-abi3-manylinux_2_24_ppc64le.whl", hash = "sha256:6be6c4d11275f5cc402a4fdba6c2b1ce45fd3d99bb78716cd1cc2cbf6802b2ce", size = 471149, upload-time = "2026-01-08T15:47:44.963Z" },
961
+ { url = "https://files.pythonhosted.org/packages/2e/9a/aa0756186073ba84daf5704c150d41ede10eb3185d510e02532e2071550e/uuid_utils-0.13.0-cp39-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:77621cf6ceca7f42173a642a01c01c216f9eaec3b7b65d093d2d6a433ca0a83d", size = 342130, upload-time = "2026-01-08T15:47:46.331Z" },
962
+ { url = "https://files.pythonhosted.org/packages/74/b4/3191789f4dc3bed59d79cec90559821756297a25d7dc34d1bf7781577a75/uuid_utils-0.13.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9a5a9eb06c2bb86dd876cd7b2fe927fc8543d14c90d971581db6ffda4a02526f", size = 524128, upload-time = "2026-01-08T15:47:47.628Z" },
963
+ { url = "https://files.pythonhosted.org/packages/b2/30/29839210a8fff9fc219bfa7c8d8cd115324e92618cba0cda090d54d3d321/uuid_utils-0.13.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:775347c6110fb71360df17aac74132d8d47c1dbe71233ac98197fc872a791fd2", size = 615872, upload-time = "2026-01-08T15:47:50.61Z" },
964
+ { url = "https://files.pythonhosted.org/packages/99/ed/15000c96a8bd8f5fd8efd622109bf52549ea0b366f8ce71c45580fa55878/uuid_utils-0.13.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf95f6370ad1a0910ee7b5ad5228fd19c4ae32fe3627389006adaf519408c41e", size = 581023, upload-time = "2026-01-08T15:47:52.776Z" },
965
+ { url = "https://files.pythonhosted.org/packages/67/c8/3f809fa2dc2ca4bd331c792a3c7d3e45ae2b709d85847a12b8b27d1d5f19/uuid_utils-0.13.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a88e23e0b2f4203fefe2ccbca5736ee06fcad10e61b5e7e39c8d7904bc13300", size = 546715, upload-time = "2026-01-08T15:47:54.415Z" },
966
+ { url = "https://files.pythonhosted.org/packages/f5/80/4f7c7efd734d1494397c781bd3d421688e9c187ae836e3174625b1ddf8b0/uuid_utils-0.13.0-cp39-abi3-win32.whl", hash = "sha256:3e4f2cc54e6a99c0551158100ead528479ad2596847478cbad624977064ffce3", size = 177650, upload-time = "2026-01-08T15:47:55.679Z" },
967
+ { url = "https://files.pythonhosted.org/packages/6c/94/d05ab68622e66ad787a241dfe5ccc649b3af09f30eae977b9ee8f7046aaa/uuid_utils-0.13.0-cp39-abi3-win_amd64.whl", hash = "sha256:046cb2756e1597b3de22d24851b769913e192135830486a0a70bf41327f0360c", size = 183211, upload-time = "2026-01-08T15:47:57.604Z" },
968
+ { url = "https://files.pythonhosted.org/packages/69/37/674b3ce25cd715b831ea8ebbd828b74c40159f04c95d1bb963b2c876fe79/uuid_utils-0.13.0-cp39-abi3-win_arm64.whl", hash = "sha256:5447a680df6ef8a5a353976aaf4c97cc3a3a22b1ee13671c44227b921e3ae2a9", size = 183518, upload-time = "2026-01-08T15:47:59.148Z" },
969
+ { url = "https://files.pythonhosted.org/packages/99/fa/1d92de9538463859228e68db679b766fd300770c9a2db849dcba0c0c5a57/uuid_utils-0.13.0-pp311-pypy311_pp73-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e5182e2d95f38e65f2e5bce90648ef56987443da13e145afcd747e584f9bc69c", size = 587641, upload-time = "2026-01-08T15:48:00.433Z" },
970
+ { url = "https://files.pythonhosted.org/packages/ca/07/6bd9e6f5367e38c2ee7178ad882d2bd1b0d17c5393974b09ab027a215eba/uuid_utils-0.13.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e3909a8a1fbd79d7c8bdc874eeb83e23ccb7a7cb0aa821a49596cc96c0cce84b", size = 298273, upload-time = "2026-01-08T15:48:02.063Z" },
971
+ { url = "https://files.pythonhosted.org/packages/dc/14/7061b868a8a6799c8df83768a23f313d4e22075069f01ee3c28fa82aa2c6/uuid_utils-0.13.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl", hash = "sha256:5dc4c9f749bd2511b8dcbf0891e658d7d86880022963db050722ad7b502b5e22", size = 333618, upload-time = "2026-01-08T15:48:03.503Z" },
972
+ { url = "https://files.pythonhosted.org/packages/bc/f1/f48c3c9c343c9071ade5f355403e344d817412d9cf379a2d04b181282e74/uuid_utils-0.13.0-pp311-pypy311_pp73-manylinux_2_24_armv7l.whl", hash = "sha256:516adf07f5b2cdb88d50f489c702b5f1a75ae8b2639bfd254f4192d5f7ee261f", size = 339104, upload-time = "2026-01-08T15:48:05.02Z" },
973
+ { url = "https://files.pythonhosted.org/packages/47/22/8e3142b4baffee77ce533fe956446d3699ec42f1d5252911208cbef4501e/uuid_utils-0.13.0-pp311-pypy311_pp73-manylinux_2_24_i686.whl", hash = "sha256:aeee3bd89e8de6184a3ab778ce19f5ce9ad32849d1be549516e0ddb257562d8d", size = 359503, upload-time = "2026-01-08T15:48:06.347Z" },
974
+ { url = "https://files.pythonhosted.org/packages/bd/1a/756f1f9e31b15019c87cd2becb1c596351c50967cd143443da38df8818d1/uuid_utils-0.13.0-pp311-pypy311_pp73-manylinux_2_24_ppc64le.whl", hash = "sha256:97985256c2e59b7caa51f5c8515f64d777328562a9c900ec65e9d627baf72737", size = 467480, upload-time = "2026-01-08T15:48:07.681Z" },
975
+ { url = "https://files.pythonhosted.org/packages/0a/20/a6929e98d9a461ca49e96194a82a1cc3fd5420f3a2f53cbb34fca438549e/uuid_utils-0.13.0-pp311-pypy311_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:b7ccaa20e24c5f60f41a69ef571ed820737f9b0ade4cbeef56aaa8f80f5aa475", size = 333610, upload-time = "2026-01-08T15:48:09.375Z" },
976
976
  ]
977
977
 
978
978
  [[package]]
@@ -1004,14 +1004,14 @@ wheels = [
1004
1004
 
1005
1005
  [[package]]
1006
1006
  name = "werkzeug"
1007
- version = "3.1.4"
1007
+ version = "3.1.5"
1008
1008
  source = { registry = "https://pypi.org/simple" }
1009
1009
  dependencies = [
1010
1010
  { name = "markupsafe" },
1011
1011
  ]
1012
- sdist = { url = "https://files.pythonhosted.org/packages/45/ea/b0f8eeb287f8df9066e56e831c7824ac6bab645dd6c7a8f4b2d767944f9b/werkzeug-3.1.4.tar.gz", hash = "sha256:cd3cd98b1b92dc3b7b3995038826c68097dcb16f9baa63abe35f20eafeb9fe5e", size = 864687, upload-time = "2025-11-29T02:15:22.841Z" }
1012
+ sdist = { url = "https://files.pythonhosted.org/packages/5a/70/1469ef1d3542ae7c2c7b72bd5e3a4e6ee69d7978fa8a3af05a38eca5becf/werkzeug-3.1.5.tar.gz", hash = "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67", size = 864754, upload-time = "2026-01-08T17:49:23.247Z" }
1013
1013
  wheels = [
1014
- { url = "https://files.pythonhosted.org/packages/2f/f9/9e082990c2585c744734f85bec79b5dae5df9c974ffee58fe421652c8e91/werkzeug-3.1.4-py3-none-any.whl", hash = "sha256:2ad50fb9ed09cc3af22c54698351027ace879a0b60a3b5edf5730b2f7d876905", size = 224960, upload-time = "2025-11-29T02:15:21.13Z" },
1014
+ { url = "https://files.pythonhosted.org/packages/ad/e4/8d97cca767bcc1be76d16fb76951608305561c6e056811587f36cb1316a8/werkzeug-3.1.5-py3-none-any.whl", hash = "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", size = 225025, upload-time = "2026-01-08T17:49:21.859Z" },
1015
1015
  ]
1016
1016
 
1017
1017
  [[package]]