@naniteninja/profile-comparison-lib 1.0.26 → 1.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naniteninja-profile-comparison-lib.mjs","sources":["../../../projects/profile-comparison-lib/src/lib/tokens.ts","../../../projects/profile-comparison-lib/src/lib/services/cache-persistence.service.ts","../../../projects/profile-comparison-lib/src/lib/services/file-conversion.service.ts","../../../projects/profile-comparison-lib/src/lib/services/image-compression.service.ts","../../../projects/profile-comparison-lib/src/lib/services/openai-embedding.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile-comparison-lib.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile-comparison-backend.service.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.html","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.module.ts","../../../projects/profile-comparison-lib/src/public-api.ts","../../../projects/profile-comparison-lib/src/naniteninja-profile-comparison-lib.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Backend mode for the profile comparison component. */\r\nexport enum BackendMode {\r\n /** Use the real deployed backend (default). */\r\n Real = 0,\r\n /** Use a local mock server at localhost:44101. */\r\n Mock = 1,\r\n}\r\n\r\nexport const BACKEND_MODE_URLS: Record<BackendMode, string> = {\r\n [BackendMode.Real]: 'https://api.test.thecyrano.app/api/profile-comparison/api',\r\n [BackendMode.Mock]: 'http://localhost:44101/api',\r\n};\r\n\r\n/** Either a static base URL or a getter that returns the current base URL (for runtime toggle). */\r\nexport type ProfileComparisonApiBaseUrl = string | (() => string | null);\r\n\r\n/**\r\n * Legacy injection token for the backend base URL.\r\n * Prefer using the [backendMode] or [backendUrl] @Input on the component instead.\r\n * Kept for backward compatibility — lowest priority when resolving the URL.\r\n */\r\nexport const PROFILE_COMPARISON_API_BASE_URL = new InjectionToken<ProfileComparisonApiBaseUrl | null>(\r\n 'PROFILE_COMPARISON_API_BASE_URL'\r\n);\r\n\r\n/** Optional getter: when true, lib and backend service log steps to console for diagnosis. */\r\nexport const PROFILE_COMPARISON_VERBOSE_LOGGING = new InjectionToken<() => boolean>(\r\n 'PROFILE_COMPARISON_VERBOSE_LOGGING'\r\n);\r\n\r\n/**\r\n * Resolves the active backend URL from inputs, with fallback to injection token.\r\n *\r\n * Priority:\r\n * 1. Explicit backendUrl (custom URL string)\r\n * 2. BackendMode enum (Real or Mock)\r\n * 3. Legacy PROFILE_COMPARISON_API_BASE_URL token\r\n */\r\nexport function resolveBackendUrl(\r\n backendUrl: string | null | undefined,\r\n backendMode: BackendMode,\r\n legacyTokenUrl: string | null | undefined,\r\n): string | null {\r\n if (backendUrl != null && backendUrl.trim().length > 0) {\r\n return backendUrl.trim();\r\n }\r\n const modeUrl = BACKEND_MODE_URLS[backendMode];\r\n if (modeUrl) {\r\n return modeUrl;\r\n }\r\n if (legacyTokenUrl != null && legacyTokenUrl.trim().length > 0) {\r\n return legacyTokenUrl.trim();\r\n }\r\n return null;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nconst DB_NAME = 'profile-comparison-cache';\r\nconst DB_VERSION = 1;\r\nconst STORE_OPENAI_SPACER = 'openai-spacer';\r\nconst STORE_OPENAI_ALIGNMENT = 'openai-alignment';\r\nconst STORE_OPENAI_SIMILARITY = 'openai-similarity';\r\nconst STORE_OPENAI_EMBEDDINGS = 'openai-embeddings';\r\nconst STORE_PROFILE_FACE = 'profile-face';\r\nconst STORE_PROFILE_COMPARE = 'profile-compare';\r\n\r\nconst STORE_NAMES = [\r\n STORE_OPENAI_SPACER,\r\n STORE_OPENAI_ALIGNMENT,\r\n STORE_OPENAI_SIMILARITY,\r\n STORE_OPENAI_EMBEDDINGS,\r\n STORE_PROFILE_FACE,\r\n STORE_PROFILE_COMPARE\r\n] as const;\r\n\r\nexport type CacheStoreName = typeof STORE_NAMES[number];\r\n\r\n/**\r\n * Persists cache entries to IndexedDB per device (mobile-friendly).\r\n * No-op when IndexedDB is unavailable (e.g. SSR, private mode on some browsers).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class CachePersistenceService {\r\n private db: IDBDatabase | null = null;\r\n private openPromise: Promise<IDBDatabase | null> | null = null;\r\n\r\n private openDb(): Promise<IDBDatabase | null> {\r\n if (typeof indexedDB === 'undefined') return Promise.resolve(null);\r\n if (this.db) return Promise.resolve(this.db);\r\n if (this.openPromise) return this.openPromise;\r\n this.openPromise = new Promise<IDBDatabase | null>((resolve) => {\r\n try {\r\n const req = indexedDB.open(DB_NAME, DB_VERSION);\r\n req.onerror = () => resolve(null);\r\n req.onsuccess = () => {\r\n this.db = req.result;\r\n resolve(this.db);\r\n };\r\n req.onupgradeneeded = (e) => {\r\n const db = (e.target as IDBOpenDBRequest).result;\r\n STORE_NAMES.forEach((name) => {\r\n if (!db.objectStoreNames.contains(name)) db.createObjectStore(name);\r\n });\r\n };\r\n } catch {\r\n resolve(null);\r\n }\r\n });\r\n return this.openPromise;\r\n }\r\n\r\n private getStore(storeName: CacheStoreName, mode: IDBTransactionMode = 'readonly'): Promise<IDBObjectStore | null> {\r\n return this.openDb().then((db) => {\r\n if (!db) return null;\r\n try {\r\n return db.transaction(storeName, mode).objectStore(storeName);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n }\r\n\r\n get<T>(storeName: CacheStoreName, key: string): Promise<T | undefined> {\r\n return this.openDb().then((db) => {\r\n if (!db) return undefined;\r\n return new Promise<T | undefined>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const store = tx.objectStore(storeName);\r\n const req = store.get(key);\r\n req.onsuccess = () => resolve(req.result ?? undefined);\r\n req.onerror = () => resolve(undefined);\r\n } catch {\r\n resolve(undefined);\r\n }\r\n });\r\n });\r\n }\r\n\r\n set(storeName: CacheStoreName, key: string, value: unknown): Promise<void> {\r\n return this.openDb().then((db) => {\r\n if (!db) return;\r\n return new Promise<void>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n store.put(value, key);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => resolve();\r\n } catch {\r\n resolve();\r\n }\r\n });\r\n });\r\n }\r\n\r\n getAll(storeName: CacheStoreName): Promise<[string, unknown][]> {\r\n return this.openDb().then((db) => {\r\n if (!db) return [];\r\n return new Promise<[string, unknown][]>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const store = tx.objectStore(storeName);\r\n const req = store.openCursor();\r\n const entries: [string, unknown][] = [];\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (cursor) {\r\n entries.push([cursor.key as string, cursor.value]);\r\n cursor.continue();\r\n } else {\r\n resolve(entries);\r\n }\r\n };\r\n req.onerror = () => resolve([]);\r\n } catch {\r\n resolve([]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n clear(storeName?: CacheStoreName): Promise<void> {\r\n return this.openDb().then((db) => {\r\n if (!db) return;\r\n const stores = storeName ? [storeName] : [...STORE_NAMES];\r\n return Promise.all(\r\n stores.map(\r\n (s) =>\r\n new Promise<void>((resolve) => {\r\n try {\r\n const tx = db.transaction(s, 'readwrite');\r\n tx.objectStore(s).clear();\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => resolve();\r\n } catch {\r\n resolve();\r\n }\r\n })\r\n )\r\n ).then(() => undefined);\r\n });\r\n }\r\n\r\n static readonly STORE_OPENAI_SPACER = STORE_OPENAI_SPACER;\r\n static readonly STORE_OPENAI_ALIGNMENT = STORE_OPENAI_ALIGNMENT;\r\n static readonly STORE_OPENAI_SIMILARITY = STORE_OPENAI_SIMILARITY;\r\n static readonly STORE_OPENAI_EMBEDDINGS = STORE_OPENAI_EMBEDDINGS;\r\n static readonly STORE_PROFILE_FACE = STORE_PROFILE_FACE;\r\n static readonly STORE_PROFILE_COMPARE = STORE_PROFILE_COMPARE;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, from, map, switchMap, of } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FileConversionService {\r\n private static readonly MIME_TYPE_JPEG = 'image/jpeg';\r\n private static readonly MIME_TYPE_PNG = 'image/png';\r\n private static readonly MIME_TYPE_WEBP = 'image/webp';\r\n private static readonly FILE_EXTENSION_JPG = '.jpg';\r\n private static readonly FILE_EXTENSION_JPEG = '.jpeg';\r\n private static readonly FILE_EXTENSION_PNG = '.png';\r\n private static readonly FILE_EXTENSION_WEBP = '.webp';\r\n\r\n urlToFile(url: string, fileName: string, mimeType: string): Observable<File> {\r\n return from(fetch(url)).pipe(\r\n switchMap(response => from(response.blob())),\r\n map(blob => new File([blob], fileName, { type: mimeType }))\r\n );\r\n }\r\n\r\n fetchUrlToDataUrl(url: string): Observable<string> {\r\n return new Observable<string>(observer => {\r\n // Try fetch first (works for CORS-enabled URLs)\r\n fetch(url)\r\n .then(response => response.blob())\r\n .then(blob => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = () => {\r\n // Fallback to Image + canvas if FileReader fails\r\n this.loadImageViaCanvas(url).subscribe({\r\n next: dataUrl => {\r\n observer.next(dataUrl);\r\n observer.complete();\r\n },\r\n error: err => observer.error(err)\r\n });\r\n };\r\n reader.readAsDataURL(blob);\r\n })\r\n .catch(() => {\r\n // Fetch failed (likely CORS), fallback to Image + canvas\r\n this.loadImageViaCanvas(url).subscribe({\r\n next: dataUrl => {\r\n observer.next(dataUrl);\r\n observer.complete();\r\n },\r\n error: err => observer.error(err)\r\n });\r\n });\r\n });\r\n }\r\n\r\n private loadImageViaCanvas(url: string): Observable<string> {\r\n return new Observable<string>(observer => {\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.naturalWidth;\r\n canvas.height = img.naturalHeight;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n observer.error(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n ctx.drawImage(img, 0, 0);\r\n try {\r\n const dataUrl = canvas.toDataURL('image/jpeg', 0.92);\r\n observer.next(dataUrl);\r\n observer.complete();\r\n } catch (err) {\r\n observer.error(err);\r\n }\r\n };\r\n img.onerror = () => observer.error(new Error('Failed to load image'));\r\n img.src = url;\r\n });\r\n }\r\n\r\n isDataUrl(str: string): boolean {\r\n return typeof str === 'string' && str.startsWith('data:');\r\n }\r\n\r\n dataUrlToFile(dataUrl: string, fileName: string): File {\r\n const [header, data] = dataUrl.split(',');\r\n const mimeMatch = header.match(/data:(.*?);/);\r\n const mime = mimeMatch ? mimeMatch[1] : FileConversionService.MIME_TYPE_PNG;\r\n const binary = atob(data || '');\r\n const len = binary.length;\r\n const u8 = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) u8[i] = binary.charCodeAt(i);\r\n return new File([u8], fileName, { type: mime });\r\n }\r\n\r\n getMimeFromFilename(fileName: string): string {\r\n const lower = (fileName || '').toLowerCase();\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_JPG) || lower.endsWith(FileConversionService.FILE_EXTENSION_JPEG)) return FileConversionService.MIME_TYPE_JPEG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_PNG)) return FileConversionService.MIME_TYPE_PNG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_WEBP)) return FileConversionService.MIME_TYPE_WEBP;\r\n return FileConversionService.MIME_TYPE_PNG;\r\n }\r\n\r\n getFileForImageString(imageStr: string, fileBaseName: string): Observable<File> {\r\n if (this.isDataUrl(imageStr)) return of(this.dataUrlToFile(imageStr, fileBaseName));\r\n const mime = this.getMimeFromFilename(imageStr);\r\n return this.urlToFile(imageStr, fileBaseName, mime);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IImageCompressionConfig } from '../interfaces';\r\nimport { Observable, from, of, map, switchMap } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ImageCompressionService {\r\n compressImageFile(file: File, config: IImageCompressionConfig, overrides: Partial<IImageCompressionConfig> = {}): Observable<{ file: File; dataUrl: string }> {\r\n const cfg = { ...config, ...overrides } as IImageCompressionConfig;\r\n\r\n return this.loadImageFromFile(file).pipe(\r\n switchMap((img) => {\r\n let width = img.naturalWidth || img.width;\r\n let height = img.naturalHeight || img.height;\r\n const scale = Math.min(cfg.maxWidth / width, cfg.maxHeight / height, 1);\r\n width = Math.max(1, Math.round(width * scale));\r\n height = Math.max(1, Math.round(height * scale));\r\n\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n const render = (w: number, h: number) => {\r\n canvas.width = w;\r\n canvas.height = h;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.drawImage(img, 0, 0, w, h);\r\n };\r\n\r\n const process = (w: number, h: number, q: number, attempts: number): Observable<Blob> => {\r\n render(w, h);\r\n return this.canvasToBlob(canvas, cfg.format, q).pipe(\r\n switchMap((blob) => {\r\n if (blob.size > cfg.maxBytes && attempts < 25) {\r\n if (q > cfg.qualityMin + 0.005) {\r\n return process(w, h, Math.max(cfg.qualityMin, q - cfg.qualityStep), attempts + 1);\r\n } else {\r\n const nextW = Math.max(Math.round(w * cfg.downscaleStep), cfg.minWidth);\r\n const nextH = Math.max(Math.round(h * cfg.downscaleStep), cfg.minHeight);\r\n if (nextW === w && nextH === h) return of(blob);\r\n return process(nextW, nextH, cfg.qualityStart, attempts + 1);\r\n }\r\n }\r\n return of(blob);\r\n })\r\n );\r\n };\r\n\r\n return process(width, height, cfg.qualityStart, 0).pipe(\r\n switchMap((finalBlob: Blob) => {\r\n const newName = this.renameFileForFormat(file.name, cfg.format);\r\n const compressedFile = new File([finalBlob], newName, { type: cfg.format, lastModified: Date.now() });\r\n return this.blobToDataURL(finalBlob).pipe(\r\n map((dataUrl) => ({ file: compressedFile, dataUrl }))\r\n );\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n loadImageFromFile(file: File): Observable<HTMLImageElement> {\r\n return new Observable(observer => {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n observer.next(img);\r\n observer.complete();\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n observer.error(new Error('Failed to load image'));\r\n };\r\n img.src = url;\r\n });\r\n }\r\n\r\n canvasToBlob(canvas: HTMLCanvasElement, type: string, quality: number): Observable<Blob> {\r\n return new Observable(observer => {\r\n if (canvas.toBlob) {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n observer.next(blob);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('toBlob null'));\r\n }\r\n }, type, quality);\r\n } else {\r\n try {\r\n const dataUrl = canvas.toDataURL(type, quality);\r\n const base64 = dataUrl.split(',')[1] || '';\r\n const binary = atob(base64);\r\n const u8 = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) u8[i] = binary.charCodeAt(i);\r\n observer.next(new Blob([u8], { type }));\r\n observer.complete();\r\n } catch (e) {\r\n observer.error(e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n blobToDataURL(blob: Blob): Observable<string> {\r\n return new Observable(observer => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = (err) => observer.error(err);\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n\r\n renameFileForFormat(name: string, mime: string): string {\r\n const base = name.substring(0, name.lastIndexOf('.')) || name;\r\n if (mime === 'image/jpeg') return `${base}.jpg`;\r\n if (mime === 'image/png') return `${base}.png`;\r\n if (mime === 'image/webp') return `${base}.webp`;\r\n return `${base}.jpg`;\r\n }\r\n}\r\n","import { Injectable, Optional, Inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError, of, BehaviorSubject, from } from 'rxjs';\nimport { map, catchError, switchMap, tap } from 'rxjs/operators';\nimport { IAlignmentRow, IOpenAIResponse, IOpenAIEmbeddingItem } from '../interfaces';\nimport { PROFILE_COMPARISON_API_BASE_URL } from '../tokens';\nimport { CachePersistenceService } from './cache-persistence.service';\n\n/**\n * OpenAI Alignment Service\n * Uses OpenAI Chat Completions API to align two lists of text in a single request.\n * This replaces the previous embedding-based approach to avoid rate limits and reduce complexity.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class OpenAIEmbeddingService {\n private static readonly API_URL = 'https://api.openai.com/v1/chat/completions';\n private static readonly MODEL = 'gpt-4o';\n private static readonly HEADER_CONTENT_TYPE = 'Content-Type';\n private static readonly HEADER_AUTHORIZATION = 'Authorization';\n private static readonly CONTENT_TYPE_JSON = 'application/json';\n private static readonly BEARER_PREFIX = 'Bearer ';\n private static readonly SPACER_SMALL = '-';\n private static readonly SPACER_LARGE = '----';\n\n private readonly API_URL = OpenAIEmbeddingService.API_URL;\n // Using gpt-4o for maximum intelligence and adherence to complex instructions\n private readonly MODEL = OpenAIEmbeddingService.MODEL;\n \n // Cache for alignment results\n // Key: Canonical hash of two lists\n // Value: { originalA: string[], originalB: string[], rows: IAlignmentRow[] }\n private alignmentCache = new Map<string, { originalA: string[], originalB: string[], rows: IAlignmentRow[] }>();\n \n // Cache for new spacer-based alignment\n private spacerAlignmentCache = new Map<string, { listA: string[], listB: string[] }>();\n\n // Cache for similarity (textA, textB) -> score\n private similarityCache = new Map<string, number>();\n // Cache for embeddings: JSON.stringify(texts) -> number[][]\n private embeddingsCache = new Map<string, number[][]>();\n\n private spacerLoaded = false;\n private alignmentLoaded = false;\n private similarityLoaded = false;\n private embeddingsLoaded = false;\n private spacerLoadPromise: Promise<void> | null = null;\n private alignmentLoadPromise: Promise<void> | null = null;\n private similarityLoadPromise: Promise<void> | null = null;\n private embeddingsLoadPromise: Promise<void> | null = null;\n\n public rawResponse$ = new BehaviorSubject<string>('');\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PROFILE_COMPARISON_API_BASE_URL) private apiBaseUrl: import('../tokens').ProfileComparisonApiBaseUrl | null,\n private persistence: CachePersistenceService\n ) {}\n\n private loadSpacerCache(): Promise<void> {\n if (this.spacerLoaded) return Promise.resolve();\n if (!this.spacerLoadPromise) {\n this.spacerLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_SPACER).then((entries) => {\n entries.forEach(([k, v]) => this.spacerAlignmentCache.set(k, v as { listA: string[]; listB: string[] }));\n this.spacerLoaded = true;\n });\n }\n return this.spacerLoadPromise;\n }\n\n private loadAlignmentCache(): Promise<void> {\n if (this.alignmentLoaded) return Promise.resolve();\n if (!this.alignmentLoadPromise) {\n this.alignmentLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_ALIGNMENT).then((entries) => {\n entries.forEach(([k, v]) => this.alignmentCache.set(k, v as { originalA: string[]; originalB: string[]; rows: IAlignmentRow[] }));\n this.alignmentLoaded = true;\n });\n }\n return this.alignmentLoadPromise;\n }\n\n private loadSimilarityCache(): Promise<void> {\n if (this.similarityLoaded) return Promise.resolve();\n if (!this.similarityLoadPromise) {\n this.similarityLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_SIMILARITY).then((entries) => {\n entries.forEach(([k, v]) => this.similarityCache.set(k, v as number));\n this.similarityLoaded = true;\n });\n }\n return this.similarityLoadPromise;\n }\n\n private loadEmbeddingsCache(): Promise<void> {\n if (this.embeddingsLoaded) return Promise.resolve();\n if (!this.embeddingsLoadPromise) {\n this.embeddingsLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_EMBEDDINGS).then((entries) => {\n entries.forEach(([k, v]) => this.embeddingsCache.set(k, v as number[][]));\n this.embeddingsLoaded = true;\n });\n }\n return this.embeddingsLoadPromise;\n }\n\n private getBaseUrl(): string | null {\n const u = this.apiBaseUrl;\n if (u == null) return null;\n return typeof u === 'function' ? u() : u;\n }\n\n /**\n * Get aligned lists with spacers.\n * Now uses a direct LLM call with a specific prompt to generate the aligned lists.\n */\n getAlignedLists(\n listA: string[],\n listB: string[],\n apiKey: string\n ): Observable<{ listA: string[], listB: string[] }> {\n \n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n\n if (validA.length === 0 && validB.length === 0) return of({ listA: [], listB: [] });\n\n const key = JSON.stringify({ a: validA, b: validB, v: 'spacer-v35' });\n\n return from(this.loadSpacerCache()).pipe(\n switchMap(() => {\n if (this.spacerAlignmentCache.has(key)) {\n console.log('Alignment cache hit');\n return of(this.spacerAlignmentCache.get(key)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/align-lists`;\n return this.http\n .post<{ listA: string[]; listB: string[] }>(url, { listA: validA, listB: validB }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((result) => {\n const finalResult = { listA: result.listA || [], listB: result.listB || [] };\n this.spacerAlignmentCache.set(key, finalResult);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SPACER, key, finalResult);\n if (result.listA?.length && result.listB?.length) {\n this.rawResponse$.next(JSON.stringify(result));\n }\n return finalResult;\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('Backend align-lists error:', error);\n return of({ listA: [], listB: [] });\n })\n );\n }\n\n return this.requestAlignedListsDirect(validA, validB, key, apiKey);\n })\n );\n }\n\n private requestAlignedListsDirect(\n validA: string[],\n validB: string[],\n key: string,\n apiKey: string\n ): Observable<{ listA: string[]; listB: string[] }> {\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const prompt = `\n You are an expert semantic alignment engine.\n Task: Align the items from List A to List B based on semantic similarity.\n Context: This is a heuristic, human-semantic alignment (use embeddings later if you want it algorithmically strict).\n \n List A: ${JSON.stringify(validA)}\n List B: ${JSON.stringify(validB)}\n\n SEMANTIC STRATEGY (3-PASS PROCESS):\n 1. **Pass 1: Exact & Strong Matches**: First, lock in all exact synonyms (e.g., \"Dog\" vs \"Puppy\") and strong category matches (e.g., \"Tennis\" vs \"Badminton\"). These are your anchors.\n 2. **Pass 2: Thematic Clustering**: Next, group remaining items by sub-theme (e.g., \"Water Sports\", \"Asian Cuisine\"). Align items within these themes even if they aren't perfect pairs.\n 3. **Pass 3: Contextual & Loose Matches**: Look for looser associations (e.g., \"Reading\" vs \"Library\").\n 4. **Isolation**: If an item truly has NO relation to anything remaining in the other list, ISOLATE it using \"----\". Do NOT force a bad match.\n\n Rules:\n 1. Align items into clusters with variable dash-gaps to show semantic distance.\n 2. Use \"-\" for a small hop (related but distinct).\n 3. Use \"----\" for a hard theme switch (different category).\n 4. You MUST reorder items to create the best semantic clusters.\n 5. Ensure the output arrays \"listA\" and \"listB\" have the SAME length.\n 6. If an item has no match, align it with \"-\" or \"----\" as appropriate, or just a gap.\n 7. Output MUST be a JSON object with \"listA\" and \"listB\".\n 8. **COMPLETENESS**: You MUST include EVERY item from the input List A and List B in the output. Do not omit any items.\n 9. **Handling Leftovers**: If you have items left over at the end that don't match well, still include them in the list, aligned with \"-\" if necessary, or grouped together if they are somewhat related.\n 10. **Spacer Alignment**: You MUST align \"----\" with \"----\" in both lists. Do NOT align a hard switch \"----\" with a word. If you need a switch on one side, put it on the other side too.\n 11. **Strict Side Adherence**: Items from Input List A MUST ONLY appear in Output List A. Items from Input List B MUST ONLY appear in Output List B. Do not mix them up.\n 12. **Mandatory Spacers**: You MUST insert a spacer (\"-\" or \"----\") between clusters of related items. Avoid putting \"----\" between every single item; use it only when the topic truly shifts.\n 13. **NO TRAILING SPACER**: The last item in both lists MUST be a word. Do NOT put a spacer at the very end.\n 14. **Length Mismatch Handling**: If one list is shorter than the other, you MUST fill the empty slots in the shorter list with spacers (\"-\") ONLY. DO NOT invent words or reuse words to fill the space.\n 15. **HIGH SIMILARITY CONSOLIDATION (>= 0.8)**: This is CRITICAL for center display:\n - When you find a pair with VERY HIGH semantic similarity (>= 0.8), you MUST output the SAME TEXT in both listA and listB at that position.\n - **Key principle**: If the items are synonyms, very similar activities, or one is a specific type of the other, consolidate them!\n - **STRICT CONSTRAINT**: You can ONLY consolidate if BOTH items actually exist in the input lists and are semantically related.\n - **NEVER** invent an item for List B just to make a pair with List A. If List A has \"figma\" and List B has NOTHING related, output \"figma\" in List A and \"-\" in List B. DO NOT put \"figma\" in List B.\n - **STRICT SYMMETRY**: If you use the \"×\" symbol to consolidate, you MUST output the EXACT SAME string in BOTH \"listA\" and \"listB\" at that index.\n - This allows the system to automatically move these items to the center display!\n - **NEVER** use \"×\" on one side and a spacer on the other. That is a critical failure.\n - **NEVER** include similarity scores or any other numbers in the output strings unless they are part of the original item text.\n - **ONLY** use \"×\" as the separator for consolidated items. Do not use \"/\", \"&\", or other symbols for this purpose.\n - Example: \"Jogging\" (List A) + \"Running\" (List B) -> \"Jogging × Running\" in BOTH listA and listB.\n - **NEVER DROP CONSOLIDATED ITEMS**: If you consolidate \"Jogging\" and \"Running\" into \"Jogging × Running\", you MUST put this string in **BOTH** List A and List B. Do NOT put it in List A and a spacer in List B. That would delete \"Running\" from the output.\n - **CRITICAL ERROR PREVENTION**: Do NOT drop items from List B. If \"Running\" is in Input List B, it MUST appear in Output List B (either as \"Running\" or \"Jogging × Running\"). If you output \"Jogging × Running\" in List A but \"-\" in List B, you have FAILED.\n - **COMPLETENESS CHECK**: You MUST verify that EVERY item from the input lists is present in the output. If \"Running\" is in Input List B, it MUST be in Output List B (or consolidated). DO NOT DROP ITEMS.\n - **DETERMINISM**: Process the list from top to bottom. Do not change your output between runs.\n - This allows the system to automatically move these items to the center display!\n 16. Do not insert any new, inferred, or related words. Each pair must be created strictly from the existing list items only.\n\n NEGATIVE CONSTRAINTS:\n - NEVER put an item from List A into List B.\n - NEVER put an item from List B into List A.\n - NEVER invent new items. Only use items from the input lists.\n - **NEVER DUPLICATE ITEMS**. Each item from the input list must appear EXACTLY ONCE in the output.\n\n VERIFICATION STEP:\n Before outputting, verify every single item:\n - \"Is this item in Input List A?\" -> If yes, put it in Output List A.\n - \"Is this item in Input List B?\" -> If yes, put it in Output List B.\n - \"Is this item in neither?\" -> It is a hallucination. DELETE IT.\n\n CRITICAL: OUTPUT MUST CONTAIN EXACTLY THE SAME ITEMS AS INPUT. NO DELETIONS ALLOWED.\n\n FINAL SANITY CHECK:\n - **HALLUCINATION CHECK**: Go through every word in your Output List A. Is it EXACTLY present in Input List A? If not, DELETE IT. Do the same for List B.\n - **DUPLICATION CHECK**: Scan List A and List B. Does ANY word appear more than once? If so, DELETE the extra occurrences immediately. Each item must appear EXACTLY ONCE.\n - **COUNT CHECK**: Count the number of non-spacer items in your Output List A. Does it match the number of items in Input List A? If not, you are missing items. FIND THEM AND ADD THEM.\n - **COUNT CHECK**: Do the same for List B.\n - Look at your generated \"listA\". Are there any items that belong to Input List B? REMOVE THEM immediately.\n - Look at your generated \"listB\". Are there any items that belong to Input List A? REMOVE THEM immediately.\n - **Did you miss any items from Input List A? ADD THEM NOW.**\n - **Did you miss any items from Input List B? ADD THEM NOW.**\n - If you are unsure where an item belongs, check the Input Lists provided above. Do NOT guess.\n\n Example of Desired Output Logic:\n - \"Volunteering at animal shelter\" vs \"Dog training\" -> Related? Yes. Similarity >= 0.8? No (different activities)\n - NEXT PAIR: \"Trail biking\" vs \"Rock climbing\" -> Is this related to Animals? No. -> INSERT \"----\"\n - \"Trail biking\" vs \"Rock climbing\" -> Related? Yes (Outdoors).\n - NEXT PAIR: \"Jogging\" vs \"Running\" -> Similarity >= 0.8? YES! -> Output \"Jogging × Running\" in BOTH lists\n - \"Jogging\" vs \"Running\" -> Related? Yes (Exercise).\n - NEXT PAIR: \"Beach volleyball\" vs \"Salsa dancing\" -> Is this related to Exercise? Yes. -> INSERT \"-\" (Small hop)\n - \"Beach volleyball\" vs \"Salsa dancing\" -> Related? Yes (Hobbies). Similarity >= 0.8? No (different hobbies)\n - NEXT PAIR: \"Fermenting kimchi\" vs \"Korean cooking\" -> Is this related to Hobbies? No. -> INSERT \"----\"\n\n JSON Output Structure:\n {\n \"listA\": [\"Consolidated Item × Match\", \"----\", \"Unique Item A\", \"-\" , \"Unique Item A1\" , \"-\" , \"Unique Item A2\" ,\"----\" , \"Unique Item A3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item A5, \"----\" , Uniue Item A6 ],\n \"listB\": [\"Consolidated Item × Match\", \"----\", \"Unique Item B\", \"-\" , \"Unique Item B1\" , \"-\" , \"Unique Item B2\" ,\"----\" , \"Unique Item B3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item B5, \"----\" , - ]\n }\n Note: In this case, List A has more items, so the last remaining item is displayed as a single card.In other cases, List B may have more words, and in that situation, the extra word from List B is shown as a single card.\n Each unique item in List A has a corresponding unique item in List B that is highly similar in meaning or related in terms of concept. \n VARIATION & SIMILARITY CONTROL: Maintain strict consistency. If the same semantic relationship appears multiple times, align it identically every time.\n `;\n\n const body = {\n model: this.MODEL,\n messages: [\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\n { role: 'user', content: prompt }\n ],\n response_format: { type: 'json_object' },\n temperature: 0.0, // Zero temperature for maximum determinism\n seed: 42 // Fixed seed for reproducibility\n };\n\n return this.http.post<IOpenAIResponse>(this.API_URL, body, { headers }).pipe(\n map(response => {\n try {\n const content = response.choices[0].message.content;\n console.log('OpenAI LLM Output (getAlignedLists):', content);\n if (content) {\n this.rawResponse$.next(content);\n }\n const result = JSON.parse(content);\n \n // Handle both \"listA/listB\" format and \"alignment\" array format\n if (result.alignment && Array.isArray(result.alignment)) {\n result.listA = result.alignment.map((row: any) => row.left || row.itemA || '');\n result.listB = result.alignment.map((row: any) => row.right || row.itemB || '');\n }\n\n if (!result.listA || !result.listB || !Array.isArray(result.listA) || !Array.isArray(result.listB)) {\n console.error('Invalid JSON structure from OpenAI:', result);\n throw new Error('Invalid JSON structure from OpenAI');\n }\n\n // Just ensure equal length for safety in UI rendering\n const maxLen = Math.max(result.listA.length, result.listB.length);\n while (result.listA.length < maxLen) result.listA.push(OpenAIEmbeddingService.SPACER_SMALL);\n while (result.listB.length < maxLen) result.listB.push(OpenAIEmbeddingService.SPACER_SMALL);\n\n // Post-process to ensure consolidated items are in both lists\n // If one side has \"A × B\" and the other is a spacer, sync them to ensure center display\n for (let i = 0; i < result.listA.length; i++) {\n const a = result.listA[i];\n const b = result.listB[i];\n const isConsolidatedA = a && a.includes(' × ');\n const isConsolidatedB = b && b.includes(' × ');\n const isSpacerA = !a || a === OpenAIEmbeddingService.SPACER_SMALL || a === OpenAIEmbeddingService.SPACER_LARGE;\n const isSpacerB = !b || b === OpenAIEmbeddingService.SPACER_SMALL || b === OpenAIEmbeddingService.SPACER_LARGE;\n\n if (isConsolidatedA && isSpacerB) {\n result.listB[i] = a;\n } else if (isConsolidatedB && isSpacerA) {\n result.listA[i] = b;\n }\n }\n\n // SANITIZATION: Strictly enforce that items belong to their respective lists\n const sanitized = this.sanitizeResponse(result.listA, result.listB, validA, validB);\n\n const finalResult = { listA: sanitized.listA, listB: sanitized.listB };\n this.spacerAlignmentCache.set(key, finalResult);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SPACER, key, finalResult);\n return finalResult;\n } catch (e) {\n console.error('Failed to parse OpenAI response', e);\n throw new Error('Failed to parse alignment result');\n }\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('OpenAI API Error:', error);\n return of({ listA: [], listB: [] });\n })\n );\n }\n\n private sanitizeResponse(\n outA: string[], \n outB: string[], \n inA: string[], \n inB: string[]\n ): { listA: string[], listB: string[] } {\n const cleanA: string[] = [];\n const cleanB: string[] = [];\n \n // Track used items to identify missing ones later\n const usedA = new Set<string>();\n const usedB = new Set<string>();\n \n // Helper to check if a string contains an item (exact or consolidated)\n const containsItem = (str: string, item: string) => {\n const s = str.toLowerCase();\n const i = item.toLowerCase();\n return s === i || s.includes(`× ${i}`) || s.includes(`${i} ×`) || s.includes(`/ ${i}`) || s.includes(`${i} /`);\n };\n\n for (let i = 0; i < outA.length; i++) {\n let itemA = outA[i];\n let itemB = outB[i];\n \n const isSpacerA = !itemA || itemA === OpenAIEmbeddingService.SPACER_SMALL || itemA === OpenAIEmbeddingService.SPACER_LARGE;\n const isSpacerB = !itemB || itemB === OpenAIEmbeddingService.SPACER_SMALL || itemB === OpenAIEmbeddingService.SPACER_LARGE;\n\n // Validate Item A\n let validItemA = itemA;\n if (!isSpacerA) {\n // Check if it belongs to Input A\n const originalA = inA.find(a => containsItem(itemA, a));\n if (originalA) {\n usedA.add(originalA);\n } else {\n // It's not in Input A. Is it in Input B?\n if (inB.some(b => containsItem(itemA, b))) {\n // Hallucination! It belongs to B but is in A.\n validItemA = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\n } else {\n // Unknown item (maybe consolidated hallucination). Keep if it looks like a consolidated string, else remove\n if (!itemA.includes('×') && !itemA.includes('/')) {\n validItemA = OpenAIEmbeddingService.SPACER_SMALL;\n }\n }\n }\n }\n\n // Validate Item B\n let validItemB = itemB;\n if (!isSpacerB) {\n // Check if it belongs to Input B\n const originalB = inB.find(b => containsItem(itemB, b));\n if (originalB) {\n usedB.add(originalB);\n } else {\n // It's not in Input B. Is it in Input A?\n if (inA.some(a => containsItem(itemB, a))) {\n // Hallucination! It belongs to A but is in B.\n validItemB = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\n } else {\n // Unknown item.\n if (!itemB.includes('×') && !itemB.includes('/')) {\n validItemB = OpenAIEmbeddingService.SPACER_SMALL;\n }\n }\n }\n }\n \n cleanA.push(validItemA);\n cleanB.push(validItemB);\n }\n\n // Restore Missing Items\n const missingA = inA.filter(a => !usedA.has(a));\n const missingB = inB.filter(b => !usedB.has(b));\n \n if (missingA.length > 0 || missingB.length > 0) {\n console.warn('Restoring missing items:', { missingA, missingB });\n \n // Add spacer to separate restored items\n if (cleanA.length > 0) {\n cleanA.push(OpenAIEmbeddingService.SPACER_LARGE);\n cleanB.push(OpenAIEmbeddingService.SPACER_LARGE);\n }\n \n // Append missing A items\n for (const a of missingA) {\n cleanA.push(a);\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n }\n \n // Append missing B items\n for (const b of missingB) {\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL);\n cleanB.push(b);\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n }\n }\n\n return { listA: cleanA, listB: cleanB };\n }\n\n /**\n * Get alignment between two lists using a single OpenAI Chat Completion request.\n * Uses canonical caching to ensure A->B and B->A use the same API response.\n */\n groupAlignLists(\n listA: string[],\n listB: string[],\n threshold: number = 0.25,\n preserveLeftOrder: boolean = true,\n exclusivityMargin: number = 0.06,\n leftCohesion: number = 0.23,\n apiKey: string\n ): Observable<IAlignmentRow[]> {\n \n // Filter valid items\n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n\n if (validA.length === 0 && validB.length === 0) return of([]);\n\n const keyDirect = JSON.stringify({ a: validA, b: validB });\n const keyReverse = JSON.stringify({ a: validB, b: validA });\n\n return from(this.loadAlignmentCache()).pipe(\n switchMap(() => {\n if (this.alignmentCache.has(keyDirect)) {\n console.log('Alignment cache hit (Direct)');\n return of(this.alignmentCache.get(keyDirect)!.rows);\n }\n if (this.alignmentCache.has(keyReverse)) {\n console.log('Alignment cache hit (Reverse) - Swapping results');\n const cached = this.alignmentCache.get(keyReverse)!;\n const swappedRows = cached.rows.map(row => ({\n left: row.right,\n right: row.left,\n score: row.score\n }));\n return of(swappedRows);\n }\n\n return this.requestGroupAlignLists(validA, validB, listA, listB, keyDirect, apiKey);\n })\n );\n }\n\n private requestGroupAlignLists(\n validA: string[],\n validB: string[],\n listA: string[],\n listB: string[],\n keyDirect: string,\n apiKey: string\n ): Observable<IAlignmentRow[]> {\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n // Construct the prompt\n const prompt = `\n You are an expert semantic alignment engine.\n Task: Align the items from List A to List B based on semantic similarity.\n \n List A: ${JSON.stringify(validA)}\n List B: ${JSON.stringify(validB)}\n\n Rules:\n 1. Match items that are semantically similar.\n 2. Support One-to-One, One-to-Many, and Many-to-Many matches.\n 3. **CRITICAL**: Avoid duplicate alignments. If multiple items in List B are highly similar to a single item in List A, group them ALL under that single List A item.\n 4. **CONSISTENCY**: The alignment must be symmetric. If \"Mutton\" matches \"Chicken\" when \"Mutton\" is on the left, it MUST also match \"Chicken\" when \"Mutton\" is on the right.\n 5. **ORDER**: You MUST reorder the items from BOTH lists to create the best semantic clusters. Place related groups next to each other (e.g., put all food items together, all tech items together).\n 6. If an item in List A has no match in List B, map it to \"-\".\n 7. If an item in List B is not matched to anything in List A, add a row with \"-\" on the left.\n 8. Output MUST be a JSON object with a single key \"alignment\" containing an array of objects.\n 9. Each object in the array must have:\n - \"left\": string (item from List A or \"-\")\n - \"right\": string (item from List B or \"-\")\n - \"score\": number (similarity score between 0 and 1)\n\n Example Output Format:\n {\n \"alignment\": [\n { \"left\": \"Seafood\", \"right\": \"Fish\", \"score\": 0.9 },\n { \"left\": \"Seafood\", \"right\": \"Clams\", \"score\": 0.85 },\n { \"left\": \"Seafood\", \"right\": \"Crab\", \"score\": 0.88 },\n { \"left\": \"Chicken\", \"right\": \"Meat\", \"score\": 0.8 },\n { \"left\": \"Chicken\", \"right\": \"Poultry\", \"score\": 0.9 },\n { \"left\": \"Chicken\", \"right\": \"Mutton\", \"score\": 0.85 },\n { \"left\": \"Coffee\", \"right\": \"Cafés\", \"score\": 0.9 },\n { \"left\": \"Coding\", \"right\": \"-\", \"score\": 0 }\n ]\n }\n `;\n\n const body = {\n model: this.MODEL,\n messages: [\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\n { role: 'user', content: prompt }\n ],\n response_format: { type: 'json_object' },\n temperature: 0.2\n };\n\n console.log('Sending single alignment request to OpenAI...');\n\n return this.http.post<any>(this.API_URL, body, { headers }).pipe(\n map(response => {\n try {\n const content = response.choices[0].message.content;\n console.log('OpenAI LLM Output (groupAlignLists):', content);\n if (content) {\n this.rawResponse$.next(content);\n }\n const result = JSON.parse(content);\n \n if (!result.alignment || !Array.isArray(result.alignment)) {\n throw new Error('Invalid JSON structure from OpenAI');\n }\n\n const rows: IAlignmentRow[] = result.alignment;\n \n // --- Post-Processing for Uniqueness, Grouping, Completeness, Reordering, and Validity ---\n\n // 0. Pre-process Input Lists: Deduplicate and Trim\n const validA = Array.from(new Set(listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\n const validB = Array.from(new Set(listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\n \n const validASet = new Set(validA);\n const validBSet = new Set(validB);\n\n // 0.1 Normalize Rows: Trim whitespace from AI response\n rows.forEach(row => {\n if (row.left) row.left = row.left.trim();\n if (row.right) row.right = row.right.trim();\n });\n\n // 0.2 Deduplicate Rows: Remove exact duplicate objects from AI response\n const uniqueRows = new Map<string, IAlignmentRow>();\n rows.forEach(row => {\n const key = `${row.left}|${row.right}`;\n if (!uniqueRows.has(key)) {\n uniqueRows.set(key, row);\n } else {\n // If duplicate exists, keep the one with higher score\n if (row.score > uniqueRows.get(key)!.score) {\n uniqueRows.set(key, row);\n }\n }\n });\n const dedupedRows = Array.from(uniqueRows.values());\n\n // 0.3 Hallucination Guard: Ensure all returned items actually exist in the input lists\n dedupedRows.forEach(row => {\n if (row.left !== '-' && !validASet.has(row.left)) {\n console.warn(`Hallucination detected: Left item '${row.left}' not in input list. Removing.`);\n row.left = '-';\n }\n if (row.right !== '-' && !validBSet.has(row.right)) {\n console.warn(`Hallucination detected: Right item '${row.right}' not in input list. Removing.`);\n row.right = '-';\n }\n });\n\n // 0.5 Exact Match Enforcer: If item exists in BOTH lists, force them to align\n const commonItems = validA.filter(a => validBSet.has(a));\n commonItems.forEach(item => {\n const exactRow = dedupedRows.find(r => r.left === item && r.right === item);\n if (exactRow) {\n exactRow.score = 1.0; \n } else {\n dedupedRows.forEach(r => {\n if (r.left === item) r.left = '-';\n if (r.right === item) r.right = '-';\n });\n dedupedRows.push({ left: item, right: item, score: 1.0 });\n }\n });\n\n // 1. Enforce Right-Side Uniqueness\n const rightItemBestMatch = new Map<string, { row: IAlignmentRow, index: number }>();\n dedupedRows.forEach((row, index) => {\n if (row.right && row.right !== '-') {\n if (!rightItemBestMatch.has(row.right)) {\n rightItemBestMatch.set(row.right, { row, index });\n } else {\n const currentBest = rightItemBestMatch.get(row.right)!;\n if (row.score > currentBest.row.score) {\n currentBest.row.right = '-';\n currentBest.row.score = 0;\n rightItemBestMatch.set(row.right, { row, index });\n } else {\n row.right = '-';\n row.score = 0;\n }\n }\n }\n });\n\n // 2. Group rows by their 'left' value\n const groups = new Map<string, IAlignmentRow[]>();\n const unmatchedRightRows: IAlignmentRow[] = [];\n \n dedupedRows.forEach(row => {\n if (row.left === '-') {\n unmatchedRightRows.push(row);\n } else {\n if (!groups.has(row.left)) {\n groups.set(row.left, []);\n }\n groups.get(row.left)!.push(row);\n }\n });\n\n // 3. Reconstruct the list respecting AI ORDER\n const processedRows: IAlignmentRow[] = [];\n const processedLeftItems = new Set<string>();\n\n dedupedRows.forEach(row => {\n if (row.left !== '-' && !processedLeftItems.has(row.left)) {\n const itemRows = groups.get(row.left)!;\n itemRows.sort((a, b) => b.score - a.score);\n itemRows.forEach((r, idx) => {\n if (idx > 0) r.left = '-';\n processedRows.push(r);\n });\n processedLeftItems.add(row.left);\n }\n });\n\n // 4. Add missing Left items\n validA.forEach(item => {\n if (!processedLeftItems.has(item)) {\n processedRows.push({ left: item, right: '-', score: 0 });\n }\n });\n\n // 5. Add unmatched right rows and missing Right items\n const validUnmatched = unmatchedRightRows.filter(r => r.right !== '-');\n processedRows.push(...validUnmatched);\n\n const usedB = new Set(processedRows.map(r => r.right).filter(x => x !== '-'));\n validB.forEach(bItem => {\n if (!usedB.has(bItem)) {\n processedRows.push({ left: '-', right: bItem, score: 0 });\n }\n });\n \n const finalRows = processedRows.filter(r => r.left !== '-' || r.right !== '-');\n const cacheKey = `${keyDirect}_v2`;\n \n const uniqueFinalRows = new Map<string, IAlignmentRow>();\n const finalRowsClean: IAlignmentRow[] = [];\n const seenLeftGroups = new Set<string>();\n\n finalRows.forEach(row => {\n const key = `${row.left}|${row.right}`;\n if (uniqueFinalRows.has(key)) return;\n uniqueFinalRows.set(key, row);\n\n if (row.left !== '-') {\n if (seenLeftGroups.has(row.left)) {\n row.left = '-'; \n } else {\n seenLeftGroups.add(row.left);\n }\n }\n \n finalRowsClean.push(row);\n });\n\n const cacheEntry = { originalA: validA, originalB: validB, rows: finalRowsClean };\n this.alignmentCache.set(cacheKey, cacheEntry);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_ALIGNMENT, cacheKey, cacheEntry);\n \n return finalRowsClean;\n } catch (e) {\n console.error('Failed to parse OpenAI response', e);\n throw new Error('Failed to parse alignment result');\n }\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('OpenAI API Error:', error);\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Calculate semantic similarity between two texts using OpenAI Embeddings API.\n * Returns a cosine similarity score in [0, 1] (0 for empty/invalid inputs).\n */\n calculateSimilarity(textA: string, textB: string, apiKey: string): Observable<number> {\n const a = (textA || '').trim();\n const b = (textB || '').trim();\n if (!a.length || !b.length) {\n return of(0);\n }\n\n const simKey = [a, b].sort().join('\\0');\n\n return from(this.loadSimilarityCache()).pipe(\n switchMap(() => {\n if (this.similarityCache.has(simKey)) {\n return of(this.similarityCache.get(simKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/calculate-similarity`;\n return this.http\n .post<{ similarity: number }>(url, { textA: a, textB: b }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((res) => {\n const similarity = res.similarity ?? 0;\n this.similarityCache.set(simKey, similarity);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SIMILARITY, simKey, similarity);\n return similarity;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'Backend calculate-similarity failed';\n return throwError(() => new Error(msg));\n })\n );\n }\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\n const body = {\n model: 'text-embedding-3-small',\n input: [a, b]\n };\n\n return this.http.post<any>(EMBEDDINGS_URL, body, { headers }).pipe(\n map(res => {\n const data = res?.data;\n if (!Array.isArray(data) || data.length < 2) {\n throw new Error('Invalid embeddings response from OpenAI');\n }\n const v1: number[] | undefined = data[0]?.embedding;\n const v2: number[] | undefined = data[1]?.embedding;\n if (!v1 || !v2) {\n throw new Error('Embeddings not present in OpenAI response');\n }\n const similarity = this.cosineSimilarityVectors(v1, v2);\n this.similarityCache.set(simKey, similarity);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SIMILARITY, simKey, similarity);\n return similarity;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\n return throwError(() => new Error(msg));\n })\n );\n })\n );\n }\n\n /**\n * Fetch embeddings for multiple texts in a single request.\n */\n getEmbeddings(texts: string[], apiKey: string): Observable<number[][]> {\n if (!texts || texts.length === 0) return of([]);\n\n const embKey = JSON.stringify(texts);\n\n return from(this.loadEmbeddingsCache()).pipe(\n switchMap(() => {\n if (this.embeddingsCache.has(embKey)) {\n return of(this.embeddingsCache.get(embKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/embeddings`;\n return this.http\n .post<{ data: Array<{ embedding: number[] }> }>(url, { input: texts }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((res) => {\n const result = (res.data || []).map((item) => item.embedding || []);\n this.embeddingsCache.set(embKey, result);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_EMBEDDINGS, embKey, result);\n return result;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'Backend embeddings failed';\n return throwError(() => new Error(msg));\n })\n );\n }\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\n const body = {\n model: 'text-embedding-3-small',\n input: texts\n };\n\n return this.http.post<IOpenAIResponse>(EMBEDDINGS_URL, body, { headers }).pipe(\n map(res => {\n const data = res?.data;\n if (!Array.isArray(data)) {\n throw new Error('Invalid embeddings response from OpenAI');\n }\n const result = data.map((item: IOpenAIEmbeddingItem) => item.embedding);\n this.embeddingsCache.set(embKey, result);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_EMBEDDINGS, embKey, result);\n return result;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\n return throwError(() => new Error(msg));\n })\n );\n })\n );\n }\n\n // Private helpers\n private cosineSimilarityVectors(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const ai = a[i];\n const bi = b[i];\n dot += ai * bi;\n na += ai * ai;\n nb += bi * bi;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n }\n\n\n clearCache(): void {\n this.alignmentCache.clear();\n this.spacerAlignmentCache.clear();\n this.similarityCache.clear();\n this.embeddingsCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_SPACER);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_ALIGNMENT);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_SIMILARITY);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_EMBEDDINGS);\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { IComparisonResult, IProfileConfig } from '../interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ProfileComparisonLibService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Main service for profile comparison functionality\r\n */\r\n compareProfiles(profile1: IProfileConfig, profile2: IProfileConfig): IComparisonResult {\r\n // Placeholder implementation\r\n console.log('Comparing profiles:', profile1, profile2);\r\n return {\r\n similarity: 0.5,\r\n differences: [],\r\n timestamp: new Date()\r\n };\r\n }\r\n\r\n /**\r\n * Get library version\r\n */\r\n getVersion(): string {\r\n return '0.0.0';\r\n }\r\n}\r\n","import { Injectable, Optional, Inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, of, map, tap, retryWhen, concatMap, timer, throwError, from } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { IFaceDetectionResult, ISimilarityResponse, IFacePlusPlusResponse, IFacePlusPlusFace } from '../interfaces';\nimport type { IFaceBoxWithLandmarks, IFaceLandmarks } from '../interfaces/IFaceDetectionResult.interface';\nimport { PROFILE_COMPARISON_API_BASE_URL } from '../tokens';\nimport { CachePersistenceService } from './cache-persistence.service';\n\nenum FacePlusPlusFormFields {\n API_KEY = 'api_key',\n API_SECRET = 'api_secret',\n IMAGE_BASE64 = 'image_base64',\n IMAGE_FILE = 'image_file',\n RETURN_LANDMARK = 'return_landmark'\n}\n\nenum FacePlusPlusErrorTypes {\n AUTHENTICATION_ERROR = 'authentication_error',\n AUTHORIZATION_ERROR = 'authorization_error',\n CONCURRENCY_LIMIT_EXCEEDED = 'concurrency_limit_exceeded',\n RATE = 'rate'\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ProfileService {\n private static readonly BASE_URL = 'https://api.api-ninjas.com/v1/';\n private static readonly FACE_PLUS_PLUS_URL = 'https://api-us.faceplusplus.com/facepp/v3/detect';\n\n private baseUrl = ProfileService.BASE_URL;\n private baseUrlf = ProfileService.FACE_PLUS_PLUS_URL;\n\n private faceCache = new Map<string, IFaceDetectionResult>();\n private compareInterestsCache = new Map<string, ISimilarityResponse>();\n private faceLoaded = false;\n private compareLoaded = false;\n private faceLoadPromise: Promise<void> | null = null;\n private compareLoadPromise: Promise<void> | null = null;\n\n /** Content-based cache key: hash long strings/data URLs so same content yields same key and we avoid huge keys. */\n private static faceCacheKey(key: string | undefined): string | undefined {\n if (key == null || key === '') return undefined;\n const toHash = key.startsWith('data:') && key.includes(',')\n ? (key.split(',')[1] ?? key)\n : key;\n if (toHash.length > 500 || key.length > 2000) {\n let h = 5381;\n for (let i = 0; i < toHash.length; i++) {\n h = ((h << 5) + h + toHash.charCodeAt(i)) | 0;\n }\n return `face:${h}`;\n }\n return key;\n }\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PROFILE_COMPARISON_API_BASE_URL) private apiBaseUrl: import('../tokens').ProfileComparisonApiBaseUrl | null,\n private persistence: CachePersistenceService\n ) {}\n\n private loadFaceCache(): Promise<void> {\n if (this.faceLoaded) return Promise.resolve();\n if (!this.faceLoadPromise) {\n this.faceLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_PROFILE_FACE).then((entries) => {\n entries.forEach(([k, v]) => this.faceCache.set(k, v as IFaceDetectionResult));\n this.faceLoaded = true;\n });\n }\n return this.faceLoadPromise;\n }\n\n private loadCompareCache(): Promise<void> {\n if (this.compareLoaded) return Promise.resolve();\n if (!this.compareLoadPromise) {\n this.compareLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_PROFILE_COMPARE).then((entries) => {\n entries.forEach(([k, v]) => this.compareInterestsCache.set(k, v as ISimilarityResponse));\n this.compareLoaded = true;\n });\n }\n return this.compareLoadPromise;\n }\n\n private getBaseUrl(): string | null {\n const u = this.apiBaseUrl;\n if (u == null) return null;\n return typeof u === 'function' ? u() : u;\n }\n\n compareInterests(\n text_1: string,\n text_2: string,\n apiKey: string\n ): Observable<ISimilarityResponse> {\n const a = (text_1 ?? '').trim();\n const b = (text_2 ?? '').trim();\n const cacheKey = a && b ? [a, b].sort().join('\\0') : '';\n\n return from(this.loadCompareCache()).pipe(\n switchMap(() => {\n if (cacheKey && this.compareInterestsCache.has(cacheKey)) {\n return of(this.compareInterestsCache.get(cacheKey)!);\n }\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/compare-interests`;\n return this.http.post<ISimilarityResponse>(url, { text_1: a || text_1, text_2: b || text_2 }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n }).pipe(\n tap((res) => {\n if (cacheKey) {\n this.compareInterestsCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_COMPARE, cacheKey, res);\n }\n })\n );\n }\n const headers = new HttpHeaders({\n 'X-Api-Key': apiKey,\n 'Content-Type': 'application/json',\n });\n return this.http.post<ISimilarityResponse>(\n `${this.baseUrl}textsimilarity`,\n { text_1: a || text_1, text_2: b || text_2 },\n { headers }\n ).pipe(\n tap((res) => {\n if (cacheKey) {\n this.compareInterestsCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_COMPARE, cacheKey, res);\n }\n })\n );\n })\n );\n }\n\n detectFace(\n image: File | string,\n creds?: { apiKey?: string; apiSecret?: string },\n options?: { cacheKey?: string }\n ): Observable<IFaceDetectionResult> {\n const rawKey = options?.cacheKey ?? (typeof image === 'string' ? image : undefined);\n const cacheKey = ProfileService.faceCacheKey(rawKey);\n\n return from(this.loadFaceCache()).pipe(\n switchMap(() => {\n if (cacheKey && this.faceCache.has(cacheKey)) {\n console.log('Face detection cache hit');\n return of(this.faceCache.get(cacheKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/detect-face`;\n let body: FormData | { image_base64: string };\n if (typeof image === 'string') {\n const isDataUrl = image.startsWith('data:');\n const base64 = isDataUrl ? (image.split(',')[1] || '') : image;\n body = { image_base64: base64 };\n return this.http.post<IFaceDetectionResult>(url, body, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n }).pipe(\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) return timer(3000);\n return throwError(() => error);\n })\n )\n ),\n tap((res) => {\n if (cacheKey) {\n this.faceCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, res);\n }\n })\n );\n }\n const formData = new FormData();\n formData.append('image_file', image, image.name);\n return this.http.post<IFaceDetectionResult>(url, formData).pipe(\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) return timer(3000);\n return throwError(() => error);\n })\n )\n ),\n tap((res) => {\n if (cacheKey) {\n this.faceCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, res);\n }\n })\n );\n }\n\n return this.detectFaceDirect(image, creds, cacheKey);\n })\n );\n }\n\n private detectFaceDirect(\n image: File | string,\n creds?: { apiKey?: string; apiSecret?: string },\n cacheKey?: string\n ): Observable<IFaceDetectionResult> {\n\n const formData = new FormData();\n const apiKey = creds?.apiKey ?? '';\n const apiSecret = creds?.apiSecret ?? '';\n formData.append(FacePlusPlusFormFields.API_KEY, apiKey);\n formData.append(FacePlusPlusFormFields.API_SECRET, apiSecret);\n\n if (typeof image === 'string') {\n const isDataUrl = image.startsWith('data:');\n const base64 = isDataUrl ? (image.split(',')[1] || '') : image;\n formData.append(FacePlusPlusFormFields.IMAGE_BASE64, base64);\n } else {\n formData.append(FacePlusPlusFormFields.IMAGE_FILE, image, image.name);\n }\n formData.append(FacePlusPlusFormFields.RETURN_LANDMARK, '1');\n\n return this.http.post<IFacePlusPlusResponse>(`${this.baseUrlf}`, formData).pipe(\n // Retry once after a short delay on Face++ rate-limit/security responses\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) {\n // Wait 3 seconds before a single retry\n return timer(3000);\n }\n // Propagate other errors (or second failure) to the caller\n return throwError(() => error);\n })\n )\n ),\n map((raw: IFacePlusPlusResponse) => {\n // Face++ sometimes returns HTTP 200 with an error payload containing `error_message`\n // e.g. \"AUTHENTICATION_ERROR: api_key and api_secret does not match.\" or\n // \"AUTHORIZATION_ERROR:<reason>\" or \"CONCURRENCY_LIMIT_EXCEEDED\".\n const errorMessage: string | undefined = raw?.error_message;\n if (errorMessage && typeof errorMessage === 'string' && errorMessage.trim().length > 0) {\n const lower = errorMessage.toLowerCase();\n let status = 400;\n if (lower.includes(FacePlusPlusErrorTypes.AUTHENTICATION_ERROR)) status = 401;\n else if (lower.includes(FacePlusPlusErrorTypes.AUTHORIZATION_ERROR)) status = 403;\n else if (lower.includes(FacePlusPlusErrorTypes.CONCURRENCY_LIMIT_EXCEEDED) || lower.includes(FacePlusPlusErrorTypes.RATE)) status = 429;\n\n // Throw an error-like object so subscribers hit the error path and can show a modal\n throw { status, error: { message: errorMessage } };\n }\n\n const faces: IFaceBoxWithLandmarks[] = Array.isArray(raw?.faces)\n ? raw.faces\n .map((f: IFacePlusPlusFace) => {\n const rect = f?.face_rectangle || f?.faceRect || f?.rect;\n if (!rect || typeof rect.left !== 'number' || typeof rect.top !== 'number') {\n return null;\n }\n let landmarks: IFaceLandmarks | undefined = undefined;\n const lm = f?.landmark;\n if (lm && typeof lm === 'object') {\n landmarks = {};\n for (const key of Object.keys(lm)) {\n const pt = lm[key];\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') {\n (landmarks as IFaceLandmarks)[key] = { x: pt.x, y: pt.y };\n }\n }\n }\n return {\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n landmarks,\n } as IFaceBoxWithLandmarks;\n })\n .filter((v: IFaceBoxWithLandmarks | null): v is IFaceBoxWithLandmarks => !!v)\n : [];\n\n const imageUrl = typeof image === 'string' && image.startsWith('http') ? image : '';\n const result: IFaceDetectionResult = { imageUrl, faces };\n if (cacheKey) {\n this.faceCache.set(cacheKey, result);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, result);\n }\n return result;\n })\n );\n }\n\n clearFaceCache(): void {\n this.faceCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_PROFILE_FACE);\n }\n\n clearCompareInterestsCache(): void {\n this.compareInterestsCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_PROFILE_COMPARE);\n }\n\n // Note: Face++ credentials and request fields are handled directly above.\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { tap, catchError } from 'rxjs/operators';\r\nimport { IProfileConfig } from '../interfaces/IProfileConfig.interface';\r\nimport { IComparisonPayload } from '../interfaces/IComparisonPayload.interface';\r\nimport { PROFILE_COMPARISON_API_BASE_URL, PROFILE_COMPARISON_VERBOSE_LOGGING, ProfileComparisonApiBaseUrl } from '../tokens';\r\n\r\n/**\r\n * Thin-client service: sends config to the backend and returns the display payload.\r\n * The lib does not call third-party APIs; the backend does.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ProfileComparisonBackendService {\r\n private http = inject(HttpClient);\r\n private apiBaseUrl = inject(PROFILE_COMPARISON_API_BASE_URL, { optional: true });\r\n private getVerboseLogging = inject(PROFILE_COMPARISON_VERBOSE_LOGGING, { optional: true });\r\n\r\n constructor() {}\r\n\r\n static extractErrorMessage(err: unknown): string {\r\n if (err == null || typeof err !== 'object') return 'Unknown error';\r\n const e = err as { error?: { message?: string }; message?: string };\r\n return e.error?.message || e.message || 'Unknown error';\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.getVerboseLogging?.() === true) {\r\n console.log('[ProfileComparisonBackend]', ...args);\r\n }\r\n }\r\n\r\n /** Returns the legacy token URL (for backward compat fallback). */\r\n getLegacyTokenUrl(): string | null {\r\n const u = this.apiBaseUrl;\r\n if (u == null) return null;\r\n return typeof u === 'function' ? u() : u;\r\n }\r\n\r\n /** @deprecated Use getLegacyTokenUrl(). Kept for backward compat. */\r\n getBaseUrl(): string | null {\r\n return this.getLegacyTokenUrl();\r\n }\r\n\r\n getComparison(config: IProfileConfig, baseUrl?: string | null): Observable<IComparisonPayload> {\r\n const base = baseUrl ?? this.getLegacyTokenUrl();\r\n this.log('getComparison', 'baseUrl', base ?? '(null)');\r\n if (!base || !base.trim()) {\r\n this.log('getComparison', 'returning error: backend not configured');\r\n return throwError(() => new Error('Backend not configured'));\r\n }\r\n const url = `${base.replace(/\\/$/, '')}/profile/compare-full`;\r\n this.log('getComparison', 'POST', url);\r\n return this.http.post<IComparisonPayload>(url, { config }).pipe(\r\n tap(() => this.log('getComparison', 'POST success')),\r\n catchError((err) => {\r\n this.log('getComparison', 'POST error', err);\r\n console.error(\r\n '[ProfileComparisonBackend] getComparison failed',\r\n err?.status,\r\n ProfileComparisonBackendService.extractErrorMessage(err),\r\n );\r\n return throwError(() => err);\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n ElementRef,\r\n Renderer2,\r\n AfterViewInit,\r\n ViewChild,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n EventEmitter,\r\n Optional,\r\n Inject,\r\n ChangeDetectorRef,\r\n NgZone,\r\n HostListener,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { PROFILE_COMPARISON_VERBOSE_LOGGING, BackendMode, resolveBackendUrl } from './tokens';\r\nimport {\r\n forceSimulation,\r\n forceLink,\r\n forceCollide,\r\n forceX,\r\n forceY,\r\n SimulationNodeDatum,\r\n SimulationLinkDatum,\r\n} from 'd3-force';\r\nimport {\r\n IProfileConfig,\r\n IBoundingBox,\r\n IPoint,\r\n IFaceDetectionResult,\r\n IFaceBoxWithLandmarks,\r\n IFaceLandmarks,\r\n FaceDetectionData,\r\n IImageCompressionConfig,\r\n IMatrixData\r\n} from './interfaces';\r\nimport { tap } from 'rxjs/operators';\r\nimport {\r\n ProfileComparisonBackendService,\r\n FileConversionService,\r\n ImageCompressionService\r\n} from './services';\r\nimport {\r\n forkJoin,\r\n map,\r\n Observable,\r\n of,\r\n switchMap,\r\n catchError,\r\n Subscription,\r\n} from 'rxjs';\r\n\r\n/** Node type for the force-directed chip layout. */\r\ninterface ForceChipNode extends SimulationNodeDatum {\r\n id: string;\r\n label: string;\r\n group: 'p1' | 'shared' | 'p2';\r\n targetX?: number;\r\n targetY?: number;\r\n originalFx?: number;\r\n originalFy?: number;\r\n}\r\n\r\ninterface ForceChipLink extends SimulationLinkDatum<ForceChipNode> {\r\n kind: 'cross' | 'intra';\r\n strength: number;\r\n distance: number;\r\n similarity: number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-profile-comparison',\r\n templateUrl: './profile-comparison-lib.component.html',\r\n styleUrls: ['./profile-comparison-lib.component.scss'],\r\n standalone: false\r\n})\r\nexport class ProfileComparisonLibComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\r\n private static readonly DEFAULT_OBJECT_POSITION = '50% 50%';\r\n private static readonly DEFAULT_EYE_ALIGNMENT_BIAS_PX = 50;\r\n private static readonly DEFAULT_IMAGE_FORMAT = 'image/jpeg';\r\n private static readonly DEFAULT_IMAGE_QUALITY_START = 0.85;\r\n private static readonly DEFAULT_IMAGE_QUALITY_MIN = 0.5;\r\n private static readonly DEFAULT_IMAGE_QUALITY_STEP = 0.05;\r\n private static readonly DEFAULT_MAX_BYTES = 2 * 1024 * 1024;\r\n private static readonly DEFAULT_DOWNSCALE_STEP = 0.9;\r\n private static readonly DEFAULT_MIN_WIDTH = 400;\r\n private static readonly DEFAULT_MIN_HEIGHT = 400;\r\n private static readonly DEFAULT_MAX_WIDTH = 1600;\r\n private static readonly DEFAULT_MAX_HEIGHT = 1600;\r\n private static readonly SPACER_SMALL = '-';\r\n private static readonly SPACER_LARGE = '----';\r\n private static readonly CONSOLIDATION_SEPARATOR_X = '×';\r\n private static readonly CONSOLIDATION_SEPARATOR_SLASH = '/';\r\n private static readonly FACEPP_RATE_LIMIT_DELAY_MS = 5000;\r\n private static readonly DEFAULT_PROFILE_IMAGE_NAME = 'ProfilePg1.png';\r\n\r\n // Drag and shape constants\r\n private static readonly SHAPE_BG_HEIGHT = '350px';\r\n private static readonly SHAPE_BG_OBJECT_FIT = 'cover';\r\n private static readonly SHAPE_BG1_OBJECT_POSITION = 'right';\r\n private static readonly SHAPE_BG2_OBJECT_POSITION = 'left';\r\n private static readonly DRAG_MIN_WIDTH = 200;\r\n private static readonly DRAG_MAX_WIDTH = 400;\r\n private static readonly MAX_DRAG_DISTANCE = 100;\r\n private static readonly CENTER_MOVE_MULTIPLIER = 0.5;\r\n private static readonly TEXT_MOVE_MULTIPLIER = 0.3;\r\n private static readonly TRANSITION_WIDTH = 'width 0.3s ease';\r\n private static readonly TRANSITION_TRANSFORM = 'transform 0.3s ease';\r\n private static readonly TRANSFORM_RESET = 'translateX(0px)';\r\n private static readonly TRANSITION_RESET_DELAY_MS = 300;\r\n\r\n @Input() config: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n @Input() user1File: File | null = null;\r\n @Input() user2File: File | null = null;\r\n @Input() backendMode: BackendMode = BackendMode.Real;\r\n @Input() backendUrl: string | null = null;\r\n @Input() fadeAllEdges: boolean = true;\r\n @Input() person1Name: string = 'Josh';\r\n @Input() person2Name: string = 'Amy';\r\n @Input() imageProxyPath: string = '';\r\n @Output() matrixDataChange = new EventEmitter<IMatrixData>();\r\n @Output() rawLLMOutputChange = new EventEmitter<string>();\r\n @Output() viewProfileClick = new EventEmitter<{ side: 'left' | 'right' }>();\r\n\r\n selectedFile: File | null = null;\r\n\r\n firstImageData: FaceDetectionData | null = null;\r\n secondImageData: FaceDetectionData | null = null;\r\n\r\n user1Transform: string = '';\r\n user2Transform: string = '';\r\n user1Top: string = '0px';\r\n user1Height: string = '100%';\r\n user2Top: string = '0px';\r\n user2Height: string = '100%';\r\n alignmentCalculated: boolean = false;\r\n isAligning: boolean = false;\r\n /** Set when backend returns an error (e.g. 503 API keys not configured). */\r\n backendError: string | null = null;\r\n\r\n user1ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n user2ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n\r\n private user1NaturalWidth = 0;\r\n private user1NaturalHeight = 0;\r\n private user2NaturalWidth = 0;\r\n private user2NaturalHeight = 0;\r\n\r\n private user1FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n private user2FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n\r\n private eyeAlignmentBiasPx: number = ProfileComparisonLibComponent.DEFAULT_EYE_ALIGNMENT_BIAS_PX;\r\n\r\n firstPersonInterests: string[] = [];\r\n secondPersonInterests: string[] = [];\r\n thirdPersonInterests: string[] = [];\r\n centerItem: string[] = [];\r\n\r\n person1Interests: string[] = [];\r\n person2Interests: string[] = [];\r\n person3Interests: string[] = [];\r\n user1Image: string = '';\r\n user2Image: string = '';\r\n\r\n get user1ImageSrc(): string {\r\n if (this.imageProxyPath && this.user1Image && this.user1Image.startsWith('http')) {\r\n try {\r\n const urlObj = new URL(this.user1Image);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n return `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n return this.user1Image;\r\n }\r\n }\r\n return this.user1Image;\r\n }\r\n\r\n get user2ImageSrc(): string {\r\n if (this.imageProxyPath && this.user2Image && this.user2Image.startsWith('http')) {\r\n try {\r\n const urlObj = new URL(this.user2Image);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n return `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n return this.user2Image;\r\n }\r\n }\r\n return this.user2Image;\r\n }\r\n\r\n private baseConfig: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n\r\n displayPerson1Interests: string[] = [];\r\n displayPerson2Interests: string[] = [];\r\n\r\n alignedPerson1Interests: string[] = [];\r\n alignedPerson2Interests: string[] = [];\r\n\r\n leftProfileClicked = false;\r\n rightProfileClicked = false;\r\n\r\n sortedA: { item: string; score: number }[] = [];\r\n sortedB: { item: string; score: number }[] = [];\r\n sortedC: { item: string; score: number }[] = [];\r\n\r\n similarity: number = 0;\r\n similarityMatrixCsv: string = '';\r\n matrixData: IMatrixData | null = null;\r\n\r\n // ── Force-directed chip layout ──────────────────────────────────────────\r\n private static readonly SPRING_THRESHOLD = 0.32;\r\n private static readonly CROSS_LINK_MIN_SIMILARITY = 0.5;\r\n private static readonly INTRA_GROUP_THRESHOLD = 0.5;\r\n private static readonly SHARED_PROMOTION_THRESHOLD = 0.75;\r\n private static readonly MAX_CROSS_LINKS_PER_NODE = 4;\r\n private static readonly MIN_CROSS_LINKS_PER_NODE = 0;\r\n private static readonly MAX_INTRA_LINKS_PER_NODE = 2;\r\n private static readonly MAX_RELEVANT_INTERESTS_PER_SIDE = 6;\r\n private static readonly CHIP_RADIUS = 18; // half chip height for collision\r\n private static readonly CHIP_COLLISION_BORDER_PADDING = 6;\r\n private static readonly MAX_LINK_DISTANCE = 120;\r\n private static readonly CANVAS_PADDING = 40; // px below lowest node\r\n\r\n forceNodes: ForceChipNode[] = [];\r\n forceLinks: ForceChipLink[] = [];\r\n forceCanvasHeight: number = 300;\r\n chipFontSizePx = 14;\r\n chipPaddingXPx = 18;\r\n chipPaddingYPx = 6;\r\n chipLineHeight = 1.4;\r\n\r\n hoveredNode: ForceChipNode | null = null;\r\n clickedNode: ForceChipNode | null = null;\r\n draggedNode: ForceChipNode | null = null;\r\n isDragging = false;\r\n private simulation: any;\r\n private layoutRebuildRaf: number | null = null;\r\n private nodeDragBounds = new Map<string, { minX: number; maxX: number; minY: number; maxY: number }>();\r\n\r\n get activeNode(): ForceChipNode | null {\r\n return this.hoveredNode || this.clickedNode;\r\n }\r\n\r\n /** When false, backend URL is not provided — show \"Configure backend\". */\r\n backendConfigured: boolean = false;\r\n /** The resolved backend URL computed from inputs and legacy token. */\r\n private resolvedBackendUrl: string | null = null;\r\n\r\n compressionConfig: IImageCompressionConfig = {\r\n maxWidth: ProfileComparisonLibComponent.DEFAULT_MAX_WIDTH,\r\n maxHeight: ProfileComparisonLibComponent.DEFAULT_MAX_HEIGHT,\r\n format: ProfileComparisonLibComponent.DEFAULT_IMAGE_FORMAT,\r\n qualityStart: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_START,\r\n qualityMin: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_MIN,\r\n qualityStep: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_STEP,\r\n maxBytes: ProfileComparisonLibComponent.DEFAULT_MAX_BYTES,\r\n downscaleStep: ProfileComparisonLibComponent.DEFAULT_DOWNSCALE_STEP,\r\n minWidth: ProfileComparisonLibComponent.DEFAULT_MIN_WIDTH,\r\n minHeight: ProfileComparisonLibComponent.DEFAULT_MIN_HEIGHT,\r\n };\r\n\r\n private computeSub?: Subscription;\r\n /** Incremented on each fetchComparison(); used to ignore stale success/error from an older request. */\r\n private fetchRequestId = 0;\r\n\r\n @ViewChild('leftContainer') leftContainer!: ElementRef;\r\n @ViewChild('rightContainer') rightContainer!: ElementRef;\r\n @ViewChild('profileFlex') profileFlex!: ElementRef<HTMLElement>;\r\n @ViewChild('profileImgLeft') profileImgLeft!: ElementRef<HTMLElement>;\r\n @ViewChild('profileImgRight') profileImgRight!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeContainer') shapeContainer!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeBg') shapeBg!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeBg1') shapeBg1!: ElementRef<SVGElement>;\r\n @ViewChild('shapeBg2') shapeBg2!: ElementRef<SVGElement>;\r\n @ViewChild('shapeTextLeft') shapeTextLeft!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeTextRight') shapeTextRight!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeTextCenter') shapeTextCenter!: ElementRef<HTMLElement>;\r\n @ViewChild('chipsGrid') chipsGrid!: ElementRef<HTMLElement>;\r\n\r\n constructor(\r\n private backendService: ProfileComparisonBackendService,\r\n private renderer: Renderer2,\r\n private fileConversionService: FileConversionService,\r\n private imageCompressionService: ImageCompressionService,\r\n private cdr: ChangeDetectorRef,\r\n private ngZone: NgZone,\r\n private hostRef: ElementRef<HTMLElement>,\r\n @Optional() @Inject(PROFILE_COMPARISON_VERBOSE_LOGGING) private getVerboseLogging?: () => boolean\r\n ) {}\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.getVerboseLogging?.() === true) {\r\n console.log('[ProfileComparisonLib]', ...args);\r\n }\r\n }\r\n\r\n anchorSide: 'left' | 'right' = 'left';\r\n\r\n rawLLMOutput: string = '';\r\n\r\n ngOnInit(): void {\r\n if (this.getVerboseLogging?.()) console.log('[ProfileComparisonLib] verbose logging ON');\r\n this.log('ngOnInit', 'config received', {\r\n person1Len: this.config?.person1Interests?.length,\r\n person2Len: this.config?.person2Interests?.length,\r\n hasUser1Image: !!this.config?.user1Image?.length,\r\n hasUser2Image: !!this.config?.user2Image?.length,\r\n });\r\n this.baseConfig = JSON.parse(JSON.stringify(this.config));\r\n this.updateConfigProperties();\r\n this.resolvedBackendUrl = resolveBackendUrl(\r\n this.backendUrl,\r\n this.backendMode,\r\n this.backendService.getLegacyTokenUrl(),\r\n );\r\n this.backendConfigured = !!this.resolvedBackendUrl;\r\n this.log('ngOnInit', 'backendConfigured', this.backendConfigured, 'resolvedUrl', this.resolvedBackendUrl ?? '(null)');\r\n if (!this.backendConfigured) {\r\n this.log('ngOnInit', 'exiting early: backend not configured');\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = false;\r\n return;\r\n }\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = false;\r\n this.isAligning = true;\r\n this.cdr.detectChanges();\r\n this.log('ngOnInit', 'starting compressInputImages then fetchComparison');\r\n this.compressInputImages().subscribe({\r\n next: () => {\r\n this.log('ngOnInit', 'compressInputImages done, calling fetchComparison');\r\n this.isAligning = false;\r\n this.fetchComparison();\r\n },\r\n error: (e) => {\r\n console.warn('Config image compression failed, continuing:', e);\r\n this.log('ngOnInit', 'compressInputImages error, calling fetchComparison anyway');\r\n this.isAligning = false;\r\n this.fetchComparison();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.simulation) {\r\n this.simulation.stop();\r\n }\r\n if (this.layoutRebuildRaf !== null) {\r\n cancelAnimationFrame(this.layoutRebuildRaf);\r\n this.layoutRebuildRaf = null;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.waitForImagesAndInitDrag();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['backendMode'] || changes['backendUrl']) {\r\n this.resolvedBackendUrl = resolveBackendUrl(\r\n this.backendUrl,\r\n this.backendMode,\r\n this.backendService.getLegacyTokenUrl(),\r\n );\r\n this.backendConfigured = !!this.resolvedBackendUrl;\r\n this.log('ngOnChanges', 'backend inputs changed', 'resolvedUrl', this.resolvedBackendUrl ?? '(null)');\r\n }\r\n\r\n if (changes['config']) {\r\n const first = changes['config'].firstChange;\r\n this.log('ngOnChanges', 'config changed', 'firstChange', first, 'backendConfigured', this.backendConfigured);\r\n this.updateConfigProperties();\r\n if (!this.backendConfigured) {\r\n this.log('ngOnChanges', 'skipping fetch: backend not configured');\r\n return;\r\n }\r\n if (!first) {\r\n this.log('ngOnChanges', 'running compressInputImages then fetchComparison');\r\n this.compressInputImages().subscribe({\r\n next: () => {\r\n this.log('ngOnChanges', 'compress done, calling fetchComparison');\r\n this.fetchComparison();\r\n },\r\n error: (e) => {\r\n console.warn('Config image compression failed, continuing:', e);\r\n this.log('ngOnChanges', 'compress error, calling fetchComparison anyway');\r\n this.fetchComparison();\r\n }\r\n });\r\n } else {\r\n this.log('ngOnChanges', 'skipping fetch: firstChange (ngOnInit will run)');\r\n }\r\n }\r\n }\r\n\r\n /** Use for template: hide left/right item when it's a shared (center) item. Compares case-insensitively. */\r\n isInCenter(interest: string): boolean {\r\n if (!interest || !this.centerItem?.length) return false;\r\n const n = String(interest).trim().toLowerCase();\r\n return this.centerItem.some((c) => String(c).trim().toLowerCase() === n);\r\n }\r\n\r\n private fetchComparison(): void {\r\n this.log('fetchComparison', 'start');\r\n if (this.isAligning) {\r\n this.log('fetchComparison', 'skipped: already aligning (single-flight)');\r\n return;\r\n }\r\n if (this.computeSub) {\r\n this.computeSub.unsubscribe();\r\n this.computeSub = undefined;\r\n }\r\n const requestId = ++this.fetchRequestId;\r\n this.isAligning = true;\r\n this.backendError = null;\r\n this.cdr.detectChanges();\r\n const normalized = this.buildConfigWithDefaults(this.config, this.baseConfig);\r\n const configToSend = {\r\n person1Interests: normalized.person1Interests,\r\n person2Interests: normalized.person2Interests,\r\n person3Interests: normalized.person3Interests,\r\n user1Image: this.user1Image,\r\n user2Image: this.user2Image,\r\n };\r\n this.log('fetchComparison', 'calling backend getComparison', {\r\n person1Len: configToSend.person1Interests.length,\r\n person2Len: configToSend.person2Interests.length,\r\n user1ImageLen: (configToSend.user1Image || '').length,\r\n user2ImageLen: (configToSend.user2Image || '').length,\r\n });\r\n this.computeSub = this.backendService.getComparison(configToSend, this.resolvedBackendUrl).subscribe({\r\n next: (payload) => {\r\n if (requestId !== this.fetchRequestId) {\r\n this.log('fetchComparison', 'ignoring stale success', { requestId, current: this.fetchRequestId });\r\n return;\r\n }\r\n this.log('fetchComparison', 'backend response received', { aligned1: payload?.alignedPerson1Interests?.length, aligned2: payload?.alignedPerson2Interests?.length });\r\n this.isAligning = false;\r\n this.backendError = null;\r\n this.matrixData = payload.matrixData ?? null;\r\n if (this.matrixData) this.matrixDataChange.emit(this.matrixData);\r\n\r\n const a1 = payload.alignedPerson1Interests ?? [];\r\n const a2 = payload.alignedPerson2Interests ?? [];\r\n const sameLists = a1.length === a2.length && a1.every((v, i) => String(v).trim().toLowerCase() === String(a2[i]).trim().toLowerCase());\r\n if (sameLists && a1.length > 0) {\r\n this.log('fetchComparison', 'backend returned identical aligned lists; using raw lists to keep sides distinct', { len: a1.length });\r\n this.alignedPerson1Interests = [];\r\n this.alignedPerson2Interests = [];\r\n this.displayPerson1Interests = this.person1Interests;\r\n this.displayPerson2Interests = this.person2Interests;\r\n this.centerItem = this.filterCenterItemsByThreshold(\r\n payload.centerItem ?? [],\r\n this.person1Interests ?? [],\r\n this.person2Interests ?? []\r\n );\r\n } else {\r\n const rawCenter = payload.centerItem ?? [];\r\n const list1ToUse = this.person1Interests?.length ? this.person1Interests : a1;\r\n const list2ToUse = this.person2Interests?.length ? this.person2Interests : a2;\r\n const filteredCenter = this.filterCenterItemsByThreshold(rawCenter, list1ToUse, list2ToUse);\r\n const reordered = this.reorderInterestsByMatrix(list1ToUse, list2ToUse, filteredCenter);\r\n\r\n this.alignedPerson1Interests = reordered.p1;\r\n this.alignedPerson2Interests = reordered.p2;\r\n this.displayPerson1Interests = reordered.p1;\r\n this.displayPerson2Interests = reordered.p2;\r\n this.centerItem = reordered.center;\r\n }\r\n if (payload.rawLLMOutput != null) {\r\n this.rawLLMOutput = payload.rawLLMOutput;\r\n this.rawLLMOutputChange.emit(payload.rawLLMOutput);\r\n }\r\n this.firstImageData = payload.face1 ?? null;\r\n this.secondImageData = payload.face2 ?? null;\r\n const faces1 = (this.firstImageData && typeof this.firstImageData === 'object' && 'faces' in this.firstImageData && Array.isArray(this.firstImageData.faces)) ? this.firstImageData.faces : [];\r\n const faces2 = (this.secondImageData && typeof this.secondImageData === 'object' && 'faces' in this.secondImageData && Array.isArray(this.secondImageData.faces)) ? this.secondImageData.faces : [];\r\n this.user1FaceRaw = faces1.length ? faces1[0] : null;\r\n this.user2FaceRaw = faces2.length ? faces2[0] : null;\r\n if (this.user1NaturalWidth && this.user1NaturalHeight) this.updateObjectPositionForFace(1);\r\n if (this.user2NaturalWidth && this.user2NaturalHeight) this.updateObjectPositionForFace(2);\r\n if (this.firstImageData && this.secondImageData) this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n this.buildForceGraph();\r\n this.cdr.detectChanges();\r\n },\r\n error: (err) => {\r\n if (requestId !== this.fetchRequestId) {\r\n this.log('fetchComparison', 'ignoring stale error', { requestId, current: this.fetchRequestId, status: err?.status });\r\n return;\r\n }\r\n this.log('fetchComparison', 'backend error', err);\r\n const msg = err?.error?.message ?? err?.message ?? err?.statusText ?? (typeof err?.error === 'string' ? err.error : null) ?? 'Request failed';\r\n this.backendError = msg;\r\n console.error('[ProfileComparisonLib] fetchComparison error', err?.status ?? '', msg);\r\n this.isAligning = false;\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n private updateConfigProperties(): void {\r\n const normalized = this.buildConfigWithDefaults(\r\n this.config,\r\n this.baseConfig\r\n );\r\n this.config = normalized;\r\n\r\n this.person1Interests = [...normalized.person1Interests];\r\n this.person2Interests = [...normalized.person2Interests];\r\n this.user1Image = normalized.user1Image;\r\n this.user2Image = normalized.user2Image;\r\n if (normalized.person1Name) this.person1Name = normalized.person1Name;\r\n if (normalized.person2Name) this.person2Name = normalized.person2Name;\r\n }\r\n\r\n private buildConfigWithDefaults(\r\n cfg: Partial<IProfileConfig> | undefined,\r\n base: IProfileConfig\r\n ): IProfileConfig {\r\n const list = (val: unknown, fb: string[]): string[] => {\r\n if (Array.isArray(val)) {\r\n const cleaned = val\r\n .filter((s) => typeof s === 'string')\r\n .map((s: string) => s.trim())\r\n .filter((s: string) => s.length > 0 && s !== ProfileComparisonLibComponent.SPACER_SMALL);\r\n if (cleaned.length > 0) return cleaned;\r\n }\r\n return [...fb];\r\n };\r\n\r\n const str = (val: unknown, fb: string): string => {\r\n return typeof val === 'string' && val.trim().length > 0 ? val : fb;\r\n };\r\n\r\n const safe = cfg || ({} as Partial<IProfileConfig>);\r\n return {\r\n person1Name: safe.person1Name ? str(safe.person1Name, '') : undefined,\r\n person2Name: safe.person2Name ? str(safe.person2Name, '') : undefined,\r\n person1Interests: list(safe.person1Interests, base.person1Interests),\r\n person2Interests: list(safe.person2Interests, base.person2Interests),\r\n person3Interests: list(safe.person3Interests, base.person3Interests),\r\n user1Image: str(safe.user1Image, base.user1Image),\r\n user2Image: str(safe.user2Image, base.user2Image),\r\n } as IProfileConfig;\r\n }\r\n\r\n onUserImageLoad(which: 1 | 2, event: Event): void {\r\n const img = event?.target as HTMLImageElement | null;\r\n if (!img) return;\r\n if (which === 1) {\r\n this.user1NaturalWidth = img.naturalWidth || 0;\r\n this.user1NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(1);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n } else {\r\n this.user2NaturalWidth = img.naturalWidth || 0;\r\n this.user2NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(2);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n }\r\n }\r\n\r\n private updateObjectPositionForFace(which: 1 | 2): void {\r\n const face = which === 1 ? this.user1FaceRaw : this.user2FaceRaw;\r\n const natW = which === 1 ? this.user1NaturalWidth : this.user2NaturalWidth;\r\n const natH = which === 1 ? this.user1NaturalHeight : this.user2NaturalHeight;\r\n\r\n if (!face || !natW || !natH) {\r\n if (which === 1) this.user1ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n else this.user2ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n return;\r\n }\r\n\r\n const eyes = this.getEyeCoordinatesFromFace(face);\r\n const nose = this.getNoseCoordinateFromFace(face);\r\n const minX = Math.min(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const maxX = Math.max(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const roiCenterX = (minX + maxX) / 2;\r\n\r\n const { width: cw, height: ch } = this.getProfileContainerSize(which);\r\n if (!cw || !ch) {\r\n const clamped = Math.max(0, Math.min(natW, roiCenterX));\r\n let xPercentFallback = Math.round((clamped / natW) * 10000) / 100;\r\n const faceCenterX_fb = face.x + face.width / 2;\r\n const ratio_fb = faceCenterX_fb / natW;\r\n if (ratio_fb > 0.6) {\r\n const over = Math.min(0.4, ratio_fb - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n xPercentFallback = Math.max(0, Math.min(100, xPercentFallback + shiftPct));\r\n }\r\n const posFallback = `${xPercentFallback}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = posFallback;\r\n else this.user2ObjectPosition = posFallback;\r\n return;\r\n }\r\n\r\n const scale = Math.max(cw / natW, ch / natH);\r\n const viewW = cw / scale;\r\n\r\n const paddingCssPx = 12;\r\n const overlapCssPx = this.getOverlapSizeCssPx();\r\n const fadeSafetyCssPx = 8;\r\n const fadeCssPx = overlapCssPx + paddingCssPx + fadeSafetyCssPx;\r\n const fadeInImgPx = fadeCssPx / scale;\r\n const edgeInImgPx = paddingCssPx / scale;\r\n\r\n let anchorX = roiCenterX;\r\n\r\n if (which === 1) {\r\n const minAnchorForRightEye = maxX - viewW / 2 + fadeInImgPx;\r\n const maxAnchorForLeftEye = minX + viewW / 2 - edgeInImgPx;\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n }\r\n } else {\r\n const maxAnchorForLeftEye = minX + viewW / 2 - fadeInImgPx;\r\n const minAnchorForRightEye = maxX - viewW / 2 + edgeInImgPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n }\r\n }\r\n\r\n const minAnchor = viewW / 2;\r\n const maxAnchor = natW - viewW / 2;\r\n anchorX = Math.max(minAnchor, Math.min(maxAnchor, anchorX));\r\n\r\n const viewLeft = anchorX - viewW / 2;\r\n const viewRight = anchorX + viewW / 2;\r\n const currentOverlap = this.getOverlapSizeCssPx();\r\n let desiredOverlap = currentOverlap;\r\n if (which === 1) {\r\n const distanceRightImg = Math.max(0, viewRight - maxX);\r\n const allowedCss = Math.max(10, distanceRightImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n } else {\r\n const distanceLeftImg = Math.max(0, minX - viewLeft);\r\n const allowedCss = Math.max(10, distanceLeftImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n }\r\n if (desiredOverlap < currentOverlap - 0.5) {\r\n this.setOverlapSizeCssPx(desiredOverlap);\r\n }\r\n\r\n const xPercent = Math.round((anchorX / natW) * 10000) / 100;\r\n const pos = `${xPercent}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = pos;\r\n else this.user2ObjectPosition = pos;\r\n }\r\n\r\n private getProfileContainerSize(which: 1 | 2): { width: number; height: number } {\r\n try {\r\n const el = (which === 1 ? this.profileImgLeft : this.profileImgRight)?.nativeElement || null;\r\n if (!el) return { width: 0, height: 0 };\r\n const rect = el.getBoundingClientRect();\r\n return { width: Math.round(rect.width), height: Math.round(rect.height) };\r\n } catch {\r\n return { width: 0, height: 0 };\r\n }\r\n }\r\n\r\n private getOverlapSizeCssPx(): number {\r\n try {\r\n const root = this.profileFlex?.nativeElement || null;\r\n const fallback = 40;\r\n if (!root) return fallback;\r\n const val = getComputedStyle(root).getPropertyValue('--overlap-size').trim();\r\n const parsed = parseFloat(val);\r\n return isNaN(parsed) ? fallback : parsed;\r\n } catch {\r\n return 40;\r\n }\r\n }\r\n\r\n private setOverlapSizeCssPx(px: number): void {\r\n try {\r\n const root = this.profileFlex?.nativeElement || null;\r\n if (!root) return;\r\n const clamped = Math.max(8, Math.min(80, Math.round(px)));\r\n root.style.setProperty('--overlap-size', `${clamped}px`);\r\n } catch {}\r\n }\r\n\r\n waitForImagesAndInitDrag(): void {\r\n const shapeBg1 = this.shapeBg1?.nativeElement as SVGElement | null;\r\n const shapeBg2 = this.shapeBg2?.nativeElement as SVGElement | null;\r\n\r\n if (!shapeBg1 || !shapeBg2) {\r\n return;\r\n }\r\n\r\n const checkImagesLoaded = () => {\r\n // For SVG elements, check if they're rendered instead of naturalWidth\r\n const img1Loaded = shapeBg1 && shapeBg1.getBoundingClientRect().width > 0;\r\n const img2Loaded = shapeBg2 && shapeBg2.getBoundingClientRect().width > 0;\r\n\r\n if (img1Loaded && img2Loaded) {\r\n setTimeout(() => this.initDrag(), 50);\r\n } else {\r\n setTimeout(checkImagesLoaded, 100);\r\n }\r\n };\r\n\r\n checkImagesLoaded();\r\n }\r\n\r\n initDrag() {\r\n const shapeBg1 = this.shapeBg1?.nativeElement as SVGElement | null;\r\n const shapeBg2 = this.shapeBg2?.nativeElement as SVGElement | null;\r\n const shapeTextLeft = this.shapeTextLeft?.nativeElement || null;\r\n const shapeTextRight = this.shapeTextRight?.nativeElement || null;\r\n if (!shapeBg1 || !shapeBg2 || !shapeTextLeft || !shapeTextRight) return;\r\n\r\n // Cast to HTMLElement to access style properties conveniently, as SVGElement style handling can be similar in this context\r\n const shapeBg1El = shapeBg1 as unknown as HTMLElement;\r\n const shapeBg2El = shapeBg2 as unknown as HTMLElement;\r\n\r\n shapeBg1El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n // shapeBg1El.style.objectFit = ProfileComparisonLibComponent.SHAPE_BG_OBJECT_FIT;\r\n // shapeBg1El.style.objectPosition = ProfileComparisonLibComponent.SHAPE_BG1_OBJECT_POSITION;\r\n shapeBg2El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n // shapeBg2El.style.objectFit = ProfileComparisonLibComponent.SHAPE_BG_OBJECT_FIT;\r\n // shapeBg2El.style.objectPosition = ProfileComparisonLibComponent.SHAPE_BG2_OBJECT_POSITION;\r\n\r\n const originalWidth1 = shapeBg1.getBoundingClientRect().width;\r\n const originalWidth2 = shapeBg2.getBoundingClientRect().width;\r\n\r\n const minWidth = ProfileComparisonLibComponent.DRAG_MIN_WIDTH;\r\n const maxWidth = ProfileComparisonLibComponent.DRAG_MAX_WIDTH;\r\n\r\n let isDragging = false;\r\n let dragStartX = 0;\r\n let initialWidth1 = 0;\r\n let initialWidth2 = 0;\r\n let activeImg: SVGElement | null = null;\r\n\r\n // Use ViewChild for center text\r\n const shapeTextCenter = this.shapeTextCenter?.nativeElement || null;\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (!isDragging || !activeImg) return;\r\n\r\n const deltaX = e.clientX - dragStartX;\r\n const containerWidth = this.shapeContainer?.nativeElement?.clientWidth || 0;\r\n\r\n let newWidth1 = initialWidth1;\r\n let newWidth2 = initialWidth2;\r\n\r\n if (activeImg === shapeBg1) {\r\n newWidth1 = initialWidth1 + deltaX;\r\n newWidth2 = initialWidth2 - deltaX;\r\n } else if (activeImg === shapeBg2) {\r\n newWidth1 = initialWidth1 - deltaX;\r\n newWidth2 = initialWidth2 + deltaX;\r\n }\r\n\r\n newWidth1 = Math.max(minWidth, Math.min(maxWidth, newWidth1));\r\n newWidth2 = Math.max(minWidth, Math.min(maxWidth, newWidth2));\r\n\r\n shapeBg1El.style.width = newWidth1 + 'px';\r\n shapeBg1El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n shapeBg2El.style.width = newWidth2 + 'px';\r\n shapeBg2El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n\r\n const widthChange1 = newWidth1 - originalWidth1;\r\n const widthChange2 = newWidth2 - originalWidth2;\r\n\r\n const dragDirection = deltaX > 0 ? 1 : -1;\r\n const dragDistance = Math.abs(deltaX);\r\n const maxDragDistance = ProfileComparisonLibComponent.MAX_DRAG_DISTANCE;\r\n const centerMoveDistance = Math.min(dragDistance, maxDragDistance) * dragDirection * ProfileComparisonLibComponent.CENTER_MOVE_MULTIPLIER;\r\n\r\n shapeTextLeft.style.transform = `translateX(${widthChange1 * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n shapeTextRight.style.transform = `translateX(${-widthChange2 * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transform = `translateX(${centerMoveDistance * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n }\r\n };\r\n\r\n const resetWidths = () => {\r\n isDragging = false;\r\n activeImg = null;\r\n\r\n shapeBg1El.style.transition = ProfileComparisonLibComponent.TRANSITION_WIDTH;\r\n shapeBg2El.style.transition = ProfileComparisonLibComponent.TRANSITION_WIDTH;\r\n shapeTextLeft.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n shapeTextRight.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n }\r\n\r\n shapeBg1El.style.width = originalWidth1 + 'px';\r\n shapeBg2El.style.width = originalWidth2 + 'px';\r\n\r\n shapeTextLeft.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n shapeTextRight.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n }\r\n\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', resetWidths);\r\n document.removeEventListener('mouseleave', resetWidths);\r\n\r\n setTimeout(() => {\r\n shapeBg1El.style.transition = '';\r\n shapeBg2El.style.transition = '';\r\n shapeTextLeft.style.transition = '';\r\n shapeTextRight.style.transition = '';\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transition = '';\r\n }\r\n }, ProfileComparisonLibComponent.TRANSITION_RESET_DELAY_MS);\r\n };\r\n\r\n [shapeBg1, shapeBg2].forEach((img) => {\r\n img.addEventListener('mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n isDragging = true;\r\n activeImg = img;\r\n dragStartX = e.clientX;\r\n initialWidth1 = shapeBg1.getBoundingClientRect().width;\r\n initialWidth2 = shapeBg2.getBoundingClientRect().width;\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', resetWidths);\r\n document.addEventListener('mouseleave', resetWidths);\r\n });\r\n });\r\n }\r\n\r\n private normalizeSimilarityToken(value: string): string {\r\n return String(value ?? '')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '');\r\n }\r\n\r\n private findLegendEntry(label: string): { abbr: string; full: string } | undefined {\r\n const legend = this.matrixData?.legend ?? [];\r\n if (!legend.length) return undefined;\r\n\r\n const exact = String(label).trim().toLowerCase();\r\n const exactMatch = legend.find(l => String(l.full).trim().toLowerCase() === exact);\r\n if (exactMatch) return exactMatch;\r\n\r\n const normalized = this.normalizeSimilarityToken(label);\r\n if (!normalized) return undefined;\r\n\r\n return legend.find(l => {\r\n const full = this.normalizeSimilarityToken(l.full);\r\n const abbr = this.normalizeSimilarityToken(l.abbr);\r\n return full === normalized || abbr === normalized;\r\n });\r\n }\r\n\r\n private lookupSimilarity(rowAbbr: string, colAbbr: string): number | null {\r\n if (!this.matrixData) return null;\r\n const colIdx = this.matrixData.headers?.indexOf(colAbbr);\r\n if (colIdx === -1 || colIdx === undefined) return null;\r\n const row = this.matrixData.rows?.find(r => r.label === rowAbbr);\r\n if (!row || !row.values || colIdx >= row.values.length) return null;\r\n const val = parseFloat(row.values[colIdx]);\r\n return isNaN(val) ? null : val;\r\n }\r\n\r\n private getSimilarity(item1: string, item2: string): number {\r\n if (!this.matrixData || !item1 || !item2) return 0;\r\n const n1 = this.normalizeSimilarityToken(item1);\r\n const n2 = this.normalizeSimilarityToken(item2);\r\n if (!n1 || !n2) return 0;\r\n if (n1 === n2) return 1.0;\r\n\r\n const leg1 = this.findLegendEntry(item1);\r\n const leg2 = this.findLegendEntry(item2);\r\n if (!leg1 || !leg2) return 0;\r\n\r\n const direct = this.lookupSimilarity(leg1.abbr, leg2.abbr);\r\n if (direct != null) return direct;\r\n\r\n const reverse = this.lookupSimilarity(leg2.abbr, leg1.abbr);\r\n if (reverse != null) return reverse;\r\n\r\n return 0;\r\n }\r\n\r\n // ── Force-directed chip layout ──────────────────────────────────────────\r\n\r\n private orderBySemanticBarycenter(sourceItems: string[], targetItems: string[]): string[] {\r\n const source = [...sourceItems];\r\n if (source.length <= 1 || targetItems.length === 0) return source;\r\n\r\n const ranked = source.map((label, index) => {\r\n let weightedTargetIndex = 0;\r\n let totalWeight = 0;\r\n for (let i = 0; i < targetItems.length; i++) {\r\n const sim = Math.max(0, this.getSimilarity(label, targetItems[i]));\r\n if (sim <= 0) continue;\r\n weightedTargetIndex += i * sim;\r\n totalWeight += sim;\r\n }\r\n return {\r\n label,\r\n index,\r\n barycenter: totalWeight > 0 ? weightedTargetIndex / totalWeight : index,\r\n totalWeight,\r\n };\r\n });\r\n\r\n ranked.sort((a, b) =>\r\n (a.barycenter - b.barycenter) ||\r\n (b.totalWeight - a.totalWeight) ||\r\n (a.index - b.index)\r\n );\r\n\r\n return ranked.map(item => item.label);\r\n }\r\n\r\n private orderSharedBySemanticPull(sharedItems: string[], p1Items: string[], p2Items: string[]): string[] {\r\n const shared = [...sharedItems];\r\n if (shared.length <= 1) return shared;\r\n\r\n const context = [...p1Items, ...p2Items];\r\n if (context.length === 0) return shared;\r\n\r\n const ranked = shared.map((label, index) => {\r\n let weightedIndex = 0;\r\n let totalWeight = 0;\r\n let strongest = 0;\r\n for (let i = 0; i < context.length; i++) {\r\n const sim = Math.max(0, this.getSimilarity(label, context[i]));\r\n if (sim <= 0) continue;\r\n weightedIndex += i * sim;\r\n totalWeight += sim;\r\n strongest = Math.max(strongest, sim);\r\n }\r\n return {\r\n label,\r\n index,\r\n barycenter: totalWeight > 0 ? weightedIndex / totalWeight : index,\r\n strongest,\r\n };\r\n });\r\n\r\n ranked.sort((a, b) =>\r\n (b.strongest - a.strongest) ||\r\n (a.barycenter - b.barycenter) ||\r\n (a.index - b.index)\r\n );\r\n\r\n return ranked.map(item => item.label);\r\n }\r\n\r\n private canLinkNodes(a: ForceChipNode, b: ForceChipNode): boolean {\r\n if (a.group === 'shared' && b.group === 'shared') return true;\r\n if (a.group === b.group) return false;\r\n if (a.group === 'shared' || b.group === 'shared') return true;\r\n return (a.group === 'p1' && b.group === 'p2') || (a.group === 'p2' && b.group === 'p1');\r\n }\r\n\r\n private getLinkNodeId(ref: ForceChipNode | string | number): string {\r\n return typeof ref === 'object' ? ref.id : String(ref);\r\n }\r\n\r\n private getLinkPairKey(a: ForceChipNode | string | number, b: ForceChipNode | string | number): string {\r\n const idA = this.getLinkNodeId(a);\r\n const idB = this.getLinkNodeId(b);\r\n return idA < idB ? `${idA}|${idB}` : `${idB}|${idA}`;\r\n }\r\n\r\n private getRuntimeLinkStrength(link: Pick<ForceChipLink, 'kind' | 'strength'>): number {\r\n return link.kind === 'cross'\r\n ? link.strength * 1.7\r\n : link.strength * 1.12;\r\n }\r\n\r\n private selectLinksWithCaps(candidates: ForceChipLink[], maxPerNode: number, minPerNode = 0): ForceChipLink[] {\r\n if (!candidates.length || maxPerNode <= 0) return [];\r\n\r\n const sorted = [...candidates].sort((a, b) =>\r\n (b.similarity - a.similarity) ||\r\n (b.strength - a.strength)\r\n );\r\n\r\n const counts = new Map<string, number>();\r\n const selected: ForceChipLink[] = [];\r\n const selectedKeys = new Set<string>();\r\n\r\n const getCount = (id: string): number => counts.get(id) ?? 0;\r\n const increment = (id: string): void => {\r\n counts.set(id, getCount(id) + 1);\r\n };\r\n const canAdd = (link: ForceChipLink): boolean => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n if (getCount(sourceId) >= maxPerNode) return false;\r\n if (getCount(targetId) >= maxPerNode) return false;\r\n return true;\r\n };\r\n const add = (link: ForceChipLink): boolean => {\r\n const key = this.getLinkPairKey(link.source as ForceChipNode | string | number, link.target as ForceChipNode | string | number);\r\n if (selectedKeys.has(key) || !canAdd(link)) return false;\r\n\r\n selectedKeys.add(key);\r\n selected.push(link);\r\n\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n increment(sourceId);\r\n increment(targetId);\r\n return true;\r\n };\r\n\r\n const nodeIds = new Set<string>();\r\n const perNodeCandidates = new Map<string, ForceChipLink[]>();\r\n sorted.forEach(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n nodeIds.add(sourceId);\r\n nodeIds.add(targetId);\r\n\r\n const sourceBucket = perNodeCandidates.get(sourceId) ?? [];\r\n sourceBucket.push(link);\r\n perNodeCandidates.set(sourceId, sourceBucket);\r\n\r\n const targetBucket = perNodeCandidates.get(targetId) ?? [];\r\n targetBucket.push(link);\r\n perNodeCandidates.set(targetId, targetBucket);\r\n });\r\n\r\n // Phase 1: satisfy minimum significant relationships before dense global fill.\r\n if (minPerNode > 0) {\r\n let progressed = true;\r\n while (progressed) {\r\n progressed = false;\r\n nodeIds.forEach(nodeId => {\r\n while (getCount(nodeId) < minPerNode) {\r\n const next = (perNodeCandidates.get(nodeId) ?? []).find(link => {\r\n const key = this.getLinkPairKey(\r\n link.source as ForceChipNode | string | number,\r\n link.target as ForceChipNode | string | number\r\n );\r\n return !selectedKeys.has(key) && canAdd(link);\r\n });\r\n if (!next) break;\r\n if (!add(next)) break;\r\n progressed = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Phase 2: fill remaining slots globally by strongest links.\r\n sorted.forEach(link => {\r\n add(link);\r\n });\r\n\r\n if (minPerNode > 0) {\r\n // Best-effort soft fallback for low-degree nodes if they were blocked by caps.\r\n nodeIds.forEach(nodeId => {\r\n if (getCount(nodeId) >= minPerNode) return;\r\n (perNodeCandidates.get(nodeId) ?? []).forEach(link => {\r\n if (getCount(nodeId) >= minPerNode) return;\r\n const key = this.getLinkPairKey(\r\n link.source as ForceChipNode | string | number,\r\n link.target as ForceChipNode | string | number\r\n );\r\n if (selectedKeys.has(key)) return;\r\n\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n\r\n // Allow a slight overflow (+1) only to prevent isolated visual outliers.\r\n if ((getCount(sourceId) >= maxPerNode + 1) || (getCount(targetId) >= maxPerNode + 1)) return;\r\n add(link);\r\n });\r\n });\r\n }\r\n\r\n return selected;\r\n }\r\n\r\n private filterCenterItemsByThreshold(centerItems: string[], p1Items: string[], p2Items: string[]): string[] {\r\n if (!centerItems?.length) return [];\r\n\r\n const threshold = ProfileComparisonLibComponent.SHARED_PROMOTION_THRESHOLD;\r\n const uniq = new Set<string>();\r\n const selected: string[] = [];\r\n const normalize = (s: string) => this.normalizeSimilarityToken(s);\r\n\r\n const p1Norm = new Set((p1Items ?? []).map(normalize));\r\n const p2Norm = new Set((p2Items ?? []).map(normalize));\r\n\r\n for (const raw of centerItems) {\r\n const item = String(raw ?? '').trim();\r\n if (!item) continue;\r\n const key = normalize(item);\r\n if (!key || uniq.has(key)) continue;\r\n\r\n const existsInP1 = p1Norm.has(key);\r\n const existsInP2 = p2Norm.has(key);\r\n\r\n let maxCrossSim = 0;\r\n\r\n // If the value exists on the left, compare against right-side terms.\r\n if (existsInP1 || (!existsInP1 && !existsInP2)) {\r\n for (const right of p2Items ?? []) {\r\n maxCrossSim = Math.max(maxCrossSim, this.getSimilarity(item, right));\r\n }\r\n }\r\n\r\n // If the value exists on the right, compare against left-side terms.\r\n if (existsInP2 || (!existsInP1 && !existsInP2)) {\r\n for (const left of p1Items ?? []) {\r\n maxCrossSim = Math.max(maxCrossSim, this.getSimilarity(item, left));\r\n }\r\n }\r\n\r\n if (maxCrossSim >= threshold) {\r\n selected.push(item);\r\n uniq.add(key);\r\n }\r\n }\r\n\r\n return selected;\r\n }\r\n\r\n private scheduleForceGraphRebuild(): void {\r\n if (this.layoutRebuildRaf !== null) {\r\n cancelAnimationFrame(this.layoutRebuildRaf);\r\n this.layoutRebuildRaf = null;\r\n }\r\n this.ngZone.runOutsideAngular(() => {\r\n this.layoutRebuildRaf = requestAnimationFrame(() => {\r\n this.layoutRebuildRaf = null;\r\n this.ngZone.run(() => {\r\n if (!this.backendConfigured || !this.forceNodes.length) return;\r\n this.buildForceGraph();\r\n });\r\n });\r\n });\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n this.scheduleForceGraphRebuild();\r\n }\r\n\r\n private buildForceGraph(): void {\r\n const rawP1 = this.getPerson1UniqueInterests();\r\n const rawShared = (this.centerItem || []).filter(c => c && c !== 'empty' && c !== '-' && c !== '----');\r\n const rawP2 = this.getPerson2UniqueInterests();\r\n const capped = this.selectTopSharedInterestsPerSide(rawP1, rawP2);\r\n const cappedRawP1 = capped.p1;\r\n const cappedRawP2 = capped.p2;\r\n\r\n if (cappedRawP1.length === 0 && rawShared.length === 0 && cappedRawP2.length === 0) {\r\n this.forceNodes = [];\r\n this.forceLinks = [];\r\n this.forceCanvasHeight = 180;\r\n if (this.simulation) this.simulation.stop();\r\n return;\r\n }\r\n\r\n const p1Items = this.orderBySemanticBarycenter(cappedRawP1, cappedRawP2);\r\n const p2Items = this.orderBySemanticBarycenter(cappedRawP2, cappedRawP1);\r\n const shared = this.orderSharedBySemanticPull(rawShared, p1Items, p2Items);\r\n\r\n // --- Read container width robustly ---\r\n let containerWidth = 0;\r\n try { containerWidth = this.chipsGrid?.nativeElement?.clientWidth ?? 0; } catch { /* */ }\r\n if (!containerWidth) {\r\n try { containerWidth = this.hostRef.nativeElement.getBoundingClientRect().width; } catch { /* */ }\r\n }\r\n if (!containerWidth) {\r\n try {\r\n const el = this.profileFlex?.nativeElement as HTMLElement | null;\r\n containerWidth = el ? (el.clientWidth || el.getBoundingClientRect().width || 0) : 0;\r\n } catch { /* */ }\r\n }\r\n if (!containerWidth || containerWidth < 100) {\r\n this.ngZone.runOutsideAngular(() => {\r\n requestAnimationFrame(() => {\r\n this.ngZone.run(() => this.buildForceGraph());\r\n });\r\n });\r\n return;\r\n }\r\n\r\n const maxRows = Math.max(p1Items.length, shared.length, p2Items.length, 1);\r\n\r\n let availableHeight = 0;\r\n try { availableHeight = this.chipsGrid?.nativeElement?.clientHeight ?? 0; } catch { /* */ }\r\n if (!availableHeight) {\r\n try {\r\n const el = this.profileFlex?.nativeElement as HTMLElement | null;\r\n const h = el ? (el.clientHeight || el.getBoundingClientRect().height || 0) : 0;\r\n availableHeight = Math.max(120, h - 90);\r\n } catch { /* */ }\r\n }\r\n if (!availableHeight || availableHeight < 120) availableHeight = 320;\r\n\r\n const baseChipH = ProfileComparisonLibComponent.CHIP_RADIUS * 2;\r\n const baseStartY = 34;\r\n const baseRowGapExtra = 14;\r\n const baseBottomPad = 30;\r\n const requiredBaseHeight = baseStartY + baseBottomPad + maxRows * baseChipH + Math.max(0, maxRows - 1) * baseRowGapExtra;\r\n const fitScale = Math.min(1, Math.max(0.35, availableHeight / Math.max(requiredBaseHeight, 1)));\r\n\r\n const chipH = Math.max(14, Math.round(baseChipH * fitScale));\r\n const chipHalfH = chipH / 2;\r\n const startY = Math.max(12, Math.round(baseStartY * fitScale));\r\n const rowGap = chipH + Math.max(5, Math.round(baseRowGapExtra * fitScale));\r\n const bottomPad = Math.max(10, Math.round(baseBottomPad * fitScale));\r\n const canvasPad = Math.max(8, Math.round(ProfileComparisonLibComponent.CANVAS_PADDING * fitScale * 0.75));\r\n\r\n // Keep rendered chip dimensions in sync with force-layout math.\r\n this.chipFontSizePx = Math.max(9.5, Number((14 * Math.max(fitScale, 0.68)).toFixed(2)));\r\n this.chipPaddingXPx = Math.max(8, Math.round(18 * Math.max(fitScale, 0.58)));\r\n this.chipPaddingYPx = Math.max(2, Math.round(6 * Math.max(fitScale, 0.5)));\r\n this.chipLineHeight = fitScale < 0.55 ? 1.15 : (fitScale < 0.8 ? 1.22 : 1.3);\r\n\r\n const approxCharWidth = this.chipFontSizePx * 0.53;\r\n const horizontalPadding = this.chipPaddingXPx * 2;\r\n const getHalfWidth = (label: string) => (label.length * approxCharWidth + horizontalPadding) / 2;\r\n const EDGE_PADDING = 20;\r\n\r\n const maxHalfP1 = p1Items.length ? Math.max(...p1Items.map(getHalfWidth)) : chipHalfH;\r\n const maxHalfShared = shared.length ? Math.max(...shared.map(getHalfWidth)) : chipHalfH;\r\n const maxHalfP2 = p2Items.length ? Math.max(...p2Items.map(getHalfWidth)) : chipHalfH;\r\n\r\n let zoneP1 = maxHalfP1 + EDGE_PADDING;\r\n let zoneP2 = containerWidth - maxHalfP2 - EDGE_PADDING;\r\n if (zoneP2 - zoneP1 < 140) {\r\n const center = containerWidth / 2;\r\n zoneP1 = Math.max(maxHalfP1 + EDGE_PADDING, center - 70);\r\n zoneP2 = Math.min(containerWidth - maxHalfP2 - EDGE_PADDING, center + 70);\r\n }\r\n const minShared = Math.max(zoneP1 + Math.max(maxHalfP1, maxHalfShared) * 0.6, maxHalfShared + EDGE_PADDING);\r\n const maxShared = Math.min(zoneP2 - Math.max(maxHalfP2, maxHalfShared) * 0.6, containerWidth - maxHalfShared - EDGE_PADDING);\r\n const zoneShared = Math.max(minShared, Math.min(maxShared, containerWidth * 0.5));\r\n\r\n const computedMaxY = startY + chipHalfH + (maxRows - 1) * rowGap + chipHalfH + bottomPad;\r\n const safeMaxY = Math.max(startY + chipHalfH, availableHeight - chipHalfH - 8);\r\n const maxY = Math.min(computedMaxY, safeMaxY);\r\n const minCenterY = startY + chipHalfH;\r\n const verticalSpan = Math.max(0, maxY - minCenterY);\r\n const centerGuard = Math.max(12, Math.min(26, (zoneP2 - zoneP1) * 0.12));\r\n const maxHalfAny = Math.max(maxHalfP1, maxHalfShared, maxHalfP2, chipHalfH);\r\n const globalMinX = maxHalfAny + EDGE_PADDING;\r\n const globalMaxX = containerWidth - maxHalfAny - EDGE_PADDING;\r\n const dividerLeft = (zoneP1 + zoneShared) / 2;\r\n const dividerRight = (zoneShared + zoneP2) / 2;\r\n const laneGap = Math.max(4, Math.min(16, centerGuard * 0.45));\r\n const sharedRawMin = Math.max(globalMinX, dividerLeft + laneGap);\r\n const sharedRawMax = Math.min(globalMaxX, dividerRight - laneGap);\r\n const sharedRawWidth = Math.max(0, sharedRawMax - sharedRawMin);\r\n const sharedTighten = Math.max(12, Math.min(34, sharedRawWidth * 0.22));\r\n const sharedMinWidth = Math.max(44, Math.min(84, maxHalfShared * 1.05));\r\n let p1BoundsMinX = globalMinX;\r\n let p1BoundsMaxX = Math.min(globalMaxX, dividerLeft - laneGap);\r\n let sharedBoundsMinX = Math.max(globalMinX, sharedRawMin + sharedTighten);\r\n let sharedBoundsMaxX = Math.min(globalMaxX, sharedRawMax - sharedTighten);\r\n let p2BoundsMinX = Math.max(globalMinX, dividerRight + laneGap);\r\n let p2BoundsMaxX = globalMaxX;\r\n if (p1BoundsMaxX < p1BoundsMinX) p1BoundsMaxX = p1BoundsMinX;\r\n if (p2BoundsMinX > p2BoundsMaxX) p2BoundsMinX = p2BoundsMaxX;\r\n if (sharedBoundsMaxX - sharedBoundsMinX < sharedMinWidth) {\r\n const centerX = Math.max(globalMinX, Math.min(globalMaxX, zoneShared));\r\n const fallbackHalfWidth = sharedMinWidth / 2;\r\n sharedBoundsMinX = Math.max(globalMinX, centerX - fallbackHalfWidth);\r\n sharedBoundsMaxX = Math.min(globalMaxX, centerX + fallbackHalfWidth);\r\n if (sharedBoundsMaxX < sharedBoundsMinX) {\r\n sharedBoundsMinX = centerX;\r\n sharedBoundsMaxX = centerX;\r\n }\r\n }\r\n\r\n // --- Scan matrix for max similarity to normalize spring distances ---\r\n let matrixMax = 0;\r\n if (this.matrixData?.rows) {\r\n for (const row of this.matrixData.rows) {\r\n for (const v of row.values) {\r\n const n = parseFloat(v);\r\n if (!isNaN(n) && n > matrixMax) matrixMax = n;\r\n }\r\n }\r\n }\r\n const springThreshold = ProfileComparisonLibComponent.SPRING_THRESHOLD;\r\n const crossLinkThreshold = ProfileComparisonLibComponent.CROSS_LINK_MIN_SIMILARITY;\r\n if (matrixMax <= springThreshold) matrixMax = 1.0;\r\n const simRange = matrixMax - springThreshold;\r\n\r\n const distributedYForIndex = (index: number, total: number): number => {\r\n if (total <= 1) return minCenterY + verticalSpan * 0.5;\r\n const t = index / Math.max(1, total - 1);\r\n return minCenterY + verticalSpan * t;\r\n };\r\n\r\n const nodes: ForceChipNode[] = [];\r\n const addNodes = (items: string[], group: 'p1' | 'shared' | 'p2', zoneX: number) => {\r\n const total = items.length;\r\n items.forEach((label, i) => {\r\n const targetY = distributedYForIndex(i, total);\r\n nodes.push({\r\n id: `${group}-${i}-${label}`,\r\n label,\r\n group,\r\n x: zoneX,\r\n y: targetY,\r\n targetX: zoneX,\r\n targetY,\r\n });\r\n });\r\n };\r\n\r\n addNodes(p1Items, 'p1', zoneP1);\r\n addNodes(shared, 'shared', zoneShared);\r\n addNodes(p2Items, 'p2', zoneP2);\r\n\r\n // Pull very high-similarity opposite-side chips toward the shared lane.\r\n const sharedThreshold = ProfileComparisonLibComponent.SHARED_PROMOTION_THRESHOLD;\r\n const sharedRange = Math.max(0.001, 1 - sharedThreshold);\r\n const oppositePool = (node: ForceChipNode): ForceChipNode[] => {\r\n if (node.group === 'p1') return nodes.filter(n => n.group === 'p2' || n.group === 'shared');\r\n if (node.group === 'p2') return nodes.filter(n => n.group === 'p1' || n.group === 'shared');\r\n return [];\r\n };\r\n\r\n nodes.forEach(node => {\r\n if (node.group === 'shared') {\r\n node.targetX = zoneShared;\r\n return;\r\n }\r\n\r\n let maxCross = 0;\r\n oppositePool(node).forEach(other => {\r\n maxCross = Math.max(maxCross, this.getSimilarity(node.label, other.label));\r\n });\r\n\r\n if (maxCross >= sharedThreshold) {\r\n const centerPull = 0.55 + Math.min(0.4, ((maxCross - sharedThreshold) / sharedRange) * 0.4);\r\n node.targetX = node.group === 'p1'\r\n ? zoneP1 + (zoneShared - zoneP1) * centerPull\r\n : zoneP2 + (zoneShared - zoneP2) * centerPull;\r\n }\r\n });\r\n\r\n // Vertical placement should be driven by cross-list similarity, not by\r\n // whichever list happens to have fewer items.\r\n const semanticPool = (node: ForceChipNode): ForceChipNode[] => {\r\n if (node.group === 'p1') return nodes.filter(n => n.group === 'p2' || n.group === 'shared');\r\n if (node.group === 'p2') return nodes.filter(n => n.group === 'p1' || n.group === 'shared');\r\n return nodes.filter(n => n.group === 'p1' || n.group === 'p2');\r\n };\r\n\r\n const ySimilarityFloor = Math.max(0.18, springThreshold - 0.06);\r\n for (let pass = 0; pass < 6; pass++) {\r\n const snapshotY = new Map<string, number>();\r\n nodes.forEach(node => {\r\n snapshotY.set(node.id, node.targetY ?? (minCenterY + verticalSpan * 0.5));\r\n });\r\n\r\n nodes.forEach(node => {\r\n const pool = semanticPool(node);\r\n if (!pool.length) return;\r\n\r\n let weightedY = 0;\r\n let totalWeight = 0;\r\n pool.forEach(other => {\r\n const similarity = this.getSimilarity(node.label, other.label);\r\n if (similarity < ySimilarityFloor) return;\r\n const weight = Math.pow(Math.max(0.001, similarity - ySimilarityFloor + 0.05), 2);\r\n const otherY = snapshotY.get(other.id) ?? (other.targetY ?? minCenterY);\r\n weightedY += otherY * weight;\r\n totalWeight += weight;\r\n });\r\n if (totalWeight <= 0) return;\r\n\r\n const semanticY = weightedY / totalWeight;\r\n const currentY = snapshotY.get(node.id) ?? semanticY;\r\n const blend = node.group === 'shared' ? 0.84 : 0.78;\r\n node.targetY = Math.max(minCenterY, Math.min(maxY, currentY + (semanticY - currentY) * blend));\r\n });\r\n }\r\n\r\n const buildNodeBounds = (node: ForceChipNode): { minX: number; maxX: number; minY: number; maxY: number } => {\r\n let minX = globalMinX;\r\n let maxX = globalMaxX;\r\n if (node.group === 'p1') {\r\n minX = p1BoundsMinX;\r\n maxX = p1BoundsMaxX;\r\n } else if (node.group === 'p2') {\r\n minX = p2BoundsMinX;\r\n maxX = p2BoundsMaxX;\r\n } else {\r\n minX = sharedBoundsMinX;\r\n maxX = sharedBoundsMaxX;\r\n }\r\n\r\n // Y should be column-wide so any chip can travel vertically within its lane.\r\n return { minX, maxX, minY: minCenterY, maxY };\r\n };\r\n\r\n const nodeBounds = new Map<string, { minX: number; maxX: number; minY: number; maxY: number }>();\r\n nodes.forEach(node => nodeBounds.set(node.id, buildNodeBounds(node)));\r\n this.nodeDragBounds = new Map(nodeBounds);\r\n\r\n const clampNodeToBounds = (node: ForceChipNode): void => {\r\n const bounds = nodeBounds.get(node.id) ?? buildNodeBounds(node);\r\n node.x = Math.max(bounds.minX, Math.min(bounds.maxX, node.x ?? (node.targetX ?? zoneShared)));\r\n node.y = Math.max(bounds.minY, Math.min(bounds.maxY, node.y ?? (node.targetY ?? minCenterY)));\r\n };\r\n\r\n const crossCandidates: ForceChipLink[] = [];\r\n const intraCandidates: ForceChipLink[] = [];\r\n const MIN_DIST = 34;\r\n const SPAN = 72;\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n for (let j = i + 1; j < nodes.length; j++) {\r\n if (!this.canLinkNodes(nodes[i], nodes[j])) continue;\r\n const similarity = this.getSimilarity(nodes[i].label, nodes[j].label);\r\n if (similarity < crossLinkThreshold) continue;\r\n\r\n const normSim = Math.min(1, (similarity - springThreshold) / simRange);\r\n const distance = MIN_DIST + (1 - normSim) * SPAN;\r\n crossCandidates.push({\r\n kind: 'cross',\r\n source: nodes[i],\r\n target: nodes[j],\r\n strength: 0.32 + normSim * 0.68,\r\n similarity,\r\n distance,\r\n });\r\n }\r\n }\r\n\r\n const intraThreshold = ProfileComparisonLibComponent.INTRA_GROUP_THRESHOLD;\r\n const intraRange = Math.max(0.001, matrixMax - intraThreshold);\r\n (['p1', 'p2'] as const).forEach(group => {\r\n const groupNodes = nodes.filter(n => n.group === group);\r\n for (let i = 0; i < groupNodes.length; i++) {\r\n for (let j = i + 1; j < groupNodes.length; j++) {\r\n const similarity = this.getSimilarity(groupNodes[i].label, groupNodes[j].label);\r\n if (similarity <= intraThreshold) continue;\r\n const normSim = Math.min(1, (similarity - intraThreshold) / intraRange);\r\n intraCandidates.push({\r\n kind: 'intra',\r\n source: groupNodes[i],\r\n target: groupNodes[j],\r\n strength: 0.12 + normSim * 0.24,\r\n similarity,\r\n distance: 34 + (1 - normSim) * 46,\r\n });\r\n }\r\n }\r\n });\r\n\r\n const crossLinks = this.selectLinksWithCaps(\r\n crossCandidates,\r\n ProfileComparisonLibComponent.MAX_CROSS_LINKS_PER_NODE,\r\n ProfileComparisonLibComponent.MIN_CROSS_LINKS_PER_NODE\r\n );\r\n\r\n // Shared chips can otherwise become vertical outliers if greedy caps saturate\r\n // their best opposite-side neighbors too early. Ensure a minimum local anchor set.\r\n const crossCounts = new Map<string, number>();\r\n const crossKeys = new Set<string>();\r\n const countCross = (id: string): number => crossCounts.get(id) ?? 0;\r\n const bumpCross = (id: string): void => {\r\n crossCounts.set(id, countCross(id) + 1);\r\n };\r\n const recordCross = (link: ForceChipLink): void => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n if (crossKeys.has(key)) return;\r\n crossKeys.add(key);\r\n crossLinks.push(link);\r\n bumpCross(sourceId);\r\n bumpCross(targetId);\r\n };\r\n crossLinks.forEach(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n crossKeys.add(key);\r\n bumpCross(sourceId);\r\n bumpCross(targetId);\r\n });\r\n\r\n if (ProfileComparisonLibComponent.MIN_CROSS_LINKS_PER_NODE > 0) {\r\n const sharedNodesForAnchors = nodes.filter(n => n.group === 'shared');\r\n sharedNodesForAnchors.forEach(sharedNode => {\r\n const sharedId = sharedNode.id;\r\n const incidentCandidates = crossCandidates\r\n .filter(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n return sourceId === sharedId || targetId === sharedId;\r\n })\r\n .sort((a, b) => (b.similarity - a.similarity) || (b.strength - a.strength));\r\n\r\n const requiredAnchors = Math.min(3, incidentCandidates.length);\r\n for (const candidate of incidentCandidates) {\r\n if (countCross(sharedId) >= requiredAnchors) break;\r\n\r\n const sourceId = this.getLinkNodeId(candidate.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(candidate.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n if (crossKeys.has(key)) continue;\r\n\r\n const otherId = sourceId === sharedId ? targetId : sourceId;\r\n if (countCross(otherId) > ProfileComparisonLibComponent.MAX_CROSS_LINKS_PER_NODE + 1) continue;\r\n\r\n recordCross(candidate);\r\n }\r\n });\r\n }\r\n\r\n const intraLinks = this.selectLinksWithCaps(\r\n intraCandidates,\r\n ProfileComparisonLibComponent.MAX_INTRA_LINKS_PER_NODE\r\n );\r\n\r\n const links: ForceChipLink[] = [...crossLinks, ...intraLinks];\r\n const nodeById = new Map(nodes.map(n => [n.id, n] as const));\r\n const crossAdjacency = new Map<string, Array<{ node: ForceChipNode; similarity: number }>>();\r\n const addAdjacency = (source: ForceChipNode, target: ForceChipNode, similarity: number) => {\r\n const bucket = crossAdjacency.get(source.id) ?? [];\r\n bucket.push({ node: target, similarity });\r\n crossAdjacency.set(source.id, bucket);\r\n };\r\n crossLinks.forEach(link => {\r\n const source = typeof link.source === 'object' ? link.source : nodeById.get(String(link.source));\r\n const target = typeof link.target === 'object' ? link.target : nodeById.get(String(link.target));\r\n if (!source || !target) return;\r\n addAdjacency(source, target, link.similarity);\r\n addAdjacency(target, source, link.similarity);\r\n });\r\n\r\n const crossAlignForce = (alpha: number) => {\r\n crossAdjacency.forEach((neighbors, nodeId) => {\r\n const node = nodeById.get(nodeId);\r\n if (!node || !neighbors.length) return;\r\n let weightedY = 0;\r\n let totalWeight = 0;\r\n neighbors.forEach(({ node: other, similarity }) => {\r\n const weight = Math.max(0.05, similarity);\r\n weightedY += (other.y ?? node.y ?? 0) * weight;\r\n totalWeight += weight;\r\n });\r\n if (totalWeight <= 0) return;\r\n const targetY = weightedY / totalWeight;\r\n const dy = targetY - (node.y ?? targetY);\r\n const sparseNeighbors = neighbors.length <= 2;\r\n const alignStrength = node.group === 'shared'\r\n ? (sparseNeighbors ? 0.95 : 0.8)\r\n : (sparseNeighbors ? 0.82 : 0.68);\r\n node.vy = (node.vy ?? 0) + dy * alignStrength * alpha;\r\n });\r\n };\r\n\r\n const linkRecords = links\r\n .map(link => {\r\n const source = typeof link.source === 'object' ? link.source : nodeById.get(String(link.source));\r\n const target = typeof link.target === 'object' ? link.target : nodeById.get(String(link.target));\r\n if (!source || !target) return null;\r\n return {\r\n source,\r\n target,\r\n similarity: Number(link.similarity ?? link.strength ?? 0.5),\r\n kind: link.kind,\r\n };\r\n })\r\n .filter((record): record is { source: ForceChipNode; target: ForceChipNode; similarity: number; kind: 'cross' | 'intra' } => !!record);\r\n const maxLinkSimilarity = Math.max(0.001, ...linkRecords.map(record => Math.max(0, record.similarity)));\r\n const MIN_PAIR_DISTANCE = 34;\r\n const MAX_PAIR_DISTANCE = 88;\r\n const similarityAttractionForce = (alpha: number) => {\r\n linkRecords.forEach(record => {\r\n const dx = (record.target.x ?? 0) - (record.source.x ?? 0);\r\n const dy = (record.target.y ?? 0) - (record.source.y ?? 0);\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const normalizedSimilarity = Math.max(0, Math.min(1, record.similarity / maxLinkSimilarity));\r\n const targetDistance = MIN_PAIR_DISTANCE + (MAX_PAIR_DISTANCE - MIN_PAIR_DISTANCE) * (1 - normalizedSimilarity);\r\n if (dist <= targetDistance) return;\r\n const pullGap = dist - targetDistance;\r\n const pullBase = record.kind === 'cross' ? 0.9 : 0.82;\r\n const pullFactor = pullBase * alpha * (pullGap / dist);\r\n record.source.vx = (record.source.vx ?? 0) + dx * pullFactor;\r\n record.source.vy = (record.source.vy ?? 0) + dy * pullFactor;\r\n record.target.vx = (record.target.vx ?? 0) - dx * pullFactor;\r\n record.target.vy = (record.target.vy ?? 0) - dy * pullFactor;\r\n });\r\n };\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const sim = forceSimulation<ForceChipNode>(nodes)\r\n .alphaDecay(0.014)\r\n .stop()\r\n .force('link', forceLink<ForceChipNode, ForceChipLink>(links)\r\n .id(d => d.id)\r\n .distance(d => d.distance)\r\n .strength(d => this.getRuntimeLinkStrength(d))\r\n )\r\n .force(\r\n 'collide',\r\n forceCollide<ForceChipNode>((d) => {\r\n const baseRadius = getHalfWidth(d.label) * 0.55 + ProfileComparisonLibComponent.CHIP_COLLISION_BORDER_PADDING;\r\n return Math.min(58, Math.max(ProfileComparisonLibComponent.CHIP_RADIUS + 8, baseRadius));\r\n })\r\n .strength(1)\r\n .iterations(2)\r\n )\r\n .force(\r\n 'xBound',\r\n forceX<ForceChipNode>(d => d.targetX ?? zoneShared)\r\n .strength(d => d.group === 'shared' ? 1.15 : 0.85)\r\n )\r\n .force('yTargetSeed', forceY<ForceChipNode>(d => d.targetY ?? minCenterY).strength(0.1))\r\n .force('crossAlign', crossAlignForce)\r\n .force('similarityAttraction', similarityAttractionForce);\r\n\r\n for (let i = 0; i < 420 && sim.alpha() > 0.0035; i++) {\r\n sim.tick();\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n });\r\n }\r\n\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n n.originalFx = n.x;\r\n n.originalFy = n.y;\r\n });\r\n\r\n sim.force('xBound', null);\r\n sim.force('yTargetSeed', null);\r\n sim.force('crossAlign', null);\r\n sim.force(\r\n 'xTarget',\r\n forceX<ForceChipNode>(d => d.originalFx ?? d.x ?? 0)\r\n .strength(d => d.group === 'shared' ? 0.12 : 0.045)\r\n );\r\n sim.force('yTarget', forceY<ForceChipNode>(d => d.originalFy ?? d.y ?? 0).strength(0.045));\r\n\r\n this.simulation = sim;\r\n\r\n this.ngZone.run(() => {\r\n this.forceNodes = [...nodes];\r\n this.forceLinks = links;\r\n const maxBottom = Math.max(...nodes.map(n => (n.y ?? 0) + chipHalfH));\r\n this.forceCanvasHeight = Math.ceil(Math.min(maxBottom + canvasPad, availableHeight));\r\n this.cdr.detectChanges();\r\n });\r\n\r\n sim.on('tick', () => {\r\n this.ngZone.run(() => {\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n });\r\n this.forceNodes = [...nodes];\r\n const maxBottom = Math.max(...nodes.map(n => (n.y ?? 0) + chipHalfH));\r\n this.forceCanvasHeight = Math.ceil(Math.min(maxBottom + canvasPad, availableHeight));\r\n this.cdr.detectChanges();\r\n });\r\n });\r\n });\r\n }\r\n\r\n private selectTopSharedInterestsPerSide(\r\n person1Items: string[],\r\n person2Items: string[]\r\n ): { p1: string[]; p2: string[] } {\r\n const limit = ProfileComparisonLibComponent.MAX_RELEVANT_INTERESTS_PER_SIDE;\r\n const sanitize = (items: string[]): string[] => {\r\n const seen = new Set<string>();\r\n const cleaned: string[] = [];\r\n (items || []).forEach(item => {\r\n const value = String(item ?? '').trim();\r\n if (!value) return;\r\n const key = value.toLowerCase();\r\n if (seen.has(key)) return;\r\n seen.add(key);\r\n cleaned.push(value);\r\n });\r\n return cleaned;\r\n };\r\n\r\n const p1 = sanitize(person1Items);\r\n const p2 = sanitize(person2Items);\r\n if (limit <= 0) return { p1: [], p2: [] };\r\n if (!p1.length || !p2.length) {\r\n return {\r\n p1: p1.slice(0, limit),\r\n p2: p2.slice(0, limit),\r\n };\r\n }\r\n\r\n type Pair = { p1: string; p2: string; similarity: number };\r\n const pairs: Pair[] = [];\r\n p1.forEach(item1 => {\r\n p2.forEach(item2 => {\r\n pairs.push({ p1: item1, p2: item2, similarity: this.getSimilarity(item1, item2) });\r\n });\r\n });\r\n pairs.sort((a, b) => b.similarity - a.similarity);\r\n\r\n const pickedP1 = new Set<string>();\r\n const pickedP2 = new Set<string>();\r\n const orderedP1: string[] = [];\r\n const orderedP2: string[] = [];\r\n\r\n for (const pair of pairs) {\r\n if (orderedP1.length >= limit && orderedP2.length >= limit) break;\r\n const canAddP1 = !pickedP1.has(pair.p1) && orderedP1.length < limit;\r\n const canAddP2 = !pickedP2.has(pair.p2) && orderedP2.length < limit;\r\n if (!canAddP1 && !canAddP2) continue;\r\n if (canAddP1) {\r\n pickedP1.add(pair.p1);\r\n orderedP1.push(pair.p1);\r\n }\r\n if (canAddP2) {\r\n pickedP2.add(pair.p2);\r\n orderedP2.push(pair.p2);\r\n }\r\n }\r\n\r\n const rankRemaining = (items: string[], opposite: string[], selected: Set<string>): string[] => {\r\n return items\r\n .filter(item => !selected.has(item))\r\n .map((item, index) => ({\r\n item,\r\n index,\r\n score: Math.max(...opposite.map(other => this.getSimilarity(item, other)), 0),\r\n }))\r\n .sort((a, b) => (b.score - a.score) || (a.index - b.index))\r\n .map(entry => entry.item);\r\n };\r\n\r\n rankRemaining(p1, p2, pickedP1).forEach(item => {\r\n if (orderedP1.length >= limit) return;\r\n pickedP1.add(item);\r\n orderedP1.push(item);\r\n });\r\n rankRemaining(p2, p1, pickedP2).forEach(item => {\r\n if (orderedP2.length >= limit) return;\r\n pickedP2.add(item);\r\n orderedP2.push(item);\r\n });\r\n\r\n return {\r\n p1: orderedP1.slice(0, limit),\r\n p2: orderedP2.slice(0, limit),\r\n };\r\n }\r\n\r\n private reorderInterestsByMatrix(p1List: string[], p2List: string[], centerList: string[]): { p1: string[]; p2: string[]; center: string[] } {\r\n if (!this.matrixData) return { p1: p1List, p2: p2List, center: centerList };\r\n\r\n const cleanCenter = (centerList || []).filter(c => c && c !== '-' && c !== '----');\r\n const list1 = (p1List || []).filter(item => item && item !== '-' && item !== '----');\r\n const list2 = (p2List || []).filter(item => item && item !== '-' && item !== '----');\r\n\r\n const ordered1: string[] = [];\r\n const ordered2: string[] = [];\r\n const used1 = new Set<string>();\r\n const used2 = new Set<string>();\r\n\r\n // 1. PRIORITIZE LEFT AND RIGHT SIMILARITY (Pair ordering from top to bottom)\r\n const remaining1 = [...list1];\r\n const remaining2 = [...list2];\r\n\r\n while (remaining1.length > 0 && remaining2.length > 0) {\r\n let bestPair = { i1: -1, i2: -1, score: -1 };\r\n for (let i = 0; i < remaining1.length; i++) {\r\n for (let j = 0; j < remaining2.length; j++) {\r\n const score = this.getSimilarity(remaining1[i], remaining2[j]);\r\n if (score > bestPair.score) {\r\n bestPair = { i1: i, i2: j, score };\r\n }\r\n }\r\n }\r\n\r\n if (bestPair.score >= 0.15 && bestPair.i1 !== -1 && bestPair.i2 !== -1) {\r\n const item1 = remaining1[bestPair.i1];\r\n const item2 = remaining2[bestPair.i2];\r\n ordered1.push(item1);\r\n ordered2.push(item2);\r\n used1.add(item1);\r\n used2.add(item2);\r\n remaining1.splice(bestPair.i1, 1);\r\n remaining2.splice(bestPair.i2, 1);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // 2. FOR REMAINING UNMATCHED LEFT & RIGHT, ORDER BY RELEVANCE TO ALREADY PLACED ITEMS\r\n const unplaced1 = list1.filter(item => !used1.has(item));\r\n const unplaced2 = list2.filter(item => !used2.has(item));\r\n\r\n const rankUnplaced = (items: string[], placedContext: string[]) => {\r\n return items.map(item => {\r\n let maxSim = 0;\r\n placedContext.forEach(placed => {\r\n const s = this.getSimilarity(item, placed);\r\n if (s > maxSim) maxSim = s;\r\n });\r\n return { item, maxSim };\r\n }).sort((a, b) => b.maxSim - a.maxSim).map(x => x.item);\r\n };\r\n\r\n const allPlaced = [...ordered1, ...ordered2];\r\n const sortedUnplaced1 = rankUnplaced(unplaced1, allPlaced);\r\n const sortedUnplaced2 = rankUnplaced(unplaced2, allPlaced);\r\n\r\n sortedUnplaced1.forEach(item => {\r\n ordered1.push(item);\r\n used1.add(item);\r\n });\r\n sortedUnplaced2.forEach(item => {\r\n ordered2.push(item);\r\n used2.add(item);\r\n });\r\n\r\n // 3. ASSIGN CENTER ITEMS TO INDICES BASED ON BEST MATCH\r\n const maxRows = Math.max(ordered1.length, ordered2.length);\r\n const assignments: { centerItem: string; index: number; score: number }[] = [];\r\n\r\n cleanCenter.forEach(cItem => {\r\n for (let k = 0; k < maxRows; k++) {\r\n const item1 = ordered1[k];\r\n const item2 = ordered2[k];\r\n const score1 = item1 ? this.getSimilarity(cItem, item1) : 0;\r\n const score2 = item2 ? this.getSimilarity(cItem, item2) : 0;\r\n const maxScore = Math.max(score1, score2);\r\n assignments.push({ centerItem: cItem, index: k, score: maxScore });\r\n }\r\n });\r\n\r\n assignments.sort((a, b) => b.score - a.score);\r\n\r\n const assignedItems = new Set<string>();\r\n const assignedIndices = new Set<number>();\r\n const orderedCenter: string[] = new Array(maxRows).fill('empty');\r\n\r\n assignments.forEach(({ centerItem, index }) => {\r\n if (!assignedItems.has(centerItem) && !assignedIndices.has(index)) {\r\n orderedCenter[index] = centerItem;\r\n assignedItems.add(centerItem);\r\n assignedIndices.add(index);\r\n }\r\n });\r\n\r\n const remainingCenter = cleanCenter.filter(c => !assignedItems.has(c));\r\n orderedCenter.push(...remainingCenter);\r\n\r\n return { p1: ordered1, p2: ordered2, center: orderedCenter };\r\n }\r\n\r\n onViewProfile(side: 'left' | 'right'): void {\r\n this.viewProfileClick.emit({ side });\r\n }\r\n\r\n getPerson1UniqueInterests(): string[] {\r\n const raw = this.alignedPerson1Interests.length > 0\r\n ? this.alignedPerson1Interests\r\n : this.displayPerson1Interests.length > 0\r\n ? this.displayPerson1Interests\r\n : this.person1Interests;\r\n return raw.filter(item => item && item !== '-' && item !== '----' && !this.isInCenter(item));\r\n }\r\n\r\n getPerson2UniqueInterests(): string[] {\r\n const raw = this.alignedPerson2Interests.length > 0\r\n ? this.alignedPerson2Interests\r\n : this.displayPerson2Interests.length > 0\r\n ? this.displayPerson2Interests\r\n : this.person2Interests;\r\n return raw.filter(item => item && item !== '-' && item !== '----' && !this.isInCenter(item));\r\n }\r\n\r\n getChipOffset(index: number, column: 'left' | 'center' | 'right'): number {\r\n const leftOffsets = [0, 20, 6, 26, 12, 30, 4, 18];\r\n const rightOffsets = [0, 20, 6, 26, 12, 30, 4, 18];\r\n const centerOffsets = [0, -14, 12, -6, 16, -10, 8, -4];\r\n if (column === 'left') return leftOffsets[index % leftOffsets.length];\r\n if (column === 'right') return rightOffsets[index % rightOffsets.length];\r\n return centerOffsets[index % centerOffsets.length];\r\n }\r\n\r\n private compressInputImages(): Observable<void> {\r\n const tasks: Observable<void>[] = [];\r\n\r\n const processUser = (which: 1 | 2): Observable<void> => {\r\n const file = which === 1 ? this.user1File : this.user2File;\r\n const imageStr = which === 1 ? this.user1Image : this.user2Image;\r\n const baseName = which === 1 ? 'ConfigUser1' : 'ConfigUser2';\r\n\r\n const updateImage = (dataUrl: string) => {\r\n if (which === 1) this.user1Image = dataUrl;\r\n else this.user2Image = dataUrl;\r\n };\r\n\r\n // If File object provided, compress it\r\n if (file) {\r\n return this.imageCompressionService.compressImageFile(file, this.compressionConfig).pipe(\r\n tap(res => { if (res.dataUrl) updateImage(res.dataUrl); }),\r\n map(() => void 0),\r\n catchError(() => of(void 0))\r\n );\r\n }\r\n\r\n if (!imageStr) return of(void 0);\r\n\r\n // If already a data URL, compress it\r\n if (this.fileConversionService.isDataUrl(imageStr)) {\r\n return this.compressImageStringToDataUrl(imageStr, baseName).pipe(\r\n tap(dataUrl => { if (dataUrl) updateImage(dataUrl); }),\r\n map(() => void 0)\r\n );\r\n }\r\n\r\n // For external URLs, try to fetch and compress client-side\r\n // If fetch fails (e.g., CORS), keep the raw URL and let backend handle it\r\n let fetchUrl = imageStr;\r\n if (this.imageProxyPath && imageStr.startsWith('http')) {\r\n // Extract path from full URL for proxy\r\n try {\r\n const urlObj = new URL(imageStr);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n fetchUrl = `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n fetchUrl = imageStr;\r\n }\r\n }\r\n\r\n return this.fileConversionService.fetchUrlToDataUrl(fetchUrl).pipe(\r\n switchMap(dataUrl => this.imageCompressionService.compressImageFile(\r\n this.fileConversionService.dataUrlToFile(dataUrl, `${baseName}.jpg`),\r\n this.compressionConfig\r\n )),\r\n tap(res => { if (res.dataUrl) updateImage(res.dataUrl); }),\r\n map(() => void 0),\r\n catchError(() => {\r\n // Fetch failed (likely CORS), keep raw URL for backend to handle\r\n return of(void 0);\r\n })\r\n );\r\n };\r\n\r\n tasks.push(processUser(1));\r\n tasks.push(processUser(2));\r\n\r\n return forkJoin(tasks).pipe(map(() => void 0));\r\n }\r\n\r\n private compressImageStringToDataUrl(imageStr: string, baseName: string): Observable<string | null> {\r\n return this.fileConversionService.getFileForImageString(imageStr, `${baseName}.jpg`).pipe(\r\n switchMap(file => this.imageCompressionService.compressImageFile(file, this.compressionConfig)),\r\n map(res => res.dataUrl),\r\n catchError(() => of(null))\r\n );\r\n }\r\n\r\n getEyeCoordinatesFromBBox(bbox: IBoundingBox): { leftEye: IPoint; rightEye: IPoint } {\r\n const eyeY = bbox.y + bbox.height * 0.38;\r\n const leftEyeX = bbox.x + bbox.width * 0.32;\r\n const rightEyeX = bbox.x + bbox.width * 0.68;\r\n return { leftEye: { x: leftEyeX, y: eyeY }, rightEye: { x: rightEyeX, y: eyeY } };\r\n }\r\n\r\n getEyeCoordinatesFromFace(face: IFaceBoxWithLandmarks): { leftEye: IPoint; rightEye: IPoint } {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const left = pick(['left_eye_pupil', 'left_eye_center', 'eye_left_pupil', 'left_eye']) || this.getEyeCoordinatesFromBBox(face).leftEye;\r\n const right = pick(['right_eye_pupil', 'right_eye_center', 'eye_right_pupil', 'right_eye']) || this.getEyeCoordinatesFromBBox(face).rightEye;\r\n return { leftEye: left, rightEye: right };\r\n }\r\n\r\n getNoseCoordinateFromFace(face: IFaceBoxWithLandmarks): IPoint {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const nose = pick(['nose_tip', 'nose', 'nose_middle', 'nose_bridge1']);\r\n if (nose) return nose;\r\n return this.getNoseCoordinateFromBBox(face as unknown as IBoundingBox);\r\n }\r\n\r\n private clampPointToFaceRect(p: IPoint, box: IBoundingBox): IPoint {\r\n const x = Math.max(box.x, Math.min(box.x + box.width, p.x));\r\n const y = Math.max(box.y, Math.min(box.y + box.height, p.y));\r\n return { x, y };\r\n }\r\n\r\n getNoseCoordinateFromBBox(bbox: IBoundingBox): IPoint {\r\n return { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height * 0.58 };\r\n }\r\n\r\n getFaceCoordinatesFromBBox(bbox: IBoundingBox): { faceCenter: IPoint; faceTop: IPoint; faceBottom: IPoint; faceLeft: IPoint; faceRight: IPoint } {\r\n return {\r\n faceCenter: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 2 },\r\n faceTop: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 4 },\r\n faceBottom: { x: bbox.x + bbox.width / 2, y: bbox.y + (3 * bbox.height) / 4 },\r\n faceLeft: { x: bbox.x + bbox.width / 4, y: bbox.y + bbox.height / 2 },\r\n faceRight: { x: bbox.x + (3 * bbox.width) / 4, y: bbox.y + bbox.height / 2 },\r\n };\r\n }\r\n\r\n calculateFaceAlignment(user1Data: FaceDetectionData, user2Data: FaceDetectionData): void {\r\n let faces1: IFaceBoxWithLandmarks[] = [];\r\n let faces2: IFaceBoxWithLandmarks[] = [];\r\n\r\n const getFaces = (data: FaceDetectionData): IFaceBoxWithLandmarks[] => {\r\n if (Array.isArray(data)) return data;\r\n if (data && typeof data === 'object' && 'faces' in data && Array.isArray(data.faces)) return data.faces;\r\n return [];\r\n };\r\n\r\n faces1 = getFaces(user1Data);\r\n faces2 = getFaces(user2Data);\r\n\r\n if (!faces1?.length || !faces2?.length) { this.applyDefaultAlignment(); return; }\r\n const face1 = faces1[0]; const face2 = faces2[0];\r\n if (!this.isValidFaceData(face1) || !this.isValidFaceData(face2)) { this.applyDefaultAlignment(); return; }\r\n\r\n const user1FaceCoords = this.getFaceCoordinatesFromBBox(face1);\r\n const user2FaceCoords = this.getFaceCoordinatesFromBBox(face2);\r\n const user1Eyes = this.getEyeCoordinatesFromFace(face1);\r\n const user2Eyes = this.getEyeCoordinatesFromFace(face2);\r\n\r\n const leftContainerEl = this.profileImgLeft?.nativeElement || null;\r\n const rightContainerEl = this.profileImgRight?.nativeElement || null;\r\n const containerWidth1 = leftContainerEl?.clientWidth || 160;\r\n const containerHeight1 = leftContainerEl?.clientHeight || 550;\r\n const containerWidth2 = rightContainerEl?.clientWidth || 160;\r\n const containerHeight2 = rightContainerEl?.clientHeight || 550;\r\n\r\n const scale1 = this.user1NaturalWidth ? Math.max(containerWidth1 / this.user1NaturalWidth, containerHeight1 / this.user1NaturalHeight) : 1;\r\n const scale2 = this.user2NaturalWidth ? Math.max(containerWidth2 / this.user2NaturalWidth, containerHeight2 / this.user2NaturalHeight) : 1;\r\n\r\n const nose1 = this.getNoseCoordinateFromFace(face1);\r\n const nose2 = this.getNoseCoordinateFromFace(face2);\r\n const anchor1Y = (Math.min(user1Eyes.leftEye.y, user1Eyes.rightEye.y) + nose1.y) / 2;\r\n const anchor2Y = (Math.min(user2Eyes.leftEye.y, user2Eyes.rightEye.y) + nose2.y) / 2;\r\n\r\n const tCenter1 = this.user1NaturalHeight ? -((anchor1Y - this.user1NaturalHeight / 2) * scale1) : 0;\r\n const tCenter2 = this.user2NaturalHeight ? -((anchor2Y - this.user2NaturalHeight / 2) * scale2) : 0;\r\n\r\n const shiftY1 = tCenter1 - this.eyeAlignmentBiasPx;\r\n const shiftY2 = tCenter2 - this.eyeAlignmentBiasPx;\r\n\r\n // Apply eye-to-eye vertical repositioning transforms without any scaling\r\n this.user1Transform = `translateY(${shiftY1}px)`;\r\n this.user2Transform = `translateY(${shiftY2}px)`;\r\n\r\n // Extend image dimensions into the adjusted area without applying any uniform zoom/scaling\r\n if (shiftY1 > 0) {\r\n this.user1Top = `-${shiftY1}px`;\r\n this.user1Height = `calc(100% + ${shiftY1}px)`;\r\n } else {\r\n this.user1Top = '0px';\r\n this.user1Height = `calc(100% + ${Math.abs(shiftY1)}px)`;\r\n }\r\n\r\n if (shiftY2 > 0) {\r\n this.user2Top = `-${shiftY2}px`;\r\n this.user2Height = `calc(100% + ${shiftY2}px)`;\r\n } else {\r\n this.user2Top = '0px';\r\n this.user2Height = `calc(100% + ${Math.abs(shiftY2)}px)`;\r\n }\r\n\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n applyDefaultAlignment() {\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.user1Top = '0px';\r\n this.user1Height = '100%';\r\n this.user2Top = '0px';\r\n this.user2Height = '100%';\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n isValidFaceData(face: IBoundingBox): boolean {\r\n return !!face && typeof face.x === 'number' && face.width > 0 && face.height > 0;\r\n }\r\n\r\n onNodeMouseEnter(node: ForceChipNode): void {\r\n this.hoveredNode = node;\r\n }\r\n\r\n onNodeMouseLeave(node: ForceChipNode): void {\r\n this.hoveredNode = null;\r\n }\r\n\r\n onNodeClick(node: ForceChipNode, event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (this.clickedNode === node) {\r\n this.clickedNode = null;\r\n this.updateAttractionForce(null);\r\n } else {\r\n this.clickedNode = node;\r\n this.updateAttractionForce(node);\r\n }\r\n }\r\n\r\n @HostListener('document:click')\r\n onDocumentClick(): void {\r\n this.clickedNode = null;\r\n if (!this.isDragging) {\r\n this.updateAttractionForce(null);\r\n }\r\n }\r\n\r\n /**\r\n * Anchor interaction should only affect highlighting/energy.\r\n * Similarity attraction is always-on via the base simulation forces.\r\n */\r\n private updateAttractionForce(anchorNode: ForceChipNode | null): void {\r\n if (!this.simulation) return;\r\n this.simulation.force('attraction', null);\r\n if (anchorNode) {\r\n this.simulation.alpha(0.24).restart();\r\n } else if (!this.isDragging) {\r\n this.simulation.alphaTarget(0);\r\n }\r\n }\r\n\r\n\r\n isNodeConnected(node: ForceChipNode): boolean {\r\n if (!this.activeNode) return true;\r\n if (this.activeNode === node) return true;\r\n return this.forceLinks.some(link => {\r\n const srcId = (link.source && typeof link.source === 'object') ? (link.source as any).id : link.source;\r\n const tgtId = (link.target && typeof link.target === 'object') ? (link.target as any).id : link.target;\r\n return (srcId === this.activeNode!.id && tgtId === node.id) ||\r\n (tgtId === this.activeNode!.id && srcId === node.id);\r\n });\r\n }\r\n\r\n isLinkConnectedToActive(link: any): boolean {\r\n if (!this.activeNode) return false;\r\n const srcId = (link.source && typeof link.source === 'object') ? link.source.id : link.source;\r\n const tgtId = (link.target && typeof link.target === 'object') ? link.target.id : link.target;\r\n return srcId === this.activeNode.id || tgtId === this.activeNode.id;\r\n }\r\n\r\n /**\r\n * Returns true if the link connects a p1 node to a p2 node (a direct left↔right match),\r\n * as opposed to a connection involving a shared-pool chip.\r\n */\r\n isCrossGroupLink(link: any): boolean {\r\n const src = this.findNode(link.source);\r\n const tgt = this.findNode(link.target);\r\n if (!src || !tgt) return false;\r\n return (src.group === 'p1' && tgt.group === 'p2') ||\r\n (src.group === 'p2' && tgt.group === 'p1');\r\n }\r\n\r\n /**\r\n * All force links sorted so secondary (shared-chip) links render first and\r\n * primary (p1↔p2 direct match) links render last — SVG paints last-child on top.\r\n */\r\n get sortedForceLinks(): any[] {\r\n return [...this.forceLinks].sort((a, b) =>\r\n (this.isCrossGroupLink(a) ? 1 : 0) - (this.isCrossGroupLink(b) ? 1 : 0)\r\n );\r\n }\r\n\r\n getLinkSourceX(link: any): number {\r\n const node = this.findNode(link.source);\r\n return node ? (node.x ?? 0) : 0;\r\n }\r\n\r\n getLinkSourceY(link: any): number {\r\n const node = this.findNode(link.source);\r\n return node ? (node.y ?? 0) : 0;\r\n }\r\n\r\n getLinkTargetX(link: any): number {\r\n const node = this.findNode(link.target);\r\n return node ? (node.x ?? 0) : 0;\r\n }\r\n\r\n getLinkTargetY(link: any): number {\r\n const node = this.findNode(link.target);\r\n return node ? (node.y ?? 0) : 0;\r\n }\r\n\r\n private findNode(ref: any): ForceChipNode | undefined {\r\n if (!ref) return undefined;\r\n const id = typeof ref === 'object' ? ref.id : ref;\r\n return this.forceNodes.find(n => n.id === id);\r\n }\r\n\r\n onNodeDragStart(node: ForceChipNode, event: MouseEvent | TouchEvent): void {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n\r\n this.draggedNode = node;\r\n this.isDragging = true;\r\n this.clickedNode = node;\r\n\r\n const touchEvent = event as TouchEvent;\r\n const mouseEvent = event as MouseEvent;\r\n const isTouch = !!(touchEvent.touches && touchEvent.touches.length);\r\n const clientX = isTouch ? touchEvent.touches[0].clientX : mouseEvent.clientX;\r\n const clientY = isTouch ? touchEvent.touches[0].clientY : mouseEvent.clientY;\r\n\r\n const rect = this.chipsGrid.nativeElement.getBoundingClientRect();\r\n const scrollTop = this.chipsGrid.nativeElement.scrollTop;\r\n const relX = clientX - rect.left;\r\n const relY = clientY - rect.top + scrollTop;\r\n const bounds = this.nodeDragBounds.get(node.id);\r\n\r\n if (bounds) {\r\n node.fx = Math.max(bounds.minX, Math.min(bounds.maxX, relX));\r\n node.fy = Math.max(bounds.minY, Math.min(bounds.maxY, relY));\r\n } else {\r\n node.fx = relX;\r\n node.fy = relY;\r\n }\r\n\r\n // Restore interactive forces for dragging\r\n if (this.simulation) {\r\n const linkForce = this.simulation.force('link');\r\n if (linkForce) linkForce.strength((d: any) => this.getRuntimeLinkStrength(d as ForceChipLink));\r\n const collideForce = this.simulation.force('collide');\r\n if (collideForce) collideForce.strength(1.0);\r\n const xTarget = this.simulation.force('xTarget');\r\n if (xTarget) xTarget.strength((d: ForceChipNode) => d.group === 'shared' ? 0.12 : 0.05);\r\n const yTarget = this.simulation.force('yTarget');\r\n if (yTarget) yTarget.strength(0.05);\r\n }\r\n\r\n // Pull connected chips toward the dragged node\r\n this.updateAttractionForce(node);\r\n\r\n // Wake up the simulation target to keep it highly active during drag\r\n this.simulation.alphaTarget(0.28).restart();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n @HostListener('document:touchmove', ['$event'])\r\n onDocumentDragMove(event: MouseEvent | TouchEvent): void {\r\n if (!this.isDragging || !this.draggedNode) return;\r\n\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n\r\n const touchEvent = event as TouchEvent;\r\n const mouseEvent = event as MouseEvent;\r\n const isTouch = !!(touchEvent.touches && touchEvent.touches.length);\r\n const clientX = isTouch ? touchEvent.touches[0].clientX : mouseEvent.clientX;\r\n const clientY = isTouch ? touchEvent.touches[0].clientY : mouseEvent.clientY;\r\n\r\n const rect = this.chipsGrid.nativeElement.getBoundingClientRect();\r\n const scrollTop = this.chipsGrid.nativeElement.scrollTop;\r\n\r\n // Clamp dragged position so chip can't go off-edge (same estimate used in layout pass).\r\n const charWidth = this.chipFontSizePx * 0.53;\r\n const halfW = (this.draggedNode.label.length * charWidth + this.chipPaddingXPx * 2) / 2;\r\n const edgePad = 20;\r\n const relX = clientX - rect.left;\r\n const relY = clientY - rect.top + scrollTop;\r\n const fallbackMinX = halfW + edgePad;\r\n const fallbackMaxX = rect.width - halfW - edgePad;\r\n const fallbackMinY = 30;\r\n const fallbackMaxY = Math.max(fallbackMinY, this.forceCanvasHeight - 30);\r\n const bounds = this.nodeDragBounds.get(this.draggedNode.id);\r\n const minX = bounds?.minX ?? fallbackMinX;\r\n const maxX = bounds?.maxX ?? fallbackMaxX;\r\n const minY = bounds?.minY ?? fallbackMinY;\r\n const maxY = bounds?.maxY ?? fallbackMaxY;\r\n\r\n const clampedX = Math.max(minX, Math.min(maxX, relX));\r\n const clampedY = Math.max(minY, Math.min(maxY, relY));\r\n this.draggedNode.fx = clampedX;\r\n this.draggedNode.fy = clampedY;\r\n\r\n // Keep active force simulation running\r\n this.simulation.alpha(0.3).restart();\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n @HostListener('document:touchend')\r\n onDocumentDragEnd(): void {\r\n if (!this.isDragging || !this.draggedNode) return;\r\n\r\n // Release the node. Clear fx and fy so it is no longer pinned to the mouse\r\n this.draggedNode.fx = undefined;\r\n this.draggedNode.fy = undefined;\r\n\r\n // Keep baseline similarity attraction and restoring forces active after drag release.\r\n this.simulation.force('attraction', null);\r\n\r\n if (this.simulation) {\r\n const linkForce = this.simulation.force('link');\r\n if (linkForce) linkForce.strength((d: any) => this.getRuntimeLinkStrength(d as ForceChipLink));\r\n const collideForce = this.simulation.force('collide');\r\n if (collideForce) collideForce.strength(1.0);\r\n\r\n const xTarget = this.simulation.force('xTarget');\r\n if (xTarget) xTarget.strength((d: ForceChipNode) => d.group === 'shared' ? 0.12 : 0.045);\r\n const yTarget = this.simulation.force('yTarget');\r\n if (yTarget) yTarget.strength(0.045);\r\n }\r\n\r\n // Cool down simulation targets\r\n this.simulation.alphaTarget(0);\r\n this.simulation.alpha(0.4).restart();\r\n\r\n this.draggedNode = null;\r\n this.isDragging = false;\r\n }\r\n}\r\n","<div class=\"configure-backend-message\" *ngIf=\"!backendConfigured\">\r\n Configure backend\r\n</div>\r\n\r\n<div class=\"profile-screen\" *ngIf=\"backendConfigured\">\r\n <div #profileFlex class=\"profile-flex\" [class.fade-all]=\"fadeAllEdges\">\r\n <svg class=\"image-noise-overlay\" style=\"position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; overflow: hidden; z-index: 0;\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 320\" fill=\"none\" preserveAspectRatio=\"none\">\r\n <g filter=\"url(#filter0_n_1_1753)\">\r\n <rect width=\"100%\" height=\"100%\" fill=\"url(#paint0_radial_1_1753)\" fill-opacity=\"0.33\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_n_1_1753\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\" filterUnits=\"objectBoundingBox\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\r\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.10869565606117249 0.10869565606117249\" stitchTiles=\"stitch\" numOctaves=\"3\" result=\"noise\" seed=\"7339\"/>\r\n <feColorMatrix in=\"noise\" type=\"luminanceToAlpha\" result=\"alphaNoise\"/>\r\n <feComponentTransfer in=\"alphaNoise\" result=\"coloredNoise1\">\r\n <feFuncA type=\"discrete\" tableValues=\"0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \"/>\r\n </feComponentTransfer>\r\n <feComposite operator=\"in\" in2=\"shape\" in=\"coloredNoise1\" result=\"noise1Clipped\"/>\r\n <feFlood flood-color=\"rgba(0, 0, 0, 0.25)\" result=\"color1Flood\"/>\r\n <feComposite operator=\"in\" in2=\"noise1Clipped\" in=\"color1Flood\" result=\"color1\"/>\r\n <feMerge result=\"effect1_noise_1_1753\">\r\n <feMergeNode in=\"shape\"/>\r\n <feMergeNode in=\"color1\"/>\r\n </feMerge>\r\n </filter>\r\n <radialGradient id=\"paint0_radial_1_1753\" cx=\"50%\" cy=\"50%\" r=\"50%\" fx=\"50%\" fy=\"50%\">\r\n <stop offset=\"0%\" stop-opacity=\"0\"/>\r\n <stop offset=\"100%\" stop-opacity=\"0.25\"/>\r\n </radialGradient>\r\n </defs>\r\n </svg>\r\n <div #profileImgLeft class=\"profile-img left\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user1Image\"\r\n alt=\"User 1\"\r\n [style.transform]=\"user1Transform\"\r\n [style.top]=\"user1Top\"\r\n [style.height]=\"user1Height\"\r\n [style.object-position]=\"user1ObjectPosition\"\r\n (load)=\"onUserImageLoad(1, $event)\"\r\n />\r\n </div>\r\n <div #profileImgRight class=\"profile-img right\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user2Image\"\r\n alt=\"User 2\"\r\n [style.transform]=\"user2Transform\"\r\n [style.top]=\"user2Top\"\r\n [style.height]=\"user2Height\"\r\n [style.object-position]=\"user2ObjectPosition\"\r\n (load)=\"onUserImageLoad(2, $event)\"\r\n />\r\n </div>\r\n <div class=\"image-shade-overlay\"></div>\r\n\r\n <!-- Frosted Glass Overlay Layer -->\r\n <div class=\"overlay-container\">\r\n <!-- Top Headers — absolutely positioned overlays, exactly as original -->\r\n <div class=\"header-label left\">{{ person1Name }}</div>\r\n <div class=\"header-label center\">Shared</div>\r\n <div class=\"header-label right\">{{ person2Name }}</div>\r\n\r\n <!-- Force-directed chip canvas (scrollable) -->\r\n <div class=\"chips-grid\" #chipsGrid>\r\n <div class=\"force-canvas\" [style.height.px]=\"forceCanvasHeight\">\r\n <!-- SVG Connections Layer -->\r\n <svg class=\"connections-svg\" [style.height.px]=\"forceCanvasHeight\">\r\n <line\r\n *ngFor=\"let link of sortedForceLinks\"\r\n [attr.x1]=\"getLinkSourceX(link)\"\r\n [attr.y1]=\"getLinkSourceY(link)\"\r\n [attr.x2]=\"getLinkTargetX(link)\"\r\n [attr.y2]=\"getLinkTargetY(link)\"\r\n class=\"connection-line\"\r\n [class.active]=\"isLinkConnectedToActive(link)\"\r\n [class.cross-group]=\"isCrossGroupLink(link)\"\r\n ></line>\r\n </svg>\r\n\r\n <div\r\n *ngFor=\"let node of forceNodes\"\r\n class=\"frosted-chip\"\r\n [class.person-a]=\"node.group === 'p1'\"\r\n [class.shared]=\"node.group === 'shared'\"\r\n [class.person-b]=\"node.group === 'p2'\"\r\n [class.active]=\"activeNode === node\"\r\n [class.dimmed]=\"activeNode && !isNodeConnected(node)\"\r\n [style.left.px]=\"node.x\"\r\n [style.top.px]=\"node.y\"\r\n [style.padding]=\"chipPaddingYPx + 'px ' + chipPaddingXPx + 'px'\"\r\n (mouseenter)=\"onNodeMouseEnter(node)\"\r\n (mouseleave)=\"onNodeMouseLeave(node)\"\r\n (click)=\"onNodeClick(node, $event)\"\r\n (mousedown)=\"onNodeDragStart(node, $event)\"\r\n (touchstart)=\"onNodeDragStart(node, $event)\"\r\n >\r\n <span\r\n class=\"chip-label\"\r\n [style.font-size.px]=\"chipFontSizePx\"\r\n [style.line-height]=\"chipLineHeight\"\r\n >{{ node.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Actions -->\r\n <div class=\"view-profile left\" (click)=\"onViewProfile('left')\">View Profile</div>\r\n <div class=\"view-profile right\" (click)=\"onViewProfile('right')\">View Profile</div>\r\n </div>\r\n\r\n <!-- Loading indicator for alignment process -->\r\n <div *ngIf=\"isAligning\" class=\"loading-indicator\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n</div>\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ProfileComparisonLibComponent } from './profile-comparison-lib.component';\r\nimport { ProfileComparisonBackendService } from './services';\r\n\r\n@NgModule({\r\n declarations: [\r\n ProfileComparisonLibComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [\r\n ProfileComparisonLibComponent\r\n ],\r\n providers: [\r\n ProfileComparisonBackendService\r\n ]\r\n})\r\nexport class ProfileComparisonLibModule { }\r\n","/*\n * Public API Surface of profile-comparison-lib\n */\n\nexport * from './lib/profile-comparison-lib.component';\nexport * from './lib/profile-comparison-lib.module';\nexport * from './lib/services';\nexport * from './lib/interfaces';\nexport {\n BackendMode,\n BACKEND_MODE_URLS,\n resolveBackendUrl,\n PROFILE_COMPARISON_API_BASE_URL,\n PROFILE_COMPARISON_VERBOSE_LOGGING,\n} from './lib/tokens';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap","map","i2.CachePersistenceService","tap","catchError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"naniteninja-profile-comparison-lib.mjs","sources":["../../../projects/profile-comparison-lib/src/lib/tokens.ts","../../../projects/profile-comparison-lib/src/lib/services/cache-persistence.service.ts","../../../projects/profile-comparison-lib/src/lib/services/file-conversion.service.ts","../../../projects/profile-comparison-lib/src/lib/services/image-compression.service.ts","../../../projects/profile-comparison-lib/src/lib/services/openai-embedding.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile-comparison-lib.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile.service.ts","../../../projects/profile-comparison-lib/src/lib/services/profile-comparison-backend.service.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.ts","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.component.html","../../../projects/profile-comparison-lib/src/lib/profile-comparison-lib.module.ts","../../../projects/profile-comparison-lib/src/public-api.ts","../../../projects/profile-comparison-lib/src/naniteninja-profile-comparison-lib.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Backend mode for the profile comparison component. */\r\nexport enum BackendMode {\r\n /** Use the real deployed backend (default). */\r\n Real = 0,\r\n /** Use a local mock server at localhost:44101. */\r\n Mock = 1,\r\n}\r\n\r\nexport const PROFILE_COMPARISON_PROD_API_BASE_URL = 'https://api.test.thecyrano.app/api/profile-comparison/api';\r\nexport const PROFILE_COMPARISON_LOCAL_API_BASE_URL = 'http://localhost:44101/api';\r\n\r\nfunction isLocalBrowserRuntime(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const hostname = window.location?.hostname?.toLowerCase() ?? '';\r\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '0.0.0.0';\r\n}\r\n\r\nexport function resolveDefaultRealBackendUrl(): string {\r\n return isLocalBrowserRuntime()\r\n ? PROFILE_COMPARISON_LOCAL_API_BASE_URL\r\n : PROFILE_COMPARISON_PROD_API_BASE_URL;\r\n}\r\n\r\nexport const BACKEND_MODE_URLS: Record<BackendMode, string> = {\r\n [BackendMode.Real]: resolveDefaultRealBackendUrl(),\r\n [BackendMode.Mock]: PROFILE_COMPARISON_LOCAL_API_BASE_URL,\r\n};\r\n\r\n/** Either a static base URL or a getter that returns the current base URL (for runtime toggle). */\r\nexport type ProfileComparisonApiBaseUrl = string | (() => string | null);\r\n\r\n/**\r\n * Legacy injection token for the backend base URL.\r\n * Prefer using the [backendMode] or [backendUrl] @Input on the component instead.\r\n * Kept for backward compatibility — lowest priority when resolving the URL.\r\n */\r\nexport const PROFILE_COMPARISON_API_BASE_URL = new InjectionToken<ProfileComparisonApiBaseUrl | null>(\r\n 'PROFILE_COMPARISON_API_BASE_URL'\r\n);\r\n\r\n/** Optional getter: when true, lib and backend service log steps to console for diagnosis. */\r\nexport const PROFILE_COMPARISON_VERBOSE_LOGGING = new InjectionToken<() => boolean>(\r\n 'PROFILE_COMPARISON_VERBOSE_LOGGING'\r\n);\r\n\r\n/**\r\n * Resolves the active backend URL from inputs, with fallback to injection token.\r\n *\r\n * Priority:\r\n * 1. Explicit backendUrl (custom URL string)\r\n * 2. BackendMode enum (Real or Mock)\r\n * 3. Legacy PROFILE_COMPARISON_API_BASE_URL token\r\n */\r\nexport function resolveBackendUrl(\r\n backendUrl: string | null | undefined,\r\n backendMode: BackendMode,\r\n legacyTokenUrl: string | null | undefined,\r\n): string | null {\r\n if (backendUrl != null && backendUrl.trim().length > 0) {\r\n return backendUrl.trim();\r\n }\r\n const modeUrl = BACKEND_MODE_URLS[backendMode];\r\n if (modeUrl) {\r\n return modeUrl;\r\n }\r\n if (legacyTokenUrl != null && legacyTokenUrl.trim().length > 0) {\r\n return legacyTokenUrl.trim();\r\n }\r\n return null;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nconst DB_NAME = 'profile-comparison-cache';\r\nconst DB_VERSION = 1;\r\nconst STORE_OPENAI_SPACER = 'openai-spacer';\r\nconst STORE_OPENAI_ALIGNMENT = 'openai-alignment';\r\nconst STORE_OPENAI_SIMILARITY = 'openai-similarity';\r\nconst STORE_OPENAI_EMBEDDINGS = 'openai-embeddings';\r\nconst STORE_PROFILE_FACE = 'profile-face';\r\nconst STORE_PROFILE_COMPARE = 'profile-compare';\r\n\r\nconst STORE_NAMES = [\r\n STORE_OPENAI_SPACER,\r\n STORE_OPENAI_ALIGNMENT,\r\n STORE_OPENAI_SIMILARITY,\r\n STORE_OPENAI_EMBEDDINGS,\r\n STORE_PROFILE_FACE,\r\n STORE_PROFILE_COMPARE\r\n] as const;\r\n\r\nexport type CacheStoreName = typeof STORE_NAMES[number];\r\n\r\n/**\r\n * Persists cache entries to IndexedDB per device (mobile-friendly).\r\n * No-op when IndexedDB is unavailable (e.g. SSR, private mode on some browsers).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class CachePersistenceService {\r\n private db: IDBDatabase | null = null;\r\n private openPromise: Promise<IDBDatabase | null> | null = null;\r\n\r\n private openDb(): Promise<IDBDatabase | null> {\r\n if (typeof indexedDB === 'undefined') return Promise.resolve(null);\r\n if (this.db) return Promise.resolve(this.db);\r\n if (this.openPromise) return this.openPromise;\r\n this.openPromise = new Promise<IDBDatabase | null>((resolve) => {\r\n try {\r\n const req = indexedDB.open(DB_NAME, DB_VERSION);\r\n req.onerror = () => resolve(null);\r\n req.onsuccess = () => {\r\n this.db = req.result;\r\n resolve(this.db);\r\n };\r\n req.onupgradeneeded = (e) => {\r\n const db = (e.target as IDBOpenDBRequest).result;\r\n STORE_NAMES.forEach((name) => {\r\n if (!db.objectStoreNames.contains(name)) db.createObjectStore(name);\r\n });\r\n };\r\n } catch {\r\n resolve(null);\r\n }\r\n });\r\n return this.openPromise;\r\n }\r\n\r\n private getStore(storeName: CacheStoreName, mode: IDBTransactionMode = 'readonly'): Promise<IDBObjectStore | null> {\r\n return this.openDb().then((db) => {\r\n if (!db) return null;\r\n try {\r\n return db.transaction(storeName, mode).objectStore(storeName);\r\n } catch {\r\n return null;\r\n }\r\n });\r\n }\r\n\r\n get<T>(storeName: CacheStoreName, key: string): Promise<T | undefined> {\r\n return this.openDb().then((db) => {\r\n if (!db) return undefined;\r\n return new Promise<T | undefined>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const store = tx.objectStore(storeName);\r\n const req = store.get(key);\r\n req.onsuccess = () => resolve(req.result ?? undefined);\r\n req.onerror = () => resolve(undefined);\r\n } catch {\r\n resolve(undefined);\r\n }\r\n });\r\n });\r\n }\r\n\r\n set(storeName: CacheStoreName, key: string, value: unknown): Promise<void> {\r\n return this.openDb().then((db) => {\r\n if (!db) return;\r\n return new Promise<void>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readwrite');\r\n const store = tx.objectStore(storeName);\r\n store.put(value, key);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => resolve();\r\n } catch {\r\n resolve();\r\n }\r\n });\r\n });\r\n }\r\n\r\n getAll(storeName: CacheStoreName): Promise<[string, unknown][]> {\r\n return this.openDb().then((db) => {\r\n if (!db) return [];\r\n return new Promise<[string, unknown][]>((resolve) => {\r\n try {\r\n const tx = db.transaction(storeName, 'readonly');\r\n const store = tx.objectStore(storeName);\r\n const req = store.openCursor();\r\n const entries: [string, unknown][] = [];\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (cursor) {\r\n entries.push([cursor.key as string, cursor.value]);\r\n cursor.continue();\r\n } else {\r\n resolve(entries);\r\n }\r\n };\r\n req.onerror = () => resolve([]);\r\n } catch {\r\n resolve([]);\r\n }\r\n });\r\n });\r\n }\r\n\r\n clear(storeName?: CacheStoreName): Promise<void> {\r\n return this.openDb().then((db) => {\r\n if (!db) return;\r\n const stores = storeName ? [storeName] : [...STORE_NAMES];\r\n return Promise.all(\r\n stores.map(\r\n (s) =>\r\n new Promise<void>((resolve) => {\r\n try {\r\n const tx = db.transaction(s, 'readwrite');\r\n tx.objectStore(s).clear();\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => resolve();\r\n } catch {\r\n resolve();\r\n }\r\n })\r\n )\r\n ).then(() => undefined);\r\n });\r\n }\r\n\r\n static readonly STORE_OPENAI_SPACER = STORE_OPENAI_SPACER;\r\n static readonly STORE_OPENAI_ALIGNMENT = STORE_OPENAI_ALIGNMENT;\r\n static readonly STORE_OPENAI_SIMILARITY = STORE_OPENAI_SIMILARITY;\r\n static readonly STORE_OPENAI_EMBEDDINGS = STORE_OPENAI_EMBEDDINGS;\r\n static readonly STORE_PROFILE_FACE = STORE_PROFILE_FACE;\r\n static readonly STORE_PROFILE_COMPARE = STORE_PROFILE_COMPARE;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, from, map, switchMap, of } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FileConversionService {\r\n private static readonly MIME_TYPE_JPEG = 'image/jpeg';\r\n private static readonly MIME_TYPE_PNG = 'image/png';\r\n private static readonly MIME_TYPE_WEBP = 'image/webp';\r\n private static readonly FILE_EXTENSION_JPG = '.jpg';\r\n private static readonly FILE_EXTENSION_JPEG = '.jpeg';\r\n private static readonly FILE_EXTENSION_PNG = '.png';\r\n private static readonly FILE_EXTENSION_WEBP = '.webp';\r\n\r\n urlToFile(url: string, fileName: string, mimeType: string): Observable<File> {\r\n return from(fetch(url)).pipe(\r\n switchMap(response => from(response.blob())),\r\n map(blob => new File([blob], fileName, { type: mimeType }))\r\n );\r\n }\r\n\r\n fetchUrlToDataUrl(url: string): Observable<string> {\r\n return new Observable<string>(observer => {\r\n // Try fetch first (works for CORS-enabled URLs)\r\n fetch(url)\r\n .then(response => response.blob())\r\n .then(blob => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = () => {\r\n // Fallback to Image + canvas if FileReader fails\r\n this.loadImageViaCanvas(url).subscribe({\r\n next: dataUrl => {\r\n observer.next(dataUrl);\r\n observer.complete();\r\n },\r\n error: err => observer.error(err)\r\n });\r\n };\r\n reader.readAsDataURL(blob);\r\n })\r\n .catch(() => {\r\n // Fetch failed (likely CORS), fallback to Image + canvas\r\n this.loadImageViaCanvas(url).subscribe({\r\n next: dataUrl => {\r\n observer.next(dataUrl);\r\n observer.complete();\r\n },\r\n error: err => observer.error(err)\r\n });\r\n });\r\n });\r\n }\r\n\r\n private loadImageViaCanvas(url: string): Observable<string> {\r\n return new Observable<string>(observer => {\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.naturalWidth;\r\n canvas.height = img.naturalHeight;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n observer.error(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n ctx.drawImage(img, 0, 0);\r\n try {\r\n const dataUrl = canvas.toDataURL('image/jpeg', 0.92);\r\n observer.next(dataUrl);\r\n observer.complete();\r\n } catch (err) {\r\n observer.error(err);\r\n }\r\n };\r\n img.onerror = () => observer.error(new Error('Failed to load image'));\r\n img.src = url;\r\n });\r\n }\r\n\r\n isDataUrl(str: string): boolean {\r\n return typeof str === 'string' && str.startsWith('data:');\r\n }\r\n\r\n dataUrlToFile(dataUrl: string, fileName: string): File {\r\n const [header, data] = dataUrl.split(',');\r\n const mimeMatch = header.match(/data:(.*?);/);\r\n const mime = mimeMatch ? mimeMatch[1] : FileConversionService.MIME_TYPE_PNG;\r\n const binary = atob(data || '');\r\n const len = binary.length;\r\n const u8 = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) u8[i] = binary.charCodeAt(i);\r\n return new File([u8], fileName, { type: mime });\r\n }\r\n\r\n getMimeFromFilename(fileName: string): string {\r\n const lower = (fileName || '').toLowerCase();\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_JPG) || lower.endsWith(FileConversionService.FILE_EXTENSION_JPEG)) return FileConversionService.MIME_TYPE_JPEG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_PNG)) return FileConversionService.MIME_TYPE_PNG;\r\n if (lower.endsWith(FileConversionService.FILE_EXTENSION_WEBP)) return FileConversionService.MIME_TYPE_WEBP;\r\n return FileConversionService.MIME_TYPE_PNG;\r\n }\r\n\r\n getFileForImageString(imageStr: string, fileBaseName: string): Observable<File> {\r\n if (this.isDataUrl(imageStr)) return of(this.dataUrlToFile(imageStr, fileBaseName));\r\n const mime = this.getMimeFromFilename(imageStr);\r\n return this.urlToFile(imageStr, fileBaseName, mime);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { IImageCompressionConfig } from '../interfaces';\r\nimport { Observable, from, of, map, switchMap } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ImageCompressionService {\r\n compressImageFile(file: File, config: IImageCompressionConfig, overrides: Partial<IImageCompressionConfig> = {}): Observable<{ file: File; dataUrl: string }> {\r\n const cfg = { ...config, ...overrides } as IImageCompressionConfig;\r\n\r\n return this.loadImageFromFile(file).pipe(\r\n switchMap((img) => {\r\n let width = img.naturalWidth || img.width;\r\n let height = img.naturalHeight || img.height;\r\n const scale = Math.min(cfg.maxWidth / width, cfg.maxHeight / height, 1);\r\n width = Math.max(1, Math.round(width * scale));\r\n height = Math.max(1, Math.round(height * scale));\r\n\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n const render = (w: number, h: number) => {\r\n canvas.width = w;\r\n canvas.height = h;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.drawImage(img, 0, 0, w, h);\r\n };\r\n\r\n const process = (w: number, h: number, q: number, attempts: number): Observable<Blob> => {\r\n render(w, h);\r\n return this.canvasToBlob(canvas, cfg.format, q).pipe(\r\n switchMap((blob) => {\r\n if (blob.size > cfg.maxBytes && attempts < 25) {\r\n if (q > cfg.qualityMin + 0.005) {\r\n return process(w, h, Math.max(cfg.qualityMin, q - cfg.qualityStep), attempts + 1);\r\n } else {\r\n const nextW = Math.max(Math.round(w * cfg.downscaleStep), cfg.minWidth);\r\n const nextH = Math.max(Math.round(h * cfg.downscaleStep), cfg.minHeight);\r\n if (nextW === w && nextH === h) return of(blob);\r\n return process(nextW, nextH, cfg.qualityStart, attempts + 1);\r\n }\r\n }\r\n return of(blob);\r\n })\r\n );\r\n };\r\n\r\n return process(width, height, cfg.qualityStart, 0).pipe(\r\n switchMap((finalBlob: Blob) => {\r\n const newName = this.renameFileForFormat(file.name, cfg.format);\r\n const compressedFile = new File([finalBlob], newName, { type: cfg.format, lastModified: Date.now() });\r\n return this.blobToDataURL(finalBlob).pipe(\r\n map((dataUrl) => ({ file: compressedFile, dataUrl }))\r\n );\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n loadImageFromFile(file: File): Observable<HTMLImageElement> {\r\n return new Observable(observer => {\r\n const url = URL.createObjectURL(file);\r\n const img = new Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n observer.next(img);\r\n observer.complete();\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n observer.error(new Error('Failed to load image'));\r\n };\r\n img.src = url;\r\n });\r\n }\r\n\r\n canvasToBlob(canvas: HTMLCanvasElement, type: string, quality: number): Observable<Blob> {\r\n return new Observable(observer => {\r\n if (canvas.toBlob) {\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n observer.next(blob);\r\n observer.complete();\r\n } else {\r\n observer.error(new Error('toBlob null'));\r\n }\r\n }, type, quality);\r\n } else {\r\n try {\r\n const dataUrl = canvas.toDataURL(type, quality);\r\n const base64 = dataUrl.split(',')[1] || '';\r\n const binary = atob(base64);\r\n const u8 = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) u8[i] = binary.charCodeAt(i);\r\n observer.next(new Blob([u8], { type }));\r\n observer.complete();\r\n } catch (e) {\r\n observer.error(e);\r\n }\r\n }\r\n });\r\n }\r\n\r\n blobToDataURL(blob: Blob): Observable<string> {\r\n return new Observable(observer => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n observer.next(String(reader.result));\r\n observer.complete();\r\n };\r\n reader.onerror = (err) => observer.error(err);\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n\r\n renameFileForFormat(name: string, mime: string): string {\r\n const base = name.substring(0, name.lastIndexOf('.')) || name;\r\n if (mime === 'image/jpeg') return `${base}.jpg`;\r\n if (mime === 'image/png') return `${base}.png`;\r\n if (mime === 'image/webp') return `${base}.webp`;\r\n return `${base}.jpg`;\r\n }\r\n}\r\n","import { Injectable, Optional, Inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError, of, BehaviorSubject, from } from 'rxjs';\nimport { map, catchError, switchMap, tap } from 'rxjs/operators';\nimport { IAlignmentRow, IOpenAIResponse, IOpenAIEmbeddingItem } from '../interfaces';\nimport { PROFILE_COMPARISON_API_BASE_URL } from '../tokens';\nimport { CachePersistenceService } from './cache-persistence.service';\n\n/**\n * OpenAI Alignment Service\n * Uses OpenAI Chat Completions API to align two lists of text in a single request.\n * This replaces the previous embedding-based approach to avoid rate limits and reduce complexity.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class OpenAIEmbeddingService {\n private static readonly API_URL = 'https://api.openai.com/v1/chat/completions';\n private static readonly MODEL = 'gpt-4o';\n private static readonly HEADER_CONTENT_TYPE = 'Content-Type';\n private static readonly HEADER_AUTHORIZATION = 'Authorization';\n private static readonly CONTENT_TYPE_JSON = 'application/json';\n private static readonly BEARER_PREFIX = 'Bearer ';\n private static readonly SPACER_SMALL = '-';\n private static readonly SPACER_LARGE = '----';\n\n private readonly API_URL = OpenAIEmbeddingService.API_URL;\n // Using gpt-4o for maximum intelligence and adherence to complex instructions\n private readonly MODEL = OpenAIEmbeddingService.MODEL;\n \n // Cache for alignment results\n // Key: Canonical hash of two lists\n // Value: { originalA: string[], originalB: string[], rows: IAlignmentRow[] }\n private alignmentCache = new Map<string, { originalA: string[], originalB: string[], rows: IAlignmentRow[] }>();\n \n // Cache for new spacer-based alignment\n private spacerAlignmentCache = new Map<string, { listA: string[], listB: string[] }>();\n\n // Cache for similarity (textA, textB) -> score\n private similarityCache = new Map<string, number>();\n // Cache for embeddings: JSON.stringify(texts) -> number[][]\n private embeddingsCache = new Map<string, number[][]>();\n\n private spacerLoaded = false;\n private alignmentLoaded = false;\n private similarityLoaded = false;\n private embeddingsLoaded = false;\n private spacerLoadPromise: Promise<void> | null = null;\n private alignmentLoadPromise: Promise<void> | null = null;\n private similarityLoadPromise: Promise<void> | null = null;\n private embeddingsLoadPromise: Promise<void> | null = null;\n\n public rawResponse$ = new BehaviorSubject<string>('');\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PROFILE_COMPARISON_API_BASE_URL) private apiBaseUrl: import('../tokens').ProfileComparisonApiBaseUrl | null,\n private persistence: CachePersistenceService\n ) {}\n\n private loadSpacerCache(): Promise<void> {\n if (this.spacerLoaded) return Promise.resolve();\n if (!this.spacerLoadPromise) {\n this.spacerLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_SPACER).then((entries) => {\n entries.forEach(([k, v]) => this.spacerAlignmentCache.set(k, v as { listA: string[]; listB: string[] }));\n this.spacerLoaded = true;\n });\n }\n return this.spacerLoadPromise;\n }\n\n private loadAlignmentCache(): Promise<void> {\n if (this.alignmentLoaded) return Promise.resolve();\n if (!this.alignmentLoadPromise) {\n this.alignmentLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_ALIGNMENT).then((entries) => {\n entries.forEach(([k, v]) => this.alignmentCache.set(k, v as { originalA: string[]; originalB: string[]; rows: IAlignmentRow[] }));\n this.alignmentLoaded = true;\n });\n }\n return this.alignmentLoadPromise;\n }\n\n private loadSimilarityCache(): Promise<void> {\n if (this.similarityLoaded) return Promise.resolve();\n if (!this.similarityLoadPromise) {\n this.similarityLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_SIMILARITY).then((entries) => {\n entries.forEach(([k, v]) => this.similarityCache.set(k, v as number));\n this.similarityLoaded = true;\n });\n }\n return this.similarityLoadPromise;\n }\n\n private loadEmbeddingsCache(): Promise<void> {\n if (this.embeddingsLoaded) return Promise.resolve();\n if (!this.embeddingsLoadPromise) {\n this.embeddingsLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_OPENAI_EMBEDDINGS).then((entries) => {\n entries.forEach(([k, v]) => this.embeddingsCache.set(k, v as number[][]));\n this.embeddingsLoaded = true;\n });\n }\n return this.embeddingsLoadPromise;\n }\n\n private getBaseUrl(): string | null {\n const u = this.apiBaseUrl;\n if (u == null) return null;\n return typeof u === 'function' ? u() : u;\n }\n\n /**\n * Get aligned lists with spacers.\n * Now uses a direct LLM call with a specific prompt to generate the aligned lists.\n */\n getAlignedLists(\n listA: string[],\n listB: string[],\n apiKey: string\n ): Observable<{ listA: string[], listB: string[] }> {\n \n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n\n if (validA.length === 0 && validB.length === 0) return of({ listA: [], listB: [] });\n\n const key = JSON.stringify({ a: validA, b: validB, v: 'spacer-v35' });\n\n return from(this.loadSpacerCache()).pipe(\n switchMap(() => {\n if (this.spacerAlignmentCache.has(key)) {\n console.log('Alignment cache hit');\n return of(this.spacerAlignmentCache.get(key)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/align-lists`;\n return this.http\n .post<{ listA: string[]; listB: string[] }>(url, { listA: validA, listB: validB }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((result) => {\n const finalResult = { listA: result.listA || [], listB: result.listB || [] };\n this.spacerAlignmentCache.set(key, finalResult);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SPACER, key, finalResult);\n if (result.listA?.length && result.listB?.length) {\n this.rawResponse$.next(JSON.stringify(result));\n }\n return finalResult;\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('Backend align-lists error:', error);\n return of({ listA: [], listB: [] });\n })\n );\n }\n\n return this.requestAlignedListsDirect(validA, validB, key, apiKey);\n })\n );\n }\n\n private requestAlignedListsDirect(\n validA: string[],\n validB: string[],\n key: string,\n apiKey: string\n ): Observable<{ listA: string[]; listB: string[] }> {\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const prompt = `\n You are an expert semantic alignment engine.\n Task: Align the items from List A to List B based on semantic similarity.\n Context: This is a heuristic, human-semantic alignment (use embeddings later if you want it algorithmically strict).\n \n List A: ${JSON.stringify(validA)}\n List B: ${JSON.stringify(validB)}\n\n SEMANTIC STRATEGY (3-PASS PROCESS):\n 1. **Pass 1: Exact & Strong Matches**: First, lock in all exact synonyms (e.g., \"Dog\" vs \"Puppy\") and strong category matches (e.g., \"Tennis\" vs \"Badminton\"). These are your anchors.\n 2. **Pass 2: Thematic Clustering**: Next, group remaining items by sub-theme (e.g., \"Water Sports\", \"Asian Cuisine\"). Align items within these themes even if they aren't perfect pairs.\n 3. **Pass 3: Contextual & Loose Matches**: Look for looser associations (e.g., \"Reading\" vs \"Library\").\n 4. **Isolation**: If an item truly has NO relation to anything remaining in the other list, ISOLATE it using \"----\". Do NOT force a bad match.\n\n Rules:\n 1. Align items into clusters with variable dash-gaps to show semantic distance.\n 2. Use \"-\" for a small hop (related but distinct).\n 3. Use \"----\" for a hard theme switch (different category).\n 4. You MUST reorder items to create the best semantic clusters.\n 5. Ensure the output arrays \"listA\" and \"listB\" have the SAME length.\n 6. If an item has no match, align it with \"-\" or \"----\" as appropriate, or just a gap.\n 7. Output MUST be a JSON object with \"listA\" and \"listB\".\n 8. **COMPLETENESS**: You MUST include EVERY item from the input List A and List B in the output. Do not omit any items.\n 9. **Handling Leftovers**: If you have items left over at the end that don't match well, still include them in the list, aligned with \"-\" if necessary, or grouped together if they are somewhat related.\n 10. **Spacer Alignment**: You MUST align \"----\" with \"----\" in both lists. Do NOT align a hard switch \"----\" with a word. If you need a switch on one side, put it on the other side too.\n 11. **Strict Side Adherence**: Items from Input List A MUST ONLY appear in Output List A. Items from Input List B MUST ONLY appear in Output List B. Do not mix them up.\n 12. **Mandatory Spacers**: You MUST insert a spacer (\"-\" or \"----\") between clusters of related items. Avoid putting \"----\" between every single item; use it only when the topic truly shifts.\n 13. **NO TRAILING SPACER**: The last item in both lists MUST be a word. Do NOT put a spacer at the very end.\n 14. **Length Mismatch Handling**: If one list is shorter than the other, you MUST fill the empty slots in the shorter list with spacers (\"-\") ONLY. DO NOT invent words or reuse words to fill the space.\n 15. **HIGH SIMILARITY CONSOLIDATION (>= 0.8)**: This is CRITICAL for center display:\n - When you find a pair with VERY HIGH semantic similarity (>= 0.8), you MUST output the SAME TEXT in both listA and listB at that position.\n - **Key principle**: If the items are synonyms, very similar activities, or one is a specific type of the other, consolidate them!\n - **STRICT CONSTRAINT**: You can ONLY consolidate if BOTH items actually exist in the input lists and are semantically related.\n - **NEVER** invent an item for List B just to make a pair with List A. If List A has \"figma\" and List B has NOTHING related, output \"figma\" in List A and \"-\" in List B. DO NOT put \"figma\" in List B.\n - **STRICT SYMMETRY**: If you use the \"×\" symbol to consolidate, you MUST output the EXACT SAME string in BOTH \"listA\" and \"listB\" at that index.\n - This allows the system to automatically move these items to the center display!\n - **NEVER** use \"×\" on one side and a spacer on the other. That is a critical failure.\n - **NEVER** include similarity scores or any other numbers in the output strings unless they are part of the original item text.\n - **ONLY** use \"×\" as the separator for consolidated items. Do not use \"/\", \"&\", or other symbols for this purpose.\n - Example: \"Jogging\" (List A) + \"Running\" (List B) -> \"Jogging × Running\" in BOTH listA and listB.\n - **NEVER DROP CONSOLIDATED ITEMS**: If you consolidate \"Jogging\" and \"Running\" into \"Jogging × Running\", you MUST put this string in **BOTH** List A and List B. Do NOT put it in List A and a spacer in List B. That would delete \"Running\" from the output.\n - **CRITICAL ERROR PREVENTION**: Do NOT drop items from List B. If \"Running\" is in Input List B, it MUST appear in Output List B (either as \"Running\" or \"Jogging × Running\"). If you output \"Jogging × Running\" in List A but \"-\" in List B, you have FAILED.\n - **COMPLETENESS CHECK**: You MUST verify that EVERY item from the input lists is present in the output. If \"Running\" is in Input List B, it MUST be in Output List B (or consolidated). DO NOT DROP ITEMS.\n - **DETERMINISM**: Process the list from top to bottom. Do not change your output between runs.\n - This allows the system to automatically move these items to the center display!\n 16. Do not insert any new, inferred, or related words. Each pair must be created strictly from the existing list items only.\n\n NEGATIVE CONSTRAINTS:\n - NEVER put an item from List A into List B.\n - NEVER put an item from List B into List A.\n - NEVER invent new items. Only use items from the input lists.\n - **NEVER DUPLICATE ITEMS**. Each item from the input list must appear EXACTLY ONCE in the output.\n\n VERIFICATION STEP:\n Before outputting, verify every single item:\n - \"Is this item in Input List A?\" -> If yes, put it in Output List A.\n - \"Is this item in Input List B?\" -> If yes, put it in Output List B.\n - \"Is this item in neither?\" -> It is a hallucination. DELETE IT.\n\n CRITICAL: OUTPUT MUST CONTAIN EXACTLY THE SAME ITEMS AS INPUT. NO DELETIONS ALLOWED.\n\n FINAL SANITY CHECK:\n - **HALLUCINATION CHECK**: Go through every word in your Output List A. Is it EXACTLY present in Input List A? If not, DELETE IT. Do the same for List B.\n - **DUPLICATION CHECK**: Scan List A and List B. Does ANY word appear more than once? If so, DELETE the extra occurrences immediately. Each item must appear EXACTLY ONCE.\n - **COUNT CHECK**: Count the number of non-spacer items in your Output List A. Does it match the number of items in Input List A? If not, you are missing items. FIND THEM AND ADD THEM.\n - **COUNT CHECK**: Do the same for List B.\n - Look at your generated \"listA\". Are there any items that belong to Input List B? REMOVE THEM immediately.\n - Look at your generated \"listB\". Are there any items that belong to Input List A? REMOVE THEM immediately.\n - **Did you miss any items from Input List A? ADD THEM NOW.**\n - **Did you miss any items from Input List B? ADD THEM NOW.**\n - If you are unsure where an item belongs, check the Input Lists provided above. Do NOT guess.\n\n Example of Desired Output Logic:\n - \"Volunteering at animal shelter\" vs \"Dog training\" -> Related? Yes. Similarity >= 0.8? No (different activities)\n - NEXT PAIR: \"Trail biking\" vs \"Rock climbing\" -> Is this related to Animals? No. -> INSERT \"----\"\n - \"Trail biking\" vs \"Rock climbing\" -> Related? Yes (Outdoors).\n - NEXT PAIR: \"Jogging\" vs \"Running\" -> Similarity >= 0.8? YES! -> Output \"Jogging × Running\" in BOTH lists\n - \"Jogging\" vs \"Running\" -> Related? Yes (Exercise).\n - NEXT PAIR: \"Beach volleyball\" vs \"Salsa dancing\" -> Is this related to Exercise? Yes. -> INSERT \"-\" (Small hop)\n - \"Beach volleyball\" vs \"Salsa dancing\" -> Related? Yes (Hobbies). Similarity >= 0.8? No (different hobbies)\n - NEXT PAIR: \"Fermenting kimchi\" vs \"Korean cooking\" -> Is this related to Hobbies? No. -> INSERT \"----\"\n\n JSON Output Structure:\n {\n \"listA\": [\"Consolidated Item × Match\", \"----\", \"Unique Item A\", \"-\" , \"Unique Item A1\" , \"-\" , \"Unique Item A2\" ,\"----\" , \"Unique Item A3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item A5, \"----\" , Uniue Item A6 ],\n \"listB\": [\"Consolidated Item × Match\", \"----\", \"Unique Item B\", \"-\" , \"Unique Item B1\" , \"-\" , \"Unique Item B2\" ,\"----\" , \"Unique Item B3\", \"-\" , \"Unique Item A4 × Unique Item B4\" , \"----\" , Unique Item B5, \"----\" , - ]\n }\n Note: In this case, List A has more items, so the last remaining item is displayed as a single card.In other cases, List B may have more words, and in that situation, the extra word from List B is shown as a single card.\n Each unique item in List A has a corresponding unique item in List B that is highly similar in meaning or related in terms of concept. \n VARIATION & SIMILARITY CONTROL: Maintain strict consistency. If the same semantic relationship appears multiple times, align it identically every time.\n `;\n\n const body = {\n model: this.MODEL,\n messages: [\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\n { role: 'user', content: prompt }\n ],\n response_format: { type: 'json_object' },\n temperature: 0.0, // Zero temperature for maximum determinism\n seed: 42 // Fixed seed for reproducibility\n };\n\n return this.http.post<IOpenAIResponse>(this.API_URL, body, { headers }).pipe(\n map(response => {\n try {\n const content = response.choices[0].message.content;\n console.log('OpenAI LLM Output (getAlignedLists):', content);\n if (content) {\n this.rawResponse$.next(content);\n }\n const result = JSON.parse(content);\n \n // Handle both \"listA/listB\" format and \"alignment\" array format\n if (result.alignment && Array.isArray(result.alignment)) {\n result.listA = result.alignment.map((row: any) => row.left || row.itemA || '');\n result.listB = result.alignment.map((row: any) => row.right || row.itemB || '');\n }\n\n if (!result.listA || !result.listB || !Array.isArray(result.listA) || !Array.isArray(result.listB)) {\n console.error('Invalid JSON structure from OpenAI:', result);\n throw new Error('Invalid JSON structure from OpenAI');\n }\n\n // Just ensure equal length for safety in UI rendering\n const maxLen = Math.max(result.listA.length, result.listB.length);\n while (result.listA.length < maxLen) result.listA.push(OpenAIEmbeddingService.SPACER_SMALL);\n while (result.listB.length < maxLen) result.listB.push(OpenAIEmbeddingService.SPACER_SMALL);\n\n // Post-process to ensure consolidated items are in both lists\n // If one side has \"A × B\" and the other is a spacer, sync them to ensure center display\n for (let i = 0; i < result.listA.length; i++) {\n const a = result.listA[i];\n const b = result.listB[i];\n const isConsolidatedA = a && a.includes(' × ');\n const isConsolidatedB = b && b.includes(' × ');\n const isSpacerA = !a || a === OpenAIEmbeddingService.SPACER_SMALL || a === OpenAIEmbeddingService.SPACER_LARGE;\n const isSpacerB = !b || b === OpenAIEmbeddingService.SPACER_SMALL || b === OpenAIEmbeddingService.SPACER_LARGE;\n\n if (isConsolidatedA && isSpacerB) {\n result.listB[i] = a;\n } else if (isConsolidatedB && isSpacerA) {\n result.listA[i] = b;\n }\n }\n\n // SANITIZATION: Strictly enforce that items belong to their respective lists\n const sanitized = this.sanitizeResponse(result.listA, result.listB, validA, validB);\n\n const finalResult = { listA: sanitized.listA, listB: sanitized.listB };\n this.spacerAlignmentCache.set(key, finalResult);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SPACER, key, finalResult);\n return finalResult;\n } catch (e) {\n console.error('Failed to parse OpenAI response', e);\n throw new Error('Failed to parse alignment result');\n }\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('OpenAI API Error:', error);\n return of({ listA: [], listB: [] });\n })\n );\n }\n\n private sanitizeResponse(\n outA: string[], \n outB: string[], \n inA: string[], \n inB: string[]\n ): { listA: string[], listB: string[] } {\n const cleanA: string[] = [];\n const cleanB: string[] = [];\n \n // Track used items to identify missing ones later\n const usedA = new Set<string>();\n const usedB = new Set<string>();\n \n // Helper to check if a string contains an item (exact or consolidated)\n const containsItem = (str: string, item: string) => {\n const s = str.toLowerCase();\n const i = item.toLowerCase();\n return s === i || s.includes(`× ${i}`) || s.includes(`${i} ×`) || s.includes(`/ ${i}`) || s.includes(`${i} /`);\n };\n\n for (let i = 0; i < outA.length; i++) {\n let itemA = outA[i];\n let itemB = outB[i];\n \n const isSpacerA = !itemA || itemA === OpenAIEmbeddingService.SPACER_SMALL || itemA === OpenAIEmbeddingService.SPACER_LARGE;\n const isSpacerB = !itemB || itemB === OpenAIEmbeddingService.SPACER_SMALL || itemB === OpenAIEmbeddingService.SPACER_LARGE;\n\n // Validate Item A\n let validItemA = itemA;\n if (!isSpacerA) {\n // Check if it belongs to Input A\n const originalA = inA.find(a => containsItem(itemA, a));\n if (originalA) {\n usedA.add(originalA);\n } else {\n // It's not in Input A. Is it in Input B?\n if (inB.some(b => containsItem(itemA, b))) {\n // Hallucination! It belongs to B but is in A.\n validItemA = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\n } else {\n // Unknown item (maybe consolidated hallucination). Keep if it looks like a consolidated string, else remove\n if (!itemA.includes('×') && !itemA.includes('/')) {\n validItemA = OpenAIEmbeddingService.SPACER_SMALL;\n }\n }\n }\n }\n\n // Validate Item B\n let validItemB = itemB;\n if (!isSpacerB) {\n // Check if it belongs to Input B\n const originalB = inB.find(b => containsItem(itemB, b));\n if (originalB) {\n usedB.add(originalB);\n } else {\n // It's not in Input B. Is it in Input A?\n if (inA.some(a => containsItem(itemB, a))) {\n // Hallucination! It belongs to A but is in B.\n validItemB = OpenAIEmbeddingService.SPACER_SMALL; // Remove it\n } else {\n // Unknown item.\n if (!itemB.includes('×') && !itemB.includes('/')) {\n validItemB = OpenAIEmbeddingService.SPACER_SMALL;\n }\n }\n }\n }\n \n cleanA.push(validItemA);\n cleanB.push(validItemB);\n }\n\n // Restore Missing Items\n const missingA = inA.filter(a => !usedA.has(a));\n const missingB = inB.filter(b => !usedB.has(b));\n \n if (missingA.length > 0 || missingB.length > 0) {\n console.warn('Restoring missing items:', { missingA, missingB });\n \n // Add spacer to separate restored items\n if (cleanA.length > 0) {\n cleanA.push(OpenAIEmbeddingService.SPACER_LARGE);\n cleanB.push(OpenAIEmbeddingService.SPACER_LARGE);\n }\n \n // Append missing A items\n for (const a of missingA) {\n cleanA.push(a);\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n }\n \n // Append missing B items\n for (const b of missingB) {\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL);\n cleanB.push(b);\n cleanA.push(OpenAIEmbeddingService.SPACER_SMALL); // Spacer\n cleanB.push(OpenAIEmbeddingService.SPACER_SMALL);\n }\n }\n\n return { listA: cleanA, listB: cleanB };\n }\n\n /**\n * Get alignment between two lists using a single OpenAI Chat Completion request.\n * Uses canonical caching to ensure A->B and B->A use the same API response.\n */\n groupAlignLists(\n listA: string[],\n listB: string[],\n threshold: number = 0.25,\n preserveLeftOrder: boolean = true,\n exclusivityMargin: number = 0.06,\n leftCohesion: number = 0.23,\n apiKey: string\n ): Observable<IAlignmentRow[]> {\n \n // Filter valid items\n const validA = listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n const validB = listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL);\n\n if (validA.length === 0 && validB.length === 0) return of([]);\n\n const keyDirect = JSON.stringify({ a: validA, b: validB });\n const keyReverse = JSON.stringify({ a: validB, b: validA });\n\n return from(this.loadAlignmentCache()).pipe(\n switchMap(() => {\n if (this.alignmentCache.has(keyDirect)) {\n console.log('Alignment cache hit (Direct)');\n return of(this.alignmentCache.get(keyDirect)!.rows);\n }\n if (this.alignmentCache.has(keyReverse)) {\n console.log('Alignment cache hit (Reverse) - Swapping results');\n const cached = this.alignmentCache.get(keyReverse)!;\n const swappedRows = cached.rows.map(row => ({\n left: row.right,\n right: row.left,\n score: row.score\n }));\n return of(swappedRows);\n }\n\n return this.requestGroupAlignLists(validA, validB, listA, listB, keyDirect, apiKey);\n })\n );\n }\n\n private requestGroupAlignLists(\n validA: string[],\n validB: string[],\n listA: string[],\n listB: string[],\n keyDirect: string,\n apiKey: string\n ): Observable<IAlignmentRow[]> {\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n // Construct the prompt\n const prompt = `\n You are an expert semantic alignment engine.\n Task: Align the items from List A to List B based on semantic similarity.\n \n List A: ${JSON.stringify(validA)}\n List B: ${JSON.stringify(validB)}\n\n Rules:\n 1. Match items that are semantically similar.\n 2. Support One-to-One, One-to-Many, and Many-to-Many matches.\n 3. **CRITICAL**: Avoid duplicate alignments. If multiple items in List B are highly similar to a single item in List A, group them ALL under that single List A item.\n 4. **CONSISTENCY**: The alignment must be symmetric. If \"Mutton\" matches \"Chicken\" when \"Mutton\" is on the left, it MUST also match \"Chicken\" when \"Mutton\" is on the right.\n 5. **ORDER**: You MUST reorder the items from BOTH lists to create the best semantic clusters. Place related groups next to each other (e.g., put all food items together, all tech items together).\n 6. If an item in List A has no match in List B, map it to \"-\".\n 7. If an item in List B is not matched to anything in List A, add a row with \"-\" on the left.\n 8. Output MUST be a JSON object with a single key \"alignment\" containing an array of objects.\n 9. Each object in the array must have:\n - \"left\": string (item from List A or \"-\")\n - \"right\": string (item from List B or \"-\")\n - \"score\": number (similarity score between 0 and 1)\n\n Example Output Format:\n {\n \"alignment\": [\n { \"left\": \"Seafood\", \"right\": \"Fish\", \"score\": 0.9 },\n { \"left\": \"Seafood\", \"right\": \"Clams\", \"score\": 0.85 },\n { \"left\": \"Seafood\", \"right\": \"Crab\", \"score\": 0.88 },\n { \"left\": \"Chicken\", \"right\": \"Meat\", \"score\": 0.8 },\n { \"left\": \"Chicken\", \"right\": \"Poultry\", \"score\": 0.9 },\n { \"left\": \"Chicken\", \"right\": \"Mutton\", \"score\": 0.85 },\n { \"left\": \"Coffee\", \"right\": \"Cafés\", \"score\": 0.9 },\n { \"left\": \"Coding\", \"right\": \"-\", \"score\": 0 }\n ]\n }\n `;\n\n const body = {\n model: this.MODEL,\n messages: [\n { role: 'system', content: 'You are a helpful assistant that outputs strictly JSON.' },\n { role: 'user', content: prompt }\n ],\n response_format: { type: 'json_object' },\n temperature: 0.2\n };\n\n console.log('Sending single alignment request to OpenAI...');\n\n return this.http.post<any>(this.API_URL, body, { headers }).pipe(\n map(response => {\n try {\n const content = response.choices[0].message.content;\n console.log('OpenAI LLM Output (groupAlignLists):', content);\n if (content) {\n this.rawResponse$.next(content);\n }\n const result = JSON.parse(content);\n \n if (!result.alignment || !Array.isArray(result.alignment)) {\n throw new Error('Invalid JSON structure from OpenAI');\n }\n\n const rows: IAlignmentRow[] = result.alignment;\n \n // --- Post-Processing for Uniqueness, Grouping, Completeness, Reordering, and Validity ---\n\n // 0. Pre-process Input Lists: Deduplicate and Trim\n const validA = Array.from(new Set(listA.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\n const validB = Array.from(new Set(listB.filter(i => i && i.trim() && i.trim() !== OpenAIEmbeddingService.SPACER_SMALL).map(i => i.trim())));\n \n const validASet = new Set(validA);\n const validBSet = new Set(validB);\n\n // 0.1 Normalize Rows: Trim whitespace from AI response\n rows.forEach(row => {\n if (row.left) row.left = row.left.trim();\n if (row.right) row.right = row.right.trim();\n });\n\n // 0.2 Deduplicate Rows: Remove exact duplicate objects from AI response\n const uniqueRows = new Map<string, IAlignmentRow>();\n rows.forEach(row => {\n const key = `${row.left}|${row.right}`;\n if (!uniqueRows.has(key)) {\n uniqueRows.set(key, row);\n } else {\n // If duplicate exists, keep the one with higher score\n if (row.score > uniqueRows.get(key)!.score) {\n uniqueRows.set(key, row);\n }\n }\n });\n const dedupedRows = Array.from(uniqueRows.values());\n\n // 0.3 Hallucination Guard: Ensure all returned items actually exist in the input lists\n dedupedRows.forEach(row => {\n if (row.left !== '-' && !validASet.has(row.left)) {\n console.warn(`Hallucination detected: Left item '${row.left}' not in input list. Removing.`);\n row.left = '-';\n }\n if (row.right !== '-' && !validBSet.has(row.right)) {\n console.warn(`Hallucination detected: Right item '${row.right}' not in input list. Removing.`);\n row.right = '-';\n }\n });\n\n // 0.5 Exact Match Enforcer: If item exists in BOTH lists, force them to align\n const commonItems = validA.filter(a => validBSet.has(a));\n commonItems.forEach(item => {\n const exactRow = dedupedRows.find(r => r.left === item && r.right === item);\n if (exactRow) {\n exactRow.score = 1.0; \n } else {\n dedupedRows.forEach(r => {\n if (r.left === item) r.left = '-';\n if (r.right === item) r.right = '-';\n });\n dedupedRows.push({ left: item, right: item, score: 1.0 });\n }\n });\n\n // 1. Enforce Right-Side Uniqueness\n const rightItemBestMatch = new Map<string, { row: IAlignmentRow, index: number }>();\n dedupedRows.forEach((row, index) => {\n if (row.right && row.right !== '-') {\n if (!rightItemBestMatch.has(row.right)) {\n rightItemBestMatch.set(row.right, { row, index });\n } else {\n const currentBest = rightItemBestMatch.get(row.right)!;\n if (row.score > currentBest.row.score) {\n currentBest.row.right = '-';\n currentBest.row.score = 0;\n rightItemBestMatch.set(row.right, { row, index });\n } else {\n row.right = '-';\n row.score = 0;\n }\n }\n }\n });\n\n // 2. Group rows by their 'left' value\n const groups = new Map<string, IAlignmentRow[]>();\n const unmatchedRightRows: IAlignmentRow[] = [];\n \n dedupedRows.forEach(row => {\n if (row.left === '-') {\n unmatchedRightRows.push(row);\n } else {\n if (!groups.has(row.left)) {\n groups.set(row.left, []);\n }\n groups.get(row.left)!.push(row);\n }\n });\n\n // 3. Reconstruct the list respecting AI ORDER\n const processedRows: IAlignmentRow[] = [];\n const processedLeftItems = new Set<string>();\n\n dedupedRows.forEach(row => {\n if (row.left !== '-' && !processedLeftItems.has(row.left)) {\n const itemRows = groups.get(row.left)!;\n itemRows.sort((a, b) => b.score - a.score);\n itemRows.forEach((r, idx) => {\n if (idx > 0) r.left = '-';\n processedRows.push(r);\n });\n processedLeftItems.add(row.left);\n }\n });\n\n // 4. Add missing Left items\n validA.forEach(item => {\n if (!processedLeftItems.has(item)) {\n processedRows.push({ left: item, right: '-', score: 0 });\n }\n });\n\n // 5. Add unmatched right rows and missing Right items\n const validUnmatched = unmatchedRightRows.filter(r => r.right !== '-');\n processedRows.push(...validUnmatched);\n\n const usedB = new Set(processedRows.map(r => r.right).filter(x => x !== '-'));\n validB.forEach(bItem => {\n if (!usedB.has(bItem)) {\n processedRows.push({ left: '-', right: bItem, score: 0 });\n }\n });\n \n const finalRows = processedRows.filter(r => r.left !== '-' || r.right !== '-');\n const cacheKey = `${keyDirect}_v2`;\n \n const uniqueFinalRows = new Map<string, IAlignmentRow>();\n const finalRowsClean: IAlignmentRow[] = [];\n const seenLeftGroups = new Set<string>();\n\n finalRows.forEach(row => {\n const key = `${row.left}|${row.right}`;\n if (uniqueFinalRows.has(key)) return;\n uniqueFinalRows.set(key, row);\n\n if (row.left !== '-') {\n if (seenLeftGroups.has(row.left)) {\n row.left = '-'; \n } else {\n seenLeftGroups.add(row.left);\n }\n }\n \n finalRowsClean.push(row);\n });\n\n const cacheEntry = { originalA: validA, originalB: validB, rows: finalRowsClean };\n this.alignmentCache.set(cacheKey, cacheEntry);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_ALIGNMENT, cacheKey, cacheEntry);\n \n return finalRowsClean;\n } catch (e) {\n console.error('Failed to parse OpenAI response', e);\n throw new Error('Failed to parse alignment result');\n }\n }),\n catchError((error: HttpErrorResponse) => {\n console.error('OpenAI API Error:', error);\n return throwError(() => error);\n })\n );\n }\n\n /**\n * Calculate semantic similarity between two texts using OpenAI Embeddings API.\n * Returns a cosine similarity score in [0, 1] (0 for empty/invalid inputs).\n */\n calculateSimilarity(textA: string, textB: string, apiKey: string): Observable<number> {\n const a = (textA || '').trim();\n const b = (textB || '').trim();\n if (!a.length || !b.length) {\n return of(0);\n }\n\n const simKey = [a, b].sort().join('\\0');\n\n return from(this.loadSimilarityCache()).pipe(\n switchMap(() => {\n if (this.similarityCache.has(simKey)) {\n return of(this.similarityCache.get(simKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/calculate-similarity`;\n return this.http\n .post<{ similarity: number }>(url, { textA: a, textB: b }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((res) => {\n const similarity = res.similarity ?? 0;\n this.similarityCache.set(simKey, similarity);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SIMILARITY, simKey, similarity);\n return similarity;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'Backend calculate-similarity failed';\n return throwError(() => new Error(msg));\n })\n );\n }\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\n const body = {\n model: 'text-embedding-3-small',\n input: [a, b]\n };\n\n return this.http.post<any>(EMBEDDINGS_URL, body, { headers }).pipe(\n map(res => {\n const data = res?.data;\n if (!Array.isArray(data) || data.length < 2) {\n throw new Error('Invalid embeddings response from OpenAI');\n }\n const v1: number[] | undefined = data[0]?.embedding;\n const v2: number[] | undefined = data[1]?.embedding;\n if (!v1 || !v2) {\n throw new Error('Embeddings not present in OpenAI response');\n }\n const similarity = this.cosineSimilarityVectors(v1, v2);\n this.similarityCache.set(simKey, similarity);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_SIMILARITY, simKey, similarity);\n return similarity;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\n return throwError(() => new Error(msg));\n })\n );\n })\n );\n }\n\n /**\n * Fetch embeddings for multiple texts in a single request.\n */\n getEmbeddings(texts: string[], apiKey: string): Observable<number[][]> {\n if (!texts || texts.length === 0) return of([]);\n\n const embKey = JSON.stringify(texts);\n\n return from(this.loadEmbeddingsCache()).pipe(\n switchMap(() => {\n if (this.embeddingsCache.has(embKey)) {\n return of(this.embeddingsCache.get(embKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/embeddings`;\n return this.http\n .post<{ data: Array<{ embedding: number[] }> }>(url, { input: texts }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n })\n .pipe(\n map((res) => {\n const result = (res.data || []).map((item) => item.embedding || []);\n this.embeddingsCache.set(embKey, result);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_EMBEDDINGS, embKey, result);\n return result;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'Backend embeddings failed';\n return throwError(() => new Error(msg));\n })\n );\n }\n\n const headers = new HttpHeaders({\n [OpenAIEmbeddingService.HEADER_CONTENT_TYPE]: OpenAIEmbeddingService.CONTENT_TYPE_JSON,\n [OpenAIEmbeddingService.HEADER_AUTHORIZATION]: `${OpenAIEmbeddingService.BEARER_PREFIX}${apiKey}`\n });\n\n const EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';\n const body = {\n model: 'text-embedding-3-small',\n input: texts\n };\n\n return this.http.post<IOpenAIResponse>(EMBEDDINGS_URL, body, { headers }).pipe(\n map(res => {\n const data = res?.data;\n if (!Array.isArray(data)) {\n throw new Error('Invalid embeddings response from OpenAI');\n }\n const result = data.map((item: IOpenAIEmbeddingItem) => item.embedding);\n this.embeddingsCache.set(embKey, result);\n this.persistence.set(CachePersistenceService.STORE_OPENAI_EMBEDDINGS, embKey, result);\n return result;\n }),\n catchError((error: HttpErrorResponse) => {\n const msg = (error?.error && (error.error.error?.message || error.error.message)) || error?.message || 'OpenAI embeddings request failed';\n return throwError(() => new Error(msg));\n })\n );\n })\n );\n }\n\n // Private helpers\n private cosineSimilarityVectors(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const ai = a[i];\n const bi = b[i];\n dot += ai * bi;\n na += ai * ai;\n nb += bi * bi;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n }\n\n\n clearCache(): void {\n this.alignmentCache.clear();\n this.spacerAlignmentCache.clear();\n this.similarityCache.clear();\n this.embeddingsCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_SPACER);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_ALIGNMENT);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_SIMILARITY);\n this.persistence.clear(CachePersistenceService.STORE_OPENAI_EMBEDDINGS);\n }\n}\n","import { Injectable } from '@angular/core';\r\nimport { IComparisonResult, IProfileConfig } from '../interfaces';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ProfileComparisonLibService {\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Main service for profile comparison functionality\r\n */\r\n compareProfiles(profile1: IProfileConfig, profile2: IProfileConfig): IComparisonResult {\r\n // Placeholder implementation\r\n console.log('Comparing profiles:', profile1, profile2);\r\n return {\r\n similarity: 0.5,\r\n differences: [],\r\n timestamp: new Date()\r\n };\r\n }\r\n\r\n /**\r\n * Get library version\r\n */\r\n getVersion(): string {\r\n return '0.0.0';\r\n }\r\n}\r\n","import { Injectable, Optional, Inject } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, of, map, tap, retryWhen, concatMap, timer, throwError, from } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { IFaceDetectionResult, ISimilarityResponse, IFacePlusPlusResponse, IFacePlusPlusFace } from '../interfaces';\nimport type { IFaceBoxWithLandmarks, IFaceLandmarks } from '../interfaces/IFaceDetectionResult.interface';\nimport { PROFILE_COMPARISON_API_BASE_URL } from '../tokens';\nimport { CachePersistenceService } from './cache-persistence.service';\n\nenum FacePlusPlusFormFields {\n API_KEY = 'api_key',\n API_SECRET = 'api_secret',\n IMAGE_BASE64 = 'image_base64',\n IMAGE_FILE = 'image_file',\n RETURN_LANDMARK = 'return_landmark'\n}\n\nenum FacePlusPlusErrorTypes {\n AUTHENTICATION_ERROR = 'authentication_error',\n AUTHORIZATION_ERROR = 'authorization_error',\n CONCURRENCY_LIMIT_EXCEEDED = 'concurrency_limit_exceeded',\n RATE = 'rate'\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ProfileService {\n private static readonly BASE_URL = 'https://api.api-ninjas.com/v1/';\n private static readonly FACE_PLUS_PLUS_URL = 'https://api-us.faceplusplus.com/facepp/v3/detect';\n\n private baseUrl = ProfileService.BASE_URL;\n private baseUrlf = ProfileService.FACE_PLUS_PLUS_URL;\n\n private faceCache = new Map<string, IFaceDetectionResult>();\n private compareInterestsCache = new Map<string, ISimilarityResponse>();\n private faceLoaded = false;\n private compareLoaded = false;\n private faceLoadPromise: Promise<void> | null = null;\n private compareLoadPromise: Promise<void> | null = null;\n\n /** Content-based cache key: hash long strings/data URLs so same content yields same key and we avoid huge keys. */\n private static faceCacheKey(key: string | undefined): string | undefined {\n if (key == null || key === '') return undefined;\n const toHash = key.startsWith('data:') && key.includes(',')\n ? (key.split(',')[1] ?? key)\n : key;\n if (toHash.length > 500 || key.length > 2000) {\n let h = 5381;\n for (let i = 0; i < toHash.length; i++) {\n h = ((h << 5) + h + toHash.charCodeAt(i)) | 0;\n }\n return `face:${h}`;\n }\n return key;\n }\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PROFILE_COMPARISON_API_BASE_URL) private apiBaseUrl: import('../tokens').ProfileComparisonApiBaseUrl | null,\n private persistence: CachePersistenceService\n ) {}\n\n private loadFaceCache(): Promise<void> {\n if (this.faceLoaded) return Promise.resolve();\n if (!this.faceLoadPromise) {\n this.faceLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_PROFILE_FACE).then((entries) => {\n entries.forEach(([k, v]) => this.faceCache.set(k, v as IFaceDetectionResult));\n this.faceLoaded = true;\n });\n }\n return this.faceLoadPromise;\n }\n\n private loadCompareCache(): Promise<void> {\n if (this.compareLoaded) return Promise.resolve();\n if (!this.compareLoadPromise) {\n this.compareLoadPromise = this.persistence.getAll(CachePersistenceService.STORE_PROFILE_COMPARE).then((entries) => {\n entries.forEach(([k, v]) => this.compareInterestsCache.set(k, v as ISimilarityResponse));\n this.compareLoaded = true;\n });\n }\n return this.compareLoadPromise;\n }\n\n private getBaseUrl(): string | null {\n const u = this.apiBaseUrl;\n if (u == null) return null;\n return typeof u === 'function' ? u() : u;\n }\n\n compareInterests(\n text_1: string,\n text_2: string,\n apiKey: string\n ): Observable<ISimilarityResponse> {\n const a = (text_1 ?? '').trim();\n const b = (text_2 ?? '').trim();\n const cacheKey = a && b ? [a, b].sort().join('\\0') : '';\n\n return from(this.loadCompareCache()).pipe(\n switchMap(() => {\n if (cacheKey && this.compareInterestsCache.has(cacheKey)) {\n return of(this.compareInterestsCache.get(cacheKey)!);\n }\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/compare-interests`;\n return this.http.post<ISimilarityResponse>(url, { text_1: a || text_1, text_2: b || text_2 }, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n }).pipe(\n tap((res) => {\n if (cacheKey) {\n this.compareInterestsCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_COMPARE, cacheKey, res);\n }\n })\n );\n }\n const headers = new HttpHeaders({\n 'X-Api-Key': apiKey,\n 'Content-Type': 'application/json',\n });\n return this.http.post<ISimilarityResponse>(\n `${this.baseUrl}textsimilarity`,\n { text_1: a || text_1, text_2: b || text_2 },\n { headers }\n ).pipe(\n tap((res) => {\n if (cacheKey) {\n this.compareInterestsCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_COMPARE, cacheKey, res);\n }\n })\n );\n })\n );\n }\n\n detectFace(\n image: File | string,\n creds?: { apiKey?: string; apiSecret?: string },\n options?: { cacheKey?: string }\n ): Observable<IFaceDetectionResult> {\n const rawKey = options?.cacheKey ?? (typeof image === 'string' ? image : undefined);\n const cacheKey = ProfileService.faceCacheKey(rawKey);\n\n return from(this.loadFaceCache()).pipe(\n switchMap(() => {\n if (cacheKey && this.faceCache.has(cacheKey)) {\n console.log('Face detection cache hit');\n return of(this.faceCache.get(cacheKey)!);\n }\n\n const base = this.getBaseUrl();\n if (base) {\n const url = `${base.replace(/\\/$/, '')}/profile/detect-face`;\n let body: FormData | { image_base64: string };\n if (typeof image === 'string') {\n const isDataUrl = image.startsWith('data:');\n const base64 = isDataUrl ? (image.split(',')[1] || '') : image;\n body = { image_base64: base64 };\n return this.http.post<IFaceDetectionResult>(url, body, {\n headers: new HttpHeaders({ 'Content-Type': 'application/json' }),\n }).pipe(\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) return timer(3000);\n return throwError(() => error);\n })\n )\n ),\n tap((res) => {\n if (cacheKey) {\n this.faceCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, res);\n }\n })\n );\n }\n const formData = new FormData();\n formData.append('image_file', image, image.name);\n return this.http.post<IFaceDetectionResult>(url, formData).pipe(\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) return timer(3000);\n return throwError(() => error);\n })\n )\n ),\n tap((res) => {\n if (cacheKey) {\n this.faceCache.set(cacheKey, res);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, res);\n }\n })\n );\n }\n\n return this.detectFaceDirect(image, creds, cacheKey);\n })\n );\n }\n\n private detectFaceDirect(\n image: File | string,\n creds?: { apiKey?: string; apiSecret?: string },\n cacheKey?: string\n ): Observable<IFaceDetectionResult> {\n\n const formData = new FormData();\n const apiKey = creds?.apiKey ?? '';\n const apiSecret = creds?.apiSecret ?? '';\n formData.append(FacePlusPlusFormFields.API_KEY, apiKey);\n formData.append(FacePlusPlusFormFields.API_SECRET, apiSecret);\n\n if (typeof image === 'string') {\n const isDataUrl = image.startsWith('data:');\n const base64 = isDataUrl ? (image.split(',')[1] || '') : image;\n formData.append(FacePlusPlusFormFields.IMAGE_BASE64, base64);\n } else {\n formData.append(FacePlusPlusFormFields.IMAGE_FILE, image, image.name);\n }\n formData.append(FacePlusPlusFormFields.RETURN_LANDMARK, '1');\n\n return this.http.post<IFacePlusPlusResponse>(`${this.baseUrlf}`, formData).pipe(\n // Retry once after a short delay on Face++ rate-limit/security responses\n retryWhen((errors) =>\n errors.pipe(\n concatMap((error: HttpErrorResponse, i: number) => {\n const status = error?.status;\n const shouldRetry = (status === 403 || status === 429 || status === 503 || status === 401) && i < 1;\n if (shouldRetry) {\n // Wait 3 seconds before a single retry\n return timer(3000);\n }\n // Propagate other errors (or second failure) to the caller\n return throwError(() => error);\n })\n )\n ),\n map((raw: IFacePlusPlusResponse) => {\n // Face++ sometimes returns HTTP 200 with an error payload containing `error_message`\n // e.g. \"AUTHENTICATION_ERROR: api_key and api_secret does not match.\" or\n // \"AUTHORIZATION_ERROR:<reason>\" or \"CONCURRENCY_LIMIT_EXCEEDED\".\n const errorMessage: string | undefined = raw?.error_message;\n if (errorMessage && typeof errorMessage === 'string' && errorMessage.trim().length > 0) {\n const lower = errorMessage.toLowerCase();\n let status = 400;\n if (lower.includes(FacePlusPlusErrorTypes.AUTHENTICATION_ERROR)) status = 401;\n else if (lower.includes(FacePlusPlusErrorTypes.AUTHORIZATION_ERROR)) status = 403;\n else if (lower.includes(FacePlusPlusErrorTypes.CONCURRENCY_LIMIT_EXCEEDED) || lower.includes(FacePlusPlusErrorTypes.RATE)) status = 429;\n\n // Throw an error-like object so subscribers hit the error path and can show a modal\n throw { status, error: { message: errorMessage } };\n }\n\n const faces: IFaceBoxWithLandmarks[] = Array.isArray(raw?.faces)\n ? raw.faces\n .map((f: IFacePlusPlusFace) => {\n const rect = f?.face_rectangle || f?.faceRect || f?.rect;\n if (!rect || typeof rect.left !== 'number' || typeof rect.top !== 'number') {\n return null;\n }\n let landmarks: IFaceLandmarks | undefined = undefined;\n const lm = f?.landmark;\n if (lm && typeof lm === 'object') {\n landmarks = {};\n for (const key of Object.keys(lm)) {\n const pt = lm[key];\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') {\n (landmarks as IFaceLandmarks)[key] = { x: pt.x, y: pt.y };\n }\n }\n }\n return {\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n landmarks,\n } as IFaceBoxWithLandmarks;\n })\n .filter((v: IFaceBoxWithLandmarks | null): v is IFaceBoxWithLandmarks => !!v)\n : [];\n\n const imageUrl = typeof image === 'string' && image.startsWith('http') ? image : '';\n const result: IFaceDetectionResult = { imageUrl, faces };\n if (cacheKey) {\n this.faceCache.set(cacheKey, result);\n this.persistence.set(CachePersistenceService.STORE_PROFILE_FACE, cacheKey, result);\n }\n return result;\n })\n );\n }\n\n clearFaceCache(): void {\n this.faceCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_PROFILE_FACE);\n }\n\n clearCompareInterestsCache(): void {\n this.compareInterestsCache.clear();\n this.persistence.clear(CachePersistenceService.STORE_PROFILE_COMPARE);\n }\n\n // Note: Face++ credentials and request fields are handled directly above.\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { tap, catchError } from 'rxjs/operators';\r\nimport { IProfileConfig } from '../interfaces/IProfileConfig.interface';\r\nimport { IComparisonPayload } from '../interfaces/IComparisonPayload.interface';\r\nimport { PROFILE_COMPARISON_API_BASE_URL, PROFILE_COMPARISON_VERBOSE_LOGGING, ProfileComparisonApiBaseUrl } from '../tokens';\r\n\r\n/**\r\n * Thin-client service: sends config to the backend and returns the display payload.\r\n * The lib does not call third-party APIs; the backend does.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ProfileComparisonBackendService {\r\n private http = inject(HttpClient);\r\n private apiBaseUrl = inject(PROFILE_COMPARISON_API_BASE_URL, { optional: true });\r\n private getVerboseLogging = inject(PROFILE_COMPARISON_VERBOSE_LOGGING, { optional: true });\r\n\r\n constructor() {}\r\n\r\n static extractErrorMessage(err: unknown): string {\r\n if (err == null || typeof err !== 'object') return 'Unknown error';\r\n const e = err as { error?: { message?: string }; message?: string };\r\n return e.error?.message || e.message || 'Unknown error';\r\n }\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.getVerboseLogging?.() === true) {\r\n console.log('[ProfileComparisonBackend]', ...args);\r\n }\r\n }\r\n\r\n /** Returns the legacy token URL (for backward compat fallback). */\r\n getLegacyTokenUrl(): string | null {\r\n const u = this.apiBaseUrl;\r\n if (u == null) return null;\r\n return typeof u === 'function' ? u() : u;\r\n }\r\n\r\n /** @deprecated Use getLegacyTokenUrl(). Kept for backward compat. */\r\n getBaseUrl(): string | null {\r\n return this.getLegacyTokenUrl();\r\n }\r\n\r\n getComparison(config: IProfileConfig, baseUrl?: string | null): Observable<IComparisonPayload> {\r\n const base = baseUrl ?? this.getLegacyTokenUrl();\r\n this.log('getComparison', 'baseUrl', base ?? '(null)');\r\n if (!base || !base.trim()) {\r\n this.log('getComparison', 'returning error: backend not configured');\r\n return throwError(() => new Error('Backend not configured'));\r\n }\r\n const url = `${base.replace(/\\/$/, '')}/profile/compare-full`;\r\n this.log('getComparison', 'POST', url);\r\n return this.http.post<IComparisonPayload>(url, { config }).pipe(\r\n tap(() => this.log('getComparison', 'POST success')),\r\n catchError((err) => {\r\n this.log('getComparison', 'POST error', err);\r\n console.error(\r\n '[ProfileComparisonBackend] getComparison failed',\r\n err?.status,\r\n ProfileComparisonBackendService.extractErrorMessage(err),\r\n );\r\n return throwError(() => err);\r\n })\r\n );\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n ElementRef,\r\n Renderer2,\r\n AfterViewInit,\r\n ViewChild,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n EventEmitter,\r\n Optional,\r\n Inject,\r\n ChangeDetectorRef,\r\n NgZone,\r\n HostListener,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { PROFILE_COMPARISON_VERBOSE_LOGGING, BackendMode, resolveBackendUrl } from './tokens';\r\nimport {\r\n forceSimulation,\r\n forceLink,\r\n forceCollide,\r\n forceX,\r\n forceY,\r\n SimulationNodeDatum,\r\n SimulationLinkDatum,\r\n} from 'd3-force';\r\nimport {\r\n IProfileConfig,\r\n IBoundingBox,\r\n IPoint,\r\n IFaceDetectionResult,\r\n IFaceBoxWithLandmarks,\r\n IFaceLandmarks,\r\n FaceDetectionData,\r\n IImageCompressionConfig,\r\n IMatrixData\r\n} from './interfaces';\r\nimport { tap } from 'rxjs/operators';\r\nimport {\r\n ProfileComparisonBackendService,\r\n FileConversionService,\r\n ImageCompressionService\r\n} from './services';\r\nimport {\r\n forkJoin,\r\n map,\r\n Observable,\r\n of,\r\n switchMap,\r\n catchError,\r\n Subscription,\r\n} from 'rxjs';\r\n\r\n/** Node type for the force-directed chip layout. */\r\ninterface ForceChipNode extends SimulationNodeDatum {\r\n id: string;\r\n label: string;\r\n group: 'p1' | 'shared' | 'p2';\r\n targetX?: number;\r\n targetY?: number;\r\n originalFx?: number;\r\n originalFy?: number;\r\n}\r\n\r\ninterface ForceChipLink extends SimulationLinkDatum<ForceChipNode> {\r\n kind: 'cross' | 'intra';\r\n strength: number;\r\n distance: number;\r\n similarity: number;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-profile-comparison',\r\n templateUrl: './profile-comparison-lib.component.html',\r\n styleUrls: ['./profile-comparison-lib.component.scss'],\r\n standalone: false\r\n})\r\nexport class ProfileComparisonLibComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\r\n private static readonly DEFAULT_OBJECT_POSITION = '50% 50%';\r\n private static readonly DEFAULT_EYE_ALIGNMENT_BIAS_PX = 50;\r\n private static readonly DEFAULT_IMAGE_FORMAT = 'image/jpeg';\r\n private static readonly DEFAULT_IMAGE_QUALITY_START = 0.85;\r\n private static readonly DEFAULT_IMAGE_QUALITY_MIN = 0.5;\r\n private static readonly DEFAULT_IMAGE_QUALITY_STEP = 0.05;\r\n private static readonly DEFAULT_MAX_BYTES = 2 * 1024 * 1024;\r\n private static readonly DEFAULT_DOWNSCALE_STEP = 0.9;\r\n private static readonly DEFAULT_MIN_WIDTH = 400;\r\n private static readonly DEFAULT_MIN_HEIGHT = 400;\r\n private static readonly DEFAULT_MAX_WIDTH = 1600;\r\n private static readonly DEFAULT_MAX_HEIGHT = 1600;\r\n private static readonly SPACER_SMALL = '-';\r\n private static readonly SPACER_LARGE = '----';\r\n private static readonly CONSOLIDATION_SEPARATOR_X = '×';\r\n private static readonly CONSOLIDATION_SEPARATOR_SLASH = '/';\r\n private static readonly FACEPP_RATE_LIMIT_DELAY_MS = 5000;\r\n private static readonly DEFAULT_PROFILE_IMAGE_NAME = 'ProfilePg1.png';\r\n\r\n // Drag and shape constants\r\n private static readonly SHAPE_BG_HEIGHT = '350px';\r\n private static readonly SHAPE_BG_OBJECT_FIT = 'cover';\r\n private static readonly SHAPE_BG1_OBJECT_POSITION = 'right';\r\n private static readonly SHAPE_BG2_OBJECT_POSITION = 'left';\r\n private static readonly DRAG_MIN_WIDTH = 200;\r\n private static readonly DRAG_MAX_WIDTH = 400;\r\n private static readonly MAX_DRAG_DISTANCE = 100;\r\n private static readonly CENTER_MOVE_MULTIPLIER = 0.5;\r\n private static readonly TEXT_MOVE_MULTIPLIER = 0.3;\r\n private static readonly TRANSITION_WIDTH = 'width 0.3s ease';\r\n private static readonly TRANSITION_TRANSFORM = 'transform 0.3s ease';\r\n private static readonly TRANSFORM_RESET = 'translateX(0px)';\r\n private static readonly TRANSITION_RESET_DELAY_MS = 300;\r\n\r\n @Input() config: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n @Input() user1File: File | null = null;\r\n @Input() user2File: File | null = null;\r\n @Input() backendMode: BackendMode = BackendMode.Real;\r\n @Input() backendUrl: string | null = null;\r\n @Input() fadeAllEdges: boolean = true;\r\n @Input() person1Name: string = 'Josh';\r\n @Input() person2Name: string = 'Amy';\r\n @Input() imageProxyPath: string = '';\r\n @Output() matrixDataChange = new EventEmitter<IMatrixData>();\r\n @Output() rawLLMOutputChange = new EventEmitter<string>();\r\n @Output() viewProfileClick = new EventEmitter<{ side: 'left' | 'right' }>();\r\n\r\n selectedFile: File | null = null;\r\n\r\n firstImageData: FaceDetectionData | null = null;\r\n secondImageData: FaceDetectionData | null = null;\r\n\r\n user1Transform: string = '';\r\n user2Transform: string = '';\r\n user1Top: string = '0px';\r\n user1Height: string = '100%';\r\n user2Top: string = '0px';\r\n user2Height: string = '100%';\r\n alignmentCalculated: boolean = false;\r\n isAligning: boolean = false;\r\n /** Set when backend returns an error (e.g. 503 API keys not configured). */\r\n backendError: string | null = null;\r\n\r\n user1ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n user2ObjectPosition: string = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n\r\n private user1NaturalWidth = 0;\r\n private user1NaturalHeight = 0;\r\n private user2NaturalWidth = 0;\r\n private user2NaturalHeight = 0;\r\n\r\n private user1FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n private user2FaceRaw: IFaceBoxWithLandmarks | null = null;\r\n\r\n private eyeAlignmentBiasPx: number = ProfileComparisonLibComponent.DEFAULT_EYE_ALIGNMENT_BIAS_PX;\r\n\r\n firstPersonInterests: string[] = [];\r\n secondPersonInterests: string[] = [];\r\n thirdPersonInterests: string[] = [];\r\n centerItem: string[] = [];\r\n\r\n person1Interests: string[] = [];\r\n person2Interests: string[] = [];\r\n person3Interests: string[] = [];\r\n user1Image: string = '';\r\n user2Image: string = '';\r\n\r\n get user1ImageSrc(): string {\r\n if (this.imageProxyPath && this.user1Image && this.user1Image.startsWith('http')) {\r\n try {\r\n const urlObj = new URL(this.user1Image);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n return `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n return this.user1Image;\r\n }\r\n }\r\n return this.user1Image;\r\n }\r\n\r\n get user2ImageSrc(): string {\r\n if (this.imageProxyPath && this.user2Image && this.user2Image.startsWith('http')) {\r\n try {\r\n const urlObj = new URL(this.user2Image);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n return `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n return this.user2Image;\r\n }\r\n }\r\n return this.user2Image;\r\n }\r\n\r\n private baseConfig: IProfileConfig = {\r\n person1Interests: [],\r\n person2Interests: [],\r\n person3Interests: [],\r\n user1Image: '',\r\n user2Image: '',\r\n };\r\n\r\n displayPerson1Interests: string[] = [];\r\n displayPerson2Interests: string[] = [];\r\n\r\n alignedPerson1Interests: string[] = [];\r\n alignedPerson2Interests: string[] = [];\r\n\r\n leftProfileClicked = false;\r\n rightProfileClicked = false;\r\n\r\n sortedA: { item: string; score: number }[] = [];\r\n sortedB: { item: string; score: number }[] = [];\r\n sortedC: { item: string; score: number }[] = [];\r\n\r\n similarity: number = 0;\r\n similarityMatrixCsv: string = '';\r\n matrixData: IMatrixData | null = null;\r\n\r\n // ── Force-directed chip layout ──────────────────────────────────────────\r\n private static readonly SPRING_THRESHOLD = 0.32;\r\n private static readonly CROSS_LINK_MIN_SIMILARITY = 0.5;\r\n private static readonly INTRA_GROUP_THRESHOLD = 0.5;\r\n private static readonly SHARED_PROMOTION_THRESHOLD = 0.75;\r\n private static readonly MAX_CROSS_LINKS_PER_NODE = 4;\r\n private static readonly MIN_CROSS_LINKS_PER_NODE = 0;\r\n private static readonly MAX_INTRA_LINKS_PER_NODE = 2;\r\n private static readonly MAX_RELEVANT_INTERESTS_PER_SIDE = 6;\r\n private static readonly COLUMN_CORE_SEED_PIXELS = 9;\r\n private static readonly IDLE_ALPHA_TARGET = 0.012;\r\n private static readonly CLICK_REHEAT_ALPHA = 0.065;\r\n private static readonly SEMANTIC_STABILITY_ALPHA_FLOOR = 0.012;\r\n private static readonly RELATIVE_MEDIAN_ALPHA_FLOOR = 0.01;\r\n private static readonly RELATIVE_MEDIAN_ATTRACT_STRENGTH = 0.44;\r\n private static readonly RELATIVE_MEDIAN_REPEL_STRENGTH = 0.58;\r\n private static readonly RELATIVE_MEDIAN_ATTRACT_RADIUS = 72;\r\n private static readonly RELATIVE_MEDIAN_REPEL_RADIUS = 194;\r\n private static readonly STRONG_SIMILARITY_BOOST_EXPONENT = 3.2;\r\n private static readonly STRONG_SIMILARITY_BOOST_SCALE = 0.5;\r\n private static readonly PRIORITY_PAIR_MIN_SIMILARITY = 0.62;\r\n private static readonly PRIORITY_PAIR_ATTRACTION_STRENGTH = 1.02;\r\n private static readonly PRIORITY_PAIR_CORRIDOR_RADIUS = 42;\r\n private static readonly PRIORITY_PAIR_CORRIDOR_REPEL_STRENGTH = 0.64;\r\n private static readonly MUTUAL_TOP_PAIR_MIN_SIMILARITY = 0.58;\r\n private static readonly MUTUAL_TOP_PAIR_MARGIN = 0.12;\r\n private static readonly MUTUAL_TOP_PAIR_ATTRACTION_STRENGTH = 1.12;\r\n private static readonly MUTUAL_TOP_PAIR_BARRIER_RADIUS = 56;\r\n private static readonly MUTUAL_TOP_PAIR_REPEL_STRENGTH = 1.06;\r\n private static readonly DETERMINISTIC_SEED_PASSES = 6;\r\n private static readonly DETERMINISTIC_SEED_BLEND = 0.86;\r\n private static readonly OBJECTIVE_OPTIMIZER_ITERATIONS = 56;\r\n private static readonly OBJECTIVE_STEP_START = 0.34;\r\n private static readonly OBJECTIVE_STEP_END = 0.09;\r\n private static readonly OBJECTIVE_ATTRACTION_WEIGHT = 0.74;\r\n private static readonly OBJECTIVE_REPULSION_WEIGHT = 0.5;\r\n private static readonly OBJECTIVE_ANCHOR_WEIGHT = 0.34;\r\n private static readonly OBJECTIVE_BOUNDARY_WEIGHT = 0.92;\r\n private static readonly DISSIMILAR_REPEL_THRESHOLD = 0.52;\r\n private static readonly DISSIMILAR_REPEL_STRENGTH = 0.34;\r\n private static readonly DISSIMILAR_REPEL_MAX_DISTANCE = 220;\r\n private static readonly DISSIMILAR_REPEL_DECAY_DISTANCE = 130;\r\n private static readonly CHIP_RADIUS = 18; // half chip height for collision\r\n private static readonly CHIP_COLLISION_BORDER_PADDING = 6;\r\n private static readonly MAX_LINK_DISTANCE = 120;\r\n private static readonly CANVAS_PADDING = 40; // px below lowest node\r\n\r\n forceNodes: ForceChipNode[] = [];\r\n forceLinks: ForceChipLink[] = [];\r\n forceCanvasHeight: number = 300;\r\n chipFontSizePx = 14;\r\n chipPaddingXPx = 18;\r\n chipPaddingYPx = 6;\r\n chipLineHeight = 1.4;\r\n\r\n hoveredNode: ForceChipNode | null = null;\r\n clickedNode: ForceChipNode | null = null;\r\n draggedNode: ForceChipNode | null = null;\r\n isDragging = false;\r\n private simulation: any;\r\n private layoutRebuildRaf: number | null = null;\r\n private nodeDragBounds = new Map<string, { minX: number; maxX: number; minY: number; maxY: number }>();\r\n\r\n get activeNode(): ForceChipNode | null {\r\n return this.hoveredNode || this.clickedNode;\r\n }\r\n\r\n /** When false, backend URL is not provided — show \"Configure backend\". */\r\n backendConfigured: boolean = false;\r\n /** The resolved backend URL computed from inputs and legacy token. */\r\n private resolvedBackendUrl: string | null = null;\r\n\r\n compressionConfig: IImageCompressionConfig = {\r\n maxWidth: ProfileComparisonLibComponent.DEFAULT_MAX_WIDTH,\r\n maxHeight: ProfileComparisonLibComponent.DEFAULT_MAX_HEIGHT,\r\n format: ProfileComparisonLibComponent.DEFAULT_IMAGE_FORMAT,\r\n qualityStart: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_START,\r\n qualityMin: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_MIN,\r\n qualityStep: ProfileComparisonLibComponent.DEFAULT_IMAGE_QUALITY_STEP,\r\n maxBytes: ProfileComparisonLibComponent.DEFAULT_MAX_BYTES,\r\n downscaleStep: ProfileComparisonLibComponent.DEFAULT_DOWNSCALE_STEP,\r\n minWidth: ProfileComparisonLibComponent.DEFAULT_MIN_WIDTH,\r\n minHeight: ProfileComparisonLibComponent.DEFAULT_MIN_HEIGHT,\r\n };\r\n\r\n private computeSub?: Subscription;\r\n /** Incremented on each fetchComparison(); used to ignore stale success/error from an older request. */\r\n private fetchRequestId = 0;\r\n\r\n @ViewChild('leftContainer') leftContainer!: ElementRef;\r\n @ViewChild('rightContainer') rightContainer!: ElementRef;\r\n @ViewChild('profileFlex') profileFlex!: ElementRef<HTMLElement>;\r\n @ViewChild('profileImgLeft') profileImgLeft!: ElementRef<HTMLElement>;\r\n @ViewChild('profileImgRight') profileImgRight!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeContainer') shapeContainer!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeBg') shapeBg!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeBg1') shapeBg1!: ElementRef<SVGElement>;\r\n @ViewChild('shapeBg2') shapeBg2!: ElementRef<SVGElement>;\r\n @ViewChild('shapeTextLeft') shapeTextLeft!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeTextRight') shapeTextRight!: ElementRef<HTMLElement>;\r\n @ViewChild('shapeTextCenter') shapeTextCenter!: ElementRef<HTMLElement>;\r\n @ViewChild('chipsGrid') chipsGrid!: ElementRef<HTMLElement>;\r\n\r\n constructor(\r\n private backendService: ProfileComparisonBackendService,\r\n private renderer: Renderer2,\r\n private fileConversionService: FileConversionService,\r\n private imageCompressionService: ImageCompressionService,\r\n private cdr: ChangeDetectorRef,\r\n private ngZone: NgZone,\r\n private hostRef: ElementRef<HTMLElement>,\r\n @Optional() @Inject(PROFILE_COMPARISON_VERBOSE_LOGGING) private getVerboseLogging?: () => boolean\r\n ) {}\r\n\r\n private log(...args: unknown[]): void {\r\n if (this.getVerboseLogging?.() === true) {\r\n console.log('[ProfileComparisonLib]', ...args);\r\n }\r\n }\r\n\r\n anchorSide: 'left' | 'right' = 'left';\r\n\r\n rawLLMOutput: string = '';\r\n\r\n ngOnInit(): void {\r\n if (this.getVerboseLogging?.()) console.log('[ProfileComparisonLib] verbose logging ON');\r\n this.log('ngOnInit', 'config received', {\r\n person1Len: this.config?.person1Interests?.length,\r\n person2Len: this.config?.person2Interests?.length,\r\n hasUser1Image: !!this.config?.user1Image?.length,\r\n hasUser2Image: !!this.config?.user2Image?.length,\r\n });\r\n this.baseConfig = JSON.parse(JSON.stringify(this.config));\r\n this.updateConfigProperties();\r\n this.resolvedBackendUrl = resolveBackendUrl(\r\n this.backendUrl,\r\n this.backendMode,\r\n this.backendService.getLegacyTokenUrl(),\r\n );\r\n this.backendConfigured = !!this.resolvedBackendUrl;\r\n this.log('ngOnInit', 'backendConfigured', this.backendConfigured, 'resolvedUrl', this.resolvedBackendUrl ?? '(null)');\r\n if (!this.backendConfigured) {\r\n this.log('ngOnInit', 'exiting early: backend not configured');\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = false;\r\n return;\r\n }\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.alignmentCalculated = false;\r\n this.isAligning = true;\r\n this.cdr.detectChanges();\r\n this.log('ngOnInit', 'starting compressInputImages then fetchComparison');\r\n this.compressInputImages().subscribe({\r\n next: () => {\r\n this.log('ngOnInit', 'compressInputImages done, calling fetchComparison');\r\n this.isAligning = false;\r\n this.fetchComparison();\r\n },\r\n error: (e) => {\r\n console.warn('Config image compression failed, continuing:', e);\r\n this.log('ngOnInit', 'compressInputImages error, calling fetchComparison anyway');\r\n this.isAligning = false;\r\n this.fetchComparison();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.simulation) {\r\n this.simulation.stop();\r\n }\r\n if (this.layoutRebuildRaf !== null) {\r\n cancelAnimationFrame(this.layoutRebuildRaf);\r\n this.layoutRebuildRaf = null;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.waitForImagesAndInitDrag();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['backendMode'] || changes['backendUrl']) {\r\n this.resolvedBackendUrl = resolveBackendUrl(\r\n this.backendUrl,\r\n this.backendMode,\r\n this.backendService.getLegacyTokenUrl(),\r\n );\r\n this.backendConfigured = !!this.resolvedBackendUrl;\r\n this.log('ngOnChanges', 'backend inputs changed', 'resolvedUrl', this.resolvedBackendUrl ?? '(null)');\r\n }\r\n\r\n if (changes['config']) {\r\n const first = changes['config'].firstChange;\r\n this.log('ngOnChanges', 'config changed', 'firstChange', first, 'backendConfigured', this.backendConfigured);\r\n this.updateConfigProperties();\r\n if (!this.backendConfigured) {\r\n this.log('ngOnChanges', 'skipping fetch: backend not configured');\r\n return;\r\n }\r\n if (!first) {\r\n this.log('ngOnChanges', 'running compressInputImages then fetchComparison');\r\n this.compressInputImages().subscribe({\r\n next: () => {\r\n this.log('ngOnChanges', 'compress done, calling fetchComparison');\r\n this.fetchComparison();\r\n },\r\n error: (e) => {\r\n console.warn('Config image compression failed, continuing:', e);\r\n this.log('ngOnChanges', 'compress error, calling fetchComparison anyway');\r\n this.fetchComparison();\r\n }\r\n });\r\n } else {\r\n this.log('ngOnChanges', 'skipping fetch: firstChange (ngOnInit will run)');\r\n }\r\n }\r\n }\r\n\r\n /** Use for template: hide left/right item when it's a shared (center) item. Compares case-insensitively. */\r\n isInCenter(interest: string): boolean {\r\n if (!interest || !this.centerItem?.length) return false;\r\n const n = String(interest).trim().toLowerCase();\r\n return this.centerItem.some((c) => String(c).trim().toLowerCase() === n);\r\n }\r\n\r\n private fetchComparison(): void {\r\n this.log('fetchComparison', 'start');\r\n if (this.isAligning) {\r\n this.log('fetchComparison', 'skipped: already aligning (single-flight)');\r\n return;\r\n }\r\n if (this.computeSub) {\r\n this.computeSub.unsubscribe();\r\n this.computeSub = undefined;\r\n }\r\n const requestId = ++this.fetchRequestId;\r\n this.isAligning = true;\r\n this.backendError = null;\r\n this.cdr.detectChanges();\r\n const normalized = this.buildConfigWithDefaults(this.config, this.baseConfig);\r\n const configToSend = {\r\n person1Interests: normalized.person1Interests,\r\n person2Interests: normalized.person2Interests,\r\n person3Interests: normalized.person3Interests,\r\n user1Image: this.user1Image,\r\n user2Image: this.user2Image,\r\n };\r\n this.log('fetchComparison', 'calling backend getComparison', {\r\n person1Len: configToSend.person1Interests.length,\r\n person2Len: configToSend.person2Interests.length,\r\n user1ImageLen: (configToSend.user1Image || '').length,\r\n user2ImageLen: (configToSend.user2Image || '').length,\r\n });\r\n this.computeSub = this.backendService.getComparison(configToSend, this.resolvedBackendUrl).subscribe({\r\n next: (payload) => {\r\n if (requestId !== this.fetchRequestId) {\r\n this.log('fetchComparison', 'ignoring stale success', { requestId, current: this.fetchRequestId });\r\n return;\r\n }\r\n this.log('fetchComparison', 'backend response received', { aligned1: payload?.alignedPerson1Interests?.length, aligned2: payload?.alignedPerson2Interests?.length });\r\n this.isAligning = false;\r\n this.backendError = null;\r\n this.matrixData = payload.matrixData ?? null;\r\n if (this.matrixData) this.matrixDataChange.emit(this.matrixData);\r\n\r\n const a1 = payload.alignedPerson1Interests ?? [];\r\n const a2 = payload.alignedPerson2Interests ?? [];\r\n const sameLists = a1.length === a2.length && a1.every((v, i) => String(v).trim().toLowerCase() === String(a2[i]).trim().toLowerCase());\r\n if (sameLists && a1.length > 0) {\r\n this.log('fetchComparison', 'backend returned identical aligned lists; using raw lists to keep sides distinct', { len: a1.length });\r\n this.alignedPerson1Interests = [];\r\n this.alignedPerson2Interests = [];\r\n this.displayPerson1Interests = this.person1Interests;\r\n this.displayPerson2Interests = this.person2Interests;\r\n this.centerItem = this.filterCenterItemsByThreshold(\r\n payload.centerItem ?? [],\r\n this.person1Interests ?? [],\r\n this.person2Interests ?? []\r\n );\r\n } else {\r\n const rawCenter = payload.centerItem ?? [];\r\n const list1ToUse = this.person1Interests?.length ? this.person1Interests : a1;\r\n const list2ToUse = this.person2Interests?.length ? this.person2Interests : a2;\r\n const filteredCenter = this.filterCenterItemsByThreshold(rawCenter, list1ToUse, list2ToUse);\r\n const reordered = this.reorderInterestsByMatrix(list1ToUse, list2ToUse, filteredCenter);\r\n\r\n this.alignedPerson1Interests = reordered.p1;\r\n this.alignedPerson2Interests = reordered.p2;\r\n this.displayPerson1Interests = reordered.p1;\r\n this.displayPerson2Interests = reordered.p2;\r\n this.centerItem = reordered.center;\r\n }\r\n if (payload.rawLLMOutput != null) {\r\n this.rawLLMOutput = payload.rawLLMOutput;\r\n this.rawLLMOutputChange.emit(payload.rawLLMOutput);\r\n }\r\n this.firstImageData = payload.face1 ?? null;\r\n this.secondImageData = payload.face2 ?? null;\r\n const faces1 = (this.firstImageData && typeof this.firstImageData === 'object' && 'faces' in this.firstImageData && Array.isArray(this.firstImageData.faces)) ? this.firstImageData.faces : [];\r\n const faces2 = (this.secondImageData && typeof this.secondImageData === 'object' && 'faces' in this.secondImageData && Array.isArray(this.secondImageData.faces)) ? this.secondImageData.faces : [];\r\n this.user1FaceRaw = faces1.length ? faces1[0] : null;\r\n this.user2FaceRaw = faces2.length ? faces2[0] : null;\r\n if (this.user1NaturalWidth && this.user1NaturalHeight) this.updateObjectPositionForFace(1);\r\n if (this.user2NaturalWidth && this.user2NaturalHeight) this.updateObjectPositionForFace(2);\r\n if (this.firstImageData && this.secondImageData) this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n this.buildForceGraph();\r\n this.cdr.detectChanges();\r\n },\r\n error: (err) => {\r\n if (requestId !== this.fetchRequestId) {\r\n this.log('fetchComparison', 'ignoring stale error', { requestId, current: this.fetchRequestId, status: err?.status });\r\n return;\r\n }\r\n this.log('fetchComparison', 'backend error', err);\r\n const msg = err?.error?.message ?? err?.message ?? err?.statusText ?? (typeof err?.error === 'string' ? err.error : null) ?? 'Request failed';\r\n this.backendError = msg;\r\n console.error('[ProfileComparisonLib] fetchComparison error', err?.status ?? '', msg);\r\n this.isAligning = false;\r\n this.cdr.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n private updateConfigProperties(): void {\r\n const normalized = this.buildConfigWithDefaults(\r\n this.config,\r\n this.baseConfig\r\n );\r\n this.config = normalized;\r\n\r\n this.person1Interests = [...normalized.person1Interests];\r\n this.person2Interests = [...normalized.person2Interests];\r\n this.user1Image = normalized.user1Image;\r\n this.user2Image = normalized.user2Image;\r\n if (normalized.person1Name) this.person1Name = normalized.person1Name;\r\n if (normalized.person2Name) this.person2Name = normalized.person2Name;\r\n }\r\n\r\n private buildConfigWithDefaults(\r\n cfg: Partial<IProfileConfig> | undefined,\r\n base: IProfileConfig\r\n ): IProfileConfig {\r\n const list = (val: unknown, fb: string[]): string[] => {\r\n if (Array.isArray(val)) {\r\n const cleaned = val\r\n .filter((s) => typeof s === 'string')\r\n .map((s: string) => s.trim())\r\n .filter((s: string) => s.length > 0 && s !== ProfileComparisonLibComponent.SPACER_SMALL);\r\n if (cleaned.length > 0) return cleaned;\r\n }\r\n return [...fb];\r\n };\r\n\r\n const str = (val: unknown, fb: string): string => {\r\n return typeof val === 'string' && val.trim().length > 0 ? val : fb;\r\n };\r\n\r\n const safe = cfg || ({} as Partial<IProfileConfig>);\r\n return {\r\n person1Name: safe.person1Name ? str(safe.person1Name, '') : undefined,\r\n person2Name: safe.person2Name ? str(safe.person2Name, '') : undefined,\r\n person1Interests: list(safe.person1Interests, base.person1Interests),\r\n person2Interests: list(safe.person2Interests, base.person2Interests),\r\n person3Interests: list(safe.person3Interests, base.person3Interests),\r\n user1Image: str(safe.user1Image, base.user1Image),\r\n user2Image: str(safe.user2Image, base.user2Image),\r\n } as IProfileConfig;\r\n }\r\n\r\n onUserImageLoad(which: 1 | 2, event: Event): void {\r\n const img = event?.target as HTMLImageElement | null;\r\n if (!img) return;\r\n if (which === 1) {\r\n this.user1NaturalWidth = img.naturalWidth || 0;\r\n this.user1NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(1);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n } else {\r\n this.user2NaturalWidth = img.naturalWidth || 0;\r\n this.user2NaturalHeight = img.naturalHeight || 0;\r\n this.updateObjectPositionForFace(2);\r\n if (this.firstImageData && this.secondImageData) {\r\n this.calculateFaceAlignment(this.firstImageData, this.secondImageData);\r\n }\r\n }\r\n }\r\n\r\n private updateObjectPositionForFace(which: 1 | 2): void {\r\n const face = which === 1 ? this.user1FaceRaw : this.user2FaceRaw;\r\n const natW = which === 1 ? this.user1NaturalWidth : this.user2NaturalWidth;\r\n const natH = which === 1 ? this.user1NaturalHeight : this.user2NaturalHeight;\r\n\r\n if (!face || !natW || !natH) {\r\n if (which === 1) this.user1ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n else this.user2ObjectPosition = ProfileComparisonLibComponent.DEFAULT_OBJECT_POSITION;\r\n return;\r\n }\r\n\r\n const eyes = this.getEyeCoordinatesFromFace(face);\r\n const nose = this.getNoseCoordinateFromFace(face);\r\n const minX = Math.min(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const maxX = Math.max(eyes.leftEye.x, eyes.rightEye.x, nose.x);\r\n const roiCenterX = (minX + maxX) / 2;\r\n\r\n const { width: cw, height: ch } = this.getProfileContainerSize(which);\r\n if (!cw || !ch) {\r\n const clamped = Math.max(0, Math.min(natW, roiCenterX));\r\n let xPercentFallback = Math.round((clamped / natW) * 10000) / 100;\r\n const faceCenterX_fb = face.x + face.width / 2;\r\n const ratio_fb = faceCenterX_fb / natW;\r\n if (ratio_fb > 0.6) {\r\n const over = Math.min(0.4, ratio_fb - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n xPercentFallback = Math.max(0, Math.min(100, xPercentFallback + shiftPct));\r\n }\r\n const posFallback = `${xPercentFallback}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = posFallback;\r\n else this.user2ObjectPosition = posFallback;\r\n return;\r\n }\r\n\r\n const scale = Math.max(cw / natW, ch / natH);\r\n const viewW = cw / scale;\r\n\r\n const paddingCssPx = 12;\r\n const overlapCssPx = this.getOverlapSizeCssPx();\r\n const fadeSafetyCssPx = 8;\r\n const fadeCssPx = overlapCssPx + paddingCssPx + fadeSafetyCssPx;\r\n const fadeInImgPx = fadeCssPx / scale;\r\n const edgeInImgPx = paddingCssPx / scale;\r\n\r\n let anchorX = roiCenterX;\r\n\r\n if (which === 1) {\r\n const minAnchorForRightEye = maxX - viewW / 2 + fadeInImgPx;\r\n const maxAnchorForLeftEye = minX + viewW / 2 - edgeInImgPx;\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n }\r\n } else {\r\n const maxAnchorForLeftEye = minX + viewW / 2 - fadeInImgPx;\r\n const minAnchorForRightEye = maxX - viewW / 2 + edgeInImgPx;\r\n anchorX = Math.min(anchorX, maxAnchorForLeftEye);\r\n anchorX = Math.max(anchorX, minAnchorForRightEye);\r\n\r\n const faceCenterX = face.x + face.width / 2;\r\n const ratio = faceCenterX / natW;\r\n if (ratio > 0.6) {\r\n const over = Math.min(0.4, ratio - 0.6);\r\n const shiftPct = 7 + (over / 0.4) * 8;\r\n const shiftPx = (shiftPct / 100) * natW;\r\n anchorX += shiftPx;\r\n }\r\n }\r\n\r\n const minAnchor = viewW / 2;\r\n const maxAnchor = natW - viewW / 2;\r\n anchorX = Math.max(minAnchor, Math.min(maxAnchor, anchorX));\r\n\r\n const viewLeft = anchorX - viewW / 2;\r\n const viewRight = anchorX + viewW / 2;\r\n const currentOverlap = this.getOverlapSizeCssPx();\r\n let desiredOverlap = currentOverlap;\r\n if (which === 1) {\r\n const distanceRightImg = Math.max(0, viewRight - maxX);\r\n const allowedCss = Math.max(10, distanceRightImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n } else {\r\n const distanceLeftImg = Math.max(0, minX - viewLeft);\r\n const allowedCss = Math.max(10, distanceLeftImg * scale - paddingCssPx);\r\n if (allowedCss < desiredOverlap) desiredOverlap = allowedCss;\r\n }\r\n if (desiredOverlap < currentOverlap - 0.5) {\r\n this.setOverlapSizeCssPx(desiredOverlap);\r\n }\r\n\r\n const xPercent = Math.round((anchorX / natW) * 10000) / 100;\r\n const pos = `${xPercent}% 50%`;\r\n if (which === 1) this.user1ObjectPosition = pos;\r\n else this.user2ObjectPosition = pos;\r\n }\r\n\r\n private getProfileContainerSize(which: 1 | 2): { width: number; height: number } {\r\n try {\r\n const el = (which === 1 ? this.profileImgLeft : this.profileImgRight)?.nativeElement || null;\r\n if (!el) return { width: 0, height: 0 };\r\n const rect = el.getBoundingClientRect();\r\n return { width: Math.round(rect.width), height: Math.round(rect.height) };\r\n } catch {\r\n return { width: 0, height: 0 };\r\n }\r\n }\r\n\r\n private getOverlapSizeCssPx(): number {\r\n try {\r\n const root = this.profileFlex?.nativeElement || null;\r\n const fallback = 40;\r\n if (!root) return fallback;\r\n const val = getComputedStyle(root).getPropertyValue('--overlap-size').trim();\r\n const parsed = parseFloat(val);\r\n return isNaN(parsed) ? fallback : parsed;\r\n } catch {\r\n return 40;\r\n }\r\n }\r\n\r\n private setOverlapSizeCssPx(px: number): void {\r\n try {\r\n const root = this.profileFlex?.nativeElement || null;\r\n if (!root) return;\r\n const clamped = Math.max(8, Math.min(80, Math.round(px)));\r\n root.style.setProperty('--overlap-size', `${clamped}px`);\r\n } catch {}\r\n }\r\n\r\n waitForImagesAndInitDrag(): void {\r\n const shapeBg1 = this.shapeBg1?.nativeElement as SVGElement | null;\r\n const shapeBg2 = this.shapeBg2?.nativeElement as SVGElement | null;\r\n\r\n if (!shapeBg1 || !shapeBg2) {\r\n return;\r\n }\r\n\r\n const checkImagesLoaded = () => {\r\n // For SVG elements, check if they're rendered instead of naturalWidth\r\n const img1Loaded = shapeBg1 && shapeBg1.getBoundingClientRect().width > 0;\r\n const img2Loaded = shapeBg2 && shapeBg2.getBoundingClientRect().width > 0;\r\n\r\n if (img1Loaded && img2Loaded) {\r\n setTimeout(() => this.initDrag(), 50);\r\n } else {\r\n setTimeout(checkImagesLoaded, 100);\r\n }\r\n };\r\n\r\n checkImagesLoaded();\r\n }\r\n\r\n initDrag() {\r\n const shapeBg1 = this.shapeBg1?.nativeElement as SVGElement | null;\r\n const shapeBg2 = this.shapeBg2?.nativeElement as SVGElement | null;\r\n const shapeTextLeft = this.shapeTextLeft?.nativeElement || null;\r\n const shapeTextRight = this.shapeTextRight?.nativeElement || null;\r\n if (!shapeBg1 || !shapeBg2 || !shapeTextLeft || !shapeTextRight) return;\r\n\r\n // Cast to HTMLElement to access style properties conveniently, as SVGElement style handling can be similar in this context\r\n const shapeBg1El = shapeBg1 as unknown as HTMLElement;\r\n const shapeBg2El = shapeBg2 as unknown as HTMLElement;\r\n\r\n shapeBg1El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n // shapeBg1El.style.objectFit = ProfileComparisonLibComponent.SHAPE_BG_OBJECT_FIT;\r\n // shapeBg1El.style.objectPosition = ProfileComparisonLibComponent.SHAPE_BG1_OBJECT_POSITION;\r\n shapeBg2El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n // shapeBg2El.style.objectFit = ProfileComparisonLibComponent.SHAPE_BG_OBJECT_FIT;\r\n // shapeBg2El.style.objectPosition = ProfileComparisonLibComponent.SHAPE_BG2_OBJECT_POSITION;\r\n\r\n const originalWidth1 = shapeBg1.getBoundingClientRect().width;\r\n const originalWidth2 = shapeBg2.getBoundingClientRect().width;\r\n\r\n const minWidth = ProfileComparisonLibComponent.DRAG_MIN_WIDTH;\r\n const maxWidth = ProfileComparisonLibComponent.DRAG_MAX_WIDTH;\r\n\r\n let isDragging = false;\r\n let dragStartX = 0;\r\n let initialWidth1 = 0;\r\n let initialWidth2 = 0;\r\n let activeImg: SVGElement | null = null;\r\n\r\n // Use ViewChild for center text\r\n const shapeTextCenter = this.shapeTextCenter?.nativeElement || null;\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (!isDragging || !activeImg) return;\r\n\r\n const deltaX = e.clientX - dragStartX;\r\n const containerWidth = this.shapeContainer?.nativeElement?.clientWidth || 0;\r\n\r\n let newWidth1 = initialWidth1;\r\n let newWidth2 = initialWidth2;\r\n\r\n if (activeImg === shapeBg1) {\r\n newWidth1 = initialWidth1 + deltaX;\r\n newWidth2 = initialWidth2 - deltaX;\r\n } else if (activeImg === shapeBg2) {\r\n newWidth1 = initialWidth1 - deltaX;\r\n newWidth2 = initialWidth2 + deltaX;\r\n }\r\n\r\n newWidth1 = Math.max(minWidth, Math.min(maxWidth, newWidth1));\r\n newWidth2 = Math.max(minWidth, Math.min(maxWidth, newWidth2));\r\n\r\n shapeBg1El.style.width = newWidth1 + 'px';\r\n shapeBg1El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n shapeBg2El.style.width = newWidth2 + 'px';\r\n shapeBg2El.style.height = ProfileComparisonLibComponent.SHAPE_BG_HEIGHT;\r\n\r\n const widthChange1 = newWidth1 - originalWidth1;\r\n const widthChange2 = newWidth2 - originalWidth2;\r\n\r\n const dragDirection = deltaX > 0 ? 1 : -1;\r\n const dragDistance = Math.abs(deltaX);\r\n const maxDragDistance = ProfileComparisonLibComponent.MAX_DRAG_DISTANCE;\r\n const centerMoveDistance = Math.min(dragDistance, maxDragDistance) * dragDirection * ProfileComparisonLibComponent.CENTER_MOVE_MULTIPLIER;\r\n\r\n shapeTextLeft.style.transform = `translateX(${widthChange1 * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n shapeTextRight.style.transform = `translateX(${-widthChange2 * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transform = `translateX(${centerMoveDistance * ProfileComparisonLibComponent.TEXT_MOVE_MULTIPLIER}px)`;\r\n }\r\n };\r\n\r\n const resetWidths = () => {\r\n isDragging = false;\r\n activeImg = null;\r\n\r\n shapeBg1El.style.transition = ProfileComparisonLibComponent.TRANSITION_WIDTH;\r\n shapeBg2El.style.transition = ProfileComparisonLibComponent.TRANSITION_WIDTH;\r\n shapeTextLeft.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n shapeTextRight.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transition = ProfileComparisonLibComponent.TRANSITION_TRANSFORM;\r\n }\r\n\r\n shapeBg1El.style.width = originalWidth1 + 'px';\r\n shapeBg2El.style.width = originalWidth2 + 'px';\r\n\r\n shapeTextLeft.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n shapeTextRight.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transform = ProfileComparisonLibComponent.TRANSFORM_RESET;\r\n }\r\n\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', resetWidths);\r\n document.removeEventListener('mouseleave', resetWidths);\r\n\r\n setTimeout(() => {\r\n shapeBg1El.style.transition = '';\r\n shapeBg2El.style.transition = '';\r\n shapeTextLeft.style.transition = '';\r\n shapeTextRight.style.transition = '';\r\n if (shapeTextCenter) {\r\n shapeTextCenter.style.transition = '';\r\n }\r\n }, ProfileComparisonLibComponent.TRANSITION_RESET_DELAY_MS);\r\n };\r\n\r\n [shapeBg1, shapeBg2].forEach((img) => {\r\n img.addEventListener('mousedown', (e: MouseEvent) => {\r\n e.preventDefault();\r\n isDragging = true;\r\n activeImg = img;\r\n dragStartX = e.clientX;\r\n initialWidth1 = shapeBg1.getBoundingClientRect().width;\r\n initialWidth2 = shapeBg2.getBoundingClientRect().width;\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', resetWidths);\r\n document.addEventListener('mouseleave', resetWidths);\r\n });\r\n });\r\n }\r\n\r\n private normalizeSimilarityToken(value: string): string {\r\n return String(value ?? '')\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '');\r\n }\r\n\r\n private findLegendEntry(label: string): { abbr: string; full: string } | undefined {\r\n const legend = this.matrixData?.legend ?? [];\r\n if (!legend.length) return undefined;\r\n\r\n const exact = String(label).trim().toLowerCase();\r\n const exactMatch = legend.find(l => String(l.full).trim().toLowerCase() === exact);\r\n if (exactMatch) return exactMatch;\r\n\r\n const normalized = this.normalizeSimilarityToken(label);\r\n if (!normalized) return undefined;\r\n\r\n return legend.find(l => {\r\n const full = this.normalizeSimilarityToken(l.full);\r\n const abbr = this.normalizeSimilarityToken(l.abbr);\r\n return full === normalized || abbr === normalized;\r\n });\r\n }\r\n\r\n private lookupSimilarity(rowAbbr: string, colAbbr: string): number | null {\r\n if (!this.matrixData) return null;\r\n const colIdx = this.matrixData.headers?.indexOf(colAbbr);\r\n if (colIdx === -1 || colIdx === undefined) return null;\r\n const row = this.matrixData.rows?.find(r => r.label === rowAbbr);\r\n if (!row || !row.values || colIdx >= row.values.length) return null;\r\n const val = parseFloat(row.values[colIdx]);\r\n return isNaN(val) ? null : val;\r\n }\r\n\r\n private getSimilarity(item1: string, item2: string): number {\r\n if (!this.matrixData || !item1 || !item2) return 0;\r\n const n1 = this.normalizeSimilarityToken(item1);\r\n const n2 = this.normalizeSimilarityToken(item2);\r\n if (!n1 || !n2) return 0;\r\n if (n1 === n2) return 1.0;\r\n\r\n const leg1 = this.findLegendEntry(item1);\r\n const leg2 = this.findLegendEntry(item2);\r\n if (!leg1 || !leg2) return 0;\r\n\r\n const direct = this.lookupSimilarity(leg1.abbr, leg2.abbr);\r\n if (direct != null) return direct;\r\n\r\n const reverse = this.lookupSimilarity(leg2.abbr, leg1.abbr);\r\n if (reverse != null) return reverse;\r\n\r\n return 0;\r\n }\r\n\r\n // ── Force-directed chip layout ──────────────────────────────────────────\r\n\r\n private orderBySemanticBarycenter(sourceItems: string[], targetItems: string[]): string[] {\r\n const source = [...sourceItems];\r\n if (source.length <= 1 || targetItems.length === 0) return source;\r\n\r\n const ranked = source.map((label, index) => {\r\n let weightedTargetIndex = 0;\r\n let totalWeight = 0;\r\n for (let i = 0; i < targetItems.length; i++) {\r\n const sim = Math.max(0, this.getSimilarity(label, targetItems[i]));\r\n if (sim <= 0) continue;\r\n weightedTargetIndex += i * sim;\r\n totalWeight += sim;\r\n }\r\n return {\r\n label,\r\n index,\r\n barycenter: totalWeight > 0 ? weightedTargetIndex / totalWeight : index,\r\n totalWeight,\r\n };\r\n });\r\n\r\n ranked.sort((a, b) =>\r\n (a.barycenter - b.barycenter) ||\r\n (b.totalWeight - a.totalWeight) ||\r\n (a.index - b.index)\r\n );\r\n\r\n return ranked.map(item => item.label);\r\n }\r\n\r\n private orderSharedBySemanticPull(sharedItems: string[], p1Items: string[], p2Items: string[]): string[] {\r\n const shared = [...sharedItems];\r\n if (shared.length <= 1) return shared;\r\n\r\n const context = [...p1Items, ...p2Items];\r\n if (context.length === 0) return shared;\r\n\r\n const ranked = shared.map((label, index) => {\r\n let weightedIndex = 0;\r\n let totalWeight = 0;\r\n let strongest = 0;\r\n for (let i = 0; i < context.length; i++) {\r\n const sim = Math.max(0, this.getSimilarity(label, context[i]));\r\n if (sim <= 0) continue;\r\n weightedIndex += i * sim;\r\n totalWeight += sim;\r\n strongest = Math.max(strongest, sim);\r\n }\r\n return {\r\n label,\r\n index,\r\n barycenter: totalWeight > 0 ? weightedIndex / totalWeight : index,\r\n strongest,\r\n };\r\n });\r\n\r\n ranked.sort((a, b) =>\r\n (b.strongest - a.strongest) ||\r\n (a.barycenter - b.barycenter) ||\r\n (a.index - b.index)\r\n );\r\n\r\n return ranked.map(item => item.label);\r\n }\r\n\r\n private canLinkNodes(a: ForceChipNode, b: ForceChipNode): boolean {\r\n if (a.group === 'shared' && b.group === 'shared') return true;\r\n if (a.group === b.group) return false;\r\n if (a.group === 'shared' || b.group === 'shared') return true;\r\n return (a.group === 'p1' && b.group === 'p2') || (a.group === 'p2' && b.group === 'p1');\r\n }\r\n\r\n private getLinkNodeId(ref: ForceChipNode | string | number): string {\r\n return typeof ref === 'object' ? ref.id : String(ref);\r\n }\r\n\r\n private getLinkPairKey(a: ForceChipNode | string | number, b: ForceChipNode | string | number): string {\r\n const idA = this.getLinkNodeId(a);\r\n const idB = this.getLinkNodeId(b);\r\n return idA < idB ? `${idA}|${idB}` : `${idB}|${idA}`;\r\n }\r\n\r\n private getRuntimeLinkStrength(link: Pick<ForceChipLink, 'kind' | 'strength'>): number {\r\n return link.kind === 'cross'\r\n ? link.strength * 1.7\r\n : link.strength * 1.12;\r\n }\r\n\r\n private selectLinksWithCaps(candidates: ForceChipLink[], maxPerNode: number, minPerNode = 0): ForceChipLink[] {\r\n if (!candidates.length || maxPerNode <= 0) return [];\r\n\r\n const sorted = [...candidates].sort((a, b) =>\r\n (b.similarity - a.similarity) ||\r\n (b.strength - a.strength)\r\n );\r\n\r\n const counts = new Map<string, number>();\r\n const selected: ForceChipLink[] = [];\r\n const selectedKeys = new Set<string>();\r\n\r\n const getCount = (id: string): number => counts.get(id) ?? 0;\r\n const increment = (id: string): void => {\r\n counts.set(id, getCount(id) + 1);\r\n };\r\n const canAdd = (link: ForceChipLink): boolean => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n if (getCount(sourceId) >= maxPerNode) return false;\r\n if (getCount(targetId) >= maxPerNode) return false;\r\n return true;\r\n };\r\n const add = (link: ForceChipLink): boolean => {\r\n const key = this.getLinkPairKey(link.source as ForceChipNode | string | number, link.target as ForceChipNode | string | number);\r\n if (selectedKeys.has(key) || !canAdd(link)) return false;\r\n\r\n selectedKeys.add(key);\r\n selected.push(link);\r\n\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n increment(sourceId);\r\n increment(targetId);\r\n return true;\r\n };\r\n\r\n const nodeIds = new Set<string>();\r\n const perNodeCandidates = new Map<string, ForceChipLink[]>();\r\n sorted.forEach(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n nodeIds.add(sourceId);\r\n nodeIds.add(targetId);\r\n\r\n const sourceBucket = perNodeCandidates.get(sourceId) ?? [];\r\n sourceBucket.push(link);\r\n perNodeCandidates.set(sourceId, sourceBucket);\r\n\r\n const targetBucket = perNodeCandidates.get(targetId) ?? [];\r\n targetBucket.push(link);\r\n perNodeCandidates.set(targetId, targetBucket);\r\n });\r\n\r\n // Phase 1: satisfy minimum significant relationships before dense global fill.\r\n if (minPerNode > 0) {\r\n let progressed = true;\r\n while (progressed) {\r\n progressed = false;\r\n nodeIds.forEach(nodeId => {\r\n while (getCount(nodeId) < minPerNode) {\r\n const next = (perNodeCandidates.get(nodeId) ?? []).find(link => {\r\n const key = this.getLinkPairKey(\r\n link.source as ForceChipNode | string | number,\r\n link.target as ForceChipNode | string | number\r\n );\r\n return !selectedKeys.has(key) && canAdd(link);\r\n });\r\n if (!next) break;\r\n if (!add(next)) break;\r\n progressed = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Phase 2: fill remaining slots globally by strongest links.\r\n sorted.forEach(link => {\r\n add(link);\r\n });\r\n\r\n if (minPerNode > 0) {\r\n // Best-effort soft fallback for low-degree nodes if they were blocked by caps.\r\n nodeIds.forEach(nodeId => {\r\n if (getCount(nodeId) >= minPerNode) return;\r\n (perNodeCandidates.get(nodeId) ?? []).forEach(link => {\r\n if (getCount(nodeId) >= minPerNode) return;\r\n const key = this.getLinkPairKey(\r\n link.source as ForceChipNode | string | number,\r\n link.target as ForceChipNode | string | number\r\n );\r\n if (selectedKeys.has(key)) return;\r\n\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n\r\n // Allow a slight overflow (+1) only to prevent isolated visual outliers.\r\n if ((getCount(sourceId) >= maxPerNode + 1) || (getCount(targetId) >= maxPerNode + 1)) return;\r\n add(link);\r\n });\r\n });\r\n }\r\n\r\n return selected;\r\n }\r\n\r\n private filterCenterItemsByThreshold(centerItems: string[], p1Items: string[], p2Items: string[]): string[] {\r\n if (!centerItems?.length) return [];\r\n\r\n const threshold = ProfileComparisonLibComponent.SHARED_PROMOTION_THRESHOLD;\r\n const uniq = new Set<string>();\r\n const selected: string[] = [];\r\n const normalize = (s: string) => this.normalizeSimilarityToken(s);\r\n\r\n const p1Norm = new Set((p1Items ?? []).map(normalize));\r\n const p2Norm = new Set((p2Items ?? []).map(normalize));\r\n\r\n for (const raw of centerItems) {\r\n const item = String(raw ?? '').trim();\r\n if (!item) continue;\r\n const key = normalize(item);\r\n if (!key || uniq.has(key)) continue;\r\n\r\n const existsInP1 = p1Norm.has(key);\r\n const existsInP2 = p2Norm.has(key);\r\n\r\n let maxCrossSim = 0;\r\n\r\n // If the value exists on the left, compare against right-side terms.\r\n if (existsInP1 || (!existsInP1 && !existsInP2)) {\r\n for (const right of p2Items ?? []) {\r\n maxCrossSim = Math.max(maxCrossSim, this.getSimilarity(item, right));\r\n }\r\n }\r\n\r\n // If the value exists on the right, compare against left-side terms.\r\n if (existsInP2 || (!existsInP1 && !existsInP2)) {\r\n for (const left of p1Items ?? []) {\r\n maxCrossSim = Math.max(maxCrossSim, this.getSimilarity(item, left));\r\n }\r\n }\r\n\r\n if (maxCrossSim >= threshold) {\r\n selected.push(item);\r\n uniq.add(key);\r\n }\r\n }\r\n\r\n return selected;\r\n }\r\n\r\n private scheduleForceGraphRebuild(): void {\r\n if (this.layoutRebuildRaf !== null) {\r\n cancelAnimationFrame(this.layoutRebuildRaf);\r\n this.layoutRebuildRaf = null;\r\n }\r\n this.ngZone.runOutsideAngular(() => {\r\n this.layoutRebuildRaf = requestAnimationFrame(() => {\r\n this.layoutRebuildRaf = null;\r\n this.ngZone.run(() => {\r\n if (!this.backendConfigured || !this.forceNodes.length) return;\r\n this.buildForceGraph();\r\n });\r\n });\r\n });\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n this.scheduleForceGraphRebuild();\r\n }\r\n\r\n private buildForceGraph(): void {\r\n const rawP1 = this.getPerson1UniqueInterests();\r\n const rawShared = (this.centerItem || []).filter(c => c && c !== 'empty' && c !== '-' && c !== '----');\r\n const rawP2 = this.getPerson2UniqueInterests();\r\n const capped = this.selectTopSharedInterestsPerSide(rawP1, rawP2);\r\n const cappedRawP1 = capped.p1;\r\n const cappedRawP2 = capped.p2;\r\n\r\n if (cappedRawP1.length === 0 && rawShared.length === 0 && cappedRawP2.length === 0) {\r\n this.forceNodes = [];\r\n this.forceLinks = [];\r\n this.forceCanvasHeight = 180;\r\n if (this.simulation) this.simulation.stop();\r\n return;\r\n }\r\n\r\n const p1Items = this.orderBySemanticBarycenter(cappedRawP1, cappedRawP2);\r\n const p2Items = this.orderBySemanticBarycenter(cappedRawP2, cappedRawP1);\r\n const shared = this.orderSharedBySemanticPull(rawShared, p1Items, p2Items);\r\n\r\n // --- Read container width robustly ---\r\n let containerWidth = 0;\r\n try { containerWidth = this.chipsGrid?.nativeElement?.clientWidth ?? 0; } catch { /* */ }\r\n if (!containerWidth) {\r\n try { containerWidth = this.hostRef.nativeElement.getBoundingClientRect().width; } catch { /* */ }\r\n }\r\n if (!containerWidth) {\r\n try {\r\n const el = this.profileFlex?.nativeElement as HTMLElement | null;\r\n containerWidth = el ? (el.clientWidth || el.getBoundingClientRect().width || 0) : 0;\r\n } catch { /* */ }\r\n }\r\n if (!containerWidth || containerWidth < 100) {\r\n this.ngZone.runOutsideAngular(() => {\r\n requestAnimationFrame(() => {\r\n this.ngZone.run(() => this.buildForceGraph());\r\n });\r\n });\r\n return;\r\n }\r\n\r\n const maxRows = Math.max(p1Items.length, shared.length, p2Items.length, 1);\r\n\r\n let availableHeight = 0;\r\n try { availableHeight = this.chipsGrid?.nativeElement?.clientHeight ?? 0; } catch { /* */ }\r\n if (!availableHeight) {\r\n try {\r\n const el = this.profileFlex?.nativeElement as HTMLElement | null;\r\n const h = el ? (el.clientHeight || el.getBoundingClientRect().height || 0) : 0;\r\n availableHeight = Math.max(120, h - 90);\r\n } catch { /* */ }\r\n }\r\n if (!availableHeight || availableHeight < 120) availableHeight = 320;\r\n\r\n const baseChipH = ProfileComparisonLibComponent.CHIP_RADIUS * 2;\r\n const baseStartY = 34;\r\n const baseRowGapExtra = 14;\r\n const baseBottomPad = 30;\r\n const requiredBaseHeight = baseStartY + baseBottomPad + maxRows * baseChipH + Math.max(0, maxRows - 1) * baseRowGapExtra;\r\n const fitScale = Math.min(1, Math.max(0.35, availableHeight / Math.max(requiredBaseHeight, 1)));\r\n\r\n const chipH = Math.max(14, Math.round(baseChipH * fitScale));\r\n const chipHalfH = chipH / 2;\r\n const startY = Math.max(12, Math.round(baseStartY * fitScale));\r\n const rowGap = chipH + Math.max(5, Math.round(baseRowGapExtra * fitScale));\r\n const bottomPad = Math.max(10, Math.round(baseBottomPad * fitScale));\r\n const canvasPad = Math.max(8, Math.round(ProfileComparisonLibComponent.CANVAS_PADDING * fitScale * 0.75));\r\n\r\n // Keep rendered chip dimensions in sync with force-layout math.\r\n this.chipFontSizePx = Math.max(9.5, Number((14 * Math.max(fitScale, 0.68)).toFixed(2)));\r\n this.chipPaddingXPx = Math.max(8, Math.round(18 * Math.max(fitScale, 0.58)));\r\n this.chipPaddingYPx = Math.max(2, Math.round(6 * Math.max(fitScale, 0.5)));\r\n this.chipLineHeight = fitScale < 0.55 ? 1.15 : (fitScale < 0.8 ? 1.22 : 1.3);\r\n\r\n const approxCharWidth = this.chipFontSizePx * 0.53;\r\n const horizontalPadding = this.chipPaddingXPx * 2;\r\n const getHalfWidth = (label: string) => (label.length * approxCharWidth + horizontalPadding) / 2;\r\n const EDGE_PADDING = 20;\r\n\r\n const maxHalfP1 = p1Items.length ? Math.max(...p1Items.map(getHalfWidth)) : chipHalfH;\r\n const maxHalfShared = shared.length ? Math.max(...shared.map(getHalfWidth)) : chipHalfH;\r\n const maxHalfP2 = p2Items.length ? Math.max(...p2Items.map(getHalfWidth)) : chipHalfH;\r\n\r\n let zoneP1 = maxHalfP1 + EDGE_PADDING;\r\n let zoneP2 = containerWidth - maxHalfP2 - EDGE_PADDING;\r\n if (zoneP2 - zoneP1 < 140) {\r\n const center = containerWidth / 2;\r\n zoneP1 = Math.max(maxHalfP1 + EDGE_PADDING, center - 70);\r\n zoneP2 = Math.min(containerWidth - maxHalfP2 - EDGE_PADDING, center + 70);\r\n }\r\n const minShared = Math.max(zoneP1 + Math.max(maxHalfP1, maxHalfShared) * 0.6, maxHalfShared + EDGE_PADDING);\r\n const maxShared = Math.min(zoneP2 - Math.max(maxHalfP2, maxHalfShared) * 0.6, containerWidth - maxHalfShared - EDGE_PADDING);\r\n const zoneShared = Math.max(minShared, Math.min(maxShared, containerWidth * 0.5));\r\n\r\n const computedMaxY = startY + chipHalfH + (maxRows - 1) * rowGap + chipHalfH + bottomPad;\r\n const safeMaxY = Math.max(startY + chipHalfH, availableHeight - chipHalfH - 8);\r\n const maxY = Math.min(computedMaxY, safeMaxY);\r\n const minCenterY = startY + chipHalfH;\r\n const verticalSpan = Math.max(0, maxY - minCenterY);\r\n const centerGuard = Math.max(12, Math.min(26, (zoneP2 - zoneP1) * 0.12));\r\n const maxHalfAny = Math.max(maxHalfP1, maxHalfShared, maxHalfP2, chipHalfH);\r\n const globalMinX = maxHalfAny + EDGE_PADDING;\r\n const globalMaxX = containerWidth - maxHalfAny - EDGE_PADDING;\r\n const dividerLeft = (zoneP1 + zoneShared) / 2;\r\n const dividerRight = (zoneShared + zoneP2) / 2;\r\n const laneGap = Math.max(4, Math.min(16, centerGuard * 0.45));\r\n const sharedRawMin = Math.max(globalMinX, dividerLeft + laneGap);\r\n const sharedRawMax = Math.min(globalMaxX, dividerRight - laneGap);\r\n const sharedRawWidth = Math.max(0, sharedRawMax - sharedRawMin);\r\n const sharedTighten = Math.max(12, Math.min(34, sharedRawWidth * 0.22));\r\n const sharedMinWidth = Math.max(44, Math.min(84, maxHalfShared * 1.05));\r\n let p1BoundsMinX = globalMinX;\r\n let p1BoundsMaxX = Math.min(globalMaxX, dividerLeft - laneGap);\r\n let sharedBoundsMinX = Math.max(globalMinX, sharedRawMin + sharedTighten);\r\n let sharedBoundsMaxX = Math.min(globalMaxX, sharedRawMax - sharedTighten);\r\n let p2BoundsMinX = Math.max(globalMinX, dividerRight + laneGap);\r\n let p2BoundsMaxX = globalMaxX;\r\n if (p1BoundsMaxX < p1BoundsMinX) p1BoundsMaxX = p1BoundsMinX;\r\n if (p2BoundsMinX > p2BoundsMaxX) p2BoundsMinX = p2BoundsMaxX;\r\n if (sharedBoundsMaxX - sharedBoundsMinX < sharedMinWidth) {\r\n const centerX = Math.max(globalMinX, Math.min(globalMaxX, zoneShared));\r\n const fallbackHalfWidth = sharedMinWidth / 2;\r\n sharedBoundsMinX = Math.max(globalMinX, centerX - fallbackHalfWidth);\r\n sharedBoundsMaxX = Math.min(globalMaxX, centerX + fallbackHalfWidth);\r\n if (sharedBoundsMaxX < sharedBoundsMinX) {\r\n sharedBoundsMinX = centerX;\r\n sharedBoundsMaxX = centerX;\r\n }\r\n }\r\n\r\n // --- Scan matrix for max similarity to normalize spring distances ---\r\n let matrixMax = 0;\r\n if (this.matrixData?.rows) {\r\n for (const row of this.matrixData.rows) {\r\n for (const v of row.values) {\r\n const n = parseFloat(v);\r\n if (!isNaN(n) && n > matrixMax) matrixMax = n;\r\n }\r\n }\r\n }\r\n const springThreshold = ProfileComparisonLibComponent.SPRING_THRESHOLD;\r\n const crossLinkThreshold = ProfileComparisonLibComponent.CROSS_LINK_MIN_SIMILARITY;\r\n if (matrixMax <= springThreshold) matrixMax = 1.0;\r\n const simRange = matrixMax - springThreshold;\r\n\r\n const columnCoreY = minCenterY + verticalSpan * 0.5;\r\n const getMedian = (values: number[]): number => {\r\n if (!values.length) return 0;\r\n const sorted = [...values].sort((a, b) => a - b);\r\n const mid = Math.floor(sorted.length / 2);\r\n if (sorted.length % 2 === 1) return sorted[mid];\r\n return (sorted[mid - 1] + sorted[mid]) / 2;\r\n };\r\n const getTopSixMedian = (values: number[]): number => {\r\n if (!values.length) return 0;\r\n const top = [...values].sort((a, b) => b - a).slice(0, Math.min(6, values.length));\r\n return getMedian(top);\r\n };\r\n const hashToken = (value: string): number => {\r\n let hash = 0;\r\n for (let i = 0; i < value.length; i++) {\r\n hash = ((hash << 5) - hash + value.charCodeAt(i)) | 0;\r\n }\r\n return Math.abs(hash);\r\n };\r\n\r\n const nodes: ForceChipNode[] = [];\r\n const addNodes = (items: string[], group: 'p1' | 'shared' | 'p2', zoneX: number) => {\r\n items.forEach((label, i) => {\r\n const targetY = columnCoreY;\r\n nodes.push({\r\n id: `${group}-${i}-${label}`,\r\n label,\r\n group,\r\n x: zoneX,\r\n y: targetY,\r\n targetX: zoneX,\r\n targetY,\r\n });\r\n });\r\n };\r\n\r\n addNodes(p1Items, 'p1', zoneP1);\r\n addNodes(shared, 'shared', zoneShared);\r\n addNodes(p2Items, 'p2', zoneP2);\r\n\r\n // Pull very high-similarity opposite-side chips toward the shared lane.\r\n const sharedThreshold = ProfileComparisonLibComponent.SHARED_PROMOTION_THRESHOLD;\r\n const sharedRange = Math.max(0.001, 1 - sharedThreshold);\r\n const oppositePool = (node: ForceChipNode): ForceChipNode[] => {\r\n if (node.group === 'p1') return nodes.filter(n => n.group === 'p2' || n.group === 'shared');\r\n if (node.group === 'p2') return nodes.filter(n => n.group === 'p1' || n.group === 'shared');\r\n return [];\r\n };\r\n\r\n nodes.forEach(node => {\r\n if (node.group === 'shared') {\r\n node.targetX = zoneShared;\r\n return;\r\n }\r\n\r\n let maxCross = 0;\r\n oppositePool(node).forEach(other => {\r\n maxCross = Math.max(maxCross, this.getSimilarity(node.label, other.label));\r\n });\r\n\r\n if (maxCross >= sharedThreshold) {\r\n const centerPull = 0.55 + Math.min(0.4, ((maxCross - sharedThreshold) / sharedRange) * 0.4);\r\n node.targetX = node.group === 'p1'\r\n ? zoneP1 + (zoneShared - zoneP1) * centerPull\r\n : zoneP2 + (zoneShared - zoneP2) * centerPull;\r\n }\r\n });\r\n\r\n // Build a relative attractiveness score (median of top-six similarities)\r\n // and seed chips from each column core with only a tiny 9x9 perturbation.\r\n // This lets forces \"emanate\" from a shared origin while preserving\r\n // deterministic reset behavior.\r\n const semanticPool = (node: ForceChipNode): ForceChipNode[] => {\r\n if (node.group === 'p1') return nodes.filter(n => n.group === 'p2' || n.group === 'shared');\r\n if (node.group === 'p2') return nodes.filter(n => n.group === 'p1' || n.group === 'shared');\r\n return nodes.filter(n => n.group === 'p1' || n.group === 'p2');\r\n };\r\n const getSemanticAttractiveness = (node: ForceChipNode): number => {\r\n const pool = semanticPool(node);\r\n if (!pool.length) return 0;\r\n const similarities = pool.map(other => Math.max(0, this.getSimilarity(node.label, other.label)));\r\n return getTopSixMedian(similarities);\r\n };\r\n const microSeedSpan = ProfileComparisonLibComponent.COLUMN_CORE_SEED_PIXELS;\r\n const microSeedHalf = microSeedSpan / 2;\r\n const deterministicPasses = ProfileComparisonLibComponent.DETERMINISTIC_SEED_PASSES;\r\n const deterministicBlend = ProfileComparisonLibComponent.DETERMINISTIC_SEED_BLEND;\r\n for (let pass = 0; pass < deterministicPasses; pass++) {\r\n (['p1', 'shared', 'p2'] as const).forEach(group => {\r\n const groupNodes = nodes.filter(node => node.group === group);\r\n if (groupNodes.length <= 1) return;\r\n const ranked = groupNodes\r\n .map(node => ({\r\n node,\r\n attractiveness: getSemanticAttractiveness(node),\r\n tie: this.normalizeSimilarityToken(node.label),\r\n }))\r\n .sort((a, b) => (b.attractiveness - a.attractiveness) || a.tie.localeCompare(b.tie));\r\n ranked.forEach((entry, index) => {\r\n const rankT = ranked.length <= 1 ? 0.5 : (index / Math.max(1, ranked.length - 1));\r\n const yOffset = (rankT - 0.5) * microSeedSpan;\r\n const desiredY = Math.max(minCenterY, Math.min(maxY, columnCoreY + yOffset));\r\n const currentY = entry.node.targetY ?? columnCoreY;\r\n entry.node.targetY = Math.max(\r\n minCenterY,\r\n Math.min(maxY, currentY + (desiredY - currentY) * deterministicBlend)\r\n );\r\n const xSeedRaw = hashToken(`${entry.node.id}:${pass}`) % (microSeedSpan + 1);\r\n const xOffset = xSeedRaw - microSeedHalf;\r\n const baseTargetX = entry.node.targetX ?? (entry.node.group === 'p1'\r\n ? zoneP1\r\n : (entry.node.group === 'p2' ? zoneP2 : zoneShared));\r\n entry.node.x = Math.max(globalMinX, Math.min(globalMaxX, baseTargetX + xOffset));\r\n entry.node.y = entry.node.targetY;\r\n });\r\n });\r\n }\r\n nodes.forEach(node => {\r\n const fallbackX = node.targetX ?? (node.group === 'p1' ? zoneP1 : (node.group === 'p2' ? zoneP2 : zoneShared));\r\n node.x = Math.max(globalMinX, Math.min(globalMaxX, node.x ?? fallbackX));\r\n node.y = Math.max(minCenterY, Math.min(maxY, node.targetY ?? columnCoreY));\r\n });\r\n\r\n const buildNodeBounds = (node: ForceChipNode): { minX: number; maxX: number; minY: number; maxY: number } => {\r\n let minX = globalMinX;\r\n let maxX = globalMaxX;\r\n if (node.group === 'p1') {\r\n minX = p1BoundsMinX;\r\n maxX = p1BoundsMaxX;\r\n } else if (node.group === 'p2') {\r\n minX = p2BoundsMinX;\r\n maxX = p2BoundsMaxX;\r\n } else {\r\n minX = sharedBoundsMinX;\r\n maxX = sharedBoundsMaxX;\r\n }\r\n\r\n // Y should be column-wide so any chip can travel vertically within its lane.\r\n return { minX, maxX, minY: minCenterY, maxY };\r\n };\r\n\r\n const nodeBounds = new Map<string, { minX: number; maxX: number; minY: number; maxY: number }>();\r\n nodes.forEach(node => nodeBounds.set(node.id, buildNodeBounds(node)));\r\n this.nodeDragBounds = new Map(nodeBounds);\r\n\r\n const clampNodeToBounds = (node: ForceChipNode): void => {\r\n const bounds = nodeBounds.get(node.id) ?? buildNodeBounds(node);\r\n node.x = Math.max(bounds.minX, Math.min(bounds.maxX, node.x ?? (node.targetX ?? zoneShared)));\r\n node.y = Math.max(bounds.minY, Math.min(bounds.maxY, node.y ?? (node.targetY ?? minCenterY)));\r\n };\r\n\r\n const crossCandidates: ForceChipLink[] = [];\r\n const intraCandidates: ForceChipLink[] = [];\r\n const MIN_DIST = 34;\r\n const SPAN = 72;\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n for (let j = i + 1; j < nodes.length; j++) {\r\n if (!this.canLinkNodes(nodes[i], nodes[j])) continue;\r\n const similarity = this.getSimilarity(nodes[i].label, nodes[j].label);\r\n if (similarity < crossLinkThreshold) continue;\r\n\r\n const normSim = Math.min(1, (similarity - springThreshold) / simRange);\r\n const distance = MIN_DIST + (1 - normSim) * SPAN;\r\n crossCandidates.push({\r\n kind: 'cross',\r\n source: nodes[i],\r\n target: nodes[j],\r\n strength: 0.32 + normSim * 0.68,\r\n similarity,\r\n distance,\r\n });\r\n }\r\n }\r\n\r\n const intraThreshold = ProfileComparisonLibComponent.INTRA_GROUP_THRESHOLD;\r\n const intraRange = Math.max(0.001, matrixMax - intraThreshold);\r\n (['p1', 'p2'] as const).forEach(group => {\r\n const groupNodes = nodes.filter(n => n.group === group);\r\n for (let i = 0; i < groupNodes.length; i++) {\r\n for (let j = i + 1; j < groupNodes.length; j++) {\r\n const similarity = this.getSimilarity(groupNodes[i].label, groupNodes[j].label);\r\n if (similarity <= intraThreshold) continue;\r\n const normSim = Math.min(1, (similarity - intraThreshold) / intraRange);\r\n intraCandidates.push({\r\n kind: 'intra',\r\n source: groupNodes[i],\r\n target: groupNodes[j],\r\n strength: 0.12 + normSim * 0.24,\r\n similarity,\r\n distance: 34 + (1 - normSim) * 46,\r\n });\r\n }\r\n }\r\n });\r\n\r\n const crossLinks = this.selectLinksWithCaps(\r\n crossCandidates,\r\n ProfileComparisonLibComponent.MAX_CROSS_LINKS_PER_NODE,\r\n ProfileComparisonLibComponent.MIN_CROSS_LINKS_PER_NODE\r\n );\r\n\r\n // Shared chips can otherwise become vertical outliers if greedy caps saturate\r\n // their best opposite-side neighbors too early. Ensure a minimum local anchor set.\r\n const crossCounts = new Map<string, number>();\r\n const crossKeys = new Set<string>();\r\n const countCross = (id: string): number => crossCounts.get(id) ?? 0;\r\n const bumpCross = (id: string): void => {\r\n crossCounts.set(id, countCross(id) + 1);\r\n };\r\n const recordCross = (link: ForceChipLink): void => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n if (crossKeys.has(key)) return;\r\n crossKeys.add(key);\r\n crossLinks.push(link);\r\n bumpCross(sourceId);\r\n bumpCross(targetId);\r\n };\r\n crossLinks.forEach(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n crossKeys.add(key);\r\n bumpCross(sourceId);\r\n bumpCross(targetId);\r\n });\r\n\r\n if (ProfileComparisonLibComponent.MIN_CROSS_LINKS_PER_NODE > 0) {\r\n const sharedNodesForAnchors = nodes.filter(n => n.group === 'shared');\r\n sharedNodesForAnchors.forEach(sharedNode => {\r\n const sharedId = sharedNode.id;\r\n const incidentCandidates = crossCandidates\r\n .filter(link => {\r\n const sourceId = this.getLinkNodeId(link.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(link.target as ForceChipNode | string | number);\r\n return sourceId === sharedId || targetId === sharedId;\r\n })\r\n .sort((a, b) => (b.similarity - a.similarity) || (b.strength - a.strength));\r\n\r\n const requiredAnchors = Math.min(3, incidentCandidates.length);\r\n for (const candidate of incidentCandidates) {\r\n if (countCross(sharedId) >= requiredAnchors) break;\r\n\r\n const sourceId = this.getLinkNodeId(candidate.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(candidate.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n if (crossKeys.has(key)) continue;\r\n\r\n const otherId = sourceId === sharedId ? targetId : sourceId;\r\n if (countCross(otherId) > ProfileComparisonLibComponent.MAX_CROSS_LINKS_PER_NODE + 1) continue;\r\n\r\n recordCross(candidate);\r\n }\r\n });\r\n }\r\n\r\n const intraLinks = this.selectLinksWithCaps(\r\n intraCandidates,\r\n ProfileComparisonLibComponent.MAX_INTRA_LINKS_PER_NODE\r\n );\r\n\r\n const links: ForceChipLink[] = [...crossLinks, ...intraLinks];\r\n const nodeById = new Map(nodes.map(n => [n.id, n] as const));\r\n const crossAdjacency = new Map<string, Array<{ node: ForceChipNode; similarity: number }>>();\r\n const addAdjacency = (source: ForceChipNode, target: ForceChipNode, similarity: number) => {\r\n const bucket = crossAdjacency.get(source.id) ?? [];\r\n bucket.push({ node: target, similarity });\r\n crossAdjacency.set(source.id, bucket);\r\n };\r\n crossLinks.forEach(link => {\r\n const source = typeof link.source === 'object' ? link.source : nodeById.get(String(link.source));\r\n const target = typeof link.target === 'object' ? link.target : nodeById.get(String(link.target));\r\n if (!source || !target) return;\r\n addAdjacency(source, target, link.similarity);\r\n addAdjacency(target, source, link.similarity);\r\n });\r\n\r\n const crossAlignForce = (alpha: number) => {\r\n crossAdjacency.forEach((neighbors, nodeId) => {\r\n const node = nodeById.get(nodeId);\r\n if (!node || !neighbors.length) return;\r\n let weightedY = 0;\r\n let totalWeight = 0;\r\n neighbors.forEach(({ node: other, similarity }) => {\r\n const weight = Math.max(0.05, similarity);\r\n weightedY += (other.y ?? node.y ?? 0) * weight;\r\n totalWeight += weight;\r\n });\r\n if (totalWeight <= 0) return;\r\n const targetY = weightedY / totalWeight;\r\n const dy = targetY - (node.y ?? targetY);\r\n const sparseNeighbors = neighbors.length <= 2;\r\n const alignStrength = node.group === 'shared'\r\n ? (sparseNeighbors ? 0.95 : 0.8)\r\n : (sparseNeighbors ? 0.82 : 0.68);\r\n node.vy = (node.vy ?? 0) + dy * alignStrength * alpha;\r\n });\r\n };\r\n\r\n const linkRecords = links\r\n .map(link => {\r\n const source = typeof link.source === 'object' ? link.source : nodeById.get(String(link.source));\r\n const target = typeof link.target === 'object' ? link.target : nodeById.get(String(link.target));\r\n if (!source || !target) return null;\r\n return {\r\n source,\r\n target,\r\n similarity: Number(link.similarity ?? link.strength ?? 0.5),\r\n kind: link.kind,\r\n };\r\n })\r\n .filter((record): record is { source: ForceChipNode; target: ForceChipNode; similarity: number; kind: 'cross' | 'intra' } => !!record);\r\n const dissimilarThreshold = ProfileComparisonLibComponent.DISSIMILAR_REPEL_THRESHOLD;\r\n const dissimilarPairs: Array<{ source: ForceChipNode; target: ForceChipNode; repulsion: number }> = [];\r\n for (let i = 0; i < nodes.length; i++) {\r\n for (let j = i + 1; j < nodes.length; j++) {\r\n const source = nodes[i];\r\n const target = nodes[j];\r\n const similarity = Math.max(0, this.getSimilarity(source.label, target.label));\r\n if (similarity >= dissimilarThreshold) continue;\r\n const laneFactor = source.group === target.group\r\n ? 1\r\n : (source.group === 'shared' || target.group === 'shared' ? 0.62 : 0.44);\r\n const repulsion = laneFactor * (dissimilarThreshold - similarity) / Math.max(0.001, dissimilarThreshold);\r\n dissimilarPairs.push({\r\n source,\r\n target,\r\n repulsion,\r\n });\r\n }\r\n }\r\n const relativeMedianByNode = new Map<string, number>();\r\n const relativeMedianPairs: Array<{ source: ForceChipNode; target: ForceChipNode; similarity: number; median: number }> = [];\r\n (['p1', 'shared', 'p2'] as const).forEach(group => {\r\n const groupNodes = nodes.filter(node => node.group === group);\r\n if (groupNodes.length <= 1) return;\r\n groupNodes.forEach(node => {\r\n const similarities = groupNodes\r\n .filter(other => other.id !== node.id)\r\n .map(other => Math.max(0, this.getSimilarity(node.label, other.label)));\r\n relativeMedianByNode.set(node.id, getTopSixMedian(similarities));\r\n });\r\n for (let i = 0; i < groupNodes.length; i++) {\r\n for (let j = i + 1; j < groupNodes.length; j++) {\r\n const source = groupNodes[i];\r\n const target = groupNodes[j];\r\n const similarity = Math.max(0, this.getSimilarity(source.label, target.label));\r\n const sourceMedian = relativeMedianByNode.get(source.id) ?? 0;\r\n const targetMedian = relativeMedianByNode.get(target.id) ?? 0;\r\n const median = (sourceMedian + targetMedian) / 2;\r\n relativeMedianPairs.push({ source, target, similarity, median });\r\n }\r\n }\r\n });\r\n const maxLinkSimilarity = Math.max(0.001, ...linkRecords.map(record => Math.max(0, record.similarity)));\r\n const MIN_PAIR_DISTANCE = 34;\r\n const MAX_PAIR_DISTANCE = 88;\r\n const semanticAlphaFloor = ProfileComparisonLibComponent.SEMANTIC_STABILITY_ALPHA_FLOOR;\r\n const relativeMedianColumnForce = (alpha: number) => {\r\n const effectiveAlpha = Math.max(alpha, ProfileComparisonLibComponent.RELATIVE_MEDIAN_ALPHA_FLOOR);\r\n const attractStrength = ProfileComparisonLibComponent.RELATIVE_MEDIAN_ATTRACT_STRENGTH;\r\n const repelStrength = ProfileComparisonLibComponent.RELATIVE_MEDIAN_REPEL_STRENGTH;\r\n const attractRadius = ProfileComparisonLibComponent.RELATIVE_MEDIAN_ATTRACT_RADIUS;\r\n const repelRadius = ProfileComparisonLibComponent.RELATIVE_MEDIAN_REPEL_RADIUS;\r\n const deltaDeadband = 0.025;\r\n relativeMedianPairs.forEach(pair => {\r\n const dx = (pair.target.x ?? 0) - (pair.source.x ?? 0);\r\n const dy = (pair.target.y ?? 0) - (pair.source.y ?? 0);\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const delta = pair.similarity - pair.median;\r\n if (Math.abs(delta) <= deltaDeadband) return;\r\n if (delta >= 0) {\r\n const closenessBias = Math.max(0.08, Math.min(1, delta + 0.08));\r\n const targetDistance = Math.max(24, attractRadius - closenessBias * 46);\r\n if (dist <= targetDistance + 2) return;\r\n const pull = attractStrength * effectiveAlpha * closenessBias * ((dist - targetDistance) / dist);\r\n pair.source.vx = (pair.source.vx ?? 0) + dx * pull;\r\n pair.source.vy = (pair.source.vy ?? 0) + dy * pull;\r\n pair.target.vx = (pair.target.vx ?? 0) - dx * pull;\r\n pair.target.vy = (pair.target.vy ?? 0) - dy * pull;\r\n return;\r\n }\r\n\r\n if (dist >= repelRadius || dist <= 28) return;\r\n const underMedian = Math.min(1, Math.abs(delta) / Math.max(0.001, pair.median + 0.05));\r\n const push = repelStrength * effectiveAlpha * underMedian * (1 - (dist / repelRadius));\r\n if (push <= 0) return;\r\n const unitX = dx / dist;\r\n const unitY = dy / dist;\r\n pair.source.vx = (pair.source.vx ?? 0) - unitX * push;\r\n pair.source.vy = (pair.source.vy ?? 0) - unitY * push;\r\n pair.target.vx = (pair.target.vx ?? 0) + unitX * push;\r\n pair.target.vy = (pair.target.vy ?? 0) + unitY * push;\r\n });\r\n };\r\n const similarityAttractionForce = (alpha: number) => {\r\n const effectiveAlpha = Math.max(alpha, semanticAlphaFloor);\r\n linkRecords.forEach(record => {\r\n const dx = (record.target.x ?? 0) - (record.source.x ?? 0);\r\n const dy = (record.target.y ?? 0) - (record.source.y ?? 0);\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const normalizedSimilarity = Math.max(0, Math.min(1, record.similarity / maxLinkSimilarity));\r\n const targetDistance = MIN_PAIR_DISTANCE + (MAX_PAIR_DISTANCE - MIN_PAIR_DISTANCE) * (1 - normalizedSimilarity);\r\n if (dist <= targetDistance) return;\r\n const pullGap = dist - targetDistance;\r\n const pullBase = record.kind === 'cross' ? 0.86 : 0.78;\r\n const nonlinearBoost = 1\r\n + Math.pow(normalizedSimilarity, ProfileComparisonLibComponent.STRONG_SIMILARITY_BOOST_EXPONENT)\r\n * ProfileComparisonLibComponent.STRONG_SIMILARITY_BOOST_SCALE;\r\n const pullFactor = pullBase * nonlinearBoost * effectiveAlpha * (pullGap / dist);\r\n record.source.vx = (record.source.vx ?? 0) + dx * pullFactor;\r\n record.source.vy = (record.source.vy ?? 0) + dy * pullFactor;\r\n record.target.vx = (record.target.vx ?? 0) - dx * pullFactor;\r\n record.target.vy = (record.target.vy ?? 0) - dy * pullFactor;\r\n });\r\n };\r\n const dissimilarRepulsionForce = (alpha: number) => {\r\n const effectiveAlpha = Math.max(alpha, semanticAlphaFloor * 0.9);\r\n const maxDistance = ProfileComparisonLibComponent.DISSIMILAR_REPEL_MAX_DISTANCE;\r\n const decayDistance = ProfileComparisonLibComponent.DISSIMILAR_REPEL_DECAY_DISTANCE;\r\n const baseStrength = ProfileComparisonLibComponent.DISSIMILAR_REPEL_STRENGTH;\r\n dissimilarPairs.forEach(record => {\r\n const dx = (record.target.x ?? 0) - (record.source.x ?? 0);\r\n const dy = (record.target.y ?? 0) - (record.source.y ?? 0);\r\n const rawDistance = Math.sqrt(dx * dx + dy * dy) || 1;\r\n if (rawDistance >= maxDistance) return;\r\n const distance = Math.max(8, rawDistance);\r\n const closeness = 1 - Math.min(1, distance / maxDistance);\r\n const decay = Math.exp(-Math.pow(distance / Math.max(1, decayDistance), 2));\r\n const push = baseStrength * effectiveAlpha * record.repulsion * closeness * decay;\r\n if (push <= 0) return;\r\n const unitX = dx / distance;\r\n const unitY = dy / distance;\r\n record.source.vx = (record.source.vx ?? 0) - unitX * push;\r\n record.source.vy = (record.source.vy ?? 0) - unitY * push;\r\n record.target.vx = (record.target.vx ?? 0) + unitX * push;\r\n record.target.vy = (record.target.vy ?? 0) + unitY * push;\r\n });\r\n };\r\n const priorityMinSimilarity = ProfileComparisonLibComponent.PRIORITY_PAIR_MIN_SIMILARITY;\r\n const priorityPairCandidates = [...crossCandidates, ...intraCandidates]\r\n .filter(link => link.similarity >= priorityMinSimilarity)\r\n .sort((a, b) => (b.similarity - a.similarity) || (b.strength - a.strength));\r\n const priorityPairKeys = new Set<string>();\r\n const endpointClaims = new Map<string, number>();\r\n const maxPairsPerNode = 2;\r\n const getClaimCount = (id: string): number => endpointClaims.get(id) ?? 0;\r\n const priorityPairs = priorityPairCandidates\r\n .filter(candidate => {\r\n const sourceId = this.getLinkNodeId(candidate.source as ForceChipNode | string | number);\r\n const targetId = this.getLinkNodeId(candidate.target as ForceChipNode | string | number);\r\n const key = this.getLinkPairKey(sourceId, targetId);\r\n if (priorityPairKeys.has(key)) return false;\r\n if (getClaimCount(sourceId) >= maxPairsPerNode || getClaimCount(targetId) >= maxPairsPerNode) return false;\r\n priorityPairKeys.add(key);\r\n endpointClaims.set(sourceId, getClaimCount(sourceId) + 1);\r\n endpointClaims.set(targetId, getClaimCount(targetId) + 1);\r\n return true;\r\n })\r\n .map(link => {\r\n const source = typeof link.source === 'object' ? link.source : nodeById.get(String(link.source));\r\n const target = typeof link.target === 'object' ? link.target : nodeById.get(String(link.target));\r\n if (!source || !target) return null;\r\n return {\r\n source,\r\n target,\r\n similarity: Math.max(priorityMinSimilarity, Number(link.similarity ?? 0)),\r\n };\r\n })\r\n .filter((pair): pair is { source: ForceChipNode; target: ForceChipNode; similarity: number } => !!pair);\r\n const maxPrioritySimilarity = Math.max(priorityMinSimilarity, ...priorityPairs.map(pair => pair.similarity));\r\n const priorityPairForce = (alpha: number) => {\r\n const effectiveAlpha = Math.max(alpha, semanticAlphaFloor);\r\n const pairStrength = ProfileComparisonLibComponent.PRIORITY_PAIR_ATTRACTION_STRENGTH;\r\n const corridorRadius = ProfileComparisonLibComponent.PRIORITY_PAIR_CORRIDOR_RADIUS;\r\n const corridorRepel = ProfileComparisonLibComponent.PRIORITY_PAIR_CORRIDOR_REPEL_STRENGTH;\r\n priorityPairs.forEach(pair => {\r\n const ax = pair.source.x ?? 0;\r\n const ay = pair.source.y ?? 0;\r\n const bx = pair.target.x ?? 0;\r\n const by = pair.target.y ?? 0;\r\n const dx = bx - ax;\r\n const dy = by - ay;\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const similarityNorm = Math.max(0, Math.min(1, pair.similarity / Math.max(0.001, maxPrioritySimilarity)));\r\n const targetDistance = 26 + (1 - similarityNorm) * 20;\r\n if (dist > targetDistance) {\r\n const pull = pairStrength * effectiveAlpha * ((dist - targetDistance) / dist);\r\n pair.source.vx = (pair.source.vx ?? 0) + dx * pull;\r\n pair.source.vy = (pair.source.vy ?? 0) + dy * pull;\r\n pair.target.vx = (pair.target.vx ?? 0) - dx * pull;\r\n pair.target.vy = (pair.target.vy ?? 0) - dy * pull;\r\n }\r\n\r\n const segmentLenSq = dx * dx + dy * dy;\r\n if (segmentLenSq <= 1) return;\r\n nodes.forEach(candidate => {\r\n if (candidate.id === pair.source.id || candidate.id === pair.target.id) return;\r\n const candidateSimilarity = Math.max(\r\n this.getSimilarity(candidate.label, pair.source.label),\r\n this.getSimilarity(candidate.label, pair.target.label)\r\n );\r\n if (candidateSimilarity >= pair.similarity * 0.74) return;\r\n\r\n const px = candidate.x ?? 0;\r\n const py = candidate.y ?? 0;\r\n const tRaw = ((px - ax) * dx + (py - ay) * dy) / segmentLenSq;\r\n const t = Math.max(0, Math.min(1, tRaw));\r\n if (t <= 0.12 || t >= 0.88) return;\r\n const closestX = ax + dx * t;\r\n const closestY = ay + dy * t;\r\n const offX = px - closestX;\r\n const offY = py - closestY;\r\n const offDist = Math.sqrt(offX * offX + offY * offY) || 1;\r\n if (offDist >= corridorRadius) return;\r\n\r\n const proximity = 1 - (offDist / corridorRadius);\r\n const mismatch = 1 - Math.max(0, Math.min(1, candidateSimilarity / Math.max(0.001, pair.similarity)));\r\n const push = corridorRepel * effectiveAlpha * proximity * mismatch;\r\n if (push <= 0) return;\r\n\r\n const unitOffX = offX / offDist;\r\n const unitOffY = offY / offDist;\r\n candidate.vx = (candidate.vx ?? 0) + unitOffX * push;\r\n candidate.vy = (candidate.vy ?? 0) + unitOffY * push;\r\n // Counter-force keeps the pair stable while opening a semantic corridor.\r\n const damp = push * 0.24;\r\n pair.source.vx = (pair.source.vx ?? 0) - unitOffX * damp;\r\n pair.source.vy = (pair.source.vy ?? 0) - unitOffY * damp;\r\n pair.target.vx = (pair.target.vx ?? 0) - unitOffX * damp;\r\n pair.target.vy = (pair.target.vy ?? 0) - unitOffY * damp;\r\n });\r\n });\r\n };\r\n type BestMatch = { node: ForceChipNode | null; best: number; second: number };\r\n const bestByNode = new Map<string, BestMatch>();\r\n nodes.forEach(node => {\r\n let bestNode: ForceChipNode | null = null;\r\n let best = -1;\r\n let second = -1;\r\n nodes.forEach(other => {\r\n if (other.id === node.id) return;\r\n const similarity = Math.max(0, this.getSimilarity(node.label, other.label));\r\n if (similarity > best) {\r\n second = best;\r\n best = similarity;\r\n bestNode = other;\r\n } else if (similarity > second) {\r\n second = similarity;\r\n }\r\n });\r\n bestByNode.set(node.id, { node: bestNode, best: Math.max(0, best), second: Math.max(0, second) });\r\n });\r\n const mutualPairMinSimilarity = ProfileComparisonLibComponent.MUTUAL_TOP_PAIR_MIN_SIMILARITY;\r\n const mutualPairMargin = ProfileComparisonLibComponent.MUTUAL_TOP_PAIR_MARGIN;\r\n const mutualPairKeys = new Set<string>();\r\n const mutualTopPairs = nodes\r\n .map(node => {\r\n const best = bestByNode.get(node.id);\r\n if (!best?.node) return null;\r\n if (best.best < mutualPairMinSimilarity) return null;\r\n if (best.best - best.second < mutualPairMargin) return null;\r\n const reverse = bestByNode.get(best.node.id);\r\n if (!reverse?.node || reverse.node.id !== node.id) return null;\r\n if (reverse.best < mutualPairMinSimilarity || reverse.best - reverse.second < mutualPairMargin) return null;\r\n const key = this.getLinkPairKey(node.id, best.node.id);\r\n if (mutualPairKeys.has(key)) return null;\r\n mutualPairKeys.add(key);\r\n return {\r\n source: node,\r\n target: best.node,\r\n similarity: Math.min(best.best, reverse.best),\r\n };\r\n })\r\n .filter((pair): pair is { source: ForceChipNode; target: ForceChipNode; similarity: number } => !!pair);\r\n const mutualTopPairForce = (alpha: number) => {\r\n const effectiveAlpha = Math.max(alpha, semanticAlphaFloor * 1.15);\r\n const attractionStrength = ProfileComparisonLibComponent.MUTUAL_TOP_PAIR_ATTRACTION_STRENGTH;\r\n const baseBarrierRadius = ProfileComparisonLibComponent.MUTUAL_TOP_PAIR_BARRIER_RADIUS;\r\n const repelStrength = ProfileComparisonLibComponent.MUTUAL_TOP_PAIR_REPEL_STRENGTH;\r\n mutualTopPairs.forEach(pair => {\r\n const ax = pair.source.x ?? 0;\r\n const ay = pair.source.y ?? 0;\r\n const bx = pair.target.x ?? 0;\r\n const by = pair.target.y ?? 0;\r\n const dx = bx - ax;\r\n const dy = by - ay;\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const norm = Math.max(0, Math.min(1, pair.similarity));\r\n const targetDistance = 24 + (1 - norm) * 26;\r\n if (dist > targetDistance) {\r\n const pull = attractionStrength * effectiveAlpha * ((dist - targetDistance) / dist);\r\n pair.source.vx = (pair.source.vx ?? 0) + dx * pull;\r\n pair.source.vy = (pair.source.vy ?? 0) + dy * pull;\r\n pair.target.vx = (pair.target.vx ?? 0) - dx * pull;\r\n pair.target.vy = (pair.target.vy ?? 0) - dy * pull;\r\n }\r\n\r\n const segmentLenSq = dx * dx + dy * dy;\r\n if (segmentLenSq <= 1) return;\r\n const barrierRadius = baseBarrierRadius + (1 - norm) * 10;\r\n nodes.forEach(candidate => {\r\n if (candidate.id === pair.source.id || candidate.id === pair.target.id) return;\r\n const candidateSimilarity = Math.max(\r\n this.getSimilarity(candidate.label, pair.source.label),\r\n this.getSimilarity(candidate.label, pair.target.label)\r\n );\r\n if (candidateSimilarity >= pair.similarity * 0.76) return;\r\n\r\n const px = candidate.x ?? 0;\r\n const py = candidate.y ?? 0;\r\n const tRaw = ((px - ax) * dx + (py - ay) * dy) / segmentLenSq;\r\n const t = Math.max(0, Math.min(1, tRaw));\r\n if (t <= 0.08 || t >= 0.92) return;\r\n const closestX = ax + dx * t;\r\n const closestY = ay + dy * t;\r\n const offX = px - closestX;\r\n const offY = py - closestY;\r\n const offDist = Math.sqrt(offX * offX + offY * offY) || 1;\r\n if (offDist >= barrierRadius) return;\r\n\r\n const proximity = 1 - (offDist / barrierRadius);\r\n const mismatch = 1 - Math.max(0, Math.min(1, candidateSimilarity / Math.max(0.001, pair.similarity)));\r\n const push = repelStrength * effectiveAlpha * proximity * mismatch;\r\n if (push <= 0) return;\r\n\r\n const unitOffX = offX / offDist;\r\n const unitOffY = offY / offDist;\r\n candidate.vx = (candidate.vx ?? 0) + unitOffX * push;\r\n candidate.vy = (candidate.vy ?? 0) + unitOffY * push;\r\n const damp = push * 0.26;\r\n pair.source.vx = (pair.source.vx ?? 0) - unitOffX * damp;\r\n pair.source.vy = (pair.source.vy ?? 0) - unitOffY * damp;\r\n pair.target.vx = (pair.target.vx ?? 0) - unitOffX * damp;\r\n pair.target.vy = (pair.target.vy ?? 0) - unitOffY * damp;\r\n });\r\n });\r\n };\r\n const runObjectiveOptimizer = () => {\r\n if (!nodes.length) return;\r\n const attractionFloor = springThreshold;\r\n const dissimilarFloor = dissimilarThreshold;\r\n const pairRecords: Array<{ a: ForceChipNode; b: ForceChipNode; similarity: number }> = [];\r\n for (let i = 0; i < nodes.length; i++) {\r\n for (let j = i + 1; j < nodes.length; j++) {\r\n const similarity = Math.max(0, this.getSimilarity(nodes[i].label, nodes[j].label));\r\n if (similarity <= dissimilarFloor || similarity >= attractionFloor) {\r\n pairRecords.push({ a: nodes[i], b: nodes[j], similarity });\r\n }\r\n }\r\n }\r\n const iterations = ProfileComparisonLibComponent.OBJECTIVE_OPTIMIZER_ITERATIONS;\r\n const stepStart = ProfileComparisonLibComponent.OBJECTIVE_STEP_START;\r\n const stepEnd = ProfileComparisonLibComponent.OBJECTIVE_STEP_END;\r\n const attractionWeight = ProfileComparisonLibComponent.OBJECTIVE_ATTRACTION_WEIGHT;\r\n const repulsionWeight = ProfileComparisonLibComponent.OBJECTIVE_REPULSION_WEIGHT;\r\n const anchorWeight = ProfileComparisonLibComponent.OBJECTIVE_ANCHOR_WEIGHT;\r\n const boundaryWeight = ProfileComparisonLibComponent.OBJECTIVE_BOUNDARY_WEIGHT;\r\n for (let iteration = 0; iteration < iterations; iteration++) {\r\n const progress = iteration / Math.max(1, iterations - 1);\r\n const step = stepStart + (stepEnd - stepStart) * progress;\r\n const gradient = new Map<string, { x: number; y: number }>();\r\n nodes.forEach(node => gradient.set(node.id, { x: 0, y: 0 }));\r\n\r\n pairRecords.forEach(record => {\r\n const ax = record.a.x ?? record.a.targetX ?? 0;\r\n const ay = record.a.y ?? record.a.targetY ?? 0;\r\n const bx = record.b.x ?? record.b.targetX ?? 0;\r\n const by = record.b.y ?? record.b.targetY ?? 0;\r\n const dx = bx - ax;\r\n const dy = by - ay;\r\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\r\n const unitX = dx / dist;\r\n const unitY = dy / dist;\r\n\r\n if (record.similarity >= attractionFloor) {\r\n const normalized = Math.max(\r\n 0,\r\n Math.min(1, (record.similarity - attractionFloor) / Math.max(0.001, 1 - attractionFloor))\r\n );\r\n const targetDistance = 24 + (1 - normalized) * 66;\r\n if (dist > targetDistance) {\r\n const pull = attractionWeight * Math.pow(normalized, 1.4) * ((dist - targetDistance) / dist);\r\n const gradA = gradient.get(record.a.id);\r\n const gradB = gradient.get(record.b.id);\r\n if (gradA && gradB) {\r\n gradA.x += dx * pull;\r\n gradA.y += dy * pull;\r\n gradB.x -= dx * pull;\r\n gradB.y -= dy * pull;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (record.similarity > dissimilarFloor) return;\r\n const normalized = (dissimilarFloor - record.similarity) / Math.max(0.001, dissimilarFloor);\r\n const maxDistance = 210;\r\n if (dist >= maxDistance) return;\r\n const push = repulsionWeight * normalized * (1 - (dist / maxDistance));\r\n const gradA = gradient.get(record.a.id);\r\n const gradB = gradient.get(record.b.id);\r\n if (gradA && gradB) {\r\n gradA.x -= unitX * push;\r\n gradA.y -= unitY * push;\r\n gradB.x += unitX * push;\r\n gradB.y += unitY * push;\r\n }\r\n });\r\n\r\n nodes.forEach(node => {\r\n const grad = gradient.get(node.id);\r\n if (!grad) return;\r\n const currentX = node.x ?? node.targetX ?? zoneShared;\r\n const currentY = node.y ?? node.targetY ?? minCenterY;\r\n const targetX = node.targetX ?? currentX;\r\n const targetY = node.targetY ?? currentY;\r\n grad.x += (targetX - currentX) * anchorWeight;\r\n grad.y += (targetY - currentY) * anchorWeight;\r\n\r\n const bounds = nodeBounds.get(node.id) ?? buildNodeBounds(node);\r\n if (currentX < bounds.minX) grad.x += (bounds.minX - currentX) * boundaryWeight;\r\n if (currentX > bounds.maxX) grad.x -= (currentX - bounds.maxX) * boundaryWeight;\r\n if (currentY < bounds.minY) grad.y += (bounds.minY - currentY) * boundaryWeight;\r\n if (currentY > bounds.maxY) grad.y -= (currentY - bounds.maxY) * boundaryWeight;\r\n });\r\n\r\n nodes.forEach(node => {\r\n const grad = gradient.get(node.id);\r\n if (!grad) return;\r\n node.x = (node.x ?? node.targetX ?? zoneShared) + grad.x * step;\r\n node.y = (node.y ?? node.targetY ?? minCenterY) + grad.y * step;\r\n clampNodeToBounds(node);\r\n });\r\n }\r\n };\r\n runObjectiveOptimizer();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const sim = forceSimulation<ForceChipNode>(nodes)\r\n .alphaDecay(0.014)\r\n .stop()\r\n .force('link', forceLink<ForceChipNode, ForceChipLink>(links)\r\n .id(d => d.id)\r\n .distance(d => d.distance)\r\n .strength(d => this.getRuntimeLinkStrength(d))\r\n )\r\n .force(\r\n 'collide',\r\n forceCollide<ForceChipNode>((d) => {\r\n const baseRadius = getHalfWidth(d.label) * 0.55 + ProfileComparisonLibComponent.CHIP_COLLISION_BORDER_PADDING;\r\n return Math.min(58, Math.max(ProfileComparisonLibComponent.CHIP_RADIUS + 8, baseRadius));\r\n })\r\n .strength(1)\r\n .iterations(2)\r\n )\r\n .force(\r\n 'xBound',\r\n forceX<ForceChipNode>(d => d.targetX ?? zoneShared)\r\n .strength(d => d.group === 'shared' ? 1.15 : 0.85)\r\n )\r\n .force('yTargetSeed', forceY<ForceChipNode>(d => d.targetY ?? minCenterY).strength(0.1))\r\n .force('crossAlign', crossAlignForce)\r\n .force('relativeMedianColumn', relativeMedianColumnForce)\r\n .force('similarityAttraction', similarityAttractionForce)\r\n .force('dissimilarRepulsion', dissimilarRepulsionForce)\r\n .force('priorityPair', priorityPairForce)\r\n .force('mutualTopPair', mutualTopPairForce);\r\n\r\n for (let i = 0; i < 420 && sim.alpha() > 0.0035; i++) {\r\n sim.tick();\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n });\r\n }\r\n\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n n.originalFx = n.x;\r\n n.originalFy = n.y;\r\n });\r\n\r\n sim.force('xBound', null);\r\n sim.force('yTargetSeed', null);\r\n sim.force('crossAlign', null);\r\n sim.force(\r\n 'xTarget',\r\n forceX<ForceChipNode>(d => d.originalFx ?? d.x ?? 0)\r\n .strength(d => d.group === 'shared' ? 0.085 : 0.03)\r\n );\r\n sim.force('yTarget', forceY<ForceChipNode>(d => d.originalFy ?? d.y ?? 0).strength(0.03));\r\n sim.alphaTarget(ProfileComparisonLibComponent.IDLE_ALPHA_TARGET);\r\n\r\n this.simulation = sim;\r\n\r\n this.ngZone.run(() => {\r\n this.forceNodes = [...nodes];\r\n this.forceLinks = links;\r\n const maxBottom = Math.max(...nodes.map(n => (n.y ?? 0) + chipHalfH));\r\n this.forceCanvasHeight = Math.ceil(Math.min(maxBottom + canvasPad, availableHeight));\r\n this.cdr.detectChanges();\r\n });\r\n\r\n sim.on('tick', () => {\r\n this.ngZone.run(() => {\r\n nodes.forEach(n => {\r\n clampNodeToBounds(n);\r\n });\r\n this.forceNodes = [...nodes];\r\n const maxBottom = Math.max(...nodes.map(n => (n.y ?? 0) + chipHalfH));\r\n this.forceCanvasHeight = Math.ceil(Math.min(maxBottom + canvasPad, availableHeight));\r\n this.cdr.detectChanges();\r\n });\r\n });\r\n });\r\n }\r\n\r\n private selectTopSharedInterestsPerSide(\r\n person1Items: string[],\r\n person2Items: string[]\r\n ): { p1: string[]; p2: string[] } {\r\n const limit = ProfileComparisonLibComponent.MAX_RELEVANT_INTERESTS_PER_SIDE;\r\n const sanitize = (items: string[]): string[] => {\r\n const seen = new Set<string>();\r\n const cleaned: string[] = [];\r\n (items || []).forEach(item => {\r\n const value = String(item ?? '').trim();\r\n if (!value) return;\r\n const key = value.toLowerCase();\r\n if (seen.has(key)) return;\r\n seen.add(key);\r\n cleaned.push(value);\r\n });\r\n return cleaned;\r\n };\r\n\r\n const p1 = sanitize(person1Items);\r\n const p2 = sanitize(person2Items);\r\n if (limit <= 0) return { p1: [], p2: [] };\r\n if (!p1.length || !p2.length) {\r\n return {\r\n p1: p1.slice(0, limit),\r\n p2: p2.slice(0, limit),\r\n };\r\n }\r\n\r\n type Pair = { p1: string; p2: string; similarity: number };\r\n const pairs: Pair[] = [];\r\n p1.forEach(item1 => {\r\n p2.forEach(item2 => {\r\n pairs.push({ p1: item1, p2: item2, similarity: this.getSimilarity(item1, item2) });\r\n });\r\n });\r\n pairs.sort((a, b) => b.similarity - a.similarity);\r\n\r\n const pickedP1 = new Set<string>();\r\n const pickedP2 = new Set<string>();\r\n const orderedP1: string[] = [];\r\n const orderedP2: string[] = [];\r\n\r\n for (const pair of pairs) {\r\n if (orderedP1.length >= limit && orderedP2.length >= limit) break;\r\n const canAddP1 = !pickedP1.has(pair.p1) && orderedP1.length < limit;\r\n const canAddP2 = !pickedP2.has(pair.p2) && orderedP2.length < limit;\r\n if (!canAddP1 && !canAddP2) continue;\r\n if (canAddP1) {\r\n pickedP1.add(pair.p1);\r\n orderedP1.push(pair.p1);\r\n }\r\n if (canAddP2) {\r\n pickedP2.add(pair.p2);\r\n orderedP2.push(pair.p2);\r\n }\r\n }\r\n\r\n const rankRemaining = (items: string[], opposite: string[], selected: Set<string>): string[] => {\r\n return items\r\n .filter(item => !selected.has(item))\r\n .map((item, index) => ({\r\n item,\r\n index,\r\n score: Math.max(...opposite.map(other => this.getSimilarity(item, other)), 0),\r\n }))\r\n .sort((a, b) => (b.score - a.score) || (a.index - b.index))\r\n .map(entry => entry.item);\r\n };\r\n\r\n rankRemaining(p1, p2, pickedP1).forEach(item => {\r\n if (orderedP1.length >= limit) return;\r\n pickedP1.add(item);\r\n orderedP1.push(item);\r\n });\r\n rankRemaining(p2, p1, pickedP2).forEach(item => {\r\n if (orderedP2.length >= limit) return;\r\n pickedP2.add(item);\r\n orderedP2.push(item);\r\n });\r\n\r\n return {\r\n p1: orderedP1.slice(0, limit),\r\n p2: orderedP2.slice(0, limit),\r\n };\r\n }\r\n\r\n private reorderInterestsByMatrix(p1List: string[], p2List: string[], centerList: string[]): { p1: string[]; p2: string[]; center: string[] } {\r\n if (!this.matrixData) return { p1: p1List, p2: p2List, center: centerList };\r\n\r\n const cleanCenter = (centerList || []).filter(c => c && c !== '-' && c !== '----');\r\n const list1 = (p1List || []).filter(item => item && item !== '-' && item !== '----');\r\n const list2 = (p2List || []).filter(item => item && item !== '-' && item !== '----');\r\n\r\n const ordered1: string[] = [];\r\n const ordered2: string[] = [];\r\n const used1 = new Set<string>();\r\n const used2 = new Set<string>();\r\n\r\n // 1. PRIORITIZE LEFT AND RIGHT SIMILARITY (Pair ordering from top to bottom)\r\n const remaining1 = [...list1];\r\n const remaining2 = [...list2];\r\n\r\n while (remaining1.length > 0 && remaining2.length > 0) {\r\n let bestPair = { i1: -1, i2: -1, score: -1 };\r\n for (let i = 0; i < remaining1.length; i++) {\r\n for (let j = 0; j < remaining2.length; j++) {\r\n const score = this.getSimilarity(remaining1[i], remaining2[j]);\r\n if (score > bestPair.score) {\r\n bestPair = { i1: i, i2: j, score };\r\n }\r\n }\r\n }\r\n\r\n if (bestPair.score >= 0.15 && bestPair.i1 !== -1 && bestPair.i2 !== -1) {\r\n const item1 = remaining1[bestPair.i1];\r\n const item2 = remaining2[bestPair.i2];\r\n ordered1.push(item1);\r\n ordered2.push(item2);\r\n used1.add(item1);\r\n used2.add(item2);\r\n remaining1.splice(bestPair.i1, 1);\r\n remaining2.splice(bestPair.i2, 1);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // 2. FOR REMAINING UNMATCHED LEFT & RIGHT, ORDER BY RELEVANCE TO ALREADY PLACED ITEMS\r\n const unplaced1 = list1.filter(item => !used1.has(item));\r\n const unplaced2 = list2.filter(item => !used2.has(item));\r\n\r\n const rankUnplaced = (items: string[], placedContext: string[]) => {\r\n return items.map(item => {\r\n let maxSim = 0;\r\n placedContext.forEach(placed => {\r\n const s = this.getSimilarity(item, placed);\r\n if (s > maxSim) maxSim = s;\r\n });\r\n return { item, maxSim };\r\n }).sort((a, b) => b.maxSim - a.maxSim).map(x => x.item);\r\n };\r\n\r\n const allPlaced = [...ordered1, ...ordered2];\r\n const sortedUnplaced1 = rankUnplaced(unplaced1, allPlaced);\r\n const sortedUnplaced2 = rankUnplaced(unplaced2, allPlaced);\r\n\r\n sortedUnplaced1.forEach(item => {\r\n ordered1.push(item);\r\n used1.add(item);\r\n });\r\n sortedUnplaced2.forEach(item => {\r\n ordered2.push(item);\r\n used2.add(item);\r\n });\r\n\r\n // 3. ASSIGN CENTER ITEMS TO INDICES BASED ON BEST MATCH\r\n const maxRows = Math.max(ordered1.length, ordered2.length);\r\n const assignments: { centerItem: string; index: number; score: number }[] = [];\r\n\r\n cleanCenter.forEach(cItem => {\r\n for (let k = 0; k < maxRows; k++) {\r\n const item1 = ordered1[k];\r\n const item2 = ordered2[k];\r\n const score1 = item1 ? this.getSimilarity(cItem, item1) : 0;\r\n const score2 = item2 ? this.getSimilarity(cItem, item2) : 0;\r\n const maxScore = Math.max(score1, score2);\r\n assignments.push({ centerItem: cItem, index: k, score: maxScore });\r\n }\r\n });\r\n\r\n assignments.sort((a, b) => b.score - a.score);\r\n\r\n const assignedItems = new Set<string>();\r\n const assignedIndices = new Set<number>();\r\n const orderedCenter: string[] = new Array(maxRows).fill('empty');\r\n\r\n assignments.forEach(({ centerItem, index }) => {\r\n if (!assignedItems.has(centerItem) && !assignedIndices.has(index)) {\r\n orderedCenter[index] = centerItem;\r\n assignedItems.add(centerItem);\r\n assignedIndices.add(index);\r\n }\r\n });\r\n\r\n const remainingCenter = cleanCenter.filter(c => !assignedItems.has(c));\r\n orderedCenter.push(...remainingCenter);\r\n\r\n return { p1: ordered1, p2: ordered2, center: orderedCenter };\r\n }\r\n\r\n onViewProfile(side: 'left' | 'right'): void {\r\n this.viewProfileClick.emit({ side });\r\n }\r\n\r\n getPerson1UniqueInterests(): string[] {\r\n const raw = this.alignedPerson1Interests.length > 0\r\n ? this.alignedPerson1Interests\r\n : this.displayPerson1Interests.length > 0\r\n ? this.displayPerson1Interests\r\n : this.person1Interests;\r\n return raw.filter(item => item && item !== '-' && item !== '----' && !this.isInCenter(item));\r\n }\r\n\r\n getPerson2UniqueInterests(): string[] {\r\n const raw = this.alignedPerson2Interests.length > 0\r\n ? this.alignedPerson2Interests\r\n : this.displayPerson2Interests.length > 0\r\n ? this.displayPerson2Interests\r\n : this.person2Interests;\r\n return raw.filter(item => item && item !== '-' && item !== '----' && !this.isInCenter(item));\r\n }\r\n\r\n getChipOffset(index: number, column: 'left' | 'center' | 'right'): number {\r\n const leftOffsets = [0, 20, 6, 26, 12, 30, 4, 18];\r\n const rightOffsets = [0, 20, 6, 26, 12, 30, 4, 18];\r\n const centerOffsets = [0, -14, 12, -6, 16, -10, 8, -4];\r\n if (column === 'left') return leftOffsets[index % leftOffsets.length];\r\n if (column === 'right') return rightOffsets[index % rightOffsets.length];\r\n return centerOffsets[index % centerOffsets.length];\r\n }\r\n\r\n private compressInputImages(): Observable<void> {\r\n const tasks: Observable<void>[] = [];\r\n\r\n const processUser = (which: 1 | 2): Observable<void> => {\r\n const file = which === 1 ? this.user1File : this.user2File;\r\n const imageStr = which === 1 ? this.user1Image : this.user2Image;\r\n const baseName = which === 1 ? 'ConfigUser1' : 'ConfigUser2';\r\n\r\n const updateImage = (dataUrl: string) => {\r\n if (which === 1) this.user1Image = dataUrl;\r\n else this.user2Image = dataUrl;\r\n };\r\n\r\n // If File object provided, compress it\r\n if (file) {\r\n return this.imageCompressionService.compressImageFile(file, this.compressionConfig).pipe(\r\n tap(res => { if (res.dataUrl) updateImage(res.dataUrl); }),\r\n map(() => void 0),\r\n catchError(() => of(void 0))\r\n );\r\n }\r\n\r\n if (!imageStr) return of(void 0);\r\n\r\n // If already a data URL, compress it\r\n if (this.fileConversionService.isDataUrl(imageStr)) {\r\n return this.compressImageStringToDataUrl(imageStr, baseName).pipe(\r\n tap(dataUrl => { if (dataUrl) updateImage(dataUrl); }),\r\n map(() => void 0)\r\n );\r\n }\r\n\r\n // For external URLs, try to fetch and compress client-side\r\n // If fetch fails (e.g., CORS), keep the raw URL and let backend handle it\r\n let fetchUrl = imageStr;\r\n if (this.imageProxyPath && imageStr.startsWith('http')) {\r\n // Extract path from full URL for proxy\r\n try {\r\n const urlObj = new URL(imageStr);\r\n const pathWithoutLeadingSlash = urlObj.pathname.replace(/^\\//, '');\r\n fetchUrl = `${this.imageProxyPath}${pathWithoutLeadingSlash}${urlObj.search}`;\r\n } catch {\r\n fetchUrl = imageStr;\r\n }\r\n }\r\n\r\n return this.fileConversionService.fetchUrlToDataUrl(fetchUrl).pipe(\r\n switchMap(dataUrl => this.imageCompressionService.compressImageFile(\r\n this.fileConversionService.dataUrlToFile(dataUrl, `${baseName}.jpg`),\r\n this.compressionConfig\r\n )),\r\n tap(res => { if (res.dataUrl) updateImage(res.dataUrl); }),\r\n map(() => void 0),\r\n catchError(() => {\r\n // Fetch failed (likely CORS), keep raw URL for backend to handle\r\n return of(void 0);\r\n })\r\n );\r\n };\r\n\r\n tasks.push(processUser(1));\r\n tasks.push(processUser(2));\r\n\r\n return forkJoin(tasks).pipe(map(() => void 0));\r\n }\r\n\r\n private compressImageStringToDataUrl(imageStr: string, baseName: string): Observable<string | null> {\r\n return this.fileConversionService.getFileForImageString(imageStr, `${baseName}.jpg`).pipe(\r\n switchMap(file => this.imageCompressionService.compressImageFile(file, this.compressionConfig)),\r\n map(res => res.dataUrl),\r\n catchError(() => of(null))\r\n );\r\n }\r\n\r\n getEyeCoordinatesFromBBox(bbox: IBoundingBox): { leftEye: IPoint; rightEye: IPoint } {\r\n const eyeY = bbox.y + bbox.height * 0.38;\r\n const leftEyeX = bbox.x + bbox.width * 0.32;\r\n const rightEyeX = bbox.x + bbox.width * 0.68;\r\n return { leftEye: { x: leftEyeX, y: eyeY }, rightEye: { x: rightEyeX, y: eyeY } };\r\n }\r\n\r\n getEyeCoordinatesFromFace(face: IFaceBoxWithLandmarks): { leftEye: IPoint; rightEye: IPoint } {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const left = pick(['left_eye_pupil', 'left_eye_center', 'eye_left_pupil', 'left_eye']) || this.getEyeCoordinatesFromBBox(face).leftEye;\r\n const right = pick(['right_eye_pupil', 'right_eye_center', 'eye_right_pupil', 'right_eye']) || this.getEyeCoordinatesFromBBox(face).rightEye;\r\n return { leftEye: left, rightEye: right };\r\n }\r\n\r\n getNoseCoordinateFromFace(face: IFaceBoxWithLandmarks): IPoint {\r\n const lm: IFaceLandmarks | undefined = (face && face.landmarks) || undefined;\r\n const pick = (candidates: string[]): IPoint | undefined => {\r\n if (!lm) return undefined;\r\n for (const key of candidates) {\r\n const pt = lm[key];\r\n if (pt && typeof pt.x === 'number' && typeof pt.y === 'number') return this.clampPointToFaceRect({ x: pt.x, y: pt.y }, face);\r\n }\r\n return undefined;\r\n };\r\n const nose = pick(['nose_tip', 'nose', 'nose_middle', 'nose_bridge1']);\r\n if (nose) return nose;\r\n return this.getNoseCoordinateFromBBox(face as unknown as IBoundingBox);\r\n }\r\n\r\n private clampPointToFaceRect(p: IPoint, box: IBoundingBox): IPoint {\r\n const x = Math.max(box.x, Math.min(box.x + box.width, p.x));\r\n const y = Math.max(box.y, Math.min(box.y + box.height, p.y));\r\n return { x, y };\r\n }\r\n\r\n getNoseCoordinateFromBBox(bbox: IBoundingBox): IPoint {\r\n return { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height * 0.58 };\r\n }\r\n\r\n getFaceCoordinatesFromBBox(bbox: IBoundingBox): { faceCenter: IPoint; faceTop: IPoint; faceBottom: IPoint; faceLeft: IPoint; faceRight: IPoint } {\r\n return {\r\n faceCenter: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 2 },\r\n faceTop: { x: bbox.x + bbox.width / 2, y: bbox.y + bbox.height / 4 },\r\n faceBottom: { x: bbox.x + bbox.width / 2, y: bbox.y + (3 * bbox.height) / 4 },\r\n faceLeft: { x: bbox.x + bbox.width / 4, y: bbox.y + bbox.height / 2 },\r\n faceRight: { x: bbox.x + (3 * bbox.width) / 4, y: bbox.y + bbox.height / 2 },\r\n };\r\n }\r\n\r\n calculateFaceAlignment(user1Data: FaceDetectionData, user2Data: FaceDetectionData): void {\r\n let faces1: IFaceBoxWithLandmarks[] = [];\r\n let faces2: IFaceBoxWithLandmarks[] = [];\r\n\r\n const getFaces = (data: FaceDetectionData): IFaceBoxWithLandmarks[] => {\r\n if (Array.isArray(data)) return data;\r\n if (data && typeof data === 'object' && 'faces' in data && Array.isArray(data.faces)) return data.faces;\r\n return [];\r\n };\r\n\r\n faces1 = getFaces(user1Data);\r\n faces2 = getFaces(user2Data);\r\n\r\n if (!faces1?.length || !faces2?.length) { this.applyDefaultAlignment(); return; }\r\n const face1 = faces1[0]; const face2 = faces2[0];\r\n if (!this.isValidFaceData(face1) || !this.isValidFaceData(face2)) { this.applyDefaultAlignment(); return; }\r\n\r\n const user1FaceCoords = this.getFaceCoordinatesFromBBox(face1);\r\n const user2FaceCoords = this.getFaceCoordinatesFromBBox(face2);\r\n const user1Eyes = this.getEyeCoordinatesFromFace(face1);\r\n const user2Eyes = this.getEyeCoordinatesFromFace(face2);\r\n\r\n const leftContainerEl = this.profileImgLeft?.nativeElement || null;\r\n const rightContainerEl = this.profileImgRight?.nativeElement || null;\r\n const containerWidth1 = leftContainerEl?.clientWidth || 160;\r\n const containerHeight1 = leftContainerEl?.clientHeight || 550;\r\n const containerWidth2 = rightContainerEl?.clientWidth || 160;\r\n const containerHeight2 = rightContainerEl?.clientHeight || 550;\r\n\r\n const scale1 = this.user1NaturalWidth ? Math.max(containerWidth1 / this.user1NaturalWidth, containerHeight1 / this.user1NaturalHeight) : 1;\r\n const scale2 = this.user2NaturalWidth ? Math.max(containerWidth2 / this.user2NaturalWidth, containerHeight2 / this.user2NaturalHeight) : 1;\r\n\r\n const nose1 = this.getNoseCoordinateFromFace(face1);\r\n const nose2 = this.getNoseCoordinateFromFace(face2);\r\n const anchor1Y = (Math.min(user1Eyes.leftEye.y, user1Eyes.rightEye.y) + nose1.y) / 2;\r\n const anchor2Y = (Math.min(user2Eyes.leftEye.y, user2Eyes.rightEye.y) + nose2.y) / 2;\r\n\r\n const tCenter1 = this.user1NaturalHeight ? -((anchor1Y - this.user1NaturalHeight / 2) * scale1) : 0;\r\n const tCenter2 = this.user2NaturalHeight ? -((anchor2Y - this.user2NaturalHeight / 2) * scale2) : 0;\r\n\r\n const shiftY1 = tCenter1 - this.eyeAlignmentBiasPx;\r\n const shiftY2 = tCenter2 - this.eyeAlignmentBiasPx;\r\n\r\n // Apply eye-to-eye vertical repositioning transforms without any scaling\r\n this.user1Transform = `translateY(${shiftY1}px)`;\r\n this.user2Transform = `translateY(${shiftY2}px)`;\r\n\r\n // Extend image dimensions into the adjusted area without applying any uniform zoom/scaling\r\n if (shiftY1 > 0) {\r\n this.user1Top = `-${shiftY1}px`;\r\n this.user1Height = `calc(100% + ${shiftY1}px)`;\r\n } else {\r\n this.user1Top = '0px';\r\n this.user1Height = `calc(100% + ${Math.abs(shiftY1)}px)`;\r\n }\r\n\r\n if (shiftY2 > 0) {\r\n this.user2Top = `-${shiftY2}px`;\r\n this.user2Height = `calc(100% + ${shiftY2}px)`;\r\n } else {\r\n this.user2Top = '0px';\r\n this.user2Height = `calc(100% + ${Math.abs(shiftY2)}px)`;\r\n }\r\n\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n applyDefaultAlignment() {\r\n this.user1Transform = 'translateY(0px)';\r\n this.user2Transform = 'translateY(0px)';\r\n this.user1Top = '0px';\r\n this.user1Height = '100%';\r\n this.user2Top = '0px';\r\n this.user2Height = '100%';\r\n this.alignmentCalculated = true;\r\n }\r\n\r\n isValidFaceData(face: IBoundingBox): boolean {\r\n return !!face && typeof face.x === 'number' && face.width > 0 && face.height > 0;\r\n }\r\n\r\n onNodeMouseEnter(node: ForceChipNode): void {\r\n this.hoveredNode = node;\r\n }\r\n\r\n onNodeMouseLeave(node: ForceChipNode): void {\r\n this.hoveredNode = null;\r\n }\r\n\r\n onNodeClick(node: ForceChipNode, event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (this.clickedNode === node) {\r\n this.clickedNode = null;\r\n this.updateAttractionForce(null);\r\n } else {\r\n this.clickedNode = node;\r\n this.updateAttractionForce(node);\r\n }\r\n }\r\n\r\n @HostListener('document:click')\r\n onDocumentClick(): void {\r\n this.clickedNode = null;\r\n if (!this.isDragging) {\r\n this.updateAttractionForce(null);\r\n }\r\n }\r\n\r\n /**\r\n * Anchor interaction should only affect highlighting/energy.\r\n * Similarity attraction is always-on via the base simulation forces.\r\n */\r\n private updateAttractionForce(anchorNode: ForceChipNode | null): void {\r\n if (!this.simulation) return;\r\n this.simulation.force('attraction', null);\r\n if (anchorNode) {\r\n const minClickAlpha = ProfileComparisonLibComponent.CLICK_REHEAT_ALPHA;\r\n if (this.simulation.alpha() < minClickAlpha) {\r\n this.simulation.alpha(minClickAlpha);\r\n }\r\n this.simulation.alphaTarget(ProfileComparisonLibComponent.IDLE_ALPHA_TARGET).restart();\r\n } else if (!this.isDragging) {\r\n this.simulation.alphaTarget(ProfileComparisonLibComponent.IDLE_ALPHA_TARGET);\r\n }\r\n }\r\n\r\n\r\n isNodeConnected(node: ForceChipNode): boolean {\r\n if (!this.activeNode) return true;\r\n if (this.activeNode === node) return true;\r\n return this.forceLinks.some(link => {\r\n const srcId = (link.source && typeof link.source === 'object') ? (link.source as any).id : link.source;\r\n const tgtId = (link.target && typeof link.target === 'object') ? (link.target as any).id : link.target;\r\n return (srcId === this.activeNode!.id && tgtId === node.id) ||\r\n (tgtId === this.activeNode!.id && srcId === node.id);\r\n });\r\n }\r\n\r\n isLinkConnectedToActive(link: any): boolean {\r\n if (!this.activeNode) return false;\r\n const srcId = (link.source && typeof link.source === 'object') ? link.source.id : link.source;\r\n const tgtId = (link.target && typeof link.target === 'object') ? link.target.id : link.target;\r\n return srcId === this.activeNode.id || tgtId === this.activeNode.id;\r\n }\r\n\r\n /**\r\n * Returns true if the link connects a p1 node to a p2 node (a direct left↔right match),\r\n * as opposed to a connection involving a shared-pool chip.\r\n */\r\n isCrossGroupLink(link: any): boolean {\r\n const src = this.findNode(link.source);\r\n const tgt = this.findNode(link.target);\r\n if (!src || !tgt) return false;\r\n return (src.group === 'p1' && tgt.group === 'p2') ||\r\n (src.group === 'p2' && tgt.group === 'p1');\r\n }\r\n\r\n /**\r\n * All force links sorted so secondary (shared-chip) links render first and\r\n * primary (p1↔p2 direct match) links render last — SVG paints last-child on top.\r\n */\r\n get sortedForceLinks(): any[] {\r\n return [...this.forceLinks].sort((a, b) =>\r\n (this.isCrossGroupLink(a) ? 1 : 0) - (this.isCrossGroupLink(b) ? 1 : 0)\r\n );\r\n }\r\n\r\n getLinkSourceX(link: any): number {\r\n const node = this.findNode(link.source);\r\n return node ? (node.x ?? 0) : 0;\r\n }\r\n\r\n getLinkSourceY(link: any): number {\r\n const node = this.findNode(link.source);\r\n return node ? (node.y ?? 0) : 0;\r\n }\r\n\r\n getLinkTargetX(link: any): number {\r\n const node = this.findNode(link.target);\r\n return node ? (node.x ?? 0) : 0;\r\n }\r\n\r\n getLinkTargetY(link: any): number {\r\n const node = this.findNode(link.target);\r\n return node ? (node.y ?? 0) : 0;\r\n }\r\n\r\n private findNode(ref: any): ForceChipNode | undefined {\r\n if (!ref) return undefined;\r\n const id = typeof ref === 'object' ? ref.id : ref;\r\n return this.forceNodes.find(n => n.id === id);\r\n }\r\n\r\n onNodeDragStart(node: ForceChipNode, event: MouseEvent | TouchEvent): void {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n event.stopPropagation();\r\n\r\n this.draggedNode = node;\r\n this.isDragging = true;\r\n this.clickedNode = node;\r\n\r\n const touchEvent = event as TouchEvent;\r\n const mouseEvent = event as MouseEvent;\r\n const isTouch = !!(touchEvent.touches && touchEvent.touches.length);\r\n const clientX = isTouch ? touchEvent.touches[0].clientX : mouseEvent.clientX;\r\n const clientY = isTouch ? touchEvent.touches[0].clientY : mouseEvent.clientY;\r\n\r\n const rect = this.chipsGrid.nativeElement.getBoundingClientRect();\r\n const scrollTop = this.chipsGrid.nativeElement.scrollTop;\r\n const relX = clientX - rect.left;\r\n const relY = clientY - rect.top + scrollTop;\r\n const bounds = this.nodeDragBounds.get(node.id);\r\n\r\n if (bounds) {\r\n node.fx = Math.max(bounds.minX, Math.min(bounds.maxX, relX));\r\n node.fy = Math.max(bounds.minY, Math.min(bounds.maxY, relY));\r\n } else {\r\n node.fx = relX;\r\n node.fy = relY;\r\n }\r\n\r\n // Restore interactive forces for dragging\r\n if (this.simulation) {\r\n const linkForce = this.simulation.force('link');\r\n if (linkForce) linkForce.strength((d: any) => this.getRuntimeLinkStrength(d as ForceChipLink));\r\n const collideForce = this.simulation.force('collide');\r\n if (collideForce) collideForce.strength(1.0);\r\n const xTarget = this.simulation.force('xTarget');\r\n if (xTarget) xTarget.strength((d: ForceChipNode) => d.group === 'shared' ? 0.1 : 0.045);\r\n const yTarget = this.simulation.force('yTarget');\r\n if (yTarget) yTarget.strength(0.042);\r\n }\r\n\r\n // Pull connected chips toward the dragged node\r\n this.updateAttractionForce(node);\r\n\r\n // Wake up the simulation target to keep it highly active during drag\r\n this.simulation.alphaTarget(0.28).restart();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n @HostListener('document:touchmove', ['$event'])\r\n onDocumentDragMove(event: MouseEvent | TouchEvent): void {\r\n if (!this.isDragging || !this.draggedNode) return;\r\n\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n\r\n const touchEvent = event as TouchEvent;\r\n const mouseEvent = event as MouseEvent;\r\n const isTouch = !!(touchEvent.touches && touchEvent.touches.length);\r\n const clientX = isTouch ? touchEvent.touches[0].clientX : mouseEvent.clientX;\r\n const clientY = isTouch ? touchEvent.touches[0].clientY : mouseEvent.clientY;\r\n\r\n const rect = this.chipsGrid.nativeElement.getBoundingClientRect();\r\n const scrollTop = this.chipsGrid.nativeElement.scrollTop;\r\n\r\n // Clamp dragged position so chip can't go off-edge (same estimate used in layout pass).\r\n const charWidth = this.chipFontSizePx * 0.53;\r\n const halfW = (this.draggedNode.label.length * charWidth + this.chipPaddingXPx * 2) / 2;\r\n const edgePad = 20;\r\n const relX = clientX - rect.left;\r\n const relY = clientY - rect.top + scrollTop;\r\n const fallbackMinX = halfW + edgePad;\r\n const fallbackMaxX = rect.width - halfW - edgePad;\r\n const fallbackMinY = 30;\r\n const fallbackMaxY = Math.max(fallbackMinY, this.forceCanvasHeight - 30);\r\n const bounds = this.nodeDragBounds.get(this.draggedNode.id);\r\n const minX = bounds?.minX ?? fallbackMinX;\r\n const maxX = bounds?.maxX ?? fallbackMaxX;\r\n const minY = bounds?.minY ?? fallbackMinY;\r\n const maxY = bounds?.maxY ?? fallbackMaxY;\r\n\r\n const clampedX = Math.max(minX, Math.min(maxX, relX));\r\n const clampedY = Math.max(minY, Math.min(maxY, relY));\r\n this.draggedNode.fx = clampedX;\r\n this.draggedNode.fy = clampedY;\r\n\r\n // Keep active force simulation running\r\n this.simulation.alpha(0.3).restart();\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n @HostListener('document:touchend')\r\n onDocumentDragEnd(): void {\r\n if (!this.isDragging || !this.draggedNode) return;\r\n\r\n // Release the node. Clear fx and fy so it is no longer pinned to the mouse\r\n this.draggedNode.fx = undefined;\r\n this.draggedNode.fy = undefined;\r\n\r\n // Keep baseline similarity attraction and restoring forces active after drag release.\r\n this.simulation.force('attraction', null);\r\n\r\n if (this.simulation) {\r\n const linkForce = this.simulation.force('link');\r\n if (linkForce) linkForce.strength((d: any) => this.getRuntimeLinkStrength(d as ForceChipLink));\r\n const collideForce = this.simulation.force('collide');\r\n if (collideForce) collideForce.strength(1.0);\r\n\r\n const xTarget = this.simulation.force('xTarget');\r\n if (xTarget) xTarget.strength((d: ForceChipNode) => d.group === 'shared' ? 0.1 : 0.045);\r\n const yTarget = this.simulation.force('yTarget');\r\n if (yTarget) yTarget.strength(0.042);\r\n }\r\n\r\n // Cool down simulation targets\r\n this.simulation.alphaTarget(ProfileComparisonLibComponent.IDLE_ALPHA_TARGET);\r\n this.simulation.alpha(0.2).restart();\r\n\r\n this.draggedNode = null;\r\n this.isDragging = false;\r\n }\r\n}\r\n","<div class=\"configure-backend-message\" *ngIf=\"!backendConfigured\">\r\n Configure backend\r\n</div>\r\n\r\n<div class=\"profile-screen\" *ngIf=\"backendConfigured\">\r\n <div #profileFlex class=\"profile-flex\" [class.fade-all]=\"fadeAllEdges\">\r\n <svg class=\"image-noise-overlay\" style=\"position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; overflow: hidden; z-index: 0;\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 320\" fill=\"none\" preserveAspectRatio=\"none\">\r\n <g filter=\"url(#filter0_n_1_1753)\">\r\n <rect width=\"100%\" height=\"100%\" fill=\"url(#paint0_radial_1_1753)\" fill-opacity=\"0.33\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_n_1_1753\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\" filterUnits=\"objectBoundingBox\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\r\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.10869565606117249 0.10869565606117249\" stitchTiles=\"stitch\" numOctaves=\"3\" result=\"noise\" seed=\"7339\"/>\r\n <feColorMatrix in=\"noise\" type=\"luminanceToAlpha\" result=\"alphaNoise\"/>\r\n <feComponentTransfer in=\"alphaNoise\" result=\"coloredNoise1\">\r\n <feFuncA type=\"discrete\" tableValues=\"0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \"/>\r\n </feComponentTransfer>\r\n <feComposite operator=\"in\" in2=\"shape\" in=\"coloredNoise1\" result=\"noise1Clipped\"/>\r\n <feFlood flood-color=\"rgba(0, 0, 0, 0.25)\" result=\"color1Flood\"/>\r\n <feComposite operator=\"in\" in2=\"noise1Clipped\" in=\"color1Flood\" result=\"color1\"/>\r\n <feMerge result=\"effect1_noise_1_1753\">\r\n <feMergeNode in=\"shape\"/>\r\n <feMergeNode in=\"color1\"/>\r\n </feMerge>\r\n </filter>\r\n <radialGradient id=\"paint0_radial_1_1753\" cx=\"50%\" cy=\"50%\" r=\"50%\" fx=\"50%\" fy=\"50%\">\r\n <stop offset=\"0%\" stop-opacity=\"0\"/>\r\n <stop offset=\"100%\" stop-opacity=\"0.25\"/>\r\n </radialGradient>\r\n </defs>\r\n </svg>\r\n <div #profileImgLeft class=\"profile-img left\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user1Image\"\r\n alt=\"User 1\"\r\n [style.transform]=\"user1Transform\"\r\n [style.top]=\"user1Top\"\r\n [style.height]=\"user1Height\"\r\n [style.object-position]=\"user1ObjectPosition\"\r\n (load)=\"onUserImageLoad(1, $event)\"\r\n />\r\n </div>\r\n <div #profileImgRight class=\"profile-img right\" [class.fade-all]=\"fadeAllEdges\">\r\n <img\r\n [src]=\"user2Image\"\r\n alt=\"User 2\"\r\n [style.transform]=\"user2Transform\"\r\n [style.top]=\"user2Top\"\r\n [style.height]=\"user2Height\"\r\n [style.object-position]=\"user2ObjectPosition\"\r\n (load)=\"onUserImageLoad(2, $event)\"\r\n />\r\n </div>\r\n <div class=\"image-shade-overlay\"></div>\r\n\r\n <!-- Frosted Glass Overlay Layer -->\r\n <div class=\"overlay-container\">\r\n <!-- Top Headers — absolutely positioned overlays, exactly as original -->\r\n <div class=\"header-label left\">{{ person1Name }}</div>\r\n <div class=\"header-label center\">Shared</div>\r\n <div class=\"header-label right\">{{ person2Name }}</div>\r\n\r\n <!-- Force-directed chip canvas (scrollable) -->\r\n <div class=\"chips-grid\" #chipsGrid>\r\n <div class=\"force-canvas\" [style.height.px]=\"forceCanvasHeight\">\r\n <!-- SVG Connections Layer -->\r\n <svg class=\"connections-svg\" [style.height.px]=\"forceCanvasHeight\">\r\n <line\r\n *ngFor=\"let link of sortedForceLinks\"\r\n [attr.x1]=\"getLinkSourceX(link)\"\r\n [attr.y1]=\"getLinkSourceY(link)\"\r\n [attr.x2]=\"getLinkTargetX(link)\"\r\n [attr.y2]=\"getLinkTargetY(link)\"\r\n class=\"connection-line\"\r\n [class.active]=\"isLinkConnectedToActive(link)\"\r\n [class.cross-group]=\"isCrossGroupLink(link)\"\r\n ></line>\r\n </svg>\r\n\r\n <div\r\n *ngFor=\"let node of forceNodes\"\r\n class=\"frosted-chip\"\r\n [class.person-a]=\"node.group === 'p1'\"\r\n [class.shared]=\"node.group === 'shared'\"\r\n [class.person-b]=\"node.group === 'p2'\"\r\n [class.active]=\"activeNode === node\"\r\n [class.dimmed]=\"activeNode && !isNodeConnected(node)\"\r\n [style.left.px]=\"node.x\"\r\n [style.top.px]=\"node.y\"\r\n [style.padding]=\"chipPaddingYPx + 'px ' + chipPaddingXPx + 'px'\"\r\n (mouseenter)=\"onNodeMouseEnter(node)\"\r\n (mouseleave)=\"onNodeMouseLeave(node)\"\r\n (click)=\"onNodeClick(node, $event)\"\r\n (mousedown)=\"onNodeDragStart(node, $event)\"\r\n (touchstart)=\"onNodeDragStart(node, $event)\"\r\n >\r\n <span\r\n class=\"chip-label\"\r\n [style.font-size.px]=\"chipFontSizePx\"\r\n [style.line-height]=\"chipLineHeight\"\r\n >{{ node.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Actions -->\r\n <div class=\"view-profile left\" (click)=\"onViewProfile('left')\">View Profile</div>\r\n <div class=\"view-profile right\" (click)=\"onViewProfile('right')\">View Profile</div>\r\n </div>\r\n\r\n <!-- Loading indicator for alignment process -->\r\n <div *ngIf=\"isAligning\" class=\"loading-indicator\">\r\n <div class=\"loading-spinner\"></div>\r\n </div>\r\n</div>\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ProfileComparisonLibComponent } from './profile-comparison-lib.component';\r\nimport { ProfileComparisonBackendService } from './services';\r\n\r\n@NgModule({\r\n declarations: [\r\n ProfileComparisonLibComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [\r\n ProfileComparisonLibComponent\r\n ],\r\n providers: [\r\n ProfileComparisonBackendService\r\n ]\r\n})\r\nexport class ProfileComparisonLibModule { }\r\n","/*\n * Public API Surface of profile-comparison-lib\n */\n\nexport * from './lib/profile-comparison-lib.component';\nexport * from './lib/profile-comparison-lib.module';\nexport * from './lib/services';\nexport * from './lib/interfaces';\nexport {\n BackendMode,\n BACKEND_MODE_URLS,\n resolveBackendUrl,\n PROFILE_COMPARISON_API_BASE_URL,\n PROFILE_COMPARISON_VERBOSE_LOGGING,\n} from './lib/tokens';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap","map","i2.CachePersistenceService","tap","catchError"],"mappings":"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"}
|