langgraph-cli 0.4.33__tar.gz → 0.4.34__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 (153) hide show
  1. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/PKG-INFO +1 -1
  2. langgraph_cli-0.4.34/langgraph_cli/__init__.py +1 -0
  3. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/deploy.py +23 -5
  4. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/test_cli.py +116 -0
  5. langgraph_cli-0.4.33/langgraph_cli/__init__.py +0 -1
  6. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/.gitignore +0 -0
  7. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/LICENSE +0 -0
  8. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/Makefile +0 -0
  9. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/README.md +0 -0
  10. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/.env.example +0 -0
  11. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/.gitignore +0 -0
  12. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/Makefile +0 -0
  13. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs/agent.py +0 -0
  14. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs/deps/additional_deps/pyproject.toml +0 -0
  15. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs/deps/zuper_deps/pyproject.toml +0 -0
  16. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs/langgraph.json +0 -0
  17. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs/pyproject.toml +0 -0
  18. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs_fail/agent.py +0 -0
  19. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs_fail/langgraph.json +0 -0
  20. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graph_prerelease_reqs_fail/pyproject.toml +0 -0
  21. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs/agent.py +0 -0
  22. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs/langgraph.json +0 -0
  23. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs/storm.py +0 -0
  24. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/__init__.py +0 -0
  25. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/graphs_submod/__init__.py +0 -0
  26. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/graphs_submod/agent.py +0 -0
  27. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/graphs_submod/subprompt.txt +0 -0
  28. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/hello.py +0 -0
  29. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/langgraph.json +0 -0
  30. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/prompt.txt +0 -0
  31. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_a/requirements.txt +0 -0
  32. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/graphs_submod/agent.py +0 -0
  33. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/graphs_submod/subprompt.txt +0 -0
  34. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/hello.py +0 -0
  35. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/langgraph.json +0 -0
  36. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/prompt.txt +0 -0
  37. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/requirements.txt +0 -0
  38. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/utils/__init__.py +0 -0
  39. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/graphs_reqs_b/utils/greeter.py +0 -0
  40. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/langgraph.json +0 -0
  41. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/my_app.py +0 -0
  42. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/pipconf.txt +0 -0
  43. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/examples/pyproject.toml +0 -0
  44. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/generate_schema.py +0 -0
  45. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/.dockerignore +0 -0
  46. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/.editorconfig +0 -0
  47. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/.env.example +0 -0
  48. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/.eslintrc.cjs +0 -0
  49. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/.gitignore +0 -0
  50. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/LICENSE +0 -0
  51. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/README.md +0 -0
  52. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/jest.config.js +0 -0
  53. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/langgraph.json +0 -0
  54. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/package.json +0 -0
  55. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/src/agent/graph.ts +0 -0
  56. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/src/agent/state.ts +0 -0
  57. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/static/studio.png +0 -0
  58. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/tests/agent.test.ts +0 -0
  59. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/tests/graph.int.test.ts +0 -0
  60. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/tsconfig.json +0 -0
  61. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-examples/yarn.lock +0 -0
  62. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/.eslintrc.cjs +0 -0
  63. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/apps/agent/langgraph.json +0 -0
  64. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/apps/agent/package.json +0 -0
  65. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/apps/agent/src/graph.ts +0 -0
  66. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/apps/agent/src/state.ts +0 -0
  67. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/apps/agent/tsconfig.json +0 -0
  68. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/libs/shared/package.json +0 -0
  69. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/libs/shared/src/index.ts +0 -0
  70. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/libs/shared/tsconfig.json +0 -0
  71. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/package.json +0 -0
  72. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/tsconfig.json +0 -0
  73. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/turbo.json +0 -0
  74. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/js-monorepo-example/yarn.lock +0 -0
  75. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/__main__.py +0 -0
  76. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/_ignore.py +0 -0
  77. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/analytics.py +0 -0
  78. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/archive.py +0 -0
  79. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/cli.py +0 -0
  80. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/config.py +0 -0
  81. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/constants.py +0 -0
  82. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/dependency_tracking.py +0 -0
  83. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/docker.py +0 -0
  84. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/exec.py +0 -0
  85. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/host_backend.py +0 -0
  86. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/image_reference.py +0 -0
  87. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/progress.py +0 -0
  88. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/py.typed +0 -0
  89. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/schemas.py +0 -0
  90. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/templates.py +0 -0
  91. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/util.py +0 -0
  92. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/uv_lock.py +0 -0
  93. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/langgraph_cli/version.py +0 -0
  94. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/pyproject.toml +0 -0
  95. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/.env.example +0 -0
  96. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/langgraph.json +0 -0
  97. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/pyproject.toml +0 -0
  98. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/src/agent/__init__.py +0 -0
  99. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/src/agent/graph.py +0 -0
  100. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/apps/agent/src/agent/state.py +0 -0
  101. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/libs/common/__init__.py +0 -0
  102. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/libs/common/helpers.py +0 -0
  103. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/libs/shared/pyproject.toml +0 -0
  104. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/libs/shared/src/shared/__init__.py +0 -0
  105. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/libs/shared/src/shared/utils.py +0 -0
  106. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/python-monorepo-example/pyproject.toml +0 -0
  107. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/schemas/schema.json +0 -0
  108. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/schemas/schema.v0.json +0 -0
  109. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/schemas/version.schema.json +0 -0
  110. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/__init__.py +0 -0
  111. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/integration_tests/__init__.py +0 -0
  112. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/integration_tests/test_cli.py +0 -0
  113. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/__init__.py +0 -0
  114. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/agent.py +0 -0
  115. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/__init__.py +0 -0
  116. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/langgraph.json +0 -0
  117. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/pyproject.toml +0 -0
  118. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/test_deploy_command.py +0 -0
  119. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/cli/test_templates.py +0 -0
  120. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/conftest.py +0 -0
  121. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/graphs/agent.py +0 -0
  122. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/helpers.py +0 -0
  123. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/multiplatform/js.mts +0 -0
  124. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/multiplatform/python.py +0 -0
  125. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/pipconfig.txt +0 -0
  126. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_archive.py +0 -0
  127. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_config.json +0 -0
  128. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_config.py +0 -0
  129. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_dependency_tracking.py +0 -0
  130. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_deploy_agents.py +0 -0
  131. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_deploy_helpers.py +0 -0
  132. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_docker.py +0 -0
  133. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_host_backend.py +0 -0
  134. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_image_reference.py +0 -0
  135. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_logs_helpers.py +0 -0
  136. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/tests/unit_tests/test_util.py +0 -0
  137. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/apps/agent/.env.example +0 -0
  138. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/apps/agent/langgraph.json +0 -0
  139. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/apps/agent/pyproject.toml +0 -0
  140. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/apps/agent/src/agent/__init__.py +0 -0
  141. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/apps/agent/src/agent/graph.py +0 -0
  142. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/libs/shared/pyproject.toml +0 -0
  143. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/libs/shared/src/shared/__init__.py +0 -0
  144. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/libs/shared/src/shared/utils.py +0 -0
  145. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/pyproject.toml +0 -0
  146. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/monorepo/uv.lock +0 -0
  147. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/.env.example +0 -0
  148. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/langgraph.json +0 -0
  149. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/pyproject.toml +0 -0
  150. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/src/agent/__init__.py +0 -0
  151. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/src/agent/graph.py +0 -0
  152. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv-examples/simple/uv.lock +0 -0
  153. {langgraph_cli-0.4.33 → langgraph_cli-0.4.34}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: langgraph-cli
