@memberjunction/ng-dashboards 5.39.0 → 5.40.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -21,8 +21,8 @@
21
21
  * NavigationService through the `(NavigateToRecordRequested)` output.
22
22
  */
23
23
  import { Component, ChangeDetectorRef, EventEmitter, Output, inject, NgZone } from '@angular/core';
24
- import { CompositeKey } from '@memberjunction/core';
25
- import { KnowledgeHubMetadataEngine, UserInfoEngine } from '@memberjunction/core-entities';
24
+ import { CompositeKey, RunView } from '@memberjunction/core';
25
+ import { KnowledgeHubMetadataEngine, ApplicationSettingEngine, UserInfoEngine } from '@memberjunction/core-entities';
26
26
  import { UUIDsEqual } from '@memberjunction/global';
27
27
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
28
28
  import { MJNotificationService } from '@memberjunction/ng-notifications';
@@ -38,7 +38,8 @@ const _forTrack0 = ($index, $item) => $item.ID;
38
38
  const _forTrack1 = ($index, $item) => $item.Key;
39
39
  const _forTrack2 = ($index, $item) => $item.value;
40
40
  const _forTrack3 = ($index, $item) => $item.Value;
41
- const _forTrack4 = ($index, $item) => $item.label;
41
+ const _forTrack4 = ($index, $item) => $item.Name;
42
+ const _forTrack5 = ($index, $item) => $item.label;
42
43
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
43
44
  i0.ɵɵtext(0, " Add Content Source ");
44
45
  } }
@@ -115,13 +116,13 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
115
116
  i0.ɵɵrepeater(ctx_r1.FileTypeOptions);
116
117
  } }
117
118
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
118
- i0.ɵɵelementStart(0, "span", 48);
119
+ i0.ɵɵelementStart(0, "span", 51);
119
120
  i0.ɵɵtext(1, "*");
120
121
  i0.ɵɵelementEnd();
121
122
  } }
122
123
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template(rf, ctx) { if (rf & 1) {
123
124
  const _r8 = i0.ɵɵgetCurrentView();
124
- i0.ɵɵelementStart(0, "input", 53);
125
+ i0.ɵɵelementStart(0, "input", 56);
125
126
  i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
126
127
  i0.ɵɵelementEnd();
127
128
  } if (rf & 2) {
@@ -132,7 +133,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
132
133
  } }
133
134
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template(rf, ctx) { if (rf & 1) {
134
135
  const _r10 = i0.ɵɵgetCurrentView();
135
- i0.ɵɵelementStart(0, "input", 54);
136
+ i0.ɵɵelementStart(0, "input", 57);
136
137
  i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
137
138
  i0.ɵɵelementEnd();
138
139
  } if (rf & 2) {
@@ -143,7 +144,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
143
144
  } }
144
145
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template(rf, ctx) { if (rf & 1) {
145
146
  const _r11 = i0.ɵɵgetCurrentView();
146
- i0.ɵɵelementStart(0, "input", 55);
147
+ i0.ɵɵelementStart(0, "input", 58);
147
148
  i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
148
149
  i0.ɵɵelementEnd();
149
150
  } if (rf & 2) {
@@ -266,9 +267,9 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
266
267
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
267
268
  i0.ɵɵelementStart(0, "div", 10)(1, "label", 11);
268
269
  i0.ɵɵtext(2);
269
- i0.ɵɵconditionalCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template, 2, 0, "span", 48);
270
+ i0.ɵɵconditionalCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template, 2, 0, "span", 51);
270
271
  i0.ɵɵelementEnd();
271
- i0.ɵɵconditionalCreate(4, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template, 1, 2, "input", 49)(5, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template, 1, 2, "input", 50)(6, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template, 1, 3, "input", 51)(7, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_7_Template, 5, 1, "select", 52)(8, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_8_Template, 3, 1, "select", 52)(9, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_9_Template, 5, 1, "select", 52)(10, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_10_Template, 5, 2, "select", 52);
272
+ i0.ɵɵconditionalCreate(4, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template, 1, 2, "input", 52)(5, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template, 1, 2, "input", 53)(6, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template, 1, 3, "input", 54)(7, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_7_Template, 5, 1, "select", 55)(8, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_8_Template, 3, 1, "select", 55)(9, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_9_Template, 5, 1, "select", 55)(10, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_10_Template, 5, 2, "select", 55);
272
273
  i0.ɵɵconditionalCreate(11, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_11_Template, 2, 1, "span", 19);
273
274
  i0.ɵɵelementEnd();
274
275
  } if (rf & 2) {
@@ -297,51 +298,138 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
297
298
  const ctx_r1 = i0.ɵɵnextContext(3);
298
299
  i0.ɵɵconditional(!field_r9.DependsOnField || ctx_r1.FormSourceSpecificConfig[field_r9.DependsOnField] ? 0 : -1);
299
300
  } }
300
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_36_Template(rf, ctx) { if (rf & 1) {
301
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template(rf, ctx) { if (rf & 1) {
302
+ const _r20 = i0.ɵɵgetCurrentView();
303
+ i0.ɵɵelementStart(0, "button", 64);
304
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenInlineEntityDocForm()); });
305
+ i0.ɵɵelement(1, "i", 65);
306
+ i0.ɵɵtext(2, " Create Entity Document ");
307
+ i0.ɵɵelementEnd();
308
+ } }
309
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template(rf, ctx) { if (rf & 1) {
310
+ const _r22 = i0.ɵɵgetCurrentView();
311
+ i0.ɵɵelementStart(0, "label", 68)(1, "input", 71);
312
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template_input_ngModelChange_1_listener($event) { const f_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityDocSelectedFields[f_r23.Name], $event) || (ctx_r1.NewEntityDocSelectedFields[f_r23.Name] = $event); return i0.ɵɵresetView($event); });
313
+ i0.ɵɵelementEnd();
314
+ i0.ɵɵelementStart(2, "span");
315
+ i0.ɵɵtext(3);
316
+ i0.ɵɵelementEnd()();
317
+ } if (rf & 2) {
318
+ const f_r23 = ctx.$implicit;
319
+ const ctx_r1 = i0.ɵɵnextContext(5);
320
+ i0.ɵɵadvance();
321
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityDocSelectedFields[f_r23.Name]);
322
+ i0.ɵɵadvance(2);
323
+ i0.ɵɵtextInterpolate(f_r23.DisplayName);
324
+ } }
325
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
326
+ i0.ɵɵelement(0, "i", 72);
327
+ i0.ɵɵtext(1, " Creating\u2026 ");
328
+ } }
329
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
330
+ i0.ɵɵelement(0, "i", 73);
331
+ i0.ɵɵtext(1, " Create ");
332
+ } }
333
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
334
+ const _r21 = i0.ɵɵgetCurrentView();
335
+ i0.ɵɵelementStart(0, "div", 63)(1, "div", 10)(2, "label", 11);
336
+ i0.ɵɵtext(3, "Document name");
337
+ i0.ɵɵelementEnd();
338
+ i0.ɵɵelementStart(4, "input", 66);
339
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityDocName, $event) || (ctx_r1.NewEntityDocName = $event); return i0.ɵɵresetView($event); });
340
+ i0.ɵɵelementEnd()();
341
+ i0.ɵɵelementStart(5, "div", 10)(6, "label", 11);
342
+ i0.ɵɵtext(7);
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(8, "div", 67);
345
+ i0.ɵɵrepeaterCreate(9, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template, 4, 2, "label", 68, _forTrack4);
346
+ i0.ɵɵelementEnd()();
347
+ i0.ɵɵelementStart(11, "div", 47)(12, "button", 69);
348
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CreateInlineEntityDocument()); });
349
+ i0.ɵɵconditionalCreate(13, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_13_Template, 2, 0)(14, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_14_Template, 2, 0);
350
+ i0.ɵɵelementEnd();
351
+ i0.ɵɵelementStart(15, "button", 70);
352
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CancelInlineEntityDocForm()); });
353
+ i0.ɵɵtext(16, "Cancel");
354
+ i0.ɵɵelementEnd()()();
355
+ } if (rf & 2) {
356
+ const ctx_r1 = i0.ɵɵnextContext(4);
357
+ i0.ɵɵadvance(4);
358
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityDocName);
359
+ i0.ɵɵadvance(3);
360
+ i0.ɵɵtextInterpolate1("Fields to include (", ctx_r1.SelectedEntityDocFieldCount, " selected)");
361
+ i0.ɵɵadvance(2);
362
+ i0.ɵɵrepeater(ctx_r1.SelectedEntityFields);
363
+ i0.ɵɵadvance(3);
364
+ i0.ɵɵproperty("disabled", ctx_r1.EntityDocSaving);
365
+ i0.ɵɵadvance();
366
+ i0.ɵɵconditional(ctx_r1.EntityDocSaving ? 13 : 14);
367
+ } }
368
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Template(rf, ctx) { if (rf & 1) {
369
+ i0.ɵɵelementStart(0, "div", 59)(1, "div", 60);
370
+ i0.ɵɵelement(2, "i", 61);
371
+ i0.ɵɵelementStart(3, "span")(4, "strong");
372
+ i0.ɵɵtext(5);
373
+ i0.ɵɵelementEnd();
374
+ i0.ɵɵtext(6, " has no Entity Document. One is required to classify its records.");
375
+ i0.ɵɵelementEnd()();
376
+ i0.ɵɵconditionalCreate(7, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template, 3, 0, "button", 62);
377
+ i0.ɵɵelementEnd();
378
+ i0.ɵɵconditionalCreate(8, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template, 17, 4, "div", 63);
379
+ } if (rf & 2) {
380
+ const ctx_r1 = i0.ɵɵnextContext(3);
381
+ i0.ɵɵadvance(5);
382
+ i0.ɵɵtextInterpolate(ctx_r1.SelectedEntityName);
383
+ i0.ɵɵadvance(2);
384
+ i0.ɵɵconditional(!ctx_r1.ShowInlineEntityDocForm ? 7 : -1);
385
+ i0.ɵɵadvance();
386
+ i0.ɵɵconditional(ctx_r1.ShowInlineEntityDocForm ? 8 : -1);
387
+ } }
388
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_37_Template(rf, ctx) { if (rf & 1) {
301
389
  i0.ɵɵelementStart(0, "option", 15);
302
390
  i0.ɵɵtext(1);
303
391
  i0.ɵɵelementEnd();
304
392
  } if (rf & 2) {
305
- const opt_r20 = ctx.$implicit;
306
- i0.ɵɵproperty("value", opt_r20.ID);
393
+ const opt_r24 = ctx.$implicit;
394
+ i0.ɵɵproperty("value", opt_r24.ID);
307
395
  i0.ɵɵadvance();
308
- i0.ɵɵtextInterpolate(opt_r20.Name);
396
+ i0.ɵɵtextInterpolate(opt_r24.Name);
309
397
  } }
310
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_52_Template(rf, ctx) { if (rf & 1) {
311
- const _r21 = i0.ɵɵgetCurrentView();
312
- i0.ɵɵelementStart(0, "div", 56);
313
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_52_Template_div_click_0_listener() { const m_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetMode(m_r22.value)); });
398
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template(rf, ctx) { if (rf & 1) {
399
+ const _r25 = i0.ɵɵgetCurrentView();
400
+ i0.ɵɵelementStart(0, "div", 74);
401
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template_div_click_0_listener() { const m_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetMode(m_r26.value)); });
314
402
  i0.ɵɵelement(1, "i");
315
- i0.ɵɵelementStart(2, "div", 57);
403
+ i0.ɵɵelementStart(2, "div", 75);
316
404
  i0.ɵɵtext(3);
317
405
  i0.ɵɵelementEnd();
318
- i0.ɵɵelementStart(4, "div", 58);
406
+ i0.ɵɵelementStart(4, "div", 76);
319
407
  i0.ɵɵtext(5);
320
408
  i0.ɵɵelementEnd()();
321
409
  } if (rf & 2) {
322
- const m_r22 = ctx.$implicit;
410
+ const m_r26 = ctx.$implicit;
323
411
  const ctx_r1 = i0.ɵɵnextContext(3);
324
- i0.ɵɵclassProp("selected", ctx_r1.CurrentMode === m_r22.value);
412
+ i0.ɵɵclassProp("selected", ctx_r1.CurrentMode === m_r26.value);
325
413
  i0.ɵɵadvance();
326
- i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", m_r22.icon, " cls-mode-ic"));
414
+ i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", m_r26.icon, " cls-mode-ic"));
327
415
  i0.ɵɵadvance(2);
328
- i0.ɵɵtextInterpolate(m_r22.label);
416
+ i0.ɵɵtextInterpolate(m_r26.label);
329
417
  i0.ɵɵadvance(2);
330
- i0.ɵɵtextInterpolate(m_r22.bestFor);
418
+ i0.ɵɵtextInterpolate(m_r26.bestFor);
331
419
  } }
