axio-tools-docker 0.6.2__tar.gz → 0.7.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.
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/PKG-INFO +5 -5
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/README.md +2 -2
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/pyproject.toml +3 -3
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/handler.py +10 -10
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/plugin.py +2 -2
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/tests/test_handler.py +6 -6
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/.github/workflows/publish.yml +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/.github/workflows/tests.yml +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/.gitignore +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/LICENSE +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/Makefile +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/__init__.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/config.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/manager.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/settings.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/tui/__init__.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/src/axio_tools_docker/tui/docker.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/tests/test_config.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/tests/test_manager.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/tests/test_plugin.py +0 -0
- {axio_tools_docker-0.6.2 → axio_tools_docker-0.7.0}/uv.lock +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: axio-tools-docker
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Docker sandbox tools for Axio
|
|
5
|
-
Project-URL: Homepage, https://github.com/axio-agent
|
|
6
|
-
Project-URL: Repository, https://github.com/axio-agent
|
|
5
|
+
Project-URL: Homepage, https://github.com/mosquito/axio-agent
|
|
6
|
+
Project-URL: Repository, https://github.com/mosquito/axio-agent
|
|
7
7
|
License: MIT
|
|
8
8
|
License-File: LICENSE
|
|
9
9
|
Keywords: agent,ai,docker,llm,sandbox,tools
|
|
@@ -17,7 +17,7 @@ Description-Content-Type: text/markdown
|
|
|
17
17
|
[](https://pypi.org/project/axio-tools-docker/)
|
|
18
18
|
[](LICENSE)
|
|
19
19
|
|
|
20
|
-
Docker sandbox tools for [axio](https://github.com/axio-agent
|
|
20
|
+
Docker sandbox tools for [axio](https://github.com/mosquito/axio-agent).
|
|
21
21
|
|
|
22
22
|
Run agent-generated code and commands inside isolated Docker containers. The agent gets `sandbox_exec`, `sandbox_write`, and `sandbox_read` tools that operate entirely within the sandbox — the host filesystem stays untouched.
|
|
23
23
|
|
|
@@ -135,7 +135,7 @@ docker = "axio_tools_docker.plugin:DockerPlugin"
|
|
|
135
135
|
|
|
136
136
|
## Part of the axio ecosystem
|
|
137
137
|
|
|
138
|
-
[axio](https://github.com/axio-agent
|
|
138
|
+
[axio](https://github.com/mosquito/axio-agent) · [axio-tools-local](https://github.com/mosquito/axio-agent) · [axio-tools-mcp](https://github.com/mosquito/axio-agent) · [axio-tui](https://github.com/mosquito/axio-agent)
|
|
139
139
|
|
|
140
140
|
## License
|
|
141
141
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://pypi.org/project/axio-tools-docker/)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
Docker sandbox tools for [axio](https://github.com/axio-agent
|
|
7
|
+
Docker sandbox tools for [axio](https://github.com/mosquito/axio-agent).
|
|
8
8
|
|
|
9
9
|
Run agent-generated code and commands inside isolated Docker containers. The agent gets `sandbox_exec`, `sandbox_write`, and `sandbox_read` tools that operate entirely within the sandbox — the host filesystem stays untouched.
|
|
10
10
|
|
|
@@ -122,7 +122,7 @@ docker = "axio_tools_docker.plugin:DockerPlugin"
|
|
|
122
122
|
|
|
123
123
|
## Part of the axio ecosystem
|
|
124
124
|
|
|
125
|
-
[axio](https://github.com/axio-agent
|
|
125
|
+
[axio](https://github.com/mosquito/axio-agent) · [axio-tools-local](https://github.com/mosquito/axio-agent) · [axio-tools-mcp](https://github.com/mosquito/axio-agent) · [axio-tui](https://github.com/mosquito/axio-agent)
|
|
126
126
|
|
|
127
127
|
## License
|
|
128
128
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "axio-tools-docker"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.7.0"
|
|
4
4
|
description = "Docker sandbox tools for Axio"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -13,8 +13,8 @@ docker = "axio_tools_docker.plugin:DockerPlugin"
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
[project.urls]
|
|
16
|
-
Homepage = "https://github.com/axio-agent
|
|
17
|
-
Repository = "https://github.com/axio-agent
|
|
16
|
+
Homepage = "https://github.com/mosquito/axio-agent"
|
|
17
|
+
Repository = "https://github.com/mosquito/axio-agent"
|
|
18
18
|
[build-system]
|
|
19
19
|
requires = ["hatchling"]
|
|
20
20
|
build-backend = "hatchling.build"
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import ClassVar
|
|
5
|
+
from typing import Any, ClassVar
|
|
6
6
|
|
|
7
7
|
from axio.tool import ToolHandler
|
|
8
8
|
|
|
9
9
|
from .manager import SandboxManager
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
def build_sandbox_exec(manager: SandboxManager) -> type[ToolHandler]:
|
|
12
|
+
def build_sandbox_exec(manager: SandboxManager) -> type[ToolHandler[Any]]:
|
|
13
13
|
"""Create a ToolHandler that executes commands in the sandbox."""
|
|
14
14
|
|
|
15
|
-
class SandboxExecHandler(ToolHandler):
|
|
15
|
+
class SandboxExecHandler(ToolHandler[Any]):
|
|
16
16
|
"""Execute a shell command inside a Docker sandbox container.
|
|
17
17
|
Returns combined stdout/stderr. Non-zero exit codes are reported.
|
|
18
18
|
Use for running code, tests, or CLI tools in an isolated environment."""
|
|
@@ -22,7 +22,7 @@ def build_sandbox_exec(manager: SandboxManager) -> type[ToolHandler]:
|
|
|
22
22
|
|
|
23
23
|
_manager: ClassVar[SandboxManager]
|
|
24
24
|
|
|
25
|
-
async def __call__(self) -> str:
|
|
25
|
+
async def __call__(self, context: Any) -> str:
|
|
26
26
|
if not self._manager.docker_available():
|
|
27
27
|
return "Error: Docker is not installed or not on PATH"
|
|
28
28
|
return await self._manager.exec(self.command, timeout=self.timeout)
|
|
@@ -31,10 +31,10 @@ def build_sandbox_exec(manager: SandboxManager) -> type[ToolHandler]:
|
|
|
31
31
|
return SandboxExecHandler
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def build_sandbox_write(manager: SandboxManager) -> type[ToolHandler]:
|
|
34
|
+
def build_sandbox_write(manager: SandboxManager) -> type[ToolHandler[Any]]:
|
|
35
35
|
"""Create a ToolHandler that writes files in the sandbox."""
|
|
36
36
|
|
|
37
|
-
class SandboxWriteHandler(ToolHandler):
|
|
37
|
+
class SandboxWriteHandler(ToolHandler[Any]):
|
|
38
38
|
"""Write content to a file inside the Docker sandbox container.
|
|
39
39
|
Creates parent directories as needed. Use for placing source code,
|
|
40
40
|
config files, or test data in the sandbox."""
|
|
@@ -44,7 +44,7 @@ def build_sandbox_write(manager: SandboxManager) -> type[ToolHandler]:
|
|
|
44
44
|
|
|
45
45
|
_manager: ClassVar[SandboxManager]
|
|
46
46
|
|
|
47
|
-
async def __call__(self) -> str:
|
|
47
|
+
async def __call__(self, context: Any) -> str:
|
|
48
48
|
if not self._manager.docker_available():
|
|
49
49
|
return "Error: Docker is not installed or not on PATH"
|
|
50
50
|
return await self._manager.write_file(self.path, self.content)
|
|
@@ -53,10 +53,10 @@ def build_sandbox_write(manager: SandboxManager) -> type[ToolHandler]:
|
|
|
53
53
|
return SandboxWriteHandler
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def build_sandbox_read(manager: SandboxManager) -> type[ToolHandler]:
|
|
56
|
+
def build_sandbox_read(manager: SandboxManager) -> type[ToolHandler[Any]]:
|
|
57
57
|
"""Create a ToolHandler that reads files from the sandbox."""
|
|
58
58
|
|
|
59
|
-
class SandboxReadHandler(ToolHandler):
|
|
59
|
+
class SandboxReadHandler(ToolHandler[Any]):
|
|
60
60
|
"""Read the contents of a file from the Docker sandbox container.
|
|
61
61
|
Returns the full file content as text."""
|
|
62
62
|
|
|
@@ -64,7 +64,7 @@ def build_sandbox_read(manager: SandboxManager) -> type[ToolHandler]:
|
|
|
64
64
|
|
|
65
65
|
_manager: ClassVar[SandboxManager]
|
|
66
66
|
|
|
67
|
-
async def __call__(self) -> str:
|
|
67
|
+
async def __call__(self, context: Any) -> str:
|
|
68
68
|
if not self._manager.docker_available():
|
|
69
69
|
return "Error: Docker is not installed or not on PATH"
|
|
70
70
|
return await self._manager.read_file(self.path)
|
|
@@ -23,7 +23,7 @@ class DockerPlugin:
|
|
|
23
23
|
|
|
24
24
|
def __init__(self) -> None:
|
|
25
25
|
self._manager = SandboxManager()
|
|
26
|
-
self._tools: list[Tool] = []
|
|
26
|
+
self._tools: list[Tool[Any]] = []
|
|
27
27
|
self._config: Any = None
|
|
28
28
|
self._global_config: Any = None
|
|
29
29
|
|
|
@@ -75,7 +75,7 @@ class DockerPlugin:
|
|
|
75
75
|
]
|
|
76
76
|
|
|
77
77
|
@property
|
|
78
|
-
def all_tools(self) -> list[Tool]:
|
|
78
|
+
def all_tools(self) -> list[Tool[Any]]:
|
|
79
79
|
return self._tools
|
|
80
80
|
|
|
81
81
|
def settings_screen(self) -> Any:
|
|
@@ -17,7 +17,7 @@ async def test_exec_handler_forwards_to_manager() -> None:
|
|
|
17
17
|
instance = cast(type[Any], handler_cls)(command="echo hi", timeout=10)
|
|
18
18
|
|
|
19
19
|
with patch.object(SandboxManager, "docker_available", return_value=True):
|
|
20
|
-
result = await instance()
|
|
20
|
+
result = await instance({})
|
|
21
21
|
|
|
22
22
|
assert result == "output"
|
|
23
23
|
manager.exec.assert_awaited_once_with("echo hi", timeout=10)
|
|
@@ -31,7 +31,7 @@ async def test_write_handler_forwards_to_manager() -> None:
|
|
|
31
31
|
instance = cast(type[Any], handler_cls)(path="/workspace/test.py", content="print('hi')")
|
|
32
32
|
|
|
33
33
|
with patch.object(SandboxManager, "docker_available", return_value=True):
|
|
34
|
-
result = await instance()
|
|
34
|
+
result = await instance({})
|
|
35
35
|
|
|
36
36
|
assert result == "Wrote /workspace/test.py"
|
|
37
37
|
manager.write_file.assert_awaited_once_with("/workspace/test.py", "print('hi')")
|
|
@@ -45,7 +45,7 @@ async def test_read_handler_forwards_to_manager() -> None:
|
|
|
45
45
|
instance = cast(type[Any], handler_cls)(path="/workspace/test.py")
|
|
46
46
|
|
|
47
47
|
with patch.object(SandboxManager, "docker_available", return_value=True):
|
|
48
|
-
result = await instance()
|
|
48
|
+
result = await instance({})
|
|
49
49
|
|
|
50
50
|
assert result == "file content"
|
|
51
51
|
manager.read_file.assert_awaited_once_with("/workspace/test.py")
|
|
@@ -57,7 +57,7 @@ async def test_exec_handler_returns_error_when_docker_missing() -> None:
|
|
|
57
57
|
instance = cast(type[Any], handler_cls)(command="echo hi")
|
|
58
58
|
|
|
59
59
|
with patch.object(SandboxManager, "docker_available", return_value=False):
|
|
60
|
-
result = await instance()
|
|
60
|
+
result = await instance({})
|
|
61
61
|
|
|
62
62
|
assert "not installed" in result
|
|
63
63
|
|
|
@@ -68,7 +68,7 @@ async def test_write_handler_returns_error_when_docker_missing() -> None:
|
|
|
68
68
|
instance = cast(type[Any], handler_cls)(path="/test", content="x")
|
|
69
69
|
|
|
70
70
|
with patch.object(SandboxManager, "docker_available", return_value=False):
|
|
71
|
-
result = await instance()
|
|
71
|
+
result = await instance({})
|
|
72
72
|
|
|
73
73
|
assert "not installed" in result
|
|
74
74
|
|
|
@@ -79,7 +79,7 @@ async def test_read_handler_returns_error_when_docker_missing() -> None:
|
|
|
79
79
|
instance = cast(type[Any], handler_cls)(path="/test")
|
|
80
80
|
|
|
81
81
|
with patch.object(SandboxManager, "docker_available", return_value=False):
|
|
82
|
-
result = await instance()
|
|
82
|
+
result = await instance({})
|
|
83
83
|
|
|
84
84
|
assert "not installed" in result
|
|
85
85
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|