dheraingoud's picture
feat: sync upstream commits up to f17c92bc
a1bab2d
Raw
History Blame Contribute Delete
5.12 kB
"""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"