@memberjunction/ng-dashboards 6.2.0-edge.5 → 6.2.0-edge.6

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 (143) hide show
  1. package/README.md +28 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +15 -7
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +209 -57
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
  11. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +28 -16
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +30 -6
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +15 -7
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/sensitive-fields.d.ts +9 -4
  26. package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -1
  27. package/dist/AI/components/vectors/sensitive-fields.js +39 -14
  28. package/dist/AI/components/vectors/sensitive-fields.js.map +1 -1
  29. package/dist/AI/components/vectors/vector-document-rules.d.ts +13 -0
  30. package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-document-rules.js +14 -0
  32. package/dist/AI/components/vectors/vector-document-rules.js.map +1 -1
  33. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +34 -14
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +127 -50
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
  38. package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
  39. package/dist/AI/components/vectors/vector-store-selection.js +57 -0
  40. package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
  41. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +236 -0
  42. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
  43. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +374 -0
  44. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
  45. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +195 -0
  46. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +1 -0
  47. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +2910 -0
  48. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +1 -0
  49. package/dist/ChiefOfStaff/index.d.ts +3 -0
  50. package/dist/ChiefOfStaff/index.d.ts.map +1 -0
  51. package/dist/ChiefOfStaff/index.js +3 -0
  52. package/dist/ChiefOfStaff/index.js.map +1 -0
  53. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  54. package/dist/Communication/communication-logs-resource.component.js +2 -1
  55. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  56. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  57. package/dist/Communication/communication-monitor-resource.component.js +23 -18
  58. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  59. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  60. package/dist/Communication/communication-runs-resource.component.js +11 -10
  61. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  62. package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
  63. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
  64. package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
  65. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
  66. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +24 -0
  67. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +146 -50
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
  71. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  72. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  73. package/dist/LoginStudio/login-studio-resource.component.d.ts +10 -2
  74. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
  75. package/dist/LoginStudio/login-studio-resource.component.js +110 -77
  76. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
  78. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  79. package/dist/MCP/mcp-dashboard.component.js +118 -65
  80. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  81. package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
  82. package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
  83. package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
  84. package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
  85. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
  86. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  87. package/dist/PredictiveStudio/components/ps-experiments.component.js +256 -521
  88. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  89. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
  90. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
  91. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +122 -249
  92. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
  93. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
  94. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  95. package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
  96. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  97. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
  98. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  99. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +335 -326
  100. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  101. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
  102. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
  103. package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
  104. package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
  105. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
  106. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  107. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +51 -2
  108. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  109. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
  110. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
  111. package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
  112. package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
  113. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
  114. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
  115. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
  116. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
  117. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
  118. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  119. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +185 -103
  120. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  121. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
  122. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  123. package/dist/ai-dashboards.module.d.ts +22 -21
  124. package/dist/ai-dashboards.module.d.ts.map +1 -1
  125. package/dist/ai-dashboards.module.js +8 -2
  126. package/dist/ai-dashboards.module.js.map +1 -1
  127. package/dist/public-api.d.ts +2 -0
  128. package/dist/public-api.d.ts.map +1 -1
  129. package/dist/public-api.js +3 -0
  130. package/dist/public-api.js.map +1 -1
  131. package/package.json +71 -71
  132. package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
  133. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
  134. package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
  135. package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
  136. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
  137. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
  138. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
  139. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
  140. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
  141. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
  142. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
  143. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +0 -1
@@ -3537,25 +3537,48 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
3537
3537
  return n;
3538
3538
  }
3539
3539
  /** Values record consumed by the centralized <mj-filter-panel>, scoped to the current tab. */
