import { type ReactNode } from 'react'; import { ExternalLink, ShieldCheck } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import type { CompatibleCliProviderDocLink, CodexDashboardDiagnostics, } from '@/hooks/use-codex-types'; import { CLIPROXY_NATIVE_CODEX_RECIPE } from '@/lib/codex-config'; const DEFAULT_CODEX_DOC_LINKS = [ { id: 'codex-config-basic', label: 'Codex Config Basics', url: 'https://developers.openai.com/codex/config-basic', description: 'Official user-layer setup, config location, and baseline configuration behavior.', }, { id: 'codex-config-advanced', label: 'Codex Config Advanced', url: 'https://developers.openai.com/codex/config-advanced', description: 'Layering, trust, profiles, and advanced config behavior.', }, { id: 'codex-config-reference', label: 'Codex Config Reference', url: 'https://developers.openai.com/codex/config-reference', description: 'Canonical upstream config surface for providers, MCP, features, and trust.', }, { id: 'codex-releases', label: 'Codex GitHub Releases', url: 'https://github.com/openai/codex/releases', description: 'Track upstream release notes and fast-moving CLI changes.', }, ]; const DEFAULT_PROVIDER_DOCS: CompatibleCliProviderDocLink[] = [ { provider: 'openai', label: 'OpenAI Responses API', apiFormat: 'Responses API', url: 'https://platform.openai.com/docs/api-reference/responses', }, ]; function renderTextWithLinks(text: string): ReactNode[] { const urlPattern = /https?:\/\/[^\s)]+/g; const nodes: ReactNode[] = []; let cursor = 0; let match: RegExpExecArray | null; while ((match = urlPattern.exec(text)) !== null) { const [url] = match; const index = match.index; if (index > cursor) { nodes.push(text.slice(cursor, index)); } nodes.push( {url} ); cursor = index + url.length; } if (cursor < text.length) { nodes.push(text.slice(cursor)); } return nodes.length > 0 ? nodes : [text]; } interface CodexDocsTabProps { diagnostics: CodexDashboardDiagnostics; } export function CodexDocsTab({ diagnostics }: CodexDocsTabProps) { const docsReference = diagnostics.docsReference ?? { notes: [], links: [], providerDocs: [], providerValues: [], settingsHierarchy: [], }; const docsLinks = docsReference.links.length > 0 ? docsReference.links : DEFAULT_CODEX_DOC_LINKS; const providerDocs = docsReference.providerDocs.length > 0 ? docsReference.providerDocs : DEFAULT_PROVIDER_DOCS; return (
CCS bridge recipe

Use ccsxp if you want the built-in CCS Codex provider shortcut on native Codex. Use the saved recipe below if you want plain codex or a personal alias like cxp to default to CLIProxy.

              {CLIPROXY_NATIVE_CODEX_RECIPE}
            

1. Save the cliproxy provider in your user config.

2. Set top-level model_provider to cliproxy.

3. Export CLIPROXY_API_KEY in your shell before launching native Codex.

Upstream notes {docsReference.notes.map((note, index) => (

- {renderTextWithLinks(note)}

))}

Codex docs

{docsLinks.map((link) => (
{link.label}

{link.description}

{link.url}

))}
{docsReference.providerValues.length > 0 && ( <>

Provider values: {docsReference.providerValues.join(', ')}

)} {docsReference.settingsHierarchy.length > 0 && (

Settings hierarchy: {docsReference.settingsHierarchy.join(' -> ')}

)}
); }