feat: add CLI config preview API for Codex and Gemini

- Implemented `fetchCodexConfigPreview` and `fetchGeminiConfigPreview` functions in the API layer to retrieve masked configuration files.
- Added new interfaces `CodexConfigPreviewResponse` and `GeminiConfigPreviewResponse` to define the structure of the API responses.
- Created utility functions to read and mask sensitive values from `config.toml` and `auth.json` for Codex, and `settings.json` for Gemini.
- Updated CLI settings routes to handle new preview endpoints.
- Enhanced session content parser to support Claude JSONL format.
- Updated UI components to reflect changes in history page and navigation, including new tabs for observability.
- Localized changes for English and Chinese languages to reflect "CLI History" terminology.
This commit is contained in:
catlog22
2026-02-25 22:37:30 +08:00
parent c92754505a
commit b4d3426e6a
15 changed files with 1137 additions and 163 deletions

View File

@@ -4,9 +4,8 @@
// Dynamic header component for IssueHub
import { useIntl } from 'react-intl';
import { AlertCircle, Radar, ListTodo, LayoutGrid, Activity, Terminal } from 'lucide-react';
type IssueTab = 'issues' | 'board' | 'queue' | 'discovery' | 'observability' | 'executions';
import { AlertCircle, Radar, ListTodo, LayoutGrid, Play } from 'lucide-react';
import type { IssueTab } from './IssueHubTabs';
interface IssueHubHeaderProps {
currentTab: IssueTab;
@@ -37,19 +36,14 @@ export function IssueHubHeader({ currentTab }: IssueHubHeaderProps) {
title: formatMessage({ id: 'issues.discovery.pageTitle' }),
description: formatMessage({ id: 'issues.discovery.description' }),
},
observability: {
icon: <Activity className="w-6 h-6 text-primary" />,
title: formatMessage({ id: 'issues.observability.pageTitle' }),
description: formatMessage({ id: 'issues.observability.description' }),
},
executions: {
icon: <Terminal className="w-6 h-6 text-primary" />,
icon: <Play className="w-6 h-6 text-primary" />,
title: formatMessage({ id: 'issues.executions.pageTitle' }),
description: formatMessage({ id: 'issues.executions.description' }),
},
};
const config = tabConfig[currentTab];
const config = tabConfig[currentTab] || tabConfig.issues;
return (
<div className="flex items-center gap-2">

View File

@@ -8,7 +8,7 @@ import { Button } from '@/components/ui/Button';
import { cn } from '@/lib/utils';
// Keep in sync with IssueHubHeader/IssueHubPage
export type IssueTab = 'issues' | 'board' | 'queue' | 'discovery' | 'observability' | 'executions';
export type IssueTab = 'issues' | 'board' | 'queue' | 'discovery' | 'executions';
interface IssueHubTabsProps {
currentTab: IssueTab;
@@ -23,7 +23,6 @@ export function IssueHubTabs({ currentTab, onTabChange }: IssueHubTabsProps) {
{ value: 'board', label: formatMessage({ id: 'issues.hub.tabs.board' }) },
{ value: 'queue', label: formatMessage({ id: 'issues.hub.tabs.queue' }) },
{ value: 'discovery', label: formatMessage({ id: 'issues.hub.tabs.discovery' }) },
{ value: 'observability', label: formatMessage({ id: 'issues.hub.tabs.observability' }) },
{ value: 'executions', label: formatMessage({ id: 'issues.hub.tabs.executions' }) },
];