langgraph-api 0.9.0.dev2__tar.gz → 0.9.0.dev4__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 (287) hide show
  1. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/Makefile +17 -2
  2. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/PKG-INFO +1 -1
  3. langgraph_api-0.9.0.dev4/langgraph_api/__init__.py +1 -0
  4. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/config/schemas.py +26 -2
  5. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/service.py +32 -6
  6. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/webhook.py +25 -3
  7. langgraph_api-0.9.0.dev2/langgraph_api/__init__.py +0 -1
  8. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/.gitignore +0 -0
  9. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/LICENSE +0 -0
  10. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/README.md +0 -0
  11. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/.gitignore +0 -0
  12. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/Makefile +0 -0
  13. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/README.md +0 -0
  14. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/assistant.ts +0 -0
  15. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/benchmark-runner.ts +0 -0
  16. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/benchmark_profiles.ts +0 -0
  17. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/benchmarks.ts +0 -0
  18. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/cancel_first_second_completes.ts +0 -0
  19. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/enqueued_runs_order.ts +0 -0
  20. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/log-failure.ts +0 -0
  21. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/meta_workload.ts +0 -0
  22. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/stream_write.ts +0 -0
  23. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/thread.ts +0 -0
  24. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/thread_runs_metadata_search.ts +0 -0
  25. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/threads_search_metadata.ts +0 -0
  26. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/types.ts +0 -0
  27. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/benchmark-runners/wait_write.ts +0 -0
  28. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/capacity_dd_report.py +0 -0
  29. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/capacity_k6.js +0 -0
  30. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/capacity_runner.mjs +0 -0
  31. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/capacity_slack_report.py +0 -0
  32. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/capacity_urls.mjs +0 -0
  33. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/clean-cli.js +0 -0
  34. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/clean.js +0 -0
  35. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/continuous/README.md +0 -0
  36. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/continuous/pyproject.toml +0 -0
  37. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/continuous/runner.py +0 -0
  38. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/continuous/uv.lock +0 -0
  39. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/graphs.js +0 -0
  40. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/mixed_workload_k6.js +0 -0
  41. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/mixed_workload_runner.mjs +0 -0
  42. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/package.json +0 -0
  43. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/ramp.js +0 -0
  44. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/reporting/dd_reporting.py +0 -0
  45. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/reporting/slack_slowest_runs.py +0 -0
  46. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/reporting/slack_summary.py +0 -0
  47. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/run_local.sh +0 -0
  48. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/staircase.py +0 -0
  49. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/staircase_step_k6.js +0 -0
  50. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/tsconfig.json +0 -0
  51. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/update-revision.js +0 -0
  52. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/benchmark/weather.js +0 -0
  53. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/constraints.txt +0 -0
  54. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/custom_store.sql +0 -0
  55. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/forbidden.txt +0 -0
  56. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/hatch_build.py +0 -0
  57. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/healthcheck.py +0 -0
  58. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph-cloud-debugging-20260210132856.zip +0 -0
  59. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/_checkpointer/__init__.py +0 -0
  60. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/_checkpointer/_adapter.py +0 -0
  61. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/_checkpointer/protocol.py +0 -0
  62. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/_factory_utils.py +0 -0
  63. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/__init__.py +0 -0
  64. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/a2a.py +0 -0
  65. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/assistants.py +0 -0
  66. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/event_streaming.py +0 -0
  67. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/__init__.py +0 -0
  68. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/_constants.py +0 -0
  69. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/_handlers.py +0 -0
  70. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/_models.py +0 -0
  71. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/_routes.py +0 -0
  72. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/mcp/_sanitizers.py +0 -0
  73. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/meta.py +0 -0
  74. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/openapi.py +0 -0
  75. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/profile.py +0 -0
  76. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/runs.py +0 -0
  77. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/store.py +0 -0
  78. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/threads.py +0 -0
  79. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/api/ui.py +0 -0
  80. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/asgi_transport.py +0 -0
  81. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/asyncio.py +0 -0
  82. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/__init__.py +0 -0
  83. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/custom.py +0 -0
  84. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/errors.py +0 -0
  85. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/langsmith/__init__.py +0 -0
  86. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/langsmith/backend.py +0 -0
  87. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/langsmith/client.py +0 -0
  88. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/middleware.py +0 -0
  89. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/noop.py +0 -0
  90. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/auth/studio_user.py +0 -0
  91. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/cache.py +0 -0
  92. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/cli.py +0 -0
  93. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/command.py +0 -0
  94. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/config/__init__.py +0 -0
  95. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/config/_parse.py +0 -0
  96. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/cron_scheduler.py +0 -0
  97. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/__init__.py +0 -0
  98. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/aes_json.py +0 -0
  99. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/context.py +0 -0
  100. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/custom.py +0 -0
  101. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/middleware.py +0 -0
  102. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/encryption/shared.py +0 -0
  103. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/errors.py +0 -0
  104. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/__init__.py +0 -0
  105. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/capabilities.py +0 -0
  106. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/constants.py +0 -0
  107. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/event_normalizers.py +0 -0
  108. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/namespace.py +0 -0
  109. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/session.py +0 -0
  110. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/state_normalizers.py +0 -0
  111. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/event_streaming/types.py +0 -0
  112. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/feature_flags.py +0 -0
  113. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/graph.py +0 -0
  114. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/__init__.py +0 -0
  115. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/client.py +0 -0
  116. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/generated/core_api_pb2.pyi +0 -0
  117. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/__init__.py +0 -0
  118. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/assistants.py +0 -0
  119. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/cache.py +0 -0
  120. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/crons.py +0 -0
  121. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/runs.py +0 -0
  122. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/ops/threads.py +0 -0
  123. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/server.py +0 -0
  124. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/servicers/__init__.py +0 -0
  125. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/servicers/checkpointer.py +0 -0
  126. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/grpc/servicers/encryption.py +0 -0
  127. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/http.py +0 -0
  128. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/http_metrics.py +0 -0
  129. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/http_metrics_utils.py +0 -0
  130. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/.gitignore +0 -0
  131. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/.prettierrc +0 -0
  132. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/__init__.py +0 -0
  133. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/base.py +0 -0
  134. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/build.mts +0 -0
  135. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/client.http.mts +0 -0
  136. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/client.mts +0 -0
  137. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/errors.py +0 -0
  138. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/global.d.ts +0 -0
  139. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/package.json +0 -0
  140. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/remote.py +0 -0
  141. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/schema.py +0 -0
  142. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/graph.mts +0 -0
  143. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/load.hooks.mjs +0 -0
  144. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/preload.mjs +0 -0
  145. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/utils/experiment-tracing.mts +0 -0
  146. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/utils/files.mts +0 -0
  147. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/utils/importMap.mts +0 -0
  148. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/utils/pythonSchemas.mts +0 -0
  149. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/src/utils/serde.mts +0 -0
  150. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/sse.py +0 -0
  151. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/traceblock.mts +0 -0
  152. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/tsconfig.json +0 -0
  153. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/ui.py +0 -0
  154. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/js/yarn.lock +0 -0
  155. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/lc_security/__init__.py +0 -0
  156. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/lc_security/exceptions.py +0 -0
  157. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/lc_security/policy.py +0 -0
  158. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/lc_security/transport.py +0 -0
  159. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/logging.py +0 -0
  160. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/metadata.py +0 -0
  161. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/metrics_datadog.py +0 -0
  162. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/middleware/__init__.py +0 -0
  163. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/middleware/ensure_store.py +0 -0
  164. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/middleware/http_logger.py +0 -0
  165. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/middleware/private_network.py +0 -0
  166. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/middleware/request_id.py +0 -0
  167. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/models/__init__.py +0 -0
  168. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/models/run.py +0 -0
  169. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/otel_context.py +0 -0
  170. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/patch.py +0 -0
  171. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/queue_entrypoint.py +0 -0
  172. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/release_tags.py +0 -0
  173. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/route.py +0 -0
  174. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/schema.py +0 -0
  175. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/self_hosted_logs.py +0 -0
  176. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/self_hosted_metrics.py +0 -0
  177. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/serde.py +0 -0
  178. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/server.py +0 -0
  179. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/sse.py +0 -0
  180. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/state.py +0 -0
  181. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/store.py +0 -0
  182. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/stream.py +0 -0
  183. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/stream_v2.py +0 -0
  184. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/timing/__init__.py +0 -0
  185. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/timing/profiler.py +0 -0
  186. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/timing/timer.py +0 -0
  187. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/traceblock.py +0 -0
  188. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/tunneling/cloudflare.py +0 -0
  189. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/__init__.py +0 -0
  190. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/cache.py +0 -0
  191. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/config.py +0 -0
  192. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/errors.py +0 -0
  193. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/extract.py +0 -0
  194. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/future.py +0 -0
  195. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/headers.py +0 -0
  196. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/network.py +0 -0
  197. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/retriable_client.py +0 -0
  198. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/stream_codec.py +0 -0
  199. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/utils/uuids.py +0 -0
  200. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/validation.py +0 -0
  201. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_api/worker.py +0 -0
  202. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/__init__.py +0 -0
  203. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/checkpointer.py +0 -0
  204. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/__init__.py +0 -0
  205. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/_compat.py +0 -0
  206. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/checkpoint.py +0 -0
  207. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/config.py +0 -0
  208. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/durability.py +0 -0
  209. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/struct.py +0 -0
  210. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/conversion/value.py +0 -0
  211. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/__init__.py +0 -0
  212. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.py +0 -0
  213. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2.pyi +0 -0
  214. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.py +0 -0
  215. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/checkpointer_pb2_grpc.pyi +0 -0
  216. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.py +0 -0
  217. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/core_api_pb2.pyi +0 -0
  218. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.py +0 -0
  219. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/core_api_pb2_grpc.pyi +0 -0
  220. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.py +0 -0
  221. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/encryption_pb2.pyi +0 -0
  222. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.py +0 -0
  223. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/encryption_pb2_grpc.pyi +0 -0
  224. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.py +0 -0
  225. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2.pyi +0 -0
  226. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.py +0 -0
  227. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/engine_common_pb2_grpc.pyi +0 -0
  228. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.py +0 -0
  229. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2.pyi +0 -0
  230. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.py +0 -0
  231. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cancel_run_action_pb2_grpc.pyi +0 -0
  232. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.py +0 -0
  233. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2.pyi +0 -0
  234. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.py +0 -0
  235. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_control_signal_pb2_grpc.pyi +0 -0
  236. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.py +0 -0
  237. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2.pyi +0 -0
  238. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.py +0 -0
  239. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_cron_on_run_completed_pb2_grpc.pyi +0 -0
  240. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.py +0 -0
  241. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2.pyi +0 -0
  242. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.py +0 -0
  243. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_durability_pb2_grpc.pyi +0 -0
  244. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.py +0 -0
  245. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2.pyi +0 -0
  246. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.py +0 -0
  247. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_multitask_strategy_pb2_grpc.pyi +0 -0
  248. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.py +0 -0
  249. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2.pyi +0 -0
  250. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.py +0 -0
  251. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_run_status_pb2_grpc.pyi +0 -0
  252. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.py +0 -0
  253. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2.pyi +0 -0
  254. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.py +0 -0
  255. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_stream_mode_pb2_grpc.pyi +0 -0
  256. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.py +0 -0
  257. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2.pyi +0 -0
  258. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.py +0 -0
  259. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_status_pb2_grpc.pyi +0 -0
  260. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.py +0 -0
  261. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2.pyi +0 -0
  262. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.py +0 -0
  263. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/enum_thread_stream_mode_pb2_grpc.pyi +0 -0
  264. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/errors_pb2.py +0 -0
  265. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/errors_pb2.pyi +0 -0
  266. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.py +0 -0
  267. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/proto/errors_pb2_grpc.pyi +0 -0
  268. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_grpc_common/serde.py +0 -0
  269. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_license/__init__.py +0 -0
  270. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_license/validation.py +0 -0
  271. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/__init__.py +0 -0
  272. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/checkpoint.py +0 -0
  273. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/database.py +0 -0
  274. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/lifespan.py +0 -0
  275. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/metrics.py +0 -0
  276. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/ops.py +0 -0
  277. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/queue.py +0 -0
  278. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/retry.py +0 -0
  279. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/routes.py +0 -0
  280. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/langgraph_runtime/store.py +0 -0
  281. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/logging.json +0 -0
  282. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/openapi.json +0 -0
  283. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/pyproject.toml +0 -0
  284. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/scripts/build_wheel.py +0 -0
  285. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/scripts/create_license.py +0 -0
  286. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/scripts/run_a2a_tck.py +0 -0
  287. {langgraph_api-0.9.0.dev2 → langgraph_api-0.9.0.dev4}/uv.lock +0 -0