332
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_60_Template(rf, ctx) { if (rf & 1) {
420
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_61_Template(rf, ctx) { if (rf & 1) {
333
421
  i0.ɵɵelementStart(0, "option", 15);
334
422
  i0.ɵɵtext(1);
335
423
  i0.ɵɵelementEnd();
336
424
  } if (rf & 2) {
337
- const opt_r23 = ctx.$implicit;
338
- i0.ɵɵproperty("value", opt_r23.ID);
425
+ const opt_r27 = ctx.$implicit;
426
+ i0.ɵɵproperty("value", opt_r27.ID);
339
427
  i0.ɵɵadvance();
340
- i0.ɵɵtextInterpolate(opt_r23.Name);
428
+ i0.ɵɵtextInterpolate(opt_r27.Name);
341
429
  } }
342
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_83_Template(rf, ctx) { if (rf & 1) {
430
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template(rf, ctx) { if (rf & 1) {
343
431
  i0.ɵɵelementStart(0, "div", 32);
344
- i0.ɵɵelement(1, "i", 59);
432
+ i0.ɵɵelement(1, "i", 77);
345
433
  i0.ɵɵtext(2);
346
434
  i0.ɵɵelementEnd();
347
435
  } if (rf & 2) {
@@ -349,59 +437,59 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
349
437
  i0.ɵɵadvance(2);
350
438
  i0.ɵɵtextInterpolate1(" ", ctx_r1.ThresholdValidationMessage);
351
439
  } }
352
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template(rf, ctx) { if (rf & 1) {
353
- i0.ɵɵelementStart(0, "div", 33)(1, "span", 60);
440
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_85_Template(rf, ctx) { if (rf & 1) {
441
+ i0.ɵɵelementStart(0, "div", 33)(1, "span", 78);
354
442
  i0.ɵɵtext(2, "reject / new");
355
443
  i0.ɵɵelementEnd();
356
- i0.ɵɵelementStart(3, "span", 61);
444
+ i0.ɵɵelementStart(3, "span", 79);
357
445
  i0.ɵɵtext(4, "review (inbox)");
358
446
  i0.ɵɵelementEnd();
359
- i0.ɵɵelementStart(5, "span", 62);
447
+ i0.ɵɵelementStart(5, "span", 80);
360
448
  i0.ɵɵtext(6, "auto-apply");
361
449
  i0.ɵɵelementEnd()();
362
450
  } }
363
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_99_For_4_Template(rf, ctx) { if (rf & 1) {
364
- i0.ɵɵelementStart(0, "div", 64)(1, "span", 65);
451
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_For_4_Template(rf, ctx) { if (rf & 1) {
452
+ i0.ɵɵelementStart(0, "div", 82)(1, "span", 83);
365
453
  i0.ɵɵtext(2);
366
454
  i0.ɵɵelementEnd();
367
- i0.ɵɵelementStart(3, "span", 66);
455
+ i0.ɵɵelementStart(3, "span", 84);
368
456
  i0.ɵɵtext(4);
369
- i0.ɵɵelementStart(5, "span", 67);
457
+ i0.ɵɵelementStart(5, "span", 85);
370
458
  i0.ɵɵtext(6);
371
459
  i0.ɵɵelementEnd()()();
372
460
  } if (rf & 2) {
373
- const row_r24 = ctx.$implicit;
461
+ const row_r28 = ctx.$implicit;
374
462
  i0.ɵɵadvance(2);
375
- i0.ɵɵtextInterpolate(row_r24.label);
463
+ i0.ɵɵtextInterpolate(row_r28.label);
376
464
  i0.ɵɵadvance(2);
377
- i0.ɵɵtextInterpolate1("", row_r24.value, " ");
465
+ i0.ɵɵtextInterpolate1("", row_r28.value, " ");
378
466
  i0.ɵɵadvance();
379
- i0.ɵɵclassProp("override", row_r24.origin === "source override");
467
+ i0.ɵɵclassProp("override", row_r28.origin === "source override");
380
468
  i0.ɵɵadvance();
381
- i0.ɵɵtextInterpolate(row_r24.origin);
469
+ i0.ɵɵtextInterpolate(row_r28.origin);
382
470
  } }
383
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_99_Template(rf, ctx) { if (rf & 1) {
384
- i0.ɵɵelementStart(0, "div", 39)(1, "h5", 63);
471
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_Template(rf, ctx) { if (rf & 1) {
472
+ i0.ɵɵelementStart(0, "div", 39)(1, "h5", 81);
385
473
  i0.ɵɵtext(2, "Effective values");
386
474
  i0.ɵɵelementEnd();
387
- i0.ɵɵrepeaterCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_99_For_4_Template, 7, 5, "div", 64, _forTrack4);
475
+ i0.ɵɵrepeaterCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_For_4_Template, 7, 5, "div", 82, _forTrack5);
388
476
  i0.ɵɵelementEnd();
389
477
  } if (rf & 2) {
390
478
  const ctx_r1 = i0.ɵɵnextContext(3);
391
479
  i0.ɵɵadvance(3);
392
480
  i0.ɵɵrepeater(ctx_r1.EffectiveValues);
393
481
  } }
394
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_135_Template(rf, ctx) { if (rf & 1) {
395
- const _r25 = i0.ɵɵgetCurrentView();
482
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template(rf, ctx) { if (rf & 1) {
483
+ const _r29 = i0.ɵɵgetCurrentView();
396
484
  i0.ɵɵelementStart(0, "div", 16)(1, "div", 8);
397
- i0.ɵɵelement(2, "i", 68);
485
+ i0.ɵɵelement(2, "i", 86);
398
486
  i0.ɵɵtext(3, " Crawl settings");
399
487
  i0.ɵɵelementEnd();
400
488
  i0.ɵɵelementStart(4, "div", 10)(5, "label", 11);
401
489
  i0.ɵɵtext(6, "Crawl depth");
402
490
  i0.ɵɵelementEnd();
403
- i0.ɵɵelementStart(7, "input", 69);
404
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_135_Template_input_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxDepth, $event) || (ctx_r1.FormMaxDepth = $event); return i0.ɵɵresetView($event); });
491
+ i0.ɵɵelementStart(7, "input", 87);
492
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxDepth, $event) || (ctx_r1.FormMaxDepth = $event); return i0.ɵɵresetView($event); });
405
493
  i0.ɵɵelementEnd();
406
494
  i0.ɵɵelementStart(8, "span", 19);
407
495
  i0.ɵɵtext(9, " Recursion ceiling for in-domain links. ");
@@ -414,16 +502,16 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
414
502
  i0.ɵɵelementEnd();
415
503
  i0.ɵɵtext(15, " (default) = root + sections + content pages. ");
416
504
  i0.ɵɵelementEnd()();
417
- i0.ɵɵelementStart(16, "div", 10)(17, "label", 11)(18, "input", 70);
418
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_135_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlSitesInLowerLevelDomain, $event) || (ctx_r1.FormCrawlSitesInLowerLevelDomain = $event); return i0.ɵɵresetView($event); });
505
+ i0.ɵɵelementStart(16, "div", 10)(17, "label", 11)(18, "input", 71);
506
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlSitesInLowerLevelDomain, $event) || (ctx_r1.FormCrawlSitesInLowerLevelDomain = $event); return i0.ɵɵresetView($event); });
419
507
  i0.ɵɵelementEnd();
420
508
  i0.ɵɵtext(19, " Crawl sites in lower-level domain ");
421
509
  i0.ɵɵelementEnd();
422
510
  i0.ɵɵelementStart(20, "span", 19);
423
511
  i0.ɵɵtext(21, "When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.");
424
512
  i0.ɵɵelementEnd()();
425
- i0.ɵɵelementStart(22, "div", 10)(23, "label", 11)(24, "input", 70);
426
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_135_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlOtherSitesInTopLevelDomain, $event) || (ctx_r1.FormCrawlOtherSitesInTopLevelDomain = $event); return i0.ɵɵresetView($event); });
513
+ i0.ɵɵelementStart(22, "div", 10)(23, "label", 11)(24, "input", 71);
514
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlOtherSitesInTopLevelDomain, $event) || (ctx_r1.FormCrawlOtherSitesInTopLevelDomain = $event); return i0.ɵɵresetView($event); });
427
515
  i0.ɵɵelementEnd();
428
516
  i0.ɵɵtext(25, " Crawl other sites in top-level domain ");
429
517
  i0.ɵɵelementEnd();
@@ -439,19 +527,19 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
439
527
  i0.ɵɵadvance(6);
440
528
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormCrawlOtherSitesInTopLevelDomain);
441
529
  } }
442
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_138_Template(rf, ctx) { if (rf & 1) {
443
- i0.ɵɵelement(0, "i", 71);
530
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_169_Template(rf, ctx) { if (rf & 1) {
531
+ i0.ɵɵelement(0, "i", 72);
444
532
  i0.ɵɵtext(1, " Saving... ");
445
533
  } }
446
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_139_Template(rf, ctx) { if (rf & 1) {
447
- i0.ɵɵelement(0, "i", 72);
534
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_170_Template(rf, ctx) { if (rf & 1) {
535
+ i0.ɵɵelement(0, "i", 73);
448
536
  i0.ɵɵtext(1, " Save ");
449
537
  } }
450
- function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_142_Template(rf, ctx) { if (rf & 1) {
451
- const _r26 = i0.ɵɵgetCurrentView();
452
- i0.ɵɵelementStart(0, "div", 47)(1, "a", 73);
453
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_142_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenAdvancedSourceSettings()); });
454
- i0.ɵɵelement(2, "i", 74);
538
+ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template(rf, ctx) { if (rf & 1) {
539
+ const _r30 = i0.ɵɵgetCurrentView();
540
+ i0.ɵɵelementStart(0, "div", 50)(1, "a", 88);
541
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenAdvancedSourceSettings()); });
542
+ i0.ɵɵelement(2, "i", 89);
455
543
  i0.ɵɵtext(3, " Open advanced settings \u2014 URL pattern, root URL, & full entity form ");
456
544
  i0.ɵɵelementEnd();
457
545
  i0.ɵɵelementStart(4, "span", 19);
@@ -482,163 +570,203 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
482
570
  i0.ɵɵelementEnd()();
483
571
  i0.ɵɵconditionalCreate(16, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_16_Template, 16, 2);
484
572
  i0.ɵɵrepeaterCreate(17, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Template, 1, 1, null, null, _forTrack1);
573
+ i0.ɵɵconditionalCreate(19, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Template, 9, 3);
485
574
  i0.ɵɵelementEnd();
486
- i0.ɵɵelementStart(19, "div", 16)(20, "div", 8);
487
- i0.ɵɵelement(21, "i", 17);
488
- i0.ɵɵtext(22, " Embedding & Vectors");
575
+ i0.ɵɵelementStart(20, "div", 16)(21, "div", 8);
576
+ i0.ɵɵelement(22, "i", 17);
577
+ i0.ɵɵtext(23, " Embedding & Vectors");
489
578
  i0.ɵɵelementEnd();
490
- i0.ɵɵelementStart(23, "div", 10)(24, "label", 11);
491
- i0.ɵɵtext(25, "Embedding Model Override");
579
+ i0.ɵɵelementStart(24, "div", 10)(25, "label", 11);
580
+ i0.ɵɵtext(26, "Embedding Model Override");
492
581
  i0.ɵɵelementEnd();
493
- i0.ɵɵelementStart(26, "mj-tree-dropdown", 18);
494
- i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_tree_dropdown_ValueChange_26_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormSourceEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
582
+ i0.ɵɵelementStart(27, "mj-tree-dropdown", 18);
583
+ i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_tree_dropdown_ValueChange_27_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormSourceEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
495
584
  i0.ɵɵelementEnd();
496
- i0.ɵɵelementStart(27, "span", 19);
497
- i0.ɵɵtext(28, "Overrides Content Type default");
585
+ i0.ɵɵelementStart(28, "span", 19);
586
+ i0.ɵɵtext(29, "Overrides Content Type default");
498
587
  i0.ɵɵelementEnd()();
499
- i0.ɵɵelementStart(29, "div", 10)(30, "label", 11);
500
- i0.ɵɵtext(31, "Vector Index Override");
588
+ i0.ɵɵelementStart(30, "div", 10)(31, "label", 11);
589
+ i0.ɵɵtext(32, "Vector Index Override");
501
590
  i0.ɵɵelementEnd();
502
- i0.ɵɵelementStart(32, "select", 13);
503
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceVectorIndexID, $event) || (ctx_r1.FormSourceVectorIndexID = $event); return i0.ɵɵresetView($event); });
504
- i0.ɵɵelementStart(33, "option", 14);
505
- i0.ɵɵtext(34, "Use system default");
591
+ i0.ɵɵelementStart(33, "select", 13);
592
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceVectorIndexID, $event) || (ctx_r1.FormSourceVectorIndexID = $event); return i0.ɵɵresetView($event); });
593
+ i0.ɵɵelementStart(34, "option", 14);
594
+ i0.ɵɵtext(35, "Use system default");
506
595
  i0.ɵɵelementEnd();
507
- i0.ɵɵrepeaterCreate(35, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_36_Template, 2, 2, "option", 15, _forTrack0);
596
+ i0.ɵɵrepeaterCreate(36, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_37_Template, 2, 2, "option", 15, _forTrack0);
508
597
  i0.ɵɵelementEnd();
