openhands-tools 1.8.1__tar.gz → 1.9.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 (84) hide show
  1. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/PKG-INFO +5 -1
  2. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/impl.py +15 -14
  3. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/visualizer.py +18 -0
  4. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands_tools.egg-info/PKG-INFO +5 -1
  5. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/pyproject.toml +7 -1
  6. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/__init__.py +0 -0
  7. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/apply_patch/__init__.py +0 -0
  8. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/apply_patch/core.py +0 -0
  9. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/apply_patch/definition.py +0 -0
  10. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/__init__.py +0 -0
  11. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/definition.py +0 -0
  12. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/impl.py +0 -0
  13. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/impl_windows.py +0 -0
  14. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/logging_fix.py +0 -0
  15. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/browser_use/server.py +0 -0
  16. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/__init__.py +0 -0
  17. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/definition.py +0 -0
  18. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/registration.py +0 -0
  19. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/delegate/templates/delegate_tool_description.j2 +0 -0
  20. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/__init__.py +0 -0
  21. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/definition.py +0 -0
  22. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/editor.py +0 -0
  23. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/exceptions.py +0 -0
  24. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/impl.py +0 -0
  25. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/__init__.py +0 -0
  26. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/config.py +0 -0
  27. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/constants.py +0 -0
  28. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/diff.py +0 -0
  29. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/encoding.py +0 -0
  30. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/file_cache.py +0 -0
  31. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/history.py +0 -0
  32. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/file_editor/utils/shell.py +0 -0
  33. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/__init__.py +0 -0
  34. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/edit/__init__.py +0 -0
  35. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/edit/definition.py +0 -0
  36. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/edit/impl.py +0 -0
  37. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/list_directory/__init__.py +0 -0
  38. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/list_directory/definition.py +0 -0
  39. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/list_directory/impl.py +0 -0
  40. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/read_file/__init__.py +0 -0
  41. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/read_file/definition.py +0 -0
  42. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/read_file/impl.py +0 -0
  43. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/write_file/__init__.py +0 -0
  44. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/write_file/definition.py +0 -0
  45. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/gemini/write_file/impl.py +0 -0
  46. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/glob/__init__.py +0 -0
  47. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/glob/definition.py +0 -0
  48. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/glob/impl.py +0 -0
  49. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/grep/__init__.py +0 -0
  50. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/grep/definition.py +0 -0
  51. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/grep/impl.py +0 -0
  52. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/planning_file_editor/__init__.py +0 -0
  53. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/planning_file_editor/definition.py +0 -0
  54. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/planning_file_editor/impl.py +0 -0
  55. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/preset/__init__.py +0 -0
  56. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/preset/default.py +0 -0
  57. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/preset/gemini.py +0 -0
  58. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/preset/gpt5.py +0 -0
  59. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/preset/planning.py +0 -0
  60. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/py.typed +0 -0
  61. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/task_tracker/__init__.py +0 -0
  62. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/task_tracker/definition.py +0 -0
  63. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/__init__.py +0 -0
  64. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/constants.py +0 -0
  65. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/definition.py +0 -0
  66. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/impl.py +0 -0
  67. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/metadata.py +0 -0
  68. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/__init__.py +0 -0
  69. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/factory.py +0 -0
  70. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/interface.py +0 -0
  71. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/subprocess_terminal.py +0 -0
  72. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/terminal_session.py +0 -0
  73. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/terminal/tmux_terminal.py +0 -0
  74. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/terminal/utils/command.py +0 -0
  75. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/tom_consult/__init__.py +0 -0
  76. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/tom_consult/definition.py +0 -0
  77. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/tom_consult/executor.py +0 -0
  78. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/utils/__init__.py +0 -0
  79. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands/tools/utils/timeout.py +0 -0
  80. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands_tools.egg-info/SOURCES.txt +0 -0
  81. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands_tools.egg-info/dependency_links.txt +0 -0
  82. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands_tools.egg-info/requires.txt +0 -0
  83. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/openhands_tools.egg-info/top_level.txt +0 -0
  84. {openhands_tools-1.8.1 → openhands_tools-1.9.0}/setup.cfg +0 -0
@@ -1,7 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.8.1
3
+ Version: 1.9.0
4
4
  Summary: OpenHands Tools - Runtime tools for AI agents
5
+ Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
+ Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
7
+ Project-URL: Documentation, https://docs.openhands.dev/sdk
8
+ Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
5
9
  Requires-Python: >=3.12
6
10
  Requires-Dist: openhands-sdk
7
11
  Requires-Dist: bashlex>=0.18
@@ -9,7 +9,6 @@ from openhands.sdk.logger import get_logger
9
9
  from openhands.sdk.tool.tool import ToolExecutor
10
10
  from openhands.tools.delegate.definition import DelegateObservation
11
11
  from openhands.tools.delegate.registration import get_agent_factory
12
- from openhands.tools.delegate.visualizer import DelegationVisualizer
13
12
 
