Log in to api.opentrace.ai via your browser.
(resolve: bool)
| 1019 | @app.command() |
| 1020 | @click.option("--resolve", is_flag=True, help="Also resolve an org-scoped token from project config.") |
| 1021 | def login(resolve: bool) -> None: |
| 1022 | """Log in to api.opentrace.ai via your browser.""" |
| 1023 | from opentrace_agent.cli.auth import load_tokens |
| 1024 | from opentrace_agent.cli.auth import login as do_login |
| 1025 | |
| 1026 | existing = load_tokens() |
| 1027 | if existing and existing.get("access_token"): |
| 1028 | if not click.confirm("Already logged in. Re-authenticate?", default=False): |
| 1029 | return |
| 1030 | |
| 1031 | click.echo("Opening browser to log in to OpenTrace ...") |
| 1032 | try: |
| 1033 | payload = do_login() |
| 1034 | except TimeoutError: |
| 1035 | raise click.ClickException("Login timed out — no response from browser within 5 minutes.") |
| 1036 | except Exception as exc: |
| 1037 | raise click.ClickException(f"Login failed: {exc}") |
| 1038 | |
| 1039 | scope = payload.get("scope", "") |
| 1040 | click.echo(f"Logged in to {payload.get('issuer', 'OpenTrace')} (scope: {scope}).") |
| 1041 | |
| 1042 | if resolve: |
| 1043 | from opentrace_agent.cli.auth import resolve_org_token |
| 1044 | from opentrace_agent.cli.config import find_config, load_config |
| 1045 | |
| 1046 | ot_dir = _find_opentrace_dir() |
| 1047 | config_path = find_config(ot_dir) |
| 1048 | if config_path is None: |
| 1049 | click.echo("No .opentrace/config.yaml found — skipping org token resolution.") |
| 1050 | return |
| 1051 | config = load_config(config_path) |
| 1052 | org = config.get("org") |
| 1053 | if not org: |
| 1054 | click.echo("No org set in config — skipping org token resolution.") |
| 1055 | return |
| 1056 | try: |
| 1057 | resolve_org_token(org) |
| 1058 | click.echo(f"Org token resolved for '{org}'.") |
| 1059 | except RuntimeError as exc: |
| 1060 | raise click.ClickException(f"Org token resolution failed: {exc}") |
| 1061 | |
| 1062 | |
| 1063 | @app.command() |
nothing calls this directly
no test coverage detected