Spaces:
Running
Running
| """Installed `fcc-pi` launcher.""" | |
| import os | |
| import subprocess | |
| import sys | |
| from collections.abc import Mapping, Sequence | |
| from pathlib import Path | |
| from free_claude_code.cli.local_http import with_local_proxy_bypass | |
| from free_claude_code.cli.proxy_auth import proxy_auth_token | |
| from free_claude_code.config.server_urls import local_proxy_root_url | |
| from free_claude_code.config.settings import get_settings | |
| from .common import preflight_proxy, resolve_client_binary, run_client_process | |
| _API_KEY_ENV = "FCC_PI_API_KEY" | |
| _BASE_URL_ENV = "FCC_PI_BASE_URL" | |
| _BINARY_NAME = "pi" | |
| _DISPLAY_NAME = "Pi" | |
| _HELP_TIMEOUT_SECONDS = 5.0 | |
| _MODEL_SCOPE = "free-claude-code/**" | |
| _REQUIRED_HELP_MARKERS = ("--extension", "--models") | |
| _PASSTHROUGH_COMMANDS = frozenset( | |
| {"config", "install", "list", "remove", "uninstall", "update"} | |
| ) | |
| _PASSTHROUGH_FLAGS = frozenset({"--help", "-h", "--version", "-v"}) | |
| def launch(argv: Sequence[str] | None = None) -> None: | |
| """Launch Pi with a process-local Free Claude Code provider.""" | |
| args = list(sys.argv[1:] if argv is None else argv) | |
| install_hint = pi_install_hint() | |
| binary_path = resolve_client_binary( | |
| binary_name=_BINARY_NAME, | |
| display_name=_DISPLAY_NAME, | |
| install_hint=install_hint, | |
| ) | |
| if not pi_binary_is_compatible(binary_path): | |
| print( | |
| f"The 'pi' command at {binary_path} is not a compatible Pi Coding Agent.", | |
| file=sys.stderr, | |
| ) | |
| print(install_hint, file=sys.stderr) | |
| raise SystemExit(126) | |
| if is_pi_passthrough(args): | |
| run_client_process( | |
| command=[binary_path, *args], | |
| env=os.environ, | |
| binary_name=_BINARY_NAME, | |
| display_name=_DISPLAY_NAME, | |
| install_hint=install_hint, | |
| ) | |
| return | |
| settings = get_settings() | |
| proxy_root_url = local_proxy_root_url(settings) | |
| if error := preflight_proxy(proxy_root_url): | |
| print( | |
| f"Free Claude Code proxy is not reachable at {proxy_root_url}: {error}", | |
| file=sys.stderr, | |
| ) | |
| print("Start it in another terminal with: fcc-server", file=sys.stderr) | |
| raise SystemExit(1) | |
| extension_path = pi_extension_path() | |
| if not extension_path.is_file(): | |
| print( | |
| "Free Claude Code's bundled Pi extension is missing. Reinstall FCC.", | |
| file=sys.stderr, | |
| ) | |
| raise SystemExit(1) | |
| run_client_process( | |
| command=build_pi_launcher_command( | |
| binary_path=binary_path, | |
| extension_path=extension_path, | |
| argv=args, | |
| ), | |
| env=build_pi_launcher_env( | |
| proxy_root_url=proxy_root_url, | |
| auth_token=settings.anthropic_auth_token, | |
| base_env=os.environ, | |
| ), | |
| binary_name=_BINARY_NAME, | |
| display_name=_DISPLAY_NAME, | |
| install_hint=install_hint, | |
| ) | |
| def build_pi_launcher_command( | |
| *, | |
| binary_path: str, | |
| extension_path: Path, | |
| argv: Sequence[str], | |
| ) -> list[str]: | |
| """Return a Pi session command with ephemeral FCC provider registration.""" | |
| return [ | |
| binary_path, | |
| "-e", | |
| str(extension_path), | |
| "--models", | |
| _MODEL_SCOPE, | |
| *argv, | |
| ] | |
| def build_pi_launcher_env( | |
| *, | |
| proxy_root_url: str, | |
| auth_token: str, | |
| base_env: Mapping[str, str], | |
| ) -> dict[str, str]: | |
| """Return a Pi environment containing only FCC-owned proxy variables.""" | |
| env = with_local_proxy_bypass( | |
| { | |
| key: value | |
| for key, value in base_env.items() | |
| if not key.startswith("FCC_PI_") | |
| }, | |
| proxy_root_url=proxy_root_url, | |
| ) | |
| env[_BASE_URL_ENV] = proxy_root_url.rstrip("/") | |
| env[_API_KEY_ENV] = proxy_auth_token(auth_token) | |
| return env | |
| def is_pi_passthrough(argv: Sequence[str]) -> bool: | |
| """Return whether Pi must receive argv unchanged as a non-session command.""" | |
| return bool(argv) and ( | |
| argv[0] in _PASSTHROUGH_COMMANDS or argv[0] in _PASSTHROUGH_FLAGS | |
| ) | |
| def pi_extension_path() -> Path: | |
| """Return the absolute installed path to the bundled Pi extension.""" | |
| return Path(__file__).with_name("pi_extension.ts").resolve() | |
| def pi_binary_is_compatible(binary_path: str) -> bool: | |
| """Return whether an executable exposes the Pi features FCC requires.""" | |
| try: | |
| result = subprocess.run( | |
| [binary_path, "--help"], | |
| check=False, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.STDOUT, | |
| text=True, | |
| timeout=_HELP_TIMEOUT_SECONDS, | |
| ) | |
| except (OSError, subprocess.TimeoutExpired): | |
| return False | |
| return result.returncode == 0 and all( | |
| marker in result.stdout for marker in _REQUIRED_HELP_MARKERS | |
| ) | |
| def pi_install_hint(platform: str | None = None) -> str: | |
| """Return Pi's official installer command for the current platform.""" | |
| if (platform or sys.platform) == "win32": | |
| return 'Install Pi with: powershell -c "irm https://pi.dev/install.ps1 | iex"' | |
| return "Install Pi with: curl -fsSL https://pi.dev/install.sh | sh" | |