@memberjunction/ng-dashboards 5.39.0 → 5.40.1

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 (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -6,6 +6,21 @@
6
6
  import { RunDetailRow } from './classify.types';
7
7
  /** Locale-formatted integer (e.g. 12345 → "12,345"). */
8
8
  export declare function formatNumber(n: number): string;
9
+ /**
10
+ * Derive a human-meaningful display name for a content item.
11
+ *
12
+ * Entity-sourced content items now carry a real per-record `Name` (the source
13
+ * entity's name field — e.g. "GPT-4"), so we prefer `Name` directly. Only when a
14
+ * Name is missing (or is a generic source-name placeholder) do we fall back to
15
+ * the first meaningful line of the LLM-generated `Description` to keep rows
16
+ * distinguishable, then to a placeholder.
17
+ *
18
+ * Pure/stateless — safe to call from any render site.
19
+ */
20
+ export declare function deriveDisplayName(item: {
21
+ Name?: string | null;
22
+ Description?: string | null;
23
+ }): string;
9
24
  /** Compact token count (e.g. 1500 → "2K", 2_400_000 → "2.4M"). */
10
25
  export declare function formatTokenCount(tokens: number): string;
11
26
  /** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → "42%"). */
@@ -1 +1 @@
1
- {"version":3,"file":"classify.format.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUhF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,CAyBtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
1
+ {"version":3,"file":"classify.format.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAYrG;AAgCD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUhF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,CAyBtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
@@ -2,6 +2,57 @@
2
2
  export function formatNumber(n) {
3
3
  return n.toLocaleString();
4
4
  }
5
+ /**
6
+ * Derive a human-meaningful display name for a content item.
7
+ *
8
+ * Entity-sourced content items now carry a real per-record `Name` (the source
9
+ * entity's name field — e.g. "GPT-4"), so we prefer `Name` directly. Only when a
10
+ * Name is missing (or is a generic source-name placeholder) do we fall back to
11
+ * the first meaningful line of the LLM-generated `Description` to keep rows
12
+ * distinguishable, then to a placeholder.
13
+ *
14
+ * Pure/stateless — safe to call from any render site.
15
+ */
16
+ export function deriveDisplayName(item) {
17
+ const name = item?.Name?.trim();
18
+ if (name) {
19
+ return name.length > DISPLAY_NAME_MAX_LEN
20
+ ? `${name.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`
21
+ : name;
22
+ }
23
+ const fromDescription = firstMeaningfulLine(item?.Description);
24
+ if (fromDescription)
25
+ return fromDescription;
26
+ return '(Untitled)';
27
+ }
28
+ /** Max length of a derived display name before it is truncated with an ellipsis. */
29
+ const DISPLAY_NAME_MAX_LEN = 80;
30
+ /**
31
+ * Returns the first non-empty, markdown-stripped line of a description, clamped
32
+ * to DISPLAY_NAME_MAX_LEN characters. Returns null when nothing meaningful remains.
33
+ */
34
+ function firstMeaningfulLine(description) {
35
+ if (!description)
36
+ return null;
37
+ for (const rawLine of description.split(/\r?\n/)) {
38
+ const cleaned = stripMarkdown(rawLine);
39
+ if (cleaned.length === 0)
40
+ continue;
41
+ return cleaned.length > DISPLAY_NAME_MAX_LEN
42
+ ? `${cleaned.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`
43
+ : cleaned;
44
+ }
45
+ return null;
46
+ }
47
+ /** Strip leading markdown markers (#, *, -, >, backticks) and collapse whitespace. */
48
+ function stripMarkdown(line) {
49
+ return line
50
+ .replace(/^[#>\s]*/g, '') // leading heading / blockquote markers + space
51
+ .replace(/^[-*+]\s+/, '') // leading bullet markers
52
+ .replace(/[`*_~]/g, '') // inline emphasis / code markers
53
+ .replace(/\s+/g, ' ') // collapse runs of whitespace
54
+ .trim();
55
+ }
5
56
  /** Compact token count (e.g. 1500 → "2K", 2_400_000 → "2.4M"). */
6
57
  export function formatTokenCount(tokens) {
7
58
  if (tokens >= 1000000)
@@ -1 +1 @@
1
- {"version":3,"file":"classify.format.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure formatting/mapping helpers for the Classify (autotagging) sub-app.\n * Extracted from the former monolith so host + tabs share one implementation (DRY).\n * All functions are stateless — no `this`, no DI — so they're safe to import anywhere.\n */\nimport { RunDetailRow } from './classify.types';\n\n/** Locale-formatted integer (e.g. 12345 → \"12,345\"). */\nexport function formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/** Compact token count (e.g. 1500 → \"2K\", 2_400_000 → \"2.4M\"). */\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n}\n\n/** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → \"42%\"). */\nexport function formatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n}\n\n/** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */\nexport function tagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n}\n\n/** Short date (e.g. \"Mar 5\"). Returns '' on parse failure. */\nexport function formatShortDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\n/** Date + time (e.g. \"Mar 5, 2:05 PM\"). Echoes the input on parse failure. */\nexport function formatDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n}\n\n/** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */\nexport function computeDuration(start: string | null, end: string | null): string {\n if (!start) return '—';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/** Normalize a raw run status to one of the canonical display labels. */\nexport function displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n}\n\n/** Font Awesome icon class for a content source type name. */\nexport function getSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n}\n\n/** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */\nexport function mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n}\n\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n"]}
1
+ {"version":3,"file":"classify.format.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure formatting/mapping helpers for the Classify (autotagging) sub-app.\n * Extracted from the former monolith so host + tabs share one implementation (DRY).\n * All functions are stateless — no `this`, no DI — so they're safe to import anywhere.\n */\nimport { RunDetailRow } from './classify.types';\n\n/** Locale-formatted integer (e.g. 12345 → \"12,345\"). */\nexport function formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/**\n * Derive a human-meaningful display name for a content item.\n *\n * Entity-sourced content items now carry a real per-record `Name` (the source\n * entity's name field — e.g. \"GPT-4\"), so we prefer `Name` directly. Only when a\n * Name is missing (or is a generic source-name placeholder) do we fall back to\n * the first meaningful line of the LLM-generated `Description` to keep rows\n * distinguishable, then to a placeholder.\n *\n * Pure/stateless — safe to call from any render site.\n */\nexport function deriveDisplayName(item: { Name?: string | null; Description?: string | null }): string {\n const name = item?.Name?.trim();\n if (name) {\n return name.length > DISPLAY_NAME_MAX_LEN\n ? `${name.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : name;\n }\n\n const fromDescription = firstMeaningfulLine(item?.Description);\n if (fromDescription) return fromDescription;\n\n return '(Untitled)';\n}\n\n/** Max length of a derived display name before it is truncated with an ellipsis. */\nconst DISPLAY_NAME_MAX_LEN = 80;\n\n/**\n * Returns the first non-empty, markdown-stripped line of a description, clamped\n * to DISPLAY_NAME_MAX_LEN characters. Returns null when nothing meaningful remains.\n */\nfunction firstMeaningfulLine(description: string | null | undefined): string | null {\n if (!description) return null;\n\n for (const rawLine of description.split(/\\r?\\n/)) {\n const cleaned = stripMarkdown(rawLine);\n if (cleaned.length === 0) continue;\n return cleaned.length > DISPLAY_NAME_MAX_LEN\n ? `${cleaned.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : cleaned;\n }\n return null;\n}\n\n/** Strip leading markdown markers (#, *, -, >, backticks) and collapse whitespace. */\nfunction stripMarkdown(line: string): string {\n return line\n .replace(/^[#>\\s]*/g, '') // leading heading / blockquote markers + space\n .replace(/^[-*+]\\s+/, '') // leading bullet markers\n .replace(/[`*_~]/g, '') // inline emphasis / code markers\n .replace(/\\s+/g, ' ') // collapse runs of whitespace\n .trim();\n}\n\n/** Compact token count (e.g. 1500 → \"2K\", 2_400_000 → \"2.4M\"). */\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n}\n\n/** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → \"42%\"). */\nexport function formatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n}\n\n/** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */\nexport function tagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n}\n\n/** Short date (e.g. \"Mar 5\"). Returns '' on parse failure. */\nexport function formatShortDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\n/** Date + time (e.g. \"Mar 5, 2:05 PM\"). Echoes the input on parse failure. */\nexport function formatDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n}\n\n/** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */\nexport function computeDuration(start: string | null, end: string | null): string {\n if (!start) return '—';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/** Normalize a raw run status to one of the canonical display labels. */\nexport function displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n}\n\n/** Font Awesome icon class for a content source type name. */\nexport function getSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n}\n\n/** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */\nexport function mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n}\n\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n"]}
@@ -257,6 +257,49 @@ export interface SourceDetailInfo {
257
257
  ContentItems: ContentItemDetail[];
258
258
  RunHistory: RunHistoryRow[];
259
259
  }
260
+ /**
261
+ * A single content-item row shown in {@link ClassifyItemGridComponent}. Built from
262
+ * a narrow `ResultType:'simple'` projection of `MJ: Content Items` — no BaseEntity.
263
+ */
264
+ export interface ClassifyItemGridRow {
265
+ ID: string;
266
+ DisplayName: string;
267
+ SourceName: string;
268
+ TagCount: number;
269
+ EmbeddingStatus: string;
270
+ TaggingStatus: string;
271
+ UpdatedAt: string;
272
+ /** Raw ISO timestamp used for sorting (the grid renders UpdatedAt formatted). */
273
+ UpdatedAtRaw: string;
274
+ }
275
+ /**
276
+ * A single tag on a content item, enriched with the LLM provenance fields
277
+ * (Reasoning + AIPromptRunID) surfaced in {@link ClassifyItemDrilldownComponent}.
278
+ */
279
+ export interface ClassifyDrilldownTag {
280
+ Tag: string;
281
+ Weight: number;
282
+ /** The LLM's justification for this tag, when captured at extraction time. */
283
+ Reasoning: string | null;
284
+ /** FK to the AI Prompt Run that produced this tag (provenance link). */
285
+ AIPromptRunID: string | null;
286
+ CreatedAt: string;
287
+ }
288
+ /** A single provenance fact shown in the drilldown's Provenance section. */
289
+ export interface ClassifyProvenanceFact {
290
+ Label: string;
291
+ Value: string;
292
+ Icon: string;
293
+ /** Optional record reference the user can open (entity + id). */
294
+ RecordEntity?: string;
295
+ RecordID?: string;
296
+ }
297
+ /** A single audit-trail entry shown in the drilldown's Audit section. */
298
+ export interface ClassifyAuditEntry {
299
+ Label: string;
300
+ Timestamp: string;
301
+ Icon: string;
302
+ }
260
303
  export type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';
261
304
  /** Per-disposition tally for the dry-run summary line. */
262
305
  export interface DryRunDispositionCount {
@@ -1 +1 @@
1
- {"version":3,"file":"classify.types.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classify.types.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"classify.types.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.\n * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.\n */\n\n// ── Tab type ──\n\nexport type TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'inbox' | 'health' | 'history';\n\n// ── Interfaces ──\n\nexport interface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\nexport interface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\nexport interface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\nexport interface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\nexport interface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\nexport interface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\nexport interface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\nexport interface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\nexport interface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\nexport interface TagBySource {\n SourceName: string;\n Count: number;\n}\n\nexport interface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\nexport interface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\nexport interface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\nexport interface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\nexport type TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\nexport interface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\nexport interface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\nexport interface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\nexport interface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\nexport type TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\nexport interface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\nexport interface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\nexport interface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\nexport type ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\nexport interface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\nexport interface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Slide-in form mode ──\n\nexport type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\n\n// ── Dry-run preview ──\n\n/** Per-disposition tally for the dry-run summary line. */\nexport interface DryRunDispositionCount {\n AutoApply: number;\n RouteToInbox: number;\n CreateNew: number;\n Reject: number;\n}\n\n/** Illustrative token/cost estimate shown on the dry-run preview banner. */\nexport interface DryRunEstimate {\n ItemsSampled: number;\n /** Rough total token estimate (clearly marked illustrative in the UI). */\n EstimatedTokens: number;\n /** Rough dollar cost estimate derived from EstimatedTokens. */\n EstimatedCost: number;\n}\n"]}
1
+ {"version":3,"file":"classify.types.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.\n * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.\n */\n\n// ── Tab type ──\n\nexport type TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'inbox' | 'health' | 'history';\n\n// ── Interfaces ──\n\nexport interface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\nexport interface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\nexport interface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\nexport interface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\nexport interface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\nexport interface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\nexport interface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\nexport interface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\nexport interface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\nexport interface TagBySource {\n SourceName: string;\n Count: number;\n}\n\nexport interface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\nexport interface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\nexport interface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\nexport interface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\nexport type TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\nexport interface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\nexport interface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\nexport interface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\nexport interface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\nexport type TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\nexport interface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\nexport interface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\nexport interface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\nexport type ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\nexport interface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\nexport interface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Phase 4: Audit / Analytics ──\n\n/**\n * A single content-item row shown in {@link ClassifyItemGridComponent}. Built from\n * a narrow `ResultType:'simple'` projection of `MJ: Content Items` — no BaseEntity.\n */\nexport interface ClassifyItemGridRow {\n ID: string;\n DisplayName: string;\n SourceName: string;\n TagCount: number;\n EmbeddingStatus: string;\n TaggingStatus: string;\n UpdatedAt: string;\n /** Raw ISO timestamp used for sorting (the grid renders UpdatedAt formatted). */\n UpdatedAtRaw: string;\n}\n\n/**\n * A single tag on a content item, enriched with the LLM provenance fields\n * (Reasoning + AIPromptRunID) surfaced in {@link ClassifyItemDrilldownComponent}.\n */\nexport interface ClassifyDrilldownTag {\n Tag: string;\n Weight: number;\n /** The LLM's justification for this tag, when captured at extraction time. */\n Reasoning: string | null;\n /** FK to the AI Prompt Run that produced this tag (provenance link). */\n AIPromptRunID: string | null;\n CreatedAt: string;\n}\n\n/** A single provenance fact shown in the drilldown's Provenance section. */\nexport interface ClassifyProvenanceFact {\n Label: string;\n Value: string;\n Icon: string;\n /** Optional record reference the user can open (entity + id). */\n RecordEntity?: string;\n RecordID?: string;\n}\n\n/** A single audit-trail entry shown in the drilldown's Audit section. */\nexport interface ClassifyAuditEntry {\n Label: string;\n Timestamp: string;\n Icon: string;\n}\n\n// ── Slide-in form mode ──\n\nexport type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\n\n// ── Dry-run preview ──\n\n/** Per-disposition tally for the dry-run summary line. */\nexport interface DryRunDispositionCount {\n AutoApply: number;\n RouteToInbox: number;\n CreateNew: number;\n Reject: number;\n}\n\n/** Illustrative token/cost estimate shown on the dry-run preview banner. */\nexport interface DryRunEstimate {\n ItemsSampled: number;\n /** Rough total token estimate (clearly marked illustrative in the UI). */\n EstimatedTokens: number;\n /** Rough dollar cost estimate derived from EstimatedTokens. */\n EstimatedCost: number;\n}\n"]}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * @fileoverview Classify · Run History tab.
3
+ *
4
+ * Self-contained sub-page: owns its header-interior, the run table, filters,
5
+ * and the per-run detail panel. Receives the shared raw run list from the host
6
+ * via `[Runs]` (the host is the data orchestrator); loads per-run detail rows
7
+ * on demand itself. Cross-tab navigation (none today) would bubble via @Output.
8
+ */
9
+ import { EventEmitter } from '@angular/core';
1
10
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
11
  import { FilterFieldConfig } from '@memberjunction/ng-ui-components';
3
12
  import { RunHistoryRow, RunDetailRow } from '../shared/classify.types';
@@ -9,6 +18,29 @@ export declare class ClassifyHistoryTabComponent extends BaseAngularComponent {
9
18
  private _runs;
10
19
  set Runs(value: Record<string, unknown>[]);
11
20
  get Runs(): Record<string, unknown>[];
21
+ /** Total run count in the DB (from TotalRowCount) — drives the "Showing X of Y" line. */
22
+ TotalRunCount: number;
23
+ /** True while the host is fetching the next page in response to LoadMoreRequested. */
24
+ IsLoadingMore: boolean;
25
+ /** Bubble a "load more" request to the host, which widens the loaded window. */
26
+ LoadMoreRequested: EventEmitter<void>;
27
+ /**
28
+ * Bubble a content-item selection (from the per-run item grid) up to the host,
29
+ * which owns NavigationService + the drilldown slide-in.
30
+ */
31
+ ItemSelected: EventEmitter<string>;
32
+ onItemSelected(itemID: string): void;
33
+ /** Whether more runs exist in the DB than are currently loaded. */
34
+ get HasMoreRuns(): boolean;
35
+ onLoadMore(): void;
36
+ /** Shown while the host reloads the run list in response to RefreshRequested. */
37
+ IsLoading: boolean;
38
+ /**
39
+ * Bubble a refresh request up to the host, which owns the run-history data
40
+ * (`MJ: Content Process Runs`). The host reloads and re-binds `[Runs]`, whose
41
+ * setter rebuilds the rows; the host also clears IsLoading via [Loading].
42
+ */
43
+ RefreshRequested: EventEmitter<void>;
12
44
  RunHistoryRows: RunHistoryRow[];
13
45
  FilteredRunRows: RunHistoryRow[];
14
46
  HistorySourceFilter: string;
@@ -18,6 +50,11 @@ export declare class ClassifyHistoryTabComponent extends BaseAngularComponent {
18
50
  RunDetailRows: RunDetailRow[];
19
51
  IsLoadingRunDetail: boolean;
20
52
  readonly FormatTokenCount: typeof formatTokenCount;
53
+ /**
54
+ * Ask the host to reload the run history. Data is host-owned, so we surface a
55
+ * loading state and emit; the new `[Runs]` binding clears IsLoading.
56
+ */
57
+ Refresh(): void;
21
58
  private buildRunHistoryRows;
22
59
  private buildHistorySourceOptions;
23
60
  FilterRunHistory(): void;
@@ -35,6 +72,6 @@ export declare class ClassifyHistoryTabComponent extends BaseAngularComponent {
35
72
  CloseRunDetail(): void;
36
73
  private loadRunDetailRows;
37
74
  static ɵfac: i0.ɵɵFactoryDeclaration<ClassifyHistoryTabComponent, never>;
38
- static ɵcmp: i0.ɵɵComponentDeclaration<ClassifyHistoryTabComponent, "classify-history-tab", never, { "Runs": { "alias": "Runs"; "required": false; }; }, {}, never, never, false, never>;
75
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClassifyHistoryTabComponent, "classify-history-tab", never, { "Runs": { "alias": "Runs"; "required": false; }; "TotalRunCount": { "alias": "TotalRunCount"; "required": false; }; "IsLoadingMore": { "alias": "IsLoadingMore"; "required": false; }; }, { "LoadMoreRequested": "LoadMoreRequested"; "ItemSelected": "ItemSelected"; "RefreshRequested": "RefreshRequested"; }, never, never, false, never>;
39
76
  }
40
77
  //# sourceMappingURL=history-tab.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-tab.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/tabs/history-tab.component.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAA4D,gBAAgB,EAAuB,MAAM,2BAA2B,CAAC;;AAE5I,qBAMa,2BAA4B,SAAQ,oBAAoB;IACjE,OAAO,CAAC,GAAG,CAA6B;IAExC,qFAAqF;IACrF,OAAO,CAAC,KAAK,CAAiC;IAC9C,IACI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAKxC;IACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAEpC;IAEM,cAAc,EAAE,aAAa,EAAE,CAAM;IACrC,eAAe,EAAE,aAAa,EAAE,CAAM;IACtC,mBAAmB,SAAM;IACzB,mBAAmB,SAAM;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAM;IAGpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,kBAAkB,UAAS;IAGlC,SAAgB,gBAAgB,0BAAoB;IAEpD,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,yBAAyB;IAS1B,gBAAgB,IAAI,IAAI;IAS/B;;;OAGG;IACH,IAAW,mBAAmB,IAAI,iBAAiB,EAAE,CA0BpD;IAED,IAAW,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExD;IAED,IAAW,wBAAwB,IAAI,MAAM,CAE5C;IAEM,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM5D,oBAAoB,IAAI,IAAI;IAMnC,6FAA6F;IAChF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjD,cAAc,IAAI,IAAI;YAOf,iBAAiB;yCAxJtB,2BAA2B;2CAA3B,2BAA2B;CAoKvC"}
1
+ {"version":3,"file":"history-tab.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/tabs/history-tab.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAgC,YAAY,EAAyB,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAA4D,gBAAgB,EAAuB,MAAM,2BAA2B,CAAC;;AAE5I,qBAMa,2BAA4B,SAAQ,oBAAoB;IACjE,OAAO,CAAC,GAAG,CAA6B;IAExC,qFAAqF;IACrF,OAAO,CAAC,KAAK,CAAiC;IAC9C,IACI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAQxC;IACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAEpC;IAED,yFAAyF;IAChF,aAAa,SAAK;IAE3B,sFAAsF;IAC7E,aAAa,UAAS;IAE/B,gFAAgF;IACtE,iBAAiB,qBAA4B;IAEvD;;;OAGG;IACO,YAAY,uBAA8B;IAE7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI3C,mEAAmE;IACnE,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEM,UAAU,IAAI,IAAI;IAIzB,iFAAiF;IAC1E,SAAS,UAAS;IAEzB;;;;OAIG;IACO,gBAAgB,qBAA4B;IAE/C,cAAc,EAAE,aAAa,EAAE,CAAM;IACrC,eAAe,EAAE,aAAa,EAAE,CAAM;IACtC,mBAAmB,SAAM;IACzB,mBAAmB,SAAM;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAM;IAGpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpC,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,kBAAkB,UAAS;IAGlC,SAAgB,gBAAgB,0BAAoB;IAEpD;;;OAGG;IACI,OAAO,IAAI,IAAI;IAMtB,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,yBAAyB;IAS1B,gBAAgB,IAAI,IAAI;IAS/B;;;OAGG;IACH,IAAW,mBAAmB,IAAI,iBAAiB,EAAE,CA0BpD;IAED,IAAW,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAExD;IAED,IAAW,wBAAwB,IAAI,MAAM,CAE5C;IAEM,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM5D,oBAAoB,IAAI,IAAI;IAMnC,6FAA6F;IAChF,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjD,cAAc,IAAI,IAAI;YAOf,iBAAiB;yCA3MtB,2BAA2B;2CAA3B,2BAA2B;CAuNvC"}