agy-sandbox 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.
- agy_sandbox-0.1.0/LICENSE +21 -0
- agy_sandbox-0.1.0/PKG-INFO +187 -0
- agy_sandbox-0.1.0/README.md +160 -0
- agy_sandbox-0.1.0/agy_sandbox/__init__.py +3 -0
- agy_sandbox-0.1.0/agy_sandbox/__main__.py +6 -0
- agy_sandbox-0.1.0/agy_sandbox/assets/Dockerfile +24 -0
- agy_sandbox-0.1.0/agy_sandbox/assets/Dockerfile_permissive +67 -0
- agy_sandbox-0.1.0/agy_sandbox/assets/agy-sandbox +33 -0
- agy_sandbox-0.1.0/agy_sandbox/assets/agy-sandbox.ps1 +66 -0
- agy_sandbox-0.1.0/agy_sandbox/assets/agy-sandbox.svg +59 -0
- agy_sandbox-0.1.0/agy_sandbox/cli.py +235 -0
- agy_sandbox-0.1.0/agy_sandbox/config.py +120 -0
- agy_sandbox-0.1.0/agy_sandbox/engine.py +333 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/PKG-INFO +187 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/SOURCES.txt +22 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/dependency_links.txt +1 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/entry_points.txt +2 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/requires.txt +2 -0
- agy_sandbox-0.1.0/agy_sandbox.egg-info/top_level.txt +1 -0
- agy_sandbox-0.1.0/pyproject.toml +49 -0
- agy_sandbox-0.1.0/setup.cfg +4 -0
- agy_sandbox-0.1.0/tests/test_cli.py +114 -0
- agy_sandbox-0.1.0/tests/test_config.py +58 -0
- agy_sandbox-0.1.0/tests/test_engine.py +320 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lideta Technologies
|
|
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,187 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agy-sandbox
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Secure, isolated development environments powered by Docker and the Antigravity AI agent
|
|
5
|
+
Author-email: "ze@lideta.ai" <ze@lideta.ai>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/lideta-technologies/agy-sandbox
|
|
8
|
+
Project-URL: Repository, https://github.com/lideta-technologies/agy-sandbox
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Operating System :: MacOS
|
|
19
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
20
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: click>=8.1.0
|
|
25
|
+
Requires-Dist: docker>=7.0.0
|
|
26
|
+
Dynamic: license-file
|
|
27
|
+
|
|
28
|
+
# agy-sandbox
|
|
29
|
+
|
|
30
|
+
<p align="center">
|
|
31
|
+
<img src="agy_sandbox/assets/agy-sandbox.svg" alt="agy-sandbox logo" width="380px" />
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
Secure, isolated development environments powered by Docker and the Antigravity AI agent.
|
|
35
|
+
|
|
36
|
+
[](https://pypi.org/project/agy-sandbox/)
|
|
37
|
+
[](https://pypi.org/project/agy-sandbox/)
|
|
38
|
+
[](https://github.com/lideta-technologies/agy-sandbox/blob/main/LICENSE)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Why does this exist?
|
|
43
|
+
|
|
44
|
+
Antigravity CLI's default safety constraints require too much manual intervention, but granting the agent full system access is a security risk.
|
|
45
|
+
|
|
46
|
+
`agy-sandbox` solves this by running the CLI inside an isolated Docker container. This gives the AI agent the freedom to execute tasks autonomously while strictly preventing it from accessing
|
|
47
|
+
or modifying your host machine. In short, the tool minimizes the blast radius if something bad happens.
|
|
48
|
+
|
|
49
|
+
This Python package is meant to abstract the underlying Docker commands and handle OS-specific configurations, providing a streamlined, cross-platform sandbox out of the box.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Prerequisites
|
|
54
|
+
|
|
55
|
+
Ensure your system has:
|
|
56
|
+
* **Python**: 3.10+
|
|
57
|
+
* **Docker**: 24.0+ (and running)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Installation
|
|
62
|
+
|
|
63
|
+
Install via pip:
|
|
64
|
+
```bash
|
|
65
|
+
pip install agy-sandbox
|
|
66
|
+
```
|
|
67
|
+
Or using uv:
|
|
68
|
+
```bash
|
|
69
|
+
uv pip install agy-sandbox
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Install from Source (Development)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
#### Clone the repository
|
|
76
|
+
```bash
|
|
77
|
+
git clone https://github.com/lideta-technologies/agy-sandbox.git
|
|
78
|
+
cd agy-sandbox
|
|
79
|
+
```
|
|
80
|
+
#### Install in development mode (editable)
|
|
81
|
+
```bash
|
|
82
|
+
uv venv
|
|
83
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
84
|
+
uv pip install -e .
|
|
85
|
+
```
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Quick Start & Usage
|
|
89
|
+
|
|
90
|
+
When you run `agy-sandbox` on a project directory, the tool automatically handles the container lifecycles:
|
|
91
|
+
* **Running** ➜ Connects directly via `docker exec`.
|
|
92
|
+
* **Stopped** ➜ Starts the container, then connects.
|
|
93
|
+
* **Nonexistent** ➜ Builds the image, runs the container, and initializes the remote agent session.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Provision and start a sandbox (default provider is Google AI Studio)
|
|
97
|
+
agy-sandbox /path/to/your/project
|
|
98
|
+
|
|
99
|
+
# Explicitly specify Vertex AI billing
|
|
100
|
+
agy-sandbox /path/to/your/project --provider vertex
|
|
101
|
+
|
|
102
|
+
# List all sandbox containers
|
|
103
|
+
agy-sandbox list
|
|
104
|
+
|
|
105
|
+
# Stop a sandbox container (accepts current workspace, a custom path, or direct container name)
|
|
106
|
+
agy-sandbox stop
|
|
107
|
+
agy-sandbox stop /path/to/your/project
|
|
108
|
+
|
|
109
|
+
# Remove a sandbox container (accepts current workspace, a custom path, or direct container name)
|
|
110
|
+
agy-sandbox remove
|
|
111
|
+
agy-sandbox remove /path/to/your/project
|
|
112
|
+
|
|
113
|
+
# View container logs
|
|
114
|
+
agy-sandbox logs --follow
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Switching Providers and Authentication State
|
|
120
|
+
|
|
121
|
+
AI Studio uses a simple web authentication mechanism. Vertex AI requires a Google Cloud project setup with Application Default Credentials (ADC) configured on your host (`gcloud auth application-default login`).
|
|
122
|
+
|
|
123
|
+
Switching between them is not always as simple as changing an environment variable because the Antigravity CLI prioritizes cached Google OAuth sessions over new configurations.
|
|
124
|
+
|
|
125
|
+
### How to Switch Providers
|
|
126
|
+
To switch from Google AI Studio to Google Vertex AI:
|
|
127
|
+
|
|
128
|
+
1. **Log out of your active session**:
|
|
129
|
+
Inside the active `/workspace` terminal of the container (or from the `agy` prompt), run:
|
|
130
|
+
```bash
|
|
131
|
+
agy logout
|
|
132
|
+
# (Or type /logout directly in the active agent session)
|
|
133
|
+
```
|
|
134
|
+
2. **Re-run with your new provider**:
|
|
135
|
+
```bash
|
|
136
|
+
agy-sandbox /path/to/your/project --provider vertex
|
|
137
|
+
```
|
|
138
|
+
3. **Select GCP Project Option**:
|
|
139
|
+
When prompted, choose option **`2. Use a Google Cloud project`**. This bypasses the cached Google AI Studio OAuth flow and forces the CLI to use your mounted ADC credentials.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## How It Works (Volume Mounts)
|
|
144
|
+
|
|
145
|
+
The following host paths are automatically mounted into your isolated container:
|
|
146
|
+
|
|
147
|
+
| Host Path | Container Path | Purpose |
|
|
148
|
+
|-----------|----------------|---------|
|
|
149
|
+
| Your project directory | `/workspace` | Project code (live-mounted) |
|
|
150
|
+
| `~/.config/antigravity` | `~/.config/antigravity` | Antigravity auth tokens and agent state |
|
|
151
|
+
| `~/.gemini` | `~/.gemini_host` (re-mapped) | Google Gemini credentials |
|
|
152
|
+
| `~/.cache/uv` | `~/.cache/uv` | Shared python package cache |
|
|
153
|
+
| `~/.local/share/uv` | `~/.local/share/uv` | Shared python binaries and environments |
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Contributing
|
|
158
|
+
|
|
159
|
+
We welcome contributions to help improve `agy-sandbox`.
|
|
160
|
+
|
|
161
|
+
### Development Setup
|
|
162
|
+
1. Clone the repository:
|
|
163
|
+
```bash
|
|
164
|
+
git clone https://github.com/lideta-technologies/agy-sandbox.git
|
|
165
|
+
cd agy-sandbox
|
|
166
|
+
```
|
|
167
|
+
2. Create and activate a virtual environment:
|
|
168
|
+
```bash
|
|
169
|
+
python3 -m venv .venv
|
|
170
|
+
source .venv/bin/activate
|
|
171
|
+
```
|
|
172
|
+
3. Install dependencies in editable mode:
|
|
173
|
+
```bash
|
|
174
|
+
pip install -e ".[dev]" pytest pytest-cov
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Running Tests
|
|
178
|
+
Make sure all unit tests run and pass before submitting a pull request:
|
|
179
|
+
```bash
|
|
180
|
+
pytest --cov=agy_sandbox --cov-report=term-missing
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## License
|
|
186
|
+
|
|
187
|
+
MIT
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# agy-sandbox
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="agy_sandbox/assets/agy-sandbox.svg" alt="agy-sandbox logo" width="380px" />
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
Secure, isolated development environments powered by Docker and the Antigravity AI agent.
|
|
8
|
+
|
|
9
|
+
[](https://pypi.org/project/agy-sandbox/)
|
|
10
|
+
[](https://pypi.org/project/agy-sandbox/)
|
|
11
|
+
[](https://github.com/lideta-technologies/agy-sandbox/blob/main/LICENSE)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Why does this exist?
|
|
16
|
+
|
|
17
|
+
Antigravity CLI's default safety constraints require too much manual intervention, but granting the agent full system access is a security risk.
|
|
18
|
+
|
|
19
|
+
`agy-sandbox` solves this by running the CLI inside an isolated Docker container. This gives the AI agent the freedom to execute tasks autonomously while strictly preventing it from accessing
|
|
20
|
+
or modifying your host machine. In short, the tool minimizes the blast radius if something bad happens.
|
|
21
|
+
|
|
22
|
+
This Python package is meant to abstract the underlying Docker commands and handle OS-specific configurations, providing a streamlined, cross-platform sandbox out of the box.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Prerequisites
|
|
27
|
+
|
|
28
|
+
Ensure your system has:
|
|
29
|
+
* **Python**: 3.10+
|
|
30
|
+
* **Docker**: 24.0+ (and running)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Installation
|
|
35
|
+
|
|
36
|
+
Install via pip:
|
|
37
|
+
```bash
|
|
38
|
+
pip install agy-sandbox
|
|
39
|
+
```
|
|
40
|
+
Or using uv:
|
|
41
|
+
```bash
|
|
42
|
+
uv pip install agy-sandbox
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Install from Source (Development)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
#### Clone the repository
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/lideta-technologies/agy-sandbox.git
|
|
51
|
+
cd agy-sandbox
|
|
52
|
+
```
|
|
53
|
+
#### Install in development mode (editable)
|
|
54
|
+
```bash
|
|
55
|
+
uv venv
|
|
56
|
+
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
57
|
+
uv pip install -e .
|
|
58
|
+
```
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Quick Start & Usage
|
|
62
|
+
|
|
63
|
+
When you run `agy-sandbox` on a project directory, the tool automatically handles the container lifecycles:
|
|
64
|
+
* **Running** ➜ Connects directly via `docker exec`.
|
|
65
|
+
* **Stopped** ➜ Starts the container, then connects.
|
|
66
|
+
* **Nonexistent** ➜ Builds the image, runs the container, and initializes the remote agent session.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Provision and start a sandbox (default provider is Google AI Studio)
|
|
70
|
+
agy-sandbox /path/to/your/project
|
|
71
|
+
|
|
72
|
+
# Explicitly specify Vertex AI billing
|
|
73
|
+
agy-sandbox /path/to/your/project --provider vertex
|
|
74
|
+
|
|
75
|
+
# List all sandbox containers
|
|
76
|
+
agy-sandbox list
|
|
77
|
+
|
|
78
|
+
# Stop a sandbox container (accepts current workspace, a custom path, or direct container name)
|
|
79
|
+
agy-sandbox stop
|
|
80
|
+
agy-sandbox stop /path/to/your/project
|
|
81
|
+
|
|
82
|
+
# Remove a sandbox container (accepts current workspace, a custom path, or direct container name)
|
|
83
|
+
agy-sandbox remove
|
|
84
|
+
agy-sandbox remove /path/to/your/project
|
|
85
|
+
|
|
86
|
+
# View container logs
|
|
87
|
+
agy-sandbox logs --follow
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Switching Providers and Authentication State
|
|
93
|
+
|
|
94
|
+
AI Studio uses a simple web authentication mechanism. Vertex AI requires a Google Cloud project setup with Application Default Credentials (ADC) configured on your host (`gcloud auth application-default login`).
|
|
95
|
+
|
|
96
|
+
Switching between them is not always as simple as changing an environment variable because the Antigravity CLI prioritizes cached Google OAuth sessions over new configurations.
|
|
97
|
+
|
|
98
|
+
### How to Switch Providers
|
|
99
|
+
To switch from Google AI Studio to Google Vertex AI:
|
|
100
|
+
|
|
101
|
+
1. **Log out of your active session**:
|
|
102
|
+
Inside the active `/workspace` terminal of the container (or from the `agy` prompt), run:
|
|
103
|
+
```bash
|
|
104
|
+
agy logout
|
|
105
|
+
# (Or type /logout directly in the active agent session)
|
|
106
|
+
```
|
|
107
|
+
2. **Re-run with your new provider**:
|
|
108
|
+
```bash
|
|
109
|
+
agy-sandbox /path/to/your/project --provider vertex
|
|
110
|
+
```
|
|
111
|
+
3. **Select GCP Project Option**:
|
|
112
|
+
When prompted, choose option **`2. Use a Google Cloud project`**. This bypasses the cached Google AI Studio OAuth flow and forces the CLI to use your mounted ADC credentials.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## How It Works (Volume Mounts)
|
|
117
|
+
|
|
118
|
+
The following host paths are automatically mounted into your isolated container:
|
|
119
|
+
|
|
120
|
+
| Host Path | Container Path | Purpose |
|
|
121
|
+
|-----------|----------------|---------|
|
|
122
|
+
| Your project directory | `/workspace` | Project code (live-mounted) |
|
|
123
|
+
| `~/.config/antigravity` | `~/.config/antigravity` | Antigravity auth tokens and agent state |
|
|
124
|
+
| `~/.gemini` | `~/.gemini_host` (re-mapped) | Google Gemini credentials |
|
|
125
|
+
| `~/.cache/uv` | `~/.cache/uv` | Shared python package cache |
|
|
126
|
+
| `~/.local/share/uv` | `~/.local/share/uv` | Shared python binaries and environments |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Contributing
|
|
131
|
+
|
|
132
|
+
We welcome contributions to help improve `agy-sandbox`.
|
|
133
|
+
|
|
134
|
+
### Development Setup
|
|
135
|
+
1. Clone the repository:
|
|
136
|
+
```bash
|
|
137
|
+
git clone https://github.com/lideta-technologies/agy-sandbox.git
|
|
138
|
+
cd agy-sandbox
|
|
139
|
+
```
|
|
140
|
+
2. Create and activate a virtual environment:
|
|
141
|
+
```bash
|
|
142
|
+
python3 -m venv .venv
|
|
143
|
+
source .venv/bin/activate
|
|
144
|
+
```
|
|
145
|
+
3. Install dependencies in editable mode:
|
|
146
|
+
```bash
|
|
147
|
+
pip install -e ".[dev]" pytest pytest-cov
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Running Tests
|
|
151
|
+
Make sure all unit tests run and pass before submitting a pull request:
|
|
152
|
+
```bash
|
|
153
|
+
pytest --cov=agy_sandbox --cov-report=term-missing
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## License
|
|
159
|
+
|
|
160
|
+
MIT
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
FROM ubuntu:24.04
|
|
2
|
+
|
|
3
|
+
ARG USER_UID=1001
|
|
4
|
+
ARG USER_GID=1001
|
|
5
|
+
|
|
6
|
+
RUN apt-get update && apt-get install -y curl git gh sudo nodejs npm && rm -rf /var/lib/apt/lists/*
|
|
7
|
+
|
|
8
|
+
# Dynamically handle user creation without touching or breaking UID 1000
|
|
9
|
+
RUN if [ "$USER_UID" = "1000" ]; then \
|
|
10
|
+
echo "ubuntu ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \
|
|
11
|
+
else \
|
|
12
|
+
groupadd --gid $USER_GID developer && \
|
|
13
|
+
useradd --uid $USER_UID --gid $USER_GID -m -s /bin/bash developer && \
|
|
14
|
+
echo "developer ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
USER ${USER_UID:-1001}
|
|
18
|
+
WORKDIR /workspace
|
|
19
|
+
|
|
20
|
+
RUN curl -fsSL https://antigravity.google/cli/install.sh | bash
|
|
21
|
+
RUN curl -LsSf https://astral.sh/install.sh | sh
|
|
22
|
+
|
|
23
|
+
ENV PATH="/home/developer/.local/bin:/home/ubuntu/.local/bin:${PATH}"
|
|
24
|
+
CMD ["bash"]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
FROM ubuntu:24.04
|
|
2
|
+
|
|
3
|
+
# Aligned defaults to match your user account
|
|
4
|
+
ARG USER_UID=1002
|
|
5
|
+
ARG USER_GID=1002
|
|
6
|
+
|
|
7
|
+
RUN apt-get update && apt-get install -y curl git gh sudo nodejs npm && rm -rf /var/lib/apt/lists/*
|
|
8
|
+
|
|
9
|
+
# Dynamically handle user creation without touching or breaking UID 1000
|
|
10
|
+
RUN if [ "$USER_UID" = "1000" ]; then \
|
|
11
|
+
echo "ubuntu ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \
|
|
12
|
+
else \
|
|
13
|
+
groupadd --gid $USER_GID developer && \
|
|
14
|
+
useradd --uid $USER_UID --gid $USER_GID -m -s /bin/bash developer && \
|
|
15
|
+
echo "developer ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers; \
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Create entrypoint to safely clone host auth and inject permissive sandbox settings
|
|
19
|
+
RUN echo '#!/bin/bash' > /usr/local/bin/entrypoint.sh && \
|
|
20
|
+
echo 'USER_HOME=$(eval echo "~$USER")' >> /usr/local/bin/entrypoint.sh && \
|
|
21
|
+
echo 'LOCAL_GEMINI="$USER_HOME/.gemini"' >> /usr/local/bin/entrypoint.sh && \
|
|
22
|
+
echo 'HOST_GEMINI="$USER_HOME/.gemini_host"' >> /usr/local/bin/entrypoint.sh && \
|
|
23
|
+
echo 'mkdir -p "$LOCAL_GEMINI"' >> /usr/local/bin/entrypoint.sh && \
|
|
24
|
+
echo 'if [ -d "$HOST_GEMINI" ]; then' >> /usr/local/bin/entrypoint.sh && \
|
|
25
|
+
echo ' cp -R "$HOST_GEMINI"/. "$LOCAL_GEMINI/" 2>/dev/null' >> /usr/local/bin/entrypoint.sh && \
|
|
26
|
+
echo 'fi' >> /usr/local/bin/entrypoint.sh && \
|
|
27
|
+
echo 'mkdir -p "$LOCAL_GEMINI/antigravity-cli"' >> /usr/local/bin/entrypoint.sh && \
|
|
28
|
+
echo 'cat << "EOF" > "$LOCAL_GEMINI/antigravity-cli/settings.json"' >> /usr/local/bin/entrypoint.sh && \
|
|
29
|
+
echo '{' >> /usr/local/bin/entrypoint.sh && \
|
|
30
|
+
echo ' "colorScheme": "solarized light",' >> /usr/local/bin/entrypoint.sh && \
|
|
31
|
+
echo ' "enableTelemetry": false,' >> /usr/local/bin/entrypoint.sh && \
|
|
32
|
+
echo ' "gcp": {' >> /usr/local/bin/entrypoint.sh && \
|
|
33
|
+
echo ' "project": "lideta-products",' >> /usr/local/bin/entrypoint.sh && \
|
|
34
|
+
echo ' "location": "global"' >> /usr/local/bin/entrypoint.sh && \
|
|
35
|
+
echo ' },' >> /usr/local/bin/entrypoint.sh && \
|
|
36
|
+
echo ' "model": "Gemini 3.1 Pro (High)",' >> /usr/local/bin/entrypoint.sh && \
|
|
37
|
+
echo ' "toolPermission": "always-proceed",' >> /usr/local/bin/entrypoint.sh && \
|
|
38
|
+
echo ' "artifactReviewPolicy": "always-proceed",' >> /usr/local/bin/entrypoint.sh && \
|
|
39
|
+
echo ' "enableTerminalSandbox": false,' >> /usr/local/bin/entrypoint.sh && \
|
|
40
|
+
echo ' "allowNonWorkspaceAccess": true,' >> /usr/local/bin/entrypoint.sh && \
|
|
41
|
+
echo ' "permissions": {' >> /usr/local/bin/entrypoint.sh && \
|
|
42
|
+
echo ' "allow": [' >> /usr/local/bin/entrypoint.sh && \
|
|
43
|
+
echo ' "command(*)",' >> /usr/local/bin/entrypoint.sh && \
|
|
44
|
+
echo ' "write_file(*)",' >> /usr/local/bin/entrypoint.sh && \
|
|
45
|
+
echo ' "read_file(*)",' >> /usr/local/bin/entrypoint.sh && \
|
|
46
|
+
echo ' "read_url(*)",' >> /usr/local/bin/entrypoint.sh && \
|
|
47
|
+
echo ' "execute_url(*)",' >> /usr/local/bin/entrypoint.sh && \
|
|
48
|
+
echo ' "mcp(*)"' >> /usr/local/bin/entrypoint.sh && \
|
|
49
|
+
echo ' ]' >> /usr/local/bin/entrypoint.sh && \
|
|
50
|
+
echo ' }' >> /usr/local/bin/entrypoint.sh && \
|
|
51
|
+
echo '}' >> /usr/local/bin/entrypoint.sh && \
|
|
52
|
+
echo 'EOF' >> /usr/local/bin/entrypoint.sh && \
|
|
53
|
+
echo 'exec "$@"' >> /usr/local/bin/entrypoint.sh && \
|
|
54
|
+
chmod +x /usr/local/bin/entrypoint.sh
|
|
55
|
+
|
|
56
|
+
USER ${USER_UID:-1002}
|
|
57
|
+
WORKDIR /workspace
|
|
58
|
+
|
|
59
|
+
RUN curl -fsSL https://antigravity.google/cli/install.sh | bash
|
|
60
|
+
RUN curl -LsSf https://astral.sh/install.sh | sh
|
|
61
|
+
|
|
62
|
+
# Enforce non-interactive runtime
|
|
63
|
+
ENV ANTIGRAVITY_INTERACTIVE=false
|
|
64
|
+
ENV PATH="/home/developer/.local/bin:/home/ubuntu/.local/bin:${PATH}"
|
|
65
|
+
|
|
66
|
+
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
67
|
+
CMD ["bash"]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# agy-sandbox: Cross-platform wrapper script for the agy-sandbox Python package
|
|
3
|
+
# This script provides backward compatibility with the original manage-agy.sh
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
# Find the agy-sandbox command (should be in PATH after installation)
|
|
8
|
+
if command -v agy-sandbox &> /dev/null; then
|
|
9
|
+
AGY_CMD="agy-sandbox"
|
|
10
|
+
elif command -v agy-sandbox.exe &> /dev/null; then
|
|
11
|
+
AGY_CMD="agy-sandbox.exe"
|
|
12
|
+
else
|
|
13
|
+
echo "Error: agy-sandbox command not found." >&2
|
|
14
|
+
echo "Please install it with: pip install agy-sandbox" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Map old arguments to new CLI format
|
|
19
|
+
# Original: manage-agy.sh <project-dir> [studio|vertex]
|
|
20
|
+
# New: agy-sandbox provision <project-dir> --provider <studio|vertex>
|
|
21
|
+
|
|
22
|
+
PROJECT_DIR="${1:-.}"
|
|
23
|
+
PROVIDER="${2:-studio}"
|
|
24
|
+
|
|
25
|
+
# Validate provider
|
|
26
|
+
if [[ "$PROVIDER" != "studio" && "$PROVIDER" != "vertex" ]]; then
|
|
27
|
+
echo "Error: Invalid provider '$PROVIDER'. Use 'studio' or 'vertex'." >&2
|
|
28
|
+
echo "Usage: $0 /path/to/project [studio|vertex]" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Run the Python CLI
|
|
33
|
+
exec $AGY_CMD provision "$PROJECT_DIR" --provider "$PROVIDER" "$@"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<#
|
|
2
|
+
.SYNOPSIS
|
|
3
|
+
agy-sandbox: Cross-platform wrapper script for the agy-sandbox Python package on Windows.
|
|
4
|
+
|
|
5
|
+
.DESCRIPTION
|
|
6
|
+
This script provides backward compatibility with the original manage-agy.sh on Windows
|
|
7
|
+
using PowerShell. It calls the agy-sandbox Python CLI.
|
|
8
|
+
|
|
9
|
+
.EXAMPLE
|
|
10
|
+
.\agy-sandbox.ps1 ..\custodian-kernel vertex
|
|
11
|
+
.\agy-sandbox.ps1 C:\path\to\project
|
|
12
|
+
#>
|
|
13
|
+
|
|
14
|
+
param(
|
|
15
|
+
[Parameter(Position = 0)]
|
|
16
|
+
[string]$ProjectDir = ".",
|
|
17
|
+
|
|
18
|
+
[Parameter(Position = 1)]
|
|
19
|
+
[ValidateSet("studio", "vertex")]
|
|
20
|
+
[string]$Provider = "studio"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
$ErrorActionPreference = "Stop"
|
|
24
|
+
|
|
25
|
+
# Find the agy-sandbox command
|
|
26
|
+
$agyCmd = $null
|
|
27
|
+
|
|
28
|
+
# Try Python directly first
|
|
29
|
+
$pythonExe = Get-Command python -ErrorAction SilentlyContinue
|
|
30
|
+
if ($pythonExe) {
|
|
31
|
+
$pythonPath = $pythonExe.Source
|
|
32
|
+
$agyScript = Join-Path (Split-Path $pythonPath -Parent) "agy-sandbox.exe" -ErrorAction SilentlyContinue
|
|
33
|
+
if (Test-Path $agyScript) {
|
|
34
|
+
$agyCmd = $agyScript
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Try agy-sandbox in PATH
|
|
39
|
+
if (-not $agyCmd) {
|
|
40
|
+
$agyInPath = Get-Command agy-sandbox -ErrorAction SilentlyContinue
|
|
41
|
+
if ($agyInPath) {
|
|
42
|
+
$agyCmd = $agyInPath.Source
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (-not $agyCmd) {
|
|
47
|
+
Write-Error "agy-sandbox command not found."
|
|
48
|
+
Write-Error "Please install it with: pip install agy-sandbox"
|
|
49
|
+
exit 1
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Resolve project directory to absolute path
|
|
53
|
+
if (-not [System.IO.Path]::IsPathRooted($ProjectDir)) {
|
|
54
|
+
$ProjectDir = Join-Path (Get-Location) $ProjectDir
|
|
55
|
+
}
|
|
56
|
+
$ProjectDir = (Resolve-Path $ProjectDir -ErrorAction SilentlyContinue).Path
|
|
57
|
+
|
|
58
|
+
if (-not (Test-Path $ProjectDir)) {
|
|
59
|
+
Write-Error "Project directory '$ProjectDir' does not exist."
|
|
60
|
+
exit 1
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Run the Python CLI
|
|
64
|
+
& $agyCmd provision $ProjectDir --provider $Provider
|
|
65
|
+
$exitCode = $LASTEXITCODE
|
|
66
|
+
exit $exitCode
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 240" fill="none" width="100%" height="100%">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Background subtle dark container glow -->
|
|
4
|
+
<radialGradient id="aurora" cx="50%" cy="50%" r="50%">
|
|
5
|
+
<stop offset="0%" stop-color="#FF5E62" stop-opacity="0.15"/>
|
|
6
|
+
<stop offset="50%" stop-color="#34A853" stop-opacity="0.05"/>
|
|
7
|
+
<stop offset="100%" stop-color="#000000" stop-opacity="0"/>
|
|
8
|
+
</radialGradient>
|
|
9
|
+
|
|
10
|
+
<!-- Lideta Coral Gradient -->
|
|
11
|
+
<linearGradient id="lidetaCoral" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
12
|
+
<stop offset="0%" stop-color="#FF5E62"/>
|
|
13
|
+
<stop offset="100%" stop-color="#FF9966"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
|
|
16
|
+
<!-- Google Antigravity Blue-Green-Yellow Gradient -->
|
|
17
|
+
<linearGradient id="antigravityGrad" x1="0%" y1="100%" x2="100%" y2="0%">
|
|
18
|
+
<stop offset="0%" stop-color="#4285F4"/>
|
|
19
|
+
<stop offset="60%" stop-color="#34A853"/>
|
|
20
|
+
<stop offset="100%" stop-color="#FBBC05"/>
|
|
21
|
+
</linearGradient>
|
|
22
|
+
|
|
23
|
+
<!-- Interlocking glow element -->
|
|
24
|
+
<filter id="glow" x="-20%" y="-20%" width="140%" height="140%">
|
|
25
|
+
<feGaussianBlur stdDeviation="6" result="blur"/>
|
|
26
|
+
<feMerge>
|
|
27
|
+
<feMergeNode in="blur"/>
|
|
28
|
+
<feMergeNode in="SourceGraphic"/>
|
|
29
|
+
</feMerge>
|
|
30
|
+
</filter>
|
|
31
|
+
</defs>
|
|
32
|
+
|
|
33
|
+
<!-- Ambient background glow -->
|
|
34
|
+
<circle cx="200" cy="120" r="160" fill="url(#aurora)"/>
|
|
35
|
+
|
|
36
|
+
<!-- Blended Logo Group (Interlocked & Centered) -->
|
|
37
|
+
<g transform="translate(200, 115)" filter="url(#glow)">
|
|
38
|
+
|
|
39
|
+
<!-- Outer Ring Structure (Lideta Mark) -->
|
|
40
|
+
<!-- Scaled and centered precisely at (0,0) (offsetting its original internal potrace box) -->
|
|
41
|
+
<!-- Placed as the protective, guarding wings of the sandbox -->
|
|
42
|
+
<g transform="translate(-160, -115) scale(0.50)">
|
|
43
|
+
<g transform="translate(0,463) scale(0.1,-0.1)">
|
|
44
|
+
<!-- Lideta Path 1 (Left Wing) -->
|
|
45
|
+
<path d="M3238 4610 c-113 -28 -212 -110 -305 -250 -124 -187 -502 -829 -753 -1280 -57 -102 -120 -214 -140 -250 -43 -74 -458 -827 -668 -1210 -159 -291 -157 -286 -157 -415 0 -103 2 -114 32 -177 59 -124 178 -214 314 -238 42 -7 228 -10 549 -8 l485 3 47 28 c26 15 62 46 81 70 34 42 133 196 144 223 4 12 -89 14 -627 14 l-632 0 -30 30 c-27 27 -30 36 -26 73 6 47 24 81 515 977 44 80 95 174 115 210 319 593 787 1415 1004 1760 77 124 150 159 231 109 96 -60 108 -245 32 -515 -59 -210 -207 -548 -351 -799 -55 -95 -246 -414 -266 -445 l-17 -24 25 17 c14 9 85 77 158 150 392 388 693 886 757 1251 33 194 12 373 -60 502 -42 74 -96 121 -190 166 -57 26 -83 32 -150 34 -44 2 -97 -1 -117 -6z" fill="url(#lidetaCoral)" opacity="0.6"/>
|
|
46
|
+
<!-- Lideta Path 2 (Right Wing) -->
|
|
47
|
+
<path d="M5061 3790 c-190 -27 -362 -116 -486 -252 -74 -83 -104 -129 -249 -386 -335 -592 -399 -705 -634 -1112 -53 -91 -110 -190 -127 -220 -174 -304 -543 -927 -598 -1010 -67 -100 -223 -254 -319 -314 -101 -62 -229 -114 -342 -137 -85 -18 -149 -19 -984 -19 -639 0 -900 3 -915 11 -36 18 -57 52 -57 91 0 41 12 67 207 418 136 247 149 270 301 550 140 260 356 664 514 965 55 105 119 226 143 270 142 267 177 337 171 342 -12 12 -154 -14 -202 -38 -72 -34 -121 -90 -208 -239 -44 -74 -119 -200 -166 -280 -48 -80 -174 -291 -280 -470 -106 -179 -257 -433 -335 -565 -478 -806 -485 -819 -485 -959 0 -223 150 -390 386 -427 36 -6 417 -9 960 -6 998 3 964 1 1182 73 255 83 491 257 666 489 61 81 224 348 471 770 48 83 147 251 220 375 163 278 443 769 690 1210 198 354 213 376 308 447 79 58 164 83 281 83 109 0 180 -17 292 -69 110 -52 179 -98 268 -182 322 -301 442 -798 297 -1232 -63 -189 -150 -327 -301 -477 -150 -151 -289 -238 -475 -300 -201 -66 -164 -63 -817 -67 l-596 -4 -57 -97 c-32 -53 -76 -125 -98 -160 -22 -34 -37 -65 -34 -68 3 -4 306 -6 672 -5 699 2 748 5 940 50 144 35 314 110 460 205 355 231 602 604 681 1031 25 135 25 409 0 545 -107 575 -511 1032 -1016 1149 -103 24 -242 33 -329 21z" fill="url(#lidetaCoral)" opacity="0.6"/>
|
|
48
|
+
</g>
|
|
49
|
+
</g>
|
|
50
|
+
|
|
51
|
+
<!-- Inner Core Engine (Google Antigravity Wing) -->
|
|
52
|
+
<!-- Overlaid directly in the center heart of the wings on a sub-blend layer -->
|
|
53
|
+
<!-- This represents the sandboxed engine humming inside the Lideta guardrails -->
|
|
54
|
+
<g transform="translate(-108, -100) scale(0.50)" style="mix-blend-mode: screen;">
|
|
55
|
+
<path d="M392.7093,390.1367c24.1675,18.1303,60.4188,6.0436,27.1881-27.1951C320.2076,266.2475,341.3537.3393,217.4969.3393S114.7857,266.2475,15.0959,362.9416c-36.2508,36.2602,3.0207,45.3254,27.1881,27.1952,93.6484-63.4553,87.6064-175.2575,175.2129-175.2575s81.5645,111.8022,175.2124,175.2575h0Z" fill="url(#antigravityGrad)" opacity="0.95"/>
|
|
56
|
+
</g>
|
|
57
|
+
|
|
58
|
+
</g>
|
|
59
|
+
</svg>
|