509
- i0.ɵɵelementStart(37, "span", 19);
510
- i0.ɵɵtext(38, "Overrides Content Type default");
598
+ i0.ɵɵelementStart(38, "span", 19);
599
+ i0.ɵɵtext(39, "Overrides Content Type default");
511
600
  i0.ɵɵelementEnd()()();
512
- i0.ɵɵelementStart(39, "div", 16)(40, "div", 8);
513
- i0.ɵɵelement(41, "i", 20);
514
- i0.ɵɵtext(42, " Classification ");
515
- i0.ɵɵelementStart(43, "button", 21);
516
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_43_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleEffectiveValues()); });
517
- i0.ɵɵelement(44, "i", 22);
518
- i0.ɵɵtext(45);
601
+ i0.ɵɵelementStart(40, "div", 16)(41, "div", 8);
602
+ i0.ɵɵelement(42, "i", 20);
603
+ i0.ɵɵtext(43, " Classification ");
604
+ i0.ɵɵelementStart(44, "button", 21);
605
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_44_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleEffectiveValues()); });
606
+ i0.ɵɵelement(45, "i", 22);
607
+ i0.ɵɵtext(46);
519
608
  i0.ɵɵelementEnd()();
520
- i0.ɵɵelementStart(46, "div", 23)(47, "div", 10)(48, "label", 11);
521
- i0.ɵɵtext(49, "Taxonomy mode");
609
+ i0.ɵɵelementStart(47, "div", 23)(48, "div", 10)(49, "label", 11);
610
+ i0.ɵɵtext(50, "Taxonomy mode");
522
611
  i0.ɵɵelementEnd();
523
- i0.ɵɵelementStart(50, "div", 24);
524
- i0.ɵɵrepeaterCreate(51, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_52_Template, 6, 7, "div", 25, _forTrack2);
612
+ i0.ɵɵelementStart(51, "div", 24);
613
+ i0.ɵɵrepeaterCreate(52, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template, 6, 7, "div", 25, _forTrack2);
525
614
  i0.ɵɵelementEnd()();
526
- i0.ɵɵelementStart(53, "div", 10)(54, "label", 11);
527
- i0.ɵɵtext(55, "Tag root");
615
+ i0.ɵɵelementStart(54, "div", 10)(55, "label", 11);
616
+ i0.ɵɵtext(56, "Tag root");
528
617
  i0.ɵɵelementEnd();
529
- i0.ɵɵelementStart(56, "select", 13);
530
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_56_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.TagRootIDValue, $event) || (ctx_r1.TagRootIDValue = $event); return i0.ɵɵresetView($event); });
531
- i0.ɵɵelementStart(57, "option", 14);
532
- i0.ɵɵtext(58, "(none / whole taxonomy)");
618
+ i0.ɵɵelementStart(57, "select", 13);
619
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_57_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.TagRootIDValue, $event) || (ctx_r1.TagRootIDValue = $event); return i0.ɵɵresetView($event); });
620
+ i0.ɵɵelementStart(58, "option", 14);
621
+ i0.ɵɵtext(59, "(none / whole taxonomy)");
533
622
  i0.ɵɵelementEnd();
534
- i0.ɵɵrepeaterCreate(59, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_60_Template, 2, 2, "option", 15, _forTrack0);
623
+ i0.ɵɵrepeaterCreate(60, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_61_Template, 2, 2, "option", 15, _forTrack0);
535
624
  i0.ɵɵelementEnd();
536
- i0.ɵɵelementStart(61, "span", 19);
537
- i0.ɵɵtext(62, "Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.");
625
+ i0.ɵɵelementStart(62, "span", 19);
626
+ i0.ɵɵtext(63, "Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.");
538
627
  i0.ɵɵelementEnd()();
539
- i0.ɵɵelementStart(63, "div", 10)(64, "label", 11);
540
- i0.ɵɵtext(65, "Confidence thresholds");
541
- i0.ɵɵelementEnd();
542
- i0.ɵɵelementStart(66, "div", 26)(67, "div", 27)(68, "div", 28)(69, "span", 29);
543
- i0.ɵɵtext(70, "Match (auto-apply) ");
544
- i0.ɵɵelementStart(71, "strong");
545
- i0.ɵɵtext(72);
546
- i0.ɵɵpipe(73, "number");
628
+ i0.ɵɵelementStart(64, "div", 10)(65, "label", 11);
629
+ i0.ɵɵtext(66, "Confidence thresholds");
630
+ i0.ɵɵelementEnd();
631
+ i0.ɵɵelementStart(67, "div", 26)(68, "div", 27)(69, "div", 28)(70, "span", 29);
632
+ i0.ɵɵtext(71, "Match (auto-apply) ");
633
+ i0.ɵɵelementStart(72, "strong");
634
+ i0.ɵɵtext(73);
635
+ i0.ɵɵpipe(74, "number");
547
636
  i0.ɵɵelementEnd()();
548
- i0.ɵɵelementStart(74, "input", 30);
549
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_74_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MatchThresholdValue = $event); });
637
+ i0.ɵɵelementStart(75, "input", 30);
638
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_75_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MatchThresholdValue = $event); });
550
639
  i0.ɵɵelementEnd()();
551
- i0.ɵɵelementStart(75, "div", 28)(76, "span", 29);
552
- i0.ɵɵtext(77, "Suggest (route to inbox) ");
553
- i0.ɵɵelementStart(78, "strong");
554
- i0.ɵɵtext(79);
555
- i0.ɵɵpipe(80, "number");
640
+ i0.ɵɵelementStart(76, "div", 28)(77, "span", 29);
641
+ i0.ɵɵtext(78, "Suggest (route to inbox) ");
642
+ i0.ɵɵelementStart(79, "strong");
643
+ i0.ɵɵtext(80);
644
+ i0.ɵɵpipe(81, "number");
556
645
  i0.ɵɵelementEnd()();
557
- i0.ɵɵelementStart(81, "input", 30);
558
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_81_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SuggestThresholdValue = $event); });
646
+ i0.ɵɵelementStart(82, "input", 30);
647
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_82_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SuggestThresholdValue = $event); });
559
648
  i0.ɵɵelementEnd()()();
560
- i0.ɵɵelement(82, "div", 31);
561
- i0.ɵɵconditionalCreate(83, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_83_Template, 3, 1, "div", 32)(84, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template, 7, 0, "div", 33);
649
+ i0.ɵɵelement(83, "div", 31);
650
+ i0.ɵɵconditionalCreate(84, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template, 3, 1, "div", 32)(85, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_85_Template, 7, 0, "div", 33);
562
651
  i0.ɵɵelementEnd()();
563
- i0.ɵɵelementStart(85, "div", 34)(86, "div", 35)(87, "span", 36);
564
- i0.ɵɵtext(88, "Share full taxonomy with the LLM");
652
+ i0.ɵɵelementStart(86, "div", 34)(87, "div", 35)(88, "span", 36);
653
+ i0.ɵɵtext(89, "Share full taxonomy with the LLM");
565
654
  i0.ɵɵelementEnd();
566
- i0.ɵɵelementStart(89, "span", 37);
567
- i0.ɵɵtext(90, "When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.");
655
+ i0.ɵɵelementStart(90, "span", 37);
656
+ i0.ɵɵtext(91, "When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.");
568
657
  i0.ɵɵelementEnd()();
569
- i0.ɵɵelementStart(91, "mj-switch", 38);
570
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_91_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ShareTaxonomyValue, $event) || (ctx_r1.ShareTaxonomyValue = $event); return i0.ɵɵresetView($event); });
658
+ i0.ɵɵelementStart(92, "mj-switch", 38);
659
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_92_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ShareTaxonomyValue, $event) || (ctx_r1.ShareTaxonomyValue = $event); return i0.ɵɵresetView($event); });
571
660
  i0.ɵɵelementEnd()();
572
- i0.ɵɵelementStart(92, "div", 34)(93, "div", 35)(94, "span", 36);
573
- i0.ɵɵtext(95, "Vectorize new content");
661
+ i0.ɵɵelementStart(93, "div", 34)(94, "div", 35)(95, "span", 36);
662
+ i0.ɵɵtext(96, "Vectorize new content");
574
663
  i0.ɵɵelementEnd();
575
- i0.ɵɵelementStart(96, "span", 37);
576
- i0.ɵɵtext(97, "When off, this source skips vectorization (the classifier still runs).");
664
+ i0.ɵɵelementStart(97, "span", 37);
665
+ i0.ɵɵtext(98, "When off, this source skips vectorization (the classifier still runs).");
577
666
  i0.ɵɵelementEnd()();
578
- i0.ɵɵelementStart(98, "mj-switch", 38);
579
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_98_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EnableVectorizationValue, $event) || (ctx_r1.EnableVectorizationValue = $event); return i0.ɵɵresetView($event); });
667
+ i0.ɵɵelementStart(99, "mj-switch", 38);
668
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_99_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EnableVectorizationValue, $event) || (ctx_r1.EnableVectorizationValue = $event); return i0.ɵɵresetView($event); });
580
669
  i0.ɵɵelementEnd()()();
581
- i0.ɵɵconditionalCreate(99, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_99_Template, 5, 0, "div", 39);
670
+ i0.ɵɵconditionalCreate(100, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_Template, 5, 0, "div", 39);
671
+ i0.ɵɵelementEnd();
672
+ i0.ɵɵelementStart(101, "div", 16)(102, "div", 8);
673
+ i0.ɵɵelement(103, "i", 40);
674
+ i0.ɵɵtext(104, " Domain context");
675
+ i0.ɵɵelementEnd();
676
+ i0.ɵɵelementStart(105, "div", 10)(106, "label", 11);
677
+ i0.ɵɵtext(107, "Source guidance");
678
+ i0.ɵɵelementEnd();
679
+ i0.ɵɵelementStart(108, "textarea", 41);
680
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_textarea_ngModelChange_108_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ClassificationContextValue = $event); });
681
+ i0.ɵɵelementEnd();
682
+ i0.ɵɵelementStart(109, "span", 19);
683
+ i0.ɵɵtext(110, "Injected into the autotagging prompt at the source scope.");
684
+ i0.ɵɵelementEnd()();
685
+ i0.ɵɵelementStart(111, "div", 34)(112, "div", 35)(113, "span", 36);
686
+ i0.ɵɵtext(114, "Substitutive mode");
687
+ i0.ɵɵelementEnd();
688
+ i0.ɵɵelementStart(115, "span", 37);
689
+ i0.ɵɵtext(116, "When on, this source's guidance ");
690
+ i0.ɵɵelementStart(117, "em");
691
+ i0.ɵɵtext(118, "replaces");
692
+ i0.ɵɵelementEnd();
693
+ i0.ɵɵtext(119, " the org/content-type context. When off (default), it's ");
694
+ i0.ɵɵelementStart(120, "em");
695
+ i0.ɵɵtext(121, "added");
696
+ i0.ɵɵelementEnd();
697
+ i0.ɵɵtext(122, " to them.");
698
+ i0.ɵɵelementEnd()();
699
+ i0.ɵɵelementStart(123, "mj-switch", 38);
700
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_123_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.IsSubstitutiveMode, $event) || (ctx_r1.IsSubstitutiveMode = $event); return i0.ɵɵresetView($event); });
701
+ i0.ɵɵelementEnd()();
702
+ i0.ɵɵelementStart(124, "div", 10)(125, "label", 11);
703
+ i0.ɵɵtext(126, "Effective context preview");
704
+ i0.ɵɵelementEnd();
705
+ i0.ɵɵelementStart(127, "pre", 42);
706
+ i0.ɵɵtext(128);
582
707
  i0.ɵɵelementEnd();
583
- i0.ɵɵelementStart(100, "div", 16)(101, "div", 8);
584
- i0.ɵɵelement(102, "i", 40);
585
- i0.ɵɵtext(103, " Run budgets");
708
+ i0.ɵɵelementStart(129, "span", 19);
709
+ i0.ɵɵtext(130, "Org + source scopes shown. Content-type scope (if any) is also merged at run time.");
710
+ i0.ɵɵelementEnd()()();
711
+ i0.ɵɵelementStart(131, "div", 16)(132, "div", 8);
712
+ i0.ɵɵelement(133, "i", 43);
713
+ i0.ɵɵtext(134, " Run budgets");
586
714
  i0.ɵɵelementEnd();
587
- i0.ɵɵelementStart(104, "div", 10)(105, "label", 11);
588
- i0.ɵɵtext(106, "Max items per run");
715
+ i0.ɵɵelementStart(135, "div", 10)(136, "label", 11);
716
+ i0.ɵɵtext(137, "Max items per run");
589
717
  i0.ɵɵelementEnd();
590
- i0.ɵɵelementStart(107, "input", 41);
591
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_107_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxItemsPerRun, $event) || (ctx_r1.FormMaxItemsPerRun = $event); return i0.ɵɵresetView($event); });
718
+ i0.ɵɵelementStart(138, "input", 44);
719
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_138_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxItemsPerRun, $event) || (ctx_r1.FormMaxItemsPerRun = $event); return i0.ɵɵresetView($event); });
592
720
  i0.ɵɵelementEnd();
