@elevasis/ui 2.4.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chunk-JT7WDIZI.js → chunk-4GZ6VZWO.js} +1 -1
  2. package/dist/{chunk-WSL5MNAI.js → chunk-6RGNVHG3.js} +6 -4
  3. package/dist/{chunk-WN764MR7.js → chunk-CC4WGHGG.js} +3 -2
  4. package/dist/{chunk-PEZ4WOPF.js → chunk-DQJM7T2N.js} +2 -2
  5. package/dist/{chunk-KRTZTBVP.js → chunk-FH5QGCXL.js} +8 -6
  6. package/dist/{chunk-2DZACNOX.js → chunk-MU5EZV3L.js} +5 -3
  7. package/dist/{chunk-ISHNN42L.js → chunk-O4PMRC6J.js} +223 -59
  8. package/dist/{chunk-ZG7MLOBE.js → chunk-PEDPD3PU.js} +1 -1
  9. package/dist/{chunk-5XGBMKUY.js → chunk-PHRDZFJT.js} +3 -3
  10. package/dist/{chunk-IPRMGSCV.js → chunk-POFDRPDI.js} +1 -1
  11. package/dist/{chunk-3ONP2CEB.js → chunk-X4BLH3JL.js} +6 -4
  12. package/dist/{chunk-J5KWNRSD.js → chunk-YIWLA2B6.js} +1 -0
  13. package/dist/{chunk-G3G2QEB6.js → chunk-ZB5PKIX5.js} +4 -13
  14. package/dist/components/index.d.ts +127 -105
  15. package/dist/components/index.js +16 -16
  16. package/dist/features/crm/index.d.ts +24 -0
  17. package/dist/features/crm/index.js +5 -5
  18. package/dist/features/dashboard/index.d.ts +2 -37
  19. package/dist/features/dashboard/index.js +5 -5
  20. package/dist/features/delivery/index.d.ts +25 -0
  21. package/dist/features/delivery/index.js +5 -5
  22. package/dist/features/lead-gen/index.d.ts +25 -1
  23. package/dist/features/lead-gen/index.js +8 -8
  24. package/dist/features/monitoring/index.d.ts +25 -0
  25. package/dist/features/monitoring/index.js +6 -6
  26. package/dist/features/operations/index.d.ts +83 -59
  27. package/dist/features/operations/index.js +7 -7
  28. package/dist/features/seo/index.d.ts +25 -0
  29. package/dist/features/seo/index.js +1 -1
  30. package/dist/features/settings/index.d.ts +24 -0
  31. package/dist/features/settings/index.js +5 -5
  32. package/dist/hooks/index.d.ts +239 -239
  33. package/dist/hooks/index.js +4 -4
  34. package/dist/hooks/published.d.ts +169 -169
  35. package/dist/hooks/published.js +3 -3
  36. package/dist/index.d.ts +302 -254
  37. package/dist/index.js +4 -4
  38. package/dist/provider/index.d.ts +63 -15
  39. package/dist/provider/index.js +2 -2
  40. package/dist/provider/published.d.ts +63 -15
  41. package/dist/provider/published.js +1 -1
  42. package/dist/types/index.d.ts +134 -134
  43. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { PRESETS, getPreset, generateShades, mantineThemeOverride, createCssVariablesResolver, PresetsProvider } from './chunk-47YILFON.js';
2
2
  import { AppBackground } from './chunk-CYXZHBP4.js';
3
- import { ElevasisCoreProvider } from './chunk-ISHNN42L.js';
3
+ import { ElevasisCoreProvider } from './chunk-O4PMRC6J.js';
4
4
  import { ElevasisLoader } from './chunk-Y3D3WFJG.js';
5
5
  import { AppearanceProvider } from './chunk-QJ2KCHKX.js';
6
6
  import { getErrorInfo, formatErrorMessage, getErrorTitle } from './chunk-IOKL7BKE.js';
@@ -3,8 +3,8 @@ import { PageContainer } from './chunk-BZZCNLT6.js';
3
3
  import { SubshellSidebarSection, SubshellNavItem } from './chunk-27COZ5AH.js';
4
4
  import { FilterBar } from './chunk-PDHTXPSF.js';
5
5
  import { CustomModal } from './chunk-GBMNCNHX.js';
6
- import { useProjects, useProject, useProjectNotes, useDeleteProject as useDeleteProject$1, useUpdateMilestone, useCreateNote } from './chunk-PEZ4WOPF.js';
7
- import { useDeleteProject, useTableSort, sortData, usePaginationState, useTableSelection } from './chunk-IPRMGSCV.js';
6
+ import { useProjects, useProject, useProjectNotes, useDeleteProject as useDeleteProject$1, useUpdateMilestone, useCreateNote } from './chunk-DQJM7T2N.js';
7
+ import { useDeleteProject, useTableSort, sortData, usePaginationState, useTableSelection } from './chunk-POFDRPDI.js';
8
8
  import { SubshellContentContainer } from './chunk-RX4UWZZR.js';
9
9
  import { StatusBadge, EmptyState, PageTitleCaption, CenteredErrorState, StatCard } from './chunk-Y3D3WFJG.js';
