@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,87 @@
1
+ /**
2
+ * @fileoverview Classify · Dry-run / disposition PREVIEW dialog.
3
+ *
4
+ * Honest, client-side, in-memory preview of how a source's EXISTING extracted
5
+ * ContentItemTags would be dispositioned under its current taxonomy mode +
6
+ * thresholds. This is NOT a fresh LLM run and NOTHING is persisted — it samples
7
+ * up to N existing tags, resolves each against the cached taxonomy
8
+ * (Tags / TagSynonyms) client-side, and replays the deterministic routing via the
9
+ * pure `previewDispositions` helper.
10
+ *
11
+ * It is hosted by the Sources tab (which already hosts its own dialogs): data
12
+ * DOWN via `[SourceCard]` / `[Show]`, intent UP via `(Closed)`. On open it loads
13
+ * the sample itself (read-only RunView, `ResultType: 'simple'`).
14
+ *
15
+ * NOTE: the server also has a semantic/embedding match tier not reproducible
16
+ * client-side, so borderline rows may resolve differently in a real run. The
17
+ * template states this explicitly.
18
+ */
19
+ import { EventEmitter } from '@angular/core';
20
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
21
+ import { SourceCard, DryRunDispositionCount, DryRunEstimate } from '../shared/classify.types';
22
+ import { DryRunConfig, DryRunRow, Disposition } from '../shared/classify.dryrun';
23
+ import * as i0 from "@angular/core";
24
+ export declare class ClassifyDryRunPreviewDialogComponent extends BaseAngularComponent {
25
+ private cdr;
26
+ /** Whether the dialog is visible. */
27
+ private _show;
28
+ set Show(value: boolean);
29
+ get Show(): boolean;
30
+ /** The source being previewed; supplied by the Sources tab when opening. */
31
+ private _sourceCard;
32
+ set SourceCard(value: SourceCard | null);
33
+ get SourceCard(): SourceCard | null;
34
+ /** Emitted when the user dismisses the dialog. */
35
+ Closed: EventEmitter<void>;
36
+ Loading: boolean;
37
+ Rows: DryRunRow[];
38
+ Counts: DryRunDispositionCount;
39
+ Estimate: DryRunEstimate;
40
+ /** Effective config used for this preview (mirrored for the "effective values" line). */
41
+ EffectiveMode: DryRunConfig['mode'];
42
+ EffectiveMatchThreshold: number;
43
+ EffectiveSuggestThreshold: number;
44
+ /** True when the sampled source has no extracted tags yet. */
45
+ NoTagsSampled: boolean;
46
+ close(): void;
47
+ /**
48
+ * Load a sample of the source's existing extracted tags, resolve each against
49
+ * the cached taxonomy, and produce the preview rows + summary. Read-only —
50
+ * nothing is written.
51
+ */
52
+ private runPreview;
53
+ /**
54
+ * Sample up to SAMPLE_SIZE existing ContentItemTags for the source. We first
55
+ * pull a handful of the source's items, then their tags — the simplest path
56
+ * that avoids depending on a direct source-level filter on ContentItemTags.
57
+ */
58
+ private loadSampleTags;
59
+ /**
60
+ * Read the source's effective taxonomy config from its ConfigurationObject,
61
+ * falling back to documented runtime defaults. SuggestThreshold defaults to
62
+ * matchThreshold − 0.05 (matches the server's runtime default).
63
+ */
64
+ private resolveSourceConfig;
65
+ /**
66
+ * Build the client-side resolver closure over the cached taxonomy.
67
+ * tier 'synonym' if the tag matches a TagSynonym (case-insensitive),
68
+ * 'exact' if it matches a Tag Name (case-insensitive), 'fuzzy' if a
69
+ * normalized match (lowercase, strip plurals/hyphens) hits, else 'none'.
70
+ */
71
+ private buildResolver;
72
+ /** Lowercase, strip hyphens/underscores/whitespace and a trailing plural 's'. */
73
+ private normalize;
74
+ private tally;
75
+ private estimate;
76
+ /** Status-token-backed CSS class for a disposition pill. */
77
+ DispositionClass(d: Disposition): string;
78
+ /** Human label for a disposition pill. */
79
+ DispositionLabel(d: Disposition): string;
80
+ FormatScore(score: number | null): string;
81
+ FormatTokens(tokens: number): string;
82
+ FormatCost(cost: number): string;
83
+ ModeLabel(mode: DryRunConfig['mode']): string;
84
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClassifyDryRunPreviewDialogComponent, never>;
85
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClassifyDryRunPreviewDialogComponent, "classify-dry-run-preview", never, { "Show": { "alias": "Show"; "required": false; }; "SourceCard": { "alias": "SourceCard"; "required": false; }; }, { "Closed": "Closed"; }, never, never, false, never>;
86
+ }
87
+ //# sourceMappingURL=dry-run-preview.dialog.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry-run-preview.dialog.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAgC,YAAY,EAAyB,MAAM,eAAe,CAAC;AAGlG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAC+B,YAAY,EAAE,SAAS,EAAiB,WAAW,EACxF,MAAM,2BAA2B,CAAC;;AAYnC,qBAMa,oCAAqC,SAAQ,oBAAoB;IAC1E,OAAO,CAAC,GAAG,CAA6B;IAExC,qCAAqC;IACrC,OAAO,CAAC,KAAK,CAAS;IACtB,IACI,IAAI,CAAC,KAAK,EAAE,OAAO,EAMtB;IACD,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAA2B;IAC9C,IACI,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAKtC;IACD,IAAI,UAAU,IAAI,UAAU,GAAG,IAAI,CAElC;IAED,kDAAkD;IACxC,MAAM,qBAA4B;IAIrC,OAAO,UAAS;IAChB,IAAI,EAAE,SAAS,EAAE,CAAM;IACvB,MAAM,EAAE,sBAAsB,CAA8D;IAC5F,QAAQ,EAAE,cAAc,CAA6D;IAC5F,yFAAyF;IAClF,aAAa,EAAE,YAAY,CAAC,MAAM,CAAC,CAAgB;IACnD,uBAAuB,SAA2B;IAClD,yBAAyB,SAAkC;IAClE,8DAA8D;IACvD,aAAa,UAAS;IAEtB,KAAK,IAAI,IAAI;IAIpB;;;;OAIG;YACW,UAAU;IAmCxB;;;;OAIG;YACW,cAAc;IAkC5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA6CrB,iFAAiF;IACjF,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,QAAQ;IAQhB,4DAA4D;IACrD,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM;IAS/C,0CAA0C;IACnC,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM;IASxC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAIzC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIpC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIhC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,MAAM;yCAhQ3C,oCAAoC;2CAApC,oCAAoC;CAuQhD"}
@@ -0,0 +1,475 @@
1
+ /**
2
+ * @fileoverview Classify · Dry-run / disposition PREVIEW dialog.
3
+ *
4
+ * Honest, client-side, in-memory preview of how a source's EXISTING extracted
5
+ * ContentItemTags would be dispositioned under its current taxonomy mode +
6
+ * thresholds. This is NOT a fresh LLM run and NOTHING is persisted — it samples
7
+ * up to N existing tags, resolves each against the cached taxonomy
8
+ * (Tags / TagSynonyms) client-side, and replays the deterministic routing via the
9
+ * pure `previewDispositions` helper.
10
+ *
11
+ * It is hosted by the Sources tab (which already hosts its own dialogs): data
12
+ * DOWN via `[SourceCard]` / `[Show]`, intent UP via `(Closed)`. On open it loads
13
+ * the sample itself (read-only RunView, `ResultType: 'simple'`).
14
+ *
15
+ * NOTE: the server also has a semantic/embedding match tier not reproducible
16
+ * client-side, so borderline rows may resolve differently in a real run. The
17
+ * template states this explicitly.
18
+ */
19
+ import { Component, ChangeDetectorRef, EventEmitter, Input, Output, inject } from '@angular/core';
20
+ import { RunView } from '@memberjunction/core';
21
+ import { UUIDsEqual } from '@memberjunction/global';
22
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
23
+ import { TagEngineBase } from '@memberjunction/tag-engine-base';
24
+ import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
25
+ import { previewDispositions, } from '../shared/classify.dryrun';
26
+ import * as i0 from "@angular/core";
27
+ import * as i1 from "@memberjunction/ng-shared-generic";
28
+ import * as i2 from "@memberjunction/ng-ui-components";
29
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "div", 7);
31
+ i0.ɵɵelement(1, "i");
32
+ i0.ɵɵelementStart(2, "span", 17);
33
+ i0.ɵɵtext(3);
34
+ i0.ɵɵelementEnd()();
35
+ } if (rf & 2) {
36
+ const ctx_r1 = i0.ɵɵnextContext(2);
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵclassMap(ctx_r1.SourceCard.Icon);
39
+ i0.ɵɵadvance(2);
40
+ i0.ɵɵtextInterpolate(ctx_r1.SourceCard.Name);
41
+ } }
42
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_36_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelement(0, "mj-loading", 13);
44
+ } }
45
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_37_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelementStart(0, "div", 14);
47
+ i0.ɵɵelement(1, "i", 18);
48
+ i0.ɵɵelementStart(2, "p");
49
+ i0.ɵɵtext(3, "No extracted tags found for this source yet. Run the pipeline first, then preview how its tags would be dispositioned.");
50
+ i0.ɵɵelementEnd()();
51
+ } }
52
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_Conditional_13_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "span", 26);
54
+ i0.ɵɵtext(1);
55
+ i0.ɵɵelementEnd();
56
+ } if (rf & 2) {
57
+ const ctx_r1 = i0.ɵɵnextContext(3);
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate1("", ctx_r1.Counts.Reject, " reject");
60
+ } }
61
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_For_27_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "tr")(1, "td", 31);
63
+ i0.ɵɵtext(2);
64
+ i0.ɵɵelementEnd();
65
+ i0.ɵɵelementStart(3, "td", 32);
66
+ i0.ɵɵtext(4);
67
+ i0.ɵɵelementEnd();
68
+ i0.ɵɵelementStart(5, "td", 33);
69
+ i0.ɵɵtext(6);
70
+ i0.ɵɵelementEnd();
71
+ i0.ɵɵelementStart(7, "td")(8, "span", 34);
72
+ i0.ɵɵtext(9);
73
+ i0.ɵɵelementEnd()()();
74
+ } if (rf & 2) {
75
+ const row_r3 = ctx.$implicit;
76
+ const ctx_r1 = i0.ɵɵnextContext(3);
77
+ i0.ɵɵadvance(2);
78
+ i0.ɵɵtextInterpolate(row_r3.tag);
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵtextInterpolate(row_r3.matchedTag ?? "\u2014");
81
+ i0.ɵɵadvance(2);
82
+ i0.ɵɵtextInterpolate(ctx_r1.FormatScore(row_r3.score));
83
+ i0.ɵɵadvance(2);
84
+ i0.ɵɵclassMap(ctx_r1.DispositionClass(row_r3.disposition));
85
+ i0.ɵɵproperty("title", row_r3.reason);
86
+ i0.ɵɵadvance();
87
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DispositionLabel(row_r3.disposition), " ");
88
+ } }
89
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_Template(rf, ctx) { if (rf & 1) {
90
+ i0.ɵɵelementStart(0, "div", 19);
91
+ i0.ɵɵelement(1, "i", 20);
92
+ i0.ɵɵelementStart(2, "span");
93
+ i0.ɵɵtext(3);
94
+ i0.ɵɵelementStart(4, "span", 21);
95
+ i0.ɵɵtext(5, "(rough estimate)");
96
+ i0.ɵɵelementEnd()()();
97
+ i0.ɵɵelementStart(6, "div", 22)(7, "span", 23);
98
+ i0.ɵɵtext(8);
99
+ i0.ɵɵelementEnd();
100
+ i0.ɵɵelementStart(9, "span", 24);
101
+ i0.ɵɵtext(10);
102
+ i0.ɵɵelementEnd();
103
+ i0.ɵɵelementStart(11, "span", 25);
104
+ i0.ɵɵtext(12);
105
+ i0.ɵɵelementEnd();
106
+ i0.ɵɵconditionalCreate(13, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_Conditional_13_Template, 2, 1, "span", 26);
107
+ i0.ɵɵelementEnd();
108
+ i0.ɵɵelementStart(14, "table", 27)(15, "thead")(16, "tr")(17, "th");
109
+ i0.ɵɵtext(18, "Tag");
110
+ i0.ɵɵelementEnd();
111
+ i0.ɵɵelementStart(19, "th");
112
+ i0.ɵɵtext(20, "Matched");
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(21, "th", 28);
115
+ i0.ɵɵtext(22, "Score");
116
+ i0.ɵɵelementEnd();
117
+ i0.ɵɵelementStart(23, "th");
118
+ i0.ɵɵtext(24, "What would happen");
119
+ i0.ɵɵelementEnd()()();
120
+ i0.ɵɵelementStart(25, "tbody");
121
+ i0.ɵɵrepeaterCreate(26, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_For_27_Template, 10, 7, "tr", null, i0.ɵɵrepeaterTrackByIndex);
122
+ i0.ɵɵelementEnd()();
123
+ i0.ɵɵelementStart(28, "div", 29);
124
+ i0.ɵɵelement(29, "i", 30);
125
+ i0.ɵɵtext(30, " A real run also uses a semantic / embedding match tier not reproducible here, so borderline rows may resolve differently. ");
126
+ i0.ɵɵelementEnd();
127
+ } if (rf & 2) {
128
+ const ctx_r1 = i0.ɵɵnextContext(2);
129
+ i0.ɵɵadvance(3);
130
+ i0.ɵɵtextInterpolate4(" ", ctx_r1.Estimate.ItemsSampled, " sampled tag", ctx_r1.Estimate.ItemsSampled === 1 ? "" : "s", " \u00B7 est. ", ctx_r1.FormatTokens(ctx_r1.Estimate.EstimatedTokens), " tokens \u00B7 ~", ctx_r1.FormatCost(ctx_r1.Estimate.EstimatedCost), " ");
131
+ i0.ɵɵadvance(5);
132
+ i0.ɵɵtextInterpolate1("", ctx_r1.Counts.AutoApply, " auto-apply");
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵtextInterpolate1("", ctx_r1.Counts.RouteToInbox, " \u2192 inbox");
135
+ i0.ɵɵadvance(2);
136
+ i0.ɵɵtextInterpolate1("", ctx_r1.Counts.CreateNew, " create");
137
+ i0.ɵɵadvance();
138
+ i0.ɵɵconditional(ctx_r1.Counts.Reject > 0 ? 13 : -1);
139
+ i0.ɵɵadvance(13);
140
+ i0.ɵɵrepeater(ctx_r1.Rows);
141
+ } }
142
+ function ClassifyDryRunPreviewDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
143
+ const _r1 = i0.ɵɵgetCurrentView();
144
+ i0.ɵɵelementStart(0, "div", 0);
145
+ i0.ɵɵlistener("click", function ClassifyDryRunPreviewDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
146
+ i0.ɵɵelementEnd();
147
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "h3");
148
+ i0.ɵɵelement(4, "i", 3);
149
+ i0.ɵɵtext(5, " Dry-run preview");
150
+ i0.ɵɵelementEnd();
151
+ i0.ɵɵelementStart(6, "button", 4);
152
+ i0.ɵɵlistener("click", function ClassifyDryRunPreviewDialogComponent_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
153
+ i0.ɵɵelement(7, "i", 5);
154
+ i0.ɵɵelementEnd()();
155
+ i0.ɵɵelementStart(8, "div", 6);
156
+ i0.ɵɵconditionalCreate(9, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_9_Template, 4, 3, "div", 7);
157
+ i0.ɵɵelementStart(10, "div", 8);
158
+ i0.ɵɵelement(11, "i", 9);
159
+ i0.ɵɵelementStart(12, "span");
160
+ i0.ɵɵtext(13, " Preview of how this source's sampled tags resolve under the current ");
161
+ i0.ɵɵelementStart(14, "b");
162
+ i0.ɵɵtext(15, "mode & thresholds");
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵtext(16, " \u2014 ");
165
+ i0.ɵɵelementStart(17, "b");
166
+ i0.ɵɵtext(18, "no LLM call, nothing persisted");
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵtext(19, ". ");
169
+ i0.ɵɵelementEnd()();
170
+ i0.ɵɵelementStart(20, "div", 10)(21, "span", 11);
171
+ i0.ɵɵelement(22, "i", 3);
172
+ i0.ɵɵtext(23, " PREVIEW");
173
+ i0.ɵɵelementEnd();
174
+ i0.ɵɵelementStart(24, "span", 12);
175
+ i0.ɵɵtext(25, "Mode ");
176
+ i0.ɵɵelementStart(26, "b");
177
+ i0.ɵɵtext(27);
178
+ i0.ɵɵelementEnd()();
179
+ i0.ɵɵelementStart(28, "span", 12);
180
+ i0.ɵɵtext(29, "Match ");
181
+ i0.ɵɵelementStart(30, "b");
182
+ i0.ɵɵtext(31);
183
+ i0.ɵɵelementEnd()();
184
+ i0.ɵɵelementStart(32, "span", 12);
185
+ i0.ɵɵtext(33, "Suggest ");
186
+ i0.ɵɵelementStart(34, "b");
187
+ i0.ɵɵtext(35);
188
+ i0.ɵɵelementEnd()()();
189
+ i0.ɵɵconditionalCreate(36, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_36_Template, 1, 0, "mj-loading", 13)(37, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_37_Template, 4, 0, "div", 14)(38, ClassifyDryRunPreviewDialogComponent_Conditional_0_Conditional_38_Template, 31, 8);
190
+ i0.ɵɵelementStart(39, "div", 15)(40, "button", 16);
191
+ i0.ɵɵlistener("click", function ClassifyDryRunPreviewDialogComponent_Conditional_0_Template_button_click_40_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
192
+ i0.ɵɵtext(41, "Close");
193
+ i0.ɵɵelementEnd()()()();
194
+ } if (rf & 2) {
195
+ const ctx_r1 = i0.ɵɵnextContext();
196
+ i0.ɵɵadvance(9);
197
+ i0.ɵɵconditional(ctx_r1.SourceCard ? 9 : -1);
198
+ i0.ɵɵadvance(18);
199
+ i0.ɵɵtextInterpolate(ctx_r1.ModeLabel(ctx_r1.EffectiveMode));
200
+ i0.ɵɵadvance(4);
201
+ i0.ɵɵtextInterpolate(ctx_r1.FormatScore(ctx_r1.EffectiveMatchThreshold));
202
+ i0.ɵɵadvance(4);
203
+ i0.ɵɵtextInterpolate(ctx_r1.FormatScore(ctx_r1.EffectiveSuggestThreshold));
204
+ i0.ɵɵadvance();
205
+ i0.ɵɵconditional(ctx_r1.Loading ? 36 : ctx_r1.NoTagsSampled ? 37 : 38);
206
+ } }
207
+ /** Default routing config when a source has no explicit Configuration blob. */
208
+ const DEFAULT_MODE = 'auto-grow';
209
+ const DEFAULT_MATCH_THRESHOLD = 0.85;
210
+ /** Illustrative per-item token estimate for the (non-binding) cost line. */
211
+ const EST_TOKENS_PER_ITEM = 840;
212
+ /** Illustrative blended $/1K-token rate for the cost estimate. */
213
+ const EST_COST_PER_1K_TOKENS = 0.01;
214
+ /** Max existing tags to sample for the preview. */
215
+ const SAMPLE_SIZE = 15;
216
+ export class ClassifyDryRunPreviewDialogComponent extends BaseAngularComponent {
217
+ cdr = inject(ChangeDetectorRef);
218
+ /** Whether the dialog is visible. */
219
+ _show = false;
220
+ set Show(value) {
221
+ const opening = value && !this._show;
222
+ this._show = value;
223
+ if (opening && this._sourceCard) {
224
+ void this.runPreview(this._sourceCard);
225
+ }
226
+ }
227
+ get Show() {
228
+ return this._show;
229
+ }
230
+ /** The source being previewed; supplied by the Sources tab when opening. */
231
+ _sourceCard = null;
232
+ set SourceCard(value) {
233
+ this._sourceCard = value;
234
+ if (value && this._show) {
235
+ void this.runPreview(value);
236
+ }
237
+ }
238
+ get SourceCard() {
239
+ return this._sourceCard;
240
+ }
241
+ /** Emitted when the user dismisses the dialog. */
242
+ Closed = new EventEmitter();
243
+ // ── View state ──
244
+ Loading = false;
245
+ Rows = [];
246
+ Counts = { AutoApply: 0, RouteToInbox: 0, CreateNew: 0, Reject: 0 };
247
+ Estimate = { ItemsSampled: 0, EstimatedTokens: 0, EstimatedCost: 0 };
248
+ /** Effective config used for this preview (mirrored for the "effective values" line). */
249
+ EffectiveMode = DEFAULT_MODE;
250
+ EffectiveMatchThreshold = DEFAULT_MATCH_THRESHOLD;
251
+ EffectiveSuggestThreshold = DEFAULT_MATCH_THRESHOLD - 0.05;
252
+ /** True when the sampled source has no extracted tags yet. */
253
+ NoTagsSampled = false;
254
+ close() {
255
+ this.Closed.emit();
256
+ }
257
+ /**
258
+ * Load a sample of the source's existing extracted tags, resolve each against
259
+ * the cached taxonomy, and produce the preview rows + summary. Read-only —
260
+ * nothing is written.
261
+ */
262
+ async runPreview(card) {
263
+ this.Loading = true;
264
+ this.Rows = [];
265
+ this.NoTagsSampled = false;
266
+ this.cdr.detectChanges();
267
+ try {
268
+ const p = this.ProviderToUse;
269
+ await TagEngineBase.Instance.Config(false, p.CurrentUser, p);
270
+ await KnowledgeHubMetadataEngine.Instance.Config(false, p.CurrentUser, p);
271
+ const cfg = this.resolveSourceConfig(card.ID);
272
+ this.EffectiveMode = cfg.mode;
273
+ this.EffectiveMatchThreshold = cfg.matchThreshold;
274
+ this.EffectiveSuggestThreshold = cfg.suggestThreshold;
275
+ const inputs = await this.loadSampleTags(card.ID);
276
+ if (inputs.length === 0) {
277
+ this.NoTagsSampled = true;
278
+ this.Estimate = { ItemsSampled: 0, EstimatedTokens: 0, EstimatedCost: 0 };
279
+ return;
280
+ }
281
+ const resolve = this.buildResolver();
282
+ this.Rows = previewDispositions(inputs, cfg, resolve);
283
+ this.Counts = this.tally(this.Rows);
284
+ this.Estimate = this.estimate(inputs.length);
285
+ }
286
+ catch (error) {
287
+ console.error('[Classify] Dry-run preview error:', error);
288
+ }
289
+ finally {
290
+ this.Loading = false;
291
+ this.cdr.detectChanges();
292
+ }
293
+ }
294
+ /**
295
+ * Sample up to SAMPLE_SIZE existing ContentItemTags for the source. We first
296
+ * pull a handful of the source's items, then their tags — the simplest path
297
+ * that avoids depending on a direct source-level filter on ContentItemTags.
298
+ */
299
+ async loadSampleTags(sourceID) {
300
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
301
+ const itemResult = await rv.RunView({
302
+ EntityName: 'MJ: Content Items',
303
+ ExtraFilter: `ContentSourceID='${sourceID}'`,
304
+ OrderBy: '__mj_UpdatedAt DESC',
305
+ Fields: ['ID'],
306
+ MaxRows: SAMPLE_SIZE,
307
+ ResultType: 'simple',
308
+ });
309
+ if (!itemResult.Success || itemResult.Results.length === 0)
310
+ return [];
311
+ const itemIds = itemResult.Results.map(i => i.ID);
312
+ const inClause = itemIds.map(id => `'${id}'`).join(',');
313
+ const tagResult = await rv.RunView({
314
+ EntityName: 'MJ: Content Item Tags',
315
+ ExtraFilter: `ItemID IN (${inClause})`,
316
+ Fields: ['Tag', 'TagID', 'Weight'],
317
+ MaxRows: SAMPLE_SIZE,
318
+ ResultType: 'simple',
319
+ });
320
+ if (!tagResult.Success)
321
+ return [];
322
+ return tagResult.Results
323
+ .filter(t => !!t.Tag)
324
+ .map(t => ({
325
+ tag: t.Tag,
326
+ resolvedTagId: t.TagID ?? null,
327
+ weight: Number(t.Weight ?? 1),
328
+ }));
329
+ }
330
+ /**
331
+ * Read the source's effective taxonomy config from its ConfigurationObject,
332
+ * falling back to documented runtime defaults. SuggestThreshold defaults to
333
+ * matchThreshold − 0.05 (matches the server's runtime default).
334
+ */
335
+ resolveSourceConfig(sourceID) {
336
+ const source = KnowledgeHubMetadataEngine.Instance.ContentSources.find(cs => UUIDsEqual(cs.ID, sourceID));
337
+ const config = source?.ConfigurationObject ?? null;
338
+ const mode = config?.TagTaxonomyMode ?? DEFAULT_MODE;
339
+ const matchThreshold = config?.TagMatchThreshold ?? DEFAULT_MATCH_THRESHOLD;
340
+ const suggestThreshold = config?.SuggestThreshold ?? matchThreshold - 0.05;
341
+ return { mode, matchThreshold, suggestThreshold };
342
+ }
343
+ /**
344
+ * Build the client-side resolver closure over the cached taxonomy.
345
+ * tier 'synonym' if the tag matches a TagSynonym (case-insensitive),
346
+ * 'exact' if it matches a Tag Name (case-insensitive), 'fuzzy' if a
347
+ * normalized match (lowercase, strip plurals/hyphens) hits, else 'none'.
348
+ */
349
+ buildResolver() {
350
+ const engine = TagEngineBase.Instance;
351
+ const activeTags = engine.Tags.filter(t => t.Status === 'Active');
352
+ // synonym text (lower) → owning Tag
353
+ const synonymMap = new Map();
354
+ const tagById = new Map();
355
+ for (const t of activeTags) {
356
+ tagById.set(t.ID.toLowerCase(), { id: t.ID, name: t.Name });
357
+ }
358
+ for (const syn of engine.TagSynonyms) {
359
+ // Only Active synonyms resolve — Pending (proposed, unapproved) and
360
+ // Rejected ones are not live, matching the server-side resolver.
361
+ if (syn.Status !== 'Active')
362
+ continue;
363
+ const owner = tagById.get((syn.TagID ?? '').toLowerCase());
364
+ if (owner && syn.Synonym) {
365
+ synonymMap.set(syn.Synonym.trim().toLowerCase(), owner);
366
+ }
367
+ }
368
+ // exact name (lower) → Tag; normalized name (lower) → Tag (for fuzzy tier)
369
+ const exactMap = new Map();
370
+ const normalizedMap = new Map();
371
+ for (const t of activeTags) {
372
+ const entry = { id: t.ID, name: t.Name };
373
+ exactMap.set(t.Name.trim().toLowerCase(), entry);
374
+ normalizedMap.set(this.normalize(t.Name), entry);
375
+ }
376
+ return (tag) => {
377
+ const lower = tag.trim().toLowerCase();
378
+ const syn = synonymMap.get(lower);
379
+ if (syn)
380
+ return { tagId: syn.id, tagName: syn.name, score: 1.0, tier: 'synonym' };
381
+ const exact = exactMap.get(lower);
382
+ if (exact)
383
+ return { tagId: exact.id, tagName: exact.name, score: 1.0, tier: 'exact' };
384
+ const fuzzy = normalizedMap.get(this.normalize(tag));
385
+ if (fuzzy)
386
+ return { tagId: fuzzy.id, tagName: fuzzy.name, score: 0.8, tier: 'fuzzy' };
387
+ return { tagId: null, tagName: null, score: null, tier: 'none' };
388
+ };
389
+ }
390
+ /** Lowercase, strip hyphens/underscores/whitespace and a trailing plural 's'. */
391
+ normalize(value) {
392
+ let v = value.trim().toLowerCase().replace(/[-_\s]+/g, '');
393
+ if (v.endsWith('s') && v.length > 3)
394
+ v = v.slice(0, -1);
395
+ return v;
396
+ }
397
+ tally(rows) {
398
+ const counts = { AutoApply: 0, RouteToInbox: 0, CreateNew: 0, Reject: 0 };
399
+ for (const r of rows) {
400
+ switch (r.disposition) {
401
+ case 'auto-apply':
402
+ counts.AutoApply++;
403
+ break;
404
+ case 'route-to-inbox':
405
+ counts.RouteToInbox++;
406
+ break;
407
+ case 'create-new':
408
+ counts.CreateNew++;
409
+ break;
410
+ case 'reject':
411
+ counts.Reject++;
412
+ break;
413
+ }
414
+ }
415
+ return counts;
416
+ }
417
+ estimate(itemsSampled) {
418
+ const tokens = itemsSampled * EST_TOKENS_PER_ITEM;
419
+ const cost = (tokens / 1000) * EST_COST_PER_1K_TOKENS;
420
+ return { ItemsSampled: itemsSampled, EstimatedTokens: tokens, EstimatedCost: cost };
421
+ }
422
+ // ── Template helpers ──
423
+ /** Status-token-backed CSS class for a disposition pill. */
424
+ DispositionClass(d) {
425
+ switch (d) {
426
+ case 'auto-apply': return 'disp disp-apply';
427
+ case 'route-to-inbox': return 'disp disp-inbox';
428
+ case 'create-new': return 'disp disp-create';
429
+ case 'reject': return 'disp disp-reject';
430
+ }
431
+ }
432
+ /** Human label for a disposition pill. */
433
+ DispositionLabel(d) {
434
+ switch (d) {
435
+ case 'auto-apply': return 'AUTO-APPLY';
436
+ case 'route-to-inbox': return '→ INBOX';
437
+ case 'create-new': return this.EffectiveMode === 'free-flow' ? 'CREATE (free-flow)' : 'CREATE (auto-grow)';
438
+ case 'reject': return 'REJECT';
439
+ }
440
+ }
441
+ FormatScore(score) {
442
+ return score == null ? '—' : score.toFixed(2);
443
+ }
444
+ FormatTokens(tokens) {
445
+ return tokens.toLocaleString();
446
+ }
447
+ FormatCost(cost) {
448
+ return `$${cost.toFixed(2)}`;
449
+ }
450
+ ModeLabel(mode) {
451
+ switch (mode) {
452
+ case 'constrained': return 'Constrained';
453
+ case 'auto-grow': return 'Auto-grow';
454
+ case 'free-flow': return 'Free-flow';
455
+ }
456
+ }
457
+ static ɵfac = /*@__PURE__*/ (() => { let ɵClassifyDryRunPreviewDialogComponent_BaseFactory; return function ClassifyDryRunPreviewDialogComponent_Factory(__ngFactoryType__) { return (ɵClassifyDryRunPreviewDialogComponent_BaseFactory || (ɵClassifyDryRunPreviewDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ClassifyDryRunPreviewDialogComponent)))(__ngFactoryType__ || ClassifyDryRunPreviewDialogComponent); }; })();
458
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifyDryRunPreviewDialogComponent, selectors: [["classify-dry-run-preview"]], inputs: { Show: "Show", SourceCard: "SourceCard" }, outputs: { Closed: "Closed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel", "dry-run-panel"], [1, "at-slide-header"], [1, "fa-solid", "fa-flask"], ["aria-label", "Close dry-run preview", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "dry-source-line"], [1, "dry-banner"], [1, "fa-solid", "fa-circle-info"], [1, "dry-effective"], [1, "pill", "purple"], [1, "dry-eff-item"], ["text", "Sampling existing tags\u2026"], [1, "dry-empty"], [1, "dry-footer"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "dry-source-name"], [1, "fa-solid", "fa-tags"], [1, "dry-estimate"], [1, "fa-solid", "fa-calculator"], [1, "dry-est-note"], [1, "dry-summary"], [1, "disp", "disp-apply"], [1, "disp", "disp-inbox"], [1, "disp", "disp-create"], [1, "disp", "disp-reject"], [1, "dry-table"], [1, "dry-col-score"], [1, "dry-disclaimer"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "dry-cell-tag"], [1, "dry-cell-matched"], [1, "dry-col-score", "dry-mono"], [3, "title"]], template: function ClassifyDryRunPreviewDialogComponent_Template(rf, ctx) { if (rf & 1) {
459
+ i0.ɵɵconditionalCreate(0, ClassifyDryRunPreviewDialogComponent_Conditional_0_Template, 42, 5);
460
+ } if (rf & 2) {
461
+ i0.ɵɵconditional(ctx.Show ? 0 : -1);
462
+ } }, dependencies: [i1.LoadingComponent, i2.MJButtonDirective], styles: ["\n\n\n\n\n\n\n.dry-run-panel[_ngcontent-%COMP%] {\n width: 640px;\n max-width: 92vw;\n}\n\n.dry-source-line[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.95rem;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n}\n.dry-source-line[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n.dry-source-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n\n.dry-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border);\n color: var(--mj-status-info-text);\n font-size: 0.85rem;\n line-height: 1.4;\n margin-bottom: 14px;\n}\n.dry-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n}\n\n\n\n.dry-effective[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n}\n.dry-eff-item[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n.dry-eff-item[_ngcontent-%COMP%] b[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.03em;\n}\n.pill.purple[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n.dry-estimate[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n margin-bottom: 12px;\n}\n.dry-est-note[_ngcontent-%COMP%] {\n font-style: italic;\n color: var(--mj-text-muted);\n}\n\n\n\n.dry-summary[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 14px;\n}\n\n\n\n.disp[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 9px;\n border-radius: 6px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.02em;\n white-space: nowrap;\n}\n.disp-apply[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n.disp-inbox[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n.disp-create[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n border: 1px solid var(--mj-status-info-border);\n}\n.disp-reject[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n\n\n.dry-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.84rem;\n margin-bottom: 14px;\n}\n.dry-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding: 6px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.dry-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 7px 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.dry-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n.dry-cell-tag[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n.dry-cell-matched[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n.dry-col-score[_ngcontent-%COMP%] {\n text-align: right;\n width: 64px;\n}\n.dry-mono[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n color: var(--mj-text-secondary);\n}\n\n.dry-disclaimer[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 16px;\n}\n.dry-disclaimer[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n color: var(--mj-status-warning);\n}\n\n.dry-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n.dry-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.8rem;\n margin-bottom: 10px;\n color: var(--mj-text-disabled);\n}\n.dry-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 0.88rem;\n line-height: 1.5;\n max-width: 420px;\n margin: 0 auto;\n}\n\n.dry-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}"] });
463
+ }
464
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassifyDryRunPreviewDialogComponent, [{
465
+ type: Component,
466
+ args: [{ standalone: false, selector: 'classify-dry-run-preview', template: "<!-- \u2550\u2550\u2550\u2550\u2550\u2550 DRY-RUN / DISPOSITION PREVIEW SLIDE-IN \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (Show) {\n <div class=\"at-slide-overlay\" (click)=\"close()\"></div>\n <div class=\"at-slide-panel dry-run-panel\">\n <div class=\"at-slide-header\">\n <h3><i class=\"fa-solid fa-flask\"></i> Dry-run preview</h3>\n <button class=\"at-slide-close\" aria-label=\"Close dry-run preview\" (click)=\"close()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n\n <div class=\"at-slide-body\">\n <!-- Source + intent line -->\n @if (SourceCard) {\n <div class=\"dry-source-line\">\n <i [class]=\"SourceCard.Icon\"></i>\n <span class=\"dry-source-name\">{{ SourceCard.Name }}</span>\n </div>\n }\n\n <!-- \"nothing persisted\" banner -->\n <div class=\"dry-banner\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>\n Preview of how this source's sampled tags resolve under the current\n <b>mode &amp; thresholds</b> \u2014 <b>no LLM call, nothing persisted</b>.\n </span>\n </div>\n\n <!-- Effective config -->\n <div class=\"dry-effective\">\n <span class=\"pill purple\"><i class=\"fa-solid fa-flask\"></i> PREVIEW</span>\n <span class=\"dry-eff-item\">Mode <b>{{ ModeLabel(EffectiveMode) }}</b></span>\n <span class=\"dry-eff-item\">Match <b>{{ FormatScore(EffectiveMatchThreshold) }}</b></span>\n <span class=\"dry-eff-item\">Suggest <b>{{ FormatScore(EffectiveSuggestThreshold) }}</b></span>\n </div>\n\n @if (Loading) {\n <mj-loading text=\"Sampling existing tags\u2026\"></mj-loading>\n } @else if (NoTagsSampled) {\n <div class=\"dry-empty\">\n <i class=\"fa-solid fa-tags\"></i>\n <p>No extracted tags found for this source yet. Run the pipeline first, then preview how its tags would be dispositioned.</p>\n </div>\n } @else {\n <!-- Estimate line (illustrative) -->\n <div class=\"dry-estimate\">\n <i class=\"fa-solid fa-calculator\"></i>\n <span>\n {{ Estimate.ItemsSampled }} sampled tag{{ Estimate.ItemsSampled === 1 ? '' : 's' }} \u00B7\n est. {{ FormatTokens(Estimate.EstimatedTokens) }} tokens \u00B7\n ~{{ FormatCost(Estimate.EstimatedCost) }}\n <span class=\"dry-est-note\">(rough estimate)</span>\n </span>\n </div>\n\n <!-- Summary counts -->\n <div class=\"dry-summary\">\n <span class=\"disp disp-apply\">{{ Counts.AutoApply }} auto-apply</span>\n <span class=\"disp disp-inbox\">{{ Counts.RouteToInbox }} \u2192 inbox</span>\n <span class=\"disp disp-create\">{{ Counts.CreateNew }} create</span>\n @if (Counts.Reject > 0) {\n <span class=\"disp disp-reject\">{{ Counts.Reject }} reject</span>\n }\n </div>\n\n <!-- Disposition table -->\n <table class=\"dry-table\">\n <thead>\n <tr>\n <th>Tag</th>\n <th>Matched</th>\n <th class=\"dry-col-score\">Score</th>\n <th>What would happen</th>\n </tr>\n </thead>\n <tbody>\n @for (row of Rows; track $index) {\n <tr>\n <td class=\"dry-cell-tag\">{{ row.tag }}</td>\n <td class=\"dry-cell-matched\">{{ row.matchedTag ?? '\u2014' }}</td>\n <td class=\"dry-col-score dry-mono\">{{ FormatScore(row.score) }}</td>\n <td>\n <span [class]=\"DispositionClass(row.disposition)\" [title]=\"row.reason\">\n {{ DispositionLabel(row.disposition) }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <div class=\"dry-disclaimer\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n A real run also uses a semantic / embedding match tier not reproducible here,\n so borderline rows may resolve differently.\n </div>\n }\n\n <!-- Footer -->\n <div class=\"dry-footer\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"close()\">Close</button>\n </div>\n </div>\n </div>\n}\n", styles: ["/**\n * Dry-run preview dialog \u2014 net-new rules only. The slide-in shell (.at-slide-*)\n * is owned by the host (ViewEncapsulation.None) and already styles the panel.\n * Disposition pills use semantic status tokens so they adapt to dark mode.\n */\n\n.dry-run-panel {\n width: 640px;\n max-width: 92vw;\n}\n\n.dry-source-line {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.95rem;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n}\n.dry-source-line i {\n color: var(--mj-text-secondary);\n}\n.dry-source-name {\n font-weight: 600;\n}\n\n/* \"nothing persisted\" banner */\n.dry-banner {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border);\n color: var(--mj-status-info-text);\n font-size: 0.85rem;\n line-height: 1.4;\n margin-bottom: 14px;\n}\n.dry-banner i {\n margin-top: 2px;\n}\n\n/* effective config row */\n.dry-effective {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n}\n.dry-eff-item {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n.dry-eff-item b {\n color: var(--mj-text-primary);\n}\n\n.pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.03em;\n}\n.pill.purple {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* estimate line */\n.dry-estimate {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n margin-bottom: 12px;\n}\n.dry-est-note {\n font-style: italic;\n color: var(--mj-text-muted);\n}\n\n/* summary counts */\n.dry-summary {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 14px;\n}\n\n/* disposition pills (status-token backed) */\n.disp {\n display: inline-flex;\n align-items: center;\n padding: 3px 9px;\n border-radius: 6px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.02em;\n white-space: nowrap;\n}\n.disp-apply {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n border: 1px solid var(--mj-status-success-border);\n}\n.disp-inbox {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n.disp-create {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n border: 1px solid var(--mj-status-info-border);\n}\n.disp-reject {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n}\n\n/* table */\n.dry-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.84rem;\n margin-bottom: 14px;\n}\n.dry-table thead th {\n text-align: left;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding: 6px 8px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n.dry-table tbody td {\n padding: 7px 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.dry-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n.dry-cell-tag {\n font-weight: 500;\n}\n.dry-cell-matched {\n color: var(--mj-text-secondary);\n}\n.dry-col-score {\n text-align: right;\n width: 64px;\n}\n.dry-mono {\n font-family: var(--mj-font-mono, monospace);\n color: var(--mj-text-secondary);\n}\n\n.dry-disclaimer {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n line-height: 1.4;\n margin-bottom: 16px;\n}\n.dry-disclaimer i {\n margin-top: 2px;\n color: var(--mj-status-warning);\n}\n\n.dry-empty {\n text-align: center;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n}\n.dry-empty i {\n font-size: 1.8rem;\n margin-bottom: 10px;\n color: var(--mj-text-disabled);\n}\n.dry-empty p {\n font-size: 0.88rem;\n line-height: 1.5;\n max-width: 420px;\n margin: 0 auto;\n}\n\n.dry-footer {\n display: flex;\n gap: 8px;\n margin-top: 4px;\n}\n"] }]
467
+ }], null, { Show: [{
468
+ type: Input
469
+ }], SourceCard: [{
470
+ type: Input
471
+ }], Closed: [{
472
+ type: Output
473
+ }] }); })();
474
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifyDryRunPreviewDialogComponent, { className: "ClassifyDryRunPreviewDialogComponent", filePath: "src/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.ts", lineNumber: 46 }); })();
475
+ //# sourceMappingURL=dry-run-preview.dialog.component.js.map