@memberjunction/ng-dashboards 5.37.0 → 5.39.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 (328) hide show
  1. package/README.md +46 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
  148. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
  150. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  151. package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
  152. package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
  153. package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
  154. package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
  155. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
  156. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
  158. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
  160. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
  161. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
  162. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
  163. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
  164. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
  165. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
  166. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
  167. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
  168. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
  169. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
  170. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
  171. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
  172. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
  173. package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
  174. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
  175. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
  176. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  177. package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
  178. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  179. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
  180. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  181. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
  182. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  183. package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
  184. package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
  185. package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
  186. package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
  187. package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
  188. package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
  189. package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
  190. package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
  191. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
  192. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  193. package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
  194. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  195. package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
  196. package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
  197. package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
  198. package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
  199. package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
  200. package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
  201. package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
  202. package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
  203. package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
  204. package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
  205. package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
  206. package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
  207. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
  208. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
  209. package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
  210. package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
  211. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  212. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  213. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  214. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  215. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  216. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  217. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  218. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  219. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  220. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  221. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  222. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  223. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  224. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  225. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  226. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  227. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  228. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  229. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  230. package/dist/DevTools/app-state-inspector.component.js +18 -17
  231. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  232. package/dist/DevTools/class-registry.component.js +88 -85
  233. package/dist/DevTools/class-registry.component.js.map +1 -1
  234. package/dist/DevTools/event-monitor.component.js +155 -150
  235. package/dist/DevTools/event-monitor.component.js.map +1 -1
  236. package/dist/DevTools/graphql-console.component.js +245 -243
  237. package/dist/DevTools/graphql-console.component.js.map +1 -1
  238. package/dist/DevTools/layout-inspector.component.js +18 -17
  239. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  240. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  241. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  242. package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
  243. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
  244. package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
  245. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
  246. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
  247. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
  248. package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
  249. package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
  250. package/dist/Home/home-application.d.ts +21 -1
  251. package/dist/Home/home-application.d.ts.map +1 -1
  252. package/dist/Home/home-application.js +60 -8
  253. package/dist/Home/home-application.js.map +1 -1
  254. package/dist/Home/home-dashboard.component.js +2 -2
  255. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  256. package/dist/Integration/components/activity/activity.component.js +236 -229
  257. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  258. package/dist/Integration/components/connections/connections.component.js +390 -389
  259. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  260. package/dist/Integration/components/overview/overview.component.js +2 -2
  261. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  262. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  263. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  264. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  265. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  266. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  267. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  268. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  269. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  270. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  271. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  272. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  273. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  274. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  275. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  276. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  277. package/dist/MCP/mcp-dashboard.component.js +443 -438
  278. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  279. package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
  280. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  281. package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
  282. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  283. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  284. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  285. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  286. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  287. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  288. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  289. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  290. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  291. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  292. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  293. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  294. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  295. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  296. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  297. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  298. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-explorer.component.js +436 -427
  300. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  301. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  302. package/dist/Testing/components/testing-runs.component.js +116 -115
  303. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  304. package/dist/Testing/testing-dashboard.component.js +6 -7
  305. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  306. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  307. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  308. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  309. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  310. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  311. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  312. package/dist/ai-dashboards.module.d.ts +47 -35
  313. package/dist/ai-dashboards.module.d.ts.map +1 -1
  314. package/dist/ai-dashboards.module.js +40 -1
  315. package/dist/ai-dashboards.module.js.map +1 -1
  316. package/dist/communication-dashboards.module.d.ts +1 -1
  317. package/dist/communication-dashboards.module.d.ts.map +1 -1
  318. package/dist/communication-dashboards.module.js +7 -1
  319. package/dist/communication-dashboards.module.js.map +1 -1
  320. package/dist/component-studio-dashboards.module.d.ts +34 -22
  321. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  322. package/dist/component-studio-dashboards.module.js +65 -9
  323. package/dist/component-studio-dashboards.module.js.map +1 -1
  324. package/dist/testing-dashboards.module.d.ts +4 -5
  325. package/dist/testing-dashboards.module.d.ts.map +1 -1
  326. package/dist/testing-dashboards.module.js +7 -5
  327. package/dist/testing-dashboards.module.js.map +1 -1
  328. package/package.json +55 -53
