@memberjunction/ng-dashboards 6.1.2 → 6.2.0-edge.0

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.
Files changed (99) hide show
  1. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +6 -1
  2. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/vectors/vector-management-resource.component.js +99 -45
  4. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  5. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +4 -0
  6. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
  7. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +16 -6
  8. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
  9. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +4 -0
  10. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.js +14 -4
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  13. package/dist/DataExplorer/services/explorer-state.service.js +2 -2
  14. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  15. package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
  16. package/dist/DevTools/graphql-console.component.js +2 -0
  17. package/dist/DevTools/graphql-console.component.js.map +1 -1
  18. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  19. package/dist/Integration/components/connections/connections.component.js +2 -0
  20. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  21. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +4 -12
  22. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
  23. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +39 -78
  24. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
  25. package/dist/Lists/components/lists-browse-resource.component.d.ts +3 -0
  26. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  27. package/dist/Lists/components/lists-browse-resource.component.js +7 -6
  28. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  29. package/dist/Lists/components/lists-my-lists-resource.component.d.ts +3 -0
  30. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  31. package/dist/Lists/components/lists-my-lists-resource.component.js +7 -6
  32. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  33. package/dist/PredictiveStudio/at-risk.view-models.d.ts +41 -3
  34. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +1 -1
  35. package/dist/PredictiveStudio/at-risk.view-models.js +99 -6
  36. package/dist/PredictiveStudio/at-risk.view-models.js.map +1 -1
  37. package/dist/PredictiveStudio/components/ps-catalog.component.d.ts +4 -1
  38. package/dist/PredictiveStudio/components/ps-catalog.component.d.ts.map +1 -1
  39. package/dist/PredictiveStudio/components/ps-catalog.component.js +61 -37
  40. package/dist/PredictiveStudio/components/ps-catalog.component.js.map +1 -1
  41. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +12 -0
  42. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  43. package/dist/PredictiveStudio/components/ps-experiments.component.js +426 -184
  44. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  45. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +84 -0
  46. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -0
  47. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +1397 -0
  48. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -0
  49. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +66 -34
  50. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  51. package/dist/PredictiveStudio/components/ps-pipelines.component.js +2456 -743
  52. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  53. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +194 -0
  54. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -0
  55. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +1902 -0
  56. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -0
  57. package/dist/PredictiveStudio/components/ps-production.component.d.ts +17 -1
  58. package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
  59. package/dist/PredictiveStudio/components/ps-production.component.js +653 -372
  60. package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
  61. package/dist/PredictiveStudio/components/ps-registry.component.d.ts +21 -61
  62. package/dist/PredictiveStudio/components/ps-registry.component.d.ts.map +1 -1
  63. package/dist/PredictiveStudio/components/ps-registry.component.js +214 -681
  64. package/dist/PredictiveStudio/components/ps-registry.component.js.map +1 -1
  65. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +49 -0
  66. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +1 -0
  67. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +658 -0
  68. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +1 -0
  69. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +42 -0
  70. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -0
  71. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +90 -0
  72. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -0
  73. package/dist/PredictiveStudio/predictive-studio.view-models.d.ts +14 -2
  74. package/dist/PredictiveStudio/predictive-studio.view-models.d.ts.map +1 -1
  75. package/dist/PredictiveStudio/predictive-studio.view-models.js +41 -5
  76. package/dist/PredictiveStudio/predictive-studio.view-models.js.map +1 -1
  77. package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts +9 -1
  78. package/dist/PredictiveStudio/resources/ps-models-resource.component.d.ts.map +1 -1
  79. package/dist/PredictiveStudio/resources/ps-models-resource.component.js +178 -65
  80. package/dist/PredictiveStudio/resources/ps-models-resource.component.js.map +1 -1
  81. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +9 -1
  82. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  83. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +307 -369
  84. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  85. package/dist/PredictiveStudio/resources/ps-resource-base.js +1 -1
  86. package/dist/PredictiveStudio/resources/ps-resource-base.js.map +1 -1
  87. package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts +17 -1
  88. package/dist/PredictiveStudio/resources/ps-studio-resource.component.d.ts.map +1 -1
  89. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +309 -138
  90. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  91. package/dist/VersionHistory/components/graph-resource.component.d.ts +1 -0
  92. package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
  93. package/dist/VersionHistory/components/graph-resource.component.js +6 -5
  94. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  95. package/dist/predictive-studio-dashboards.module.d.ts +10 -8
  96. package/dist/predictive-studio-dashboards.module.d.ts.map +1 -1
  97. package/dist/predictive-studio-dashboards.module.js +13 -3
  98. package/dist/predictive-studio-dashboards.module.js.map +1 -1
  99. package/package.json +64 -63
