#!/usr/bin/env python3 """ A2A Consumer HF VM Bootstrap Script Prepares the HF VM runtime environment for agent deployment. No longer pulls OpenAI tokens — uses qwen3.6-plus-free via opencode CLI. """ from __future__ import annotations import json import os import subprocess import sys from pathlib import Path AGENT_ROOT = Path(__file__).resolve().parent.parent AUTH_FILE = Path.home() / ".local" / "share" / "opencode" / "auth.json" def bootstrap_hf_vm() -> bool: """Prepare the HF VM runtime for the agent.""" print(f"[hf-pull] Bootstrapping HF VM for agent at {AGENT_ROOT}") # Ensure required directories exist for dirpath in [ Path.home() / ".local" / "share" / "opencode", Path.home() / ".config" / "sin", AGENT_ROOT / "logs", AGENT_ROOT / "data", ]: dirpath.mkdir(parents=True, exist_ok=True) print(f"[hf-pull] Ensured directory: {dirpath}") # Write minimal auth.json with placeholder (opencode CLI handles auth) auth_data = { "openai": { "type": "oauth", "refresh": "opencode-managed" } } AUTH_FILE.parent.mkdir(parents=True, exist_ok=True) AUTH_FILE.write_text(json.dumps(auth_data, indent=2) + "\n") print(f"[hf-pull] Wrote placeholder auth to {AUTH_FILE}") # Verify node is available try: result = subprocess.run(["node", "--version"], capture_output=True, text=True, timeout=5) print(f"[hf-pull] Node.js available: {result.stdout.strip()}") except FileNotFoundError: print("[hf-pull] WARNING: node not found — install Node.js 18+") return False # Install dependencies if node_modules missing pkg_lock = AGENT_ROOT / "package-lock.json" node_modules = AGENT_ROOT / "node_modules" if pkg_lock.exists() and not node_modules.exists(): print("[hf-pull] Installing dependencies...") result = subprocess.run( ["npm", "ci", "--production"], cwd=str(AGENT_ROOT), capture_output=True, text=True, timeout=300 ) if result.returncode != 0: print(f"[hf-pull] npm ci failed: {result.stderr}") return False print("[hf-pull] Dependencies installed") # Build if dist missing dist_dir = AGENT_ROOT / "dist" if not dist_dir.exists() and (AGENT_ROOT / "tsconfig.json").exists(): print("[hf-pull] Building agent...") result = subprocess.run( ["npm", "run", "build"], cwd=str(AGENT_ROOT), capture_output=True, text=True, timeout=300 ) if result.returncode != 0: print(f"[hf-pull] Build failed: {result.stderr}") return False print("[hf-pull] Build complete") print("[hf-pull] HF VM bootstrap complete") return True if __name__ == "__main__": success = bootstrap_hf_vm() sys.exit(0 if success else 1)