10
10
  import { PAGE_SIZE_DEFAULT, formatTimeAgo, formatDate } from './chunk-IOKL7BKE.js';
@@ -321,11 +321,13 @@ var ProjectsSidebar = () => {
321
321
  var deliveryManifest = {
322
322
  key: "delivery",
323
323
  label: "Projects",
324
+ accessFeatureKey: "delivery",
325
+ domainIds: ["delivery"],
326
+ capabilityIds: ["delivery.projects.view"],
324
327
  navEntry: {
325
328
  label: "Projects",
326
329
  icon: IconBriefcase,
327
- link: "/projects",
328
- featureKey: "delivery"
330
+ link: "/projects"
329
331
  },
330
332
  sidebar: ProjectsSidebar,
331
333
  subshellRoutes: ["/projects"]
@@ -2,8 +2,8 @@ import { FilterBar } from './chunk-PDHTXPSF.js';
2
2
  import { CustomModal } from './chunk-GBMNCNHX.js';
3
3
  import { AppShellLoader } from './chunk-YEX4MQSY.js';
4
4
  import { useAvailablePresets } from './chunk-VNUOQQNY.js';
5
- import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas } from './chunk-PEZ4WOPF.js';
6
- import { useResources, showErrorNotification } from './chunk-IPRMGSCV.js';
5
+ import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas } from './chunk-DQJM7T2N.js';
6
+ import { useResources, showErrorNotification } from './chunk-POFDRPDI.js';
7
7
  import { ListSkeleton, EmptyState, PageTitleCaption, CardHeader, APIErrorAlert, StatCard } from './chunk-Y3D3WFJG.js';
8
8
  import { formatDateTime, OAUTH_POPUP_CHECK_INTERVAL, OAUTH_FLOW_TIMEOUT } from './chunk-IOKL7BKE.js';
9
9
  import { useInitialization } from './chunk-TUXTSEAF.js';
