export interface MuseumFloor { id: string label: string order: number } export type GuideDiagnosticsStatus = 'OK' | 'WARN' | 'ERROR' export type GuideDataIssueSeverity = 'info' | 'warn' | 'error' export interface GuideFloorDetail extends MuseumFloor { sourceCode?: string sourceName?: string modelReady?: boolean poiCount?: number spaceCount?: number guideStopCount?: number navigablePlaceCount?: number routeNodeCount?: number routeEdgeCount?: number routePlanningReady?: boolean warnings: string[] } export interface GuideMapDiagnosticsSummary { floorCount: number modelReadyFloorCount: number poiCount: number spaceCount: number guideStopCount: number navigablePlaceCount: number routeNodeCount: number routeEdgeCount: number } export interface GuideMapDiagnostics { mapId: string mapName: string sdkVersion?: string status: GuideDiagnosticsStatus floors: GuideFloorDetail[] summary: GuideMapDiagnosticsSummary warnings: string[] } export interface GuideDataIntegrityIssue { id: string scope: 'floor' | 'poi' severity: GuideDataIssueSeverity message: string floorId?: string floorLabel?: string poiId?: string fields?: string[] } export interface GuideDataIntegrityReport { status: GuideDiagnosticsStatus summary: { floorCount: number poiCount: number issueCount: number errorCount: number warningCount: number } issues: GuideDataIntegrityIssue[] warnings: string[] } export interface MuseumCategory { id: string label: string iconType?: string } export interface MuseumPoi { id: string name: string floorId: string floorLabel: string primaryCategory: MuseumCategory categories: MuseumCategory[] positionGltf?: [number, number, number] sourceObjectName?: string sourceConfidence?: string navigationReadiness?: string accessible: boolean } export type GuideLocationResolutionStatus = 'exact' | 'hallFallback' | 'candidate' | 'unavailable' export interface GuideLocationResolution { status: GuideLocationResolutionStatus poiId?: string sourcePoiId?: string actionText: string previewOnly: boolean confidence?: string method?: string floorId?: string floorLabel?: string note?: string } export interface MuseumHall { id: string name: string floorId?: string floorLabel?: string description?: string image?: string exhibitCount?: number area?: string poiId?: string location?: GuideLocationResolution } export interface MuseumExhibit { id: string name: string hallId?: string hallName?: string floorId?: string floorLabel?: string image?: string description?: string poiId?: string sourcePoiId?: string location?: GuideLocationResolution artist?: string year?: string material?: string size?: string tags?: string[] guideContentId?: string guideTitle?: string guideText?: string audioUrl?: string audioDuration?: number audioAvailable?: boolean playTargetType?: AudioPlayTargetType playTargetId?: string } export interface GuideLocationPreview { poiId: string name: string floorId: string floorLabel: string primaryCategoryZh?: string positionGltf?: [number, number, number] sourceObjectName?: string } export interface GuideStartLocation { label: string floor?: string source?: string } export interface GuidePreviewStep { id: string text: string } export interface GuideLocationPreviewPlan { id: string facilityId: string target: string summary: string steps: GuidePreviewStep[] targetLocation: GuideLocationPreview | null startLocation: GuideStartLocation | null } export interface GuideRouteReadiness { ready: boolean message: string requiredData: string[] } export interface GuideRouteTarget { poiId: string name: string floorId: string floorLabel: string categoryLabel?: string positionGltf?: [number, number, number] routeNodeId: string } export interface GuideRoutePoint { nodeId: string floorId: string position: [number, number, number] } export interface GuideRouteFloorSegment { floorId: string floorLabel: string points: GuideRoutePoint[] } export interface GuideRouteConnectorPoint { nodeId: string floorId: string floorLabel: string position: [number, number, number] connectorType?: string } export interface GuideRouteEndpoint { poiId: string name: string floorId: string floorLabel: string routeNodeId: string position: [number, number, number] } export interface GuideRouteResult { id: string start: GuideRouteEndpoint end: GuideRouteEndpoint distanceMeters: number nodeIds: string[] points: GuideRoutePoint[] floorSegments: GuideRouteFloorSegment[] connectorPoints: GuideRouteConnectorPoint[] } export interface MediaAsset { id: string type: 'audio' | 'image' | 'transcript' url?: string duration?: number language?: string available: boolean unavailableReason?: string } export type AudioPlayTargetType = 'ITEM' | 'STOP' export interface ExplainTrack { id: string exhibitId?: string hallId?: string title: string summary?: string mediaId?: string coverImage?: string poiId?: string sourcePoiId?: string location?: GuideLocationResolution floorId?: string available: boolean playTargetType?: AudioPlayTargetType playTargetId?: string } export interface SearchIndexItem { id: string name: string desc: string type: 'exhibit' | 'hall' | 'facility' poiId?: string floorId?: string exhibitId?: string hallId?: string }