kcg-ai-monitoring/frontend/src/shared/constants/catalogRegistry.ts
htlee 99d72e3622 refactor(frontend): LGCNS 3개 페이지 디자인 시스템 공통 구조 전환
- 커스텀 탭 → TabBar/TabButton 공통 컴포넌트 교체 (3개 파일)
- hex 색상 맵 → Tailwind 클래스 토큰 전환, style={{ }} 인라인 제거
- 인라인 Badge intent 삼항 → 카탈로그 함수 교체 (getAgentPermTypeIntent 등)
- 신규 카탈로그: mlopsJobStatuses (4종), aiSecurityStatuses (위협3+권한5+결과3)
- catalogRegistry에 4건 등록 → design-system.html 쇼케이스 자동 노출
- statusIntent.ts에 '허용', '위험', '관리자', '중지', '실행' 매핑 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 11:41:49 +09:00

306 lines
9.7 KiB
TypeScript

/**
* 분류 카탈로그 중앙 레지스트리 (Single Source of Truth)
*
* 디자인 쇼케이스의 카탈로그 섹션과 실제 프론트가 **모두 이 레지스트리를 참조**한다.
* 따라서:
* - 특정 분류의 라벨을 바꾸면 (예: '심각' → '매우 심각') 쇼케이스 + 실 페이지 동시 반영
* - 특정 분류의 intent/색상을 바꾸면 역시 자동 반영
* - 새 카탈로그를 추가하면 쇼케이스에 자동 노출 (등록만 하면 됨)
*
* 각 카탈로그는 `items: Record<Code, Meta>` 형태를 가진다 (Meta는 개별 파일의 타입 사용).
* 쇼케이스는 heterogeneous 타입을 허용하므로 CatalogEntry의 items는 Record<string, AnyMeta> 로 처리.
*/
import { ALERT_LEVELS } from './alertLevels';
import { VIOLATION_TYPES } from './violationTypes';
import { EVENT_STATUSES } from './eventStatuses';
import { ENFORCEMENT_ACTIONS } from './enforcementActions';
import { ENFORCEMENT_RESULTS } from './enforcementResults';
import { PATROL_STATUSES } from './patrolStatuses';
import { ENGINE_SEVERITIES } from './engineSeverities';
import { DEVICE_STATUSES } from './deviceStatuses';
import {
PARENT_RESOLUTION_STATUSES,
LABEL_SESSION_STATUSES,
} from './parentResolutionStatuses';
import {
MODEL_STATUSES,
QUALITY_GATE_STATUSES,
EXPERIMENT_STATUSES,
} from './modelDeploymentStatuses';
import { GEAR_GROUP_TYPES } from './gearGroupTypes';
import { DARK_VESSEL_PATTERNS } from './darkVesselPatterns';
import { USER_ACCOUNT_STATUSES } from './userAccountStatuses';
import { LOGIN_RESULTS } from './loginResultStatuses';
import { PERMIT_STATUSES, GEAR_JUDGMENTS } from './permissionStatuses';
import {
VESSEL_SURVEILLANCE_STATUSES,
VESSEL_RISK_RINGS,
} from './vesselAnalysisStatuses';
import { CONNECTION_STATUSES } from './connectionStatuses';
import { TRAINING_ZONE_TYPES } from './trainingZoneTypes';
import { MLOPS_JOB_STATUSES } from './mlopsJobStatuses';
import { THREAT_LEVELS, AGENT_PERM_TYPES, AGENT_EXEC_RESULTS } from './aiSecurityStatuses';
/**
* 카탈로그 공통 메타 — 쇼케이스 렌더와 UI 일관성을 위한 최소 스키마
*/
export interface CatalogEntry {
/** 안정적 ID (쇼케이스 추적 ID의 슬러그 부분) */
id: string;
/** 쇼케이스 추적 ID (TRK-CAT-*) */
showcaseId: string;
/** 쇼케이스 섹션 제목 (한글) */
titleKo: string;
/** 쇼케이스 섹션 제목 (영문) */
titleEn: string;
/** 1줄 설명 */
description: string;
/** 출처 (백엔드 enum / code_master 등) */
source?: string;
/** 카탈로그 데이터 — items의 각 meta는 { code, fallback?, intent?, classes?, ... } 구조 */
items: Record<string, unknown>;
}
/**
* 전체 카탈로그 레지스트리
*
* ⚠️ 새 카탈로그 추가 시:
* 1. shared/constants/에 파일 생성 (items record + 헬퍼 함수)
* 2. 이 레지스트리에 CatalogEntry 추가
* 3. 쇼케이스에 자동 노출 + 실 페이지에서 헬퍼 함수로 참조
*/
export const CATALOG_REGISTRY: CatalogEntry[] = [
{
id: 'alert-level',
showcaseId: 'TRK-CAT-alert-level',
titleKo: '위험도',
titleEn: 'Alert Level',
description: 'CRITICAL / HIGH / MEDIUM / LOW — 모든 이벤트/알림 배지',
source: 'backend code_master EVENT_LEVEL',
items: ALERT_LEVELS,
},
{
id: 'violation-type',
showcaseId: 'TRK-CAT-violation-type',
titleKo: '위반 유형',
titleEn: 'Violation Type',
description: '중국불법조업 / 환적의심 / EEZ침범 등',
source: 'backend ViolationType enum',
items: VIOLATION_TYPES,
},
{
id: 'event-status',
showcaseId: 'TRK-CAT-event-status',
titleKo: '이벤트 상태',
titleEn: 'Event Status',
description: 'NEW / ACK / IN_PROGRESS / RESOLVED / FALSE_POSITIVE',
source: 'backend code_master EVENT_STATUS',
items: EVENT_STATUSES,
},
{
id: 'enforcement-action',
showcaseId: 'TRK-CAT-enforcement-action',
titleKo: '단속 조치',
titleEn: 'Enforcement Action',
description: 'CAPTURE / INSPECT / WARN / DISPERSE / TRACK / EVIDENCE',
source: 'backend code_master ENFORCEMENT_ACTION',
items: ENFORCEMENT_ACTIONS,
},
{
id: 'enforcement-result',
showcaseId: 'TRK-CAT-enforcement-result',
titleKo: '단속 결과',
titleEn: 'Enforcement Result',
description: 'PUNISHED / REFERRED / WARNED / RELEASED / FALSE_POSITIVE',
source: 'backend code_master ENFORCEMENT_RESULT',
items: ENFORCEMENT_RESULTS,
},
{
id: 'patrol-status',
showcaseId: 'TRK-CAT-patrol-status',
titleKo: '함정 상태',
titleEn: 'Patrol Status',
description: '출동 / 순찰 / 복귀 / 정박 / 정비 / 대기',
source: 'backend code_master PATROL_STATUS',
items: PATROL_STATUSES,
},
{
id: 'engine-severity',
showcaseId: 'TRK-CAT-engine-severity',
titleKo: '엔진 심각도',
titleEn: 'Engine Severity',
description: 'AI 모델/분석엔진 오류 심각도',
items: ENGINE_SEVERITIES,
},
{
id: 'device-status',
showcaseId: 'TRK-CAT-device-status',
titleKo: '함정 Agent 장치 상태',
titleEn: 'Device Status',
description: 'ONLINE / OFFLINE / SYNCING / NOT_DEPLOYED',
items: DEVICE_STATUSES,
},
{
id: 'parent-resolution',
showcaseId: 'TRK-CAT-parent-resolution',
titleKo: '모선 확정 상태',
titleEn: 'Parent Resolution Status',
description: 'PENDING / CONFIRMED / REJECTED / REVIEWING',
items: PARENT_RESOLUTION_STATUSES,
},
{
id: 'label-session',
showcaseId: 'TRK-CAT-label-session',
titleKo: '라벨 세션',
titleEn: 'Label Session Status',
description: '모선 학습 세션 상태',
items: LABEL_SESSION_STATUSES,
},
{
id: 'model-status',
showcaseId: 'TRK-CAT-model-status',
titleKo: 'AI 모델 상태',
titleEn: 'Model Status',
description: 'DEV / STAGING / CANARY / PROD / ARCHIVED',
items: MODEL_STATUSES,
},
{
id: 'quality-gate',
showcaseId: 'TRK-CAT-quality-gate',
titleKo: '품질 게이트',
titleEn: 'Quality Gate Status',
description: '모델 배포 전 품질 검증',
items: QUALITY_GATE_STATUSES,
},
{
id: 'experiment',
showcaseId: 'TRK-CAT-experiment',
titleKo: 'ML 실험',
titleEn: 'Experiment Status',
description: 'MLOps 실험 상태',
items: EXPERIMENT_STATUSES,
},
{
id: 'gear-group',
showcaseId: 'TRK-CAT-gear-group',
titleKo: '어구 그룹 유형',
titleEn: 'Gear Group Type',
description: 'FLEET / GEAR_IN_ZONE / GEAR_OUT_ZONE',
items: GEAR_GROUP_TYPES,
},
{
id: 'dark-vessel',
showcaseId: 'TRK-CAT-dark-vessel',
titleKo: '다크베셀 패턴',
titleEn: 'Dark Vessel Pattern',
description: 'AIS 끊김/스푸핑 패턴 5종',
items: DARK_VESSEL_PATTERNS,
},
{
id: 'user-account',
showcaseId: 'TRK-CAT-user-account',
titleKo: '사용자 계정 상태',
titleEn: 'User Account Status',
description: 'ACTIVE / LOCKED / INACTIVE / PENDING',
items: USER_ACCOUNT_STATUSES,
},
{
id: 'login-result',
showcaseId: 'TRK-CAT-login-result',
titleKo: '로그인 결과',
titleEn: 'Login Result',
description: 'SUCCESS / FAILED / LOCKED',
items: LOGIN_RESULTS,
},
{
id: 'permit-status',
showcaseId: 'TRK-CAT-permit-status',
titleKo: '허가 상태',
titleEn: 'Permit Status',
description: '선박 허가 유효 / 만료 / 정지',
items: PERMIT_STATUSES,
},
{
id: 'gear-judgment',
showcaseId: 'TRK-CAT-gear-judgment',
titleKo: '어구 판정',
titleEn: 'Gear Judgment',
description: '합법 / 의심 / 불법',
items: GEAR_JUDGMENTS,
},
{
id: 'vessel-surveillance',
showcaseId: 'TRK-CAT-vessel-surveillance',
titleKo: '선박 감시 상태',
titleEn: 'Vessel Surveillance Status',
description: '관심선박 추적 상태',
items: VESSEL_SURVEILLANCE_STATUSES,
},
{
id: 'vessel-risk-ring',
showcaseId: 'TRK-CAT-vessel-risk-ring',
titleKo: '선박 위험 링',
titleEn: 'Vessel Risk Ring',
description: '지도 마커 위험도 링',
items: VESSEL_RISK_RINGS,
},
{
id: 'connection',
showcaseId: 'TRK-CAT-connection',
titleKo: '연결 상태',
titleEn: 'Connection Status',
description: 'OK / WARNING / ERROR',
items: CONNECTION_STATUSES,
},
{
id: 'training-zone',
showcaseId: 'TRK-CAT-training-zone',
titleKo: '훈련 수역',
titleEn: 'Training Zone Type',
description: 'NAVY / AIRFORCE / ARMY / ADD / KCG',
items: TRAINING_ZONE_TYPES,
},
{
id: 'mlops-job-status',
showcaseId: 'TRK-CAT-mlops-job-status',
titleKo: 'MLOps Job 상태',
titleEn: 'MLOps Job Status',
description: 'running / done / fail / pending',
source: 'LGCNS MLOps 파이프라인',
items: MLOPS_JOB_STATUSES,
},
{
id: 'threat-level',
showcaseId: 'TRK-CAT-threat-level',
titleKo: 'AI 위협 수준',
titleEn: 'AI Threat Level',
description: 'HIGH / MEDIUM / LOW',
source: 'AI 보안 (SER-10)',
items: THREAT_LEVELS,
},
{
id: 'agent-perm-type',
showcaseId: 'TRK-CAT-agent-perm-type',
titleKo: 'Agent 권한 유형',
titleEn: 'Agent Permission Type',
description: 'ADMIN / DELETE / WRITE / READ / EXECUTE',
source: 'AI Agent 보안 (SER-11)',
items: AGENT_PERM_TYPES,
},
{
id: 'agent-exec-result',
showcaseId: 'TRK-CAT-agent-exec-result',
titleKo: 'Agent 실행 결과',
titleEn: 'Agent Execution Result',
description: 'BLOCKED / CONDITIONAL / ALLOWED',
source: 'AI Agent 보안 (SER-11)',
items: AGENT_EXEC_RESULTS,
},
];
/** ID로 특정 카탈로그 조회 */
export function getCatalogById(id: string): CatalogEntry | undefined {
return CATALOG_REGISTRY.find((c) => c.id === id);
}