openhands-tools 1.30.0__tar.gz → 1.31.1__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 (101) hide show
  1. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/PKG-INFO +1 -1
  2. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/logging_fix.py +6 -4
  3. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/delegate/impl.py +28 -3
  4. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands_tools.egg-info/PKG-INFO +1 -1
  5. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/pyproject.toml +1 -1
  6. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/__init__.py +0 -0
  7. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/apply_patch/__init__.py +0 -0
  8. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/apply_patch/core.py +0 -0
  9. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/apply_patch/definition.py +0 -0
  10. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/__init__.py +0 -0
  11. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/definition.py +0 -0
  12. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/event_storage.py +0 -0
  13. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/impl.py +0 -0
  14. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/recording.py +0 -0
  15. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/browser_use/server.py +0 -0
  16. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/delegate/__init__.py +0 -0
  17. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/delegate/definition.py +0 -0
  18. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/delegate/visualizer.py +0 -0
  19. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/__init__.py +0 -0
  20. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/definition.py +0 -0
  21. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/editor.py +0 -0
  22. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/exceptions.py +0 -0
  23. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/impl.py +0 -0
  24. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/__init__.py +0 -0
  25. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/config.py +0 -0
  26. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/constants.py +0 -0
  27. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/diff.py +0 -0
  28. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/encoding.py +0 -0
  29. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/file_cache.py +0 -0
  30. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/history.py +0 -0
  31. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/file_editor/utils/shell.py +0 -0
  32. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/__init__.py +0 -0
  33. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/edit/__init__.py +0 -0
  34. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/edit/definition.py +0 -0
  35. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/edit/impl.py +0 -0
  36. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/list_directory/__init__.py +0 -0
  37. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/list_directory/definition.py +0 -0
  38. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/list_directory/impl.py +0 -0
  39. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/read_file/__init__.py +0 -0
  40. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/read_file/definition.py +0 -0
  41. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/read_file/impl.py +0 -0
  42. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/write_file/__init__.py +0 -0
  43. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/write_file/definition.py +0 -0
  44. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/gemini/write_file/impl.py +0 -0
  45. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/glob/__init__.py +0 -0
  46. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/glob/definition.py +0 -0
  47. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/glob/impl.py +0 -0
  48. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/grep/__init__.py +0 -0
  49. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/grep/definition.py +0 -0
  50. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/grep/impl.py +0 -0
  51. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/planning_file_editor/__init__.py +0 -0
  52. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/planning_file_editor/definition.py +0 -0
  53. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/planning_file_editor/impl.py +0 -0
  54. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/__init__.py +0 -0
  55. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/default.py +0 -0
  56. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/gemini.py +0 -0
  57. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/gpt5.py +0 -0
  58. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/planning.py +0 -0
  59. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/subagents/bash_runner.md +0 -0
  60. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/subagents/code_explorer.md +0 -0
  61. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/subagents/default.md +0 -0
  62. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/preset/subagents/web_researcher.md +0 -0
  63. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/py.typed +0 -0
  64. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task/__init__.py +0 -0
  65. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task/definition.py +0 -0
  66. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task/impl.py +0 -0
  67. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task/manager.py +0 -0
  68. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task_tracker/__init__.py +0 -0
  69. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/task_tracker/definition.py +0 -0
  70. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/__init__.py +0 -0
  71. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/constants.py +0 -0
  72. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/definition.py +0 -0
  73. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/descriptions.py +0 -0
  74. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/env.py +0 -0
  75. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/impl.py +0 -0
  76. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/metadata.py +0 -0
  77. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/__init__.py +0 -0
  78. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/factory.py +0 -0
  79. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/interface.py +0 -0
  80. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/subprocess_terminal.py +0 -0
  81. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/terminal_session.py +0 -0
  82. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/tmux_pane_pool.py +0 -0
  83. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/tmux_terminal.py +0 -0
  84. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/terminal/windows_terminal.py +0 -0
  85. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/timeout_policy.py +0 -0
  86. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/utils/__init__.py +0 -0
  87. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/utils/command.py +0 -0
  88. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/terminal/utils/escape_filter.py +0 -0
  89. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/tom_consult/__init__.py +0 -0
  90. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/tom_consult/definition.py +0 -0
  91. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/tom_consult/executor.py +0 -0
  92. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/utils/__init__.py +0 -0
  93. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/utils/timeout.py +0 -0
  94. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/workflow/__init__.py +0 -0
  95. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/workflow/definition.py +0 -0
  96. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands/tools/workflow/impl.py +0 -0
  97. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands_tools.egg-info/SOURCES.txt +0 -0
  98. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands_tools.egg-info/dependency_links.txt +0 -0
  99. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands_tools.egg-info/requires.txt +0 -0
  100. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/openhands_tools.egg-info/top_level.txt +0 -0
  101. {openhands_tools-1.30.0 → openhands_tools-1.31.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.30.0
3
+ Version: 1.31.1
4
4
  Summary: OpenHands Tools - Runtime tools for AI agents
5
5
  Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
6
  Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
@@ -15,14 +15,16 @@ from openhands.sdk.utils.deprecation import warn_cleanup
15
15
 
16
16
  warn_cleanup(
17
17
  "Monkey patching to prevent browser_use logging interference",
18
- cleanup_by="1.31.0",
18
+ cleanup_by="1.35.0",
19
19
  details=(
20
20
  "This workaround should be removed once browser_use fixes the "
21
21
  "problematic logging configuration code. The upstream PR #3717 "
22
22
  "(https://github.com/browser-use/browser-use/pull/3717) was closed "
23
- "without merge. As of browser_use 0.11.9, the server still calls "
24
- "_ensure_all_loggers_use_stderr() during import and initialization. "
25
- "Re-evaluate when browser_use changes that behavior."
23
+ "without merge. As of browser_use 0.13.3, the server still calls "
24
+ "logging.basicConfig(), logging.disable() and "
25
+ "_ensure_all_loggers_use_stderr() during import and initialization, "
26
+ "and provides no opt-out env var. Re-evaluate when browser_use "
27
+ "changes that behavior."
26
28
  ),
27
29
  )
28
30
 
@@ -97,6 +97,17 @@ class DelegateExecutor(ToolExecutor):
97
97
  return "default"
98
98
  return action.agent_types[index].strip() or "default"
99
99
 
100
+ def _close_sub_agent(self, agent_id: str, conversation: LocalConversation) -> None:
101
+ try:
102
+ conversation.close()
103
+ except Exception as e:
104
+ logger.warning(f"Error closing sub-agent '{agent_id}': {e}")
105
+
106
+ def close(self) -> None:
107
+ for agent_id, conversation in list(self._sub_agents.items()):
108
+ self._close_sub_agent(agent_id, conversation)
109
+ self._sub_agents.clear()
110
+
100
111
  def _run_until_finished(
101
112
  self, agent_id: str, conversation: LocalConversation
102
113
  ) -> None:
@@ -139,7 +150,8 @@ class DelegateExecutor(ToolExecutor):
139
150
  is_error=True,
140
151
  )
