diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b1470dff --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +#added by trueheads > will remove once supercombo adds multi-os support +launch.sh diff --git a/app/src/components/views/settings-view.tsx b/app/src/components/views/settings-view.tsx index 544f2675..17fbd029 100644 --- a/app/src/components/views/settings-view.tsx +++ b/app/src/components/views/settings-view.tsx @@ -163,15 +163,18 @@ export function SettingsView() { hasOpenAIKey: boolean; hasGoogleKey: boolean; } | null>(null); - const [editingShortcut, setEditingShortcut] = useState< - keyof KeyboardShortcuts | null - >(null); + const [editingShortcut, setEditingShortcut] = useState(null); const [shortcutValue, setShortcutValue] = useState(""); const [shortcutError, setShortcutError] = useState(null); const scrollContainerRef = useRef(null); // Get authentication status from setup store - const { claudeAuthStatus, codexAuthStatus } = useSetupStore(); + const { + claudeAuthStatus, + codexAuthStatus, + setClaudeAuthStatus, + setCodexAuthStatus, + } = useSetupStore(); useEffect(() => { setAnthropicKey(apiKeys.anthropic); @@ -213,9 +216,57 @@ export function SettingsView() { console.error("Failed to check API key status:", error); } } + + // Check Claude auth status (re-fetch on mount to ensure persistence) + if (api?.setup?.getClaudeStatus) { + try { + const result = await api.setup.getClaudeStatus(); + if (result.success && result.auth) { + // Cast to any because runtime API returns more properties than type definition + const auth = result.auth as any; + const authStatus = { + authenticated: auth.authenticated, + method: + auth.method === "oauth_token" + ? "oauth" + : auth.method?.includes("api_key") + ? "api_key" + : "none", + hasCredentialsFile: false, + oauthTokenValid: auth.hasStoredOAuthToken, + apiKeyValid: auth.hasStoredApiKey || auth.hasEnvApiKey, + }; + setClaudeAuthStatus(authStatus as any); + } + } catch (error) { + console.error("Failed to check Claude auth status:", error); + } + } + + // Check Codex auth status (re-fetch on mount to ensure persistence) + if (api?.setup?.getCodexStatus) { + try { + const result = await api.setup.getCodexStatus(); + if (result.success && result.auth) { + // Cast to any because runtime API returns more properties than type definition + const auth = result.auth as any; + setCodexAuthStatus({ + authenticated: auth.authenticated, + method: auth.hasEnvApiKey + ? "env" + : auth.hasStoredApiKey + ? "api_key" + : "none", + apiKeyValid: auth.hasStoredApiKey || auth.hasEnvApiKey, + }); + } + } catch (error) { + console.error("Failed to check Codex auth status:", error); + } + } }; checkCliStatus(); - }, []); + }, [setClaudeAuthStatus, setCodexAuthStatus]); // Track scroll position to highlight active nav item useEffect(() => {