Files
orcs-code/src/utils/preflightChecks.tsx
Anandan 462a985d7e Remove embedded source map directives from tracked sources (#329)
Inline base64 source maps had been checked into tracked src files. This strips those comments from the repository without changing runtime behavior or adding ongoing guardrails, per the requested one-time cleanup scope.

Constraint: Keep this change limited to tracked source cleanup only
Rejected: Add CI/source verification guard | user requested one-time cleanup only
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: If these directives reappear, fix the producing transform instead of reintroducing repo-side cleanup code
Tested: rg -n "sourceMappingURL" ., bun run smoke, bun run verify:privacy, bun run test:provider, npm run test:provider-recommendation
Not-tested: bun run typecheck (repository has many pre-existing unrelated failures)

Co-authored-by: anandh8x <test@example.com>
2026-04-04 21:19:27 +08:00

152 lines
4.9 KiB
TypeScript

import { c as _c } from "react-compiler-runtime";
import axios from 'axios';
import React, { useEffect, useState } from 'react';
import { logEvent } from 'src/services/analytics/index.js';
import { Spinner } from '../components/Spinner.js';
import { getOauthConfig } from '../constants/oauth.js';
import { useTimeout } from '../hooks/useTimeout.js';
import { Box, Text } from '../ink.js';
import { getSSLErrorHint } from '../services/api/errorUtils.js';
import { getUserAgent } from './http.js';
import { logError } from './log.js';
import { getAPIProvider } from './model/providers.js';
export interface PreflightCheckResult {
success: boolean;
error?: string;
sslHint?: string;
}
async function checkEndpoints(): Promise<PreflightCheckResult> {
try {
const oauthConfig = getOauthConfig();
const tokenUrl = new URL(oauthConfig.TOKEN_URL);
const endpoints = [`${oauthConfig.BASE_API_URL}/api/hello`, `${tokenUrl.origin}/v1/oauth/hello`];
const checkEndpoint = async (url: string): Promise<PreflightCheckResult> => {
try {
const response = await axios.get(url, {
headers: {
'User-Agent': getUserAgent()
}
});
if (response.status !== 200) {
const hostname = new URL(url).hostname;
return {
success: false,
error: `Failed to connect to ${hostname}: Status ${response.status}`
};
}
return {
success: true
};
} catch (error) {
const hostname = new URL(url).hostname;
const sslHint = getSSLErrorHint(error);
return {
success: false,
error: `Failed to connect to ${hostname}: ${error instanceof Error ? (error as ErrnoException).code || error.message : String(error)}`,
sslHint: sslHint ?? undefined
};
}
};
const results = await Promise.all(endpoints.map(checkEndpoint));
const failedResult = results.find(result => !result.success);
if (failedResult) {
// Log failure to Statsig
logEvent('tengu_preflight_check_failed', {
isConnectivityError: false,
hasErrorMessage: !!failedResult.error,
isSSLError: !!failedResult.sslHint
});
}
return failedResult || {
success: true
};
} catch (error) {
logError(error as Error);
// Log to Statsig
logEvent('tengu_preflight_check_failed', {
isConnectivityError: true
});
return {
success: false,
error: `Connectivity check error: ${error instanceof Error ? (error as ErrnoException).code || error.message : String(error)}`
};
}
}
interface PreflightStepProps {
onSuccess: () => void;
}
export function PreflightStep(t0) {
const $ = _c(12);
const {
onSuccess
} = t0;
const [result, setResult] = useState(null);
const [isChecking, setIsChecking] = useState(true);
const showSpinner = useTimeout(1000) && isChecking;
let t1;
let t2;
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
t1 = () => {
const run = async function run() {
const checkResult = await checkEndpoints();
setResult(checkResult);
setIsChecking(false);
};
run();
};
t2 = [];
$[0] = t1;
$[1] = t2;
} else {
t1 = $[0];
t2 = $[1];
}
useEffect(t1, t2);
let t3;
let t4;
if ($[2] !== onSuccess || $[3] !== result) {
t3 = () => {
if (result?.success) {
onSuccess();
} else {
if (result && !result.success) {
const timer = setTimeout(_temp, 100);
return () => clearTimeout(timer);
}
}
};
t4 = [result, onSuccess];
$[2] = onSuccess;
$[3] = result;
$[4] = t3;
$[5] = t4;
} else {
t3 = $[4];
t4 = $[5];
}
useEffect(t3, t4);
let t5;
if ($[6] !== isChecking || $[7] !== result || $[8] !== showSpinner) {
t5 = isChecking && showSpinner ? <Box paddingLeft={1}><Spinner /><Text>Checking connectivity...</Text></Box> : !result?.success && !isChecking && <Box flexDirection="column" gap={1}><Text color="error">Unable to connect to Anthropic services</Text><Text color="error">{result?.error}</Text>{result?.sslHint ? <Box flexDirection="column" gap={1}><Text>{result.sslHint}</Text><Text color="suggestion">See https://code.claude.com/docs/en/network-config</Text></Box> : <Box flexDirection="column" gap={1}><Text>Please check your internet connection and network settings.</Text>{getAPIProvider() === 'firstParty' && <Text>Note: Claude Code might not be available in your country. Check supported countries at{" "}<Text color="suggestion">https://anthropic.com/supported-countries</Text></Text>}</Box>}</Box>;
$[6] = isChecking;
$[7] = result;
$[8] = showSpinner;
$[9] = t5;
} else {
t5 = $[9];
}
let t6;
if ($[10] !== t5) {
t6 = <Box flexDirection="column" gap={1} paddingLeft={1}>{t5}</Box>;
$[10] = t5;
$[11] = t6;
} else {
t6 = $[11];
}
return t6;
}
function _temp() {
return process.exit(1);
}