openhands-tools 1.29.0__tar.gz → 1.29.2__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.29.0 → openhands_tools-1.29.2}/PKG-INFO +1 -1
  2. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task/manager.py +21 -16
  3. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/windows_terminal.py +7 -1
  4. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands_tools.egg-info/PKG-INFO +1 -1
  5. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/pyproject.toml +1 -1
  6. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/__init__.py +0 -0
  7. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/apply_patch/__init__.py +0 -0
  8. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/apply_patch/core.py +0 -0
  9. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/apply_patch/definition.py +0 -0
  10. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/__init__.py +0 -0
  11. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/definition.py +0 -0
  12. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/event_storage.py +0 -0
  13. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/impl.py +0 -0
  14. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/logging_fix.py +0 -0
  15. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/recording.py +0 -0
  16. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/browser_use/server.py +0 -0
  17. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/delegate/__init__.py +0 -0
  18. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/delegate/definition.py +0 -0
  19. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/delegate/impl.py +0 -0
  20. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/delegate/templates/delegate_tool_description.j2 +0 -0
  21. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/delegate/visualizer.py +0 -0
  22. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/__init__.py +0 -0
  23. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/definition.py +0 -0
  24. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/editor.py +0 -0
  25. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/exceptions.py +0 -0
  26. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/impl.py +0 -0
  27. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/__init__.py +0 -0
  28. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/config.py +0 -0
  29. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/constants.py +0 -0
  30. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/diff.py +0 -0
  31. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/encoding.py +0 -0
  32. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/file_cache.py +0 -0
  33. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/history.py +0 -0
  34. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/file_editor/utils/shell.py +0 -0
  35. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/__init__.py +0 -0
  36. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/edit/__init__.py +0 -0
  37. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/edit/definition.py +0 -0
  38. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/edit/impl.py +0 -0
  39. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/list_directory/__init__.py +0 -0
  40. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/list_directory/definition.py +0 -0
  41. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/list_directory/impl.py +0 -0
  42. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/read_file/__init__.py +0 -0
  43. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/read_file/definition.py +0 -0
  44. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/read_file/impl.py +0 -0
  45. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/write_file/__init__.py +0 -0
  46. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/write_file/definition.py +0 -0
  47. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/gemini/write_file/impl.py +0 -0
  48. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/glob/__init__.py +0 -0
  49. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/glob/definition.py +0 -0
  50. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/glob/impl.py +0 -0
  51. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/grep/__init__.py +0 -0
  52. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/grep/definition.py +0 -0
  53. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/grep/impl.py +0 -0
  54. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/planning_file_editor/__init__.py +0 -0
  55. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/planning_file_editor/definition.py +0 -0
  56. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/planning_file_editor/impl.py +0 -0
  57. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/__init__.py +0 -0
  58. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/default.py +0 -0
  59. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/gemini.py +0 -0
  60. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/gpt5.py +0 -0
  61. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/planning.py +0 -0
  62. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/subagents/bash_runner.md +0 -0
  63. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/subagents/code_explorer.md +0 -0
  64. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/subagents/default.md +0 -0
  65. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/preset/subagents/web_researcher.md +0 -0
  66. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/py.typed +0 -0
  67. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task/__init__.py +0 -0
  68. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task/definition.py +0 -0
  69. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task/impl.py +0 -0
  70. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task_tracker/__init__.py +0 -0
  71. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/task_tracker/definition.py +0 -0
  72. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/__init__.py +0 -0
  73. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/constants.py +0 -0
  74. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/definition.py +0 -0
  75. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/descriptions.py +0 -0
  76. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/impl.py +0 -0
  77. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/metadata.py +0 -0
  78. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/__init__.py +0 -0
  79. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/factory.py +0 -0
  80. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/interface.py +0 -0
  81. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/subprocess_terminal.py +0 -0
  82. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/terminal_session.py +0 -0
  83. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/tmux_pane_pool.py +0 -0
  84. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/terminal/tmux_terminal.py +0 -0
  85. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/timeout_policy.py +0 -0
  86. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/utils/__init__.py +0 -0
  87. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/utils/command.py +0 -0
  88. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/terminal/utils/escape_filter.py +0 -0
  89. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/tom_consult/__init__.py +0 -0
  90. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/tom_consult/definition.py +0 -0
  91. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/tom_consult/executor.py +0 -0
  92. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/utils/__init__.py +0 -0
  93. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/utils/timeout.py +0 -0
  94. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/workflow/__init__.py +0 -0
  95. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/workflow/definition.py +0 -0
  96. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands/tools/workflow/impl.py +0 -0
  97. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands_tools.egg-info/SOURCES.txt +0 -0
  98. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands_tools.egg-info/dependency_links.txt +0 -0
  99. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands_tools.egg-info/requires.txt +0 -0
  100. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/openhands_tools.egg-info/top_level.txt +0 -0
  101. {openhands_tools-1.29.0 → openhands_tools-1.29.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.29.0
3
+ Version: 1.29.2
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
@@ -355,19 +355,17 @@ class TaskManager:
355
355
  try:
356
356
  task.conversation.send_message(prompt, sender=parent_name)
357
357
  self._run_until_finished(task.id, task.conversation)
358
- # A run-limit stop (cost budget or iteration cap) ends the
359
- # sub-conversation in ERROR without raising; surface that to the
360
- # parent instead of an empty "completed" result.
361
- if (
362
- task.conversation.state.execution_status
363
- == ConversationExecutionStatus.ERROR
364
- ):
365
- task.set_error(self._run_error_detail(task.conversation))
366
- logger.warning(f"Task '{task.id}' ended with an error.")
367
- else:
358
+ status = task.conversation.state.execution_status
359
+ if status == ConversationExecutionStatus.FINISHED:
368
360
  result = get_agent_final_response(task.conversation.state.events)
369
361
  task.set_result(result)
370
362
  logger.info(f"Task '{task.id}' completed.")
363
+ else:
364
+ # Any non-FINISHED terminal status (run-limit, stuck, paused, ...)
365
+ # is surfaced as an error, not an empty "completed"; the detail
366
+ # keeps partial output so the parent can use/retry it.
367
+ task.set_error(self._run_stop_detail(task.conversation, status))
368
+ logger.warning(f"Task '{task.id}' stopped: status '{status.value}'.")
371
369
  except Exception as e:
372
370
  task.set_error(str(e))
373
371
  logger.warning(f"Task {task.id} failed with error: {e}")
@@ -378,17 +376,24 @@ class TaskManager:
378
376
  return task
379
377
 
380
378
  @staticmethod
381
- def _run_error_detail(conversation: LocalConversation) -> str:
382
- """Best-effort detail for a sub-agent run that ended in ERROR (e.g. the
383
- cost budget or iteration cap), so the parent sees why it stopped."""
379
+ def _run_stop_detail(
380
+ conversation: LocalConversation,
381
+ status: ConversationExecutionStatus,
382
+ ) -> str:
383
+ """Why a sub-agent stopped without finishing (run-limit, stuck, paused, ...),
384
+ plus any partial output so the parent isn't left with nothing to use."""
384
385
  errors = [
385
386
  e
386
387
  for e in conversation.state.events
387
388
  if isinstance(e, ConversationErrorEvent)
388
389
  ]
389
- if errors:
390
- return errors[-1].detail
391
- return "Sub-agent run ended with an error."
390
+ reason = (
391
+ errors[-1].detail
392
+ if errors
393
+ else f"Sub-agent stopped without finishing (status: {status.value})."
394
+ )
395
+ partial = get_agent_final_response(conversation.state.events)
396
+ return f"{reason}\nPartial result:\n{partial}" if partial else reason
392
397
 
393
398
  def _run_until_finished(
394
399
  self, task_id: str, conversation: LocalConversation
@@ -390,6 +390,12 @@ if ($toStop.Count -gt 0) {{ exit 0 }} else {{ exit 1 }}
390
390
  if self.process is None or self.process.poll() is not None:
391
391
  return False
392
392
 
393
+ # Kill descendants while they are still attached to the persistent
394
+ # PowerShell process. CTRL_BREAK can interrupt the waiting script first,
395
+ # leaving launched child processes alive but no longer discoverable as
396
+ # descendants of the shell.
397
+ terminated_children = self._terminate_child_processes()
398
+
393
399
  sent_ctrl_break = False
394
400
  ctrl_break_event = getattr(signal, "CTRL_BREAK_EVENT", None)
395
401
  if platform.system() == "Windows" and ctrl_break_event is not None:
@@ -402,7 +408,7 @@ if ($toStop.Count -gt 0) {{ exit 0 }} else {{ exit 1 }}
402
408
  if sent_ctrl_break:
403
409
  time.sleep(_INTERRUPT_GRACE_SECONDS)
404
410
 
405
- terminated_children = self._terminate_child_processes()
411
+ terminated_children = self._terminate_child_processes() or terminated_children
406
412
  sent_ctrl_c_input = False
407
413
  if not sent_ctrl_break and not terminated_children:
408
414
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhands-tools
3
- Version: 1.29.0
3
+ Version: 1.29.2
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.29.0"
3
+ version = "1.29.2"
4
4
  description = "OpenHands Tools - Runtime tools for AI agents"
5
5
 
6
6
  requires-python = ">=3.12"