3540
+ _mcpFilterValuesCache = {};
3541
+ _mcpFilterValuesKey = '';
3542
+ /**
3543
+ * Filter values object passed to `<mj-filter-panel>`.
3544
+ * Memoized on filter field signature so template bindings do not allocate a fresh object on every CD pass.
3545
+ */
3540
3546
  get McpFilterValues() {
3541
3547
  const f = this.Filters$.value;
3542
- return {
3543
- serverStatus: f.serverStatus,
3544
- connectionStatus: f.connectionStatus,
3545
- toolStatus: f.toolStatus,
3546
- logStatus: f.logStatus,
3547
- toolsServer: f.toolsServer,
3548
- toolsCategory: f.toolsCategory,
3549
- favoritesOnly: f.favoritesOnly,
3550
- recentOnly: f.recentOnly,
3551
- };
3548
+ const key = `${f.serverStatus}|${f.connectionStatus}|${f.toolStatus}|${f.logStatus}|${f.toolsServer ?? ''}|${f.toolsCategory ?? ''}|${f.favoritesOnly ? 1 : 0}|${f.recentOnly ? 1 : 0}`;
3549
+ if (key !== this._mcpFilterValuesKey) {
3550
+ this._mcpFilterValuesKey = key;
3551
+ this._mcpFilterValuesCache = {
3552
+ serverStatus: f.serverStatus,
3553
+ connectionStatus: f.connectionStatus,
3554
+ toolStatus: f.toolStatus,
3555
+ logStatus: f.logStatus,
3556
+ toolsServer: f.toolsServer,
3557
+ toolsCategory: f.toolsCategory,
3558
+ favoritesOnly: f.favoritesOnly,
3559
+ recentOnly: f.recentOnly,
3560
+ };
3561
+ }
3562
+ return this._mcpFilterValuesCache;
3552
3563
  }
3553
3564
  /** @deprecated Use {@link McpFilterValues}. */
3554
3565
  get mcpFilterValues() {
3555
3566
  return this.McpFilterValues;
3556
3567
  }
3557
- /** Field config built dynamically based on the active tab. */
3568
+ _mcpFilterFieldsCache = [];
3569
+ _mcpFilterFieldsKey = '';
3570
+ /**
3571
+ * Field config built dynamically based on the active tab.
3572
+ * Memoized on active tab and available servers/categories so `<mj-filter-panel>` receives a stable reference across CD ticks.
3573
+ */
3558
3574
  get McpFilterFields() {
3575
+ const srvSig = this.ActiveTab === 'tools' ? this.ToolsAvailableServers.map(s => s.ID).join(',') : '';
3576
+ const catSig = this.ActiveTab === 'tools' ? this.ToolsAvailableCategories.map(c => `${c.category}:${c.count}`).join(',') : '';
3577
+ const key = `${this.ActiveTab}|${srvSig}|${catSig}`;
3578
+ if (key === this._mcpFilterFieldsKey) {
3579
+ return this._mcpFilterFieldsCache;
3580
+ }
3581
+ this._mcpFilterFieldsKey = key;
3559
3582
  const fields = [];
3560
3583
  if (this.ActiveTab === 'tools') {
3561
3584
  fields.push({
@@ -3657,6 +3680,7 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
3657
3680
  ],
3658
3681
  });
3659
3682
  }
3683
+ this._mcpFilterFieldsCache = fields;
3660
3684
  return fields;
3661
3685
  }
3662
3686
  /** @deprecated Use {@link McpFilterFields}. */
@@ -4726,43 +4750,57 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
4726
4750
  trackPagedTool(_index, tool) {
4727
4751
  return this.TrackPagedTool(_index, tool);
4728
4752
  }
