@elevasis/ui 2.32.0 → 2.33.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 (91) hide show
  1. package/dist/app/index.d.ts +3 -0
  2. package/dist/app/index.js +3 -3
  3. package/dist/{chunk-LLRXA7D7.js → chunk-2VYMDNJ3.js} +1 -1
  4. package/dist/{chunk-7KZINJLP.js → chunk-3YZRKADM.js} +4 -4
  5. package/dist/{chunk-MOY4VOHF.js → chunk-4AAZXKLL.js} +1 -1
  6. package/dist/{chunk-RQTWIXJ5.js → chunk-53436UTQ.js} +1 -1
  7. package/dist/{chunk-WQPX44YM.js → chunk-AV2TKVVV.js} +673 -168
  8. package/dist/chunk-CLDCYJQT.js +1 -0
  9. package/dist/chunk-DWXDNT7P.js +145 -0
  10. package/dist/{chunk-T35FWDAB.js → chunk-DYIDXUJS.js} +1089 -158
  11. package/dist/{chunk-IQHU7O5Y.js → chunk-F3MXFE72.js} +1 -1
  12. package/dist/{chunk-5FJJ72HU.js → chunk-FOUYP4JX.js} +1 -1
  13. package/dist/{chunk-QQHOKTJA.js → chunk-H6EFQP2P.js} +39 -2
  14. package/dist/{chunk-5J4PDX26.js → chunk-KW7ZNQD7.js} +16 -2
  15. package/dist/{chunk-ZQOKIGZP.js → chunk-NCEQGEW5.js} +4 -4
  16. package/dist/{chunk-6DWD423K.js → chunk-PIS24NIV.js} +1 -1
  17. package/dist/{chunk-4MFNGNHF.js → chunk-QVTIOT73.js} +2 -2
  18. package/dist/{chunk-GCOQ3TBG.js → chunk-SWMQTF2H.js} +2 -2
  19. package/dist/{chunk-4QK76KIF.js → chunk-UNVRVCXZ.js} +1 -1
  20. package/dist/{chunk-VRNMNB3O.js → chunk-UYRT7SPM.js} +1 -1
  21. package/dist/{chunk-IZWTVFJ2.js → chunk-V6SZ4ECN.js} +6 -3
  22. package/dist/{chunk-YLQEVSOR.js → chunk-WGUEIGPC.js} +202 -54
  23. package/dist/{chunk-QXCDKE2O.js → chunk-WJOE76FI.js} +9 -28
  24. package/dist/{chunk-QTI3KC7D.js → chunk-YENKDBUU.js} +106 -43
  25. package/dist/components/index.d.ts +117 -4
  26. package/dist/components/index.js +24 -23
  27. package/dist/components/navigation/index.js +4 -3
  28. package/dist/execution/index.d.ts +8 -3
  29. package/dist/features/auth/index.d.ts +3 -0
  30. package/dist/features/clients/index.js +8 -7
  31. package/dist/features/crm/index.d.ts +3 -0
  32. package/dist/features/crm/index.js +10 -9
  33. package/dist/features/dashboard/index.d.ts +113 -3
  34. package/dist/features/dashboard/index.js +9 -8
  35. package/dist/features/delivery/index.d.ts +3 -0
  36. package/dist/features/delivery/index.js +9 -8
  37. package/dist/features/knowledge/index.js +8 -18
  38. package/dist/features/lead-gen/index.js +10 -9
  39. package/dist/features/monitoring/index.js +10 -9
  40. package/dist/features/monitoring/requests/index.d.ts +2 -2
  41. package/dist/features/monitoring/requests/index.js +8 -7
  42. package/dist/features/operations/index.d.ts +560 -93
  43. package/dist/features/operations/index.js +13 -12
  44. package/dist/features/settings/index.d.ts +3 -0
  45. package/dist/features/settings/index.js +9 -8
  46. package/dist/hooks/delivery/index.d.ts +3 -0
  47. package/dist/hooks/index.d.ts +210 -6
  48. package/dist/hooks/index.js +8 -7
  49. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +205 -4
  50. package/dist/hooks/published.d.ts +210 -6
  51. package/dist/hooks/published.js +8 -7
  52. package/dist/index.d.ts +565 -95
  53. package/dist/index.js +8 -7
  54. package/dist/initialization/index.d.ts +3 -0
  55. package/dist/knowledge/index.d.ts +577 -215
  56. package/dist/knowledge/index.js +1180 -689
  57. package/dist/knowledge-search-index-P7PR626V.js +1514 -0
  58. package/dist/layout/index.js +1 -1
  59. package/dist/profile/index.d.ts +3 -0
  60. package/dist/provider/index.d.ts +447 -73
  61. package/dist/provider/index.js +7 -6
  62. package/dist/provider/published.d.ts +447 -73
  63. package/dist/provider/published.js +5 -4
  64. package/dist/supabase/index.d.ts +6 -0
  65. package/dist/types/index.d.ts +208 -4
  66. package/dist/utils/index.d.ts +113 -3
  67. package/package.json +39 -39
  68. package/src/README.md +29 -29
  69. package/src/api/README.md +18 -18
  70. package/src/app/README.md +24 -24
  71. package/src/auth/README.md +18 -18
  72. package/src/components/README.md +24 -24
  73. package/src/execution/README.md +16 -16
  74. package/src/features/README.md +28 -28
  75. package/src/graph/README.md +16 -16
  76. package/src/hooks/README.md +23 -23
  77. package/src/initialization/README.md +19 -19
  78. package/src/knowledge/README.md +31 -31
  79. package/src/organization/README.md +18 -18
  80. package/src/profile/README.md +19 -19
  81. package/src/provider/README.md +32 -32
  82. package/src/router/README.md +18 -18
  83. package/src/sse/README.md +13 -13
  84. package/src/test-utils/README.md +7 -7
  85. package/src/theme/README.md +23 -23
  86. package/src/theme/presets/README.md +19 -19
  87. package/src/types/README.md +16 -16
  88. package/src/utils/README.md +18 -18
  89. package/src/zustand/README.md +18 -18
  90. package/dist/chunk-UROTM5OR.js +0 -172
  91. package/dist/knowledge-search-index-5KYPO746.js +0 -1479