@@ -1 +1 @@
1
- {"version":3,"file":"predictive-studio.view-models.js","sourceRoot":"","sources":["../../src/PredictiveStudio/predictive-studio.view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, framework-free view-model derivations for the Predictive Studio dashboard.\n *\n * Everything in this module is a deterministic function over plain data shapes (NOT BaseEntity\n * instances) so it can be unit-tested with zero DB / Angular / metadata-provider setup. The Angular\n * panels (Registry / Experiments / Home / Compare) thread their cached engine rows through narrow\n * row interfaces declared here, keeping the parsing + grouping + leaderboard logic out of the\n * components and under test.\n *\n * Design rules honored throughout:\n * - **100% entity-agnostic.** Nothing references members / renewals / any specific business entity —\n * model/metric names come straight from the data. The single domain assumption is the ML metric\n * vocabulary (AUC / F1 / precision / recall …), which is universal to predictive modeling.\n * - **Tolerant of missing/partial/garbage JSON.** Every parser returns `null` / `[]` rather than\n * throwing, so a half-populated environment renders gracefully instead of erroring.\n * - **Only surface what's present.** Metric maps omit absent keys; the UI shows just the numbers the\n * model actually recorded, never fabricated zeros.\n */\n\nimport { PSFeatureBar, PSIterationCard, PSLeaderboardEntry } from './predictive-studio.types';\n\n// ---------------------------------------------------------------------------\n// Narrow row shapes — the minimal slice of each entity these derivations need.\n// Decoupled from the generated entity classes so the functions stay pure/testable.\n// ---------------------------------------------------------------------------\n\n/** Minimal model slice consumed by the registry/home/compare derivations. */\nexport interface PSModelRow {\n ID: string;\n Version: number;\n Status: string;\n AlgorithmID: string | null;\n PipelineID: string | null;\n Metrics: string | null;\n HoldoutMetrics: string | null;\n FeatureImportance: string | null;\n TargetVariable: string | null;\n ProblemType: string | null;\n TrainingDurationSec?: number | null;\n}\n\n/** Minimal experiment-session-iteration slice consumed by the experiments/compare derivations. */\nexport interface PSIterationRow {\n ID: string;\n ExperimentSessionID: string;\n Sequence: number;\n Label: string | null;\n Status: string;\n Score: number | null;\n ComputeCost: number | null;\n TokensUsed: number | null;\n Rationale: string | null;\n AlgorithmName?: string;\n}\n\n/** Minimal process-run slice consumed by the home activity/KPI derivations. */\nexport interface PSProcessRunRow {\n ID: string;\n Status: string;\n StartTime: Date | null;\n CreatedAt: Date | null;\n SuccessCount: number;\n TotalItemCount?: number | null;\n ProcessName: string | null;\n EntityName: string | null;\n DryRun: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Metric JSON parsing\n// ---------------------------------------------------------------------------\n\n/** Canonical metric keys we know how to surface, in display order. */\nexport const PS_KNOWN_METRIC_KEYS = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'Brier',\n 'RMSE',\n 'MAE',\n 'R2',\n] as const;\n\nexport type PSMetricKey = (typeof PS_KNOWN_METRIC_KEYS)[number];\n\n/**\n * A parsed metric map — canonical key → numeric value. Only keys actually present (and numeric) in\n * the source JSON appear; everything else is omitted so the UI shows just real numbers.\n */\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\n/** Lower-cased alias → canonical key, so we accept `auc`/`f1_score`/`logloss`/etc. across sidecars. */\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc_auc': 'AUC',\n rocauc: 'AUC',\n accuracy: 'Accuracy',\n acc: 'Accuracy',\n precision: 'Precision',\n recall: 'Recall',\n f1: 'F1',\n 'f1_score': 'F1',\n f1score: 'F1',\n logloss: 'LogLoss',\n 'log_loss': 'LogLoss',\n brier: 'Brier',\n 'brier_score': 'Brier',\n rmse: 'RMSE',\n mae: 'MAE',\n r2: 'R2',\n 'r_squared': 'R2',\n};\n\n/**\n * Parse a metrics JSON string (e.g. `model.Metrics` / `model.HoldoutMetrics`) into a canonical\n * {@link PSMetricMap}. Accepts both canonical (`AUC`) and common alias (`auc`, `f1_score`) keys,\n * keeps only finite numeric values, and never throws — invalid/empty input yields `{}`.\n *\n * @param json The raw JSON string, or null/undefined.\n * @returns A metric map containing only the recognized, numeric metrics present in the source.\n */\nexport function parseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = coerceFiniteNumber(rawVal);\n if (value == null) continue;\n const canonical = canonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\n/** Resolve a raw metric key to its canonical form (exact match first, then alias), or null. */\nexport function canonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\n/** The primary AUC/score of a model: holdout AUC preferred, else training AUC, else null. */\nexport function primaryAuc(model: Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics'>): number | null {\n const holdout = parseMetrics(model.HoldoutMetrics);\n if (holdout.AUC != null) return holdout.AUC;\n const train = parseMetrics(model.Metrics);\n return train.AUC ?? null;\n}\n\n/** A labeled metric ready for display (value formatted to a sensible precision). */\nexport interface PSMetricDisplay {\n key: PSMetricKey;\n label: string;\n value: string;\n}\n\n/** Human labels for the canonical metric keys. */\nconst METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1',\n LogLoss: 'Log Loss',\n Brier: 'Brier',\n RMSE: 'RMSE',\n MAE: 'MAE',\n R2: 'R²',\n};\n\n/**\n * Turn a metric map into an ordered, formatted display list (canonical order, only present keys).\n * AUC is excluded by default since the panels surface it as a hero number separately.\n *\n * @param metrics The parsed metric map.\n * @param options.excludeAuc When true (default), omit AUC from the secondary stat list.\n */\nexport function metricsToDisplay(metrics: PSMetricMap, options?: { excludeAuc?: boolean }): PSMetricDisplay[] {\n const excludeAuc = options?.excludeAuc ?? true;\n const out: PSMetricDisplay[] = [];\n for (const key of PS_KNOWN_METRIC_KEYS) {\n if (excludeAuc && key === 'AUC') continue;\n const value = metrics[key];\n if (value == null) continue;\n out.push({ key, label: METRIC_LABELS[key], value: formatMetricValue(key, value) });\n }\n return out;\n}\n\n/** Format a metric value: 3 decimals for ratio metrics, 2 for the rest. */\nexport function formatMetricValue(key: PSMetricKey, value: number): string {\n const threeDecimals: PSMetricKey[] = ['AUC', 'LogLoss', 'Brier', 'RMSE', 'MAE', 'R2'];\n return value.toFixed(threeDecimals.includes(key) ? 3 : 2);\n}\n\n/**\n * The train-vs-holdout overfit gap (train AUC − holdout AUC), or null when either is missing.\n * Positive means the model does better in-sample than out-of-sample (the expected direction).\n */\nexport function overfitGap(model: Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics'>): number | null {\n const train = parseMetrics(model.Metrics).AUC;\n const holdout = parseMetrics(model.HoldoutMetrics).AUC;\n if (train == null || holdout == null) return null;\n return train - holdout;\n}\n\n// ---------------------------------------------------------------------------\n// Feature importance\n// ---------------------------------------------------------------------------\n\n/** The dominance threshold above which a single feature's share triggers the leakage guard. */\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * Parse a `FeatureImportance` JSON string (a `Record<string, number>`) into sorted importance bars.\n * Sorts by absolute value (descending), normalizes the bar widths against the largest |value| so the\n * top bar fills the track, flags any bar at/above {@link PS_FEATURE_DOMINANCE_THRESHOLD}, and returns\n * at most `topN`. Never throws — invalid/empty input yields `[]`.\n *\n * Also accepts an array-of-`{ name|feature, importance|value }` shape (some sidecars emit that),\n * making the parser robust to both common serializations.\n *\n * @param json The raw feature-importance JSON, or null/undefined.\n * @param topN Maximum bars to return (default 6).\n */\nexport function parseFeatureImportance(json: string | null | undefined, topN = 6): PSFeatureBar[] {\n const entries = extractImportanceEntries(json);\n if (entries.length === 0) return [];\n const sorted = entries.sort((a, b) => Math.abs(b.value) - Math.abs(a.value));\n const maxAbs = Math.abs(sorted[0].value) || 1;\n return sorted.slice(0, topN).map((entry) => {\n const abs = Math.abs(entry.value);\n return {\n name: entry.name,\n pct: Math.round((abs / maxAbs) * 100),\n value: entry.value.toFixed(2),\n warning: abs >= PS_FEATURE_DOMINANCE_THRESHOLD,\n };\n });\n}\n\n/** The single largest absolute feature importance (the dominance number), or null. */\nexport function maxFeatureImportance(json: string | null | undefined): number | null {\n const entries = extractImportanceEntries(json);\n if (entries.length === 0) return null;\n return entries.reduce((max, e) => Math.max(max, Math.abs(e.value)), 0);\n}\n\n/** Internal: tolerant extraction of `{ name, value }[]` from either object or array JSON. */\nfunction extractImportanceEntries(json: string | null | undefined): { name: string; value: number }[] {\n if (!json) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return [];\n }\n const out: { name: string; value: number }[] = [];\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n if (!item || typeof item !== 'object') continue;\n const rec = item as Record<string, unknown>;\n const name = (rec['name'] ?? rec['feature'] ?? rec['Name'] ?? rec['Feature']) as unknown;\n const value = coerceFiniteNumber(rec['importance'] ?? rec['value'] ?? rec['Importance'] ?? rec['Value']);\n if (typeof name === 'string' && name.length > 0 && value != null) out.push({ name, value });\n }\n return out;\n }\n if (parsed && typeof parsed === 'object') {\n for (const [name, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = coerceFiniteNumber(rawVal);\n if (value != null) out.push({ name, value });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Experiments — kanban grouping + leaderboard derivation\n// ---------------------------------------------------------------------------\n\n/** Algorithm chip styling (icon + categorical color), keyed by a normalized algorithm name. */\ninterface AlgoStyle {\n icon: string;\n color: string;\n}\n\n/**\n * Categorical algorithm accents. These are data-viz colors that must stay distinct across themes\n * (allowed token exception #3). A normalized-name lookup with a stable fallback keeps any algorithm\n * — known or not — rendering with a sensible icon + color.\n */\nconst ALGO_STYLES: { match: RegExp; style: AlgoStyle }[] = [\n { match: /xgb|xgboost|gradient/, style: { icon: 'fa-solid fa-bolt', color: '#2050c8' } },\n { match: /light\\s*gbm|lgbm/, style: { icon: 'fa-solid fa-feather', color: '#d98213' } },\n { match: /cat\\s*boost/, style: { icon: 'fa-solid fa-cat', color: '#2050c8' } },\n { match: /random\\s*forest|forest|tree/, style: { icon: 'fa-solid fa-tree', color: '#1f9d57' } },\n { match: /logistic|linear|regression/, style: { icon: 'fa-solid fa-wave-square', color: '#7b3ff0' } },\n { match: /mlp|neural|network|deep/, style: { icon: 'fa-solid fa-network-wired', color: '#7b3ff0' } },\n];\n\nconst ALGO_FALLBACK: AlgoStyle = { icon: 'fa-solid fa-cube', color: '#6b7280' };\n\n/** Resolve an algorithm display name to its icon + categorical color. */\nexport function algoStyle(name: string | null | undefined): AlgoStyle {\n const normalized = (name ?? '').toLowerCase();\n return ALGO_STYLES.find((s) => s.match.test(normalized))?.style ?? ALGO_FALLBACK;\n}\n\n/** The three kanban buckets an iteration set is grouped into. */\nexport interface PSKanbanColumns {\n running: PSIterationCard[];\n completed: PSIterationCard[];\n pruned: PSIterationCard[];\n}\n\n/**\n * Group a session's iterations into the Running / Completed / Pruned kanban columns, mapping each to\n * a {@link PSIterationCard}. The single best-scoring Completed iteration is badged `Best`; `Pending`\n * iterations are treated as Running (they're queued/in-flight); `Failed` iterations join Pruned (a\n * terminal non-success outcome). Completed/pruned cards carry the holdout score + Δ-from-best; running\n * cards carry an indeterminate progress hint.\n *\n * @param iterations The session's iterations (any order — sorted by Sequence internally).\n * @returns The three populated kanban columns.\n */\nexport function groupIterationsToKanban(iterations: PSIterationRow[]): PSKanbanColumns {\n const sorted = [...iterations].sort((a, b) => a.Sequence - b.Sequence);\n const bestScore = bestIterationScore(sorted);\n\n const running: PSIterationCard[] = [];\n const completed: PSIterationCard[] = [];\n const pruned: PSIterationCard[] = [];\n\n for (const it of sorted) {\n const status = it.Status;\n if (status === 'Running' || status === 'Pending') {\n running.push(toRunningCard(it));\n } else if (status === 'Completed') {\n const isBest = it.Score != null && bestScore != null && it.Score === bestScore;\n completed.push(toScoredCard(it, isBest ? 'Best' : 'Completed', bestScore));\n } else {\n // Pruned or Failed → the pruned column (terminal, non-leading).\n pruned.push(toScoredCard(it, 'Pruned', bestScore));\n }\n }\n return { running, completed, pruned };\n}\n\n/** The highest Completed-iteration score in a set (the leaderboard top), or null. */\nexport function bestIterationScore(iterations: PSIterationRow[]): number | null {\n let best: number | null = null;\n for (const it of iterations) {\n if (it.Status !== 'Completed' || it.Score == null) continue;\n if (best == null || it.Score > best) best = it.Score;\n }\n return best;\n}\n\n/**\n * Derive the leaderboard (rank-ordered pills) from a session's iterations: every iteration with a\n * score, sorted by score descending, ranked 1..N. The top entry is flagged `best`; pruned/failed\n * iterations are flagged `pruned`. Iterations without a score are omitted.\n *\n * @param iterations The session's iterations.\n * @param topN Maximum leaderboard entries (default 6).\n */\nexport function deriveLeaderboard(iterations: PSIterationRow[], topN = 6): PSLeaderboardEntry[] {\n const scored = iterations.filter((it) => it.Score != null);\n scored.sort((a, b) => (b.Score as number) - (a.Score as number));\n return scored.slice(0, topN).map((it, idx) => {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n rank: idx + 1,\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: style.color,\n features: it.Label ?? `iteration ${it.Sequence}`,\n auc: it.Score as number,\n best: idx === 0,\n pruned: it.Status === 'Pruned' || it.Status === 'Failed',\n };\n });\n}\n\n/** Build a Running/Pending iteration card (indeterminate progress — no live percent available). */\nfunction toRunningCard(it: PSIterationRow): PSIterationCard {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: style.color,\n iteration: `iteration ${it.Sequence}${it.Status === 'Pending' ? ' · queued' : ' · in progress'}`,\n features: featureChips(it.Label),\n status: 'Running',\n progress: it.Status === 'Pending' ? 8 : 50,\n progressDetail: it.Status === 'Pending' ? 'waiting for a slot' : 'training…',\n rationale: it.Rationale ?? 'No rationale recorded.',\n };\n}\n\n/** Build a Completed/Best/Pruned iteration card carrying the score + Δ-from-best. */\nfunction toScoredCard(it: PSIterationRow, status: 'Best' | 'Completed' | 'Pruned', bestScore: number | null): PSIterationCard {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: status === 'Pruned' ? ALGO_FALLBACK.color : style.color,\n iteration: `iteration ${it.Sequence}`,\n features: featureChips(it.Label),\n status,\n score: it.Score ?? undefined,\n scoreDelta: scoreDelta(it.Score, bestScore, status),\n rationale: it.Rationale ?? 'No rationale recorded.',\n };\n}\n\n/** Split an iteration label into feature chips; falls back to a single generic chip. */\nfunction featureChips(label: string | null): string[] {\n if (!label) return ['features'];\n // Labels are often \"Algo + featureA, featureB\" — keep the part after a '+' if present.\n const afterPlus = label.includes('+') ? label.slice(label.indexOf('+') + 1) : label;\n const chips = afterPlus\n .split(/[,/]/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return chips.length > 0 ? chips.slice(0, 4) : [label];\n}\n\n/** Format the Δ-from-best string for a scored card. */\nfunction scoreDelta(score: number | null | undefined, bestScore: number | null, status: 'Best' | 'Completed' | 'Pruned'): string {\n if (status === 'Best') return 'Δ best —';\n if (score == null || bestScore == null) return '';\n const delta = score - bestScore;\n return `Δ ${delta >= 0 ? '+' : '−'}${Math.abs(delta).toFixed(3)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Home — KPIs + activity feed\n// ---------------------------------------------------------------------------\n\n/** A derived Home KPI strip — all entity-agnostic counts/metrics. */\nexport interface PSHomeKpis {\n publishedCount: number;\n activeExperiments: number;\n /** Best holdout AUC across published models, formatted, or '—' when none. */\n bestHoldout: string;\n /** Sum of SuccessCount across recent non-dry-run ML scoring runs this week. */\n scoredThisWeek: string;\n /** Total training runs (experiment iterations) recorded. */\n experimentRuns: number;\n}\n\n/**\n * Compute the Home KPI strip from the cached engine rows. `bestHoldout` is the max holdout AUC across\n * **published** models (the production-quality number); `scoredThisWeek` sums successful records\n * across the supplied recent scoring runs (already filtered to ML-scoring, non-dry-run, last 7 days\n * by the caller). Everything degrades gracefully to '—' / 0 when data is absent.\n */\nexport function computeHomeKpis(\n models: PSModelRow[],\n runningSessionCount: number,\n recentScoringRuns: PSProcessRunRow[],\n experimentRunCount: number,\n): PSHomeKpis {\n const published = models.filter((m) => m.Status === 'Published');\n const bestHoldoutNum = published.reduce<number | null>((best, m) => {\n const auc = parseMetrics(m.HoldoutMetrics).AUC;\n if (auc == null) return best;\n return best == null ? auc : Math.max(best, auc);\n }, null);\n const scored = recentScoringRuns.reduce((sum, r) => sum + (r.SuccessCount || 0), 0);\n return {\n publishedCount: published.length,\n activeExperiments: runningSessionCount,\n bestHoldout: bestHoldoutNum == null ? '—' : bestHoldoutNum.toFixed(3),\n scoredThisWeek: scored.toLocaleString(),\n experimentRuns: experimentRunCount,\n };\n}\n\n/** A vertical activity-feed item, with the icon/kind chosen by {@link buildActivityFeed}. */\nexport interface PSActivityFeedItem {\n kind: 'promote' | 'run' | 'warn' | 'archive';\n icon: string;\n title: string;\n detail: string;\n when: string;\n /** Sort key (epoch ms) — most recent first. Not rendered. */\n sortMs: number;\n}\n\n/**\n * Build the Home recent-activity feed by merging recent ML scoring runs and recent model promotions\n * into one reverse-chronological list. Scoring runs become `run` (or `warn` when failed) items;\n * published models become `promote` items; archived models become `archive` items. Capped at `limit`.\n *\n * @param scoringRuns Recent ML scoring process runs (any order).\n * @param models All cached models (used to surface recent promotions/archives by UpdatedAt-derived time).\n * @param now Reference time for the relative \"when\" strings.\n * @param limit Max feed items (default 6).\n */\nexport function buildActivityFeed(\n scoringRuns: PSProcessRunRow[],\n modelEvents: PSModelEvent[],\n now: Date,\n limit = 6,\n): PSActivityFeedItem[] {\n const items: PSActivityFeedItem[] = [];\n\n for (const run of scoringRuns) {\n // Never let a missing/invalid timestamp crash the whole feed — fall back to `now` so the run\n // still appears (a just-created run can transiently arrive with no usable date).\n const when = toDate(run.StartTime) ?? toDate(run.CreatedAt) ?? now;\n const failed = run.Status === 'Failed';\n items.push({\n kind: failed ? 'warn' : 'run',\n icon: failed ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-bolt',\n title: failed\n ? `Scoring run failed${run.ProcessName ? ` — ${run.ProcessName}` : ''}`\n : `Scored ${run.SuccessCount.toLocaleString()} ${run.EntityName ?? 'records'}`,\n detail: `${run.ProcessName ?? 'ML scoring'}${run.DryRun ? ' · dry run' : ''} · ${run.Status}`,\n when: relativeTime(when, now),\n sortMs: when.getTime(),\n });\n }\n\n for (const ev of modelEvents) {\n const isArchive = ev.kind === 'archive';\n const when = toDate(ev.when) ?? now;\n items.push({\n kind: isArchive ? 'archive' : 'promote',\n icon: isArchive ? 'fa-solid fa-box-archive' : 'fa-solid fa-arrow-up',\n title: isArchive\n ? `${ev.name} archived`\n : `${ev.name} promoted to ${ev.status}`,\n detail: ev.auc != null ? `${ev.algorithm ?? 'model'} · holdout AUC ${ev.auc.toFixed(3)}` : (ev.algorithm ?? 'model'),\n when: relativeTime(when, now),\n sortMs: when.getTime(),\n });\n }\n\n items.sort((a, b) => b.sortMs - a.sortMs);\n return items.slice(0, limit);\n}\n\n/** A model lifecycle event (promotion / archive) feeding the activity timeline. */\nexport interface PSModelEvent {\n kind: 'promote' | 'archive';\n name: string;\n status: string;\n algorithm: string | null;\n auc: number | null;\n when: Date;\n}\n\n/**\n * Project recent non-Draft models into lifecycle activity events (Published → promote, Archived →\n * archive), ordered by `when` (their last-updated time) descending. Validated models are treated as\n * promotions too (a meaningful lifecycle advance).\n *\n * @param models Model rows extended with a display name + last-updated time.\n * @param limit Max events (default 8).\n */\nexport function deriveModelEvents(models: PSModelEventSource[], limit = 8): PSModelEvent[] {\n const events: PSModelEvent[] = [];\n for (const m of models) {\n if (m.Status === 'Published' || m.Status === 'Validated') {\n events.push({ kind: 'promote', name: m.Name, status: m.Status, algorithm: m.Algorithm, auc: primaryAuc(m), when: m.UpdatedAt });\n } else if (m.Status === 'Archived') {\n events.push({ kind: 'archive', name: m.Name, status: m.Status, algorithm: m.Algorithm, auc: primaryAuc(m), when: m.UpdatedAt });\n }\n }\n events.sort((a, b) => b.when.getTime() - a.when.getTime());\n return events.slice(0, limit);\n}\n\n/** Source row for {@link deriveModelEvents} — a model plus its resolved display name + timestamp. */\nexport interface PSModelEventSource extends Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics' | 'Status'> {\n Name: string;\n Algorithm: string | null;\n UpdatedAt: Date;\n}\n\n/**\n * A compact relative-time string (\"just now\", \"22 minutes ago\", \"3 hours ago\", \"Yesterday\",\n * \"2 days ago\", or a date for older). Deterministic given `now` — testable.\n */\n/** Coerce a possibly-null / string / Date value to a valid Date, or `null` when there isn't one. */\nexport function toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null;\n const d = value instanceof Date ? value : new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function relativeTime(when: Date, now: Date): string {\n const ms = now.getTime() - when.getTime();\n if (ms < 0) return 'just now';\n const minutes = Math.floor(ms / 60000);\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.floor(hours / 24);\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return when.toLocaleDateString();\n}\n\n// ---------------------------------------------------------------------------\n// Compare — side-by-side runs from a session's iterations\n// ---------------------------------------------------------------------------\n\n/** A single run column in the Compare panel, derived from a scored iteration. */\nexport interface PSCompareColumn {\n key: string;\n label: string;\n algorithm: string;\n descriptor: string;\n color: string;\n holdoutAuc: number | null;\n computeCost: number | null;\n status: string;\n isBest: boolean;\n}\n\n/**\n * Derive Compare-panel run columns from a session's iterations: the scored iterations ranked by score\n * descending, capped at `maxRuns`, each carrying its holdout score, compute cost, and algorithm chip.\n * The top scorer is flagged `isBest`. Returns `[]` when nothing scored — the panel shows its prompt\n * state.\n *\n * @param iterations The session's iterations.\n * @param maxRuns Maximum run columns to compare (default 3).\n */\nexport function deriveCompareColumns(iterations: PSIterationRow[], maxRuns = 3): PSCompareColumn[] {\n const scored = iterations.filter((it) => it.Score != null);\n scored.sort((a, b) => (b.Score as number) - (a.Score as number));\n return scored.slice(0, maxRuns).map((it, idx) => {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n key: it.ID,\n label: `Run ${idx + 1}`,\n algorithm: algo,\n descriptor: it.Label ?? `iteration ${it.Sequence}`,\n color: style.color,\n holdoutAuc: it.Score,\n computeCost: it.ComputeCost,\n status: it.Status,\n isBest: idx === 0,\n };\n });\n}\n\n/** A compare metric row (label + per-run formatted values + which column is best). */\nexport interface PSCompareMetricRow {\n label: string;\n qualifier: string;\n values: string[];\n bestIndex: number;\n}\n\n/**\n * Build the side-by-side metric rows for a set of compare columns. Currently surfaces Holdout AUC\n * (higher is better) and Compute Cost (lower is better) — the two universally-available iteration\n * metrics — formatting absent values as '—' and marking the best column per row.\n */\nexport function buildCompareMetricRows(columns: PSCompareColumn[]): PSCompareMetricRow[] {\n if (columns.length === 0) return [];\n const aucs = columns.map((c) => c.holdoutAuc);\n const costs = columns.map((c) => c.computeCost);\n return [\n {\n label: 'Holdout score',\n qualifier: 'the honest number · higher is better',\n values: aucs.map((v) => (v == null ? '—' : v.toFixed(3))),\n bestIndex: indexOfExtreme(aucs, 'max'),\n },\n {\n label: 'Compute cost',\n qualifier: 'lower is better',\n values: costs.map((v) => (v == null ? '—' : v.toFixed(2))),\n bestIndex: indexOfExtreme(costs, 'min'),\n },\n ];\n}\n\n/** Index of the max/min finite value in an array (−1 when all null). */\nfunction indexOfExtreme(values: (number | null)[], dir: 'max' | 'min'): number {\n let bestIdx = -1;\n let bestVal: number | null = null;\n values.forEach((v, i) => {\n if (v == null) return;\n if (bestVal == null || (dir === 'max' ? v > bestVal : v < bestVal)) {\n bestVal = v;\n bestIdx = i;\n }\n });\n return bestIdx;\n}\n\n// ---------------------------------------------------------------------------\n// shared coercion\n// ---------------------------------------------------------------------------\n\n/** Coerce an unknown value to a finite number, or null. Accepts numeric strings. */\nexport function coerceFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length === 0) return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n"]}
1
+ {"version":3,"file":"predictive-studio.view-models.js","sourceRoot":"","sources":["../../src/PredictiveStudio/predictive-studio.view-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, framework-free view-model derivations for the Predictive Studio dashboard.\n *\n * Everything in this module is a deterministic function over plain data shapes (NOT BaseEntity\n * instances) so it can be unit-tested with zero DB / Angular / metadata-provider setup. The Angular\n * panels (Registry / Experiments / Home / Compare) thread their cached engine rows through narrow\n * row interfaces declared here, keeping the parsing + grouping + leaderboard logic out of the\n * components and under test.\n *\n * Design rules honored throughout:\n * - **100% entity-agnostic.** Nothing references members / renewals / any specific business entity —\n * model/metric names come straight from the data. The single domain assumption is the ML metric\n * vocabulary (AUC / F1 / precision / recall …), which is universal to predictive modeling.\n * - **Tolerant of missing/partial/garbage JSON.** Every parser returns `null` / `[]` rather than\n * throwing, so a half-populated environment renders gracefully instead of erroring.\n * - **Only surface what's present.** Metric maps omit absent keys; the UI shows just the numbers the\n * model actually recorded, never fabricated zeros.\n */\n\nimport { PSFeatureBar, PSIterationCard, PSLeaderboardEntry } from './predictive-studio.types';\n\n// ---------------------------------------------------------------------------\n// Narrow row shapes — the minimal slice of each entity these derivations need.\n// Decoupled from the generated entity classes so the functions stay pure/testable.\n// ---------------------------------------------------------------------------\n\n/** Minimal model slice consumed by the registry/home/compare derivations. */\nexport interface PSModelRow {\n ID: string;\n Version: number;\n Status: string;\n AlgorithmID: string | null;\n PipelineID: string | null;\n Metrics: string | null;\n HoldoutMetrics: string | null;\n FeatureImportance: string | null;\n TargetVariable: string | null;\n ProblemType: string | null;\n TrainingDurationSec?: number | null;\n}\n\n/** Minimal experiment-session-iteration slice consumed by the experiments/compare derivations. */\nexport interface PSIterationRow {\n ID: string;\n ExperimentSessionID: string;\n Sequence: number;\n Label: string | null;\n Status: string;\n Score: number | null;\n ComputeCost: number | null;\n TokensUsed: number | null;\n Rationale: string | null;\n AlgorithmName?: string;\n}\n\n/** Minimal process-run slice consumed by the home activity/KPI derivations. */\nexport interface PSProcessRunRow {\n ID: string;\n Status: string;\n StartTime: Date | null;\n CreatedAt: Date | null;\n SuccessCount: number;\n TotalItemCount?: number | null;\n ProcessName: string | null;\n EntityName: string | null;\n DryRun: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Metric JSON parsing\n// ---------------------------------------------------------------------------\n\n/** Canonical metric keys we know how to surface, in display order. */\nexport const PS_KNOWN_METRIC_KEYS = [\n 'AUC',\n 'Accuracy',\n 'Precision',\n 'Recall',\n 'F1',\n 'LogLoss',\n 'Brier',\n 'RMSE',\n 'MAE',\n 'R2',\n] as const;\n\nexport type PSMetricKey = (typeof PS_KNOWN_METRIC_KEYS)[number];\n\n/**\n * A parsed metric map — canonical key → numeric value. Only keys actually present (and numeric) in\n * the source JSON appear; everything else is omitted so the UI shows just real numbers.\n */\nexport type PSMetricMap = Partial<Record<PSMetricKey, number>>;\n\n/** Lower-cased alias → canonical key, so we accept `auc`/`f1_score`/`logloss`/etc. across sidecars. */\nconst METRIC_ALIASES: Record<string, PSMetricKey> = {\n auc: 'AUC',\n 'roc_auc': 'AUC',\n rocauc: 'AUC',\n accuracy: 'Accuracy',\n acc: 'Accuracy',\n precision: 'Precision',\n recall: 'Recall',\n f1: 'F1',\n 'f1_score': 'F1',\n f1score: 'F1',\n logloss: 'LogLoss',\n 'log_loss': 'LogLoss',\n brier: 'Brier',\n 'brier_score': 'Brier',\n rmse: 'RMSE',\n mae: 'MAE',\n r2: 'R2',\n 'r_squared': 'R2',\n};\n\n/**\n * Parse a metrics JSON string (e.g. `model.Metrics` / `model.HoldoutMetrics`) into a canonical\n * {@link PSMetricMap}. Accepts both canonical (`AUC`) and common alias (`auc`, `f1_score`) keys,\n * keeps only finite numeric values, and never throws — invalid/empty input yields `{}`.\n *\n * @param json The raw JSON string, or null/undefined.\n * @returns A metric map containing only the recognized, numeric metrics present in the source.\n */\nexport function parseMetrics(json: string | null | undefined): PSMetricMap {\n if (!json) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return {};\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {};\n const out: PSMetricMap = {};\n for (const [rawKey, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = coerceFiniteNumber(rawVal);\n if (value == null) continue;\n const canonical = canonicalMetricKey(rawKey);\n if (canonical && out[canonical] == null) out[canonical] = value;\n }\n return out;\n}\n\n/** Resolve a raw metric key to its canonical form (exact match first, then alias), or null. */\nexport function canonicalMetricKey(rawKey: string): PSMetricKey | null {\n const exact = PS_KNOWN_METRIC_KEYS.find((k) => k === rawKey);\n if (exact) return exact;\n return METRIC_ALIASES[rawKey.trim().toLowerCase()] ?? null;\n}\n\n/** The primary AUC/score of a model: holdout AUC preferred, else training AUC, else null. */\nexport function primaryAuc(model: Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics'>): number | null {\n const holdout = parseMetrics(model.HoldoutMetrics);\n if (holdout.AUC != null) return holdout.AUC;\n const train = parseMetrics(model.Metrics);\n return train.AUC ?? null;\n}\n\n/** The primary metric score of a model: holdout preferred, else training. Inspects ProblemType and selects R² for regression, AUC for classification. */\nexport function primaryModelScore(\n model: Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics'> & { ProblemType?: string | null },\n): { key: PSMetricKey; label: string; value: number } | null {\n const isReg = (model.ProblemType ?? '').toLowerCase() === 'regression';\n const holdout = parseMetrics(model.HoldoutMetrics);\n const train = parseMetrics(model.Metrics);\n\n if (isReg) {\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['R2', 'RMSE', 'MAE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n }\n\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (holdout[k] != null) return { key: k, label: METRIC_LABELS[k], value: holdout[k]! };\n }\n for (const k of ['AUC', 'Accuracy', 'F1', 'R2', 'RMSE'] as const) {\n if (train[k] != null) return { key: k, label: METRIC_LABELS[k], value: train[k]! };\n }\n\n return null;\n}\n\n/** A labeled metric ready for display (value formatted to a sensible precision). */\nexport interface PSMetricDisplay {\n key: PSMetricKey;\n label: string;\n value: string;\n}\n\n/** Human labels for the canonical metric keys. */\nexport const METRIC_LABELS: Record<PSMetricKey, string> = {\n AUC: 'AUC',\n Accuracy: 'Accuracy',\n Precision: 'Precision',\n Recall: 'Recall',\n F1: 'F1',\n LogLoss: 'Log Loss',\n Brier: 'Brier',\n RMSE: 'RMSE',\n MAE: 'MAE',\n R2: 'R²',\n};\n\n/**\n * Turn a metric map into an ordered, formatted display list (canonical order, only present keys).\n * AUC is excluded by default since the panels surface it as a hero number separately.\n *\n * @param metrics The parsed metric map.\n * @param options.excludeAuc When true (default), omit AUC from the secondary stat list.\n */\nexport function metricsToDisplay(metrics: PSMetricMap, options?: { excludeAuc?: boolean }): PSMetricDisplay[] {\n const excludeAuc = options?.excludeAuc ?? true;\n const out: PSMetricDisplay[] = [];\n for (const key of PS_KNOWN_METRIC_KEYS) {\n if (excludeAuc && key === 'AUC') continue;\n const value = metrics[key];\n if (value == null) continue;\n out.push({ key, label: METRIC_LABELS[key], value: formatMetricValue(key, value) });\n }\n return out;\n}\n\n/** Format a metric value: 3 decimals for ratio metrics, 2 for the rest. */\nexport function formatMetricValue(key: PSMetricKey, value: number): string {\n const threeDecimals: PSMetricKey[] = ['AUC', 'LogLoss', 'Brier', 'RMSE', 'MAE', 'R2'];\n return value.toFixed(threeDecimals.includes(key) ? 3 : 2);\n}\n\n/**\n * The train-vs-holdout overfit gap (train metric − holdout metric), or null when either is missing.\n * Positive means the model does better in-sample than out-of-sample (the expected direction).\n */\nexport function overfitGap(\n model: Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics'> & { ProblemType?: string | null },\n preferredKey?: PSMetricKey,\n): number | null {\n const trainMetrics = parseMetrics(model.Metrics);\n const holdoutMetrics = parseMetrics(model.HoldoutMetrics);\n\n const key: PSMetricKey | null =\n preferredKey ??\n ((model.ProblemType ?? '').toLowerCase() === 'regression'\n ? (trainMetrics.R2 != null && holdoutMetrics.R2 != null ? 'R2' : null)\n : null) ??\n (trainMetrics.AUC != null && holdoutMetrics.AUC != null ? 'AUC' : null) ??\n (trainMetrics.Accuracy != null && holdoutMetrics.Accuracy != null ? 'Accuracy' : null) ??\n (trainMetrics.R2 != null && holdoutMetrics.R2 != null ? 'R2' : null);\n\n if (!key) return null;\n const train = trainMetrics[key];\n const holdout = holdoutMetrics[key];\n if (train == null || holdout == null) return null;\n return train - holdout;\n}\n\n// ---------------------------------------------------------------------------\n// Feature importance\n// ---------------------------------------------------------------------------\n\n/** The dominance threshold above which a single feature's share triggers the leakage guard. */\nexport const PS_FEATURE_DOMINANCE_THRESHOLD = 0.6;\n\n/**\n * Parse a `FeatureImportance` JSON string (a `Record<string, number>`) into sorted importance bars.\n * Sorts by absolute value (descending), normalizes the bar widths against the largest |value| so the\n * top bar fills the track, flags any bar at/above {@link PS_FEATURE_DOMINANCE_THRESHOLD}, and returns\n * at most `topN`. Never throws — invalid/empty input yields `[]`.\n *\n * Also accepts an array-of-`{ name|feature, importance|value }` shape (some sidecars emit that),\n * making the parser robust to both common serializations.\n *\n * @param json The raw feature-importance JSON, or null/undefined.\n * @param topN Maximum bars to return (default 6).\n */\nexport function parseFeatureImportance(json: string | null | undefined, topN = 6): PSFeatureBar[] {\n const entries = extractImportanceEntries(json);\n if (entries.length === 0) return [];\n const sorted = entries.sort((a, b) => Math.abs(b.value) - Math.abs(a.value));\n const maxAbs = Math.abs(sorted[0].value) || 1;\n return sorted.slice(0, topN).map((entry) => {\n const abs = Math.abs(entry.value);\n return {\n name: entry.name,\n pct: Math.round((abs / maxAbs) * 100),\n value: entry.value.toFixed(2),\n warning: abs >= PS_FEATURE_DOMINANCE_THRESHOLD,\n };\n });\n}\n\n/** The single largest absolute feature importance (the dominance number), or null. */\nexport function maxFeatureImportance(json: string | null | undefined): number | null {\n const entries = extractImportanceEntries(json);\n if (entries.length === 0) return null;\n return entries.reduce((max, e) => Math.max(max, Math.abs(e.value)), 0);\n}\n\n/** Internal: tolerant extraction of `{ name, value }[]` from either object or array JSON. */\nfunction extractImportanceEntries(json: string | null | undefined): { name: string; value: number }[] {\n if (!json) return [];\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n return [];\n }\n const out: { name: string; value: number }[] = [];\n if (Array.isArray(parsed)) {\n for (const item of parsed) {\n if (!item || typeof item !== 'object') continue;\n const rec = item as Record<string, unknown>;\n const name = (rec['name'] ?? rec['feature'] ?? rec['Name'] ?? rec['Feature']) as unknown;\n const value = coerceFiniteNumber(rec['importance'] ?? rec['value'] ?? rec['Importance'] ?? rec['Value']);\n if (typeof name === 'string' && name.length > 0 && value != null) out.push({ name, value });\n }\n return out;\n }\n if (parsed && typeof parsed === 'object') {\n for (const [name, rawVal] of Object.entries(parsed as Record<string, unknown>)) {\n const value = coerceFiniteNumber(rawVal);\n if (value != null) out.push({ name, value });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Experiments — kanban grouping + leaderboard derivation\n// ---------------------------------------------------------------------------\n\n/** Algorithm chip styling (icon + categorical color), keyed by a normalized algorithm name. */\ninterface AlgoStyle {\n icon: string;\n color: string;\n}\n\n/**\n * Categorical algorithm accents. These are data-viz colors that must stay distinct across themes\n * (allowed token exception #3). A normalized-name lookup with a stable fallback keeps any algorithm\n * — known or not — rendering with a sensible icon + color.\n */\nconst ALGO_STYLES: { match: RegExp; style: AlgoStyle }[] = [\n { match: /xgb|xgboost|gradient/, style: { icon: 'fa-solid fa-bolt', color: '#2050c8' } },\n { match: /light\\s*gbm|lgbm/, style: { icon: 'fa-solid fa-feather', color: '#d98213' } },\n { match: /cat\\s*boost/, style: { icon: 'fa-solid fa-cat', color: '#2050c8' } },\n { match: /random\\s*forest|forest|tree/, style: { icon: 'fa-solid fa-tree', color: '#1f9d57' } },\n { match: /logistic|linear|regression/, style: { icon: 'fa-solid fa-wave-square', color: '#7b3ff0' } },\n { match: /mlp|neural|network|deep/, style: { icon: 'fa-solid fa-network-wired', color: '#7b3ff0' } },\n];\n\nconst ALGO_FALLBACK: AlgoStyle = { icon: 'fa-solid fa-cube', color: '#6b7280' };\n\n/** Resolve an algorithm display name to its icon + categorical color. */\nexport function algoStyle(name: string | null | undefined): AlgoStyle {\n const normalized = (name ?? '').toLowerCase();\n return ALGO_STYLES.find((s) => s.match.test(normalized))?.style ?? ALGO_FALLBACK;\n}\n\n/** The three kanban buckets an iteration set is grouped into. */\nexport interface PSKanbanColumns {\n running: PSIterationCard[];\n completed: PSIterationCard[];\n pruned: PSIterationCard[];\n}\n\n/**\n * Group a session's iterations into the Running / Completed / Pruned kanban columns, mapping each to\n * a {@link PSIterationCard}. The single best-scoring Completed iteration is badged `Best`; `Pending`\n * iterations are treated as Running (they're queued/in-flight); `Failed` iterations join Pruned (a\n * terminal non-success outcome). Completed/pruned cards carry the holdout score + Δ-from-best; running\n * cards carry an indeterminate progress hint.\n *\n * @param iterations The session's iterations (any order — sorted by Sequence internally).\n * @returns The three populated kanban columns.\n */\nexport function groupIterationsToKanban(iterations: PSIterationRow[]): PSKanbanColumns {\n const sorted = [...iterations].sort((a, b) => a.Sequence - b.Sequence);\n const bestScore = bestIterationScore(sorted);\n\n const running: PSIterationCard[] = [];\n const completed: PSIterationCard[] = [];\n const pruned: PSIterationCard[] = [];\n\n for (const it of sorted) {\n const status = it.Status;\n if (status === 'Running' || status === 'Pending') {\n running.push(toRunningCard(it));\n } else if (status === 'Completed') {\n const isBest = it.Score != null && bestScore != null && it.Score === bestScore;\n completed.push(toScoredCard(it, isBest ? 'Best' : 'Completed', bestScore));\n } else {\n // Pruned or Failed → the pruned column (terminal, non-leading).\n pruned.push(toScoredCard(it, 'Pruned', bestScore));\n }\n }\n return { running, completed, pruned };\n}\n\n/** The highest Completed-iteration score in a set (the leaderboard top), or null. */\nexport function bestIterationScore(iterations: PSIterationRow[]): number | null {\n let best: number | null = null;\n for (const it of iterations) {\n if (it.Status !== 'Completed' || it.Score == null) continue;\n if (best == null || it.Score > best) best = it.Score;\n }\n return best;\n}\n\n/**\n * Derive the leaderboard (rank-ordered pills) from a session's iterations: every iteration with a\n * score, sorted by score descending, ranked 1..N. The top entry is flagged `best`; pruned/failed\n * iterations are flagged `pruned`. Iterations without a score are omitted.\n *\n * @param iterations The session's iterations.\n * @param topN Maximum leaderboard entries (default 6).\n */\nexport function deriveLeaderboard(iterations: PSIterationRow[], topN = 6): PSLeaderboardEntry[] {\n const scored = iterations.filter((it) => it.Score != null);\n scored.sort((a, b) => (b.Score as number) - (a.Score as number));\n return scored.slice(0, topN).map((it, idx) => {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n rank: idx + 1,\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: style.color,\n features: it.Label ?? `iteration ${it.Sequence}`,\n auc: it.Score as number,\n best: idx === 0,\n pruned: it.Status === 'Pruned' || it.Status === 'Failed',\n };\n });\n}\n\n/** Build a Running/Pending iteration card (indeterminate progress — no live percent available). */\nfunction toRunningCard(it: PSIterationRow): PSIterationCard {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: style.color,\n iteration: `iteration ${it.Sequence}${it.Status === 'Pending' ? ' · queued' : ' · in progress'}`,\n features: featureChips(it.Label),\n status: 'Running',\n progress: it.Status === 'Pending' ? 8 : 50,\n progressDetail: it.Status === 'Pending' ? 'waiting for a slot' : 'training…',\n rationale: it.Rationale ?? 'No rationale recorded.',\n };\n}\n\n/** Build a Completed/Best/Pruned iteration card carrying the score + Δ-from-best. */\nfunction toScoredCard(it: PSIterationRow, status: 'Best' | 'Completed' | 'Pruned', bestScore: number | null): PSIterationCard {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n algorithm: algo,\n algorithmIcon: style.icon,\n algorithmColor: status === 'Pruned' ? ALGO_FALLBACK.color : style.color,\n iteration: `iteration ${it.Sequence}`,\n features: featureChips(it.Label),\n status,\n score: it.Score ?? undefined,\n scoreDelta: scoreDelta(it.Score, bestScore, status),\n rationale: it.Rationale ?? 'No rationale recorded.',\n };\n}\n\n/** Split an iteration label into feature chips; falls back to a single generic chip. */\nfunction featureChips(label: string | null): string[] {\n if (!label) return ['features'];\n // Labels are often \"Algo + featureA, featureB\" — keep the part after a '+' if present.\n const afterPlus = label.includes('+') ? label.slice(label.indexOf('+') + 1) : label;\n const chips = afterPlus\n .split(/[,/]/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return chips.length > 0 ? chips.slice(0, 4) : [label];\n}\n\n/** Format the Δ-from-best string for a scored card. */\nfunction scoreDelta(score: number | null | undefined, bestScore: number | null, status: 'Best' | 'Completed' | 'Pruned'): string {\n if (status === 'Best') return 'Δ best —';\n if (score == null || bestScore == null) return '';\n const delta = score - bestScore;\n return `Δ ${delta >= 0 ? '+' : '−'}${Math.abs(delta).toFixed(3)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Home — KPIs + activity feed\n// ---------------------------------------------------------------------------\n\n/** A derived Home KPI strip — all entity-agnostic counts/metrics. */\nexport interface PSHomeKpis {\n publishedCount: number;\n activeExperiments: number;\n /** Best holdout AUC across published models, formatted, or '—' when none. */\n bestHoldout: string;\n /** Sum of SuccessCount across recent non-dry-run ML scoring runs this week. */\n scoredThisWeek: string;\n /** Total training runs (experiment iterations) recorded. */\n experimentRuns: number;\n}\n\n/**\n * Compute the Home KPI strip from the cached engine rows. `bestHoldout` is the max holdout AUC across\n * **published** models (the production-quality number); `scoredThisWeek` sums successful records\n * across the supplied recent scoring runs (already filtered to ML-scoring, non-dry-run, last 7 days\n * by the caller). Everything degrades gracefully to '—' / 0 when data is absent.\n */\nexport function computeHomeKpis(\n models: PSModelRow[],\n runningSessionCount: number,\n recentScoringRuns: PSProcessRunRow[],\n experimentRunCount: number,\n): PSHomeKpis {\n const published = models.filter((m) => m.Status === 'Published');\n const bestHoldoutNum = published.reduce<number | null>((best, m) => {\n const auc = parseMetrics(m.HoldoutMetrics).AUC;\n if (auc == null) return best;\n return best == null ? auc : Math.max(best, auc);\n }, null);\n const scored = recentScoringRuns.reduce((sum, r) => sum + (r.SuccessCount || 0), 0);\n return {\n publishedCount: published.length,\n activeExperiments: runningSessionCount,\n bestHoldout: bestHoldoutNum == null ? '—' : bestHoldoutNum.toFixed(3),\n scoredThisWeek: scored.toLocaleString(),\n experimentRuns: experimentRunCount,\n };\n}\n\n/** A vertical activity-feed item, with the icon/kind chosen by {@link buildActivityFeed}. */\nexport interface PSActivityFeedItem {\n kind: 'promote' | 'run' | 'warn' | 'archive';\n icon: string;\n title: string;\n detail: string;\n when: string;\n /** Sort key (epoch ms) — most recent first. Not rendered. */\n sortMs: number;\n}\n\n/**\n * Build the Home recent-activity feed by merging recent ML scoring runs and recent model promotions\n * into one reverse-chronological list. Scoring runs become `run` (or `warn` when failed) items;\n * published models become `promote` items; archived models become `archive` items. Capped at `limit`.\n *\n * @param scoringRuns Recent ML scoring process runs (any order).\n * @param models All cached models (used to surface recent promotions/archives by UpdatedAt-derived time).\n * @param now Reference time for the relative \"when\" strings.\n * @param limit Max feed items (default 6).\n */\nexport function buildActivityFeed(\n scoringRuns: PSProcessRunRow[],\n modelEvents: PSModelEvent[],\n now: Date,\n limit = 6,\n): PSActivityFeedItem[] {\n const items: PSActivityFeedItem[] = [];\n\n for (const run of scoringRuns) {\n // Never let a missing/invalid timestamp crash the whole feed — fall back to `now` so the run\n // still appears (a just-created run can transiently arrive with no usable date).\n const when = toDate(run.StartTime) ?? toDate(run.CreatedAt) ?? now;\n const failed = run.Status === 'Failed';\n items.push({\n kind: failed ? 'warn' : 'run',\n icon: failed ? 'fa-solid fa-triangle-exclamation' : 'fa-solid fa-bolt',\n title: failed\n ? `Scoring run failed${run.ProcessName ? ` — ${run.ProcessName}` : ''}`\n : `Scored ${run.SuccessCount.toLocaleString()} ${run.EntityName ?? 'records'}`,\n detail: `${run.ProcessName ?? 'ML scoring'}${run.DryRun ? ' · dry run' : ''} · ${run.Status}`,\n when: relativeTime(when, now),\n sortMs: when.getTime(),\n });\n }\n\n for (const ev of modelEvents) {\n const isArchive = ev.kind === 'archive';\n const when = toDate(ev.when) ?? now;\n items.push({\n kind: isArchive ? 'archive' : 'promote',\n icon: isArchive ? 'fa-solid fa-box-archive' : 'fa-solid fa-arrow-up',\n title: isArchive\n ? `${ev.name} archived`\n : `${ev.name} promoted to ${ev.status}`,\n detail: ev.auc != null ? `${ev.algorithm ?? 'model'} · holdout AUC ${ev.auc.toFixed(3)}` : (ev.algorithm ?? 'model'),\n when: relativeTime(when, now),\n sortMs: when.getTime(),\n });\n }\n\n items.sort((a, b) => b.sortMs - a.sortMs);\n return items.slice(0, limit);\n}\n\n/** A model lifecycle event (promotion / archive) feeding the activity timeline. */\nexport interface PSModelEvent {\n kind: 'promote' | 'archive';\n name: string;\n status: string;\n algorithm: string | null;\n auc: number | null;\n when: Date;\n}\n\n/**\n * Project recent non-Draft models into lifecycle activity events (Published → promote, Archived →\n * archive), ordered by `when` (their last-updated time) descending. Validated models are treated as\n * promotions too (a meaningful lifecycle advance).\n *\n * @param models Model rows extended with a display name + last-updated time.\n * @param limit Max events (default 8).\n */\nexport function deriveModelEvents(models: PSModelEventSource[], limit = 8): PSModelEvent[] {\n const events: PSModelEvent[] = [];\n for (const m of models) {\n if (m.Status === 'Published' || m.Status === 'Validated') {\n events.push({ kind: 'promote', name: m.Name, status: m.Status, algorithm: m.Algorithm, auc: primaryAuc(m), when: m.UpdatedAt });\n } else if (m.Status === 'Archived') {\n events.push({ kind: 'archive', name: m.Name, status: m.Status, algorithm: m.Algorithm, auc: primaryAuc(m), when: m.UpdatedAt });\n }\n }\n events.sort((a, b) => b.when.getTime() - a.when.getTime());\n return events.slice(0, limit);\n}\n\n/** Source row for {@link deriveModelEvents} — a model plus its resolved display name + timestamp. */\nexport interface PSModelEventSource extends Pick<PSModelRow, 'Metrics' | 'HoldoutMetrics' | 'Status'> {\n Name: string;\n Algorithm: string | null;\n UpdatedAt: Date;\n}\n\n/**\n * A compact relative-time string (\"just now\", \"22 minutes ago\", \"3 hours ago\", \"Yesterday\",\n * \"2 days ago\", or a date for older). Deterministic given `now` — testable.\n */\n/** Coerce a possibly-null / string / Date value to a valid Date, or `null` when there isn't one. */\nexport function toDate(value: Date | string | null | undefined): Date | null {\n if (!value) return null;\n const d = value instanceof Date ? value : new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function relativeTime(when: Date, now: Date): string {\n const ms = now.getTime() - when.getTime();\n if (ms < 0) return 'just now';\n const minutes = Math.floor(ms / 60000);\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.floor(hours / 24);\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return when.toLocaleDateString();\n}\n\n// ---------------------------------------------------------------------------\n// Compare — side-by-side runs from a session's iterations\n// ---------------------------------------------------------------------------\n\n/** A single run column in the Compare panel, derived from a scored iteration. */\nexport interface PSCompareColumn {\n key: string;\n label: string;\n algorithm: string;\n descriptor: string;\n color: string;\n holdoutAuc: number | null;\n computeCost: number | null;\n status: string;\n isBest: boolean;\n}\n\n/**\n * Derive Compare-panel run columns from a session's iterations: the scored iterations ranked by score\n * descending, capped at `maxRuns`, each carrying its holdout score, compute cost, and algorithm chip.\n * The top scorer is flagged `isBest`. Returns `[]` when nothing scored — the panel shows its prompt\n * state.\n *\n * @param iterations The session's iterations.\n * @param maxRuns Maximum run columns to compare (default 3).\n */\nexport function deriveCompareColumns(iterations: PSIterationRow[], maxRuns = 3): PSCompareColumn[] {\n const scored = iterations.filter((it) => it.Score != null);\n scored.sort((a, b) => (b.Score as number) - (a.Score as number));\n return scored.slice(0, maxRuns).map((it, idx) => {\n const algo = it.AlgorithmName ?? 'Unknown';\n const style = algoStyle(algo);\n return {\n key: it.ID,\n label: `Run ${idx + 1}`,\n algorithm: algo,\n descriptor: it.Label ?? `iteration ${it.Sequence}`,\n color: style.color,\n holdoutAuc: it.Score,\n computeCost: it.ComputeCost,\n status: it.Status,\n isBest: idx === 0,\n };\n });\n}\n\n/** A compare metric row (label + per-run formatted values + which column is best). */\nexport interface PSCompareMetricRow {\n label: string;\n qualifier: string;\n values: string[];\n bestIndex: number;\n}\n\n/**\n * Build the side-by-side metric rows for a set of compare columns. Currently surfaces Holdout AUC\n * (higher is better) and Compute Cost (lower is better) — the two universally-available iteration\n * metrics — formatting absent values as '—' and marking the best column per row.\n */\nexport function buildCompareMetricRows(columns: PSCompareColumn[]): PSCompareMetricRow[] {\n if (columns.length === 0) return [];\n const aucs = columns.map((c) => c.holdoutAuc);\n const costs = columns.map((c) => c.computeCost);\n return [\n {\n label: 'Holdout score',\n qualifier: 'the honest number · higher is better',\n values: aucs.map((v) => (v == null ? '—' : v.toFixed(3))),\n bestIndex: indexOfExtreme(aucs, 'max'),\n },\n {\n label: 'Compute cost',\n qualifier: 'lower is better',\n values: costs.map((v) => (v == null ? '—' : v.toFixed(2))),\n bestIndex: indexOfExtreme(costs, 'min'),\n },\n ];\n}\n\n/** Index of the max/min finite value in an array (−1 when all null). */\nfunction indexOfExtreme(values: (number | null)[], dir: 'max' | 'min'): number {\n let bestIdx = -1;\n let bestVal: number | null = null;\n values.forEach((v, i) => {\n if (v == null) return;\n if (bestVal == null || (dir === 'max' ? v > bestVal : v < bestVal)) {\n bestVal = v;\n bestIdx = i;\n }\n });\n return bestIdx;\n}\n\n// ---------------------------------------------------------------------------\n// shared coercion\n// ---------------------------------------------------------------------------\n\n/** Coerce an unknown value to a finite number, or null. Accepts numeric strings. */\nexport function coerceFiniteNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length === 0) return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n"]}
@@ -17,8 +17,16 @@ export declare class PSModelsResourceComponent extends PSResourceBase {
17
17
  private readonly cdrLocal;
18
18
  activeSection: PSPanelKey;
19
19
  readonly sections: readonly PSSection[];
20
+ initialModelId?: string;
21
+ isNavCollapsed: boolean;
22
+ navSizePct: number;
23
+ contentSizePct: number;
20
24
  ngOnInit(): void;
21
- protected OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void;
25
+ toggleNav(): void;
26
+ onSplitDragEnd(sizes: readonly (number | '*')[]): void;
27
+ private loadLayoutPrefs;
28
+ private saveLayoutPrefs;
29
+ protected OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): Promise<void>;
22
30
  /** Deep agent context for the Models door: active section + trained-model lifecycle counts. */
