openhands 1.0.0__py3-none-any.whl → 1.0.2__py3-none-any.whl
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.
Potentially problematic release.
This version of openhands might be problematic. Click here for more details.
- {openhands-1.0.0.dist-info → openhands-1.0.2.dist-info}/METADATA +3 -3
- {openhands-1.0.0.dist-info → openhands-1.0.2.dist-info}/RECORD +10 -10
- openhands_cli/__init__.py +7 -2
- openhands_cli/agent_chat.py +1 -0
- openhands_cli/gui_launcher.py +1 -10
- openhands_cli/tui/tui.py +0 -2
- openhands_cli/user_actions/agent_action.py +8 -22
- openhands_cli/user_actions/settings_action.py +7 -1
- {openhands-1.0.0.dist-info → openhands-1.0.2.dist-info}/WHEEL +0 -0
- {openhands-1.0.0.dist-info → openhands-1.0.2.dist-info}/entry_points.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openhands
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: OpenHands CLI - Terminal User Interface for OpenHands AI Agent
|
|
5
5
|
Author-email: OpenHands Team <contact@all-hands.dev>
|
|
6
6
|
License: MIT
|
|
@@ -8,8 +8,8 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
8
8
|
Classifier: Programming Language :: Python :: 3.12
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.13
|
|
10
10
|
Requires-Python: >=3.12
|
|
11
|
-
Requires-Dist: openhands-sdk
|
|
12
|
-
Requires-Dist: openhands-tools
|
|
11
|
+
Requires-Dist: openhands-sdk==1.0.0a3
|
|
12
|
+
Requires-Dist: openhands-tools==1.0.0a3
|
|
13
13
|
Requires-Dist: prompt-toolkit>=3
|
|
14
14
|
Requires-Dist: typer>=0.17.4
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
openhands_cli/__init__.py,sha256=
|
|
2
|
-
openhands_cli/agent_chat.py,sha256=
|
|
3
|
-
openhands_cli/gui_launcher.py,sha256=
|
|
1
|
+
openhands_cli/__init__.py,sha256=AqdjE-Up0uBSDyHvNjF0zWHNmA4ps-lsQWFpUWCWNEc,187
|
|
2
|
+
openhands_cli/agent_chat.py,sha256=FZ1NC31xJPXqyFGUtS-JqDI_HVP5155xEz59AHp3DIw,6224
|
|
3
|
+
openhands_cli/gui_launcher.py,sha256=EnZGcZMQzOHLwkmiHcYvt4WX2HfK0aT6L0t5ADWEfT0,7198
|
|
4
4
|
openhands_cli/llm_utils.py,sha256=eRhAjysm77GvzArKb-75agqTlR_4zzxTrYD1eQbgqbg,1606
|
|
5
5
|
openhands_cli/locations.py,sha256=zG5OnpJiX0kQ1fprEsOSi_cNqydEvxunPBCTpNrVaJ0,438
|
|
6
6
|
openhands_cli/pt_style.py,sha256=UxCxV-t88n5JjjYYMD0jf5apg4B5-WkfQ4EX_Eusj1I,1266
|
|
@@ -14,18 +14,18 @@ openhands_cli/listeners/loading_listener.py,sha256=9sbuy64iAPqgvNojS-3RlWvepmaMC
|
|
|
14
14
|
openhands_cli/listeners/pause_listener.py,sha256=FtWxj8T5r2lYIoquueeCf-3kF3zFMJ2e25wqOeF7QtM,2622
|
|
15
15
|
openhands_cli/tui/__init__.py,sha256=2KA7nugQxpIj4sEVDJavBbGHqcnySJFSvbPu1WRonPg,84
|
|
16
16
|
openhands_cli/tui/status.py,sha256=QNbS9OEK6d_c0P1eEQKfytuUF1R7uPxFl5nN-yv3cdA,3628
|
|
17
|
-
openhands_cli/tui/tui.py,sha256=
|
|
17
|
+
openhands_cli/tui/tui.py,sha256=JBahocaunF0LwJJLkcCmwSZN9xydb3SmH7fb8Jw8rFc,3545
|
|
18
18
|
openhands_cli/tui/utils.py,sha256=t7vJHU_AcLzuLTPku88Aqd51jyWY8HwH5Y2n-Bpa-WU,536
|
|
19
19
|
openhands_cli/tui/settings/mcp_screen.py,sha256=LMdcGD6DfwZQ4jnp-KM4gYiPXfNGHHPAqtEAXLKZtmA,8215
|
|
20
20
|
openhands_cli/tui/settings/settings_screen.py,sha256=CRekM2ZgWJ_YgzC-Jg1SgX2YeviU69Hb1cuzi5pVdio,7087
|
|
21
21
|
openhands_cli/tui/settings/store.py,sha256=tTMvYbdu9gs4GDNBoHFGFJnwm1PfjShgsVoMDjpQJ2Y,3485
|
|
22
22
|
openhands_cli/user_actions/__init__.py,sha256=Tf-lQj7-6bNl5rohSdcAFApkKbQb-N9JcKZgHa1HF60,501
|
|
23
|
-
openhands_cli/user_actions/agent_action.py,sha256=
|
|
23
|
+
openhands_cli/user_actions/agent_action.py,sha256=Q0nW6zv7j1D1ys95FCI13rqQhw0sXlw820Dp9qR4WyY,2704
|
|
24
24
|
openhands_cli/user_actions/exit_session.py,sha256=3u1CqWeYAEYfZi9BFh_dUwvy9aXXuvFbsZUHNGjVzuY,624
|
|
25
|
-
openhands_cli/user_actions/settings_action.py,sha256=
|
|
25
|
+
openhands_cli/user_actions/settings_action.py,sha256=QqWj37CAlrkV6FW9SEmmwsvKzdGyUYv4DlGjUweKsmg,5707
|
|
26
26
|
openhands_cli/user_actions/types.py,sha256=zMHoJqxmtbxAIq6O3RC-XoGzgbZzWZvRFNMOGW4MViQ,407
|
|
27
27
|
openhands_cli/user_actions/utils.py,sha256=qPTgP_1shnWgA7itrzTyfEGb_meXO-zq98JzFMUqCx4,6362
|
|
28
|
-
openhands-1.0.
|
|
29
|
-
openhands-1.0.
|
|
30
|
-
openhands-1.0.
|
|
31
|
-
openhands-1.0.
|
|
28
|
+
openhands-1.0.2.dist-info/METADATA,sha256=5gHL3EOjKBnIudPRwnTlEf6bklW03QK19fV6yXtvxxA,1388
|
|
29
|
+
openhands-1.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
30
|
+
openhands-1.0.2.dist-info/entry_points.txt,sha256=CltyhTfx4lPndNPQXrZZDj5LmXrYXykVyIqoedPXsas,61
|
|
31
|
+
openhands-1.0.2.dist-info/RECORD,,
|
openhands_cli/__init__.py
CHANGED
openhands_cli/agent_chat.py
CHANGED
openhands_cli/gui_launcher.py
CHANGED
|
@@ -113,21 +113,12 @@ def launch_gui_server(mount_cwd: bool = False, gpu: bool = False) -> None:
|
|
|
113
113
|
pull_cmd = ['docker', 'pull', runtime_image]
|
|
114
114
|
print_formatted_text(HTML(_format_docker_command_for_logging(pull_cmd)))
|
|
115
115
|
try:
|
|
116
|
-
subprocess.run(
|
|
117
|
-
pull_cmd,
|
|
118
|
-
check=True,
|
|
119
|
-
timeout=300, # 5 minutes timeout
|
|
120
|
-
)
|
|
116
|
+
subprocess.run(pull_cmd, check=True)
|
|
121
117
|
except subprocess.CalledProcessError:
|
|
122
118
|
print_formatted_text(
|
|
123
119
|
HTML('<ansired>❌ Failed to pull runtime image.</ansired>')
|
|
124
120
|
)
|
|
125
121
|
sys.exit(1)
|
|
126
|
-
except subprocess.TimeoutExpired:
|
|
127
|
-
print_formatted_text(
|
|
128
|
-
HTML('<ansired>❌ Timeout while pulling runtime image.</ansired>')
|
|
129
|
-
)
|
|
130
|
-
sys.exit(1)
|
|
131
122
|
|
|
132
123
|
print_formatted_text('')
|
|
133
124
|
print_formatted_text(
|
openhands_cli/tui/tui.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import html
|
|
1
2
|
from prompt_toolkit import HTML, print_formatted_text
|
|
2
3
|
|
|
3
4
|
from openhands.sdk.security.confirmation_policy import (
|
|
@@ -37,14 +38,13 @@ def ask_user_confirmation(
|
|
|
37
38
|
or '[unknown action]'
|
|
38
39
|
)
|
|
39
40
|
print_formatted_text(
|
|
40
|
-
HTML(f'<grey> {i}. {tool_name}: {action_content}...</grey>')
|
|
41
|
+
HTML(f'<grey> {i}. {tool_name}: {html.escape(action_content)}...</grey>')
|
|
41
42
|
)
|
|
42
43
|
|
|
43
44
|
question = 'Choose an option:'
|
|
44
45
|
options = [
|
|
45
46
|
'Yes, proceed',
|
|
46
|
-
'
|
|
47
|
-
'No, reject with reason',
|
|
47
|
+
'Reject',
|
|
48
48
|
"Always proceed (don't ask again)",
|
|
49
49
|
]
|
|
50
50
|
|
|
@@ -60,32 +60,18 @@ def ask_user_confirmation(
|
|
|
60
60
|
if index == 0:
|
|
61
61
|
return ConfirmationResult(decision=UserConfirmation.ACCEPT)
|
|
62
62
|
elif index == 1:
|
|
63
|
-
|
|
64
|
-
elif index == 2:
|
|
63
|
+
# Handle "Reject" option with optional reason
|
|
65
64
|
try:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
69
|
-
except Exception:
|
|
70
|
-
return ConfirmationResult(decision=UserConfirmation.DEFER)
|
|
71
|
-
|
|
72
|
-
# Support both string return and (reason, cancelled) tuple for tests
|
|
73
|
-
cancelled = False
|
|
74
|
-
if isinstance(reason_result, tuple) and len(reason_result) >= 1:
|
|
75
|
-
reason = reason_result[0] or ''
|
|
76
|
-
cancelled = bool(reason_result[1]) if len(reason_result) > 1 else False
|
|
77
|
-
else:
|
|
78
|
-
reason = str(reason_result or '').strip()
|
|
79
|
-
|
|
80
|
-
if cancelled:
|
|
65
|
+
reason = cli_text_input('Reason (and let OpenHands know why): ').strip()
|
|
66
|
+
except (EOFError, KeyboardInterrupt):
|
|
81
67
|
return ConfirmationResult(decision=UserConfirmation.DEFER)
|
|
82
68
|
|
|
83
69
|
return ConfirmationResult(decision=UserConfirmation.REJECT, reason=reason)
|
|
84
|
-
elif index ==
|
|
70
|
+
elif index == 2:
|
|
85
71
|
return ConfirmationResult(
|
|
86
72
|
decision=UserConfirmation.ACCEPT, policy_change=NeverConfirm()
|
|
87
73
|
)
|
|
88
|
-
elif index ==
|
|
74
|
+
elif index == 3:
|
|
89
75
|
return ConfirmationResult(
|
|
90
76
|
decision=UserConfirmation.ACCEPT,
|
|
91
77
|
policy_change=ConfirmRisky(threshold=SecurityRisk.HIGH),
|
|
@@ -123,9 +123,15 @@ def prompt_api_key(
|
|
|
123
123
|
validator = NonEmptyValueValidator()
|
|
124
124
|
|
|
125
125
|
question = helper_text + step_counter.next_step(question)
|
|
126
|
-
|
|
126
|
+
user_input = cli_text_input(
|
|
127
127
|
question, escapable=escapable, validator=validator, is_password=True
|
|
128
128
|
)
|
|
129
|
+
|
|
130
|
+
# If user pressed ENTER with existing key (empty input), return the existing key
|
|
131
|
+
if existing_api_key and not user_input.strip():
|
|
132
|
+
return existing_api_key.get_secret_value()
|
|
133
|
+
|
|
134
|
+
return user_input
|
|
129
135
|
|
|
130
136
|
|
|
131
137
|
# Advanced settings functions
|
|
File without changes
|
|
File without changes
|