Drop the swe-rex dependency for Modal terminal backend and use the Modal SDK directly (Sandbox.create + Sandbox.exec). This fixes: - AsyncUsageWarning from synchronous App.lookup() in async context - DeprecationError from unencrypted_ports / .url on unencrypted tunnels (deprecated 2026-03-05) The new implementation: - Uses modal.App.lookup.aio() for async-safe app creation - Uses Sandbox.create.aio() with 'sleep infinity' entrypoint - Uses Sandbox.exec.aio() for direct command execution (no HTTP server or tunnel needed) - Keeps all existing features: persistent filesystem snapshots, configurable resources (CPU/memory/disk), sudo support, interrupt handling, _AsyncWorker for event loop safety Consistent with the Docker backend precedent (PR #2804) where we removed mini-swe-agent in favor of direct docker run. Files changed: - tools/environments/modal.py - core rewrite - tools/terminal_tool.py - health check: modal instead of swerex - hermes_cli/setup.py - install modal instead of swe-rex[modal] - pyproject.toml - modal extra: modal>=1.0.0 instead of swe-rex[modal] - scripts/kill_modal.sh - grep for hermes-agent instead of swe-rex - tests/ - updated for new implementation - environments/README.md - updated patches section - website/docs - updated install command
35 lines
1.0 KiB
Bash
Executable File
35 lines
1.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Kill all running Modal apps (sandboxes, deployments, etc.)
|
|
#
|
|
# Usage:
|
|
# bash scripts/kill_modal.sh # Stop hermes-agent sandboxes
|
|
# bash scripts/kill_modal.sh --all # Stop ALL Modal apps
|
|
|
|
set -uo pipefail
|
|
|
|
echo "Fetching Modal app list..."
|
|
APP_LIST=$(modal app list 2>/dev/null)
|
|
|
|
if [[ "${1:-}" == "--all" ]]; then
|
|
echo "Stopping ALL Modal apps..."
|
|
echo "$APP_LIST" | grep -oE 'ap-[A-Za-z0-9]+' | sort -u | while read app_id; do
|
|
echo " Stopping $app_id"
|
|
modal app stop "$app_id" 2>/dev/null || true
|
|
done
|
|
else
|
|
echo "Stopping hermes-agent sandboxes..."
|
|
APPS=$(echo "$APP_LIST" | grep 'hermes-agent' | grep -oE 'ap-[A-Za-z0-9]+' || true)
|
|
if [[ -z "$APPS" ]]; then
|
|
echo " No hermes-agent apps found."
|
|
else
|
|
echo "$APPS" | while read app_id; do
|
|
echo " Stopping $app_id"
|
|
modal app stop "$app_id" 2>/dev/null || true
|
|
done
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "Current hermes-agent status:"
|
|
modal app list 2>/dev/null | grep -E 'State|hermes-agent' || echo " (none)"
|