langgraph-api 0.14.0.dev8__py3-none-any.whl → 0.14.0.dev10__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.
langgraph_api/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.14.0.dev8"
1
+ __version__ = "0.14.0.dev10"
@@ -488,7 +488,7 @@ def webhooks_validator(cfg: "WebhooksConfig") -> "WebhooksConfig":
488
488
  # Validate allowed_fields if present
489
489
  allowed_fields = cfg.get("allowed_fields")
490
490
  if allowed_fields is not None:
491
- if not isinstance(allowed_fields, list):
491
+ if not isinstance(allowed_fields, (list, set)):
492
492
  raise ValueError(
493
493
  f"webhooks.allowed_fields must be a list of strings. Got: {type(allowed_fields).__name__}"
494
494
  )
@@ -9,10 +9,21 @@ from __future__ import annotations
9
9
  import functools
10
10
  import importlib.util
11
11
  import sys
12
+ from dataclasses import dataclass
12
13
  from typing import TYPE_CHECKING, Any, Literal, get_args
13
14
 
14
15
  import structlog
15
16
 
17
+ try:
18
+ from langgraph_sdk import DecryptResult
19
+ except ImportError: # minimum-deps image predates SDK re-encryption support
20
+
21
+ @dataclass
22
+ class DecryptResult:
23
+ plaintext: Any
24
+ replacement: Any | None = None
25
+
26
+
16
27
  from langgraph_api import timing
17
28
  from langgraph_api.config import LANGGRAPH_ENCRYPTION
