openhands-agent-server 1.45.0__tar.gz → 1.46.0__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 (87) hide show
  1. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/PKG-INFO +1 -1
  2. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/canvas_extensions_router.py +24 -5
  3. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/profiles_router.py +17 -0
  4. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/PKG-INFO +1 -1
  5. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/pyproject.toml +1 -1
  6. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/__init__.py +0 -0
  7. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/__main__.py +0 -0
  8. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/_secret_redaction.py +0 -0
  9. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/_secrets_exposure.py +0 -0
  10. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/agent_profiles_router.py +0 -0
  11. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/api.py +0 -0
  12. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/auth_router.py +0 -0
  13. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/bash_router.py +0 -0
  14. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/bash_service.py +0 -0
  15. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/canvas_extensions/__init__.py +0 -0
  16. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/canvas_extensions/installed.py +0 -0
  17. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/canvas_extensions/manifest.py +0 -0
  18. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/config.py +0 -0
  19. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/conversation_lease.py +0 -0
  20. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/conversation_router.py +0 -0
  21. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/conversation_service.py +0 -0
  22. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/credential_binding.py +0 -0
  23. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/dependencies.py +0 -0
  24. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/desktop_router.py +0 -0
  25. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/docker/Dockerfile +0 -0
  26. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/docker/build.py +0 -0
  27. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/env_parser.py +0 -0
  28. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/event_router.py +0 -0
  29. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/event_service.py +0 -0
  30. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/file_router.py +0 -0
  31. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/git_router.py +0 -0
  32. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/hooks_router.py +0 -0
  33. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/hooks_service.py +0 -0
  34. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/init_router.py +0 -0
  35. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/llm_router.py +0 -0
  36. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/logging_config.py +0 -0
  37. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/mcp_oauth_store.py +0 -0
  38. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/mcp_router.py +0 -0
  39. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/middleware.py +0 -0
  40. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/models.py +0 -0
  41. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/openai/__init__.py +0 -0
  42. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/openai/models.py +0 -0
  43. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/openai/router.py +0 -0
  44. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/openai/service.py +0 -0
  45. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/openapi.py +0 -0
  46. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/persistence/__init__.py +0 -0
  47. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/persistence/models.py +0 -0
  48. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/persistence/store.py +0 -0
  49. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/plugins_router.py +0 -0
  50. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/plugins_service.py +0 -0
  51. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/provider_connections_router.py +0 -0
  52. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/pub_sub.py +0 -0
  53. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/py.typed +0 -0
  54. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/server_details_router.py +0 -0
  55. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/session_protocol.py +0 -0
  56. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/session_socket.py +0 -0
  57. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/settings_router.py +0 -0
  58. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/skills_router.py +0 -0
  59. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/skills_service.py +0 -0
  60. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/sockets.py +0 -0
  61. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/sub_agents_router.py +0 -0
  62. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/__init__.py +0 -0
  63. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/factory.py +0 -0
  64. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/http_exporter.py +0 -0
  65. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/models.py +0 -0
  66. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/policy.py +0 -0
  67. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/posthog_exporter.py +0 -0
  68. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/sanitizer.py +0 -0
  69. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/service.py +0 -0
  70. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/sink.py +0 -0
  71. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry/subscriber.py +0 -0
  72. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/telemetry_types.py +0 -0
  73. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/tool_preload_service.py +0 -0
  74. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/tool_router.py +0 -0
  75. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/utils.py +0 -0
  76. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/vscode_extensions/openhands-settings/extension.js +0 -0
  77. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/vscode_extensions/openhands-settings/package.json +0 -0
  78. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/vscode_router.py +0 -0
  79. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/vscode_service.py +0 -0
  80. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/workspace_router.py +0 -0
  81. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands/agent_server/workspaces_router.py +0 -0
  82. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/SOURCES.txt +0 -0
  83. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/dependency_links.txt +0 -0
  84. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/entry_points.txt +0 -0
  85. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/requires.txt +0 -0
  86. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/openhands_agent_server.egg-info/top_level.txt +0 -0
  87. {openhands_agent_server-1.45.0 → openhands_agent_server-1.46.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-agent-server
3
- Version: 1.45.0
3
+ Version: 1.46.0
4
4
  Summary: OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent
5
5
  Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
6
  Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
@@ -24,8 +24,12 @@ from openhands.agent_server.canvas_extensions.installed import (
24
24
  list_installed_canvas_extensions,
25
25
  uninstall_canvas_extension,
26
26
  )
27
- from openhands.agent_server.canvas_extensions.manifest import CanvasExtensionManifest
27
+ from openhands.agent_server.canvas_extensions.manifest import (
28
+ MANIFEST_FILENAME,
29
+ CanvasExtensionManifest,
30
+ )
28
31
  from openhands.sdk.extensions.fetch import ExtensionFetchError
32
+ from openhands.sdk.utils.redact import redact_url_credentials
29
33
 
30
34
 
31
35
  canvas_extensions_router = APIRouter(
@@ -144,7 +148,7 @@ class UninstallCanvasExtensionResponse(BaseModel):
144
148
  "/install",
145
149
  response_model=InstalledCanvasExtensionResponse,
146
150
  responses={
147
- 400: {"description": "Failed to fetch canvas extension source"},
151
+ 400: {"description": "Could not read canvas extension source"},
148
152
  409: {"description": "Canvas extension already installed (use force=true)"},
149
153
  422: {"description": "Invalid canvas extension (bad manifest, etc.)"},
150
154
  },
@@ -173,12 +177,27 @@ def install_canvas_extension_endpoint(
173
177
  status_code=409,
174
178
  detail="Canvas extension already installed. Use force=true to overwrite.",
175
179
  )
176
- except ExtensionFetchError:
180
+ except ExtensionFetchError as e:
181
+ # Pass the specific reason through -- which of source/ref/repo_path is
182
+ # wrong is the whole diagnostic, and a generic message misattributes a
183
+ # bad repo_path to the source. Redacted in case a URL carried a token.
184
+ # Deliberately not worded "failed to fetch": the canvas client treats
185
+ # that phrase as a network outage and hides the reason behind a
186
+ # "Disconnected, check your network" toast.
177
187
  raise HTTPException(
178
188
  status_code=400,
179
189
  detail=(
180
- "Failed to fetch canvas extension source. "
181
- "Check that the source is valid."
190
+ "Could not read canvas extension source: "
191
+ f"{redact_url_credentials(str(e))}"
192
+ ),
193
+ )
194
+ except FileNotFoundError:
195
+ raise HTTPException(
196
+ status_code=422,
197
+ detail=(
198
+ f"No {MANIFEST_FILENAME} found at the resolved location. "
199
+ "Source plus Path must point at the extension's own "
200
+ "directory, not the repository root."
182
201
  ),
183
202
  )
184
203
  except (ValidationError, ValueError, OSError):
@@ -1,5 +1,6 @@
1
1
  """HTTP endpoints for managing named LLM configurations (profiles)."""
2
2
 
3
+ import asyncio
3
4
  from typing import Annotated, Any
4
5
 
5
6
  from fastapi import APIRouter, HTTPException, Path, Request, status
@@ -305,6 +306,22 @@ async def validate_profile(
305
306
  ]
306
307
 
307
308
  try:
309
+ # Restore runtime subscription credentials, mirroring ``from_persisted``.
310
+ # The frontend sends auth_type="subscription" but the OAuth access token
311
+ # lives in the credential store, not in the serialized LLM config. Without
312
+ # this, the pre-flight sends api_key=None and fails with
313
+ # "Incorrect API key provided: None".
314
+ #
315
+ # Run the synchronous factory (which may do a network token refresh)
316
+ # off the event loop and inside the handled path so credential errors
317
+ # surface as ``valid=False`` instead of a 500.
318
+ if getattr(llm, "auth_type", None) == "subscription":
319
+ from openhands.sdk.llm.auth.openai import (
320
+ create_subscription_llm_from_config,
321
+ )
322
+
323
+ llm = await asyncio.to_thread(create_subscription_llm_from_config, llm)
324
+
308
325
  # Mirror the runtime dispatch (see ``amake_llm_completion``) and stay
309
326
  # async so provider I/O doesn't pin the FastAPI event loop.
310
327
  if llm.uses_responses_api():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-agent-server
3
- Version: 1.45.0
3
+ Version: 1.46.0
4
4
  Summary: OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent
5
5
  Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
6
  Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openhands-agent-server"
3
- version = "1.45.0"
3
+ version = "1.46.0"
4
4
  description = "OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent"
5
5
 
6
6
  requires-python = ">=3.12"