@@ -71,6 +71,19 @@ else
71
71
  HTTP_CONFIG := $(LANGGRAPH_HTTP)
72
72
  endif
73
73
 
74
+ # Dev/test default: opt in to loopback + http webhooks.
75
+ # ``test_custom_route`` etc use relative URLs to dispatch to my_router.py;
76
+ # ``test_join_*`` / ``test_webhook_payload_on_timeouts`` / ``test_cron_*``
77
+ # and the shutdown suite use ``http://localhost:{port}/webhook`` to a
78
+ # pytest httpserver fixture — all of these are blocked by the secure
79
+ # ``disable_loopback`` default (GHSA-q3v5-r5ch-p57j), and
80
+ # ``require_https`` defaults to true once any webhooks.url block is
81
+ # present, so explicitly disable it for the http httpserver fixture.
82
+ # Production deployers don't use these Makefiles. Override with
83
+ # ``LANGGRAPH_WEBHOOKS=...`` on the command line to exercise the secure
84
+ # default during local development.
85
+ LANGGRAPH_WEBHOOKS ?= {"url": {"disable_loopback": false, "require_https": false}}
86
+
74
87
  LANGGRAPH_STORE ?= ""
75
88
  ifeq ($(LANGGRAPH_STORE),custom)
76
89
  STORE_CONFIG := {"path": "./tests/graphs/custom_store.py:generate_store"}