18
29
  from langgraph_api.encryption.shared import (
@@ -33,6 +44,10 @@ SUPPORTED_ENCRYPTION_MODELS: frozenset[str] = frozenset(get_args(ModelType))
33
44
  logger = structlog.stdlib.get_logger(__name__)
34
45
 
35
46
 
47
+ def normalize_decrypt_result(result: Any) -> DecryptResult:
48
+ return result if isinstance(result, DecryptResult) else DecryptResult(result)
49
+
50
+
36
51
  @functools.lru_cache(maxsize=1)
37
52
  def get_custom_encryption_instance() -> Encryption | None:
38
53
  """Get the custom (SDK-injected) encryption instance if configured.
@@ -232,7 +247,9 @@ class JsonEncryptionWrapper:
232
247
 
233
248
  return encryptor
234
249
 
235
- def get_json_decryptor(self, model_type: ModelType) -> JsonDecryptor:
250
+ def get_json_decryptor(
251
+ self, model_type: ModelType, *, with_replacement: bool = False
252
+ ) -> JsonDecryptor:
236
253
  """Return an async decryptor that routes based on encryption type.
237
254
 
238
255
  The decryptor routes based on __encryption_context__ marker:
@@ -287,8 +304,21 @@ class JsonEncryptionWrapper:
287
304
 
288
305
  # Strip marker and decrypt
289
306
  data = strip_encryption_metadata(data)
290
- decrypted = await custom_decryptor(ctx, data)
291
- return strip_encryption_metadata(decrypted)
307
+ decrypted = normalize_decrypt_result(await custom_decryptor(ctx, data))
308
+ plaintext = strip_encryption_metadata(decrypted.plaintext)
309
+ replacement = decrypted.replacement
310
+ if replacement is not None:
311
+ try:
312
+ replacement = dict(replacement)
313
+ replacement[ENCRYPTION_CONTEXT_KEY] = context_dict
314
+ except (TypeError, ValueError):
315
+ await logger.aerror(
316
+ "Ignoring invalid re-encryption replacement",
317
+ model=model_type,
318
+ )
319
+ replacement = None
320
+ result = DecryptResult(plaintext, replacement)
321
+ return result if with_replacement else result.plaintext
292
322
 
293
323
  return decryptor
294
324
 
@@ -17,12 +17,6 @@ USE_DURABILITY = LANGGRAPH_PY_MINOR >= (0, 6)
17
17
  _RUNTIME_EDITION = os.getenv("LANGGRAPH_RUNTIME_EDITION", "inmem")
18
18
  IS_POSTGRES_BACKEND = _RUNTIME_EDITION == "postgres"
19
19
  IS_POSTGRES_OR_GRPC_BACKEND = IS_POSTGRES_BACKEND
20
- # Not in public docs: internal feature flag
21
- FF_USE_JS_API = os.getenv("FF_USE_JS_API", "false").lower() in (
22
- "true",
23
- "1",
24
- "yes",
25
- )
26
20
  # Server-side kill switch for the Protocol v2 event-streaming surface
27
21
  # (#3296). When false, the v2 routes are not registered (clients hit a
28
22
  # 404), and ``_create_or_resume_run`` rejects any direct call with a
@@ -19,7 +19,12 @@ from langgraph_grpc_common.proto.encryption_pb2 import (
19
19
  from langgraph_grpc_common.proto.encryption_pb2_grpc import EncryptionServicer
20
20
  from langgraph_sdk import EncryptionContext
21
21
 
22
- from langgraph_api.encryption.custom import get_custom_encryption_instance
22
+ from langgraph_api.encryption.custom import (
23
+ DecryptResult,
24
+ JsonEncryptionWrapper,
25
+ get_custom_encryption_instance,
26
+ normalize_decrypt_result,
27
+ )
23
28
  from langgraph_api.encryption.middleware import _extract_skip_fields
24
29
  from langgraph_api.encryption.shared import BLOB_ENCRYPTION_CONTEXT_KEY, get_encryption
25
30
  from langgraph_api.schema import NESTED_ENCRYPTED_SUBFIELDS
@@ -103,7 +108,7 @@ class EncryptionServicerImpl(EncryptionServicer):
103
108
  metadata: dict[str, bytes],
104
109
  encryptor,
105
110
  path: str | None = None,
106
- ) -> dict[str, Any]:
111
+ ) -> Any:
107
112
  """Encrypt a field, handling nested subfields defined in NESTED_ENCRYPTED_SUBFIELDS.
108
113
 
109
114
  This mirrors the middleware's _encrypt_field behavior:
@@ -182,6 +187,8 @@ class EncryptionServicerImpl(EncryptionServicer):
182
187
  model_type: str | None,
183
188
  field_name: str,
184
189
  decryptor,
190
+ *,
191
+ with_replacement: bool = False,
185
192
  ) -> dict[str, Any]:
186
193
  """Decrypt a field, handling nested subfields defined in NESTED_ENCRYPTED_SUBFIELDS.
187
194
 
@@ -196,7 +203,9 @@ class EncryptionServicerImpl(EncryptionServicer):
196
203
  stored_ctx = data.get(ENCRYPTION_CONTEXT_KEY)
197
204
  metadata = stored_ctx if isinstance(stored_ctx, dict) else {}
198
205
  ctx = EncryptionContext(model=model_type, field=field_name, metadata=metadata)
199
- decrypted = await decryptor(ctx, data)
206
+ result = normalize_decrypt_result(await decryptor(ctx, data))
207
+ decrypted = result.plaintext
208
+ replacement = result.replacement
200
209
 
201
210
  # Check for nested subfields that need recursive decryption
202
211
  # Only look up in NESTED_ENCRYPTED_SUBFIELDS when model_type is defined
@@ -214,7 +223,11 @@ class EncryptionServicerImpl(EncryptionServicer):
214
223
  subfield_names.append(sf_name)
215
224
  subfield_tasks.append(
216
225
  self._decrypt_field_recursive(
217
- sf_value, model_type, sf_name, decryptor
226
+ sf_value,
227
+ model_type,
228
+ sf_name,
229
+ decryptor,
230
+ with_replacement=True,
218
231
  )
219
232
  )
220
233
 
@@ -223,9 +236,14 @@ class EncryptionServicerImpl(EncryptionServicer):
223
236
  for sf_name, sf_decrypted in zip(
224
237
  subfield_names, subfield_results, strict=True
225
238
  ):