@@ -2005,6 +2005,7 @@ function OAuthIntegrationsCard({ apiUrl }) {
2005
2005
  var settingsManifest = {
2006
2006
  key: "settings",
2007
2007
  label: "Settings",
2008
+ accessFeatureKey: "settings",
2008
2009
  navEntry: {
2009
2010
  label: "Settings",
2010
2011
  icon: IconSettings,
@@ -1,6 +1,6 @@
1
- import { CredentialNameSchema, UuidSchema, useErrorNotification, showApiErrorNotification } from './chunk-IPRMGSCV.js';
1
+ import { CredentialNameSchema, UuidSchema, useErrorNotification, showApiErrorNotification } from './chunk-POFDRPDI.js';
2
2
  import { getTimeRangeDates } from './chunk-LXHZYSMQ.js';
3
- import { useNotificationAdapter } from './chunk-ISHNN42L.js';
3
+ import { useNotificationAdapter } from './chunk-O4PMRC6J.js';
4
4
  import { GC_TIME_SHORT, STALE_TIME_MONITORING, GC_TIME_MEDIUM, STALE_TIME_DEFAULT } from './chunk-IOKL7BKE.js';
5
5
  import { useElevasisServices } from './chunk-QEPXAWE2.js';
6
6
  import { z } from 'zod';
@@ -1,17 +1,17 @@
1
1
  import { ChatHeader, ChatSidebar } from './chunk-ROSMICXG.js';
2
2
  import { SubshellLoader, CollapsibleSidebarGroup } from './chunk-IDACMRGQ.js';
3
- import { ResourceHealthPanel } from './chunk-ZG7MLOBE.js';
3
+ import { ResourceHealthPanel } from './chunk-PEDPD3PU.js';
4
4
  import { PageContainer } from './chunk-BZZCNLT6.js';
5
5
  import { SubshellSidebarSection, SubshellNavItem } from './chunk-27COZ5AH.js';
6
6
  import { CustomModal, ConfirmationModal } from './chunk-GBMNCNHX.js';
7
- import { BaseNode, useGraphTheme, BaseEdge, ExecutionStats, UnifiedWorkflowGraph, WorkflowExecutionTimeline, AgentExecutionVisualizer, AgentExecutionTimeline, GraphBackground, GraphFitViewButton, GraphFitViewHandler } from './chunk-G3G2QEB6.js';
7
+ import { BaseNode, useGraphTheme, BaseEdge, ExecutionStats, UnifiedWorkflowGraph, WorkflowExecutionTimeline, AgentExecutionVisualizer, AgentExecutionTimeline, GraphBackground, GraphFitViewButton, GraphFitViewHandler } from './chunk-ZB5PKIX5.js';
8
8
  import { useCyberColors, CyberDonut } from './chunk-KFICYU6S.js';
9
9
  import { AppShellLoader } from './chunk-YEX4MQSY.js';
10
10
  import { getResourceStatusColor, useMergedExecution, useTimelineData, useAgentIterationData, getStatusIcon } from './chunk-XA34RETF.js';
11
- import { useStatusFilter, useResourceSearch, useResourcesDomainFilters, filterByDomainFilters, useCommandViewDomainFilters } from './chunk-PEZ4WOPF.js';
12
- import { useErrorDetail, useExecution, useArchivedLogs, useDeleteExecution, useRetryExecution, useCancelExecution, useCommandQueueTotals, usePaginationState, useResources, useRecentExecutionsByResource, useExecuteAsync, useResourceDefinition, isSessionCapable, useDeleteTask, useCommandQueue, useSubmitAction, useCommandViewData, useCommandViewStats, useResourceExecutions, useCheckpointTasks, useCalibrationProjects, useCalibrationProject, useAllCalibrationProjects, useCommandViewStore, useCalibrationSSE, useCalibrationRunFull, useExecuteRun, useGradeRun, useCalibrationRuns, useExecutionPanelState, useDeleteSession, useCreateSession, useSessions, useSessionExecutions, useSession, showApiErrorNotification, showSuccessNotification, calibrationKeys, useDeleteProject, useCreateProject, useBulkDeleteExecutions } from './chunk-IPRMGSCV.js';
11
+ import { useStatusFilter, useResourceSearch, useResourcesDomainFilters, filterByDomainFilters, useCommandViewDomainFilters } from './chunk-DQJM7T2N.js';
12
+ import { useErrorDetail, useExecution, useArchivedLogs, useDeleteExecution, useRetryExecution, useCancelExecution, useCommandQueueTotals, usePaginationState, useResources, useRecentExecutionsByResource, useExecuteAsync, useResourceDefinition, isSessionCapable, useDeleteTask, useCommandQueue, useSubmitAction, useCommandViewData, useCommandViewStats, useResourceExecutions, useCheckpointTasks, useCalibrationProjects, useCalibrationProject, useAllCalibrationProjects, useCommandViewStore, useCalibrationSSE, useCalibrationRunFull, useExecuteRun, useGradeRun, useCalibrationRuns, useExecutionPanelState, useDeleteSession, useCreateSession, useSessions, useSessionExecutions, useSession, showApiErrorNotification, showSuccessNotification, calibrationKeys, useDeleteProject, useCreateProject, useBulkDeleteExecutions } from './chunk-POFDRPDI.js';
13
13
  import { useGraphHighlighting, calculateGraphHeight, Graph_module_css_default, GRAPH_CONSTANTS } from './chunk-22UVE3RA.js';
14
- import { useOptionalElevasisFeatures, useElevasisFeatures } from './chunk-ISHNN42L.js';
14
+ import { useOptionalElevasisFeatures, useElevasisFeatures } from './chunk-O4PMRC6J.js';
15
15
  import { SubshellContainer, SubshellSidebar, SubshellRightSideContainer, SubshellContentContainer } from './chunk-RX4UWZZR.js';
16
16
  import { JsonViewer, CardHeader, PageTitleCaption, CollapsibleSection, TabCountBadge, ResourceCard, ContextViewer, EmptyState, APIErrorAlert } from './chunk-Y3D3WFJG.js';
17
17
  import { StyledMarkdown } from './chunk-3KMDHCAR.js';
@@ -8988,6 +8988,9 @@ function CommandQueueShell({
8988
8988
  var operationsManifest = {
8989
8989
  key: "operations",
8990
8990
  label: "Operations",
8991
+ accessFeatureKey: "operations",
8992
+ domainIds: ["operations"],
8993
+ capabilityIds: ["operations.organization-graph", "operations.command-view"],
8991
8994
  sidebar: OperationsSidebar,
8992
8995
  subshellRoutes: ["/operations"],
8993
8996
  organizationGraph: {
@@ -8996,7 +8999,6 @@ var operationsManifest = {
8996
8999
  navEntry: {
8997
9000
  label: "Operations",
8998
9001
  icon: IconCode,
8999
- featureKey: "operations",
9000
9002
  dataOnboardingTourId: "sidebar-operations",
9001
9003
  links: [
9002
9004
  { label: "Overview", link: "/operations" },
@@ -3,7 +3,7 @@ import { PageContainer } from './chunk-BZZCNLT6.js';
3
3
  import { SubshellSidebarSection, SubshellNavItem } from './chunk-27COZ5AH.js';
4
4
  import { FilterBar } from './chunk-PDHTXPSF.js';
5
5
  import { CustomModal } from './chunk-GBMNCNHX.js';
6
- import { useDealTasksDue, useDeals, useCreateDealTask, useDeleteDeal, useTableSort, sortData, usePaginationState, useTableSelection, useDealDetail } from './chunk-IPRMGSCV.js';
6
+ import { useDealTasksDue, useDeals, useCreateDealTask, useDeleteDeal, useTableSort, sortData, usePaginationState, useTableSelection, useDealDetail } from './chunk-POFDRPDI.js';
7
7
  import { SubshellContentContainer } from './chunk-RX4UWZZR.js';
8
8
  import { CenteredErrorState, CardHeader, PageTitleCaption, EmptyState, ActivityTimeline } from './chunk-Y3D3WFJG.js';
9
9
  import { PAGE_SIZE_DEFAULT, formatTimeAgo } from './chunk-IOKL7BKE.js';
@@ -694,13 +694,15 @@ function CrmOverview({
694
694
  var crmManifest = {
695
695
  key: "crm",
696
696
  label: "CRM",
697
+ accessFeatureKey: "acquisition",
698
+ domainIds: ["crm"],
699
+ capabilityIds: ["crm.pipeline.manage"],
697
700
  sidebar: CrmSidebar,
698
701
  subshellRoutes: ["/crm"],
699
702
  navEntry: {
700
703
  label: "CRM",
701
704
  icon: IconAddressBook,
702
- link: "/crm",
703
- featureKey: "acquisition"
705
+ link: "/crm"
704
706
  }
705
707
  };
706
708
 
@@ -183,17 +183,6 @@ function useElevasisFeatures() {
183
183
  function useOptionalElevasisFeatures() {
184
184
  return useContext(ElevasisFeaturesContext);
185
185
  }
186
- function getEnabledFeatures(features, hasFeature) {
187
- return features.filter((feature) => {
188
- const accessKeys = [feature.key, feature.navEntry?.featureKey].filter(
189
- (key) => Boolean(key)
190
- );
191
- if (accessKeys.length === 0) {
192
- return true;
193
- }
194
- return accessKeys.some((key) => hasFeature(key));
195
- });
196
- }
197
186
  function normalizeRoutePath(path) {
198
187
  const trimmedPath = path.trim();
199
188
  if (!trimmedPath || trimmedPath === "/") {
@@ -206,6 +195,9 @@ function isRouteMatch(currentPath, route) {
206
195
  const normalizedRoute = normalizeRoutePath(route);
207
196
  return normalizedCurrentPath === normalizedRoute || normalizedCurrentPath.startsWith(`${normalizedRoute}/`);
208
197
  }
198
+ function uniqueIds(ids) {
199
+ return ids ? [...new Set(ids)] : [];
200
+ }
209
201
  function hasOrganizationModelFeatureKey(organizationModel, key) {
210
202
  if (!organizationModel) {
211
203
  return false;
@@ -227,6 +219,15 @@ function findSurfaceById(organizationModel, id) {
227
219
  }
228
220
  return organizationModel.navigation.surfaces.find((surface) => surface.id === id);
229
221
  }
222
+ function findSurfacesByPaths(organizationModel, paths) {
223
+ if (!organizationModel || paths.length === 0) {
224
+ return [];
225
+ }
226
+ const normalizedPaths = new Set(paths.map((path) => normalizeRoutePath(path)));
227
+ return organizationModel.navigation.surfaces.filter(
228
+ (surface) => normalizedPaths.has(normalizeRoutePath(surface.path))
229
+ );
230
+ }
230
231
  function getOrganizationModelFeatureLabel(organizationModel, key) {
231
232
  if (!organizationModel || !key) {
232
233
  return void 0;
@@ -245,6 +246,12 @@ function isOrganizationModelFeatureEnabled(organizationModel, key) {
245
246
  }
246
247
  return organizationModel.features.enabled[key];
247
248
  }
249
+ function collectNavLinkPaths(links) {
250
+ if (!links?.length) {
251
+ return [];
252
+ }
253
+ return links.flatMap((link) => [link.link, ...collectNavLinkPaths(link.links)]);
254
+ }
248
255
  function resolveOrganizationGraphSurface(features, organizationModel) {
249
256
  for (const feature of features) {
250
257
  const graphBridge = feature.organizationGraph;
@@ -274,22 +281,66 @@ function resolveNavLink(link, organizationModel) {
274
281
  links: link.links?.map((nestedLink) => resolveNavLink(nestedLink, organizationModel))
275
282
  };
276
283
  }
284
+ function resolveNavEntry(navEntry, organizationModel) {
285
+ const matchedSurface = navEntry.link ? findSurfaceByPath(organizationModel, navEntry.link) : void 0;
286
+ const featureLabel = getOrganizationModelFeatureLabel(organizationModel, navEntry.featureKey);
287
+ return {
288
+ ...navEntry,
289
+ label: matchedSurface?.label ?? featureLabel ?? navEntry.label,
290
+ link: matchedSurface?.path ?? navEntry.link,
291
+ links: navEntry.links?.map((link) => resolveNavLink(link, organizationModel))
292
+ };
293
+ }
277
294
  function resolveFeatureModule(feature, organizationModel) {
278
295
  if (!feature.navEntry) {
279
296
  return feature;
280
297
  }
281
- const matchedSurface = feature.navEntry.link ? findSurfaceByPath(organizationModel, feature.navEntry.link) : void 0;
282
- const featureLabel = getOrganizationModelFeatureLabel(organizationModel, feature.navEntry.featureKey);
283
298
  return {
284
299
  ...feature,
285
- navEntry: {
286
- ...feature.navEntry,
287
- label: matchedSurface?.label ?? featureLabel ?? feature.navEntry.label,
288
- link: matchedSurface?.path ?? feature.navEntry.link,
289
- links: feature.navEntry.links?.map((link) => resolveNavLink(link, organizationModel))
290
- }
300
+ navEntry: resolveNavEntry(feature.navEntry, organizationModel)
291
301
  };
292
302
  }
303
+ function resolveFeatureSemantics(feature, resolvedFeature, organizationModel) {
304
+ const linkedPaths = [
305
+ resolvedFeature.navEntry?.link,
306
+ ...collectNavLinkPaths(resolvedFeature.navEntry?.links)
307
+ ].filter((path) => Boolean(path));
308
+ const linkedSurfaces = findSurfacesByPaths(organizationModel, linkedPaths);
309
+ const organizationGraphSurface = feature.organizationGraph ? findSurfaceById(organizationModel, feature.organizationGraph.surfaceId) : void 0;
310
+ const surfaces = [
311
+ ...linkedSurfaces,
312
+ ...organizationGraphSurface ? [organizationGraphSurface] : []
313
+ ].filter(
314
+ (surface, index, items) => Boolean(surface) && items.findIndex((candidate) => candidate.id === surface.id) === index
315
+ );
316
+ return {
317
+ domainIds: uniqueIds([
318
+ ...feature.domainIds ?? [],
319
+ ...surfaces.flatMap((surface) => surface.domainIds)
320
+ ]),
321
+ capabilityIds: uniqueIds([
322
+ ...feature.capabilityIds ?? [],
323
+ ...surfaces.flatMap((surface) => surface.capabilityIds)
324
+ ]),
325
+ surfaceIds: surfaces.map((surface) => surface.id),
326
+ surfaces
327
+ };
328
+ }
329
+ function resolveFeatureModules(features, organizationModel, isFeatureEnabled) {
330
+ return features.map((feature) => {
331
+ const resolvedFeature = resolveFeatureModule(feature, organizationModel);
332
+ const accessFeatureKey = feature.accessFeatureKey;
333
+ return {
334
+ ...resolvedFeature,
335
+ access: {
336
+ featureKey: accessFeatureKey,
337
+ label: getOrganizationModelFeatureLabel(organizationModel, accessFeatureKey),
338
+ enabled: isFeatureEnabled(accessFeatureKey)
339
+ },
340
+ semantics: resolveFeatureSemantics(feature, resolvedFeature, organizationModel)
341
+ };
342
+ });
343
+ }
293
344
  function filterNavLinks(links, disabledSubsectionPaths, isFeatureEnabled) {
294
345
  return links.flatMap((link) => {
295
346
  if (link.featureKey && !isFeatureEnabled(link.featureKey)) {
@@ -307,7 +358,7 @@ function filterNavLinks(links, disabledSubsectionPaths, isFeatureEnabled) {
307
358
  ];
308
359
  });
309
360
  }
310
- function getNavItems(features, disabledSubsectionPaths, isFeatureEnabled) {
361
+ function getFeatureNavItems(features, disabledSubsectionPaths, isFeatureEnabled) {
311
362
  return features.flatMap((feature) => {
312
363
  if (!feature.navEntry) {
313
364
  return [];
@@ -316,7 +367,47 @@ function getNavItems(features, disabledSubsectionPaths, isFeatureEnabled) {
316
367
  return [
317
368
  {
318
369
  ...feature.navEntry,
319
- links
370
+ links,
371
+ placement: "primary",
372
+ source: "feature",
373
+ shellModuleKey: feature.key,
374
+ accessFeatureKey: feature.access.featureKey
375
+ }
376
+ ];
377
+ });
378
+ }
379
+ function resolveAppShellOverrides(appShellOverrides, organizationModel) {
380
+ if (!appShellOverrides) {
381
+ return {};
382
+ }
383
+ return {
384
+ primaryNavItems: appShellOverrides.primaryNavItems?.map(
385
+ (navItem) => resolveNavEntry(navItem, organizationModel)
386
+ ),
387
+ bottomNavItems: appShellOverrides.bottomNavItems?.map(
388
+ (navItem) => resolveNavEntry(navItem, organizationModel)
389
+ )
390
+ };
391
+ }
392
+ function getAppShellNavItems(navItems, placement, disabledSubsectionPaths, isFeatureEnabled) {
393
+ if (!navItems?.length) {
394
+ return [];
395
+ }
396
+ return navItems.flatMap((navItem) => {
397
+ if (navItem.featureKey && !isFeatureEnabled(navItem.featureKey)) {
398
+ return [];
399
+ }
400
+ const links = navItem.links?.length ? filterNavLinks(navItem.links, disabledSubsectionPaths, isFeatureEnabled) : void 0;
401
+ if (navItem.links && !links?.length && !navItem.link) {
402
+ return [];
403
+ }
404
+ return [
405
+ {
406
+ ...navItem,
407
+ links,
408
+ placement,
409
+ source: "app",
410
+ accessFeatureKey: navItem.featureKey
320
411
  }
321
412
  ];
322
413
  });
@@ -341,7 +432,7 @@ function isHiddenNavLink(link, disabledSubsectionPaths, isFeatureEnabled) {
341
432
  }
342
433
  return disabledSubsectionPaths.some((disabledPath) => isRouteMatch(link.link, disabledPath));
343
434
  }
344
- function resolveNavRoute(features, currentPath, disabledSubsectionPaths, isFeatureEnabled) {
435
+ function resolveRoute(features, currentPath, disabledSubsectionPaths, isFeatureEnabled) {
345
436
  for (const feature of features) {
346
437
  const navEntry = feature.navEntry;
347
438
  const matchesSubshell = feature.subshellRoutes?.some((route) => isRouteMatch(currentPath, route)) ?? false;
@@ -352,29 +443,42 @@ function resolveNavRoute(features, currentPath, disabledSubsectionPaths, isFeatu
352
443
  }
353
444
  if (matchedLink && isHiddenNavLink(matchedLink, disabledSubsectionPaths, isFeatureEnabled)) {
354
445
  return {
355
- state: "disabled",
446
+ status: "hidden",
356
447
  path: currentPath,
357
448
  feature,
358
- navEntry,
449
+ navItem: feature.navEntry ? {
450
+ ...feature.navEntry,
451
+ placement: "primary",
452
+ source: "feature",
453
+ shellModuleKey: feature.key,
454
+ accessFeatureKey: feature.access.featureKey
455
+ } : void 0,
359
456
  navLink: matchedLink
360
457
  };
361
458
  }
362
459
  return {
363
- state: "enabled",
460
+ status: "matched",
364
461
  path: currentPath,
365
462
  feature,
366
- navEntry,
463
+ navItem: feature.navEntry ? {
464
+ ...feature.navEntry,
465
+ placement: "primary",
466
+ source: "feature",
467
+ shellModuleKey: feature.key,
468
+ accessFeatureKey: feature.access.featureKey
469
+ } : void 0,
367
470
  navLink: matchedLink ?? void 0
368
471
  };
369
472
  }
370
473
  return {
371
- state: "missing",
474
+ status: "unmatched",
372
475
  path: currentPath
373
476
  };
374
477
  }
375
478
  function ElevasisFeaturesProvider({
376
479
  features,
377
480
  organizationModel,
481
+ appShellOverrides,
378
482
  timeRange,
379
483
  operationsApiUrl,
380
484
  operationsSSEManager,
@@ -402,39 +506,100 @@ function ElevasisFeaturesProvider({
402
506
  () => disabledSubsectionPaths.map((path) => normalizeRoutePath(path)),
403
507
  [disabledSubsectionPaths]
404
508
  );
405
- const enabledFeatures = useMemo(
406
- () => getEnabledFeatures(features, hasResolvedFeature).map((feature) => resolveFeatureModule(feature, organizationModel)),
407
- [features, hasResolvedFeature, organizationModel]
509
+ const resolvedFeatures = useMemo(
510
+ () => resolveFeatureModules(features, organizationModel, hasResolvedFeature),
511
+ [features, organizationModel, hasResolvedFeature]
408
512
  );
409
- const allFeatures = useMemo(
410
- () => features.map((feature) => resolveFeatureModule(feature, organizationModel)),
411
- [features, organizationModel]
513
+ const resolvedAppShellOverrides = useMemo(
514
+ () => resolveAppShellOverrides(appShellOverrides, organizationModel),
515
+ [appShellOverrides, organizationModel]
412
516
  );
413
- const navItems = useMemo(
414
- () => getNavItems(enabledFeatures, normalizedDisabledSubsectionPaths, hasResolvedFeature),
415
- [enabledFeatures, normalizedDisabledSubsectionPaths, hasResolvedFeature]
517
+ const enabledResolvedFeatures = useMemo(
518
+ () => resolvedFeatures.filter((feature) => feature.access.enabled),
519
+ [resolvedFeatures]
520
+ );
521
+ const featureNavItems = useMemo(
522
+ () => getFeatureNavItems(
523
+ enabledResolvedFeatures,
524
+ normalizedDisabledSubsectionPaths,
525
+ hasResolvedFeature
526
+ ),
527
+ [enabledResolvedFeatures, normalizedDisabledSubsectionPaths, hasResolvedFeature]
528
+ );
529
+ const primaryNavItems = useMemo(
530
+ () => [
531
+ ...getAppShellNavItems(
532
+ resolvedAppShellOverrides.primaryNavItems,
533
+ "primary",
534
+ normalizedDisabledSubsectionPaths,
535
+ hasResolvedFeature
536
+ ),
537
+ ...featureNavItems
538
+ ],
539
+ [
540
+ resolvedAppShellOverrides.primaryNavItems,
541
+ normalizedDisabledSubsectionPaths,
542
+ hasResolvedFeature,
543
+ featureNavItems
544
+ ]
545
+ );
546
+ const bottomNavItems = useMemo(
547
+ () => getAppShellNavItems(
548
+ resolvedAppShellOverrides.bottomNavItems,
549
+ "bottom",
550
+ normalizedDisabledSubsectionPaths,
551
+ hasResolvedFeature
552
+ ),
553
+ [
554
+ resolvedAppShellOverrides.bottomNavItems,
555
+ normalizedDisabledSubsectionPaths,
556
+ hasResolvedFeature
557
+ ]
558
+ );
559
+ const shellNavItems = useMemo(
560
+ () => [...primaryNavItems, ...bottomNavItems],
561
+ [primaryNavItems, bottomNavItems]
562
+ );
563
+ const shellModel = useMemo(
564
+ () => ({
565
+ navItems: shellNavItems
566
+ }),
567
+ [shellNavItems]
416
568
  );
417
569
  const organizationGraph = useMemo(
418
- () => resolveOrganizationGraphSurface(enabledFeatures, organizationModel),
419
- [enabledFeatures, organizationModel]
570
+ () => resolveOrganizationGraphSurface(enabledResolvedFeatures, organizationModel),
571
+ [enabledResolvedFeatures, organizationModel]
420
572
  );
421
- const getFeature = useCallback(
422
- (key) => allFeatures.find((feature) => feature.key === key),
423
- [allFeatures]
573
+ const getResolvedFeature = useCallback(
574
+ (key) => resolvedFeatures.find((feature) => feature.key === key),
575
+ [resolvedFeatures]
424
576
  );
425
577
  const isFeatureEnabled = useCallback(
426
578
  (key) => hasResolvedFeature(key),
427
579
  [hasResolvedFeature]
428
580
  );
429
- const resolveNavRouteByPath = useCallback(
430
- (path) => resolveNavRoute(enabledFeatures, path, normalizedDisabledSubsectionPaths, isFeatureEnabled),
431
- [enabledFeatures, normalizedDisabledSubsectionPaths, isFeatureEnabled]
581
+ const resolveRouteByPath = useCallback(
582
+ (path) => resolveRoute(
583
+ enabledResolvedFeatures,
584
+ path,
585
+ normalizedDisabledSubsectionPaths,
586
+ isFeatureEnabled
587
+ ),
588
+ [enabledResolvedFeatures, normalizedDisabledSubsectionPaths, isFeatureEnabled]
589
+ );
590
+ const shellRuntime = useMemo(
591
+ () => ({
592
+ shellModel,
593
+ resolveRoute: resolveRouteByPath
594
+ }),
595
+ [shellModel, resolveRouteByPath]
432
596
  );
433
597
  const value = useMemo(
434
598
  () => ({
435
- navItems,
436
- enabledFeatures,
437
- allFeatures,
599
+ shellModel,
600
+ shellRuntime,
601
+ enabledResolvedFeatures,
602
+ resolvedFeatures,
438
603
  organizationGraph,
439
604
  organizationModel,
440
605
  timeRange,
@@ -442,13 +607,13 @@ function ElevasisFeaturesProvider({
442
607
  operationsSSEManager,
443
608
  disabledSubsectionPaths: normalizedDisabledSubsectionPaths,
444
609
  isFeatureEnabled,
445
- getFeature,
446
- resolveNavRoute: resolveNavRouteByPath
610
+ getResolvedFeature
447
611
  }),
448
612
  [
449
- navItems,
450
- enabledFeatures,
451
- allFeatures,
613
+ shellModel,
614
+ shellRuntime,
615
+ enabledResolvedFeatures,
616
+ resolvedFeatures,
452
617
  organizationGraph,
453
618
  organizationModel,
454
619
  timeRange,
@@ -456,23 +621,22 @@ function ElevasisFeaturesProvider({
456
621
  operationsSSEManager,
457
622
  normalizedDisabledSubsectionPaths,
458
623
  isFeatureEnabled,
459
- getFeature,
460
- resolveNavRouteByPath
624
+ getResolvedFeature
461
625
  ]
462
626
  );
463
627
  return /* @__PURE__ */ jsx(ElevasisFeaturesContext.Provider, { value, children });
464
628
  }
465
629
  function FeatureShell({ children }) {
466
- const { resolveNavRoute: resolveNavRoute2 } = useElevasisFeatures();
630
+ const { shellRuntime } = useElevasisFeatures();
467
631
  const { currentPath } = useRouterContext();
468
- const routeResolution = resolveNavRoute2(currentPath);
469
- if (routeResolution.state === "disabled") {
632
+ const routeMatch = shellRuntime.resolveRoute(currentPath);
633
+ if (routeMatch.status === "hidden") {
470
634
  return /* @__PURE__ */ jsx(FeatureUnavailableState, { path: currentPath });
471
635
  }
472
- if (routeResolution.state !== "enabled" || !routeResolution.feature?.sidebar) {
636
+ if (routeMatch.status !== "matched" || !routeMatch.feature?.sidebar) {
473
637
  return /* @__PURE__ */ jsx(Fragment, { children });
474
638
  }
475
- const SidebarComponent = routeResolution.feature.sidebar;
639
+ const SidebarComponent = routeMatch.feature.sidebar;
476
640
  return /* @__PURE__ */ jsxs(SubshellContainer, { children: [
477
641
  /* @__PURE__ */ jsx(SubshellSidebar, { width: 250, children: /* @__PURE__ */ jsx(SidebarComponent, {}) }),
478
642
  /* @__PURE__ */ jsx(SubshellRightSideContainer, { children })
@@ -1,5 +1,5 @@
1
1
  import { useCyberColors, CyberLegendItem, CyberAreaChart } from './chunk-KFICYU6S.js';
2
- import { useResourcesHealth } from './chunk-IPRMGSCV.js';
2
+ import { useResourcesHealth } from './chunk-POFDRPDI.js';
3
3
  import { getTimeRangeDates, formatBucketTime } from './chunk-LXHZYSMQ.js';
4
4
  import { CardHeader, EmptyState } from './chunk-Y3D3WFJG.js';
5
5
  import { Paper, Center, Loader, Group } from '@mantine/core';
@@ -3,8 +3,8 @@ import { CustomModal } from './chunk-GBMNCNHX.js';
3
3
  import { CyberAreaChart, CostTrendChart, ActivityTrendChart } from './chunk-KFICYU6S.js';
4
4
  import { AppShellLoader } from './chunk-YEX4MQSY.js';
5
5
  import { formatDuration } from './chunk-XA34RETF.js';
6
- import { useExecutionLogsFilters, useTimeRangeDates, useActivityFilters } from './chunk-PEZ4WOPF.js';
7
- import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead, useTestNotification } from './chunk-IPRMGSCV.js';
6
+ import { useExecutionLogsFilters, useTimeRangeDates, useActivityFilters } from './chunk-DQJM7T2N.js';
7
+ import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead, useTestNotification } from './chunk-POFDRPDI.js';
8
8
  import { formatBucketTime, getTimeRangeDates } from './chunk-LXHZYSMQ.js';
9
9
  import { CenteredErrorState, CardHeader, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, EmptyState, PageTitleCaption, JsonViewer } from './chunk-Y3D3WFJG.js';
10
10
  import { PAGE_SIZE_DEFAULT } from './chunk-IOKL7BKE.js';
@@ -1791,10 +1791,10 @@ function NotificationCenter({ pageSize = 20 }) {
1791
1791
  var monitoringManifest = {
1792
1792
  key: "monitoring",
1793
1793
  label: "Monitoring",
1794
+ accessFeatureKey: "monitoring",
1794
1795
  navEntry: {
1795
1796
  label: "Monitoring",
1796
1797
  icon: IconActivity,
1797
- featureKey: "monitoring",
1798
1798
  dataOnboardingTourId: "sidebar-monitoring",
1799
1799
  links: [
1800
1800
  { label: "Activity Log", link: "/monitoring/activity-log" },
@@ -1,6 +1,6 @@
1
1
  import { getTimeRangeDates, observabilityKeys } from './chunk-LXHZYSMQ.js';
2
2
  import { GRAPH_CONSTANTS } from './chunk-22UVE3RA.js';
3
- import { useNotificationAdapter } from './chunk-ISHNN42L.js';
3
+ import { useNotificationAdapter } from './chunk-O4PMRC6J.js';
4
4
  import { HTTP_HEADERS } from './chunk-NVOCKXUQ.js';
5
5
  import { STALE_TIME_MONITORING, REFETCH_INTERVAL_DASHBOARD, REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, getErrorInfo, formatErrorMessage, getErrorTitle, STALE_TIME_DEFAULT, STALE_TIME_ADMIN, APIClientError } from './chunk-IOKL7BKE.js';
6
6
  import { useStableAccessToken } from './chunk-MTJ43R2E.js';
@@ -1,10 +1,10 @@
1
- import { ResourceExecuteDialog } from './chunk-KRTZTBVP.js';
1
+ import { ResourceExecuteDialog } from './chunk-FH5QGCXL.js';
2
2
  import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
3
3
  import { PageContainer } from './chunk-BZZCNLT6.js';
4
4
  import { SubshellSidebarSection, SubshellNavItem } from './chunk-27COZ5AH.js';
5
5
  import { FilterBar } from './chunk-PDHTXPSF.js';
6
6
  import { CustomModal } from './chunk-GBMNCNHX.js';
7
- import { showApiErrorNotification, acquisitionListKeys, showSuccessNotification, useListsTelemetry, useLists, useCreateList, useTableSort, sortData, usePaginationState, useTableSelection, useList, useListProgress, useListExecutions, useResourceDefinition, useCompanies, useDeleteCompanies, useContacts, useDeleteContacts } from './chunk-IPRMGSCV.js';
7
+ import { showApiErrorNotification, acquisitionListKeys, showSuccessNotification, useListsTelemetry, useLists, useCreateList, useTableSort, sortData, usePaginationState, useTableSelection, useList, useListProgress, useListExecutions, useResourceDefinition, useCompanies, useDeleteCompanies, useContacts, useDeleteContacts } from './chunk-POFDRPDI.js';
8
8
  import { SubshellContentContainer } from './chunk-RX4UWZZR.js';
9
9
  import { PageTitleCaption, CenteredErrorState, StatCard, EmptyState } from './chunk-Y3D3WFJG.js';
10
10
  import { useElevasisServices } from './chunk-QEPXAWE2.js';
@@ -51,13 +51,15 @@ var LeadGenSidebar = () => {
51
51
  var leadGenManifest = {
52
52
  key: "lead-gen",
53
53
  label: "Lead Gen",
54
+ accessFeatureKey: "acquisition",
55
+ domainIds: ["lead-gen"],
56
+ capabilityIds: ["leadgen.lists.manage"],
54
57
  sidebar: LeadGenSidebar,
55
58
  subshellRoutes: ["/lead-gen"],
56
59
  navEntry: {
57
60
  label: "Lead Gen",
58
61
  icon: IconTarget,
59
- link: "/lead-gen",
60
- featureKey: "acquisition"
62
+ link: "/lead-gen"
61
63
  }
62
64
  };
63
65
  var LEAD_GEN_ROUTE_LINKS = [
@@ -38,6 +38,7 @@ var SEOSidebar = () => {
38
38
  var seoManifest = {
39
39
  key: "seo",
40
40
  label: "SEO",
41
+ accessFeatureKey: "seo",
41
42
  sidebar: SEOSidebar,
42
43
  subshellRoutes: ["/seo"]
43
44
  };