141
152
 
142
- if len(self._sub_agents) + len(action.ids) > self._max_children:
153
+ new_agent_ids = set(action.ids) - set(self._sub_agents)
154
+ if len(self._sub_agents) + len(new_agent_ids) > self._max_children:
143
155
  return DelegateObservation.from_text(
144
156
  text=(
145
157
  f"Cannot spawn {len(action.ids)} agents. "
@@ -150,6 +162,7 @@ class DelegateExecutor(ToolExecutor):
150
162
  is_error=True,
151
163
  )
152
164
 
165
+ created_sub_agents: list[tuple[str, str, LocalConversation]] = []
153
166
  try:
154
167
  parent_conversation = self.parent_conversation
155
168
  parent_llm = parent_conversation.agent.llm
@@ -159,14 +172,19 @@ class DelegateExecutor(ToolExecutor):
159
172
  resolved_agent_types = [
160
173
  self._resolve_agent_type(action, i) for i in range(len(action.ids))
161
174
  ]
175
+ factories = [
176
+ get_agent_factory(name=agent_type)
177
+ for agent_type in resolved_agent_types
178
+ ]
162
179
 
163
- for agent_id, agent_type in zip(action.ids, resolved_agent_types):
180
+ for agent_id, agent_type, factory in zip(
181
+ action.ids, resolved_agent_types, factories
182
+ ):
164
183
  sub_agent_llm = parent_llm.model_copy()
165
184
  # resetting metrics such that the sub-agent has its own
166
185
  # Metrics object
167
186
  sub_agent_llm.reset_metrics()
168
187
 
169
- factory = get_agent_factory(name=agent_type)
170
188
  worker_agent = factory.factory_func(sub_agent_llm)
171
189
 
172
190
  # ensuring that the sub-agent LLM has stream deactivated
@@ -210,6 +228,7 @@ class DelegateExecutor(ToolExecutor):
210
228
  )
211
229
 
212
230
  sub_conversation = LocalConversation(**conv_kwargs)
231
+ created_sub_agents.append((agent_id, agent_type, sub_conversation))
213
232
 
214
233
  # Apply permission_mode: explicit mode from definition,
215
234
  # or inherit the parent's policy when None.
@@ -221,6 +240,10 @@ class DelegateExecutor(ToolExecutor):
221
240
  else:
222
241
  sub_conversation.set_confirmation_policy(confirmation_policy)
223
242
 
243
+ for agent_id, agent_type, sub_conversation in created_sub_agents:
244
+ previous_conversation = self._sub_agents.get(agent_id)
245
+ if previous_conversation is not None:
246
+ self._close_sub_agent(agent_id, previous_conversation)
224
247
  self._sub_agents[agent_id] = sub_conversation
225
248
 
226
249
  # Log what type of agent was created
@@ -244,6 +267,8 @@ class DelegateExecutor(ToolExecutor):
244
267
  )
245
268
 
246
269
  except Exception as e:
270
+ for agent_id, _, sub_conversation in created_sub_agents:
271
+ self._close_sub_agent(agent_id, sub_conversation)
247
272
  logger.error(f"Error: failed to spawn agents: {e}", exc_info=True)
248
273
  return DelegateObservation.from_text(
249
274
  text=f"failed to spawn agents: {str(e)}",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.30.0
3
+ Version: 1.31.1
4
4
  Summary: OpenHands Tools - Runtime tools for AI agents
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-tools"
3
- version = "1.30.0"
3
+ version = "1.31.1"
4
4
  description = "OpenHands Tools - Runtime tools for AI agents"
5
5
 
6
6
  requires-python = ">=3.12"