14
13
 
15
14
  if TYPE_CHECKING:
@@ -118,22 +117,24 @@ class DelegateExecutor(ToolExecutor):
118
117
  parent_visualizer = parent_conversation._visualizer
119
118
  workspace_path = parent_conversation.state.workspace.working_dir
120
119
 
120
+ # Disable streaming for sub-agents since they run in
121
+ # separate threads without token callbacks
122
+ sub_agent_llm = parent_llm.model_copy(update={"stream": False})
123
+
121
124
  resolved_agent_types = [
122
125
  self._resolve_agent_type(action, i) for i in range(len(action.ids))
123
126
  ]
124
127
 
125
128
  for agent_id, agent_type in zip(action.ids, resolved_agent_types):
126
129
  factory = get_agent_factory(agent_type)
127
- worker_agent = factory.factory_func(parent_llm)
128
-
129
- if isinstance(parent_visualizer, DelegationVisualizer):
130
- sub_visualizer = DelegationVisualizer(
131
- name=agent_id,
132
- highlight_regex=parent_visualizer._highlight_patterns,
133
- skip_user_messages=parent_visualizer._skip_user_messages,
134
- )
135
- else:
136
- sub_visualizer = None
130
+ worker_agent = factory.factory_func(sub_agent_llm)
131
+
132
+ # Use parent visualizer's create_sub_visualizer method if available
133
+ # This allows custom visualizers (e.g., TUI-based) to create
134
+ # appropriate sub-visualizers for their environment
135
+ sub_visualizer = None
136
+ if parent_visualizer is not None:
137
+ sub_visualizer = parent_visualizer.create_sub_visualizer(agent_id)
137
138
 
138
139
  sub_conversation = LocalConversation(
139
140
  agent=worker_agent,
@@ -207,13 +208,13 @@ class DelegateExecutor(ToolExecutor):
207
208
  results = {}
208
209
  errors = {}
209
210
 
210
- # Get the parent agent's name from the visualizer
211
+ # Get the parent agent's name from the visualizer if available
211
212
  parent_conversation = self.parent_conversation
212
213
  parent_name = None
213
214
  if hasattr(parent_conversation, "_visualizer"):
214
215
  visualizer = parent_conversation._visualizer
215
- if isinstance(visualizer, DelegationVisualizer):
216
- parent_name = visualizer._name
216
+ if visualizer is not None:
217
+ parent_name = getattr(visualizer, "_name", None)
217
218
 
218
219
  def run_task(
219
220
  agent_id: str,
@@ -61,6 +61,24 @@ class DelegationVisualizer(DefaultConversationVisualizer):
61
61
  )
62
62
  self._name = name
63
63
 
64
+ def create_sub_visualizer(self, agent_id: str) -> "DelegationVisualizer":
65
+ """Create a visualizer for a sub-agent during delegation.
66
+
67
+ Creates a new DelegationVisualizer instance for the sub-agent with
68
+ the same configuration as the parent visualizer.
69
+
70
+ Args:
71
+ agent_id: The identifier of the sub-agent being spawned
72
+
73
+ Returns:
74
+ A new DelegationVisualizer configured for the sub-agent
75
+ """
76
+ return DelegationVisualizer(
77
+ name=agent_id,
78
+ highlight_regex=self._highlight_patterns,
79
+ skip_user_messages=self._skip_user_messages,
80
+ )
81
+
64
82
  @staticmethod
65
83
  def _format_agent_name(name: str) -> str:
66
84
  """
@@ -1,7 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.8.1
3
+ Version: 1.9.0
4
4
  Summary: OpenHands Tools - Runtime tools for AI agents
5
+ Project-URL: Source, https://github.com/OpenHands/software-agent-sdk
6
+ Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
7
+ Project-URL: Documentation, https://docs.openhands.dev/sdk
8
+ Project-URL: Bug Tracker, https://github.com/OpenHands/software-agent-sdk/issues
5
9
  Requires-Python: >=3.12
6
10
  Requires-Dist: openhands-sdk
7
11
  Requires-Dist: bashlex>=0.18
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openhands-tools"
3
- version = "1.8.1"
3
+ version = "1.9.0"
4
4
  description = "OpenHands Tools - Runtime tools for AI agents"
5
5
 
6
6
  requires-python = ">=3.12"
@@ -16,6 +16,12 @@ dependencies = [
16
16
  "tom-swe>=1.0.3",
17
17
  ]
18
18
 
19
+ [project.urls]
20
+ Source = "https://github.com/OpenHands/software-agent-sdk"
21
+ Homepage = "https://github.com/OpenHands/software-agent-sdk"
22
+ Documentation = "https://docs.openhands.dev/sdk"
23
+ "Bug Tracker" = "https://github.com/OpenHands/software-agent-sdk/issues"
24
+
19
25
  [build-system]
20
26
  requires = ["setuptools>=61.0", "wheel"]
21
27
  build-backend = "setuptools.build_meta"