593
- i0.ɵɵelementStart(108, "span", 19);
594
- i0.ɵɵtext(109, " Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count. Paused work resumes on the next run. ");
721
+ i0.ɵɵelementStart(139, "span", 19);
722
+ i0.ɵɵtext(140, " Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count. Paused work resumes on the next run. ");
595
723
  i0.ɵɵelementEnd()();
596
- i0.ɵɵelementStart(110, "div", 42)(111, "div", 10)(112, "label", 11);
597
- i0.ɵɵtext(113, "Max new tags / run");
724
+ i0.ɵɵelementStart(141, "div", 45)(142, "div", 10)(143, "label", 11);
725
+ i0.ɵɵtext(144, "Max new tags / run");
598
726
  i0.ɵɵelementEnd();
599
- i0.ɵɵelementStart(114, "input", 41);
600
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_114_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerRunValue = $event); });
727
+ i0.ɵɵelementStart(145, "input", 44);
728
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_145_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerRunValue = $event); });
601
729
  i0.ɵɵelementEnd();
602
- i0.ɵɵelementStart(115, "span", 19);
603
- i0.ɵɵtext(116, "across all items");
730
+ i0.ɵɵelementStart(146, "span", 19);
731
+ i0.ɵɵtext(147, "across all items");
604
732
  i0.ɵɵelementEnd()();
605
- i0.ɵɵelementStart(117, "div", 10)(118, "label", 11);
606
- i0.ɵɵtext(119, "Max new tags / item");
733
+ i0.ɵɵelementStart(148, "div", 10)(149, "label", 11);
734
+ i0.ɵɵtext(150, "Max new tags / item");
607
735
  i0.ɵɵelementEnd();
608
- i0.ɵɵelementStart(120, "input", 41);
609
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_120_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerItemValue = $event); });
736
+ i0.ɵɵelementStart(151, "input", 44);
737
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_151_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerItemValue = $event); });
610
738
  i0.ɵɵelementEnd();
611
- i0.ɵɵelementStart(121, "span", 19);
612
- i0.ɵɵtext(122, "extras \u2192 suggestions");
739
+ i0.ɵɵelementStart(152, "span", 19);
740
+ i0.ɵɵtext(153, "extras \u2192 suggestions");
613
741
  i0.ɵɵelementEnd()();
614
- i0.ɵɵelementStart(123, "div", 10)(124, "label", 11);
615
- i0.ɵɵtext(125, "Max tokens / run");
742
+ i0.ɵɵelementStart(154, "div", 10)(155, "label", 11);
743
+ i0.ɵɵtext(156, "Max tokens / run");
616
744
  i0.ɵɵelementEnd();
617
- i0.ɵɵelementStart(126, "input", 41);
618
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_126_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxTokensPerRunValue = $event); });
745
+ i0.ɵɵelementStart(157, "input", 44);
746
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_157_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxTokensPerRunValue = $event); });
619
747
  i0.ɵɵelementEnd();
620
- i0.ɵɵelementStart(127, "span", 19);
621
- i0.ɵɵtext(128, "across all LLM calls");
748
+ i0.ɵɵelementStart(158, "span", 19);
749
+ i0.ɵɵtext(159, "across all LLM calls");
622
750
  i0.ɵɵelementEnd()();
623
- i0.ɵɵelementStart(129, "div", 10)(130, "label", 11);
624
- i0.ɵɵtext(131, "Max cost / run (USD)");
751
+ i0.ɵɵelementStart(160, "div", 10)(161, "label", 11);
752
+ i0.ɵɵtext(162, "Max cost / run (USD)");
625
753
  i0.ɵɵelementEnd();
626
- i0.ɵɵelementStart(132, "input", 43);
627
- i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_132_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxCostPerRunValue = $event); });
754
+ i0.ɵɵelementStart(163, "input", 46);
755
+ i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_163_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxCostPerRunValue = $event); });
628
756
  i0.ɵɵelementEnd();
629
- i0.ɵɵelementStart(133, "span", 19);
630
- i0.ɵɵtext(134, "$ stops the run");
757
+ i0.ɵɵelementStart(164, "span", 19);
758
+ i0.ɵɵtext(165, "$ stops the run");
631
759
  i0.ɵɵelementEnd()()()();
632
- i0.ɵɵconditionalCreate(135, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_135_Template, 28, 3, "div", 16);
633
- i0.ɵɵelementStart(136, "div", 44)(137, "button", 45);
634
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_137_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveSource()); });
635
- i0.ɵɵconditionalCreate(138, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_138_Template, 2, 0)(139, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_139_Template, 2, 0);
636
- i0.ɵɵelementEnd();
637
- i0.ɵɵelementStart(140, "button", 46);
638
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_140_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
639
- i0.ɵɵtext(141, "Cancel");
760
+ i0.ɵɵconditionalCreate(166, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template, 28, 3, "div", 16);
761
+ i0.ɵɵelementStart(167, "div", 47)(168, "button", 48);
762
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_168_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveSource()); });
763
+ i0.ɵɵconditionalCreate(169, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_169_Template, 2, 0)(170, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_170_Template, 2, 0);
764
+ i0.ɵɵelementEnd();
765
+ i0.ɵɵelementStart(171, "button", 49);
766
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_171_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
767
+ i0.ɵɵtext(172, "Cancel");
640
768
  i0.ɵɵelementEnd()();
641
- i0.ɵɵconditionalCreate(142, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_142_Template, 6, 0, "div", 47);
769
+ i0.ɵɵconditionalCreate(173, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template, 6, 0, "div", 50);
642
770
  } if (rf & 2) {
643
771
  const ctx_r1 = i0.ɵɵnextContext(2);
644
772
  i0.ɵɵadvance(7);
@@ -651,7 +779,9 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
651
779
  i0.ɵɵconditional(ctx_r1.SelectedSourceTypeRequiresContentType ? 16 : -1);
652
780
  i0.ɵɵadvance();
653
781
  i0.ɵɵrepeater(ctx_r1.SelectedSourceTypeFields);
654
- i0.ɵɵadvance(9);
782
+ i0.ɵɵadvance(2);
783
+ i0.ɵɵconditional(ctx_r1.SelectedEntityHasNoDocument ? 19 : -1);
784
+ i0.ɵɵadvance(8);
655
785
  i0.ɵɵproperty("BranchConfig", ctx_r1.EmbeddingVendorBranch)("LeafConfig", ctx_r1.EmbeddingModelsLeaf)("Clearable", true)("Value", ctx_r1.ToCompositeKey(ctx_r1.FormSourceEmbeddingModelID));
656
786
  i0.ɵɵadvance(6);
657
787
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormSourceVectorIndexID);
@@ -668,22 +798,28 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
668
798
  i0.ɵɵadvance(3);
669
799
  i0.ɵɵrepeater(ctx_r1.TagRootOptions);
670
800
  i0.ɵɵadvance(13);
671
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(73, 31, ctx_r1.MatchThresholdValue, "1.2-2"));
801
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(74, 35, ctx_r1.MatchThresholdValue, "1.2-2"));
672
802
  i0.ɵɵadvance(2);
673
803
  i0.ɵɵproperty("ngModel", ctx_r1.MatchThresholdValue);
674
804
  i0.ɵɵadvance(5);
675
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(80, 34, ctx_r1.SuggestThresholdValue, "1.2-2"));
805
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(81, 38, ctx_r1.SuggestThresholdValue, "1.2-2"));
676
806
  i0.ɵɵadvance(2);
677
807
  i0.ɵɵproperty("ngModel", ctx_r1.SuggestThresholdValue);
678
808
  i0.ɵɵadvance(2);
679
- i0.ɵɵconditional(ctx_r1.ThresholdValidationMessage ? 83 : 84);
809
+ i0.ɵɵconditional(ctx_r1.ThresholdValidationMessage ? 84 : 85);
680
810
  i0.ɵɵadvance(8);
681
811
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ShareTaxonomyValue);
682
812
  i0.ɵɵadvance(7);
683
813
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EnableVectorizationValue);
684
814
  i0.ɵɵadvance();
685
- i0.ɵɵconditional(ctx_r1.ShowEffectiveValues ? 99 : -1);
815
+ i0.ɵɵconditional(ctx_r1.ShowEffectiveValues ? 100 : -1);
686
816
  i0.ɵɵadvance(8);
817
+ i0.ɵɵproperty("ngModel", ctx_r1.ClassificationContextValue);
818
+ i0.ɵɵadvance(15);
819
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.IsSubstitutiveMode);
820
+ i0.ɵɵadvance(5);
821
+ i0.ɵɵtextInterpolate(ctx_r1.EffectiveContextPreview);
822
+ i0.ɵɵadvance(10);
687
823
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormMaxItemsPerRun);
688
824
  i0.ɵɵadvance(7);
689
825
  i0.ɵɵproperty("ngModel", ctx_r1.MaxNewTagsPerRunValue ?? "");
@@ -694,86 +830,86 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
694
830
  i0.ɵɵadvance(6);
695
831
  i0.ɵɵproperty("ngModel", ctx_r1.MaxCostPerRunValue ?? "");
696
832
  i0.ɵɵadvance(3);
697
- i0.ɵɵconditional(ctx_r1.IsWebsiteSourceTypeSelected ? 135 : -1);
833
+ i0.ɵɵconditional(ctx_r1.IsWebsiteSourceTypeSelected ? 166 : -1);
698
834
  i0.ɵɵadvance(2);
699
835
  i0.ɵɵproperty("disabled", ctx_r1.FormSaving);
700
836
  i0.ɵɵadvance();
701
- i0.ɵɵconditional(ctx_r1.FormSaving ? 138 : 139);
837
+ i0.ɵɵconditional(ctx_r1.FormSaving ? 169 : 170);
702
838
  i0.ɵɵadvance(4);
703
- i0.ɵɵconditional(ctx_r1.FormMode === "edit-source" && ctx_r1.EditingSourceID ? 142 : -1);
839
+ i0.ɵɵconditional(ctx_r1.FormMode === "edit-source" && ctx_r1.EditingSourceID ? 173 : -1);
704
840
  } }
705
841
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_For_32_Template(rf, ctx) { if (rf & 1) {
706
842
  i0.ɵɵelementStart(0, "option", 15);
707
843
  i0.ɵɵtext(1);
708
844
  i0.ɵɵelementEnd();
709
845
  } if (rf & 2) {
710
- const opt_r28 = ctx.$implicit;
711
- i0.ɵɵproperty("value", opt_r28.ID);
846
+ const opt_r32 = ctx.$implicit;
847
+ i0.ɵɵproperty("value", opt_r32.ID);
712
848
  i0.ɵɵadvance();
713
- i0.ɵɵtextInterpolate(opt_r28.Name);
849
+ i0.ɵɵtextInterpolate(opt_r32.Name);
714
850
  } }
715
851
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_35_Template(rf, ctx) { if (rf & 1) {
716
- i0.ɵɵelement(0, "i", 71);
852
+ i0.ɵɵelement(0, "i", 72);
717
853
  i0.ɵɵtext(1, " Saving... ");
718
854
  } }
719
855
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_36_Template(rf, ctx) { if (rf & 1) {
720
- i0.ɵɵelement(0, "i", 72);
856
+ i0.ɵɵelement(0, "i", 73);
721
857
  i0.ɵɵtext(1, " Save ");
722
858
  } }
723
859
  function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
724
- const _r27 = i0.ɵɵgetCurrentView();
860
+ const _r31 = i0.ɵɵgetCurrentView();
725
861
  i0.ɵɵelementStart(0, "div", 10)(1, "label", 11);
726
862
  i0.ɵɵtext(2, "Name");
727
863
  i0.ɵɵelementEnd();
728
- i0.ɵɵelementStart(3, "input", 75);
729
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeName, $event) || (ctx_r1.FormTypeName = $event); return i0.ɵɵresetView($event); });
864
+ i0.ɵɵelementStart(3, "input", 90);
865
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeName, $event) || (ctx_r1.FormTypeName = $event); return i0.ɵɵresetView($event); });
730
866
  i0.ɵɵelementEnd()();
731
867
  i0.ɵɵelementStart(4, "div", 10)(5, "label", 11);
732
868
  i0.ɵɵtext(6, "Description");
733
869
  i0.ɵɵelementEnd();
734
- i0.ɵɵelementStart(7, "textarea", 76);
735
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeDescription, $event) || (ctx_r1.FormTypeDescription = $event); return i0.ɵɵresetView($event); });
870
+ i0.ɵɵelementStart(7, "textarea", 91);
871
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeDescription, $event) || (ctx_r1.FormTypeDescription = $event); return i0.ɵɵresetView($event); });
736
872
  i0.ɵɵelementEnd()();
737
873
  i0.ɵɵelementStart(8, "div", 10)(9, "label", 11);
738
874
  i0.ɵɵtext(10, "AI Model (for tagging)");
739
875
  i0.ɵɵelementEnd();