@@ -1,5 +1,5 @@
1
1
  import { useCyberColors, CyberLegendItem, CyberAreaChart } from './chunk-4DYOXEH6.js';
2
- import { useResourcesHealth } from './chunk-GCOQ3TBG.js';
2
+ import { useResourcesHealth } from './chunk-SWMQTF2H.js';
3
3
  import { CardHeader, EmptyState } from './chunk-EPTHX4VZ.js';
4
4
  import { getTimeRangeDates, formatBucketTime } from './chunk-2RJMVWFJ.js';
5
5
  import { Paper, Center, Loader, Group } from '@mantine/core';
@@ -1,4 +1,4 @@
1
- import { ElevasisSystemsProvider } from './chunk-QXCDKE2O.js';
1
+ import { ElevasisSystemsProvider } from './chunk-WJOE76FI.js';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
 
4
4
  function createTestSystemsProvider({
@@ -1,4 +1,4 @@
1
- import { useOptionalElevasisSystems } from './chunk-QXCDKE2O.js';
1
+ import { useOptionalElevasisSystems } from './chunk-WJOE76FI.js';
2
2
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
3
3
  import { useMemo } from 'react';
4
4
 
@@ -42,7 +42,44 @@ var useBreadcrumbs = (options = {}) => {
42
42
  }, [currentPath, systemContext, labelsByPath]);
43
43
  };
44
44
  function formatSegmentLabel(segment) {
45
- return segment.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
45
+ const decodedSegment = safeDecodeURIComponent(segment);
46
+ const routeLabel = formatRouteIdLabel(decodedSegment);
47
+ if (routeLabel) return routeLabel;
48
+ return titleCaseSegment(decodedSegment);
49
+ }
50
+ function safeDecodeURIComponent(value) {
51
+ try {
52
+ return decodeURIComponent(value);
53
+ } catch {
54
+ return value;
55
+ }
56
+ }
57
+ function formatRouteIdLabel(segment) {
58
+ if (segment.startsWith("group:")) {
59
+ const groupKey = segment.slice("group:".length);
60
+ return groupKey === "graph" ? "Ontology" : titleCaseSegment(groupKey);
61
+ }
62
+ if (segment.startsWith("domain:")) {
63
+ return titleCaseSegment(segment.slice("domain:".length));
64
+ }
65
+ if (segment.startsWith("item:")) {
66
+ const rest = segment.slice("item:".length);
67
+ const separatorIndex = rest.indexOf(":");
68
+ const itemId = separatorIndex === -1 ? rest : rest.slice(separatorIndex + 1);
69
+ return formatOntologyOrIdLabel(itemId);
70
+ }
71
+ if (segment.startsWith("ontology:")) {
72
+ return formatOntologyOrIdLabel(segment);
73
+ }
74
+ return void 0;
75
+ }
76
+ function formatOntologyOrIdLabel(value) {
77
+ const localId = value.includes("/") ? value.slice(value.lastIndexOf("/") + 1) : value;
78
+ const suffix = localId.includes(":") ? localId.slice(localId.lastIndexOf(":") + 1) : localId;
79
+ return titleCaseSegment(suffix);
80
+ }
81
+ function titleCaseSegment(segment) {
82
+ return segment.split("-").flatMap((part) => part.split("_")).flatMap((part) => part.split(".")).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
46
83
  }
47
84
 
48
85
  export { useBreadcrumbs };
@@ -15,6 +15,7 @@ var ORGANIZATION_GRAPH_NODE_KIND_ORDER = [
15
15
  "goal",
16
16
  "surface",
17
17
  "navigation-group",
18
+ "ontology",
18
19
  "content-node"
19
20
  ];
