| import type { CountryBriefSignals } from '@/types'; |
| import type { CountryScore } from '@/services/country-instability'; |
| import type { PredictionMarket } from '@/services/prediction'; |
| import type { NewsItem } from '@/types'; |
| import type { GetCountryChokepointIndexResponse, SectorExposureSummary, CountryProductsResponse, MultiSectorShockResponse } from '@/services/supply-chain'; |
| import type { BriefSource } from '@/utils/brief-sources'; |
| import type { DecisionSignalProvenance } from '../../shared/decision-signal-provenance-contract'; |
| import type { ChinaDecisionSignalGroupId } from '../../shared/china-decision-signals'; |
|
|
| export interface CountryIntelData { |
| brief: string; |
| country: string; |
| code: string; |
| cached?: boolean; |
| generatedAt?: string | number; |
| error?: string; |
| skipped?: boolean; |
| reason?: string; |
| fallback?: boolean; |
| sources?: BriefSource[]; |
| } |
|
|
| export interface StockIndexData { |
| available: boolean; |
| code: string; |
| symbol: string; |
| indexName: string; |
| price: string; |
| weekChangePercent: string; |
| currency: string; |
| cached?: boolean; |
| } |
|
|
| type ThreatLevel = 'critical' | 'high' | 'medium' | 'low' | 'info'; |
| type TrendDirection = 'up' | 'down' | 'flat'; |
|
|
| export interface CountryDeepDiveSignalItem { |
| type: 'MILITARY' | 'PROTEST' | 'CYBER' | 'DISASTER' | 'OUTAGE' | 'OTHER'; |
| severity: ThreatLevel; |
| description: string; |
| timestamp: Date; |
| } |
|
|
| export interface CountryDeepDiveSignalDetails { |
| critical: number; |
| high: number; |
| medium: number; |
| low: number; |
| recentHigh: CountryDeepDiveSignalItem[]; |
| } |
|
|
| export interface CountryDeepDiveBaseSummary { |
| id: string; |
| name: string; |
| distanceKm: number; |
| country?: string; |
| } |
|
|
| export interface CountryDeepDiveMilitarySummary { |
| ownFlights: number; |
| foreignFlights: number; |
| nearbyVessels: number; |
| nearestBases: CountryDeepDiveBaseSummary[]; |
| foreignPresence: boolean; |
| } |
|
|
| export interface CountryDeepDiveEconomicIndicator { |
| label: string; |
| value: string; |
| trend: TrendDirection; |
| source?: string; |
| } |
|
|
| export type ChinaCountrySummaryGroupId = ChinaDecisionSignalGroupId; |
| export type ChinaCountrySummaryState = 'loading' | 'available' | 'partial' | 'stale' | 'unavailable'; |
|
|
| export interface ChinaCountrySummarySignal { |
| label: string; |
| value: string; |
| source: string; |
| sourceUrl?: string; |
| observedAt?: string; |
| publishedAt?: string; |
| effectiveAt?: string; |
| action?: string; |
| status?: string; |
| sectors?: string[]; |
| entities?: string[]; |
| translationState?: string; |
| publisherType?: string; |
| lineageId?: string; |
| provenance?: DecisionSignalProvenance; |
| stale: boolean; |
| } |
|
|
| export interface ChinaCountrySummaryGroup { |
| id: ChinaCountrySummaryGroupId; |
| state: ChinaCountrySummaryState; |
| signals: ChinaCountrySummarySignal[]; |
| unavailableReason?: string; |
| } |
|
|
| export interface ChinaCountrySummaryData { |
| groups: ChinaCountrySummaryGroup[]; |
| } |
|
|
| export interface CountryFactsData { |
| headOfState: string; |
| headOfStateTitle: string; |
| wikipediaSummary: string; |
| wikipediaThumbnailUrl: string; |
| population: number; |
| capital: string; |
| languages: string[]; |
| currencies: string[]; |
| areaSqKm: number; |
| countryName: string; |
| } |
|
|
| export interface CountryEnergyProfileData { |
| mixAvailable: boolean; |
| mixYear: number; |
| coalShare: number; |
| gasShare: number; |
| oilShare: number; |
| nuclearShare: number; |
| renewShare: number; |
| windShare: number; |
| solarShare: number; |
| hydroShare: number; |
| importShare: number; |
| gasStorageAvailable: boolean; |
| gasStorageFillPct: number; |
| gasStorageChange1d: number; |
| gasStorageTrend: string; |
| gasStorageDate: string; |
| electricityAvailable: boolean; |
| electricityPriceMwh: number; |
| electricitySource: string; |
| electricityDate: string; |
| jodiOilAvailable: boolean; |
| jodiOilDataMonth: string; |
| gasolineDemandKbd: number; |
| gasolineImportsKbd: number; |
| dieselDemandKbd: number; |
| dieselImportsKbd: number; |
| jetDemandKbd: number; |
| jetImportsKbd: number; |
| lpgDemandKbd: number; |
| lpgImportsKbd: number; |
| crudeImportsKbd: number; |
| jodiGasAvailable: boolean; |
| jodiGasDataMonth: string; |
| gasTotalDemandTj: number; |
| gasLngImportsTj: number; |
| gasPipeImportsTj: number; |
| gasLngShare: number; |
| ieaStocksAvailable: boolean; |
| ieaStocksDataMonth: string; |
| ieaDaysOfCover: number; |
| ieaNetExporter: boolean; |
| ieaBelowObligation: boolean; |
| emberFossilShare: number; |
| emberRenewShare: number; |
| emberNuclearShare: number; |
| emberCoalShare: number; |
| emberGasShare: number; |
| emberDemandTwh: number; |
| emberDataMonth: string; |
| emberAvailable: boolean; |
| sprRegime: string; |
| sprCapacityMb: number; |
| sprOperator: string; |
| sprIeaMember: boolean; |
| sprStockholdingModel: string; |
| sprNote: string; |
| sprSource: string; |
| sprAsOf: string; |
| sprAvailable: boolean; |
| } |
|
|
| export interface CountryPortActivityData { |
| available: boolean; |
| ports: { |
| portId: string; |
| portName: string; |
| lat: number; |
| lon: number; |
| tankerCalls30d: number; |
| trendDeltaPct: number; |
| importTankerDwt: number; |
| exportTankerDwt: number; |
| anomalySignal: boolean; |
| }[]; |
| fetchedAt: string; |
| } |
|
|
| export interface CountryBriefPanel { |
| show(country: string, code: string, score: CountryScore | null, signals: CountryBriefSignals): void; |
| hide(): void; |
| showLoading(): void; |
| getCode(): string | null; |
| getName(): string | null; |
| isVisible(): boolean; |
| getTimelineMount(): HTMLElement | null; |
| readonly signal: AbortSignal; |
| onClose(cb: () => void): void; |
| setShareStoryHandler(handler: (code: string, name: string) => void): void; |
| setExportImageHandler(handler: (code: string, name: string) => void): void; |
| updateBrief(data: CountryIntelData): void; |
| updateNews(headlines: NewsItem[]): void; |
| updateMarkets(markets: PredictionMarket[]): void; |
| updateStock(data: StockIndexData): void; |
| updateInfrastructure(code: string): void; |
| showGeoError?(onRetry: () => void): void; |
| updateScore?(score: CountryScore | null, signals: CountryBriefSignals): void; |
| updateSignalDetails?(details: CountryDeepDiveSignalDetails): void; |
| updateMilitaryActivity?(summary: CountryDeepDiveMilitarySummary): void; |
| updateEconomicIndicators?(indicators: CountryDeepDiveEconomicIndicator[]): void; |
| updateChinaCountrySummary?(data: ChinaCountrySummaryData): void; |
| updateCountryFacts?(data: CountryFactsData): void; |
| updateEnergyProfile?(data: CountryEnergyProfileData): void; |
| updateMaritimeActivity?(data: CountryPortActivityData): void; |
| updateTradeExposure?(data: GetCountryChokepointIndexResponse | null, sectors?: SectorExposureSummary[]): void; |
| maximize?(): void; |
| minimize?(): void; |
| getIsMaximized?(): boolean; |
| onStateChange?(cb: (state: { visible: boolean; maximized: boolean }) => void): void; |
| updateNationalDebt?(entry: { debtToGdp: number; debtUsd: number; annualGrowth: number; source: string } | null): void; |
| updateSanctionsPressure?(data: { entryCount: number; sanctionsActive?: boolean } | null): void; |
| updateComtradeFlows?(flows: Array<{ partnerName: string; cmdDesc: string; tradeValueUsd: number; yoyChange: number }> | null): void; |
| updateTariffTrends?(data: { currentRate: number; trend: string; datapoints: Array<{ year: number; tariffRate: number }> } | null): void; |
| updateMultiSectorCostShock?(data: MultiSectorShockResponse | null): void; |
| updateProductImports?(data: CountryProductsResponse | null): void; |
| updateHousingCycle?(data: { |
| residential?: { indexValue: number; qoqChange: number | null; yoyChange: number | null; period: string } | null; |
| commercial?: { indexValue: number; qoqChange: number | null; yoyChange: number | null; period: string } | null; |
| dsr?: { dsrPct: number; change: number | null; period: string } | null; |
| } | null): void; |
| } |
|
|