@@ -93,10 +106,10 @@ REVISION ?= $(shell git rev-parse --short HEAD)
93
106
  LANGGRAPH_ENCRYPTION ?=
94
107
 
95
108
  test-license-oss:
96
- LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' LANGGRAPH_STORE='$(STORE_CONFIG)' LANGGRAPH_CHECKPOINTER='$(CHECKPOINTER_CONFIG)' LANGGRAPH_ENCRYPTION='$(LANGGRAPH_ENCRYPTION)' REDIS_URI=_FAKE DATABASE_URI=:memory: MIGRATIONS_PATH=__inmem__ uv run pytest -v $(XDIST_ARGS) $(TEST)
109
+ LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_WEBHOOKS='$(LANGGRAPH_WEBHOOKS)' LANGGRAPH_HTTP='$(HTTP_CONFIG)' LANGGRAPH_STORE='$(STORE_CONFIG)' LANGGRAPH_CHECKPOINTER='$(CHECKPOINTER_CONFIG)' LANGGRAPH_ENCRYPTION='$(LANGGRAPH_ENCRYPTION)' REDIS_URI=_FAKE DATABASE_URI=:memory: MIGRATIONS_PATH=__inmem__ uv run pytest -v $(XDIST_ARGS) $(TEST)
97
110
 