3
- Version: 0.4.33
3
+ Version: 0.4.34
4
4
  Summary: CLI for interacting with LangGraph API
5
5
  Project-URL: Source, https://github.com/langchain-ai/langgraph/tree/main/libs/cli
6
6
  Project-URL: Twitter, https://x.com/langchain_oss
@@ -0,0 +1 @@
1
+ __version__ = "0.4.34"
@@ -1874,7 +1874,10 @@ def _create_host_backend_client(
1874
1874
  host_url: str | None,
1875
1875
  api_key: str | None,
1876
1876
  env_vars: dict[str, str] | None = None,
1877
+ *,
1878
+ no_input: bool | None = None,
1877
1879
  ) -> HostBackendClient:
1880
+ effective_no_input = _no_input if no_input is None else no_input
1878
1881
  if env_vars is None:
1879
1882
  env_vars = _parse_env_from_config({}, pathlib.Path.cwd() / DEFAULT_CONFIG)
1880
1883
  resolved_api_key = api_key
@@ -1889,7 +1892,7 @@ def _create_host_backend_client(
1889
1892
  resolved_api_key = val
1890
1893
  break
1891
1894
  if not resolved_api_key:
1892
- if _no_input:
1895
+ if effective_no_input:
1893
1896
  raise click.ClickException(
1894
1897
  "No LangSmith API key found. Set LANGSMITH_API_KEY in the "
1895
1898
  "environment or .env file."
@@ -1914,6 +1917,8 @@ def _create_host_backend_client(
1914
1917
  def _call_host_backend_with_optional_tenant(
1915
1918
  client: HostBackendClient,
1916
1919
  operation: Callable[[HostBackendClient], _T],
1920
+ *,
1921
+ no_input: bool | None = None,
1917
1922
  ) -> _T:
1918
1923
  """Run *operation*, prompting for a workspace ID on org-scoped 403s.
1919
1924
 
@@ -1922,6 +1927,7 @@ def _call_host_backend_with_optional_tenant(
1922
1927
  in-place so all subsequent calls through the same instance are
1923
1928
  tenant-aware.
1924
1929
  """
1930
+ effective_no_input = _no_input if no_input is None else no_input
1925
1931
  prompted_for_tenant = False
1926
1932
 
1927
1933
  while True:
@@ -1933,7 +1939,7 @@ def _call_host_backend_with_optional_tenant(
1933
1939
  and err.status_code == 403
1934
1940
  and "requires workspace specification" in err.message
1935
1941
  ):
1936
- if _no_input:
1942
+ if effective_no_input:
1937
1943
  raise click.ClickException(
1938
1944
  "API key is org-scoped and requires a workspace ID. "
1939
1945
  "Set LANGSMITH_TENANT_ID in your .env file or "
@@ -2518,6 +2524,13 @@ def deploy_listeners() -> None:
2518
2524
 
2519
2525
  @OPT_HOST_API_KEY
2520
2526
  @OPT_HOST_URL
2527
+ @click.option(
2528
+ "--json",
2529
+ "json_output",
2530
+ is_flag=True,
2531
+ default=False,
2532
+ help="Emit the listeners as a JSON array instead of a table.",
2533
+ )
2521
2534
  @deploy_listeners.command(
2522
2535
  "list",
2523
2536
  help=(
@@ -2526,11 +2539,16 @@ def deploy_listeners() -> None:
2526
2539
  "--listener-id <id>` to deploy through it."
2527
2540
  ),
2528
2541
  )
2529
- def deploy_listeners_list(api_key: str | None, host_url: str | None) -> None:
2530
- client = _create_host_backend_client(host_url, api_key)
2542
+ def deploy_listeners_list(
2543
+ api_key: str | None, host_url: str | None, json_output: bool
2544
+ ) -> None:
2545
+ client = _create_host_backend_client(host_url, api_key, no_input=json_output)
2531
2546
  listeners = _call_host_backend_with_optional_tenant(
2532
- client, lambda c: c.list_listeners()
2547
+ client, lambda c: c.list_listeners(), no_input=json_output
2533
2548
  )
2549
+ if json_output:
2550
+ click.echo(json_mod.dumps(listeners))
2551
+ return
2534
2552
  if not listeners:
2535
2553
  click.echo("No listeners found for this workspace.")
2536
2554
  return
@@ -14,6 +14,7 @@ import langgraph_cli.deploy as deploy_module
14
14
  from langgraph_cli.cli import cli, prepare_args_and_stdin
15
15
  from langgraph_cli.config import Config, _get_pip_cleanup_lines, validate_config
16
16
  from langgraph_cli.docker import DEFAULT_POSTGRES_URI, DockerCapabilities, Version
17
+ from langgraph_cli.host_backend import HostBackendError
17
18
  from langgraph_cli.util import clean_empty_lines
18
19
 
19
20
  FORMATTED_CLEANUP_LINES = _get_pip_cleanup_lines(
@@ -535,6 +536,121 @@ def test_deploy_listeners_list_command_no_results(monkeypatch) -> None:
535
536
  assert result.output.strip() == "No listeners found for this workspace."
536
537
 
537
538
 
539
+ def test_deploy_listeners_list_command_json(monkeypatch) -> None:
540
+ runner = CliRunner()
541
+
542
+ listeners = [
543
+ {
544
+ "id": "listener-1",
545
+ "compute_id": "prod-cluster",
546
+ "compute_config": {"k8s_namespaces": ["agents"]},
547
+ },
548
+ {
549
+ "id": "listener-2",
550
+ "compute_id": "multi-cluster",
551
+ "compute_config": {"k8s_namespaces": ["agents", "agents-staging"]},
552
+ },
553
+ ]
554
+
555
+ class FakeClient:
556
+ def __init__(self, host_url: str, api_key: str, tenant_id: str | None = None):
557
+ pass
558
+
559
+ def list_listeners(self):
560
+ return listeners
561
+
562
+ monkeypatch.setattr(deploy_module, "HostBackendClient", FakeClient)
563
+
564
+ result = runner.invoke(
565
+ cli,
566
+ [
567
+ "deploy",
568
+ "listeners",
569
+ "list",
570
+ "--json",
571
+ "--api-key",
572
+ "test-key",
573
+ "--host-url",
574
+ "https://api.example.com",
575
+ ],
576
+ )
577
+
578
+ assert result.exit_code == 0, result.output
579
+ assert json.loads(result.output) == listeners
580
+
581
+
582
+ def test_deploy_listeners_list_command_json_no_results(monkeypatch) -> None:
583
+ runner = CliRunner()
584
+
585
+ class FakeClient:
586
+ def __init__(self, host_url: str, api_key: str, tenant_id: str | None = None):
587
+ pass
588
+
589
+ def list_listeners(self):
590
+ return []
591
+
592
+ monkeypatch.setattr(deploy_module, "HostBackendClient", FakeClient)
593
+
594
+ result = runner.invoke(
595
+ cli,
596
+ [
597
+ "deploy",
598
+ "listeners",
599
+ "list",
600
+ "--json",
601
+ "--api-key",
602
+ "test-key",
603
+ "--host-url",
604
+ "https://api.example.com",
605
+ ],
606
+ )
607
+
608
+ assert result.exit_code == 0, result.output
609
+ assert json.loads(result.output) == []
610
+
611
+
612
+ def test_deploy_listeners_list_command_json_org_scoped_403(monkeypatch) -> None:
613
+ """With --json, an org-scoped 403 must raise cleanly instead of
614
+ prompting for a workspace ID, which would write to stdout and hang
615
+ waiting for input that a scripted invocation never provides."""
616
+ runner = CliRunner()
617
+
618
+ class FakeClient:
619
+ def __init__(self, host_url: str, api_key: str, tenant_id: str | None = None):
620
+ pass
621
+
622
+ def list_listeners(self):
623
+ raise HostBackendError("requires workspace specification", status_code=403)
624
+
625
+ def set_tenant(self, tenant_id: str) -> None:
626
+ raise AssertionError("must not retry with a prompted tenant with --json")
627
+
628
+ monkeypatch.setattr(deploy_module, "HostBackendClient", FakeClient)
629
+
630
+ prompt_calls = []
631
+ monkeypatch.setattr(
632
+ click, "prompt", lambda *a, **k: prompt_calls.append((a, k)) or "unreachable"
633
+ )
634
+
635
+ result = runner.invoke(
636
+ cli,
637
+ [
638
+ "deploy",
639
+ "listeners",
640
+ "list",
641
+ "--json",
642
+ "--api-key",
643
+ "test-key",
644
+ "--host-url",
645
+ "https://api.example.com",
646
+ ],
647
+ )
648
+
649
+ assert prompt_calls == [], "must not prompt interactively with --json"
650
+ assert result.exit_code != 0
651
+ assert "LANGSMITH_TENANT_ID" in result.output
652
+
653
+
538
654
  def test_deploy_revisions_list_command(monkeypatch) -> None:
539
655
  runner = CliRunner()
540
656
  captured: dict[str, str] = {}
@@ -1 +0,0 @@
1
- __version__ = "0.4.33"
File without changes
File without changes
File without changes
File without changes