23
31
  protected extraAgentContext(): Record<string, unknown>;
24
32
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ps-models-resource.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/resources/ps-models-resource.component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAmB,SAAS,EAA4D,MAAM,0BAA0B,CAAC;;AAIhI;;;;;;;GAOG;AACH,qBAoEa,yBAA0B,SAAQ,cAAc;IAC3D,SAAS,CAAC,QAAQ,CAAC,UAAU,YAAY;IACzC,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAY;IAC3C,SAAS,CAAC,QAAQ,CAAC,WAAW,uBAAuB;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAE/C,aAAa,EAAE,UAAU,CAAc;IAC9C,SAAgB,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAmB;IAExD,QAAQ,IAAI,IAAI;cAMN,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAQ/G,+FAA+F;cAC5E,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAa/D;;;;OAIG;cACgB,kBAAkB,IAAI,IAAI;IAmB7C,IAAW,MAAM,IAAI,MAAM,EAAE,CAAyC;IAC/D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAChD,IAAW,WAAW,IAAI,MAAM,CAA4D;IAE5F,yDAAyD;IACzD,IAAW,cAAc,IAAI,MAAM,CAMlC;IAEM,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;yCA3EhC,yBAAyB;2CAAzB,yBAAyB;CAkFrC;AAED,wGAAwG;AACxG,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"ps-models-resource.component.d.ts","sourceRoot":"","sources":["../../../src/PredictiveStudio/resources/ps-models-resource.component.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAmB,SAAS,EAA4D,MAAM,0BAA0B,CAAC;;AAIhI;;;;;;;GAOG;AACH,qBA2Ga,yBAA0B,SAAQ,cAAc;IAC3D,SAAS,CAAC,QAAQ,CAAC,UAAU,YAAY;IACzC,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAY;IAC3C,SAAS,CAAC,QAAQ,CAAC,WAAW,uBAAuB;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAE/C,aAAa,EAAE,UAAU,CAAc;IAC9C,SAAgB,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAmB;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,UAAS;IACvB,UAAU,SAAM;IAChB,cAAc,SAAM;IAElB,QAAQ,IAAI,IAAI;IASlB,SAAS,IAAI,IAAI;IAMjB,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI;IAQ7D,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,eAAe;cASE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9H,+FAA+F;cAC5E,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAa/D;;;;OAIG;cACgB,kBAAkB,IAAI,IAAI;IAmB7C,IAAW,MAAM,IAAI,MAAM,EAAE,CAAyC;IAC/D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAChD,IAAW,WAAW,IAAI,MAAM,CAA4D;IAE5F,yDAAyD;IACzD,IAAW,cAAc,IAAI,MAAM,CAMlC;IAEM,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;yCA/HhC,yBAAyB;2CAAzB,yBAAyB;CAsIrC;AAED,wGAAwG;AACxG,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}