98
111
  test-watch-oss:
99
- LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_HTTP='$(HTTP_CONFIG)' LANGGRAPH_ENCRYPTION='$(LANGGRAPH_ENCRYPTION)' REDIS_URI=_FAKE DATABASE_URI=:memory: MIGRATIONS_PATH=__inmem__ uv run --no-sync ptw . -- -x -vv --ff --capture=no $(TEST)
112
+ LANGGRAPH_RUNTIME_EDITION=inmem LANGGRAPH_WEBHOOKS='$(LANGGRAPH_WEBHOOKS)' LANGGRAPH_HTTP='$(HTTP_CONFIG)' LANGGRAPH_ENCRYPTION='$(LANGGRAPH_ENCRYPTION)' REDIS_URI=_FAKE DATABASE_URI=:memory: MIGRATIONS_PATH=__inmem__ uv run --no-sync ptw . -- -x -vv --ff --capture=no $(TEST)
100
113
 
101
114
  test: test-license-oss
102
115
  test-watch: test-watch-oss
@@ -159,6 +172,7 @@ LANGSMITH_TRACING ?= false
159
172
 
160
173
  start:
161
174
  LANGGRAPH_DISABLE_FILE_PERSISTENCE=$(LANGGRAPH_DISABLE_FILE_PERSISTENCE) \
175
+ LANGGRAPH_WEBHOOKS='$(LANGGRAPH_WEBHOOKS)' \
162
176
  LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
163
177
  LANGGRAPH_RUNTIME_EDITION=inmem \
164
178
  LANGGRAPH_AES_KEY='$(LANGGRAPH_AES_KEY)' \
@@ -186,6 +200,7 @@ start:
186
200
  start-license-oss: start
187
201
 
188
202
  start-encrypt:
203
+ LANGGRAPH_WEBHOOKS='$(LANGGRAPH_WEBHOOKS)' \
189
204
  LANGGRAPH_HTTP='$(HTTP_CONFIG)' \