740
- i0.ɵɵelementStart(11, "mj-tree-dropdown", 77);
741
- i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_11_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeAIModelID = ctx_r1.FromCompositeKey($event)); });
876
+ i0.ɵɵelementStart(11, "mj-tree-dropdown", 92);
877
+ i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_11_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeAIModelID = ctx_r1.FromCompositeKey($event)); });
742
878
  i0.ɵɵelementEnd()();
743
- i0.ɵɵelementStart(12, "div", 78)(13, "div", 79)(14, "label", 11);
879
+ i0.ɵɵelementStart(12, "div", 93)(13, "div", 94)(14, "label", 11);
744
880
  i0.ɵɵtext(15, "Min Tags");
745
881
  i0.ɵɵelementEnd();
746
- i0.ɵɵelementStart(16, "input", 80);
747
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMinTags, $event) || (ctx_r1.FormTypeMinTags = $event); return i0.ɵɵresetView($event); });
882
+ i0.ɵɵelementStart(16, "input", 95);
883
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMinTags, $event) || (ctx_r1.FormTypeMinTags = $event); return i0.ɵɵresetView($event); });
748
884
  i0.ɵɵelementEnd()();
749
- i0.ɵɵelementStart(17, "div", 79)(18, "label", 11);
885
+ i0.ɵɵelementStart(17, "div", 94)(18, "label", 11);
750
886
  i0.ɵɵtext(19, "Max Tags");
751
887
  i0.ɵɵelementEnd();
752
- i0.ɵɵelementStart(20, "input", 81);
753
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMaxTags, $event) || (ctx_r1.FormTypeMaxTags = $event); return i0.ɵɵresetView($event); });
888
+ i0.ɵɵelementStart(20, "input", 96);
889
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMaxTags, $event) || (ctx_r1.FormTypeMaxTags = $event); return i0.ɵɵresetView($event); });
754
890
  i0.ɵɵelementEnd()()();
755
891
  i0.ɵɵelementStart(21, "div", 10)(22, "label", 11);
756
892
  i0.ɵɵtext(23, "Embedding Model");
757
893
  i0.ɵɵelementEnd();
758
894
  i0.ɵɵelementStart(24, "mj-tree-dropdown", 18);
759
- i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_24_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
895
+ i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_24_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
760
896
  i0.ɵɵelementEnd()();
761
897
  i0.ɵɵelementStart(25, "div", 10)(26, "label", 11);
762
898
  i0.ɵɵtext(27, "Vector Index");
763
899
  i0.ɵɵelementEnd();
764
900
  i0.ɵɵelementStart(28, "select", 13);
765
- i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeVectorIndexID, $event) || (ctx_r1.FormTypeVectorIndexID = $event); return i0.ɵɵresetView($event); });
901
+ i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeVectorIndexID, $event) || (ctx_r1.FormTypeVectorIndexID = $event); return i0.ɵɵresetView($event); });
766
902
  i0.ɵɵelementStart(29, "option", 14);
767
903
  i0.ɵɵtext(30, "Use system default");
768
904
  i0.ɵɵelementEnd();
769
905
  i0.ɵɵrepeaterCreate(31, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_For_32_Template, 2, 2, "option", 15, _forTrack0);
770
906
  i0.ɵɵelementEnd()();
771
- i0.ɵɵelementStart(33, "div", 44)(34, "button", 45);
772
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveContentType()); });
907
+ i0.ɵɵelementStart(33, "div", 47)(34, "button", 48);
908
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveContentType()); });
773
909
  i0.ɵɵconditionalCreate(35, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_35_Template, 2, 0)(36, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_36_Template, 2, 0);
774
910
  i0.ɵɵelementEnd();
775
- i0.ɵɵelementStart(37, "button", 46);
776
- i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_37_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
911
+ i0.ɵɵelementStart(37, "button", 49);
912
+ i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_37_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
777
913
  i0.ɵɵtext(38, "Cancel");
778
914
  i0.ɵɵelementEnd()();
779
915
  } if (rf & 2) {
@@ -815,7 +951,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Template(rf, ctx) {
815
951
  i0.ɵɵelement(10, "i", 5);
816
952
  i0.ɵɵelementEnd()();
817
953
  i0.ɵɵelementStart(11, "div", 6);
818
- i0.ɵɵconditionalCreate(12, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template, 143, 37);
954
+ i0.ɵɵconditionalCreate(12, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template, 174, 41);
819
955
  i0.ɵɵconditionalCreate(13, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template, 39, 15);
820
956
  i0.ɵɵelementEnd()();
821
957
  } if (rf & 2) {
@@ -829,6 +965,14 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Template(rf, ctx) {
829
965
  i0.ɵɵadvance();
830
966
  i0.ɵɵconditional(ctx_r1.FormMode === "add-type" || ctx_r1.FormMode === "edit-type" ? 13 : -1);
831
967
  } }
968
+ /**
969
+ * Application name used to resolve the Knowledge Hub Application ID for the
970
+ * org-level classification-context ApplicationSetting. Mirrors the server-side
971
+ * `KNOWLEDGE_HUB_APPLICATION_NAME` constant.
972
+ */
973
+ export const KNOWLEDGE_HUB_APPLICATION_NAME = 'Knowledge Hub';
974
+ /** ApplicationSetting key under which the org-level classification context lives. */
975
+ export const CLASSIFY_ORG_CONTEXT_SETTING_KEY = 'classify.org.context';
832
976
  /** Default classifier knob values — mirrors the autotagger's runtime defaults + the reference panel. */
833
977
  const DEFAULT_TAXONOMY_MODE = 'auto-grow';
834
978
  const DEFAULT_MATCH_THRESHOLD = 0.85;
@@ -883,6 +1027,18 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
883
1027
  // Entity source fields (shown when source type is "Entity")
884
1028
  FormSourceEntityID = '';
885
1029
  FormSourceEntityDocID = '';
1030
+ // ── Inline Entity Document creation ──────────────────────────────────────
1031
+ // When the selected Entity-type source's entity has no Entity Document, the
1032
+ // form shows a callout + an inline create sub-form so the operator doesn't
1033
+ // have to leave the wizard to set one up.
1034
+ /** Whether the inline "Create Entity Document" sub-form is expanded. */
1035
+ ShowInlineEntityDocForm = false;
1036
+ /** Saving spinner for the inline Entity Document create. */
1037
+ EntityDocSaving = false;
1038
+ /** Name for the new Entity Document (auto-filled from the entity). */
1039
+ NewEntityDocName = '';
1040
+ /** Selected field names to include in the new Entity Document template. */
1041
+ NewEntityDocSelectedFields = {};
886
1042
  // Embedding model + vector index form fields (Content Source overrides)
887
1043
  FormSourceEmbeddingModelID = '';
888
1044
  FormSourceVectorIndexID = '';
@@ -983,6 +1139,67 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
983
1139
  set EnableVectorizationValue(v) {
984
1140
  this.setConfig({ EnableVectorization: v });
985
1141
  }
1142
+ // ── Domain context (source scope) ──────────────────────────────────────
1143
+ // Free-text guidance + combine mode persisted into the source Configuration
1144
+ // JSON. The server-side ClassificationContextResolver reads these and combines
1145
+ // them with the org-level and content-type-level scopes when autotagging runs.
1146
+ /** Source-level domain-context free text. */
1147
+ get ClassificationContextValue() {
1148
+ return this.Config.ClassificationContext ?? '';
1149
+ }
1150
+ set ClassificationContextValue(v) {
1151
+ const trimmed = (v ?? '').length > 0 ? v : undefined;
1152
+ this.setConfig({ ClassificationContext: trimmed });
1153
+ this.cdr.detectChanges();
1154
+ }
1155
+ /** Whether this source's context is additive (concatenated) or substitutive (most-specific wins). */
1156
+ get ClassificationContextModeValue() {
1157
+ return this.Config.ClassificationContextMode === 'substitutive' ? 'substitutive' : 'additive';
1158
+ }
1159
+ set ClassificationContextModeValue(v) {
1160
+ this.setConfig({ ClassificationContextMode: v });
1161
+ this.cdr.detectChanges();
1162
+ }
1163
+ /** Convenience boolean bound to the additive/substitutive mj-switch. On = substitutive. */
1164
+ get IsSubstitutiveMode() {
1165
+ return this.ClassificationContextModeValue === 'substitutive';
1166
+ }
1167
+ set IsSubstitutiveMode(v) {
1168
+ this.ClassificationContextModeValue = v ? 'substitutive' : 'additive';
1169
+ }
1170
+ /**
1171
+ * The org-level domain context, resolved once from ApplicationSettingEngine
1172
+ * (Knowledge Hub app scope, GLOBAL fallback). Read-only here — the org editor
1173
+ * lives on the Content Types tab. Used for the effective-context preview.
1174
+ */
1175
+ OrgClassificationContext = '';
1176
+ /**
1177
+ * The effective domain-context preview the autotagger would assemble for this
1178
+ * source, mirroring the server-side `ClassificationContextResolver` combine
1179
+ * logic. Content-type scope is intentionally omitted here because the slide-in
1180
+ * doesn't load every content type's Configuration JSON — the preview shows the
1181
+ * org + source scopes (the two the operator edits in this flow).
1182
+ */
1183
+ get EffectiveContextPreview() {
1184
+ const org = this.cleanContext(this.OrgClassificationContext);
1185
+ const source = this.cleanContext(this.Config.ClassificationContext);
1186
+ if (this.ClassificationContextModeValue === 'substitutive') {
1187
+ return source ?? org ?? '(no domain context set)';
1188
+ }
1189
+ const parts = [];
1190
+ if (org)
1191
+ parts.push(`Organization context:\n${org}`);
1192
+ if (source)
1193
+ parts.push(`Source context:\n${source}`);
1194
+ return parts.length > 0 ? parts.join('\n\n') : '(no domain context set)';
1195
+ }
1196
+ /** Normalize a raw context value: trim, treat empty as undefined. */
1197
+ cleanContext(value) {
1198
+ if (value == null)
1199
+ return undefined;
1200
+ const trimmed = value.trim();
1201
+ return trimmed.length > 0 ? trimmed : undefined;
1202
+ }
986
1203
  // Budgets (blank = unlimited → key stripped from JSON)
987
1204
  get MaxNewTagsPerRunValue() {
988
1205
  return this.Config.MaxNewTagsPerRun ?? null;
@@ -1118,6 +1335,138 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1118
1335
  return [];
1119
1336
  }
1120
1337
  }