4753
+ _visiblePagedToolsCache = [];
4754
+ _visiblePagedToolsKey = '';
4755
+ _testRecentToolIDsCache = [];
4756
+ _testRecentToolIDSetCache = new Set();
4757
+ _testRecentToolIDsSource = null;
4758
+ _testRecentToolIDsLen = -1;
4759
+ _testComboboxToolsCache = [];
4760
+ _testComboboxToolsKey = '';
4729
4761
  /** Part 3.6 — Scale mode display. When a client-side filter (Favorites/Recently-used) is active,
4730
4762
  * bypass server pagination and filter the fully-loaded local `this.tools` list so the filter
4731
- * considers ALL tools, not just the current 50-row page. */
4763
+ * considers ALL tools, not just the current 50-row page.
4764
+ * Memoized on filter state, tool count, favorite count, and log count to avoid repeated array allocation per CD pass. */
4732
4765
  get VisiblePagedTools() {
4733
4766
  const f = this.Filters$.value;
4734
4767
  if (f.favoritesOnly || f.recentOnly) {
4735
- const search = (f.searchTerm || '').toLowerCase();
4736
- const recent = f.recentOnly ? this.RecentToolIDSet() : null;
4737
- return this.tools
4738
- .filter(t => {
4739
- if (f.favoritesOnly && !this.IsFavorited(t.ID))
4740
- return false;
4741
- if (recent && !recent.has(NormalizeUUID(t.ID)))
4742
- return false;
4743
- if (f.toolsServer && f.toolsServer !== 'all' && !UUIDsEqual(t.MCPServerID, f.toolsServer))
4744
- return false;
4745
- if (f.toolsCategory && f.toolsCategory !== 'all') {
4746
- const idx = t.ToolName.indexOf('_');
4747
- const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;
4748
- if (cat !== f.toolsCategory)
4768
+ const key = `${f.favoritesOnly ? 1 : 0}|${f.recentOnly ? 1 : 0}|${f.toolsServer ?? ''}|${f.toolsCategory ?? ''}|${f.searchTerm ?? ''}|${this.tools.length}|${this.FavoritedToolIDs.size}|${this.ExecutionLogs.length}`;
4769
+ if (key !== this._visiblePagedToolsKey) {
4770
+ this._visiblePagedToolsKey = key;
4771
+ const search = (f.searchTerm || '').toLowerCase();
4772
+ const recent = f.recentOnly ? this.RecentToolIDSet() : null;
4773
+ this._visiblePagedToolsCache = this.tools
4774
+ .filter(t => {
4775
+ if (f.favoritesOnly && !this.IsFavorited(t.ID))
4749
4776
  return false;
4750
- }
4751
- if (search && !(t.ToolName.toLowerCase().includes(search) ||
4752
- (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||
4753
- (t.ToolDescription?.toLowerCase().includes(search) ?? false)))
4754
- return false;
4755
- return true;
4756
- })
4757
- .map(t => ({
4758
- ID: t.ID,
4759
- MCPServerID: t.MCPServerID,
4760
- ToolName: t.ToolName,
4761
- ToolTitle: t.ToolTitle ?? null,
4762
- ToolDescription: t.ToolDescription ?? null,
4763
- Status: t.Status,
4764
- ServerName: t.ServerName ?? null
4765
- }));
4777
+ if (recent && !recent.has(NormalizeUUID(t.ID)))
4778
+ return false;
4779
+ if (f.toolsServer && f.toolsServer !== 'all' && !UUIDsEqual(t.MCPServerID, f.toolsServer))
4780
+ return false;
4781
+ if (f.toolsCategory && f.toolsCategory !== 'all') {
4782
+ const idx = t.ToolName.indexOf('_');
4783
+ const cat = idx > 0 ? t.ToolName.substring(0, idx) : t.ToolName;
4784
+ if (cat !== f.toolsCategory)
4785
+ return false;
4786
+ }
4787
+ if (search && !(t.ToolName.toLowerCase().includes(search) ||
4788
+ (t.ToolTitle?.toLowerCase().includes(search) ?? false) ||
4789
+ (t.ToolDescription?.toLowerCase().includes(search) ?? false)))
4790
+ return false;
4791
+ return true;
4792
+ })
4793
+ .map(t => ({
4794
+ ID: t.ID,
4795
+ MCPServerID: t.MCPServerID,
4796
+ ToolName: t.ToolName,
4797
+ ToolTitle: t.ToolTitle ?? null,
4798
+ ToolDescription: t.ToolDescription ?? null,
4799
+ Status: t.Status,
4800
+ ServerName: t.ServerName ?? null
4801
+ }));
4802
+ }
4803
+ return this._visiblePagedToolsCache;
4766
4804
  }
4767
4805
  return this.PagedTools;
4768
4806
  }
@@ -4784,36 +4822,51 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
4784
4822
  scaleDenominator() {
4785
4823
  return this.ScaleDenominator();
4786
4824
  }
4787
- /** Part 3.5 — recently used tool IDs derived from execution logs (dedup, max 5) */
4825
+ /** Part 3.5 — recently used tool IDs derived from execution logs (dedup, max 5), memoized on `ExecutionLogs`. */
4788
4826
  get TestRecentToolIDs() {
4789
- const seen = new Set();
4790
- const out = [];
4791
- for (const log of this.ExecutionLogs) {
4792
- if (!log.ToolID)
4793
- continue;
4794
- if (seen.has(log.ToolID))
4795
- continue;
4796
- seen.add(log.ToolID);
4797
- out.push(log.ToolID);
4798
- if (out.length >= 5)
4799
- break;
4827
+ if (this._testRecentToolIDsSource !== this.ExecutionLogs ||
4828
+ this._testRecentToolIDsLen !== this.ExecutionLogs.length) {
4829
+ this._testRecentToolIDsSource = this.ExecutionLogs;
4830
+ this._testRecentToolIDsLen = this.ExecutionLogs.length;
4831
+ const seen = new Set();
4832
+ const out = [];
4833
+ for (const log of this.ExecutionLogs) {
4834
+ if (!log.ToolID)
4835
+ continue;
4836
+ if (seen.has(log.ToolID))
4837
+ continue;
4838
+ seen.add(log.ToolID);
4839
+ out.push(log.ToolID);
4840
+ if (out.length >= 5)
4841
+ break;
4842
+ }
4843
+ this._testRecentToolIDsCache = out;
4844
+ this._testRecentToolIDSetCache = seen;
4800
4845
  }
4801
- return out;
4846
+ return this._testRecentToolIDsCache;
4802
4847
  }
4803
- /** Part 3.5 — Test dialog combobox: filtered tools with recent-first ordering */
4848
+ /** Part 3.5 — Test dialog combobox: filtered tools with recent-first ordering, memoized on inputs. */
4804
4849
  get TestComboboxTools() {
4805
4850
  const term = this.TestToolSearch.trim().toLowerCase();
4806
- const base = this.TestFilteredTools.filter(t => !term ||
4807
- t.ToolName.toLowerCase().includes(term) ||
4808
- (t.ToolTitle && t.ToolTitle.toLowerCase().includes(term)) ||
4809
- (t.ToolDescription && t.ToolDescription.toLowerCase().includes(term)));
4810
- const recentSet = new Set(this.TestRecentToolIDs);
4811
- const recent = base.filter(t => recentSet.has(t.ID));
4812
- const rest = base.filter(t => !recentSet.has(t.ID));
4813
- return [...recent, ...rest];
4851
+ const base = this.TestFilteredTools;
4852
+ const recentIds = this.TestRecentToolIDs;
4853
+ const key = `${term}|${base.length}|${base[0]?.ID ?? ''}|${recentIds.join(',')}`;
4854
+ if (key !== this._testComboboxToolsKey) {
4855
+ this._testComboboxToolsKey = key;
4856
+ const filtered = base.filter(t => !term ||
4857
+ t.ToolName.toLowerCase().includes(term) ||
4858
+ (t.ToolTitle && t.ToolTitle.toLowerCase().includes(term)) ||
4859
+ (t.ToolDescription && t.ToolDescription.toLowerCase().includes(term)));
4860
+ const recentSet = this._testRecentToolIDSetCache;
4861
+ const recent = filtered.filter(t => recentSet.has(t.ID));
4862
+ const rest = filtered.filter(t => !recentSet.has(t.ID));
4863
+ this._testComboboxToolsCache = [...recent, ...rest];
4864
+ }
4865
+ return this._testComboboxToolsCache;
4814
4866
  }
4815
4867
  IsRecentTestTool(toolID) {
4816
- return this.TestRecentToolIDs.includes(toolID);
4868
+ void this.TestRecentToolIDs;
4869
+ return this._testRecentToolIDSetCache.has(toolID);
4817
4870
  }
4818
4871
  /** @deprecated Use {@link IsRecentTestTool}. */
4819
4872
  isRecentTestTool(toolID) {