190
205
  LANGGRAPH_RUNTIME_EDITION=inmem \
191
206
  LANGGRAPH_AES_KEY='$(LANGGRAPH_AES_KEY)' \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langgraph-api
3
- Version: 0.9.0.dev2
3
+ Version: 0.9.0.dev4
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
@@ -0,0 +1 @@
1
+ __version__ = "0.9.0.dev4"
@@ -386,7 +386,26 @@ class WebhookUrlPolicy(TypedDict, total=False):
386
386
  max_url_length: int
387
387
  """Maximum permitted URL length in characters; longer inputs are rejected early."""
388
388
  disable_loopback: bool
389
- """Disallow relative URLs (internal loopback calls) and localhost hostnames when true."""
389
+ """Disallow loopback-flavored webhook targets when true. Defaults to true.
390
+
391
+ Covers all of:
392
+ - Relative URLs (e.g. ``/internal/hook``) that would dispatch via the
393
+ in-process ASGI loopback transport at ``root_path="/noauth"``. These
394
+ bypass authentication and were the auth-bypass primitive behind
395
+ GHSA-q3v5-r5ch-p57j.
396
+ - Absolute URLs whose hostname is ``localhost`` / ``localhost.localdomain``
397
+ / ``host.docker.internal``.
398
+ - Absolute URLs that DNS-resolve into the IPv4 loopback range
399
+ (``127.0.0.0/8``) or IPv6 loopback (``::1/128``) — including
400
+ DNS-rebinding-style attacks where an arbitrary hostname resolves to
401
+ a loopback IP.
402
+
403
+ Operators who intentionally route webhooks to in-process routes
404
+ (e.g. for local development with ``langgraph dev``, or single-host
405
+ docker-compose setups dispatching to ``host.docker.internal``) can
406
+ set this to ``false`` to restore the pre-GHSA behavior. Only do this
407
+ when you control all routes that loopback webhooks can reach.
408
+ """
390
409
  disable_private_ips: bool
391
410
  """Block RFC 1918 / CGN private IP ranges as webhook targets when true.
392
411
 
@@ -426,7 +445,12 @@ def _validate_url_policy(
426
445
  if "max_url_length" not in policy:
427
446
  policy["max_url_length"] = 2048
428
447
  if "disable_loopback" not in policy:
429
- policy["disable_loopback"] = False
448
+ # Secure default — covers GHSA-q3v5-r5ch-p57j (relative-URL ASGI
449
+ # loopback auth bypass) and the broader SSRF surface that the same
450
+ # flag governs via SSRFPolicy.block_localhost. Mirrored at the
451
+ # webhook.py read site so deployments without any webhooks block
452
+ # also get the safe default.
453
+ policy["disable_loopback"] = True
430
454
  if "disable_private_ips" not in policy:
431
455
  policy["disable_private_ips"] = False
432
456
  return policy
@@ -749,14 +749,23 @@ class ThreadRunManager:
749
749
  async def get_thread_state() -> dict[str, Any] | None:
750
750
  from langgraph_runtime.database import connect # noqa: PLC0415
751
751
 
752
+ # ``supports_core_api=False`` so the postgres backend yields a
753
+ # real connection. ``State.get`` uses the local checkpointer
754
+ # and needs a usable ``conn`` — the default flag yields None.
752
755
  try:
753
- async with connect() as conn:
756
+ async with connect(supports_core_api=False) as conn:
754
757
  return await self._threads.State.get(
755
758
  conn,
756
759
  {"configurable": {"thread_id": thread_id}},
757
760
  subgraphs=True,
758
761
  )
759
- except Exception:
762
+ except Exception as exc:
763
+ logger.warning(
764
+ "terminal_thread_state_fetch_failed",
765
+ thread_id=thread_id,
766
+ error=str(exc),
767
+ error_type=type(exc).__name__,
768
+ )
760
769
  return None
761
770
 
762
771
  return get_thread_state
@@ -855,14 +864,25 @@ class ThreadRunManager:
855
864
  """
856
865
  from langgraph_runtime.database import connect # noqa: PLC0415
857
866
 
867
+ # ``supports_core_api=False`` so the postgres backend yields a
868
+ # real connection. The default (``True``) yields ``None`` because
869
+ # data ops normally go through the gRPC server — but ``State.get``
870
+ # uses the local checkpointer and needs a usable ``conn``.
858
871
  try:
859
- async with connect() as conn:
872
+ async with connect(supports_core_api=False) as conn:
860
873
  state = await self._threads.State.get(
861
874
  conn,
862
875
  {"configurable": {"thread_id": self._thread_id}},
863
876
  subgraphs=True,
864
877
  )
865
- except Exception:
878
+ except Exception as exc:
879
+ logger.warning(
880
+ "interrupt_lookup_failed",
881
+ thread_id=self._thread_id,
882
+ interrupt_id=interrupt_id,
883
+ error=str(exc),
884
+ error_type=type(exc).__name__,
885
+ )
866
886
  return None
867
887
 
868
888
  tasks = (
@@ -903,7 +923,7 @@ class ThreadRunManager:
903
923
  from langgraph_runtime.database import connect # noqa: PLC0415
904
924
 
905
925
  try:
906
- async with connect() as conn:
926
+ async with connect(supports_core_api=False) as conn:
907
927
  state = await self._threads.State.get(
908
928
  conn,
909
929
  {"configurable": {"thread_id": self._thread_id}},
@@ -929,7 +949,13 @@ class ThreadRunManager:
929
949
  if isinstance(interrupts, (list, tuple)) and len(interrupts) > 0:
930
950
  return True
931
951
  return False
932
- except Exception:
952
+ except Exception as exc:
953
+ logger.warning(
954
+ "has_pending_interrupts_failed",
955
+ thread_id=self._thread_id,
956
+ error=str(exc),
957
+ error_type=type(exc).__name__,
958
+ )
933
959
  return False
934
960
 
935
961
  # ------------------------------------------------------------------
@@ -79,7 +79,14 @@ def _get_webhook_config() -> _WebhookConfig:
79
79
  exact_allowed = frozenset(exact_hosts)
80
80
 
81
81
  disable_private_ips = bool(policy_cfg.get("disable_private_ips", False))
82
- disable_loopback = bool(policy_cfg.get("disable_loopback", False))
82
+ # Loopback webhooks are denied by default (covers relative URLs that
83
+ # would dispatch through the in-process ASGI client at root_path=/noauth,
84
+ # plus localhost / 127.x / ::1 / host.docker.internal absolute URLs,
85
+ # plus any hostname that DNS-resolves into the loopback range). This is
86
+ # the fix for GHSA-q3v5-r5ch-p57j: relative-URL webhooks were the auth
87
+ # bypass primitive, and the localhost/loopback IP variants are the
88
+ # broader SSRF surface that the same flag governs via SSRFPolicy.
89
+ disable_loopback = bool(policy_cfg.get("disable_loopback", True))
83
90
 
84
91
  return _WebhookConfig(
85
92
  allowed_domains=allowed_domains,
@@ -111,11 +118,26 @@ async def validate_webhook_url_or_raise(url: str) -> None:
111
118
  if len(url) > wh.max_url_length:
112
119
  raise HTTPException(status_code=422, detail="Webhook URL too long")
113
120
 
114
- # Relative loopback URL (internal route) — not subject to SSRF checks
121
+ # Relative loopback URL (internal route) — dispatched via an in-process
122
+ # ASGI client that mounts under root_path="/noauth", which the auth
123
+ # middleware treats as an auth-bypass marker. Denied by default so a
124
+ # user-supplied webhook URL cannot be turned into an unauthenticated
125
+ # call against the server's own routes (GHSA-q3v5-r5ch-p57j). Operators
126
+ # who intentionally route webhooks to in-process routes can opt back in
127
+ # by setting webhooks.url.disable_loopback to false.
115
128
  if url.startswith("/"):
116
129
  if wh.disable_loopback:
117
130
  raise HTTPException(
118
- status_code=422, detail="Loopback webhooks are disabled"
131
+ status_code=422,
132
+ detail=(
133
+ "Loopback webhooks (relative URLs and localhost) are "
134
+ "disabled by default. They bypass authentication via the "
135
+ "in-process ASGI transport and can be abused to invoke "
136
+ "internal routes as an unauthenticated caller. Set "
137
+ "webhooks.url.disable_loopback to false (in langgraph.json "
138
+ "or via LANGGRAPH_WEBHOOKS) to opt back in — only do so "
139
+ "when you control the mounted routes."
140
+ ),
119
141
  )
120
142
  return
121
143
 
@@ -1 +0,0 @@
1
- __version__ = "0.9.0.dev2"