20
21
  var ORGANIZATION_GRAPH_NODE_KIND_LABELS = {
@@ -33,6 +34,7 @@ var ORGANIZATION_GRAPH_NODE_KIND_LABELS = {
33
34
  goal: "Goal",
34
35
  surface: "Surface",
35
36
  "navigation-group": "Navigation group",
37
+ ontology: "Ontology",
36
38
  "content-node": "Content node"
37
39
  };
38
40
  var ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS = {
@@ -51,6 +53,7 @@ var ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS = {
51
53
  goal: "Goal",
52
54
  surface: "Surface",
53
55
  "navigation-group": "Navigation group",
56
+ ontology: "Ontology record",
54
57
  "content-node": "Content node"
55
58
  };
56
59
  var ORGANIZATION_GRAPH_NODE_KIND_MEANINGS = {
@@ -69,6 +72,7 @@ var ORGANIZATION_GRAPH_NODE_KIND_MEANINGS = {
69
72
  goal: "A strategic or operational objective that guides priorities and measures progress.",
70
73
  surface: "A navigation surface (page or view) that is exposed through the platform shell.",
71
74
  "navigation-group": "A logical grouping of navigation surfaces within the platform shell.",
75
+ ontology: "A compiled ontology record such as an object, action, catalog, value type, surface, or resource binding.",
72
76
  "content-node": "A system-scoped content node authored in system.content (schema, config, or tenant-defined kind)."
73
77
  };
74
78
  var ORGANIZATION_GRAPH_EDGE_KIND_LABELS = {
@@ -82,8 +86,13 @@ var ORGANIZATION_GRAPH_EDGE_KIND_LABELS = {
82
86
  emits: "Emits",
83
87
  originates_from: "Originates from",
84
88
  triggers: "Triggers",
89
+ approval: "Approval",
85
90
  applies_to: "Applies to",
86
- effects: "Effects"
91
+ effects: "Effects",
92
+ actions: "Actions",
93
+ reads: "Reads",
94
+ writes: "Writes",
95
+ uses_catalog: "Uses catalog"
87
96
  };
88
97
  var ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS = {
89
98
  contains: "A hierarchy or ownership link inside the shared graph.",
@@ -96,8 +105,13 @@ var ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS = {
96
105
  emits: "The source produces an event that can be inspected or traversed.",
97
106
  originates_from: "The source is derived from or owned by the target origin.",
98
107
  triggers: "The source can start or activate the target.",
108
+ approval: "The source requests or participates in an approval path.",
99
109
  applies_to: "A policy or rule targets the node it applies to.",
100
- effects: "A policy or event produces the target effect."
110
+ effects: "A policy or event produces the target effect.",
111
+ actions: "The source is bound to the target ontology action contract.",
112
+ reads: "The source reads data described by the target ontology record.",
113
+ writes: "The source writes data described by the target ontology record.",
114
+ uses_catalog: "The source uses the target ontology catalog."
101
115
  };
102
116
  var DEFAULT_ORGANIZATION_GRAPH_FILTERS = {
103
117
  search: "",
@@ -1,15 +1,15 @@
1
- import { SalesSidebar, CrmSidebarMiddle } from './chunk-MOY4VOHF.js';
1
+ import { SalesSidebar, CrmSidebarMiddle } from './chunk-4AAZXKLL.js';
2
2
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
3
3
  import { PageContainer } from './chunk-BZZCNLT6.js';
4
4
  import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
5
5
  import { FilterBar } from './chunk-PDHTXPSF.js';
6
6
  import { CustomModal } from './chunk-R66W5UDG.js';
7
- import { useDealsSummary, useDeleteDeal, usePaginationState, useDeals, useTableSort, sortData, useTableSelection, useDealDetail, useCompany, dealKeys, useContact, useExecuteAction } from './chunk-GCOQ3TBG.js';
7
+ import { useDealsSummary, useDeleteDeal, usePaginationState, useDeals, useTableSort, sortData, useTableSelection, useDealDetail, useCompany, dealKeys, useContact, useExecuteAction } from './chunk-SWMQTF2H.js';
8
8
  import { showApiErrorNotification, showSuccessNotification } from './chunk-XZGSCABI.js';
9
9
  import { CenteredErrorState, CardHeader, StatCard, PageTitleCaption, EmptyState, ActivityTimeline } from './chunk-EPTHX4VZ.js';
10
- import { useCrmActions, deriveActions } from './chunk-YLQEVSOR.js';
10
+ import { useCrmActions, deriveActions } from './chunk-WGUEIGPC.js';
11
11
  import { SubshellContentContainer } from './chunk-TKAYX2SP.js';
12
- import { CRM_PIPELINE_DEFINITION, DEFAULT_CRM_PRIORITY_RULE_CONFIG, CRM_PRIORITY_BUCKETS } from './chunk-T35FWDAB.js';
12
+ import { CRM_PIPELINE_DEFINITION, DEFAULT_CRM_PRIORITY_RULE_CONFIG, CRM_PRIORITY_BUCKETS } from './chunk-DYIDXUJS.js';
13
13
  import { PAGE_SIZE_DEFAULT, formatTimeAgo } from './chunk-2RJMVWFJ.js';
14
14
  import { useElevasisServices } from './chunk-KJ3QUBNU.js';
15
15
  import { Stack, Paper, Center, Loader, Group, Box, Text, Alert, Table, SimpleGrid, Button, Select, TextInput, Tabs, Checkbox, Badge, Tooltip, Pagination, Title, Code, Card, Switch, NumberInput, ColorSwatch, Popover, ActionIcon, Anchor, CopyButton, Divider, Textarea } from '@mantine/core';
@@ -1,5 +1,5 @@
1
1
  import { FeatureUnavailableState } from './chunk-EPTHX4VZ.js';
2
- import { useElevasisSystems } from './chunk-QXCDKE2O.js';
2
+ import { useElevasisSystems } from './chunk-WJOE76FI.js';
3
3
  import { SubshellContainer, SubshellSidebar, SubshellRightSideContainer } from './chunk-TKAYX2SP.js';
4
4
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
5
5
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
@@ -5,11 +5,11 @@ import { PageContainer } from './chunk-BZZCNLT6.js';
5
5
  import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
6
6
  import { FilterBar } from './chunk-PDHTXPSF.js';
7
7
  import { CustomModal } from './chunk-R66W5UDG.js';
8
- import { useProjectRealtime, useTableSort, sortData, usePaginationState, useTableSelection, useProjectActivities } from './chunk-GCOQ3TBG.js';
8
+ import { useProjectRealtime, useTableSort, sortData, usePaginationState, useTableSelection, useProjectActivities } from './chunk-SWMQTF2H.js';
9
9
  import { useCreateTask, useCreateMilestone, useProjectMilestones, useUpdateTask, useProjects, useDeleteProject, useProject, useProjectNotes, useUpdateMilestone, useCreateNote, showApiErrorNotification, projectKeys } from './chunk-XZGSCABI.js';
10
10
  import { StatusBadge, EmptyState, PageTitleCaption, CenteredErrorState, StatCard, CardHeader } from './chunk-EPTHX4VZ.js';
11
11
  import { SubshellContentContainer } from './chunk-TKAYX2SP.js';
12
- import { PROJECTS_VIEW_ACTION_ID } from './chunk-T35FWDAB.js';
12
+ import { PROJECTS_VIEW_ACTION_ID } from './chunk-DYIDXUJS.js';
13
13
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
14
14
  import { PAGE_SIZE_DEFAULT, formatTimeAgo, formatDate, formatRelativeTime } from './chunk-2RJMVWFJ.js';
15
15
  import { useElevasisServices } from './chunk-KJ3QUBNU.js';
@@ -1,8 +1,8 @@
1
1
  import { observabilityKeys } from './chunk-VNAZTCHA.js';
2
2
  import { showApiErrorNotification, showSuccessNotification, projectKeys, noteKeys, taskKeys, milestoneKeys } from './chunk-XZGSCABI.js';
3
3
  import { useSupabase } from './chunk-BRXELOHC.js';
4
- import { useNotificationAdapter, deriveActions } from './chunk-YLQEVSOR.js';
5
- import { useOptionalElevasisSystems } from './chunk-QXCDKE2O.js';
4
+ import { useNotificationAdapter, deriveActions } from './chunk-WGUEIGPC.js';
5
+ import { useOptionalElevasisSystems } from './chunk-WJOE76FI.js';
6
6
  import { HTTP_HEADERS } from './chunk-ND5TDV2J.js';
7
7
  import { ResourceTypeSchema, NonEmptyStringSchema, OriginResourceTypeSchema, UuidSchema, CredentialNameSchema, STALE_TIME_DEFAULT, REFETCH_INTERVAL_DASHBOARD, STALE_TIME_MONITORING, getTimeRangeDates, REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, STALE_TIME_ADMIN, APIClientError, GC_TIME_MEDIUM, GC_TIME_SHORT } from './chunk-2RJMVWFJ.js';
8
8
  import { useStableAccessToken } from './chunk-VKIZUUPM.js';
@@ -2,7 +2,7 @@ import { AppShellLoader } from './chunk-RYTEQBAO.js';
2
2
  import { FilterBar } from './chunk-PDHTXPSF.js';
3
3
  import { CustomModal } from './chunk-R66W5UDG.js';
4
4
  import { useAvailablePresets } from './chunk-JFL3GRD4.js';
5
- import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useResources, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useOrgRoles, useAssignRole, useRevokeRole, useHasPermission, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas } from './chunk-GCOQ3TBG.js';
5
+ import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useResources, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useOrgRoles, useAssignRole, useRevokeRole, useHasPermission, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas } from './chunk-SWMQTF2H.js';
6
6
  import { showApiErrorNotification, showErrorNotification, showSuccessNotification } from './chunk-XZGSCABI.js';
7
7
  import { ListSkeleton, EmptyState, PageTitleCaption, CardHeader, APIErrorAlert, StatCard } from './chunk-EPTHX4VZ.js';
8
8
  import { RoleBadge } from './chunk-JA5ECJJB.js';
@@ -3,7 +3,7 @@ import { AppShellLoader } from './chunk-RYTEQBAO.js';
3
3
  import { FilterBar } from './chunk-PDHTXPSF.js';
4
4
  import { CustomModal } from './chunk-R66W5UDG.js';
5
5
  import { formatDuration } from './chunk-E4WQGJNS.js';
6
- import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogsFilters, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useTimeRangeDates, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityFilters, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead } from './chunk-GCOQ3TBG.js';
6
+ import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogsFilters, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useTimeRangeDates, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityFilters, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead } from './chunk-SWMQTF2H.js';
7
7
  import { CenteredErrorState, CardHeader, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, EmptyState, PageTitleCaption, JsonViewer } from './chunk-EPTHX4VZ.js';
8
8
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
9
9
  import { formatBucketTime, PAGE_SIZE_DEFAULT, getTimeRangeDates } from './chunk-2RJMVWFJ.js';
@@ -4,7 +4,7 @@ import { useRouterContext } from './chunk-Q7DJKLEN.js';
4
4
  import { useAppearance } from './chunk-E565XMTQ.js';
5
5
  import { sidebarItemGap, sidebarSubLinkPaddingY, sidebarSubLinkPaddingX, sidebarSubLinkIndent, sidebarHoverDelay, sidebarTransitionDuration, sidebarCollapsedWidth, sidebarWidth, topbarHeight, sidebarToggleIconSize, sidebarSectionPadding, sidebarGroupChevronSize, sidebarIconInnerSize } from './chunk-DT3QYZVU.js';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import { createContext, memo, useEffect, createElement, useContext, useRef, useLayoutEffect, useState } from 'react';
7
+ import { createContext, memo, useEffect, useRef, createElement, useContext, useLayoutEffect, useState } from 'react';
8
8
  import { Collapse, HoverCard, Stack, Group, Text, UnstyledButton, Tooltip, ScrollArea, Menu, Avatar, Box, useMantineColorScheme, Switch, Code } from '@mantine/core';
9
9
  import { IconLayoutSidebarLeftExpand, IconLayoutSidebarLeftCollapse, IconUser, IconLogout, IconChevronDown, IconChevronRight, IconMoonStars, IconSun } from '@tabler/icons-react';
10
10
 
@@ -576,11 +576,14 @@ var LinksGroup = memo(function LinksGroup2({
576
576
  const isParentActive = !hasLinks && (link === "/" ? currentPath === "/" : isPathActive(link || "", currentPath));
577
577
  const isIconTextActive = isParentActive || hasActiveChild;
578
578
  const isBackgroundActive = isParentActive || hasActiveChild && !opened;
579
+ const prevPathRef = useRef(null);
579
580
  useEffect(() => {
580
- if (!isCollapsed && hasActiveChild && !opened && onToggle) {
581
+ const pathChanged = prevPathRef.current !== currentPath;
582
+ prevPathRef.current = currentPath;
583
+ if (pathChanged && !isCollapsed && hasActiveChild && !opened && onToggle) {
581
584
  onToggle();
582
585
  }
583
- }, [hasActiveChild, isCollapsed, opened, onToggle]);
586
+ }, [currentPath, hasActiveChild, isCollapsed, opened, onToggle]);
584
587
  const handleMainClick = () => {
585
588
  if (hasLinks && !isCollapsed) {
586
589
  onToggle?.();
@@ -1,4 +1,4 @@
1
- import { CRM_DISCOVERY_REPLIED_STATE, CRM_DISCOVERY_LINK_SENT_STATE, CRM_DISCOVERY_NUDGING_STATE, CRM_DISCOVERY_BOOKING_CANCELLED_STATE } from './chunk-T35FWDAB.js';
1
+ import { formatOntologyId, DEFAULT_ORGANIZATION_MODEL, CRM_DISCOVERY_NUDGING_STATE, compileOrganizationOntology, CRM_DISCOVERY_REPLIED_STATE, CRM_DISCOVERY_LINK_SENT_STATE, CRM_DISCOVERY_BOOKING_CANCELLED_STATE, CRM_PIPELINE_DEFINITION, LEAD_GEN_STAGE_CATALOG } from './chunk-DYIDXUJS.js';
2
2
  import { ApiClientProvider, useApiClient } from './chunk-ND5TDV2J.js';
3
3
  import { OrganizationProvider } from './chunk-HUJCU55S.js';
4
4
  import { getErrorInfo, getErrorTitle, formatErrorMessage } from './chunk-2RJMVWFJ.js';
@@ -40,6 +40,169 @@ function useNotificationAdapter() {
40
40
  return useContext(NotificationContext);
41
41
  }
42
42
 
43
+ // ../core/src/business/acquisition/ontology-validation.ts
44
+ var CRM_PIPELINE_CATALOG_ONTOLOGY_ID = formatOntologyId({
45
+ scope: "sales.crm",
46
+ kind: "catalog",
47
+ localId: "crm.pipeline"
48
+ });
49
+ var LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID = formatOntologyId({
50
+ scope: "sales.lead-gen",
51
+ kind: "catalog",
52
+ localId: "lead-gen.stage-catalog"
53
+ });
54
+ var CRM_DEAL_OBJECT_ONTOLOGY_ID = formatOntologyId({
55
+ scope: "sales.crm",
56
+ kind: "object",
57
+ localId: "crm.deal"
58
+ });
59
+ function createCrmPipelineCatalog() {
60
+ return {
61
+ id: CRM_PIPELINE_CATALOG_ONTOLOGY_ID,
62
+ label: CRM_PIPELINE_DEFINITION.label,
63
+ ownerSystemId: "sales.crm",
64
+ kind: "pipeline",
65
+ appliesTo: CRM_DEAL_OBJECT_ONTOLOGY_ID,
66
+ entries: Object.fromEntries(
67
+ CRM_PIPELINE_DEFINITION.stages.map((stage, index) => [
68
+ stage.stageKey,
69
+ {
70
+ key: stage.stageKey,
71
+ label: stage.label,
72
+ order: (index + 1) * 10,
73
+ ...stage.color !== void 0 ? { color: stage.color } : {},
74
+ states: stage.states.map((state) => ({ ...state }))
75
+ }
76
+ ])
77
+ ),
78
+ legacyPipelineKey: CRM_PIPELINE_DEFINITION.pipelineKey,
79
+ legacyEntityKey: CRM_PIPELINE_DEFINITION.entityKey
80
+ };
81
+ }
82
+ function createLeadGenStageCatalog() {
83
+ return {
84
+ id: LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID,
85
+ label: "Lead Gen Processing Stages",
86
+ ownerSystemId: "sales.lead-gen",
87
+ kind: "processing-stage-catalog",
88
+ entries: Object.fromEntries(
89
+ Object.entries(LEAD_GEN_STAGE_CATALOG).map(([key, entry]) => [
90
+ key,
91
+ {
92
+ ...entry
93
+ }
94
+ ])
95
+ ),
96
+ legacyCatalogKey: "LEAD_GEN_STAGE_CATALOG"
97
+ };
98
+ }
99
+ function isPlainRecord(value) {
100
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
101
+ }
102
+ function mergeBridgeCatalogs(model) {
103
+ const baseCatalogTypes = model.ontology?.catalogTypes ?? {};
104
+ const bridgeCatalogTypes = {};
105
+ if (baseCatalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID] === void 0) {
106
+ bridgeCatalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID] = createCrmPipelineCatalog();
107
+ }
108
+ if (baseCatalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID] === void 0) {
109
+ bridgeCatalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID] = createLeadGenStageCatalog();
110
+ }
111
+ if (Object.keys(bridgeCatalogTypes).length === 0) return model;
112
+ return {
113
+ ...model,
114
+ ontology: {
115
+ ...model.ontology ?? {},
116
+ catalogTypes: {
117
+ ...baseCatalogTypes,
118
+ ...bridgeCatalogTypes
119
+ }
120
+ }
121
+ };
122
+ }
123
+ function compileBusinessOntologyValidationIndex(model = DEFAULT_ORGANIZATION_MODEL) {
124
+ const compilation = compileOrganizationOntology(mergeBridgeCatalogs(model));
125
+ if (compilation.diagnostics.length > 0) {
126
+ const summary = compilation.diagnostics.map((diagnostic) => diagnostic.message).join("; ");
127
+ throw new Error(`Business ontology validation index failed to compile: ${summary}`);
128
+ }
129
+ const crmPipelineCatalog = compilation.ontology.catalogTypes[CRM_PIPELINE_CATALOG_ONTOLOGY_ID];
130
+ const leadGenStageCatalog = compilation.ontology.catalogTypes[LEAD_GEN_STAGE_CATALOG_ONTOLOGY_ID];
131
+ if (crmPipelineCatalog === void 0 || leadGenStageCatalog === void 0) {
132
+ throw new Error("Business ontology validation index is missing CRM or lead-gen catalog bridge records");
133
+ }
134
+ return {
135
+ ontology: compilation.ontology,
136
+ crmPipelineCatalog,
137
+ leadGenStageCatalog,
138
+ actionTypesByLegacyId: indexActionTypesByLegacyId(compilation.ontology.actionTypes)
139
+ };
140
+ }
141
+ function indexActionTypesByLegacyId(actionTypes) {
142
+ const byLegacyId = {};
143
+ for (const actionType of Object.values(actionTypes)) {
144
+ const legacyActionId = actionType["legacyActionId"];
145
+ if (typeof legacyActionId === "string") {
146
+ byLegacyId[legacyActionId] = actionType;
147
+ }
148
+ }
149
+ return byLegacyId;
150
+ }
151
+ var BUSINESS_ONTOLOGY_VALIDATION_INDEX = compileBusinessOntologyValidationIndex();
152
+ function getCatalogEntries(catalog) {
153
+ return isPlainRecord(catalog.entries) ? catalog.entries : {};
154
+ }
155
+ function asCrmStageEntry(key, value) {
156
+ const record = isPlainRecord(value) ? value : {};
157
+ const label = typeof record.label === "string" ? record.label : key;
158
+ const order = typeof record.order === "number" ? record.order : 0;
159
+ const color = typeof record.color === "string" ? record.color : void 0;
160
+ const rawStates = Array.isArray(record.states) ? record.states : [];
161
+ const states = rawStates.flatMap((state) => {
162
+ if (!isPlainRecord(state) || typeof state.stateKey !== "string") return [];
163
+ return [
164
+ {
165
+ stateKey: state.stateKey,
166
+ label: typeof state.label === "string" ? state.label : state.stateKey
167
+ }
168
+ ];
169
+ });
170
+ return {
171
+ key,
172
+ label,
173
+ order,
174
+ ...color !== void 0 ? { color } : {},
175
+ states
176
+ };
177
+ }
178
+ var CRM_STAGE_KEYS_FROM_ONTOLOGY = Object.keys(
179
+ getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog)
180
+ );
181
+ Object.values(
182
+ getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.crmPipelineCatalog)
183
+ ).flatMap((entry, index) => {
184
+ const stageKey = CRM_STAGE_KEYS_FROM_ONTOLOGY[index];
185
+ if (stageKey === void 0) return [];
186
+ return asCrmStageEntry(stageKey, entry).states.map((state) => state.stateKey);
187
+ });
188
+ Object.keys(
189
+ getCatalogEntries(BUSINESS_ONTOLOGY_VALIDATION_INDEX.leadGenStageCatalog)
190
+ );
191
+ function getActionMetadata(actionKey) {
192
+ const actionType = BUSINESS_ONTOLOGY_VALIDATION_INDEX.actionTypesByLegacyId[actionKey];
193
+ if (actionType === void 0) return void 0;
194
+ const resourceId = actionType["resourceId"];
195
+ return {
196
+ id: actionKey,
197
+ label: actionType.label ?? actionKey,
198
+ ...typeof resourceId === "string" ? { resourceId } : {}
199
+ };
200
+ }
201
+ function getCrmActionMetadata(actionKey) {
202
+ const actionType = BUSINESS_ONTOLOGY_VALIDATION_INDEX.actionTypesByLegacyId[actionKey];
203
+ return actionType?.ownerSystemId === "sales.crm" ? getActionMetadata(actionKey) : void 0;
204
+ }
205
+
43
206
  // ../core/src/business/acquisition/deal-ownership.ts
