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.
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/PKG-INFO +1 -1
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/conversation_service.py +59 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/models.py +8 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/PKG-INFO +1 -1
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/pyproject.toml +1 -1
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__init__.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__main__.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/api.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_service.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/config.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/conversation_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/dependencies.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/desktop_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/desktop_service.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/Dockerfile +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/build.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/wallpaper.svg +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/env_parser.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/event_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/event_service.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/file_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/git_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/logging_config.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/middleware.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/openapi.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/pub_sub.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/py.typed +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/server_details_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/sockets.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/tool_preload_service.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/tool_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/utils.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_extensions/openhands-settings/extension.js +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_extensions/openhands-settings/package.json +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_router.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/vscode_service.py +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/SOURCES.txt +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/dependency_links.txt +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/entry_points.txt +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/requires.txt +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands_agent_server.egg-info/top_level.txt +0 -0
- {openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/setup.cfg +0 -0
|
@@ -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()
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/models.py
RENAMED
|
@@ -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):
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__init__.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/__main__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_router.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/bash_service.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/config.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/dependencies.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/docker/build.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/env_parser.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/event_router.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/file_router.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/git_router.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/middleware.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/openapi.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/pub_sub.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/py.typed
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/sockets.py
RENAMED
|
File without changes
|
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/tool_router.py
RENAMED
|
File without changes
|
{openhands_agent_server-1.7.1 → openhands_agent_server-1.7.3}/openhands/agent_server/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|