import modal
import subprocess
import os
from pierre_storage import GitStorage
app = modal.App("code-runner")
vol = modal.Volume.from_name("code-cache", create_if_missing=True)
storage = GitStorage({
"name": "your-org",
"key": os.environ["PIERRE_PRIVATE_KEY"],
})
@app.function(volumes={"/code": vol})
async def run_in_sandbox(repo_id: str):
repo = await storage.find_one(id=repo_id)
url = await repo.get_remote_url(
permissions=["git:read", "git:write"],
ttl=3600,
)
# Shallow clone for speed
subprocess.run(
["git", "clone", "--depth", "1", "--single-branch", url, "/code/repo"],
check=True,
)
subprocess.run(
["git", "config", "--global", "user.email", "agent@example.com"],
check=True,
)
subprocess.run(
["git", "config", "--global", "user.name", "AI Agent"],
check=True,
)
# Run tests or make changes
subprocess.run(["pytest", "/code/repo/tests"], check=True)
# Commit and push changes
subprocess.run(["git", "-C", "/code/repo", "add", "."], check=True)
subprocess.run(
["git", "-C", "/code/repo", "commit", "-m", "Update from sandbox"],
check=True,
)
subprocess.run(["git", "-C", "/code/repo", "push"], check=True)
vol.commit()