@@ -0,0 +1,209 @@
1
+ /** Locale-formatted integer (e.g. 12345 → "12,345"). */
2
+ export function formatNumber(n) {
3
+ return n.toLocaleString();
4
+ }
5
+ /** Compact token count (e.g. 1500 → "2K", 2_400_000 → "2.4M"). */
6
+ export function formatTokenCount(tokens) {
7
+ if (tokens >= 1000000)
8
+ return `${(tokens / 1000000).toFixed(1)}M`;
9
+ if (tokens >= 1000)
10
+ return `${(tokens / 1000).toFixed(0)}K`;
11
+ return String(tokens);
12
+ }
13
+ /** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → "42%"). */
14
+ export function formatWeight(weight) {
15
+ return `${Math.round(weight * 100)}%`;
16
+ }
17
+ /** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */
18
+ export function tagFontSize(weight) {
19
+ const min = 0.7;
20
+ const max = 1.0;
21
+ return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;
22
+ }
23
+ /** Short date (e.g. "Mar 5"). Returns '' on parse failure. */
24
+ export function formatShortDate(dateStr) {
25
+ try {
26
+ return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
27
+ }
28
+ catch {
29
+ return '';
30
+ }
31
+ }
32
+ /** Date + time (e.g. "Mar 5, 2:05 PM"). Echoes the input on parse failure. */
33
+ export function formatDate(dateStr) {
34
+ try {
35
+ return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });
36
+ }
37
+ catch {
38
+ return dateStr;
39
+ }
40
+ }
41
+ /** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */
42
+ export function computeDuration(start, end) {
43
+ if (!start)
44
+ return '—';
45
+ const s = new Date(start);
46
+ const e = end ? new Date(end) : new Date();
47
+ const ms = e.getTime() - s.getTime();
48
+ if (ms < 1000)
49
+ return `${ms}ms`;
50
+ if (ms < 60000)
51
+ return `${Math.round(ms / 1000)}s`;
52
+ const mins = Math.floor(ms / 60000);
53
+ const secs = Math.round((ms % 60000) / 1000);
54
+ return `${mins}m ${secs}s`;
55
+ }
56
+ /** Normalize a raw run status to one of the canonical display labels. */
57
+ export function displayStatus(status) {
58
+ const lower = status.toLowerCase();
59
+ if (lower === 'complete' || lower === 'completed' || lower === 'done')
60
+ return 'Complete';
61
+ if (lower === 'error' || lower === 'failed')
62
+ return 'Failed';
63
+ if (lower === 'running' || lower === 'processing')
64
+ return 'Running';
65
+ return status;
66
+ }
67
+ /** Font Awesome icon class for a content source type name. */
68
+ export function getSourceTypeIcon(typeName) {
69
+ const iconMap = {
70
+ 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',
71
+ 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',
72
+ 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',
73
+ 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',
74
+ 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'
75
+ };
76
+ return iconMap[typeName] ?? 'fa-solid fa-folder';
77
+ }
78
+ /** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */
79
+ export function mapRunDetailRecords(records) {
80
+ return records.map(d => {
81
+ const status = String(d['Status'] || 'Pending');
82
+ const statusLower = status.toLowerCase();
83
+ const isFailed = statusLower === 'failed' || statusLower === 'error';
84
+ const isRunning = statusLower === 'running' || statusLower === 'processing';
85
+ const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;
86
+ const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;
87
+ const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;
88
+ const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;
89
+ return {
90
+ SourceName: String(d['ContentSource'] || 'Unknown'),
91
+ SourceType: String(d['ContentSourceType'] || ''),
92
+ Status: displayStatus(status),
93
+ StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',
94
+ ItemsProcessed: Number(d['ItemsProcessed'] || 0),
95
+ ItemsTagged: Number(d['ItemsTagged'] || 0),
96
+ ItemsVectorized: Number(d['ItemsVectorized'] || 0),
97
+ ErrorCount: Number(d['ErrorCount'] || 0),
98
+ TotalTokens: Number(d['TotalTokensUsed'] || 0),
99
+ TotalCost: Number(d['TotalCost'] || 0),
100
+ Duration: durationStr,
101
+ };
102
+ });
103
+ }
104
+ // ================================================================
105
+ // Cron-to-Human-Readable Utility
106
+ // ================================================================
107
+ /**
108
+ * Converts a 5-part or 6-part cron expression to a human-readable English string.
109
+ *
110
+ * Handles common patterns:
111
+ * `0 * * * *` -> "Every hour"
112
+ * `0 2 * * *` -> "Daily at 2:00 AM"
113
+ * `0 2 * * 1` -> "Weekly on Monday at 2:00 AM"
114
+ * `star/15 * * * *` -> "Every 15 minutes" (where star = asterisk)
115
+ * `0 0 1 * *` -> "Monthly on day 1 at 12:00 AM"
116
+ *
117
+ * Falls back to returning the raw cron string for unrecognized patterns.
118
+ *
119
+ * @param cron A cron expression string (5 or 6 parts)
120
+ * @returns A human-readable description or the raw cron if unrecognized
121
+ */
122
+ export function CronToHumanReadable(cron) {
123
+ if (!cron)
124
+ return 'No schedule';
125
+ const parts = cron.trim().split(/\s+/);
126
+ const p = parseCronParts(parts);
127
+ if (!p)
128
+ return cron;
129
+ return formatCronParts(p) ?? cron;
130
+ }
131
+ /**
132
+ * Parses 5-part or 6-part cron expressions into normalized fields.
133
+ * 6-part expressions have a leading seconds field that is discarded.
134
+ */
135
+ function parseCronParts(parts) {
136
+ if (parts.length === 5) {
137
+ return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };
138
+ }
139
+ if (parts.length === 6) {
140
+ return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };
141
+ }
142
+ return null;
143
+ }
144
+ /**
145
+ * Attempts to map parsed cron fields to a human-readable string.
146
+ * Returns null when the pattern is not recognized.
147
+ */
148
+ function formatCronParts(p) {
149
+ // Every N minutes: */N * * * *
150
+ if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {
151
+ const interval = parseInt(p.Minute.slice(2), 10);
152
+ if (interval === 1)
153
+ return 'Every minute';
154
+ return `Every ${interval} minutes`;
155
+ }
156
+ // Every hour at minute M: M * * * *
157
+ if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {
158
+ return 'Every hour';
159
+ }
160
+ // Every N hours: 0 */N * * *
161
+ if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {
162
+ const interval = parseInt(p.Hour.slice(2), 10);
163
+ if (interval === 1)
164
+ return 'Every hour';
165
+ return `Every ${interval} hours`;
166
+ }
167
+ // Specific hour + minute with wildcard or specific day fields
168
+ if (!p.Minute.includes('*') && !p.Minute.includes('/') &&
169
+ !p.Hour.includes('*') && !p.Hour.includes('/') &&
170
+ p.Month === '*') {
171
+ const hour = parseInt(p.Hour, 10);
172
+ const minute = parseInt(p.Minute, 10);
173
+ const timeStr = formatTimeOfDay(hour, minute);
174
+ // Weekly: specific day of week
175
+ if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {
176
+ const dayName = dayOfWeekToName(p.DayOfWeek);
177
+ return `Weekly on ${dayName} at ${timeStr}`;
178
+ }
179
+ // Monthly: specific day of month
180
+ if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {
181
+ return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;
182
+ }
183
+ // Daily
184
+ if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {
185
+ return `Daily at ${timeStr}`;
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ /** Formats hour and minute to 12-hour AM/PM time string */
191
+ function formatTimeOfDay(hour, minute) {
192
+ const ampm = hour >= 12 ? 'PM' : 'AM';
193
+ const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
194
+ const m = minute.toString().padStart(2, '0');
195
+ return `${h}:${m} ${ampm}`;
196
+ }
197
+ /** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */
198
+ function dayOfWeekToName(dow) {
199
+ const names = {
200
+ '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',
201
+ '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',
202
+ '6': 'Saturday', '7': 'Sunday',
203
+ 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',
204
+ 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',
205
+ 'SAT': 'Saturday',
206
+ };
207
+ return names[dow.toUpperCase()] ?? dow;
208
+ }
209
+ //# sourceMappingURL=classify.format.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.
3
+ * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.
4
+ */
5
+ export type TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'inbox' | 'health' | 'history';
6
+ export interface NavItem {
7
+ Tab: TabName;
8
+ Icon: string;
9
+ Label: string;
10
+ BadgeText: string;
11
+ BadgeClass: string;
12
+ }
13
+ export interface KPIMetric {
14
+ Label: string;
15
+ Value: number;
16
+ Icon: string;
17
+ Trend: string;
18
+ TrendUp: boolean;
19
+ }
20
+ export interface PipelineStageInfo {
21
+ Name: string;
22
+ Icon: string;
23
+ Status: 'idle' | 'active' | 'complete';
24
+ Count: string;
25
+ }
26
+ export interface FeedItem {
27
+ Name: string;
28
+ SourceName: string;
29
+ Tags: string[];
30
+ TimeAgo: string;
31
+ Status: 'complete' | 'processing' | 'error';
32
+ }
33
+ export interface SourceMini {
34
+ ID: string;
35
+ Name: string;
36
+ Icon: string;
37
+ Meta: string;
38
+ StatusClass: 'active' | 'error' | 'inactive';
39
+ }
40
+ export interface SourceCard {
41
+ ID: string;
42
+ Name: string;
43
+ SourceTypeName: string;
44
+ ContentTypeName: string;
45
+ FileTypeName: string;
46
+ Icon: string;
47
+ StatusClass: 'active' | 'error' | 'inactive';
48
+ StatusLabel: string;
49
+ URL: string;
50
+ ItemCount: number;
51
+ TagCount: number;
52
+ AvgTags: string;
53
+ LastRunAgo: string;
54
+ ContentSourceTypeID: string;
55
+ ContentTypeID: string;
56
+ ContentFileTypeID: string;
57
+ EmbeddingModelID: string;
58
+ VectorIndexID: string;
59
+ EntityID: string;
60
+ EntityDocumentID: string;
61
+ RequiresFileType: boolean;
62
+ /** FK to ScheduledAction entity, null if no schedule configured */
63
+ ScheduledActionID: string | null;
64
+ /** Denormalized name of the linked ScheduledAction */
65
+ ScheduledActionName: string | null;
66
+ /** Human-readable schedule description (parsed from cron) */
67
+ ScheduleDescription: string | null;
68
+ }
69
+ export interface ContentTypeCard {
70
+ ID: string;
71
+ Name: string;
72
+ Description: string;
73
+ AIModelName: string;
74
+ AIModelID: string;
75
+ MinTags: number;
76
+ MaxTags: number;
77
+ SourcesUsing: number;
78
+ ItemsTagged: number;
79
+ RangeLeftPct: number;
80
+ RangeRightPct: number;
81
+ EmbeddingModelID: string;
82
+ VectorIndexID: string;
83
+ }
84
+ export interface TagRow {
85
+ Tag: string;
86
+ UsageCount: number;
87
+ AvgWeight: number;
88
+ BarWidthPct: number;
89
+ TopSource: string;
90
+ FirstSeen: string;
91
+ }
92
+ export interface TagCloudItem {
93
+ Tag: string;
94
+ AvgWeight: number;
95
+ SizeClass: 'large' | '' | 'small';
96
+ }
97
+ export interface TagBySource {
98
+ SourceName: string;
99
+ Count: number;
100
+ }
101
+ export interface RunHistoryRow {
102
+ ID: string;
103
+ Status: string;
104
+ StatusClass: string;
105
+ SourceName: string;
106
+ StartedDisplay: string;
107
+ Duration: string;
108
+ Items: string;
109
+ Tags: string;
110
+ Errors: string;
111
+ ErrorClass: string;
112
+ }
113
+ export interface DropdownOption {
114
+ ID: string;
115
+ Name: string;
116
+ }
117
+ /** G3: Content item duplicate pair for review */
118
+ export interface ContentDuplicateRow {
119
+ ID: string;
120
+ ItemAName: string;
121
+ ItemASource: string;
122
+ ItemBName: string;
123
+ ItemBSource: string;
124
+ SimilarityScore: number;
125
+ DetectionMethod: string;
126
+ Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';
127
+ }
128
+ /** D2/D3/D8: Per-source detail row for a specific pipeline run */
129
+ export interface RunDetailRow {
130
+ SourceName: string;
131
+ SourceType: string;
132
+ Status: string;
133
+ StatusClass: string;
134
+ ItemsProcessed: number;
135
+ ItemsTagged: number;
136
+ ItemsVectorized: number;
137
+ ErrorCount: number;
138
+ TotalTokens: number;
139
+ TotalCost: number;
140
+ Duration: string;
141
+ }
142
+ export type TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';
143
+ export interface TaxTreeNode {
144
+ ID: string;
145
+ Name: string;
146
+ DisplayName: string;
147
+ Description: string;
148
+ ParentID: string | null;
149
+ Depth: number;
150
+ Children: TaxTreeNode[];
151
+ ItemCount: number;
152
+ AvgWeight: number;
153
+ HealthColor: 'green' | 'yellow' | 'red';
154
+ IsExpanded: boolean;
155
+ IsSelected: boolean;
156
+ FirstSeen: string;
157
+ }
158
+ export interface TaxDuplicatePair {
159
+ TagA: string;
160
+ TagB: string;
161
+ TagAID: string;
162
+ TagBID: string;
163
+ Similarity: number;
164
+ SeverityClass: 'high' | 'moderate';
165
+ /** True when multiple Tag records share the same name (case-insensitive) */
166
+ IsExactDuplicate: boolean;
167
+ /** How many Tag records share this exact name (only set when IsExactDuplicate) */
168
+ ExactDuplicateCount: number;
169
+ /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */
170
+ AllIDs: string[];
171
+ }
172
+ export interface TaxOrphanCard {
173
+ ID: string;
174
+ Name: string;
175
+ UsageCount: number;
176
+ AvgWeight: number;
177
+ FirstSeen: string;
178
+ LastSeen: string;
179
+ IsSelected: boolean;
180
+ }
181
+ export interface TaxTreemapCell {
182
+ ID: string;
183
+ Name: string;
184
+ ItemCount: number;
185
+ ColorClass: string;
186
+ RowSpan: number;
187
+ }
188
+ /** Supported audit action types — matches DB Action values (lowercased) */
189
+ export type TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';
190
+ export interface TaxAuditEvent {
191
+ Type: TaxAuditAction;
192
+ Description: string;
193
+ TagRef: string;
194
+ User: string;
195
+ Timestamp: string;
196
+ DayHeader: string;
197
+ }
198
+ export interface TaxHealthStat {
199
+ Total: number;
200
+ Healthy: number;
201
+ NeedAttention: number;
202
+ Orphaned: number;
203
+ Duplicates: number;
204
+ }
205
+ export interface WeightedTag {
206
+ Tag: string;
207
+ Weight: number;
208
+ }
209
+ /** Status value for embedding or tagging pipeline phases */
210
+ export type ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';
211
+ export interface ContentItemDetail {
212
+ ID: string;
213
+ Name: string;
214
+ SourceName: string;
215
+ SourceTypeName: string;
216
+ ContentTypeName: string;
217
+ FileTypeName: string;
218
+ URL: string;
219
+ TextContent: string;
220
+ Checksum: string;
221
+ Tags: WeightedTag[];
222
+ CreatedAt: string;
223
+ UpdatedAt: string;
224
+ ContentSourceID: string;
225
+ ContentSourceTypeID: string;
226
+ StatusDot: 'complete' | 'processing' | 'error';
227
+ TagCount: number;
228
+ /** Whether this source type uses content/file type (false for Entity sources) */
229
+ RequiresContentType: boolean;
230
+ /** Entity record ID if source is entity type (for direct entity navigation) */
231
+ EntityRecordID: string | null;
232
+ /** Entity name if source is entity type */
233
+ EntityName: string | null;
234
+ /** Embedding pipeline status for this content item */
235
+ EmbeddingStatus: ItemPipelineStatus;
236
+ /** Tagging pipeline status for this content item */
237
+ TaggingStatus: ItemPipelineStatus;
238
+ }
239
+ export interface SourceDetailInfo {
240
+ ID: string;
241
+ Name: string;
242
+ SourceTypeName: string;
243
+ FileTypeName: string;
244
+ ContentTypeName: string;
245
+ RequiresFileType: boolean;
246
+ StatusClass: 'active' | 'error' | 'inactive';
247
+ StatusLabel: string;
248
+ Icon: string;
249
+ URL: string;
250
+ EmbeddingModelName: string;
251
+ VectorIndexName: string;
252
+ ItemCount: number;
253
+ TagCount: number;
254
+ AvgTags: string;
255
+ LastRunAgo: string;
256
+ ErrorCount: number;
257
+ ContentItems: ContentItemDetail[];
258
+ RunHistory: RunHistoryRow[];
259
+ }
260
+ export type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';
261
+ /** Per-disposition tally for the dry-run summary line. */
262
+ export interface DryRunDispositionCount {
263
+ AutoApply: number;
264
+ RouteToInbox: number;
265
+ CreateNew: number;
266
+ Reject: number;
267
+ }
268
+ /** Illustrative token/cost estimate shown on the dry-run preview banner. */
269
+ export interface DryRunEstimate {
270
+ ItemsSampled: number;
271
+ /** Rough total token estimate (clearly marked illustrative in the UI). */
272
+ EstimatedTokens: number;
273
+ /** Rough dollar cost estimate derived from EstimatedTokens. */
274
+ EstimatedCost: number;
275
+ }
276
+ //# sourceMappingURL=classify.types.d.ts.map
@@ -0,0 +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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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.
3
+ * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=classify.types.js.map
@@ -0,0 +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"]}