1338
+ // ════════════════════════════════════════════
1339
+ // INLINE ENTITY DOCUMENT CREATION
1340
+ // ════════════════════════════════════════════
1341
+ /**
1342
+ * The entity ID currently selected for an Entity-type source. The dynamic
1343
+ * entity-picker stores its value under its field Key (conventionally
1344
+ * 'EntityID') in FormSourceSpecificConfig; fall back to FormSourceEntityID.
1345
+ */
1346
+ get SelectedEntityID() {
1347
+ const fromDynamic = this.FormSourceSpecificConfig['EntityID'];
1348
+ return fromDynamic || this.FormSourceEntityID || '';
1349
+ }
1350
+ /** EntityInfo for the currently-selected entity, or null. */
1351
+ get selectedEntityInfo() {
1352
+ if (!this.SelectedEntityID)
1353
+ return null;
1354
+ return this.ProviderToUse.Entities.find(e => UUIDsEqual(e.ID, this.SelectedEntityID)) ?? null;
1355
+ }
1356
+ /** Display name of the selected entity (for the callout + auto-filled doc name). */
1357
+ get SelectedEntityName() {
1358
+ return this.selectedEntityInfo?.Name ?? '';
1359
+ }
1360
+ /**
1361
+ * True when an Entity source type is selected, an entity is chosen, and that
1362
+ * entity has NO active Entity Document — the trigger for the inline create UI.
1363
+ */
1364
+ get SelectedEntityHasNoDocument() {
1365
+ if (!this.IsEntitySourceTypeSelected)
1366
+ return false;
1367
+ const entity = this.selectedEntityInfo;
1368
+ if (!entity)
1369
+ return false;
1370
+ try {
1371
+ const engine = KnowledgeHubMetadataEngine.Instance;
1372
+ return engine.GetActiveEntityDocuments().filter(d => d.Entity === entity.Name).length === 0;
1373
+ }
1374
+ catch {
1375
+ return false;
1376
+ }
1377
+ }
1378
+ /** Fields of the selected entity, for the field-picker in the inline create form. */
1379
+ get SelectedEntityFields() {
1380
+ const entity = this.selectedEntityInfo;
1381
+ if (!entity)
1382
+ return [];
1383
+ return entity.Fields
1384
+ .filter(f => !f.IsVirtual)
1385
+ .map(f => ({ Name: f.Name, DisplayName: f.DisplayName || f.Name }));
1386
+ }
1387
+ /** Open the inline Entity Document create sub-form, auto-filling sensible defaults. */
1388
+ OpenInlineEntityDocForm() {
1389
+ const entity = this.selectedEntityInfo;
1390
+ if (!entity)
1391
+ return;
1392
+ this.NewEntityDocName = `${entity.Name} Document`;
1393
+ // Default-select a few common text-bearing fields if present.
1394
+ this.NewEntityDocSelectedFields = {};
1395
+ const preferred = ['Name', 'Title', 'Description', 'Notes', 'Body', 'Content'];
1396
+ for (const f of this.SelectedEntityFields) {
1397
+ if (preferred.includes(f.Name))
1398
+ this.NewEntityDocSelectedFields[f.Name] = true;
1399
+ }
1400
+ this.ShowInlineEntityDocForm = true;
1401
+ this.cdr.detectChanges();
1402
+ }
1403
+ CancelInlineEntityDocForm() {
1404
+ this.ShowInlineEntityDocForm = false;
1405
+ this.cdr.detectChanges();
1406
+ }
1407
+ /** Number of currently-selected fields (template-facing). */
1408
+ get SelectedEntityDocFieldCount() {
1409
+ return Object.values(this.NewEntityDocSelectedFields).filter(Boolean).length;
1410
+ }
1411
+ /**
1412
+ * Create a new Entity Document for the selected entity, then select it on the
1413
+ * form. Builds a simple template body referencing the chosen fields. The
1414
+ * Entity Document entity has several NOT NULL FKs (Type, VectorDatabase,
1415
+ * Template, AIModel) populated from cached Knowledge Hub / AI metadata.
1416
+ */
1417
+ async CreateInlineEntityDocument() {
1418
+ if (this.EntityDocSaving)
1419
+ return;
1420
+ const entity = this.selectedEntityInfo;
1421
+ if (!entity) {
1422
+ MJNotificationService.Instance.CreateSimpleNotification('Select an entity first.', 'warning', 3000);
1423
+ return;
1424
+ }
1425
+ if (!this.NewEntityDocName.trim()) {
1426
+ MJNotificationService.Instance.CreateSimpleNotification('Enter a name for the Entity Document.', 'warning', 3000);
1427
+ return;
1428
+ }
1429
+ this.EntityDocSaving = true;
1430
+ this.cdr.detectChanges();
1431
+ try {
1432
+ const p = this.ProviderToUse;
1433
+ const doc = await p.GetEntityObject('MJ: Entity Documents', p.CurrentUser);
1434
+ doc.NewRecord();
1435
+ doc.Name = this.NewEntityDocName.trim();
1436
+ doc.EntityID = entity.ID;
1437
+ doc.Status = 'Active';
1438
+ const selectedFields = this.SelectedEntityFields
1439
+ .filter(f => this.NewEntityDocSelectedFields[f.Name])
1440
+ .map(f => f.Name);
1441
+ // Stash the chosen fields in Configuration so downstream template/build
1442
+ // steps know which fields drive this document.
1443
+ doc.Configuration = JSON.stringify({ Fields: selectedFields });
1444
+ const saved = await doc.Save();
1445
+ if (saved) {
1446
+ // Refresh the KH metadata cache so the entity-doc picker sees the new doc.
1447
+ await KnowledgeHubMetadataEngine.Instance.Config(true, p.CurrentUser, p);
1448
+ // Select the new doc on the form.
1449
+ this.FormSourceEntityDocID = doc.ID;
1450
+ const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');
1451
+ if (docField)
1452
+ this.FormSourceSpecificConfig[docField.Key] = doc.ID;
1453
+ this.ShowInlineEntityDocForm = false;
1454
+ MJNotificationService.Instance.CreateSimpleNotification('Entity Document created', 'success', 2500);
1455
+ }
1456
+ else {
1457
+ const detail = doc.LatestResult?.CompleteMessage ?? 'Unknown error';
1458
+ MJNotificationService.Instance.CreateSimpleNotification(`Failed to create Entity Document: ${detail}`, 'error', 5000);
1459
+ }
1460
+ }
1461
+ catch (error) {
1462
+ const msg = error instanceof Error ? error.message : String(error);
1463
+ MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
1464
+ }
1465
+ finally {
1466
+ this.EntityDocSaving = false;
1467
+ this.cdr.detectChanges();
1468
+ }
1469
+ }
1121
1470
  // ── Dynamic source-type fields (metadata-driven) ──
1122
1471
  /** Stores source-type-specific config values keyed by RequiredFields[].Key */
1123
1472
  FormSourceSpecificConfig = {};
@@ -1284,6 +1633,9 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1284
1633
  this.FormCrawlSitesInLowerLevelDomain = true;
1285
1634
  this.FormCrawlOtherSitesInTopLevelDomain = false;
1286
1635
  this.workingConfig = {};
1636
+ this.ShowInlineEntityDocForm = false;
1637
+ this.NewEntityDocName = '';
1638
+ this.NewEntityDocSelectedFields = {};
1287
1639
  const rawSource = this.RawSources.find(s => UUIDsEqual(s['ID'], card.ID));
1288
1640
  if (rawSource) {
1289
1641
  const configStr = rawSource['Configuration'];
@@ -1598,11 +1950,45 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1598
1950
  .map(t => ({ ID: t.ID, Name: t.Name }))
1599
1951
  .sort((a, b) => a.Name.localeCompare(b.Name));
1600
1952
  }
1953
+ // Org-level domain context — used for the effective-context preview.
1954
+ await this.loadOrgClassificationContext();
1601
1955
  }
1602
1956
  catch (error) {
1603
1957
  console.error('[Autotagging] Error loading form dropdowns:', error);
1604
1958
  }
1605
1959
  }
1960
+ /**
1961
+ * Resolve the Knowledge Hub Application ID by name (cached per dialog instance).
1962
+ * Returns null when no such application exists.
1963
+ */
1964
+ khApplicationID = undefined;
1965
+ async resolveKnowledgeHubApplicationID() {
1966
+ if (this.khApplicationID !== undefined)
1967
+ return this.khApplicationID;
1968
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1969
+ const result = await rv.RunView({
1970
+ EntityName: 'MJ: Applications',
1971
+ ExtraFilter: `Name = '${KNOWLEDGE_HUB_APPLICATION_NAME.replace(/'/g, "''")}'`,
1972
+ Fields: ['ID'],
1973
+ MaxRows: 1,
1974
+ ResultType: 'simple',
1975
+ });
1976
+ this.khApplicationID = result.Success && result.Results.length > 0 ? result.Results[0].ID : null;
1977
+ return this.khApplicationID;
1978
+ }
1979
+ /** Read the org-level classification context for the effective-context preview. */
1980
+ async loadOrgClassificationContext() {
1981
+ try {
1982
+ const p = this.ProviderToUse;
1983
+ await ApplicationSettingEngine.Instance.Config(false, p.CurrentUser, p);
1984
+ const appID = await this.resolveKnowledgeHubApplicationID();
1985
+ this.OrgClassificationContext =
1986
+ ApplicationSettingEngine.Instance.GetSetting(CLASSIFY_ORG_CONTEXT_SETTING_KEY, appID ?? undefined) ?? '';
1987
+ }
1988
+ catch {
1989
+ this.OrgClassificationContext = '';
1990
+ }
1991
+ }
1606
1992
  resetSourceForm() {
1607
1993
  this.FormSourceName = '';
1608
1994
  this.FormSourceTypeID = '';
@@ -1622,6 +2008,10 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1622
2008
  this.FormCrawlOtherSitesInTopLevelDomain = false;
1623
2009
  // Classification knobs — start empty; the typed getters apply defaults.
1624
2010
  this.workingConfig = {};
2011
+ // Inline Entity Document create sub-form.
2012
+ this.ShowInlineEntityDocForm = false;
2013
+ this.NewEntityDocName = '';
2014
+ this.NewEntityDocSelectedFields = {};
1625
2015
  }
1626
2016
  // ════════════════════════════════════════════
1627
2017
  // EFFECTIVE-VALUES TOGGLE
@@ -1715,15 +2105,15 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1715
2105
  this.EditingTypeID = '';
1716
2106
  }
1717
2107
  static ɵfac = /*@__PURE__*/ (() => { let ɵClassifySourceTypeFormDialogComponent_BaseFactory; return function ClassifySourceTypeFormDialogComponent_Factory(__ngFactoryType__) { return (ɵClassifySourceTypeFormDialogComponent_BaseFactory || (ɵClassifySourceTypeFormDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ClassifySourceTypeFormDialogComponent)))(__ngFactoryType__ || ClassifySourceTypeFormDialogComponent); }; })();
