| |
| """ |
| 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}") |
|
|
| |
| 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}") |
|
|
| |
| 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}") |
|
|
| |
| 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 |
|
|
| |
| 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") |
|
|
| |
| 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) |
|
|