44
207
  var INBOUND_EVENT_TYPES = ["reply_received"];
45
208
  var OUTBOUND_EVENT_TYPES = [
@@ -98,56 +261,44 @@ function parseMs(value) {
98
261
  var SendReplyActionPayloadSchema = z.object({
99
262
  replyBody: z.string().trim().min(1).max(1e4)
100
263
  }).strict();
264
+ function crmAction(actionId, runtime) {
265
+ const metadata = getCrmActionMetadata(actionId);
266
+ if (!metadata?.resourceId) {
267
+ throw new Error(`CRM action metadata for "${actionId}" must define resourceId`);
268
+ }
269
+ return {
270
+ key: metadata.id,
271
+ label: metadata.label,
272
+ workflowId: metadata.resourceId,
273
+ ...runtime
274
+ };
275
+ }
101
276
  var DEFAULT_CRM_ACTIONS = [
102
- {
103
- key: "move_to_proposal",
104
- label: "Move to Proposal",
105
- isAvailableFor: (deal) => deal.stage_key === "interested",
106
- workflowId: "move_to_proposal-workflow"
107
- },
108
- {
109
- key: "move_to_closing",
110
- label: "Move to Closing",
111
- isAvailableFor: (deal) => deal.stage_key === "proposal",
112
- workflowId: "move_to_closing-workflow"
113
- },
114
- {
115
- key: "move_to_closed_won",
116
- label: "Close Won",
117
- isAvailableFor: (deal) => deal.stage_key === "closing",
118
- workflowId: "move_to_closed_won-workflow"
119
- },
120
- {
121
- key: "move_to_closed_lost",
122
- label: "Close Lost",
123
- isAvailableFor: (deal) => deal.stage_key === "interested" || deal.stage_key === "proposal" || deal.stage_key === "closing",
124
- workflowId: "move_to_closed_lost-workflow"
125
- },
126
- {
127
- key: "move_to_nurturing",
128
- label: "Move to Nurturing",
129
- isAvailableFor: (deal) => deal.stage_key === "interested" || deal.stage_key === "proposal" || deal.stage_key === "closing",
130
- workflowId: "move_to_nurturing-workflow"
131
- },
132
- {
133
- key: "send_reply",
134
- label: "Send Reply",
277
+ crmAction("move_to_proposal", {
278
+ isAvailableFor: (deal) => deal.stage_key === "interested"
279
+ }),
280
+ crmAction("move_to_closing", {
281
+ isAvailableFor: (deal) => deal.stage_key === "proposal"
282
+ }),
283
+ crmAction("move_to_closed_won", {
284
+ isAvailableFor: (deal) => deal.stage_key === "closing"
285
+ }),
286
+ crmAction("move_to_closed_lost", {
287
+ isAvailableFor: (deal) => deal.stage_key === "interested" || deal.stage_key === "proposal" || deal.stage_key === "closing"
288
+ }),
289
+ crmAction("move_to_nurturing", {
290
+ isAvailableFor: (deal) => deal.stage_key === "interested" || deal.stage_key === "proposal" || deal.stage_key === "closing"
291
+ }),
292
+ crmAction("send_reply", {
135
293
  isAvailableFor: (deal) => deal.stage_key === "interested" && isOurReplyAction(deal) && (deal.state_key === CRM_DISCOVERY_REPLIED_STATE.stateKey || deal.state_key === CRM_DISCOVERY_LINK_SENT_STATE.stateKey || deal.state_key === CRM_DISCOVERY_NUDGING_STATE.stateKey),
136
- workflowId: "crm-send-reply-workflow",
137
294
  payloadSchema: SendReplyActionPayloadSchema
138
- },
139
- {
140
- key: "send_link",
141
- label: "Send Booking Link",
142
- isAvailableFor: (deal) => deal.stage_key === "interested" && deal.state_key === CRM_DISCOVERY_REPLIED_STATE.stateKey,
143
- workflowId: "crm-send-booking-link-workflow"
144
- },
145
- {
146
- key: "send_nudge",
147
- label: "Send Nudge",
148
- isAvailableFor: (deal) => deal.stage_key === "interested" && (deal.state_key === CRM_DISCOVERY_LINK_SENT_STATE.stateKey || deal.state_key === CRM_DISCOVERY_NUDGING_STATE.stateKey),
149
- workflowId: "crm-send-nudge-workflow"
150
- },
295
+ }),
296
+ crmAction("send_link", {
297
+ isAvailableFor: (deal) => deal.stage_key === "interested" && deal.state_key === CRM_DISCOVERY_REPLIED_STATE.stateKey
298
+ }),
299
+ crmAction("send_nudge", {
300
+ isAvailableFor: (deal) => deal.stage_key === "interested" && (deal.state_key === CRM_DISCOVERY_LINK_SENT_STATE.stateKey || deal.state_key === CRM_DISCOVERY_NUDGING_STATE.stateKey)
301
+ }),
151
302
  {
152
303
  key: "mark_no_show",
153
304
  label: "Mark No-Show",
@@ -157,12 +308,9 @@ var DEFAULT_CRM_ACTIONS = [
157
308
  // event captures operator intent and distinguishes the manual variant from the timed one.
158
309
  workflowId: "mark_no_show-workflow"
159
310
  },
160
- {
161
- key: "rebook",
162
- label: "Rebook",
163
- isAvailableFor: (deal) => deal.stage_key === "interested" && deal.state_key === CRM_DISCOVERY_BOOKING_CANCELLED_STATE.stateKey,
164
- workflowId: "crm-rebook-workflow"
165
- }
311
+ crmAction("rebook", {
312
+ isAvailableFor: (deal) => deal.stage_key === "interested" && deal.state_key === CRM_DISCOVERY_BOOKING_CANCELLED_STATE.stateKey
313
+ })
166
314
  ];
167
315
  function deriveActions(deal, actions = DEFAULT_CRM_ACTIONS) {
168
316
  return actions.filter((a) => a.isAvailableFor(deal)).map(({ key, label, payloadSchema }) => ({ key, label, payloadSchema }));
@@ -1,8 +1,8 @@
1
- import { devOnlyFor, requiresAdminFor, topLevel, parentOf, ancestorsOf, childrenOf, findById, findByPath, listAllSystems, defaultPathFor, getSortedSidebarEntries } from './chunk-T35FWDAB.js';
1
+ import { getSemanticIconComponent } from './chunk-DWXDNT7P.js';
2
+ import { devOnlyFor, requiresAdminFor, topLevel, parentOf, ancestorsOf, childrenOf, findById, findByPath, listAllSystems, defaultPathFor, getSortedSidebarEntries } from './chunk-DYIDXUJS.js';
2
3
  import { useInitialization } from './chunk-533DUEQY.js';
3
4
  import { useOrganization } from './chunk-DD3CCMCZ.js';
4
5
  import { createContext, useMemo, useCallback, useContext } from 'react';
5
- import { IconSettings, IconArchive, IconShieldLock, IconBriefcase, IconUsers, IconChartBar, IconCalendar, IconDashboard, IconBrain, IconActivity, IconCode, IconTarget, IconTool } from '@tabler/icons-react';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
8
8
  function createFeatureAccessHook({
@@ -105,27 +105,8 @@ function validateManifests(manifests, organizationModel) {
105
105
  }
106
106
  }
107
107
  var ElevasisSystemsContext = createContext(null);
108
- var FALLBACK_SIDEBAR_ICONS = {
109
- "feature.dashboard": IconDashboard,
110
- "feature.business": IconBriefcase,
111
- "feature.sales": IconTarget,
112
- "feature.clients": IconUsers,
113
- "feature.projects": IconBriefcase,
114
- "feature.operations": IconCode,
115
- "feature.monitoring": IconActivity,
116
- "feature.knowledge": IconBrain,
117
- "feature.settings": IconSettings,
118
- "feature.admin": IconShieldLock,
119
- dashboard: IconDashboard,
120
- calendar: IconCalendar,
121
- business: IconBriefcase,
122
- sales: IconChartBar,
123
- clients: IconUsers,
124
- projects: IconBriefcase,
125
- admin: IconShieldLock,
126
- archive: IconArchive,
127
- settings: IconSettings
128
- };
108
+
109
+ // src/provider/sidebarProjection.ts
129
110
  function isLifecycleEnabled(system) {
130
111
  if (system.enabled === false) return false;
131
112
  return system.lifecycle !== "deprecated" && system.lifecycle !== "archived";
@@ -150,12 +131,12 @@ function iconForNode(node, context) {
150
131
  const targetIcon = node.targets?.systems?.map((systemId) => context.shellModel.findById(systemId)?.iconComponent).find(Boolean);
151
132
  if (targetIcon) return targetIcon;
152
133
  }
153
- return FALLBACK_SIDEBAR_ICONS[node.icon] ?? IconTool;
134
+ return getSemanticIconComponent(node.icon);
154
135
  }
155
136
  function activeMatchPathsForSurface(node, context) {
156
- const paths = (node.targets?.systems ?? []).flatMap(
157
- (systemId) => context.shellModel.childrenOf(systemId).map((child) => child.path).filter((path) => Boolean(path && path !== node.path))
158
- );
137
+ const targets = node.targets?.systems ?? [];
138
+ if (targets.length !== 1) return void 0;
139
+ const paths = context.shellModel.childrenOf(targets[0]).map((child) => child.path).filter((path) => Boolean(path && path !== node.path));
159
140
  return paths.length > 0 ? [...new Set(paths)] : void 0;
160
141
  }
161
142
  function surfaceToLinkItem(node, context, siblings) {
@@ -384,7 +365,7 @@ function ElevasisSystemsProvider({
384
365
  }
385
366
  return {
386
367
  ...organizationModel,
387
- knowledge: organizationModel.knowledge ?? { nodes: [] }
368
+ knowledge: organizationModel.knowledge ?? {}
388
369
  };
389
370
  }, [organizationModel]);
390
371
  useMemo(() => validateManifests(activeSystems, resolvedOrganizationModel), [activeSystems, resolvedOrganizationModel]);