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.
@@ -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
+ [![PyPI version](https://img.shields.io/pypi/v/agy-sandbox.svg)](https://pypi.org/project/agy-sandbox/)
37
+ [![Python](https://img.shields.io/pypi/pyversions/agy-sandbox.svg)](https://pypi.org/project/agy-sandbox/)
38
+ [![License: MIT](https://img.shields.io/pypi/l/agy-sandbox.svg)](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
+ [![PyPI version](https://img.shields.io/pypi/v/agy-sandbox.svg)](https://pypi.org/project/agy-sandbox/)
10
+ [![Python](https://img.shields.io/pypi/pyversions/agy-sandbox.svg)](https://pypi.org/project/agy-sandbox/)
11
+ [![License: MIT](https://img.shields.io/pypi/l/agy-sandbox.svg)](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,3 @@
1
+ """agy-sandbox: Secure, isolated development environments powered by Docker and Antigravity AI agent."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,6 @@
1
+ """Allow running agy-sandbox as a module: python -m agy_sandbox"""
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -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>