openhands-agent-server 1.7.1__tar.gz → 1.7.3__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 (43) hide show
  1. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/PKG-INFO +1 -1
  2. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/conversation_service.py +59 -0
  3. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/models.py +8 -0
  4. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/PKG-INFO +1 -1
  5. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/pyproject.toml +1 -1
  6. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__init__.py +0 -0
  7. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__main__.py +0 -0
  8. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/api.py +0 -0
  9. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_router.py +0 -0
  10. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_service.py +0 -0
  11. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/config.py +0 -0
  12. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/conversation_router.py +0 -0
  13. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/dependencies.py +0 -0
  14. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/desktop_router.py +0 -0
  15. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/desktop_service.py +0 -0
  16. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/Dockerfile +0 -0
  17. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/build.py +0 -0
  18. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/wallpaper.svg +0 -0
  19. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/env_parser.py +0 -0
  20. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/event_router.py +0 -0
  21. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/event_service.py +0 -0
  22. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/file_router.py +0 -0
  23. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/git_router.py +0 -0
  24. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/logging_config.py +0 -0
  25. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/middleware.py +0 -0
  26. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/openapi.py +0 -0
  27. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/pub_sub.py +0 -0
  28. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/py.typed +0 -0
  29. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/server_details_router.py +0 -0
  30. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/sockets.py +0 -0
  31. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/tool_preload_service.py +0 -0
  32. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/tool_router.py +0 -0
  33. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/utils.py +0 -0
  34. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_extensions/openhands-settings/extension.js +0 -0
  35. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_extensions/openhands-settings/package.json +0 -0
  36. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_router.py +0 -0
  37. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_service.py +0 -0
  38. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/SOURCES.txt +0 -0
  39. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/dependency_links.txt +0 -0
  40. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/entry_points.txt +0 -0
  41. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/requires.txt +0 -0
  42. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/top_level.txt +0 -0
  43. {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-agent-server
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: aiosqlite>=0.19
@@ -208,6 +208,32 @@ class ConversationService:
208
208
  )
209
209
  return conversation_info, False
210
210
 
211
+ # Dynamically register tools from client's registry
212
+ if request.tool_module_qualnames:
213
+ import importlib
214
+
215
+ for tool_name, module_qualname in request.tool_module_qualnames.items():
216
+ try:
217
+ # Import the module to trigger tool auto-registration
218
+ importlib.import_module(module_qualname)
219
+ logger.debug(
220
+ f"Tool '{tool_name}' registered via module '{module_qualname}'"
221
+ )
222
+ except ImportError as e:
223
+ logger.warning(
224
+ f"Failed to import module '{module_qualname}' for tool "
225
+ f"'{tool_name}': {e}. Tool will not be available."
226
+ )
227
+ # Continue even if some tools fail to register
228
+ # The agent will fail gracefully if it tries to use unregistered
229
+ # tools
230
+ if request.tool_module_qualnames:
231
+ logger.info(
232
+ f"Dynamically registered {len(request.tool_module_qualnames)} "
233
+ f"tools for conversation {conversation_id}: "
234
+ f"{list(request.tool_module_qualnames.keys())}"
235
+ )
236
+
211
237
  stored = StoredConversation(id=conversation_id, **request.model_dump())
212
238
  event_service = await self._start_event_service(stored)
213
239
  initial_message = request.initial_message
@@ -378,6 +404,36 @@ class ConversationService:
378
404
  "cipher": self.cipher,
379
405
  },
380
406
  )
407
+ # Dynamically register tools when resuming persisted conversations
408
+ if stored.tool_module_qualnames:
409
+ import importlib
410
+
411
+ for (
412
+ tool_name,
413
+ module_qualname,
414
+ ) in stored.tool_module_qualnames.items():
415
+ try:
416
+ # Import the module to trigger tool auto-registration
417
+ importlib.import_module(module_qualname)
418
+ logger.debug(
419
+ f"Tool '{tool_name}' registered via module "
420
+ f"'{module_qualname}' when resuming conversation "
421
+ f"{stored.id}"
422
+ )
423
+ except ImportError as e:
424
+ logger.warning(
425
+ f"Failed to import module '{module_qualname}' for "
426
+ f"tool '{tool_name}' when resuming conversation "
427
+ f"{stored.id}: {e}. Tool will not be available."
428
+ )
429
+ # Continue even if some tools fail to register
430
+ if stored.tool_module_qualnames:
431
+ logger.info(
432
+ f"Dynamically registered "
433
+ f"{len(stored.tool_module_qualnames)} tools when "
434
+ f"resuming conversation {stored.id}: "
435
+ f"{list(stored.tool_module_qualnames.keys())}"
436
+ )
381
437
  await self._start_event_service(stored)
382
438
  except Exception:
383
439
  logger.exception(
@@ -447,6 +503,9 @@ class ConversationService:
447
503
 
448
504
  try:
449
505
  await event_service.start()
506
+ # Save metadata immediately after successful start to ensure persistence
507
+ # even if the system is not shut down gracefully
508
+ await event_service.save_meta()
450
509
  except Exception:
451
510
  # Clean up the event service if startup fails
452
511
  await event_service.close()
@@ -98,6 +98,14 @@ class StartConversationRequest(BaseModel):
98
98
  default_factory=dict,
99
99
  description="Secrets available in the conversation",
100
100
  )
101
+ tool_module_qualnames: dict[str, str] = Field(
102
+ default_factory=dict,
103
+ description=(
104
+ "Mapping of tool names to their module qualnames from the client's "
105
+ "registry. These modules will be dynamically imported on the server "
106
+ "to register the tools for this conversation."
107
+ ),
108
+ )
101
109
 
102
110
 
103
111
  class StoredConversation(StartConversationRequest):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-agent-server
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: aiosqlite>=0.19
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openhands-agent-server"
3
- version = "1.7.1"
3
+ version = "1.7.3"
4
4
  description = "OpenHands Agent Server - REST/WebSocket interface for OpenHands AI Agent"
5
5
 
6
6
  requires-python = ">=3.12"