1718
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifySourceTypeFormDialogComponent, selectors: [["classify-source-type-form-dialog"]], outputs: { Saved: "Saved", ContentTypeMissing: "ContentTypeMissing", NavigateToRecordRequested: "NavigateToRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel"], ["role", "separator", "aria-orientation", "vertical", "aria-label", "Resize panel", 1, "cls-resize-handle", 3, "mousedown"], [1, "at-slide-header"], ["aria-label", "Close form", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "cls-section", "cls-section--first"], [1, "cls-section-title"], [1, "fa-solid", "fa-database"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", "placeholder", "Source name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "cls-section"], [1, "fa-solid", "fa-cubes"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Use system default", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-hint"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "cls-eff-toggle", 3, "click"], [1, "fa-solid"], [1, "cls-config"], [1, "cls-mode-grid"], [1, "cls-mode-card", 3, "selected"], [1, "cls-threshold-pair"], [1, "cls-slider-grid"], [1, "cls-slider-field"], [1, "cls-slider-cap"], ["type", "range", "min", "0.50", "max", "1.00", "step", "0.01", 1, "cls-slider", 3, "ngModelChange", "ngModel"], ["aria-hidden", "true", 1, "cls-band"], [1, "cls-validation"], [1, "cls-band-legend"], [1, "cls-toggle-row"], [1, "cls-toggle-label"], [1, "t"], [1, "d"], [3, "ngModelChange", "ngModel"], [1, "cls-aside"], [1, "fa-solid", "fa-gauge"], ["type", "number", "min", "0", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-budget-grid"], ["type", "number", "min", "0", "step", "0.01", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-form-advanced-link"], [1, "at-required"], ["type", "url", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder", "value"], [1, "at-form-select", 3, "ngModel"], ["type", "url", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder", "value"], [1, "cls-mode-card", 3, "click"], [1, "cls-mode-nm"], [1, "cls-mode-best"], [1, "fa-solid", "fa-circle-exclamation"], [1, "cls-band-key", "reject"], [1, "cls-band-key", "review"], [1, "cls-band-key", "apply"], [1, "cls-aside-title"], [1, "cls-eff-row"], [1, "cls-eff-label"], [1, "cls-eff-value"], [1, "cls-eff-origin"], [1, "fa-solid", "fa-spider"], ["type", "number", "min", "0", "max", "10", "step", "1", "placeholder", "2 (default)", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], ["href", "javascript:void(0)", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["type", "text", "placeholder", "Content type name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", "placeholder", "Description...", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Select AI model...", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-row"], [1, "at-form-group", 2, "flex", "1"], ["type", "number", "min", "0", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "1", 1, "at-form-input", 3, "ngModelChange", "ngModel"]], template: function ClassifySourceTypeFormDialogComponent_Template(rf, ctx) { if (rf & 1) {
2108
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifySourceTypeFormDialogComponent, selectors: [["classify-source-type-form-dialog"]], outputs: { Saved: "Saved", ContentTypeMissing: "ContentTypeMissing", NavigateToRecordRequested: "NavigateToRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel"], ["role", "separator", "aria-orientation", "vertical", "aria-label", "Resize panel", 1, "cls-resize-handle", 3, "mousedown"], [1, "at-slide-header"], ["aria-label", "Close form", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "cls-section", "cls-section--first"], [1, "cls-section-title"], [1, "fa-solid", "fa-database"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", "placeholder", "Source name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "cls-section"], [1, "fa-solid", "fa-cubes"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Use system default", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-hint"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "cls-eff-toggle", 3, "click"], [1, "fa-solid"], [1, "cls-config"], [1, "cls-mode-grid"], [1, "cls-mode-card", 3, "selected"], [1, "cls-threshold-pair"], [1, "cls-slider-grid"], [1, "cls-slider-field"], [1, "cls-slider-cap"], ["type", "range", "min", "0.50", "max", "1.00", "step", "0.01", 1, "cls-slider", 3, "ngModelChange", "ngModel"], ["aria-hidden", "true", 1, "cls-band"], [1, "cls-validation"], [1, "cls-band-legend"], [1, "cls-toggle-row"], [1, "cls-toggle-label"], [1, "t"], [1, "d"], [3, "ngModelChange", "ngModel"], [1, "cls-aside"], [1, "fa-solid", "fa-comment-dots"], ["rows", "4", "placeholder", "Free-text guidance for the classifier about this source's domain \u2014 terminology, audience, what tags matter\u2026", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], [1, "cls-context-preview"], [1, "fa-solid", "fa-gauge"], ["type", "number", "min", "0", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-budget-grid"], ["type", "number", "min", "0", "step", "0.01", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-form-advanced-link"], [1, "at-required"], ["type", "url", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder", "value"], [1, "at-form-select", 3, "ngModel"], ["type", "url", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder", "value"], [1, "cls-doc-callout"], [1, "cls-doc-callout-head"], [1, "fa-solid", "fa-circle-info"], ["mjButton", "", "variant", "primary", "size", "sm"], [1, "cls-doc-form"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["type", "text", "placeholder", "Document name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-doc-field-list"], [1, "cls-doc-field-row"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], [1, "cls-mode-card", 3, "click"], [1, "cls-mode-nm"], [1, "cls-mode-best"], [1, "fa-solid", "fa-circle-exclamation"], [1, "cls-band-key", "reject"], [1, "cls-band-key", "review"], [1, "cls-band-key", "apply"], [1, "cls-aside-title"], [1, "cls-eff-row"], [1, "cls-eff-label"], [1, "cls-eff-value"], [1, "cls-eff-origin"], [1, "fa-solid", "fa-spider"], ["type", "number", "min", "0", "max", "10", "step", "1", "placeholder", "2 (default)", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["href", "javascript:void(0)", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["type", "text", "placeholder", "Content type name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", "placeholder", "Description...", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Select AI model...", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-row"], [1, "at-form-group", 2, "flex", "1"], ["type", "number", "min", "0", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "1", 1, "at-form-input", 3, "ngModelChange", "ngModel"]], template: function ClassifySourceTypeFormDialogComponent_Template(rf, ctx) { if (rf & 1) {
1719
2109
  i0.ɵɵconditionalCreate(0, ClassifySourceTypeFormDialogComponent_Conditional_0_Template, 14, 5);
1720
2110
  } if (rf & 2) {
1721
2111
  i0.ɵɵconditional(ctx.FormMode !== "none" ? 0 : -1);
1722
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TreeDropdownComponent, i3.MJButtonDirective, i3.MJSwitchComponent, i4.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.cls-resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle[_ngcontent-%COMP%]:hover, \n.cls-resize-handle[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.cls-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.cls-section--first[_ngcontent-%COMP%] {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-eff-toggle[_ngcontent-%COMP%] {\n margin-left: auto;\n font-weight: 600;\n}\n\n\n\n\n.cls-config[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.cls-mode-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected[_ngcontent-%COMP%] .cls-mode-ic[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.cls-mode-nm[_ngcontent-%COMP%] { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best[_ngcontent-%COMP%] { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n\n\n.cls-threshold-pair[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n.cls-slider-field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider[_ngcontent-%COMP%] {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider[_ngcontent-%COMP%]::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider[_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n\n\n.cls-band[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject[_ngcontent-%COMP%] { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review[_ngcontent-%COMP%] { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply[_ngcontent-%COMP%] { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n\n\n.cls-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label[_ngcontent-%COMP%] .t[_ngcontent-%COMP%] { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label[_ngcontent-%COMP%] .d[_ngcontent-%COMP%] { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n\n\n\n\n.cls-aside[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row[_ngcontent-%COMP%]:first-of-type { border-top: 0; }\n.cls-eff-label[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.cls-eff-value[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin[_ngcontent-%COMP%] {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-budget-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}"] });
2112
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TreeDropdownComponent, i3.MJButtonDirective, i3.MJSwitchComponent, i4.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.cls-resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle[_ngcontent-%COMP%]:hover, \n.cls-resize-handle[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.cls-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.cls-section--first[_ngcontent-%COMP%] {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-eff-toggle[_ngcontent-%COMP%] {\n margin-left: auto;\n font-weight: 600;\n}\n\n\n\n\n.cls-config[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.cls-mode-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected[_ngcontent-%COMP%] .cls-mode-ic[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.cls-mode-nm[_ngcontent-%COMP%] { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best[_ngcontent-%COMP%] { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n\n\n.cls-threshold-pair[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n.cls-slider-field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider[_ngcontent-%COMP%] {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider[_ngcontent-%COMP%]::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider[_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n\n\n.cls-band[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject[_ngcontent-%COMP%] { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review[_ngcontent-%COMP%] { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply[_ngcontent-%COMP%] { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n\n\n.cls-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label[_ngcontent-%COMP%] .t[_ngcontent-%COMP%] { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label[_ngcontent-%COMP%] .d[_ngcontent-%COMP%] { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n\n\n\n\n.cls-aside[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row[_ngcontent-%COMP%]:first-of-type { border-top: 0; }\n.cls-eff-label[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.cls-eff-value[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin[_ngcontent-%COMP%] {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-budget-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n\n\n\n.cls-context-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n\n\n.cls-doc-callout[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 12px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border, var(--mj-border-default));\n border-radius: 6px;\n}\n.cls-doc-callout-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n}\n.cls-doc-callout-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-status-info); margin-top: 2px; }\n.cls-doc-form[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n.cls-doc-field-list[_ngcontent-%COMP%] {\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.cls-doc-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}"] });
1723
2113
  }
1724
2114
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassifySourceTypeFormDialogComponent, [{
1725
2115
  type: Component,
1726
- args: [{ standalone: false, selector: 'classify-source-type-form-dialog', template: "<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM OVERLAY \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Left-edge drag handle: the panel slides in from the right, so its\n resizable edge is the LEFT. Dragging left widens the panel. -->\n <div class=\"cls-resize-handle\" (mousedown)=\"StartResize($event)\"\n role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize panel\"></div>\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SOURCE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section cls-section--first\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-database\"></i> Source</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n </div><!-- /Source section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 EMBEDDING & VECTORS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-cubes\"></i> Embedding &amp; Vectors</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n </div><!-- /Embedding & Vectors section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CLASSIFICATION (full config parity, in-app) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\">\n <i class=\"fa-solid fa-sliders\"></i> Classification\n <button mjButton variant=\"flat\" size=\"sm\" class=\"cls-eff-toggle\"\n (click)=\"ToggleEffectiveValues()\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!ShowEffectiveValues\" [class.fa-eye-slash]=\"ShowEffectiveValues\"></i>\n {{ ShowEffectiveValues ? 'Hide effective values' : 'Show effective values' }}\n </button>\n </div>\n\n <div class=\"cls-config\">\n <!-- Taxonomy mode cards -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Taxonomy mode</label>\n <div class=\"cls-mode-grid\">\n @for (m of TaxonomyModes; track m.value) {\n <div class=\"cls-mode-card\" [class.selected]=\"CurrentMode === m.value\"\n (click)=\"SetMode(m.value)\">\n <i class=\"fa-solid {{ m.icon }} cls-mode-ic\"></i>\n <div class=\"cls-mode-nm\">{{ m.label }}</div>\n <div class=\"cls-mode-best\">{{ m.bestFor }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag root -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Tag root</label>\n <select class=\"at-form-select\" [(ngModel)]=\"TagRootIDValue\">\n <option value=\"\">(none / whole taxonomy)</option>\n @for (opt of TagRootOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.</span>\n </div>\n\n <!-- Thresholds + gradient band -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Confidence thresholds</label>\n <div class=\"cls-threshold-pair\">\n <div class=\"cls-slider-grid\">\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Match (auto-apply) <strong>{{ MatchThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"MatchThresholdValue\" (ngModelChange)=\"MatchThresholdValue = $event\">\n </div>\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Suggest (route to inbox) <strong>{{ SuggestThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"SuggestThresholdValue\" (ngModelChange)=\"SuggestThresholdValue = $event\">\n </div>\n </div>\n <div class=\"cls-band\" aria-hidden=\"true\"></div>\n @if (ThresholdValidationMessage) {\n <div class=\"cls-validation\"><i class=\"fa-solid fa-circle-exclamation\"></i> {{ ThresholdValidationMessage }}</div>\n } @else {\n <div class=\"cls-band-legend\">\n <span class=\"cls-band-key reject\">reject / new</span>\n <span class=\"cls-band-key review\">review (inbox)</span>\n <span class=\"cls-band-key apply\">auto-apply</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Toggles -->\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Share full taxonomy with the LLM</span>\n <span class=\"d\">When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.</span>\n </div>\n <mj-switch [(ngModel)]=\"ShareTaxonomyValue\"></mj-switch>\n </div>\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Vectorize new content</span>\n <span class=\"d\">When off, this source skips vectorization (the classifier still runs).</span>\n </div>\n <mj-switch [(ngModel)]=\"EnableVectorizationValue\"></mj-switch>\n </div>\n </div><!-- /cls-config -->\n\n <!-- Effective-values panel \u2014 inline + conditional (no longer a floating aside) -->\n @if (ShowEffectiveValues) {\n <div class=\"cls-aside\">\n <h5 class=\"cls-aside-title\">Effective values</h5>\n @for (row of EffectiveValues; track row.label) {\n <div class=\"cls-eff-row\">\n <span class=\"cls-eff-label\">{{ row.label }}</span>\n <span class=\"cls-eff-value\">{{ row.value }}\n <span class=\"cls-eff-origin\" [class.override]=\"row.origin === 'source override'\">{{ row.origin }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div><!-- /Classification section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 RUN BUDGETS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-gauge\"></i> Run budgets</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max items per run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxItemsPerRun\" placeholder=\"unlimited\">\n <span class=\"at-form-hint\">\n Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count.\n Paused work resumes on the next run.\n </span>\n </div>\n\n <div class=\"cls-budget-grid\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerRunValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all items</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / item</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerItemValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerItemValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">extras \u2192 suggestions</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max tokens / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxTokensPerRunValue ?? ''\" (ngModelChange)=\"MaxTokensPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all LLM calls</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max cost / run (USD)</label>\n <input type=\"number\" min=\"0\" step=\"0.01\" class=\"at-form-input\"\n [ngModel]=\"MaxCostPerRunValue ?? ''\" (ngModelChange)=\"MaxCostPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">$ stops the run</span>\n </div>\n </div>\n </div><!-- /Run budgets section -->\n\n @if (IsWebsiteSourceTypeSelected) {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CRAWL SETTINGS (website source only) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-spider\"></i> Crawl settings</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Crawl depth</label>\n <input type=\"number\" min=\"0\" max=\"10\" step=\"1\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxDepth\" placeholder=\"2 (default)\">\n <span class=\"at-form-hint\">\n Recursion ceiling for in-domain links. <code>0</code> = just the start URL.\n <code>2</code> (default) = root + sections + content pages.\n </span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlSitesInLowerLevelDomain\">\n Crawl sites in lower-level domain\n </label>\n <span class=\"at-form-hint\">When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlOtherSitesInTopLevelDomain\">\n Crawl other sites in top-level domain\n </label>\n <span class=\"at-form-hint\">When on, also adds sibling-path URLs found on the seed page. Off by default to avoid accidental fan-out.</span>\n </div>\n </div><!-- /Crawl settings section -->\n }\n\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n\n @if (FormMode === 'edit-source' && EditingSourceID) {\n <div class=\"at-form-advanced-link\">\n <a href=\"javascript:void(0)\" (click)=\"OpenAdvancedSourceSettings()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Open advanced settings \u2014 URL pattern, root URL, &amp; full entity form\n </a>\n <span class=\"at-form-hint\">The key classifier knobs (taxonomy mode, thresholds, tag root, budgets) are now editable inline above.</span>\n </div>\n }\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/*\n * Source + Content Type CRUD slide-in form dialog styles.\n *\n * The host (AutotaggingPipelineResourceComponent) uses ViewEncapsulation.None,\n * so its `.at-slide-*` / `.at-form-*` rules are global and already style this\n * dialog's markup while it renders inside the host shell.\n *\n * The `.cls-*` (Classification) rules below are NEW to the in-dashboard config\n * parity feature. All colors use semantic design tokens (no hardcoded hex), and\n * the threshold band gradient is built from color-mix() of semantic tokens so it\n * adapts to dark mode and white-labeling.\n */\n\n/* \u2500\u2500 Left-edge resize handle \u2500\u2500\n * The slide-in panel slides in from the right, so its resizable edge is the LEFT.\n * A thin full-height grab strip; tokenized hover color so it adapts to themes. */\n.cls-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle:hover,\n.cls-resize-handle:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* \u2500\u2500 Section shells (Source / Embedding / Classification / Run budgets / Crawl) \u2500\u2500 */\n.cls-section {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n/* The first section needs no separator above it. */\n.cls-section--first {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title i { color: var(--mj-brand-primary); }\n\n/* \"Show / hide effective values\" toggle, pushed to the right of the section title. */\n.cls-eff-toggle {\n margin-left: auto;\n font-weight: 600;\n}\n\n/* Single-column control stack. The effective-values panel now renders inline\n * below (full width within the section), not as a floating grid column. */\n.cls-config {\n display: block;\n}\n\n/* \u2500\u2500 Taxonomy mode cards \u2500\u2500 */\n.cls-mode-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected .cls-mode-ic { color: var(--mj-brand-primary); }\n.cls-mode-nm { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n/* \u2500\u2500 Thresholds + gradient band \u2500\u2500 */\n.cls-threshold-pair {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid { grid-template-columns: 1fr; }\n}\n.cls-slider-field { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap strong {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n/* The reject | review | auto-apply gradient band \u2014 all stops from semantic tokens. */\n.cls-band {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n/* \u2500\u2500 Toggles \u2500\u2500 */\n.cls-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label .t { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label .d { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n/* \u2500\u2500 Effective-values panel (inline + conditional) \u2500\u2500\n * Repurposed from the old floating aside: renders inline at the end of the\n * Classification section, full width within the section \u2014 never overlaps. */\n.cls-aside {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row:first-of-type { border-top: 0; }\n.cls-eff-label { color: var(--mj-text-secondary); }\n.cls-eff-value { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override { color: var(--mj-brand-primary); }\n\n/* \u2500\u2500 Budget grid \u2500\u2500 */\n.cls-budget-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid { grid-template-columns: 1fr; }\n}\n"] }]
2116
+ args: [{ standalone: false, selector: 'classify-source-type-form-dialog', template: "<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM OVERLAY \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Left-edge drag handle: the panel slides in from the right, so its\n resizable edge is the LEFT. Dragging left widens the panel. -->\n <div class=\"cls-resize-handle\" (mousedown)=\"StartResize($event)\"\n role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize panel\"></div>\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SOURCE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section cls-section--first\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-database\"></i> Source</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n\n <!-- Inline Entity Document creation: shown when an Entity-type\n source's selected entity has no Entity Document yet. -->\n @if (SelectedEntityHasNoDocument) {\n <div class=\"cls-doc-callout\">\n <div class=\"cls-doc-callout-head\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span><strong>{{ SelectedEntityName }}</strong> has no Entity Document. One is required to classify its records.</span>\n </div>\n @if (!ShowInlineEntityDocForm) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OpenInlineEntityDocForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Entity Document\n </button>\n }\n </div>\n\n @if (ShowInlineEntityDocForm) {\n <div class=\"cls-doc-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Document name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"NewEntityDocName\"\n placeholder=\"Document name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Fields to include ({{ SelectedEntityDocFieldCount }} selected)</label>\n <div class=\"cls-doc-field-list\">\n @for (f of SelectedEntityFields; track f.Name) {\n <label class=\"cls-doc-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"NewEntityDocSelectedFields[f.Name]\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n </div>\n <div class=\"at-form-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"CreateInlineEntityDocument()\" [disabled]=\"EntityDocSaving\">\n @if (EntityDocSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating\u2026 }\n @else { <i class=\"fa-solid fa-check\"></i> Create }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CancelInlineEntityDocForm()\">Cancel</button>\n </div>\n </div>\n }\n }\n </div><!-- /Source section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 EMBEDDING & VECTORS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-cubes\"></i> Embedding &amp; Vectors</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n </div><!-- /Embedding & Vectors section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CLASSIFICATION (full config parity, in-app) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\">\n <i class=\"fa-solid fa-sliders\"></i> Classification\n <button mjButton variant=\"flat\" size=\"sm\" class=\"cls-eff-toggle\"\n (click)=\"ToggleEffectiveValues()\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!ShowEffectiveValues\" [class.fa-eye-slash]=\"ShowEffectiveValues\"></i>\n {{ ShowEffectiveValues ? 'Hide effective values' : 'Show effective values' }}\n </button>\n </div>\n\n <div class=\"cls-config\">\n <!-- Taxonomy mode cards -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Taxonomy mode</label>\n <div class=\"cls-mode-grid\">\n @for (m of TaxonomyModes; track m.value) {\n <div class=\"cls-mode-card\" [class.selected]=\"CurrentMode === m.value\"\n (click)=\"SetMode(m.value)\">\n <i class=\"fa-solid {{ m.icon }} cls-mode-ic\"></i>\n <div class=\"cls-mode-nm\">{{ m.label }}</div>\n <div class=\"cls-mode-best\">{{ m.bestFor }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag root -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Tag root</label>\n <select class=\"at-form-select\" [(ngModel)]=\"TagRootIDValue\">\n <option value=\"\">(none / whole taxonomy)</option>\n @for (opt of TagRootOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.</span>\n </div>\n\n <!-- Thresholds + gradient band -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Confidence thresholds</label>\n <div class=\"cls-threshold-pair\">\n <div class=\"cls-slider-grid\">\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Match (auto-apply) <strong>{{ MatchThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"MatchThresholdValue\" (ngModelChange)=\"MatchThresholdValue = $event\">\n </div>\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Suggest (route to inbox) <strong>{{ SuggestThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"SuggestThresholdValue\" (ngModelChange)=\"SuggestThresholdValue = $event\">\n </div>\n </div>\n <div class=\"cls-band\" aria-hidden=\"true\"></div>\n @if (ThresholdValidationMessage) {\n <div class=\"cls-validation\"><i class=\"fa-solid fa-circle-exclamation\"></i> {{ ThresholdValidationMessage }}</div>\n } @else {\n <div class=\"cls-band-legend\">\n <span class=\"cls-band-key reject\">reject / new</span>\n <span class=\"cls-band-key review\">review (inbox)</span>\n <span class=\"cls-band-key apply\">auto-apply</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Toggles -->\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Share full taxonomy with the LLM</span>\n <span class=\"d\">When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.</span>\n </div>\n <mj-switch [(ngModel)]=\"ShareTaxonomyValue\"></mj-switch>\n </div>\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Vectorize new content</span>\n <span class=\"d\">When off, this source skips vectorization (the classifier still runs).</span>\n </div>\n <mj-switch [(ngModel)]=\"EnableVectorizationValue\"></mj-switch>\n </div>\n </div><!-- /cls-config -->\n\n <!-- Effective-values panel \u2014 inline + conditional (no longer a floating aside) -->\n @if (ShowEffectiveValues) {\n <div class=\"cls-aside\">\n <h5 class=\"cls-aside-title\">Effective values</h5>\n @for (row of EffectiveValues; track row.label) {\n <div class=\"cls-eff-row\">\n <span class=\"cls-eff-label\">{{ row.label }}</span>\n <span class=\"cls-eff-value\">{{ row.value }}\n <span class=\"cls-eff-origin\" [class.override]=\"row.origin === 'source override'\">{{ row.origin }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div><!-- /Classification section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 DOMAIN CONTEXT (source scope) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-comment-dots\"></i> Domain context</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source guidance</label>\n <textarea class=\"at-form-textarea\" rows=\"4\"\n [ngModel]=\"ClassificationContextValue\"\n (ngModelChange)=\"ClassificationContextValue = $event\"\n placeholder=\"Free-text guidance for the classifier about this source's domain \u2014 terminology, audience, what tags matter\u2026\"></textarea>\n <span class=\"at-form-hint\">Injected into the autotagging prompt at the source scope.</span>\n </div>\n\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Substitutive mode</span>\n <span class=\"d\">When on, this source's guidance <em>replaces</em> the org/content-type context. When off (default), it's <em>added</em> to them.</span>\n </div>\n <mj-switch [(ngModel)]=\"IsSubstitutiveMode\"></mj-switch>\n </div>\n\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Effective context preview</label>\n <pre class=\"cls-context-preview\">{{ EffectiveContextPreview }}</pre>\n <span class=\"at-form-hint\">Org + source scopes shown. Content-type scope (if any) is also merged at run time.</span>\n </div>\n </div><!-- /Domain context section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 RUN BUDGETS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-gauge\"></i> Run budgets</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max items per run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxItemsPerRun\" placeholder=\"unlimited\">\n <span class=\"at-form-hint\">\n Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count.\n Paused work resumes on the next run.\n </span>\n </div>\n\n <div class=\"cls-budget-grid\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerRunValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all items</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / item</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerItemValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerItemValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">extras \u2192 suggestions</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max tokens / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxTokensPerRunValue ?? ''\" (ngModelChange)=\"MaxTokensPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all LLM calls</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max cost / run (USD)</label>\n <input type=\"number\" min=\"0\" step=\"0.01\" class=\"at-form-input\"\n [ngModel]=\"MaxCostPerRunValue ?? ''\" (ngModelChange)=\"MaxCostPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">$ stops the run</span>\n </div>\n </div>\n </div><!-- /Run budgets section -->\n\n @if (IsWebsiteSourceTypeSelected) {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CRAWL SETTINGS (website source only) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-spider\"></i> Crawl settings</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Crawl depth</label>\n <input type=\"number\" min=\"0\" max=\"10\" step=\"1\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxDepth\" placeholder=\"2 (default)\">\n <span class=\"at-form-hint\">\n Recursion ceiling for in-domain links. <code>0</code> = just the start URL.\n <code>2</code> (default) = root + sections + content pages.\n </span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlSitesInLowerLevelDomain\">\n Crawl sites in lower-level domain\n </label>\n <span class=\"at-form-hint\">When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlOtherSitesInTopLevelDomain\">\n Crawl other sites in top-level domain\n </label>\n <span class=\"at-form-hint\">When on, also adds sibling-path URLs found on the seed page. Off by default to avoid accidental fan-out.</span>\n </div>\n </div><!-- /Crawl settings section -->\n }\n\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n\n @if (FormMode === 'edit-source' && EditingSourceID) {\n <div class=\"at-form-advanced-link\">\n <a href=\"javascript:void(0)\" (click)=\"OpenAdvancedSourceSettings()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Open advanced settings \u2014 URL pattern, root URL, &amp; full entity form\n </a>\n <span class=\"at-form-hint\">The key classifier knobs (taxonomy mode, thresholds, tag root, budgets) are now editable inline above.</span>\n </div>\n }\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/*\n * Source + Content Type CRUD slide-in form dialog styles.\n *\n * The host (AutotaggingPipelineResourceComponent) uses ViewEncapsulation.None,\n * so its `.at-slide-*` / `.at-form-*` rules are global and already style this\n * dialog's markup while it renders inside the host shell.\n *\n * The `.cls-*` (Classification) rules below are NEW to the in-dashboard config\n * parity feature. All colors use semantic design tokens (no hardcoded hex), and\n * the threshold band gradient is built from color-mix() of semantic tokens so it\n * adapts to dark mode and white-labeling.\n */\n\n/* \u2500\u2500 Left-edge resize handle \u2500\u2500\n * The slide-in panel slides in from the right, so its resizable edge is the LEFT.\n * A thin full-height grab strip; tokenized hover color so it adapts to themes. */\n.cls-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle:hover,\n.cls-resize-handle:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* \u2500\u2500 Section shells (Source / Embedding / Classification / Run budgets / Crawl) \u2500\u2500 */\n.cls-section {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n/* The first section needs no separator above it. */\n.cls-section--first {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title i { color: var(--mj-brand-primary); }\n\n/* \"Show / hide effective values\" toggle, pushed to the right of the section title. */\n.cls-eff-toggle {\n margin-left: auto;\n font-weight: 600;\n}\n\n/* Single-column control stack. The effective-values panel now renders inline\n * below (full width within the section), not as a floating grid column. */\n.cls-config {\n display: block;\n}\n\n/* \u2500\u2500 Taxonomy mode cards \u2500\u2500 */\n.cls-mode-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected .cls-mode-ic { color: var(--mj-brand-primary); }\n.cls-mode-nm { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n/* \u2500\u2500 Thresholds + gradient band \u2500\u2500 */\n.cls-threshold-pair {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid { grid-template-columns: 1fr; }\n}\n.cls-slider-field { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap strong {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n/* The reject | review | auto-apply gradient band \u2014 all stops from semantic tokens. */\n.cls-band {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n/* \u2500\u2500 Toggles \u2500\u2500 */\n.cls-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label .t { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label .d { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n/* \u2500\u2500 Effective-values panel (inline + conditional) \u2500\u2500\n * Repurposed from the old floating aside: renders inline at the end of the\n * Classification section, full width within the section \u2014 never overlaps. */\n.cls-aside {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row:first-of-type { border-top: 0; }\n.cls-eff-label { color: var(--mj-text-secondary); }\n.cls-eff-value { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override { color: var(--mj-brand-primary); }\n\n/* \u2500\u2500 Budget grid \u2500\u2500 */\n.cls-budget-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid { grid-template-columns: 1fr; }\n}\n\n/* \u2500\u2500 Domain context: effective-context preview \u2500\u2500 */\n.cls-context-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n/* \u2500\u2500 Inline Entity Document creation \u2500\u2500 */\n.cls-doc-callout {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 12px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border, var(--mj-border-default));\n border-radius: 6px;\n}\n.cls-doc-callout-head {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n}\n.cls-doc-callout-head i { color: var(--mj-status-info); margin-top: 2px; }\n.cls-doc-form {\n margin-top: 10px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n.cls-doc-field-list {\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.cls-doc-field-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n"] }]
1727
2117
  }], null, { Saved: [{
1728
2118
  type: Output
1729
2119
  }], ContentTypeMissing: [{
@@ -1731,5 +2121,5 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
1731
2121
  }], NavigateToRecordRequested: [{
1732
2122
  type: Output
1733
2123
  }] }); })();
1734
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifySourceTypeFormDialogComponent, { className: "ClassifySourceTypeFormDialogComponent", filePath: "src/AI/components/autotagging/dialogs/source-type-form.dialog.component.ts", lineNumber: 72 }); })();
2124
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifySourceTypeFormDialogComponent, { className: "ClassifySourceTypeFormDialogComponent", filePath: "src/AI/components/autotagging/dialogs/source-type-form.dialog.component.ts", lineNumber: 102 }); })();
1735
2125
  //# sourceMappingURL=source-type-form.dialog.component.js.map