226
- decrypted[sf_name] = sf_decrypted
239
+ decrypted[sf_name] = sf_decrypted.plaintext
240
+ if sf_decrypted.replacement is not None:
241
+ if replacement is None:
242
+ replacement = dict(data)
243
+ replacement[sf_name] = sf_decrypted.replacement
227
244
 
228
- return decrypted
245
+ result = DecryptResult(decrypted, replacement)
246
+ return result if with_replacement else result.plaintext
229
247
 
230
248
  async def EncryptJSON(
231
249
  self,
@@ -300,26 +318,50 @@ class EncryptionServicerImpl(EncryptionServicer):
300
318
  model_type: ModelType | None = request.model or None
301
319
  field = request.field or None
302
320
 
303
- decryptor = encryption_instance.get_json_decryptor(model_type)
321
+ decryptor = (
322
+ encryption_instance.get_json_decryptor(
323
+ model_type, with_replacement=True
324
+ )
325
+ if isinstance(encryption_instance, JsonEncryptionWrapper)
326
+ else encryption_instance.get_json_decryptor(model_type)
327
+ )
304
328
  if decryptor is None:
305
329
  model_err = f"No decryptor configured for model type: {model_type}"
306
330
  context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
307
331
  context.set_details(model_err)
308
332
  raise RuntimeError(model_err)
309
333
 
310
- decrypted = await self._decrypt_field_recursive(
311
- data, model_type, field or "", decryptor
334
+ result = await self._decrypt_field_recursive(
335
+ data,
336
+ model_type,
337
+ field or "",
338
+ decryptor,
339
+ with_replacement=True,
312
340
  )
341
+ decrypted = result.plaintext
342
+ replacement = result.replacement
313
343
 
314
344
  # Restore __blob_encryption_context__ so that internal consumers
315
345
  # (e.g., the cron scheduler) can recover the original encryption
316
346
  # context when creating downstream runs.
317
347
  if blob_enc_ctx is not None and isinstance(decrypted, dict):
318
348
  decrypted[BLOB_ENCRYPTION_CONTEXT_KEY] = blob_enc_ctx
349
+ if blob_enc_ctx is not None and isinstance(replacement, dict):
350
+ replacement[BLOB_ENCRYPTION_CONTEXT_KEY] = blob_enc_ctx
319
351
 
320
352
  decrypted_bytes = orjson.dumps(decrypted)
353
+ replacement_bytes = None
354
+ if replacement is not None:
355
+ try:
356
+ replacement_bytes = orjson.dumps(replacement)
357
+ except (TypeError, ValueError):
358
+ await logger.aerror(
359
+ "Ignoring unserializable re-encryption replacement",
360
+ model=model_type,
361
+ field=field,
362
+ )
321
363
 
322
- return DecryptResponse(data=decrypted_bytes)
364
+ return DecryptResponse(data=decrypted_bytes, replacement=replacement_bytes)
323
365
 
324
366
  except Exception as e:
325
367
  await logger.aerror("DecryptJSON failed", error=str(e), exc_info=True)
@@ -379,8 +421,12 @@ class EncryptionServicerImpl(EncryptionServicer):
379
421
  request.context.field or None,
380
422
  dict(request.context.metadata),
381
423
  )
382
- decrypted = await encryption_instance._blob_decryptor(enc_ctx, request.data)
383
- return DecryptResponse(data=decrypted)
424
+ result = normalize_decrypt_result(
425
+ await encryption_instance._blob_decryptor(enc_ctx, request.data)
426
+ )
427
+ return DecryptResponse(
428
+ data=result.plaintext, replacement=result.replacement
429
+ )
384
430
  except Exception as e:
385
431
  await logger.aerror("DecryptBlob failed", error=str(e), exc_info=True)
386
432
  if context.code() is None:
@@ -10,9 +10,9 @@
10
10
  "@hono/node-server": "^2.1.0",
11
11
  "@hono/zod-validator": "^0.9.0",
12
12
  "@langchain/core": "^1.2.3",
13
- "@langchain/langgraph": "^1.4.9",
13
+ "@langchain/langgraph": "^1.4.12",
14
14
  "@langchain/langgraph-api": "^1.0.3",
15
- "@langchain/langgraph-checkpoint": "^1.1.3",
15
+ "@langchain/langgraph-checkpoint": "^1.1.5",
16
16
  "@langchain/langgraph-ui": "^1.4.3",
17
17
  "@types/json-schema": "^7.0.15",
18
18
  "dedent": "^1.7.2",
@@ -315,12 +315,12 @@
315
315
  winston-console-format "^1.0.8"
316
316
  zod "^3.25.76 || ^4"
317
317
 
318
- "@langchain/langgraph-checkpoint@^1.1.3":
319
- version "1.1.3"
320
- resolved "https://registry.yarnpkg.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.1.3.tgz#891f2f9a2e96cf2ab0920f9240f9ad1e0a86a4ab"
321
- integrity sha512-wgzdQNeEsdw1e+4lvlj0tdq/RYR/k1vPin10g0ymGoehZDDgd9nvIllGXSXN4TFgF9sf5qQP/KTkOcLfeseIhA==
318
+ "@langchain/langgraph-checkpoint@^1.1.5":
319
+ version "1.1.5"
320
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.1.5.tgz#c793177f9afcce31a1e9922f317f88fec1254282"
321
+ integrity sha512-BwDwl5VeTOh6CVuiIPgsUgfK51vTJDMSbFcSCUfjJWsl8/DPdK/mbv+ejxJstkSk/BlSPMP4JfXWcN6jD2ea2Q==
322
322
 
323
- "@langchain/langgraph-sdk@^1.5.4", "@langchain/langgraph-sdk@~1.9.28":
323
+ "@langchain/langgraph-sdk@^1.5.4":
324
324
  version "1.9.28"
325
325
  resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-1.9.28.tgz#1664cc7b6f2c1509ddffecf17d805a26e70a7e1a"
326
326
  integrity sha512-4j3XuM0PvtmAbL8mPfBS99ez3+ytRfgbOpAR/nOeaejTRF3Q9dNw2QnaGLGng8wLPtGLoSj+SYgUOVxy9Bv9vg==
@@ -330,6 +330,16 @@
330
330
  p-queue "^9.0.1"
331
331
  p-retry "^7.1.1"
332
332
 
333
+ "@langchain/langgraph-sdk@~1.9.30":
334
+ version "1.9.31"
335
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-1.9.31.tgz#4dad28c89a74014288f3b6ceadfda2cd42094715"
336
+ integrity sha512-y1sSdq39IPb6mOX43+JiSezVbUdA8EBEJ1gvn91GP0jrLG0EcSApeRDCjRouyDpPXZ51bQXEQhA8CiHM0mzcAw==
337
+ dependencies:
338
+ "@langchain/protocol" "^0.0.18"
339
+ "@types/json-schema" "^7.0.15"
340
+ p-queue "^9.0.1"
341
+ p-retry "^7.1.1"
342
+
333
343
  "@langchain/langgraph-ui@1.4.3", "@langchain/langgraph-ui@^1.4.3":
334
344
  version "1.4.3"
335
345
  resolved "https://registry.yarnpkg.com/@langchain/langgraph-ui/-/langgraph-ui-1.4.3.tgz#41f1405a33dab70a9994484f8ec5b7dcf788ae7b"
@@ -341,13 +351,13 @@
341
351
  esbuild-plugin-tailwindcss "^2.0.1"
342
352
  zod "^3.25.76 || ^4"
343
353
 
344
- "@langchain/langgraph@^1.4.9":
345
- version "1.4.9"
346
- resolved "https://registry.yarnpkg.com/@langchain/langgraph/-/langgraph-1.4.9.tgz#8ec6f2ab1200f56dcf7b9e44d838c956b23b7a73"
347
- integrity sha512-EvD9rS66Cya09y6rbMgD3Ir8miAkJQFo7FyJOPRPO736Kz3y5TeyeBDOS8ctff/jRc788bPijHx2NVFM79Qqig==
354
+ "@langchain/langgraph@^1.4.12":
355
+ version "1.4.12"
356
+ resolved "https://registry.yarnpkg.com/@langchain/langgraph/-/langgraph-1.4.12.tgz#0870f26fc6a903c57feb6ad039bcf2f2a0c6ebc4"
357
+ integrity sha512-63iH/igH5Fh5fHqmWp09YYWaDKKB9v4RCmYNJBrnQ224rFRbjebgyYW6o5RCczN5FZxIhQj+xT51rrNmG0zi5A==
348
358
  dependencies:
349
- "@langchain/langgraph-checkpoint" "^1.1.3"
350
- "@langchain/langgraph-sdk" "~1.9.28"
359
+ "@langchain/langgraph-checkpoint" "^1.1.5"
360
+ "@langchain/langgraph-sdk" "~1.9.30"
351
361
  "@langchain/protocol" "^0.0.18"
352
362
  "@standard-schema/spec" "1.1.0"
353
363
 
@@ -36,10 +36,11 @@ def _ensure_port_available(host: str, port: int) -> None:
36
36
  # Pin AF_INET6 for IPv6 literals: glibc's getaddrinfo can return EAI_ADDRFAMILY
37
37
  # on IPv6-only hosts when the family is unspecified.
38
38
  family = socket.AF_INET6 if ":" in host else socket.AF_UNSPEC
39
+ lookup_host = None if host == "" else host
39
40
  last_error: OSError | None = None
40
41
  try:
41
42
  addrinfos = socket.getaddrinfo(
42
- host,
43
+ lookup_host,
43
44
  port,
44
45
  family=family,
45
46
  type=socket.SOCK_STREAM,
@@ -75,7 +76,9 @@ async def health_and_metrics_server():
75
76
 
76
77
  port = int(os.getenv("PORT", "8080"))
77
78
  # Not in public docs: LANGGRAPH_SERVER_HOST is internal
78
- host = normalize_host(os.getenv("LANGGRAPH_SERVER_HOST", "0.0.0.0"))
79
+ # Empty means every interface: asyncio then opens one socket per address
80
+ # family, so the server answers on IPv4 and IPv6.
81
+ host = normalize_host(os.getenv("LANGGRAPH_SERVER_HOST", ""))
79
82
 
80
83
  async def health_endpoint(request: Request):
81
84
  check_db = int(request.query_params.get("check_db", "1"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.14.0.dev8
3
+ Version: 0.14.0.dev10
4
4
  Author-email: Will Fu-Hinthorn <will@langchain.dev>, Josh Rogers <josh@langchain.dev>, Parker Rule <parker@langchain.dev>
5
5
  License: Elastic-2.0
6
6
  License-File: LICENSE
@@ -1,4 +1,4 @@
1
- langgraph_api/__init__.py,sha256=ZvqfPDSVjWqenHViy7o3NM7RhHGvDb21iDUZBBtBvQU,28
1
+ langgraph_api/__init__.py,sha256=S6HJxbdvNRuJkEhi7C2hDK0TIk1zgiCshwuhWNrexE4,29
2
2
  langgraph_api/_factory_utils.py,sha256=_FqW0olMu2PGLsnRq0ylt3a4jDCe12YIFHExMXI6Nyo,5976
3
3
  langgraph_api/asgi_transport.py,sha256=XApY3lIWBZTMbbsl8dDJzl0cLGirmAGE0SifqZUnXvs,11896
4
4
  langgraph_api/asyncio.py,sha256=smqyAoO9nIyPPQRw1IVSCh85fwoZP4PEo-5dDhxGruc,10676
@@ -8,7 +8,7 @@ langgraph_api/cli.py,sha256=ATtS9s9Cx7QNiGPJceKnMCko29A25ZA-xz39fdxmgfg,22389
8
8
  langgraph_api/command.py,sha256=d-k8h6H4ix1n7fSZ-Zb01NbSkEyqrD6cMKfDFXEIYEw,821
9
9
  langgraph_api/cron_scheduler.py,sha256=OwFzCwD86pfMNpfm9Z8bBS_WY9bBfDxGnq8_7wXurdA,6016
10
10
  langgraph_api/errors.py,sha256=zlMW99wAzNkz2xfik-HMkl_wMqmRFvs1j8V-_DZbAUc,2553
11
- langgraph_api/feature_flags.py,sha256=P7yQ9jXMHO3dPWv51iWGAVrPg3LbR9m4aCT_7t1UtZw,2624
11
+ langgraph_api/feature_flags.py,sha256=nPZGxT_alHytycYvOxNi6bp09xUnMpWiHa8LtGmFsO4,2481
12
12
  langgraph_api/graph.py,sha256=o--PRRg986nR2HVii_tgbGba9neiNFQ0wu_y5M9joJA,38403
13
13
  langgraph_api/http.py,sha256=7hPxKbj-xoAKcm7iucBpT5nM_hXOgGVCPbBsCD693Cw,6977
14
14
  langgraph_api/http_metrics.py,sha256=etxbZNmYxdb58DVLNkHP7S-N6njXPTiQh2OWKMaIZi8,5336
@@ -19,7 +19,7 @@ langgraph_api/metrics_collector.py,sha256=gMLHL18rJyYl985AOmu9eH7W1ttdRdkPHzeycz
19
19
  langgraph_api/metrics_otlp.py,sha256=YppnNCHmQBj7wZbtKYLJS68_tbD6sGTJXGKIySqUTjU,29657
20
20
  langgraph_api/otel_context.py,sha256=DWFwW4Yu88QY4W2J0IRcURR450Th9J2DupvDDkSkMBA,7166
21
21
  langgraph_api/patch.py,sha256=ViUknYvyQWS6y0f5XuaEoci2qB_mQv8vZl-oaUxsI6M,1448
22
- langgraph_api/queue_entrypoint.py,sha256=Bh8YPWN_2Dj3hxnYE9T3w9Igc8bIq7UcT8dngOOX36k,11535
22
+ langgraph_api/queue_entrypoint.py,sha256=ko968t_eXtO3NvPZLSuyp2eFFCKf8dLsz0a5sp5Z5Pg,11713
23
23
  langgraph_api/release_tags.py,sha256=Dd2L2Mdh7c5D7RhFvdGCXROLH3WI1QKXbEqgjITFFoQ,9437
24
24
  langgraph_api/route.py,sha256=_KE8A8Q-J-QfqjGlyM2Kc6n5cirmgt8xmI5-pI8kVEE,8837
25
25
  langgraph_api/schema.py,sha256=EkarLwAUKApevb03AmLRumrAVAc2EsG_SLhYFPncSzk,15318
@@ -68,11 +68,11 @@ langgraph_api/auth/langsmith/backend.py,sha256=Y6-VxD7zfV1jzGdjmQ66CgNa3SenLbo3d
68
68
  langgraph_api/auth/langsmith/client.py,sha256=79kwCVeHU64nsHsxWipfZhf44lM6vfs2nlfTxlJF6LU,4142
69
69
  langgraph_api/config/__init__.py,sha256=R3WTyMb96Q-UsrZIY-mvZrtJvkrriSUSA0LVYR3vhXA,27474
70
70
  langgraph_api/config/_parse.py,sha256=RpfZgFAPJlRMv13AzGr3kAYbIrqHcgjzO8IgeboTw4A,3922
71
- langgraph_api/config/schemas.py,sha256=cHzVvepthpD7DDeWE2ytkOHah-iDNH7xRx9dSWUatQI,20864
71
+ langgraph_api/config/schemas.py,sha256=4GBEYLrKq7Ye81u95aATIW7zR0VavLihoGosgHC6dOo,20871
72
72
  langgraph_api/encryption/__init__.py,sha256=gaCZ00CocSbqSqrDn6XJHaSp2CZCnC8qnrD9G4fbzyI,363
73
73
  langgraph_api/encryption/aes_json.py,sha256=ExLgrthzVYGP4X51TStU2Td_Sn_3-kXHyk6UKTFmzW4,6139
74
74
  langgraph_api/encryption/context.py,sha256=twnDvH3FcC8rlnPOAhI09dLZcxGgMVlplIH2ZpJ-8P4,1121
75
- langgraph_api/encryption/custom.py,sha256=QJeIxkRv0QCGUzdVkGSTG5vHUmXKmoR4t4BAyC-AFNQ,11382
75
+ langgraph_api/encryption/custom.py,sha256=g1yxuE5bfkX4nlQK5_ihRe6vsyVj5wV23OKh2o4vy08,12502
76
76
  langgraph_api/encryption/middleware.py,sha256=z4tt7Mi21Zd0UHalP85cpEIX6tG0qFCNlwVQwkd8Ywk,28174
77
77
  langgraph_api/encryption/shared.py,sha256=UR_dYZwRQchxJQU6V3hjHw5BkyHrWiPcSs7c1npObIk,3635
78
78
  langgraph_api/event_streaming/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
@@ -96,7 +96,7 @@ langgraph_api/grpc/ops/runs.py,sha256=4-Mp-4MgDAn8uerLrOpmXuUqOdfcnzSmb3hSRlO8Hh
96
96
  langgraph_api/grpc/ops/threads.py,sha256=SJraV838nZ0m6wRrCia7sLYh8KK1WfY7x5xmcspZLek,48140
97
97
  langgraph_api/grpc/servicers/__init__.py,sha256=l8yqTA_gMbIj0xHw5-RZYo0JbjL-EpFD8RxPMgW_-bA,422
98
98
  langgraph_api/grpc/servicers/checkpointer.py,sha256=aeB2hzsDxbb9i-ildx-kylpDxaYtpAUSG6rphOzbDOs,10482
99
- langgraph_api/grpc/servicers/encryption.py,sha256=UuBjpUK-tCbPXfx2-AFn0vbmeWw_UBe7xl8pMbwQdbA,15083
99
+ langgraph_api/grpc/servicers/encryption.py,sha256=qmov9a4gBJqdUNZkFASf6BLKOWce0Juwd_650G-DyPs,16924
100
100
  langgraph_api/js/.gitignore,sha256=l5yI6G_V6F1600I1IjiUKn87f4uYIrBAYU1MOyBBhg4,59
101
101
  langgraph_api/js/.prettierrc,sha256=0es3ovvyNIqIw81rPQsdt1zCQcOdBqyR_DMbFE4Ifms,19
102
102
  langgraph_api/js/.yarnclean,sha256=a5Vf1gAk2gxjcNrGidXoA3URy1fI3Ow5F3zDuVQg5wQ,728
@@ -107,14 +107,14 @@ langgraph_api/js/client.http.mts,sha256=ARlTJURLJamgvyaPlBCYEAHFnXQnPpzzUXWKwXie
107
107
  langgraph_api/js/client.mts,sha256=3WiUCSrMSaPxohxBMuwhkZ1B75ZqiIJaDOKOwX1PBcg,39333
108
108
  langgraph_api/js/errors.py,sha256=Cm1TKWlUCwZReDC5AQ6SgNIVGD27Qov2xcgHyf8-GXo,361
109
109
  langgraph_api/js/global.d.ts,sha256=j4GhgtQSZ5_cHzjSPcHgMJ8tfBThxrH-pUOrrJGteOU,196
110
- langgraph_api/js/package.json,sha256=NiHlSzZDPBHrp6rmqFvlt2Z8fSGN33G39fBjxPDAYyc,1363
110
+ langgraph_api/js/package.json,sha256=07IA-JZlm2Kf47Qp8c9EQ4rFLC5sU0Jpfs2XK-QzWSE,1364
111
111
  langgraph_api/js/remote.py,sha256=-wwFDbQoj0lW5SGI9wk0Qdpp5eEuQCMDPbeHIIwG5Qw,47969
112
112
  langgraph_api/js/schema.py,sha256=M4fLtr50O1jck8H1hm_0W4cZOGYGdkrB7riLyCes4oY,438
113
113
  langgraph_api/js/sse.py,sha256=IfcEpknyZeqqjYTOWRdijc6o2EBfatbWCZarGQQ0SQI,4088
114
114
  langgraph_api/js/traceblock.mts,sha256=QtGSN5VpzmGqDfbArrGXkMiONY94pMQ5CgzetT_bKYg,761
115
115
  langgraph_api/js/tsconfig.json,sha256=imCYqVnqFpaBoZPx8k1nO4slHIWBFsSlmCYhO73cpBs,341
116
116
  langgraph_api/js/ui.py,sha256=plqcWSmqfc9tY2nCUzNRBSofHTMdYDmVD9A6i5L3pSI,2571
117
- langgraph_api/js/yarn.lock,sha256=nZq0ThZMFozo0kWm8pw5CiyMcvT5lXmIXExVGtwVtZY,91331
117
+ langgraph_api/js/yarn.lock,sha256=iaT4rhEcKClohCMWBlhIlEQUErE42JDsI6fJc7_0Z8A,91726
118
118
  langgraph_api/js/src/graph.mts,sha256=ccK4UFUkuMQXdCujQWZjZKAk3a3ZDVLpwhYF7pj4eGY,3786
119
119
  langgraph_api/js/src/load.hooks.mjs,sha256=sqgVptq70mJb2EDprRIbMqRmPbCJlT_nHCqZQgg9zw4,2256
120
120
  langgraph_api/js/src/preload.mjs,sha256=WL6MVSeFuxusFscySrDDnloXJNVhkNcMOFwP70UAMbs,4106
@@ -238,8 +238,8 @@ langgraph_grpc_common/proto/store_pb2.py,sha256=thQ5HBLblZ7Adayp1U8ty_lrpn-7XEHn
238
238
  langgraph_grpc_common/proto/store_pb2.pyi,sha256=_dcxyxV8moR6H67qU42r2h2p_Ub-PZSHs3OoS9KMdSY,27782
239
239
  langgraph_grpc_common/proto/store_pb2_grpc.py,sha256=Kyt8eV2NXkjh3be_BYytGdD19kNf74961cruonMvCrw,3300
240
240
  langgraph_grpc_common/proto/store_pb2_grpc.pyi,sha256=oS1h2cDoq2OjyM8xazcmc8LwRDC5oCAD0zto2QUmPQw,2027
241
- langgraph_api-0.14.0.dev8.dist-info/METADATA,sha256=h0bsBxvs352mPIl_S90-Evalkh8bY3p0Qe_kLkBfIUg,4630
242
- langgraph_api-0.14.0.dev8.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
243
- langgraph_api-0.14.0.dev8.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
244
- langgraph_api-0.14.0.dev8.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
245
- langgraph_api-0.14.0.dev8.dist-info/RECORD,,
241
+ langgraph_api-0.14.0.dev10.dist-info/METADATA,sha256=EKKG6mk0hZ96Cqy1C0nVyzelAx7d7jnJFeNA1KDmr5I,4631
242
+ langgraph_api-0.14.0.dev10.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
243
+ langgraph_api-0.14.0.dev10.dist-info/entry_points.txt,sha256=hGedv8n7cgi41PypMfinwS_HfCwA7xJIfS0jAp8htV8,78
244
+ langgraph_api-0.14.0.dev10.dist-info/licenses/LICENSE,sha256=ZPwVR73Biwm3sK6vR54djCrhaRiM4cAD2zvOQZV8Xis,3859
245
+ langgraph_api-0.14.0.dev10.dist-info/RECORD,,