rc-openhands-sdk 0.1.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.
- rc_openhands_sdk-0.1.0/LICENSE +21 -0
- rc_openhands_sdk-0.1.0/MANIFEST.in +3 -0
- rc_openhands_sdk-0.1.0/NOTICE +10 -0
- rc_openhands_sdk-0.1.0/PKG-INFO +44 -0
- rc_openhands_sdk-0.1.0/PUBLISHING.md +28 -0
- rc_openhands_sdk-0.1.0/README.md +23 -0
- rc_openhands_sdk-0.1.0/UPSTREAM.md +36 -0
- rc_openhands_sdk-0.1.0/pyproject.toml +41 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk/MIT_ONLY_MANIFEST.json +30 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk/__init__.py +10 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk/acp.py +9 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk/cli.py +26 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk/license_guard.py +12 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/PKG-INFO +44 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/SOURCES.txt +19 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/dependency_links.txt +1 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/entry_points.txt +3 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/requires.txt +2 -0
- rc_openhands_sdk-0.1.0/rc_openhands_sdk.egg-info/top_level.txt +1 -0
- rc_openhands_sdk-0.1.0/setup.cfg +4 -0
- rc_openhands_sdk-0.1.0/tests/test_cli_wrappers.py +59 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 RingCentral AI Desk
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
RcOpenHandsSDK wraps MIT-licensed OpenHands local CLI/SDK packages.
|
|
2
|
+
|
|
3
|
+
Upstream packages:
|
|
4
|
+
- openhands 1.16.0, MIT License, Copyright (c) 2025 All Hands AI
|
|
5
|
+
- openhands-sdk 1.21.0, MIT License, OpenHands software-agent-sdk
|
|
6
|
+
|
|
7
|
+
Excluded from this distribution:
|
|
8
|
+
- OpenHands enterprise/ directory
|
|
9
|
+
- Hosted OpenHands Cloud service code and deployment integrations
|
|
10
|
+
- Any source or artifact whose license cannot be verified as MIT-compatible
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rc-openhands-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: RingCentral MIT-only OpenHands SDK distribution and CLI wrapper
|
|
5
|
+
Author: RingCentral AI Desk
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
|
|
8
|
+
Project-URL: Source, https://github.com/OpenHands/software-agent-sdk/tree/v1.21.0
|
|
9
|
+
Keywords: openhands,sdk,agent,cli,ringcentral
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Requires-Python: <3.13,>=3.12
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
License-File: NOTICE
|
|
18
|
+
Requires-Dist: openhands==1.16.0
|
|
19
|
+
Requires-Dist: openhands-sdk==1.21.0
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# RcOpenHandsSDK
|
|
23
|
+
|
|
24
|
+
RcOpenHandsSDK is AI Desk's MIT-only OpenHands distribution wrapper.
|
|
25
|
+
It exposes stable RingCentral-owned CLI entry points while delegating to the
|
|
26
|
+
upstream OpenHands CLI and SDK packages pinned below:
|
|
27
|
+
|
|
28
|
+
- `openhands==1.16.0`
|
|
29
|
+
- `openhands-sdk==1.21.0`
|
|
30
|
+
|
|
31
|
+
The package intentionally excludes OpenHands Cloud and `enterprise/` code. It
|
|
32
|
+
only depends on the upstream packages distributed under MIT-compatible terms for
|
|
33
|
+
the local CLI/SDK replacement path used by AI Desk daemon verification.
|
|
34
|
+
|
|
35
|
+
## Commands
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
rcopenhands --version
|
|
39
|
+
rcopenhands-acp --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
AI Desk still uses the internal `openhands` agent type for compatibility with
|
|
43
|
+
existing task/session payloads, but CLI detection now resolves that type to the
|
|
44
|
+
`rcopenhands` command.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Publishing
|
|
2
|
+
|
|
3
|
+
Build artifacts:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
uv build
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Current local artifacts:
|
|
10
|
+
|
|
11
|
+
- `dist/rc_openhands_sdk-0.1.0-py3-none-any.whl`
|
|
12
|
+
- `dist/rc_openhands_sdk-0.1.0.tar.gz`
|
|
13
|
+
|
|
14
|
+
Install from the local artifact:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
uv venv --python 3.12 /private/tmp/aidesk-rcopenhands-sdk
|
|
18
|
+
uv pip install --python /private/tmp/aidesk-rcopenhands-sdk/bin/python dist/rc_openhands_sdk-0.1.0-py3-none-any.whl
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Remote publishing requires a configured package repository and credentials, for
|
|
22
|
+
example `TWINE_USERNAME`/`TWINE_PASSWORD` or an equivalent Nexus/PyPI token:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
uv publish --publish-url <repository-url> dist/*
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Do not publish a build that includes `enterprise/` or hosted Cloud source.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# RcOpenHandsSDK
|
|
2
|
+
|
|
3
|
+
RcOpenHandsSDK is AI Desk's MIT-only OpenHands distribution wrapper.
|
|
4
|
+
It exposes stable RingCentral-owned CLI entry points while delegating to the
|
|
5
|
+
upstream OpenHands CLI and SDK packages pinned below:
|
|
6
|
+
|
|
7
|
+
- `openhands==1.16.0`
|
|
8
|
+
- `openhands-sdk==1.21.0`
|
|
9
|
+
|
|
10
|
+
The package intentionally excludes OpenHands Cloud and `enterprise/` code. It
|
|
11
|
+
only depends on the upstream packages distributed under MIT-compatible terms for
|
|
12
|
+
the local CLI/SDK replacement path used by AI Desk daemon verification.
|
|
13
|
+
|
|
14
|
+
## Commands
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
rcopenhands --version
|
|
18
|
+
rcopenhands-acp --help
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
AI Desk still uses the internal `openhands` agent type for compatibility with
|
|
22
|
+
existing task/session payloads, but CLI detection now resolves that type to the
|
|
23
|
+
`rcopenhands` command.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Upstream Boundary
|
|
2
|
+
|
|
3
|
+
RcOpenHandsSDK is the AI Desk distribution boundary for the local OpenHands
|
|
4
|
+
replacement path.
|
|
5
|
+
|
|
6
|
+
## Included
|
|
7
|
+
|
|
8
|
+
- `openhands==1.16.0`
|
|
9
|
+
- `openhands-sdk==1.21.0`
|
|
10
|
+
- `openhands-tools==1.21.0`
|
|
11
|
+
- `openhands-workspace==1.11.1`
|
|
12
|
+
|
|
13
|
+
The package exposes RingCentral-owned commands:
|
|
14
|
+
|
|
15
|
+
- `rcopenhands`
|
|
16
|
+
- `rcopenhands-acp`
|
|
17
|
+
|
|
18
|
+
AI Desk keeps the internal agent type as `openhands` for API compatibility, but
|
|
19
|
+
daemon detection and execution must resolve that type to the `rcopenhands`
|
|
20
|
+
command.
|
|
21
|
+
|
|
22
|
+
## Excluded
|
|
23
|
+
|
|
24
|
+
- `enterprise/`
|
|
25
|
+
- hosted OpenHands Cloud flows
|
|
26
|
+
- any source or artifact whose license cannot be verified for the local
|
|
27
|
+
MIT replacement scope
|
|
28
|
+
|
|
29
|
+
## License Notes
|
|
30
|
+
|
|
31
|
+
RcOpenHandsSDK itself is MIT. The upstream OpenHands CLI package metadata
|
|
32
|
+
declares MIT. The SDK source boundary is tracked against the OpenHands
|
|
33
|
+
`software-agent-sdk` MIT repository and tag used by the pinned package.
|
|
34
|
+
|
|
35
|
+
Third-party transitive dependencies keep their own upstream licenses; they are
|
|
36
|
+
not vendored into RcOpenHandsSDK.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "rc-openhands-sdk"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "RingCentral MIT-only OpenHands SDK distribution and CLI wrapper"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.12,<3.13"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE", "NOTICE"]
|
|
13
|
+
authors = [
|
|
14
|
+
{ name = "RingCentral AI Desk" }
|
|
15
|
+
]
|
|
16
|
+
keywords = ["openhands", "sdk", "agent", "cli", "ringcentral"]
|
|
17
|
+
classifiers = [
|
|
18
|
+
"Development Status :: 3 - Alpha",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Topic :: Software Development :: Libraries :: Python Modules"
|
|
22
|
+
]
|
|
23
|
+
dependencies = [
|
|
24
|
+
"openhands==1.16.0",
|
|
25
|
+
"openhands-sdk==1.21.0"
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.scripts]
|
|
29
|
+
rcopenhands = "rc_openhands_sdk.cli:main"
|
|
30
|
+
rcopenhands-acp = "rc_openhands_sdk.acp:main"
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/OpenHands/software-agent-sdk"
|
|
34
|
+
Source = "https://github.com/OpenHands/software-agent-sdk/tree/v1.21.0"
|
|
35
|
+
|
|
36
|
+
[tool.setuptools.packages.find]
|
|
37
|
+
where = ["."]
|
|
38
|
+
include = ["rc_openhands_sdk*"]
|
|
39
|
+
|
|
40
|
+
[tool.setuptools.package-data]
|
|
41
|
+
rc_openhands_sdk = ["MIT_ONLY_MANIFEST.json"]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"package": "RcOpenHandsSDK",
|
|
3
|
+
"license": "MIT",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"upstream": [
|
|
6
|
+
{
|
|
7
|
+
"name": "openhands",
|
|
8
|
+
"version": "1.16.0",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"entry_points": [
|
|
11
|
+
"openhands_cli.entrypoint:main",
|
|
12
|
+
"openhands_cli.acp:main"
|
|
13
|
+
],
|
|
14
|
+
"source": "https://github.com/OpenHands/OpenHands-CLI"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"name": "openhands-sdk",
|
|
18
|
+
"version": "1.21.0",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"source": "https://github.com/OpenHands/software-agent-sdk/tree/v1.21.0"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"excluded": [
|
|
24
|
+
"enterprise/",
|
|
25
|
+
"OpenHands Cloud hosted service integrations",
|
|
26
|
+
"Any artifact whose license cannot be verified as MIT-compatible"
|
|
27
|
+
],
|
|
28
|
+
"ai_desk_agent_type": "openhands",
|
|
29
|
+
"ai_desk_command": "rcopenhands"
|
|
30
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""RingCentral-owned entry point for the MIT-only OpenHands CLI path."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
7
|
+
|
|
8
|
+
from rc_openhands_sdk import __version__
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _package_version(package: str) -> str:
|
|
12
|
+
try:
|
|
13
|
+
return version(package)
|
|
14
|
+
except PackageNotFoundError:
|
|
15
|
+
return "unknown"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def main() -> None:
|
|
19
|
+
if len(sys.argv) > 1 and sys.argv[1] in {"--version", "-v"}:
|
|
20
|
+
openhands_version = _package_version("openhands")
|
|
21
|
+
print(f"RcOpenHandsSDK {__version__} (OpenHands CLI {openhands_version})")
|
|
22
|
+
return
|
|
23
|
+
|
|
24
|
+
from openhands_cli.entrypoint import main as openhands_main
|
|
25
|
+
|
|
26
|
+
openhands_main()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Helpers for reading the MIT-only package manifest."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from importlib import resources
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_manifest() -> dict[str, Any]:
|
|
11
|
+
data = resources.files(__package__).joinpath("MIT_ONLY_MANIFEST.json").read_text(encoding="utf-8")
|
|
12
|
+
return json.loads(data)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rc-openhands-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: RingCentral MIT-only OpenHands SDK distribution and CLI wrapper
|
|
5
|
+
Author: RingCentral AI Desk
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/OpenHands/software-agent-sdk
|
|
8
|
+
Project-URL: Source, https://github.com/OpenHands/software-agent-sdk/tree/v1.21.0
|
|
9
|
+
Keywords: openhands,sdk,agent,cli,ringcentral
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Requires-Python: <3.13,>=3.12
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
License-File: NOTICE
|
|
18
|
+
Requires-Dist: openhands==1.16.0
|
|
19
|
+
Requires-Dist: openhands-sdk==1.21.0
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# RcOpenHandsSDK
|
|
23
|
+
|
|
24
|
+
RcOpenHandsSDK is AI Desk's MIT-only OpenHands distribution wrapper.
|
|
25
|
+
It exposes stable RingCentral-owned CLI entry points while delegating to the
|
|
26
|
+
upstream OpenHands CLI and SDK packages pinned below:
|
|
27
|
+
|
|
28
|
+
- `openhands==1.16.0`
|
|
29
|
+
- `openhands-sdk==1.21.0`
|
|
30
|
+
|
|
31
|
+
The package intentionally excludes OpenHands Cloud and `enterprise/` code. It
|
|
32
|
+
only depends on the upstream packages distributed under MIT-compatible terms for
|
|
33
|
+
the local CLI/SDK replacement path used by AI Desk daemon verification.
|
|
34
|
+
|
|
35
|
+
## Commands
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
rcopenhands --version
|
|
39
|
+
rcopenhands-acp --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
AI Desk still uses the internal `openhands` agent type for compatibility with
|
|
43
|
+
existing task/session payloads, but CLI detection now resolves that type to the
|
|
44
|
+
`rcopenhands` command.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
3
|
+
NOTICE
|
|
4
|
+
PUBLISHING.md
|
|
5
|
+
README.md
|
|
6
|
+
UPSTREAM.md
|
|
7
|
+
pyproject.toml
|
|
8
|
+
rc_openhands_sdk/MIT_ONLY_MANIFEST.json
|
|
9
|
+
rc_openhands_sdk/__init__.py
|
|
10
|
+
rc_openhands_sdk/acp.py
|
|
11
|
+
rc_openhands_sdk/cli.py
|
|
12
|
+
rc_openhands_sdk/license_guard.py
|
|
13
|
+
rc_openhands_sdk.egg-info/PKG-INFO
|
|
14
|
+
rc_openhands_sdk.egg-info/SOURCES.txt
|
|
15
|
+
rc_openhands_sdk.egg-info/dependency_links.txt
|
|
16
|
+
rc_openhands_sdk.egg-info/entry_points.txt
|
|
17
|
+
rc_openhands_sdk.egg-info/requires.txt
|
|
18
|
+
rc_openhands_sdk.egg-info/top_level.txt
|
|
19
|
+
tests/test_cli_wrappers.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
rc_openhands_sdk
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from types import ModuleType
|
|
3
|
+
|
|
4
|
+
from rc_openhands_sdk import __version__
|
|
5
|
+
from rc_openhands_sdk import acp, cli
|
|
6
|
+
from rc_openhands_sdk.license_guard import load_manifest
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_version_is_available() -> None:
|
|
10
|
+
assert __version__
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_manifest_is_mit_only() -> None:
|
|
14
|
+
manifest = load_manifest()
|
|
15
|
+
assert manifest["license"] == "MIT"
|
|
16
|
+
assert manifest["ai_desk_command"] == "rcopenhands"
|
|
17
|
+
assert "enterprise/" in manifest["excluded"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_cli_version_is_fast_and_ringcentral_owned(monkeypatch, capsys) -> None:
|
|
21
|
+
monkeypatch.setattr(sys, "argv", ["rcopenhands", "--version"])
|
|
22
|
+
|
|
23
|
+
cli.main()
|
|
24
|
+
|
|
25
|
+
assert "RcOpenHandsSDK" in capsys.readouterr().out
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_cli_delegates_to_openhands_entrypoint() -> None:
|
|
29
|
+
calls: list[str] = []
|
|
30
|
+
package = ModuleType("openhands_cli")
|
|
31
|
+
entrypoint = ModuleType("openhands_cli.entrypoint")
|
|
32
|
+
|
|
33
|
+
def fake_main() -> None:
|
|
34
|
+
calls.append("cli")
|
|
35
|
+
|
|
36
|
+
entrypoint.main = fake_main # type: ignore[attr-defined]
|
|
37
|
+
sys.modules["openhands_cli"] = package
|
|
38
|
+
sys.modules["openhands_cli.entrypoint"] = entrypoint
|
|
39
|
+
|
|
40
|
+
cli.main()
|
|
41
|
+
|
|
42
|
+
assert calls == ["cli"]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_acp_delegates_to_openhands_acp() -> None:
|
|
46
|
+
calls: list[str] = []
|
|
47
|
+
package = ModuleType("openhands_cli")
|
|
48
|
+
acp_module = ModuleType("openhands_cli.acp")
|
|
49
|
+
|
|
50
|
+
def fake_main() -> None:
|
|
51
|
+
calls.append("acp")
|
|
52
|
+
|
|
53
|
+
acp_module.main = fake_main # type: ignore[attr-defined]
|
|
54
|
+
sys.modules["openhands_cli"] = package
|
|
55
|
+
sys.modules["openhands_cli.acp"] = acp_module
|
|
56
|
+
|
|
57
|
+
acp.main()
|
|
58
|
+
|
|
59
|
+
assert calls == ["acp"]
|