@elevasis/ui 2.36.0 → 2.38.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 (95) hide show
  1. package/dist/api/index.js +4 -3
  2. package/dist/app/index.css +0 -384
  3. package/dist/app/index.d.ts +75 -2
  4. package/dist/app/index.js +22 -21
  5. package/dist/auth/index.d.ts +91 -28
  6. package/dist/auth/index.js +5 -1
  7. package/dist/charts/index.js +9 -3
  8. package/dist/chunk-4O3VAALW.js +349 -0
  9. package/dist/{chunk-O2Q4VMRN.js → chunk-566XWGPP.js} +76 -109
  10. package/dist/chunk-5EYJ2GIN.js +122 -0
  11. package/dist/chunk-6D4LCJ52.js +10 -0
  12. package/dist/chunk-6ROXVZ3L.js +9 -0
  13. package/dist/{chunk-YYX7OPZQ.js → chunk-73EWE2EW.js} +1 -1
  14. package/dist/{chunk-SIQ3P4OR.js → chunk-7GQFIWP4.js} +8 -756
  15. package/dist/{chunk-VKIZUUPM.js → chunk-7YXZFS56.js} +31 -14
  16. package/dist/{chunk-AKW7KISS.js → chunk-7ZWXTH5J.js} +2 -44
  17. package/dist/chunk-A7IG36LB.js +215 -0
  18. package/dist/chunk-B2DZLPDL.js +39 -0
  19. package/dist/chunk-C6BDBZRO.js +422 -0
  20. package/dist/chunk-CLDCYJQT.js +1 -0
  21. package/dist/{chunk-LUYVRATI.js → chunk-DA6I5VEY.js} +5 -213
  22. package/dist/chunk-H2MEFUQD.js +337 -0
  23. package/dist/chunk-I53EX4VU.js +734 -0
  24. package/dist/chunk-IIMU5YAJ.js +53 -0
  25. package/dist/chunk-JXVNHVK7.js +79 -0
  26. package/dist/chunk-M7Q4UBRY.js +85 -0
  27. package/dist/{chunk-K4UZU3TU.js → chunk-P34FFSOX.js} +1 -1
  28. package/dist/chunk-PGWANFNE.js +112 -0
  29. package/dist/{chunk-F6EFC2MJ.js → chunk-Q64E2TZY.js} +440 -2075
  30. package/dist/chunk-S3XR4II4.js +30 -0
  31. package/dist/chunk-SHZT7ULK.js +425 -0
  32. package/dist/{chunk-GX6XBRRF.js → chunk-TYRUKGGD.js} +2 -1
  33. package/dist/{chunk-R3VCBZDC.js → chunk-X4WBGKJQ.js} +3 -50
  34. package/dist/{chunk-GEFWMU26.js → chunk-X66MVMZT.js} +1 -9
  35. package/dist/{chunk-57OZ3AEG.js → chunk-Y3JQBSKQ.js} +1 -1
  36. package/dist/components/index.d.ts +74 -42
  37. package/dist/components/index.js +34 -19
  38. package/dist/components/navigation/index.js +3 -31
  39. package/dist/features/auth/index.d.ts +97 -99
  40. package/dist/features/auth/index.js +37 -99
  41. package/dist/features/clients/index.js +34 -19
  42. package/dist/features/crm/index.d.ts +65 -0
  43. package/dist/features/crm/index.js +34 -19
  44. package/dist/features/dashboard/index.js +34 -19
  45. package/dist/features/delivery/index.d.ts +65 -0
  46. package/dist/features/delivery/index.js +34 -19
  47. package/dist/features/knowledge/index.js +6 -30
  48. package/dist/features/lead-gen/index.d.ts +1096 -1
  49. package/dist/features/lead-gen/index.js +34 -19
  50. package/dist/features/monitoring/index.js +34 -19
  51. package/dist/features/monitoring/requests/index.js +34 -19
  52. package/dist/features/notes/index.d.ts +72 -0
  53. package/dist/features/notes/index.js +621 -0
  54. package/dist/features/operations/index.d.ts +10 -2
  55. package/dist/features/operations/index.js +34 -19
  56. package/dist/features/right-panel-host/index.d.ts +214 -0
  57. package/dist/features/right-panel-host/index.js +639 -0
  58. package/dist/features/seo/index.js +3 -2
  59. package/dist/features/settings/index.d.ts +68 -35
  60. package/dist/features/settings/index.js +34 -19
  61. package/dist/hooks/access/index.d.ts +90 -0
  62. package/dist/hooks/access/index.js +10 -0
  63. package/dist/hooks/delivery/index.d.ts +65 -0
  64. package/dist/hooks/delivery/index.js +34 -19
  65. package/dist/hooks/index.d.ts +1644 -1651
  66. package/dist/hooks/index.js +34 -19
  67. package/dist/hooks/published.d.ts +1644 -1651
  68. package/dist/hooks/published.js +34 -19
  69. package/dist/hooks/user-notes/index.d.ts +57 -0
  70. package/dist/hooks/user-notes/index.js +3 -0
  71. package/dist/index.d.ts +294 -277
  72. package/dist/index.js +35 -20
  73. package/dist/initialization/index.d.ts +65 -19
  74. package/dist/knowledge/index.d.ts +10 -2
  75. package/dist/knowledge/index.js +173 -28
  76. package/dist/layout/index.js +5 -3
  77. package/dist/organization/index.d.ts +0 -19
  78. package/dist/organization/index.js +34 -19
  79. package/dist/profile/index.d.ts +65 -0
  80. package/dist/provider/index.css +0 -384
  81. package/dist/provider/index.d.ts +75 -2
  82. package/dist/provider/index.js +16 -21
  83. package/dist/provider/published.css +0 -523
  84. package/dist/provider/published.d.ts +75 -2
  85. package/dist/provider/published.js +11 -21
  86. package/dist/supabase/index.d.ts +127 -0
  87. package/dist/test-utils/index.d.ts +2 -21
  88. package/dist/test-utils/index.js +5 -18
  89. package/dist/theme/index.js +3 -1
  90. package/dist/types/index.d.ts +115 -59
  91. package/dist/utils/index.js +2 -1
  92. package/package.json +21 -5
  93. package/src/auth/README.md +6 -6
  94. package/dist/components/navigation/index.css +0 -649
  95. package/dist/features/knowledge/index.css +0 -649
@@ -1,40 +1,47 @@
1
+ import { useAvailablePresets } from './chunk-B2DZLPDL.js';
2
+ import { useSupabase } from './chunk-BRXELOHC.js';
3
+ import { useBreadcrumbs } from './chunk-M7Q4UBRY.js';
1
4
  import { ChatHeader, ChatSidebar } from './chunk-CXY7FMUM.js';
2
- import { observabilityKeys, useCyberColors, CardHeader, EmptyState, CyberLegendItem, CyberAreaChart, CenteredErrorState, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, FeatureUnavailableState, ElevasisLoader, GlowDot, JsonViewer, ListSkeleton, PageTitleCaption, StatCard, APIErrorAlert, CyberDonut, CollapsibleSection, ActivityTimeline, ContextViewer, StatusBadge, TabCountBadge, ResourceCard, HeroStatsRow, CostTrendChart, ActivityTrendChart } from './chunk-SIQ3P4OR.js';
5
+ import { observabilityKeys, useCyberColors, CyberLegendItem, CyberAreaChart, CyberDonut, HeroStatsRow, CostTrendChart, ActivityTrendChart } from './chunk-7GQFIWP4.js';
6
+ import { DEFAULT_ORGANIZATION_GRAPH_FILTERS, ORGANIZATION_GRAPH_NODE_KIND_ORDER, ORGANIZATION_GRAPH_NODE_KIND_LABELS, ORGANIZATION_GRAPH_EDGE_KIND_LABELS, ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS, ORGANIZATION_GRAPH_NODE_KIND_MEANINGS, ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS } from './chunk-5EYJ2GIN.js';
7
+ import { AppShellLoader, SubshellSidebarLoader, PageContainer, SubshellLoader, AppShellCenteredContainer } from './chunk-DA6I5VEY.js';
8
+ import { SubshellNavItem } from './chunk-X4WBGKJQ.js';
9
+ import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
10
+ import { Graph_module_css_default, useDirectedChainHighlighting, useNodeSelection, useFitViewTrigger, useGraphHighlighting, calculateGraphHeight, GRAPH_CONSTANTS } from './chunk-HENXLGVD.js';
11
+ import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent, getResourceStatusColor, useMergedExecution, useTimelineData, useAgentIterationData } from './chunk-7FPLLSHN.js';
12
+ import { glassBase } from './chunk-7ZWXTH5J.js';
13
+ import { useNotificationAdapter, useCrmActions, useListActions } from './chunk-H2MEFUQD.js';
14
+ import { EmptyState, CenteredErrorState, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, GlowDot, JsonViewer, ListSkeleton, PageTitleCaption, StatCard, APIErrorAlert, CollapsibleSection, ActivityTimeline, ContextViewer, StatusBadge, TabCountBadge, ResourceCard } from './chunk-I53EX4VU.js';
3
15
  import { StyledMarkdown } from './chunk-3KMDHCAR.js';
4
- import { glassBase, mantineThemeOverride, createCssVariablesResolver, PresetsProvider, useAvailablePresets } from './chunk-AKW7KISS.js';
5
- import { PRESETS, getPreset, generateShades } from './chunk-WF7CONXF.js';
6
- import { useSupabase } from './chunk-BRXELOHC.js';
7
- import { resolveOrganizationModel, OrgKnowledgeNodeSchema, defineResources, defineActions, defineTopology, topologyRef, listAllSystems, projectOrganizationSurfaces, topologyRelationship, PROJECTS_VIEW_ACTION_ID, resolveSemanticIconComponent, getAllBuildTemplates, getLeadGenStageCatalog, buildOrganizationGraph, getResourcesForSystem, devOnlyFor, requiresAdminFor, topLevel, parentOf, ancestorsOf, childrenOf, findById, findByPath, getSystem, SemanticIcon, defaultPathFor, getSortedSidebarEntries, compileOrganizationOntology, getSystemAncestors, getSemanticIconComponent } from './chunk-O2Q4VMRN.js';
8
- import { SubshellContainer, SubshellSidebar, SubshellRightSideContainer, AppearanceProvider, AppShellLoader, useAppearance, SubshellSidebarLoader, SubshellContentContainer, PageContainer, SubshellLoader, AppShellCenteredContainer } from './chunk-LUYVRATI.js';
9
- import { AppBackground } from './chunk-WLOQ4IBG.js';
10
- import { HTTP_HEADERS, ApiClientProvider, useApiClient } from './chunk-57OZ3AEG.js';
11
- import { SubshellSidebarSection, SubshellNavItem } from './chunk-R3VCBZDC.js';
16
+ import { CardHeader } from './chunk-S3XR4II4.js';
17
+ import { useAppearance, SubshellContentContainer } from './chunk-A7IG36LB.js';
18
+ import { HTTP_HEADERS } from './chunk-Y3JQBSKQ.js';
12
19
  import { topbarHeight } from './chunk-DT3QYZVU.js';
13
20
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
14
- import { Graph_module_css_default, useDirectedChainHighlighting, useNodeSelection, useFitViewTrigger, useGraphHighlighting, calculateGraphHeight, GRAPH_CONSTANTS } from './chunk-HENXLGVD.js';
15
- import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent, getResourceStatusColor, useMergedExecution, useTimelineData, useAgentIterationData } from './chunk-7FPLLSHN.js';
16
- import { ResourceTypeSchema, NonEmptyStringSchema, OriginResourceTypeSchema, UuidSchema, CredentialNameSchema, getErrorInfo, getErrorTitle, formatErrorMessage, STALE_TIME_DEFAULT, isAPIClientError, getTimeRangeDates, formatBucketTime, PAGE_SIZE_DEFAULT, REFETCH_INTERVAL_DASHBOARD, STALE_TIME_MONITORING, 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, formatDateTime, getResourceIcon, formatTimeAgo, formatDate, formatRelativeTime, debounce, OAUTH_FLOW_TIMEOUT } from './chunk-GEFWMU26.js';
21
+ import { ResourceTypeSchema, NonEmptyStringSchema, OriginResourceTypeSchema, UuidSchema, CredentialNameSchema, getErrorInfo, formatErrorMessage, getErrorTitle, isAPIClientError, getTimeRangeDates, formatBucketTime, PAGE_SIZE_DEFAULT, REFETCH_INTERVAL_DASHBOARD, REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, APIClientError, formatDateTime, getResourceIcon, formatTimeAgo, formatDate, formatRelativeTime, debounce, OAUTH_FLOW_TIMEOUT } from './chunk-X66MVMZT.js';
17
22
  import { ResourceStatusColors, toWorkflowLogMessages } from './chunk-KRWALB24.js';
18
- import { useStableAccessToken } from './chunk-VKIZUUPM.js';
19
- import { useInitialization, InitializationProvider } from './chunk-533DUEQY.js';
20
- import { OrganizationContext, useOrganization } from './chunk-DD3CCMCZ.js';
21
- import { useProfile, useUserProfile, ProfileProvider } from './chunk-2Q2JQSQO.js';
22
- import { useElevasisServices, ElevasisServiceProvider } from './chunk-KJ3QUBNU.js';
23
+ import { useStableAccessToken } from './chunk-7YXZFS56.js';
24
+ import { useAccess, AccessKeys } from './chunk-4O3VAALW.js';
25
+ import { useOptionalElevasisSystems, useElevasisSystems } from './chunk-C6BDBZRO.js';
26
+ import { useInitialization } from './chunk-533DUEQY.js';
27
+ import { defineEntities, OrgKnowledgeNodeSchema, defineResources, defineActions, defineTopology, topologyRef, resolveOrganizationModel, listAllSystems, projectOrganizationSurfaces, topologyRelationship, PROJECTS_VIEW_ACTION_ID, resolveSemanticIconComponent, getAllBuildTemplates, getLeadGenStageCatalog, buildOrganizationGraph, getResourcesForSystem, getSystem, SemanticIcon, compileOrganizationOntology, getSystemAncestors } from './chunk-566XWGPP.js';
28
+ import { useOrganization } from './chunk-DD3CCMCZ.js';
29
+ import { useUserProfile } from './chunk-2Q2JQSQO.js';
30
+ import { STALE_TIME_MONITORING, STALE_TIME_DEFAULT, STALE_TIME_ADMIN, GC_TIME_MEDIUM, GC_TIME_SHORT } from './chunk-6ROXVZ3L.js';
31
+ import { useElevasisServices } from './chunk-KJ3QUBNU.js';
23
32
  import { useAuthContext } from './chunk-BRJ3QZ4E.js';
24
- import { createContext, lazy, memo, useMemo, useState, useRef, useEffect, useCallback, createElement, useContext, cloneElement, useId, Fragment as Fragment$1, Component, useDeferredValue, useEffectEvent, Suspense } from 'react';
25
- import { useQueryClient, useQuery, useMutation, QueryClientProvider, useQueries, QueryClient } from '@tanstack/react-query';
26
- import { createUseExternalEvents, Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Card, Title, Checkbox, Tooltip, Center, Modal, TextInput, Textarea, Loader, Alert, Button, Space, Table, Select, ActionIcon, SegmentedControl, NumberFormatter, Switch, Pagination, mergeThemeOverrides, MantineProvider, UnstyledButton, Divider, ScrollArea, Popover, Indicator, Collapse, ThemeIcon, SimpleGrid, Code, CopyButton, PasswordInput, Anchor, Menu, Timeline, useMantineTheme, RangeSlider, Progress, Tabs, Breadcrumbs as Breadcrumbs$1, NumberInput, ColorSwatch, RingProgress, Grid, LoadingOverlay, Accordion, MultiSelect, Radio, Pill, Drawer, Chip, JsonInput, TagsInput } from '@mantine/core';
27
- import { IconPlayerPlay, IconPlayerStop, IconArrowsSplit, IconSquare, IconBrain, IconFileText, IconLayoutGrid, IconColumns, IconFileInvoice, IconNotes, IconBriefcase, IconChecklist, IconFlag, IconList, IconBuilding, IconAddressBook, IconMail, IconSend, IconClock, IconArrowUp, IconMessageCircle, IconRocket, IconEye, IconEdit, IconAlertTriangle, IconRefresh, IconX, IconCheck, IconTarget, IconActivity, IconCode, IconSettings, IconLock, IconShieldOff, IconChevronUp, IconChevronDown, IconSelector, IconTrash, IconChartBar, IconCircleCheck, IconThumbDown, IconThumbUp, IconCircleX, IconSearch, IconFilterOff, IconArrowUpRight, IconAlertCircle, IconExternalLink, IconChartPie, IconHeartbeat, IconDownload, IconCpu, IconTrendingUp, IconCash, IconInfoCircle, IconExclamationCircle, IconBug, IconChecks, IconCircle, IconCircleFilled, IconBell, IconFocus2, IconChevronRight, IconTool, IconClockHour4, IconVersions, IconNetwork, IconSitemap, IconPencil, IconKey, IconCalendar, IconExclamationMark, IconShieldLock, IconCopy, IconPlus, IconPower, IconTag, IconUsers, IconWebhook, IconReload, IconTerminal2, IconMessage, IconArrowLeft, IconCalendarRepeat, IconCalendarEvent, IconCalendarTime, IconRobot, IconGitBranch, IconDotsVertical, IconPlayerPause, IconCalendarDue, IconCalendarStats, IconCalendarOff, IconListCheck, IconFilter, IconCategory, IconDatabase, IconTrophy, IconClockExclamation, IconUser, IconHistory, IconCurrencyDollar, IconTargetArrow, IconMessages, IconInbox, IconBolt, IconRestore, IconArrowRight, IconSparkles, IconListDetails, IconLayoutDashboard, IconBuildingFactory2, IconFileDescription, IconApps, IconRoute, IconHandStop, IconAdjustmentsHorizontal, IconCircleDashed, IconFolders, IconBraces, IconTopologyStar3, IconLayoutSidebarRightExpand, IconNote, IconArchive, IconTimeline, IconPalette, IconAdjustments, IconBrandDropbox, IconBrandGoogleDrive, IconPlug, IconMailForward, IconArrowDown, IconUserX, IconUserCheck, IconFileOff, IconCheckbox, IconPhone, IconActivityHeartbeat, IconClockPause, IconArrowsMaximize, IconShare2, IconFolder, IconScript, IconPlugConnected } from '@tabler/icons-react';
28
- import { z } from 'zod';
33
+ import { memo, useMemo, useRef, useEffect, cloneElement, useState, useCallback, useId, Fragment as Fragment$1, useDeferredValue, useEffectEvent } from 'react';
34
+ import { createUseExternalEvents, Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Card, Title, Checkbox, Tooltip, Center, Modal, TextInput, Textarea, Loader, Alert, Button, Space, Table, Select, ActionIcon, SegmentedControl, NumberFormatter, Switch, Pagination, UnstyledButton, Divider, ScrollArea, Popover, Indicator, Collapse, ThemeIcon, SimpleGrid, Code, CopyButton, PasswordInput, Anchor, Menu, Timeline, useMantineTheme, RangeSlider, Progress, Tabs, Breadcrumbs as Breadcrumbs$1, NumberInput, ColorSwatch, RingProgress, Grid, LoadingOverlay, Accordion, MultiSelect, Radio, Pill, Drawer, Chip, JsonInput, TagsInput } from '@mantine/core';
35
+ import { IconPlayerPlay, IconPlayerStop, IconArrowsSplit, IconSquare, IconBrain, IconFileText, IconLayoutGrid, IconColumns, IconFileInvoice, IconNotes, IconBriefcase, IconChecklist, IconFlag, IconList, IconBuilding, IconAddressBook, IconMail, IconSend, IconClock, IconArrowUp, IconMessageCircle, IconRocket, IconEye, IconEdit, IconAlertTriangle, IconRefresh, IconX, IconCheck, IconTarget, IconActivity, IconCode, IconSettings, IconLock, IconShieldOff, IconChevronUp, IconChevronDown, IconSelector, IconTrash, IconChartBar, IconCircleCheck, IconThumbDown, IconThumbUp, IconCircleX, IconSearch, IconFilterOff, IconArrowUpRight, IconAlertCircle, IconExternalLink, IconChartPie, IconHeartbeat, IconDownload, IconCpu, IconTrendingUp, IconCash, IconInfoCircle, IconExclamationCircle, IconBug, IconChecks, IconCircle, IconCircleFilled, IconBell, IconFocus2, IconChevronRight, IconTool, IconClockHour4, IconVersions, IconNetwork, IconSitemap, IconPencil, IconKey, IconCalendar, IconExclamationMark, IconShieldLock, IconCopy, IconPlus, IconPower, IconTag, IconUsers, IconWebhook, IconReload, IconTerminal2, IconMessage, IconArrowLeft, IconCalendarRepeat, IconCalendarEvent, IconCalendarTime, IconRobot, IconGitBranch, IconDotsVertical, IconPlayerPause, IconCalendarDue, IconCalendarStats, IconCalendarOff, IconListCheck, IconFilter, IconCategory, IconDatabase, IconTrophy, IconClockExclamation, IconUser, IconHistory, IconCurrencyDollar, IconTargetArrow, IconMessages, IconInbox, IconBolt, IconRestore, IconArrowRight, IconSparkles, IconListDetails, IconLayoutDashboard, IconBuildingFactory2, IconFileDescription, IconApps, IconRoute, IconHandStop, IconAdjustmentsHorizontal, IconCircleDashed, IconFolders, IconBraces, IconTopologyStar3, IconLayoutSidebarRightExpand, IconNote, IconArchive, IconTimeline, IconPalette, IconBrandDropbox, IconBrandGoogleDrive, IconPlug, IconMailForward, IconArrowDown, IconUserX, IconUserCheck, IconFileOff, IconCheckbox, IconPhone, IconActivityHeartbeat, IconClockPause, IconArrowsMaximize, IconShare2, IconFolder, IconScript, IconPlugConnected } from '@tabler/icons-react';
29
36
  import * as runtime from 'react/jsx-runtime';
30
37
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
31
38
  import { useForm } from '@mantine/form';
39
+ import { z } from 'zod';
32
40
  import { useDisclosure, useClipboard, randomId } from '@mantine/hooks';
33
41
  import { notifications } from '@mantine/notifications';
42
+ import { useQueryClient, useMutation, useQuery, useQueries } from '@tanstack/react-query';
34
43
  import { AreaChart } from '@mantine/charts';
35
44
  import { formatDistanceToNow } from 'date-fns';
36
- import '@mantine/core/styles.css';
37
- import '@mantine/notifications/styles.css';
38
45
  import { useNavigate, useSearch, Link as Link$1 } from '@tanstack/react-router';
39
46
  import { create } from 'zustand';
40
47
  import { persist } from 'zustand/middleware';
@@ -52,229 +59,110 @@ import '@mantine/charts/styles.css';
52
59
  import cytoscape from 'cytoscape';
53
60
  import { useAuth } from '@workos-inc/authkit-react';
54
61
 
55
- function OrganizationProvider({ apiRequest, children }) {
56
- const { user, organizationId: workosOrgId } = useAuthContext();
57
- const { profile, error: profileError } = useProfile();
58
- const queryClient = useQueryClient();
59
- const [memberships, setMemberships] = useState([]);
60
- const [currentWorkOSOrganizationId, setCurrentWorkOSOrganizationId] = useState(null);
61
- const [currentSupabaseOrganizationId, setCurrentSupabaseOrganizationId] = useState(null);
62
- const [currentMembership, setCurrentMembership] = useState(null);
63
- const [isInitializing, setIsInitializing] = useState(true);
64
- const [isOrgRefreshing, setIsOrgRefreshing] = useState(false);
65
- const [error, setError] = useState(null);
66
- const hasInitializedRef = useRef(false);
67
- const [profileLoaded, setProfileLoaded] = useState(false);
68
- useEffect(() => {
69
- if (profile !== void 0 && profile !== null) {
70
- setProfileLoaded(true);
71
- }
72
- }, [profile]);
73
- useEffect(() => {
74
- if (profileError && isInitializing && !hasInitializedRef.current) {
75
- setIsInitializing(false);
76
- }
77
- }, [profileError, isInitializing]);
78
- useEffect(() => {
79
- if (!user) {
80
- setMemberships([]);
81
- setCurrentWorkOSOrganizationId(null);
82
- setCurrentSupabaseOrganizationId(null);
83
- setCurrentMembership(null);
84
- setIsInitializing(false);
85
- setIsOrgRefreshing(false);
86
- setError(null);
87
- hasInitializedRef.current = false;
88
- setProfileLoaded(false);
62
+ function RoleBadge({ name, isSystem }) {
63
+ return /* @__PURE__ */ jsx(Badge, { color: isSystem ? "gray" : "primary", variant: "light", children: /* @__PURE__ */ jsxs(Group, { gap: 4, wrap: "nowrap", children: [
64
+ isSystem && /* @__PURE__ */ jsx(IconLock, { size: 10 }),
65
+ name
66
+ ] }) });
67
+ }
68
+ function groupByDomain(catalog) {
69
+ const groups = /* @__PURE__ */ new Map();
70
+ for (const row of catalog) {
71
+ const domain = row.key.split(".")[0] ?? row.key;
72
+ const existing = groups.get(domain);
73
+ if (existing) {
74
+ existing.push(row);
75
+ } else {
76
+ groups.set(domain, [row]);
89
77
  }
90
- }, [user]);
91
- const applyMembership = useCallback((membership) => {
92
- setCurrentMembership(membership);
93
- setCurrentSupabaseOrganizationId(membership?.organization?.id ?? null);
94
- setCurrentWorkOSOrganizationId(membership?.organization?.workos_org_id ?? null);
95
- }, []);
96
- const selectOrganization = useCallback(
97
- (data) => {
98
- let selected = null;
99
- if (profile?.last_visited_org) {
100
- selected = data.find((m) => m.organizationId === profile.last_visited_org) ?? null;
101
- }
102
- if (!selected && workosOrgId) {
103
- selected = data.find((m) => m.organization?.workos_org_id === workosOrgId) ?? null;
104
- }
105
- if (!selected && data.length > 0) {
106
- selected = data[0];
107
- }
108
- if (selected) {
109
- applyMembership(selected);
110
- }
111
- },
112
- [profile?.last_visited_org, workosOrgId, applyMembership]
113
- );
114
- const fetchAndInitialize = useCallback(async () => {
115
- if (!user?.id || !profileLoaded) return;
116
- setError(null);
117
- if (memberships.length === 0) {
118
- setIsInitializing(true);
78
+ }
79
+ return groups;
80
+ }
81
+ var DOMAIN_LABELS = {
82
+ org: "Organization",
83
+ members: "Members",
84
+ roles: "Roles",
85
+ secrets: "Secrets",
86
+ operations: "Operations",
87
+ work: "Work"
88
+ };
89
+ function domainLabel(domain) {
90
+ return DOMAIN_LABELS[domain] ?? domain.charAt(0).toUpperCase() + domain.slice(1);
91
+ }
92
+ function PermissionMatrix({ catalog, selectedKeys, onChange, systemLocked }) {
93
+ const groups = groupByDomain(catalog);
94
+ const isDisplayOnly = !onChange || systemLocked;
95
+ function handleToggle(key, checked) {
96
+ if (!onChange || systemLocked) return;
97
+ if (checked) {
98
+ onChange([...selectedKeys, key]);
119
99
  } else {
120
- setIsOrgRefreshing(true);
100
+ onChange(selectedKeys.filter((k) => k !== key));
121
101
  }
122
- try {
123
- const data = await apiRequest("/memberships/my-memberships");
124
- if (!Array.isArray(data)) {
125
- throw new Error("Invalid memberships response");
126
- }
127
- setMemberships(data);
128
- if (data.length === 0) {
129
- hasInitializedRef.current = true;
130
- return;
131
- }
132
- if (!currentWorkOSOrganizationId) {
133
- selectOrganization(data);
134
- } else {
135
- const stillPresent = data.find((m) => m.organization?.workos_org_id === currentWorkOSOrganizationId);
136
- if (!stillPresent) {
137
- applyMembership(data[0] ?? null);
138
- } else {
139
- applyMembership(stillPresent);
140
- }
102
+ }
103
+ return /* @__PURE__ */ jsx(Stack, { gap: "md", children: Array.from(groups.entries()).map(([domain, rows]) => /* @__PURE__ */ jsxs(Card, { withBorder: true, padding: "md", children: [
104
+ /* @__PURE__ */ jsx(Title, { order: 5, mb: "sm", style: { textTransform: "capitalize" }, children: domainLabel(domain) }),
105
+ /* @__PURE__ */ jsx(Stack, { gap: "xs", children: rows.map((row) => {
106
+ const isLocked = !row.isOrgGrantable;
107
+ const isChecked = selectedKeys.includes(row.key);
108
+ const isDisabled = isDisplayOnly || isLocked;
109
+ const checkbox = /* @__PURE__ */ jsx(
110
+ Checkbox,
111
+ {
112
+ checked: isChecked,
113
+ disabled: isDisabled,
114
+ onChange: (e) => handleToggle(row.key, e.currentTarget.checked),
115
+ label: /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", children: [
116
+ /* @__PURE__ */ jsx(Text, { size: "sm", ff: "monospace", c: isLocked ? "var(--color-text-subtle)" : void 0, children: row.key }),
117
+ isLocked && /* @__PURE__ */ jsx(IconLock, { size: 14, style: { color: "var(--color-text-subtle)", flexShrink: 0 } }),
118
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: row.description })
119
+ ] })
120
+ },
121
+ row.key
122
+ );
123
+ if (isLocked) {
124
+ return /* @__PURE__ */ jsx(Tooltip, { label: "Reserved for built-in roles", position: "right", children: /* @__PURE__ */ jsx("div", { children: checkbox }) }, row.key);
141
125
  }
142
- hasInitializedRef.current = true;
143
- } catch (err) {
144
- setError(err instanceof Error ? err.message : "Failed to load organizations");
145
- } finally {
146
- setIsInitializing(false);
147
- setIsOrgRefreshing(false);
148
- }
149
- }, [
150
- user?.id,
151
- profileLoaded,
152
- memberships.length,
153
- apiRequest,
154
- currentWorkOSOrganizationId,
155
- selectOrganization,
156
- applyMembership
157
- ]);
158
- useEffect(() => {
159
- if (!user?.id || !profileLoaded || hasInitializedRef.current) return;
160
- fetchAndInitialize();
161
- }, [user?.id, profileLoaded, fetchAndInitialize]);
162
- useEffect(() => {
163
- if (!hasInitializedRef.current) return;
164
- if (!workosOrgId) return;
165
- if (workosOrgId === currentWorkOSOrganizationId) return;
166
- const target = memberships.find((m) => m.organization?.workos_org_id === workosOrgId);
167
- if (!target) return;
168
- applyMembership(target);
169
- void queryClient.invalidateQueries();
170
- }, [workosOrgId, currentWorkOSOrganizationId, memberships, applyMembership, queryClient]);
171
- const switchOrganization = useCallback(
172
- (workosOrgId2) => {
173
- const target = memberships.find((m) => m.organization?.workos_org_id === workosOrgId2);
174
- if (!target) return;
175
- applyMembership(target);
176
- void queryClient.invalidateQueries();
177
- void apiRequest("/users/me", {
178
- method: "PATCH",
179
- headers: { "Content-Type": "application/json" },
180
- body: JSON.stringify({ last_visited_org: target.organizationId })
181
- }).catch((err) => {
182
- console.warn("Failed to persist last_visited_org preference:", err);
183
- });
184
- },
185
- [memberships, applyMembership, queryClient, apiRequest]
186
- );
187
- const retry = useCallback(async () => {
188
- hasInitializedRef.current = false;
189
- setError(null);
190
- await fetchAndInitialize();
191
- }, [fetchAndInitialize]);
192
- const value = {
193
- currentWorkOSOrganizationId,
194
- currentSupabaseOrganizationId,
195
- currentMembership,
196
- memberships,
197
- isInitializing,
198
- isOrgRefreshing,
199
- error,
200
- switchOrganization,
201
- retry
202
- };
203
- return createElement(OrganizationContext.Provider, { value }, children);
126
+ return checkbox;
127
+ }) })
128
+ ] }, domain)) });
204
129
  }
205
-
206
- // ../core/src/auth/multi-tenancy/permissions.ts
207
- var PERMISSIONS = {
208
- ORG_READ: "org.read",
209
- ORG_MANAGE: "org.manage",
210
- ORG_DELETE: "org.delete",
211
- MEMBERS_MANAGE: "members.manage",
212
- ROLES_MANAGE: "roles.manage",
213
- SECRETS_MANAGE: "secrets.manage",
214
- OPERATIONS_READ: "operations.read",
215
- OPERATIONS_MANAGE: "operations.manage",
216
- ACQUISITION_MANAGE: "acquisition.manage",
217
- PROJECTS_MANAGE: "projects.manage",
218
- CLIENTS_MANAGE: "clients.manage"
130
+ function NoAccessState() {
131
+ return /* @__PURE__ */ jsx(Center, { style: { flex: 1, minHeight: "100%", width: "100%", padding: 24 }, children: /* @__PURE__ */ jsxs(Stack, { align: "center", gap: "xs", style: { maxWidth: 480, textAlign: "center" }, children: [
132
+ /* @__PURE__ */ jsx(IconLock, { size: 44, stroke: 1.8, color: "var(--color-text-subtle)" }),
133
+ /* @__PURE__ */ jsx(Title, { order: 3, children: "Access restricted" }),
134
+ /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "You don't have permission to view this page. Contact an org admin if you need access." })
135
+ ] }) });
136
+ }
137
+ var [useModalsEvents, createEvent] = createUseExternalEvents("mantine-modals");
138
+ var openModal = (payload) => {
139
+ const id = payload.modalId || randomId();
140
+ createEvent("openModal")({ ...payload, modalId: id });
141
+ return id;
142
+ };
143
+ var openConfirmModal = (payload) => {
144
+ const id = payload.modalId || randomId();
145
+ createEvent("openConfirmModal")({ ...payload, modalId: id });
146
+ return id;
147
+ };
148
+ var openContextModal = (payload) => {
149
+ const id = payload.modalId || randomId();
150
+ createEvent("openContextModal")({ ...payload, modalId: id });
151
+ return id;
152
+ };
153
+ var closeModal = createEvent("closeModal");
154
+ var closeAllModals = createEvent("closeAllModals");
155
+ var updateModal = (payload) => createEvent("updateModal")(payload);
156
+ var updateContextModal = (payload) => createEvent("updateContextModal")(payload);
157
+ var modals = {
158
+ open: openModal,
159
+ close: closeModal,
160
+ closeAll: closeAllModals,
161
+ openConfirmModal,
162
+ openContextModal,
163
+ updateModal,
164
+ updateContextModal
219
165
  };
220
- var PERMISSION_CATALOG = [
221
- {
222
- key: "org.read",
223
- description: "Read organization profile and listings",
224
- isOrgGrantable: true
225
- },
226
- {
227
- key: "org.manage",
228
- description: "Update organization settings",
229
- isOrgGrantable: false
230
- },
231
- {
232
- key: "org.delete",
233
- description: "Delete the organization (owner-only)",
234
- isOrgGrantable: false
235
- },
236
- {
237
- key: "members.manage",
238
- description: "Invite, remove, and reassign roles for members",
239
- isOrgGrantable: false
240
- },
241
- {
242
- key: "roles.manage",
243
- description: "Grant or revoke privileged system roles (owner, admin) within the organization",
244
- isOrgGrantable: false
245
- },
246
- {
247
- key: "secrets.manage",
248
- description: "Create, update, and delete API keys and credentials",
249
- isOrgGrantable: false
250
- },
251
- {
252
- key: "operations.read",
253
- description: "View executions, sessions, schedules, and command queue",
254
- isOrgGrantable: true
255
- },
256
- {
257
- key: "operations.manage",
258
- description: "Run and modify executions, sessions, schedules, queue",
259
- isOrgGrantable: true
260
- },
261
- {
262
- key: "acquisition.manage",
263
- description: "Create, update, and delete acquisition records (acq_companies, acq_contacts, acq_deals, acq_lists*, acq_content*, acquisition storage files)",
264
- isOrgGrantable: false
265
- },
266
- {
267
- key: "projects.manage",
268
- description: "Create, update, and delete project records (prj_projects, prj_milestones, prj_tasks, prj_notes)",
269
- isOrgGrantable: false
270
- },
271
- {
272
- key: "clients.manage",
273
- description: "Create, update, and delete client hub records (clients, clt_* satellites)",
274
- isOrgGrantable: false
275
- }
276
- ];
277
- new Set(PERMISSION_CATALOG.map((p) => p.key));
278
166
 
279
167
  // ../core/src/auth/multi-tenancy/memberships/membership.ts
280
168
  function transformMembershipToTableRow(membership) {
@@ -905,146 +793,7 @@ var CredentialSchemas = {
905
793
  VerifyResponse: VerifyCredentialResponseSchema
906
794
  };
907
795
 
908
- // src/hooks/auth/useOrganizationPermissions.ts
909
- var ALL_PERMISSIONS = Object.values(PERMISSIONS);
910
- function useOrganizationPermissions() {
911
- const { apiRequest, workOSOrganizationId, isReady } = useElevasisServices();
912
- const { profile } = useInitialization();
913
- const isPlatformAdmin = profile?.is_platform_admin === true;
914
- const query = useQuery({
915
- queryKey: ["organization-permissions", workOSOrganizationId],
916
- queryFn: () => apiRequest(`/memberships/my-permissions/${workOSOrganizationId}`),
917
- enabled: isReady && !!workOSOrganizationId && !isPlatformAdmin,
918
- staleTime: STALE_TIME_DEFAULT
919
- });
920
- const permissions = useMemo(
921
- () => isPlatformAdmin ? ALL_PERMISSIONS : query.data?.permissions ?? [],
922
- [isPlatformAdmin, query.data?.permissions]
923
- );
924
- const hasPermission = useCallback(
925
- (key) => isPlatformAdmin ? true : permissions.includes(key),
926
- [isPlatformAdmin, permissions]
927
- );
928
- return {
929
- hasPermission,
930
- permissions,
931
- isPlatformAdmin,
932
- isReady: isPlatformAdmin ? isReady : !query.isPending && isReady
933
- };
934
- }
935
- function useHasPermission(key) {
936
- const { hasPermission } = useOrganizationPermissions();
937
- return hasPermission(key);
938
- }
939
- function Can({ permission, fallback = null, children }) {
940
- const { hasPermission, isReady } = useOrganizationPermissions();
941
- if (!isReady) return null;
942
- return hasPermission(permission) ? /* @__PURE__ */ jsx(Fragment, { children }) : /* @__PURE__ */ jsx(Fragment, { children: fallback });
943
- }
944
- function RoleBadge({ name, isSystem }) {
945
- return /* @__PURE__ */ jsx(Badge, { color: isSystem ? "gray" : "primary", variant: "light", children: /* @__PURE__ */ jsxs(Group, { gap: 4, wrap: "nowrap", children: [
946
- isSystem && /* @__PURE__ */ jsx(IconLock, { size: 10 }),
947
- name
948
- ] }) });
949
- }
950
- function groupByDomain(catalog) {
951
- const groups = /* @__PURE__ */ new Map();
952
- for (const row of catalog) {
953
- const domain = row.key.split(".")[0] ?? row.key;
954
- const existing = groups.get(domain);
955
- if (existing) {
956
- existing.push(row);
957
- } else {
958
- groups.set(domain, [row]);
959
- }
960
- }
961
- return groups;
962
- }
963
- var DOMAIN_LABELS = {
964
- org: "Organization",
965
- members: "Members",
966
- roles: "Roles",
967
- secrets: "Secrets",
968
- operations: "Operations",
969
- work: "Work"
970
- };
971
- function domainLabel(domain) {
972
- return DOMAIN_LABELS[domain] ?? domain.charAt(0).toUpperCase() + domain.slice(1);
973
- }
974
- function PermissionMatrix({ catalog, selectedKeys, onChange, systemLocked }) {
975
- const groups = groupByDomain(catalog);
976
- const isDisplayOnly = !onChange || systemLocked;
977
- function handleToggle(key, checked) {
978
- if (!onChange || systemLocked) return;
979
- if (checked) {
980
- onChange([...selectedKeys, key]);
981
- } else {
982
- onChange(selectedKeys.filter((k) => k !== key));
983
- }
984
- }
985
- return /* @__PURE__ */ jsx(Stack, { gap: "md", children: Array.from(groups.entries()).map(([domain, rows]) => /* @__PURE__ */ jsxs(Card, { withBorder: true, padding: "md", children: [
986
- /* @__PURE__ */ jsx(Title, { order: 5, mb: "sm", style: { textTransform: "capitalize" }, children: domainLabel(domain) }),
987
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: rows.map((row) => {
988
- const isLocked = !row.isOrgGrantable;
989
- const isChecked = selectedKeys.includes(row.key);
990
- const isDisabled = isDisplayOnly || isLocked;
991
- const checkbox = /* @__PURE__ */ jsx(
992
- Checkbox,
993
- {
994
- checked: isChecked,
995
- disabled: isDisabled,
996
- onChange: (e) => handleToggle(row.key, e.currentTarget.checked),
997
- label: /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", children: [
998
- /* @__PURE__ */ jsx(Text, { size: "sm", ff: "monospace", c: isLocked ? "var(--color-text-subtle)" : void 0, children: row.key }),
999
- isLocked && /* @__PURE__ */ jsx(IconLock, { size: 14, style: { color: "var(--color-text-subtle)", flexShrink: 0 } }),
1000
- /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: row.description })
1001
- ] })
1002
- },
1003
- row.key
1004
- );
1005
- if (isLocked) {
1006
- return /* @__PURE__ */ jsx(Tooltip, { label: "Reserved for built-in roles", position: "right", children: /* @__PURE__ */ jsx("div", { children: checkbox }) }, row.key);
1007
- }
1008
- return checkbox;
1009
- }) })
1010
- ] }, domain)) });
1011
- }
1012
- function NoAccessState() {
1013
- return /* @__PURE__ */ jsx(Center, { style: { flex: 1, minHeight: "100%", width: "100%", padding: 24 }, children: /* @__PURE__ */ jsxs(Stack, { align: "center", gap: "xs", style: { maxWidth: 480, textAlign: "center" }, children: [
1014
- /* @__PURE__ */ jsx(IconLock, { size: 44, stroke: 1.8, color: "var(--color-text-subtle)" }),
1015
- /* @__PURE__ */ jsx(Title, { order: 3, children: "Access restricted" }),
1016
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "You don't have permission to view this page. Contact an org admin if you need access." })
1017
- ] }) });
1018
- }
1019
- var [useModalsEvents, createEvent] = createUseExternalEvents("mantine-modals");
1020
- var openModal = (payload) => {
1021
- const id = payload.modalId || randomId();
1022
- createEvent("openModal")({ ...payload, modalId: id });
1023
- return id;
1024
- };
1025
- var openConfirmModal = (payload) => {
1026
- const id = payload.modalId || randomId();
1027
- createEvent("openConfirmModal")({ ...payload, modalId: id });
1028
- return id;
1029
- };
1030
- var openContextModal = (payload) => {
1031
- const id = payload.modalId || randomId();
1032
- createEvent("openContextModal")({ ...payload, modalId: id });
1033
- return id;
1034
- };
1035
- var closeModal = createEvent("closeModal");
1036
- var closeAllModals = createEvent("closeAllModals");
1037
- var updateModal = (payload) => createEvent("updateModal")(payload);
1038
- var updateContextModal = (payload) => createEvent("updateContextModal")(payload);
1039
- var modals = {
1040
- open: openModal,
1041
- close: closeModal,
1042
- closeAll: closeAllModals,
1043
- openConfirmModal,
1044
- openContextModal,
1045
- updateModal,
1046
- updateContextModal
1047
- };
796
+ // src/components/notify.tsx
1048
797
  var showInfoNotification = (message) => {
1049
798
  notifications.show({
1050
799
  title: "Info",
@@ -1311,547 +1060,6 @@ function TabSection({ icon, title, description, rightSection, children }) {
1311
1060
  children
1312
1061
  ] });
1313
1062
  }
1314
- function createFeatureAccessHook({
1315
- useInitialization: useInitialization2,
1316
- useOrganization: useOrganization2
1317
- }) {
1318
- return function useFeatureAccess2() {
1319
- const { profile, organizationReady } = useInitialization2();
1320
- const { currentMembership } = useOrganization2();
1321
- const { orgConfig, membershipConfig } = useMemo(() => {
1322
- const organizationConfig = currentMembership?.organization?.config;
1323
- const memberConfig = currentMembership?.config;
1324
- return { orgConfig: organizationConfig, membershipConfig: memberConfig };
1325
- }, [currentMembership]);
1326
- const userConfig = profile?.config;
1327
- const checkFeature = useCallback(
1328
- (featureKey) => {
1329
- if (profile?.is_platform_admin) {
1330
- return { allowed: true, restrictedBy: null };
1331
- }
1332
- const membershipValue = membershipConfig?.features?.[featureKey];
1333
- if (membershipValue === false) return { allowed: false, restrictedBy: "membership" };
1334
- return { allowed: true, restrictedBy: null };
1335
- },
1336
- [profile?.is_platform_admin, membershipConfig]
1337
- );
1338
- const hasFeature = useCallback((featureKey) => checkFeature(featureKey).allowed, [checkFeature]);
1339
- return {
1340
- orgConfig,
1341
- membershipConfig,
1342
- userConfig,
1343
- hasFeature,
1344
- checkFeature,
1345
- isReady: organizationReady
1346
- };
1347
- };
1348
- }
1349
-
1350
- // src/provider/resolvers/RouteResolver.ts
1351
- function normalizeRoutePath(path) {
1352
- const trimmedPath = path.trim();
1353
- if (!trimmedPath || trimmedPath === "/") {
1354
- return "/";
1355
- }
1356
- return trimmedPath.replace(/\/+$/, "") || "/";
1357
- }
1358
- function isRouteMatch(currentPath, route) {
1359
- const normalizedCurrentPath = normalizeRoutePath(currentPath);
1360
- const normalizedRoute = normalizeRoutePath(route);
1361
- return normalizedCurrentPath === normalizedRoute || normalizedCurrentPath.startsWith(`${normalizedRoute}/`);
1362
- }
1363
-
1364
- // src/provider/resolvers/NavResolver.ts
1365
- function uniqueIds(ids) {
1366
- return ids ? [...new Set(ids)] : [];
1367
- }
1368
-
1369
- // src/provider/validateManifests.ts
1370
- function listSystemRefs(systems) {
1371
- const refs = [];
1372
- function walk(map, prefix = "") {
1373
- for (const [key, system] of Object.entries(map)) {
1374
- const path = prefix ? `${prefix}.${key}` : key;
1375
- refs.push(path, system.id);
1376
- const subsystems = system.subsystems;
1377
- if (subsystems) {
1378
- walk(subsystems, path);
1379
- }
1380
- }
1381
- }
1382
- walk(systems);
1383
- return refs;
1384
- }
1385
- function validateManifests(manifests, organizationModel2) {
1386
- if (!organizationModel2) {
1387
- return;
1388
- }
1389
- const validSystemIds = /* @__PURE__ */ new Set([
1390
- ...Object.keys(organizationModel2.systems ?? {}),
1391
- ...listSystemRefs(organizationModel2.systems ?? {})
1392
- ]);
1393
- const errors = [];
1394
- for (const manifest of manifests) {
1395
- const key = manifest.key;
1396
- const systemId = manifest.systemId;
1397
- if (!systemId) {
1398
- continue;
1399
- }
1400
- if (!validSystemIds.has(systemId)) {
1401
- errors.push(
1402
- `Manifest "${key}": systemId "${systemId}" is not a known system id. Valid values: ${[...validSystemIds].sort().join(", ")}`
1403
- );
1404
- }
1405
- }
1406
- if (errors.length > 0) {
1407
- throw new Error(
1408
- `System manifest validation failed with ${errors.length} error(s):
1409
- ` + errors.map((e, i) => ` ${i + 1}. ${e}`).join("\n")
1410
- );
1411
- }
1412
- }
1413
- var ElevasisSystemsContext = createContext(null);
1414
-
1415
- // src/provider/sidebarProjection.ts
1416
- function isLifecycleEnabled(system) {
1417
- if (system.enabled === false) return false;
1418
- return system.lifecycle !== "deprecated" && system.lifecycle !== "archived";
1419
- }
1420
- function isSystemAccessible(systemId, context) {
1421
- const system = context.shellModel.findById(systemId);
1422
- if (!system || !isLifecycleEnabled(system)) return false;
1423
- if (!context.isSystemEnabled(systemId)) return false;
1424
- if (context.shellModel.requiresAdminFor(systemId) && !context.isPlatformAdmin) return false;
1425
- if (context.shellModel.devOnlyFor(systemId) && !context.isDev) return false;
1426
- return true;
1427
- }
1428
- function isSurfaceAccessible(node, context) {
1429
- if (node.devOnly && !context.isDev) return false;
1430
- if (node.requiresAdmin && !context.isPlatformAdmin) return false;
1431
- const systemTargets = node.targets?.systems ?? [];
1432
- if (systemTargets.length === 0) return true;
1433
- return systemTargets.some((systemId) => isSystemAccessible(systemId, context));
1434
- }
1435
- function iconForNode(node, context) {
1436
- if (node.type === "surface") {
1437
- const targetIcon = node.targets?.systems?.map((systemId) => context.shellModel.findById(systemId)?.iconComponent).find(Boolean);
1438
- if (targetIcon) return targetIcon;
1439
- }
1440
- return getSemanticIconComponent(node.icon);
1441
- }
1442
- function activeMatchPathsForSurface(node, context) {
1443
- const targets = node.targets?.systems ?? [];
1444
- if (targets.length !== 1) return void 0;
1445
- const paths = context.shellModel.childrenOf(targets[0]).map((child) => child.path).filter((path) => Boolean(path && path !== node.path));
1446
- return paths.length > 0 ? [...new Set(paths)] : void 0;
1447
- }
1448
- function surfaceToLinkItem(node, context, siblings) {
1449
- if (!isSurfaceAccessible(node, context)) return void 0;
1450
- const siblingShadows = siblings.some((sibling) => sibling !== node && sibling.path.startsWith(`${node.path}/`));
1451
- const activeMatchPaths = activeMatchPathsForSurface(node, context);
1452
- return {
1453
- label: node.label,
1454
- link: node.path,
1455
- ...siblingShadows ? { exact: true } : {},
1456
- ...activeMatchPaths ? { activeMatchPaths } : {}
1457
- };
1458
- }
1459
- function projectNode(node, context) {
1460
- if (node.type === "surface") {
1461
- if (!isSurfaceAccessible(node, context)) return void 0;
1462
- return {
1463
- label: node.label,
1464
- icon: iconForNode(node, context),
1465
- link: node.path
1466
- };
1467
- }
1468
- const childEntries2 = getSortedSidebarEntries(node.children);
1469
- const childSurfaces = childEntries2.map(([, child]) => child).filter((child) => child.type === "surface");
1470
- const links = childEntries2.flatMap(([, child]) => {
1471
- if (child.type === "surface") {
1472
- const link = surfaceToLinkItem(child, context, childSurfaces);
1473
- return link ? [link] : [];
1474
- }
1475
- const nestedGroup = projectNode(child, context);
1476
- return nestedGroup?.link ? [
1477
- {
1478
- label: nestedGroup.label,
1479
- link: nestedGroup.link
1480
- }
1481
- ] : nestedGroup?.links ?? [];
1482
- });
1483
- if (links.length === 0) return void 0;
1484
- return {
1485
- label: node.label,
1486
- icon: iconForNode(node, context),
1487
- links
1488
- };
1489
- }
1490
- function projectSection(section, context) {
1491
- const entries = getSortedSidebarEntries(section);
1492
- return entries.flatMap(([, node]) => {
1493
- const group = projectNode(node, context);
1494
- return group ? [group] : [];
1495
- });
1496
- }
1497
- function projectSidebarLinks({
1498
- shellModel,
1499
- organizationModel: organizationModel2,
1500
- isSystemEnabled,
1501
- isPlatformAdmin = false,
1502
- isDev = false,
1503
- section
1504
- }) {
1505
- const context = {
1506
- shellModel,
1507
- isSystemEnabled,
1508
- isPlatformAdmin,
1509
- isDev
1510
- };
1511
- const sidebar = organizationModel2?.navigation.sidebar;
1512
- if (!sidebar) return [];
1513
- if (section) {
1514
- return projectSection(sidebar[section], context);
1515
- }
1516
- return [...projectSection(sidebar.primary, context), ...projectSection(sidebar.bottom, context)];
1517
- }
1518
- var useFeatureAccess = createFeatureAccessHook({
1519
- useInitialization,
1520
- useOrganization
1521
- });
1522
- function useElevasisSystems() {
1523
- const context = useContext(ElevasisSystemsContext);
1524
- if (!context) {
1525
- throw new Error(
1526
- "useElevasisSystems must be used within an ElevasisSystemsProvider. Wrap your app (or the relevant subtree) with <ElevasisSystemsProvider>."
1527
- );
1528
- }
1529
- return context;
1530
- }
1531
- function useOptionalElevasisSystems() {
1532
- return useContext(ElevasisSystemsContext);
1533
- }
1534
- function defaultSystems(organizationModel2) {
1535
- if (!organizationModel2) return [];
1536
- return listAllSystems(organizationModel2).map(({ path, system }) => ({ ...system, id: path }));
1537
- }
1538
- function systemPath(system) {
1539
- return system.ui?.path ?? system.path ?? defaultPathFor(system.id);
1540
- }
1541
- function systemLabel(system) {
1542
- return system.label ?? system.title ?? system.id;
1543
- }
1544
- function moduleSystemId(module) {
1545
- return module.systemId ?? module.key;
1546
- }
1547
- function isLifecycleEnabled2(system) {
1548
- if (system.enabled === false) return false;
1549
- return system.lifecycle !== "deprecated" && system.lifecycle !== "archived";
1550
- }
1551
- function isOrganizationModelSystemEnabled(organizationModel2, systemId) {
1552
- const system = defaultSystems(organizationModel2).find((candidate) => candidate.id === systemId);
1553
- return system ? isLifecycleEnabled2(system) : void 0;
1554
- }
1555
- function resolveSystemModules(systems, isSystemEnabled) {
1556
- return systems.map((system) => {
1557
- const systemId = system.systemId;
1558
- const accessKey = systemId ?? system.key;
1559
- return {
1560
- ...system,
1561
- systemId,
1562
- access: {
1563
- systemKey: system.key,
1564
- systemId,
1565
- enabled: isSystemEnabled(accessKey)
1566
- },
1567
- semantics: {
1568
- capabilityIds: uniqueIds(system.capabilityIds ?? [])
1569
- }
1570
- };
1571
- });
1572
- }
1573
- function buildShellSystems(organizationModel2, modules) {
1574
- const iconBySystemId = new Map(
1575
- modules.flatMap((module) => module.systemId ? [[moduleSystemId(module), module.icon]] : [])
1576
- );
1577
- return defaultSystems(organizationModel2).map((system) => ({
1578
- ...system,
1579
- label: systemLabel(system),
1580
- path: systemPath(system),
1581
- iconComponent: iconBySystemId.get(system.id)
1582
- }));
1583
- }
1584
- function createShellModel(systems) {
1585
- const systemsRecord = Object.fromEntries(systems.map((s) => [s.id, s]));
1586
- return {
1587
- systems,
1588
- findByPath: (path) => findByPath(systemsRecord, normalizeRoutePath(path)),
1589
- findById: (id) => findById(systemsRecord, id),
1590
- childrenOf: (id) => childrenOf(systemsRecord, id),
1591
- ancestorsOf: (id) => ancestorsOf(systemsRecord, id),
1592
- parentOf: (id) => parentOf(systemsRecord, id),
1593
- topLevel: () => topLevel(systemsRecord),
1594
- requiresAdminFor: (id) => requiresAdminFor(systemsRecord, id),
1595
- devOnlyFor: (id) => devOnlyFor(systemsRecord, id)
1596
- };
1597
- }
1598
- function resolveOrganizationGraphSystem(systems, shellModel) {
1599
- for (const system of systems) {
1600
- const graphBridge = system.organizationGraph;
1601
- if (!graphBridge) continue;
1602
- const systemId = graphBridge.systemId;
1603
- if (!systemId) continue;
1604
- const node = shellModel.findById(systemId);
1605
- return {
1606
- available: Boolean(node),
1607
- systemId,
1608
- systemPath: node ? systemPath(node) : void 0
1609
- };
1610
- }
1611
- return {
1612
- available: false
1613
- };
1614
- }
1615
- function findMatchingNode(shellModel, currentPath) {
1616
- const normalizedPath = normalizeRoutePath(currentPath);
1617
- const exact = shellModel.findByPath(normalizedPath);
1618
- if (exact) return exact;
1619
- return [...shellModel.systems].filter((system) => {
1620
- const path = normalizeRoutePath(systemPath(system));
1621
- return path !== "/" && isRouteMatch(normalizedPath, path);
1622
- }).sort((a, b) => systemPath(b).length - systemPath(a).length)[0];
1623
- }
1624
- function ownsNode(module, node) {
1625
- if (!node || !module.systemId) return false;
1626
- return node.id === module.systemId || node.id.startsWith(`${module.systemId}.`);
1627
- }
1628
- function ownsRoutePrefix(module, normalizedPath) {
1629
- return (module.routePrefixes ?? []).some((prefix) => isRouteMatch(normalizedPath, normalizeRoutePath(prefix)));
1630
- }
1631
- function resolveRoute(systems, shellModel, currentPath, disabledSubsectionPaths) {
1632
- const node = findMatchingNode(shellModel, currentPath);
1633
- const normalizedPath = normalizeRoutePath(currentPath);
1634
- if (disabledSubsectionPaths.some((disabledPath) => isRouteMatch(normalizedPath, disabledPath))) {
1635
- return {
1636
- status: "hidden",
1637
- path: currentPath,
1638
- node
1639
- };
1640
- }
1641
- const system = systems.find((candidate) => ownsNode(candidate, node)) ?? systems.filter((candidate) => ownsRoutePrefix(candidate, normalizedPath)).sort(
1642
- (a, b) => Math.max(...(b.routePrefixes ?? []).map((prefix) => prefix.length)) - Math.max(...(a.routePrefixes ?? []).map((prefix) => prefix.length))
1643
- )[0];
1644
- if (!system) {
1645
- return {
1646
- status: "unmatched",
1647
- path: currentPath,
1648
- node
1649
- };
1650
- }
1651
- return {
1652
- status: "matched",
1653
- path: currentPath,
1654
- system,
1655
- node
1656
- };
1657
- }
1658
- function ElevasisSystemsProvider({
1659
- systems,
1660
- organizationModel: organizationModel2,
1661
- timeRange,
1662
- operationsApiUrl,
1663
- operationsSSEManager,
1664
- deliveryApiUrl,
1665
- deliverySSEManager,
1666
- disabledSubsectionPaths = [],
1667
- children
1668
- }) {
1669
- const activeSystems = systems ?? [];
1670
- const resolvedOrganizationModel = useMemo(() => {
1671
- if (!organizationModel2) {
1672
- return void 0;
1673
- }
1674
- return {
1675
- ...organizationModel2,
1676
- knowledge: organizationModel2.knowledge ?? {}
1677
- };
1678
- }, [organizationModel2]);
1679
- useMemo(() => validateManifests(activeSystems, resolvedOrganizationModel), [activeSystems, resolvedOrganizationModel]);
1680
- const { hasFeature } = useFeatureAccess();
1681
- const hasResolvedSystem = useCallback(
1682
- (key) => {
1683
- if (!hasFeature(key)) {
1684
- return false;
1685
- }
1686
- const organizationModelSystemEnabled = isOrganizationModelSystemEnabled(resolvedOrganizationModel, key);
1687
- return organizationModelSystemEnabled ?? true;
1688
- },
1689
- [hasFeature, resolvedOrganizationModel]
1690
- );
1691
- const shellSystems = useMemo(
1692
- () => buildShellSystems(resolvedOrganizationModel, activeSystems),
1693
- [resolvedOrganizationModel, activeSystems]
1694
- );
1695
- const shellModel = useMemo(() => createShellModel(shellSystems), [shellSystems]);
1696
- const normalizedDisabledSubsectionPaths = useMemo(
1697
- () => [...new Set(disabledSubsectionPaths.map((path) => normalizeRoutePath(path)))],
1698
- [disabledSubsectionPaths]
1699
- );
1700
- const resolvedSystems = useMemo(
1701
- () => resolveSystemModules(activeSystems, hasResolvedSystem),
1702
- [activeSystems, hasResolvedSystem]
1703
- );
1704
- const enabledResolvedSystems = useMemo(
1705
- () => resolvedSystems.filter((system) => system.access.enabled),
1706
- [resolvedSystems]
1707
- );
1708
- const organizationGraph = useMemo(
1709
- () => resolveOrganizationGraphSystem(enabledResolvedSystems, shellModel),
1710
- [enabledResolvedSystems, shellModel]
1711
- );
1712
- const getResolvedSystem = useCallback(
1713
- (key) => resolvedSystems.find((system) => system.key === key),
1714
- [resolvedSystems]
1715
- );
1716
- const isSystemEnabled = useCallback((key) => hasResolvedSystem(key), [hasResolvedSystem]);
1717
- const getSidebarLinks = useCallback(
1718
- (options = {}) => projectSidebarLinks({
1719
- shellModel,
1720
- organizationModel: resolvedOrganizationModel,
1721
- isSystemEnabled,
1722
- ...options
1723
- }),
1724
- [shellModel, resolvedOrganizationModel, isSystemEnabled]
1725
- );
1726
- const resolveRouteByPath = useCallback(
1727
- (path) => resolveRoute(enabledResolvedSystems, shellModel, path, normalizedDisabledSubsectionPaths),
1728
- [enabledResolvedSystems, shellModel, normalizedDisabledSubsectionPaths]
1729
- );
1730
- const shellRuntime = useMemo(
1731
- () => ({
1732
- resolveRoute: resolveRouteByPath
1733
- }),
1734
- [resolveRouteByPath]
1735
- );
1736
- const value = useMemo(
1737
- () => ({
1738
- shellModel,
1739
- shellRuntime,
1740
- getSidebarLinks,
1741
- enabledResolvedSystems,
1742
- resolvedSystems,
1743
- organizationGraph,
1744
- organizationModel: resolvedOrganizationModel,
1745
- timeRange,
1746
- operationsApiUrl,
1747
- operationsSSEManager,
1748
- deliveryApiUrl,
1749
- deliverySSEManager,
1750
- disabledSubsectionPaths: normalizedDisabledSubsectionPaths,
1751
- isSystemEnabled,
1752
- getResolvedSystem
1753
- }),
1754
- [
1755
- shellModel,
1756
- shellRuntime,
1757
- enabledResolvedSystems,
1758
- resolvedSystems,
1759
- organizationGraph,
1760
- resolvedOrganizationModel,
1761
- timeRange,
1762
- operationsApiUrl,
1763
- operationsSSEManager,
1764
- deliveryApiUrl,
1765
- deliverySSEManager,
1766
- normalizedDisabledSubsectionPaths,
1767
- isSystemEnabled,
1768
- getResolvedSystem,
1769
- getSidebarLinks
1770
- ]
1771
- );
1772
- return /* @__PURE__ */ jsx(ElevasisSystemsContext.Provider, { value, children });
1773
- }
1774
-
1775
- // src/components/navigation/useBreadcrumbs.ts
1776
- var useBreadcrumbs = (options = {}) => {
1777
- const { currentPath } = useRouterContext();
1778
- const systemContext = useOptionalElevasisSystems();
1779
- const { labelsByPath = {} } = options;
1780
- return useMemo(() => {
1781
- const shellModel = systemContext?.shellModel;
1782
- const overriddenLabel = labelsByPath[currentPath];
1783
- if (overriddenLabel) {
1784
- return [{ label: overriddenLabel, isActive: true }];
1785
- }
1786
- if (shellModel) {
1787
- const matchedNode = shellModel.findByPath(currentPath);
1788
- if (matchedNode) {
1789
- return shellModel.ancestorsOf(matchedNode.id).map((node, index, items) => ({
1790
- label: labelsByPath[node.path ?? ""] ?? node.label,
1791
- path: index === items.length - 1 ? void 0 : node.path,
1792
- isActive: index === items.length - 1
1793
- }));
1794
- }
1795
- }
1796
- const segments = currentPath.split("/").filter(Boolean);
1797
- if (segments.length === 0) {
1798
- return [{ label: "Dashboard", isActive: true }];
1799
- }
1800
- const breadcrumbs = [{ label: "Dashboard", path: "/" }];
1801
- let currentSegmentPath = "";
1802
- for (let i = 0; i < segments.length; i++) {
1803
- currentSegmentPath += `/${segments[i]}`;
1804
- const isLast = i === segments.length - 1;
1805
- const label = labelsByPath[currentSegmentPath] ?? formatSegmentLabel(segments[i]);
1806
- breadcrumbs.push({
1807
- label,
1808
- path: isLast ? void 0 : currentSegmentPath,
1809
- isActive: isLast
1810
- });
1811
- }
1812
- return breadcrumbs;
1813
- }, [currentPath, systemContext, labelsByPath]);
1814
- };
1815
- function formatSegmentLabel(segment) {
1816
- const decodedSegment = safeDecodeURIComponent(segment);
1817
- const routeLabel = formatRouteIdLabel(decodedSegment);
1818
- if (routeLabel) return routeLabel;
1819
- return titleCaseSegment(decodedSegment);
1820
- }
1821
- function safeDecodeURIComponent(value) {
1822
- try {
1823
- return decodeURIComponent(value);
1824
- } catch {
1825
- return value;
1826
- }
1827
- }
1828
- function formatRouteIdLabel(segment) {
1829
- if (segment.startsWith("group:")) {
1830
- const groupKey = segment.slice("group:".length);
1831
- return groupKey === "graph" ? "Ontology" : titleCaseSegment(groupKey);
1832
- }
1833
- if (segment.startsWith("domain:")) {
1834
- return titleCaseSegment(segment.slice("domain:".length));
1835
- }
1836
- if (segment.startsWith("item:")) {
1837
- const rest = segment.slice("item:".length);
1838
- const separatorIndex = rest.indexOf(":");
1839
- const itemId = separatorIndex === -1 ? rest : rest.slice(separatorIndex + 1);
1840
- return formatOntologyOrIdLabel(itemId);
1841
- }
1842
- if (segment.startsWith("ontology:")) {
1843
- return formatOntologyOrIdLabel(segment);
1844
- }
1845
- return void 0;
1846
- }
1847
- function formatOntologyOrIdLabel(value) {
1848
- const localId = value.includes("/") ? value.slice(value.lastIndexOf("/") + 1) : value;
1849
- const suffix = localId.includes(":") ? localId.slice(localId.lastIndexOf(":") + 1) : localId;
1850
- return titleCaseSegment(suffix);
1851
- }
1852
- function titleCaseSegment(segment) {
1853
- return segment.split("-").flatMap((part) => part.split("_")).flatMap((part) => part.split(".")).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
1854
- }
1855
1063
  var ConfirmationModal = ({
1856
1064
  opened,
1857
1065
  onClose,
@@ -3603,7 +2811,11 @@ function useInFlightExecutions(resourceId, options = {}) {
3603
2811
  const limit = options.limit ?? 20;
3604
2812
  const offset = options.offset ?? 0;
3605
2813
  return useQuery({
3606
- queryKey: options.listId ? [...acquisitionListKeys.executions(workOSOrganizationId, options.listId, { resourceId, limit }), "in-flight"] : [...executionsKeys.executions(workOSOrganizationId, resourceId, "all", limit, offset), "in-flight"],
2814
+ // eslint-disable-next-line @tanstack/query/exhaustive-deps -- resourceId/limit/offset/listId are already folded into the executions key builders; the rule can't trace through them
2815
+ queryKey: options.listId ? [
2816
+ ...acquisitionListKeys.executions(workOSOrganizationId, options.listId, { resourceId, limit }),
2817
+ "in-flight"
2818
+ ] : [...executionsKeys.executions(workOSOrganizationId, resourceId, "all", limit, offset), "in-flight"],
3607
2819
  queryFn: async () => {
3608
2820
  if (options.listId) {
3609
2821
  const executions2 = await apiRequest(
@@ -3718,269 +2930,6 @@ function useWorkflowExecution({ workflowId, listId }) {
3718
2930
  reset: mutation.reset
3719
2931
  };
3720
2932
  }
3721
- var consoleAdapter = {
3722
- success(title, message) {
3723
- console.log(`[Notification][Success] ${title}: ${message}`);
3724
- },
3725
- error(title, message) {
3726
- console.warn(`[Notification][Error] ${title}: ${message}`);
3727
- },
3728
- info(title, message) {
3729
- console.log(`[Notification][Info] ${title}: ${message}`);
3730
- },
3731
- warning(title, message) {
3732
- console.warn(`[Notification][Warning] ${title}: ${message}`);
3733
- },
3734
- apiError(error) {
3735
- const { message, code, requestId, fields, retryAfter } = getErrorInfo(error);
3736
- const title = getErrorTitle(code);
3737
- const formatted = formatErrorMessage(message, requestId, fields, retryAfter);
3738
- console.warn(`[Notification][API Error] ${title}: ${formatted}`);
3739
- }
3740
- };
3741
- var NotificationContext = createContext(consoleAdapter);
3742
- function NotificationProvider({ adapter, children }) {
3743
- return /* @__PURE__ */ jsx(NotificationContext.Provider, { value: adapter, children });
3744
- }
3745
- function useNotificationAdapter() {
3746
- return useContext(NotificationContext);
3747
- }
3748
- var CrmActionsContext = createContext([]);
3749
- function CrmActionsProvider({ actions, children }) {
3750
- return /* @__PURE__ */ jsx(CrmActionsContext.Provider, { value: actions, children });
3751
- }
3752
- function useCrmActions() {
3753
- return useContext(CrmActionsContext);
3754
- }
3755
- var EMPTY_LIST_ACTIONS = Object.freeze([]);
3756
- var ListActionsContext = createContext(EMPTY_LIST_ACTIONS);
3757
- function ListActionsProvider({
3758
- registry = EMPTY_LIST_ACTIONS,
3759
- children
3760
- }) {
3761
- return /* @__PURE__ */ jsx(ListActionsContext.Provider, { value: registry, children });
3762
- }
3763
- function useListActions() {
3764
- return useContext(ListActionsContext);
3765
- }
3766
- function findListActionByAction(registry, actionKey) {
3767
- return registry.find((action) => action.actionKey === actionKey);
3768
- }
3769
- function getListActionWorkflowId(action) {
3770
- return action.workflowId ?? action.resourceId;
3771
- }
3772
- var LazyCoreAuthKitInner = lazy(() => import('./CoreAuthKitInner-QC62UHTZ.js').then((m) => ({ default: m.CoreAuthKitInner })));
3773
- var defaultQueryClient = null;
3774
- function getDefaultQueryClient() {
3775
- if (!defaultQueryClient) {
3776
- defaultQueryClient = new QueryClient({
3777
- defaultOptions: { queries: { retry: 1 } }
3778
- });
3779
- }
3780
- return defaultQueryClient;
3781
- }
3782
- var consoleNotificationAdapter = {
3783
- success(title, message) {
3784
- console.log(`[Notification][Success] ${title}: ${message}`);
3785
- },
3786
- error(title, message) {
3787
- console.warn(`[Notification][Error] ${title}: ${message}`);
3788
- },
3789
- info(title, message) {
3790
- console.log(`[Notification][Info] ${title}: ${message}`);
3791
- },
3792
- warning(title, message) {
3793
- console.warn(`[Notification][Warning] ${title}: ${message}`);
3794
- },
3795
- apiError(error) {
3796
- console.warn(`[Notification][API Error]`, error);
3797
- }
3798
- };
3799
- function ElevasisCoreProvider({
3800
- auth,
3801
- queryClient,
3802
- apiUrl,
3803
- onError,
3804
- notifications: notifications17,
3805
- crmActions,
3806
- listActions,
3807
- children
3808
- }) {
3809
- if (auth.mode === "apiKey") {
3810
- throw new Error(
3811
- `ElevasisCoreProvider: auth mode 'apiKey' is not yet implemented. Only 'authkit' mode is supported.`
3812
- );
3813
- }
3814
- const resolvedQueryClient = queryClient ?? getDefaultQueryClient();
3815
- const resolvedCrmActions = crmActions ?? [];
3816
- const resolvedListActions = listActions ?? EMPTY_LIST_ACTIONS;
3817
- const content = apiUrl ? /* @__PURE__ */ jsx(ServiceStack, { apiUrl, onError, notifications: notifications17, children }) : children;
3818
- const AuthInner = /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(LazyCoreAuthKitInner, { auth, children: content }) });
3819
- return /* @__PURE__ */ jsx(QueryClientProvider, { client: resolvedQueryClient, children: /* @__PURE__ */ jsx(CrmActionsProvider, { actions: resolvedCrmActions, children: /* @__PURE__ */ jsx(ListActionsProvider, { registry: resolvedListActions, children: AuthInner }) }) });
3820
- }
3821
- function ServiceStack({
3822
- apiUrl,
3823
- onError,
3824
- notifications: notifications17,
3825
- children
3826
- }) {
3827
- const { getAccessToken } = useAuthContext();
3828
- const orgIdRef = useRef(null);
3829
- const getOrganizationId = useRef(() => orgIdRef.current).current;
3830
- return /* @__PURE__ */ jsx(
3831
- ApiClientProvider,
3832
- {
3833
- getAccessToken,
3834
- getOrganizationId,
3835
- isOrganizationReady: false,
3836
- onError,
3837
- children: /* @__PURE__ */ jsx(ServiceStackInner, { apiUrl, orgIdRef, notifications: notifications17, children })
3838
- }
3839
- );
3840
- }
3841
- function ServiceStackInner({
3842
- apiUrl,
3843
- orgIdRef,
3844
- notifications: notifications17,
3845
- children
3846
- }) {
3847
- const { apiRequest } = useApiClient(apiUrl);
3848
- const resolvedNotifications = notifications17 ?? consoleNotificationAdapter;
3849
- return /* @__PURE__ */ jsx(ProfileProvider, { apiRequest, children: /* @__PURE__ */ jsx(OrganizationProvider, { apiRequest, children: /* @__PURE__ */ jsx(OrgServiceBridge, { orgIdRef, apiRequest, notifications: resolvedNotifications, children }) }) });
3850
- }
3851
- function OrgServiceBridge({
3852
- orgIdRef,
3853
- apiRequest,
3854
- notifications: notifications17,
3855
- children
3856
- }) {
3857
- const { currentWorkOSOrganizationId, isInitializing, isOrgRefreshing } = useOrganization();
3858
- orgIdRef.current = currentWorkOSOrganizationId;
3859
- const isReady = !!currentWorkOSOrganizationId && !isInitializing && !isOrgRefreshing;
3860
- return /* @__PURE__ */ jsx(
3861
- ElevasisServiceProvider,
3862
- {
3863
- apiRequest,
3864
- workOSOrganizationId: currentWorkOSOrganizationId,
3865
- isReady,
3866
- children: /* @__PURE__ */ jsx(NotificationProvider, { adapter: notifications17, children: /* @__PURE__ */ jsx(InitializationProvider, { children }) })
3867
- }
3868
- );
3869
- }
3870
- var EMPTY_CANONICAL_MODEL = resolveOrganizationModel(void 0, { mergeDefaults: false });
3871
- function useResolvedOrganizationModel() {
3872
- const { organizationModel: organizationModel2 } = useElevasisSystems();
3873
- return useMemo(() => organizationModel2 ?? EMPTY_CANONICAL_MODEL, [organizationModel2]);
3874
- }
3875
- var defaultSystemSidebarWidth = 250;
3876
- function SystemShell({ children }) {
3877
- const { shellRuntime } = useElevasisSystems();
3878
- const { currentPath } = useRouterContext();
3879
- const routeMatch = shellRuntime.resolveRoute(currentPath);
3880
- if (routeMatch.status === "hidden") {
3881
- return /* @__PURE__ */ jsx(FeatureUnavailableState, { path: currentPath });
3882
- }
3883
- if (routeMatch.status !== "matched" || !routeMatch.system?.sidebar) {
3884
- return /* @__PURE__ */ jsx(Fragment, { children });
3885
- }
3886
- const SidebarComponent = routeMatch.system.sidebar;
3887
- const sidebarWidth = typeof routeMatch.system.sidebarWidth === "function" ? routeMatch.system.sidebarWidth({ currentPath }) : routeMatch.system.sidebarWidth ?? defaultSystemSidebarWidth;
3888
- if (sidebarWidth === 0) {
3889
- return /* @__PURE__ */ jsx(Fragment, { children });
3890
- }
3891
- return /* @__PURE__ */ jsxs(SubshellContainer, { children: [
3892
- /* @__PURE__ */ jsx(SubshellSidebar, { width: sidebarWidth, children: /* @__PURE__ */ jsx(SidebarComponent, {}) }),
3893
- /* @__PURE__ */ jsx(SubshellRightSideContainer, { children })
3894
- ] });
3895
- }
3896
- var mantineAdapter = {
3897
- success(title, message) {
3898
- notifications.show({ title, message, autoClose: 5e3, color: "green", position: "top-right" });
3899
- },
3900
- error(title, message) {
3901
- notifications.show({ title, message, autoClose: 5e3, color: "red", position: "top-right" });
3902
- },
3903
- info(title, message) {
3904
- notifications.show({ title, message, autoClose: 5e3, color: "blue", position: "top-right" });
3905
- },
3906
- warning(title, message) {
3907
- notifications.show({ title, message, autoClose: 5e3, color: "orange", position: "top-right" });
3908
- },
3909
- apiError(error) {
3910
- const { message, code, requestId, fields, retryAfter } = getErrorInfo(error);
3911
- const hasFields = fields && Object.keys(fields).length > 0;
3912
- notifications.show({
3913
- title: getErrorTitle(code),
3914
- message: formatErrorMessage(message, requestId, fields, retryAfter),
3915
- autoClose: retryAfter ? retryAfter * 1e3 : hasFields ? 8e3 : 5e3,
3916
- color: "red",
3917
- position: "top-right"
3918
- });
3919
- }
3920
- };
3921
- function ElevasisUIProvider({ theme, children, ...coreProps }) {
3922
- const resolvedColorScheme = theme?.colorScheme ?? "dark";
3923
- const activePresets = theme?.presets ?? PRESETS;
3924
- const preset = useMemo(() => getPreset(theme?.preset ?? "default", theme?.presets), [theme?.preset, theme?.presets]);
3925
- const resolvedAppearance = {
3926
- background: theme?.background ?? preset.background ?? /* @__PURE__ */ jsx(AppBackground, {}),
3927
- loader: theme?.loader ?? preset.loader ?? /* @__PURE__ */ jsx(Loader, { size: "xl", loaders: { elevasis: ElevasisLoader }, type: "elevasis" })
3928
- };
3929
- useEffect(() => {
3930
- if (!preset.fontImports?.length) return;
3931
- const links = [];
3932
- for (const href of preset.fontImports) {
3933
- if (document.querySelector(`link[href="${href}"]`)) continue;
3934
- const link = document.createElement("link");
3935
- link.rel = "stylesheet";
3936
- link.href = href;
3937
- document.head.appendChild(link);
3938
- links.push(link);
3939
- }
3940
- const subtitleFont = preset.subtitleFontFamily ?? preset.framework?.headings?.fontFamily ?? preset.framework?.fontFamily ?? "";
3941
- document.documentElement.style.setProperty("--elevasis-font-family-subtitle", subtitleFont);
3942
- return () => {
3943
- links.forEach((l) => l.remove());
3944
- document.documentElement.style.removeProperty("--elevasis-font-family-subtitle");
3945
- };
3946
- }, [
3947
- preset.fontImports,
3948
- preset.subtitleFontFamily,
3949
- preset.framework?.headings?.fontFamily,
3950
- preset.framework?.fontFamily
3951
- ]);
3952
- const resolvedTheme = useMemo(() => {
3953
- const primaryHex = theme?.tokens?.primary ?? preset.dark.primary;
3954
- const primaryOverride = {
3955
- primaryColor: "primary",
3956
- colors: { primary: generateShades(primaryHex) }
3957
- };
3958
- let base = mergeThemeOverrides(mantineThemeOverride, primaryOverride);
3959
- if (preset.framework) base = mergeThemeOverrides(base, preset.framework);
3960
- return theme?.mantine ? mergeThemeOverrides(base, theme.mantine) : base;
3961
- }, [theme?.mantine, preset, theme?.tokens?.primary]);
3962
- const cssVariablesResolver = useMemo(
3963
- () => createCssVariablesResolver(theme?.tokens, theme?.preset, theme?.presets),
3964
- [theme?.tokens, theme?.preset, theme?.presets]
3965
- );
3966
- return /* @__PURE__ */ jsx(
3967
- MantineProvider,
3968
- {
3969
- theme: resolvedTheme,
3970
- defaultColorScheme: resolvedColorScheme,
3971
- cssVariablesResolver,
3972
- children: /* @__PURE__ */ jsx(PresetsProvider, { value: activePresets, children: /* @__PURE__ */ jsx(AppearanceProvider, { value: resolvedAppearance, children: /* @__PURE__ */ jsx(ElevasisCoreProvider, { notifications: mantineAdapter, ...coreProps, children }) }) })
3973
- }
3974
- );
3975
- }
3976
- function createTestSystemsProvider({
3977
- organizationModel: organizationModel2,
3978
- systems = []
3979
- } = {}) {
3980
- return function TestSystemsProvider({ children }) {
3981
- return /* @__PURE__ */ jsx(ElevasisSystemsProvider, { systems, organizationModel: organizationModel2, children });
3982
- };
3983
- }
3984
2933
  function useSSEConnection({
3985
2934
  manager,
3986
2935
  connectionKey,
@@ -5109,7 +4058,7 @@ function buildResourceSetKey(directResources, descendantResources) {
5109
4058
  ].sort().join(",");
5110
4059
  }
5111
4060
  function useSystemHealth({
5112
- systemPath: systemPath2,
4061
+ systemPath,
5113
4062
  timeRange,
5114
4063
  includeDescendants = true,
5115
4064
  directResources,
@@ -5126,7 +4075,7 @@ function useSystemHealth({
5126
4075
  return useQuery({
5127
4076
  queryKey: observabilityKeys.systemHealth(
5128
4077
  workOSOrganizationId,
5129
- systemPath2,
4078
+ systemPath,
5130
4079
  timeRange,
5131
4080
  includeDescendants,
5132
4081
  includeDescendants ? "descendants" : "direct",
@@ -5140,7 +4089,7 @@ function useSystemHealth({
5140
4089
  return apiRequest("/observability/system-health", {
5141
4090
  method: "POST",
5142
4091
  body: JSON.stringify({
5143
- systemPath: systemPath2,
4092
+ systemPath,
5144
4093
  includeDescendants,
5145
4094
  startDate,
5146
4095
  endDate,
@@ -6805,10 +5754,10 @@ function useDeleteCompanies() {
6805
5754
  const queryClient = useQueryClient();
6806
5755
  return useMutation({
6807
5756
  mutationFn: async (companyIds) => {
6808
- const uniqueIds2 = [...new Set(companyIds)].filter(Boolean);
6809
- if (uniqueIds2.length === 0) return;
5757
+ const uniqueIds = [...new Set(companyIds)].filter(Boolean);
5758
+ if (uniqueIds.length === 0) return;
6810
5759
  await Promise.all(
6811
- uniqueIds2.map(
5760
+ uniqueIds.map(
6812
5761
  (companyId) => apiRequest(`/acquisition/companies/${companyId}`, {
6813
5762
  method: "DELETE"
6814
5763
  })
@@ -6956,10 +5905,10 @@ function useDeleteContacts() {
6956
5905
  const queryClient = useQueryClient();
6957
5906
  return useMutation({
6958
5907
  mutationFn: async (contactIds) => {
6959
- const uniqueIds2 = [...new Set(contactIds)].filter(Boolean);
6960
- if (uniqueIds2.length === 0) return;
5908
+ const uniqueIds = [...new Set(contactIds)].filter(Boolean);
5909
+ if (uniqueIds.length === 0) return;
6961
5910
  await Promise.all(
6962
- uniqueIds2.map(
5911
+ uniqueIds.map(
6963
5912
  (contactId) => apiRequest(`/acquisition/contacts/${contactId}`, {
6964
5913
  method: "DELETE"
6965
5914
  })
@@ -7666,32 +6615,6 @@ function useUserMemberships(userId, params) {
7666
6615
  gcTime: GC_TIME_MEDIUM
7667
6616
  });
7668
6617
  }
7669
- function useUpdateMemberConfig() {
7670
- const { apiRequest } = useElevasisServices();
7671
- const adapter = useNotificationAdapter();
7672
- const queryClient = useQueryClient();
7673
- const { retry: refreshOrganizations } = useOrganization();
7674
- return useMutation({
7675
- mutationFn: async ({ membershipId, config }) => {
7676
- return apiRequest(`/memberships/${membershipId}/config`, {
7677
- method: "PATCH",
7678
- body: JSON.stringify({ config })
7679
- });
7680
- },
7681
- onSuccess: async () => {
7682
- queryClient.invalidateQueries({ queryKey: ["memberships"] });
7683
- await refreshOrganizations();
7684
- notifications.show({
7685
- title: "Success",
7686
- message: "Member config updated",
7687
- color: "teal"
7688
- });
7689
- },
7690
- onError: (error) => {
7691
- adapter.apiError(error);
7692
- }
7693
- });
7694
- }
7695
6618
  function useDeactivateMembership() {
7696
6619
  const { apiRequest } = useElevasisServices();
7697
6620
  const adapter = useNotificationAdapter();
@@ -8611,18 +7534,18 @@ function NotificationItem({ notification, onClose, onNavigate }) {
8611
7534
  }
8612
7535
  );
8613
7536
  }
8614
- function NotificationList({ notifications: notifications17, isLoading, onClose, onNavigate }) {
7537
+ function NotificationList({ notifications: notifications15, isLoading, onClose, onNavigate }) {
8615
7538
  if (isLoading) {
8616
7539
  return /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, { size: "sm" }) });
8617
7540
  }
8618
- if (notifications17.length === 0) {
7541
+ if (notifications15.length === 0) {
8619
7542
  return /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "No notifications" }) });
8620
7543
  }
8621
- return /* @__PURE__ */ jsx(Stack, { gap: 0, children: notifications17.map((notification) => /* @__PURE__ */ jsx(NotificationItem, { notification, onClose, onNavigate }, notification.id)) });
7544
+ return /* @__PURE__ */ jsx(Stack, { gap: 0, children: notifications15.map((notification) => /* @__PURE__ */ jsx(NotificationItem, { notification, onClose, onNavigate }, notification.id)) });
8622
7545
  }
8623
- function NotificationPanel({ notifications: notifications17, isLoading, onClose, onNavigate }) {
7546
+ function NotificationPanel({ notifications: notifications15, isLoading, onClose, onNavigate }) {
8624
7547
  const markAllAsRead = useMarkAllAsRead();
8625
- const hasUnread = notifications17.some((n) => !n.read);
7548
+ const hasUnread = notifications15.some((n) => !n.read);
8626
7549
  const handleMarkAllAsRead = async () => {
8627
7550
  await markAllAsRead.mutateAsync();
8628
7551
  };
@@ -8635,7 +7558,7 @@ function NotificationPanel({ notifications: notifications17, isLoading, onClose,
8635
7558
  /* @__PURE__ */ jsx(ScrollArea, { h: 400, type: "auto", children: /* @__PURE__ */ jsx(
8636
7559
  NotificationList,
8637
7560
  {
8638
- notifications: notifications17,
7561
+ notifications: notifications15,
8639
7562
  isLoading,
8640
7563
  onClose,
8641
7564
  onNavigate
@@ -8656,14 +7579,14 @@ function NotificationBell({ unreadCount, onNavigate }) {
8656
7579
  staleTime: 3e4
8657
7580
  });
8658
7581
  const { data, isLoading } = useNotifications({ limit: 20 });
8659
- const notifications17 = data?.notifications ?? [];
7582
+ const notifications15 = data?.notifications ?? [];
8660
7583
  const count = unreadCount ?? apiCount;
8661
7584
  return /* @__PURE__ */ jsxs(Popover, { opened, onChange: toggle, position: "bottom-end", width: 400, children: [
8662
7585
  /* @__PURE__ */ jsx(Tooltip, { label: "Notifications", disabled: opened, children: /* @__PURE__ */ jsx(Popover.Target, { children: /* @__PURE__ */ jsx(Indicator, { label: count > 99 ? "99+" : count, disabled: count === 0, size: 16, offset: 4, children: /* @__PURE__ */ jsx(ActionIcon, { variant: "subtle", size: "lg", onClick: toggle, children: /* @__PURE__ */ jsx(IconBell, { size: 20, color: "var(--color-text-subtle)" }) }) }) }) }),
8663
7586
  /* @__PURE__ */ jsx(Popover.Dropdown, { p: 0, children: /* @__PURE__ */ jsx(
8664
7587
  NotificationPanel,
8665
7588
  {
8666
- notifications: notifications17,
7589
+ notifications: notifications15,
8667
7590
  isLoading,
8668
7591
  onClose: close,
8669
7592
  onNavigate
@@ -12172,46 +11095,6 @@ function DeploymentSettings() {
12172
11095
  /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(DeploymentList, { deployments, isLoading }) })
12173
11096
  ] });
12174
11097
  }
12175
- var FEATURES = [
12176
- { key: "crm", label: "CRM" },
12177
- { key: "lead-gen", label: "Lead Gen" },
12178
- { key: "projects", label: "Projects" },
12179
- { key: "seo", label: "SEO" }
12180
- ];
12181
- function MembershipFeaturePanel({
12182
- currentConfig,
12183
- onConfigChange,
12184
- disabled = false
12185
- }) {
12186
- const handleFeatureToggle = (featureKey, enabled) => {
12187
- const newConfig = {
12188
- ...currentConfig,
12189
- features: {
12190
- ...currentConfig?.features,
12191
- [featureKey]: enabled
12192
- }
12193
- };
12194
- onConfigChange(newConfig);
12195
- };
12196
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
12197
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "Toggle features this member can access." }),
12198
- FEATURES.map(({ key, label }) => {
12199
- const isEnabled = currentConfig?.features?.[key] !== false;
12200
- return /* @__PURE__ */ jsxs(Group, { justify: "space-between", wrap: "nowrap", children: [
12201
- /* @__PURE__ */ jsx(Text, { size: "sm", children: label }),
12202
- /* @__PURE__ */ jsx(
12203
- Switch,
12204
- {
12205
- checked: isEnabled,
12206
- onChange: (e) => handleFeatureToggle(key, e.currentTarget.checked),
12207
- disabled,
12208
- size: "md"
12209
- }
12210
- )
12211
- ] }, key);
12212
- })
12213
- ] }) });
12214
- }
12215
11098
  function MembershipStatusBadge({ status, size = "sm", variant = "light" }) {
12216
11099
  const getStatusLabel = (status2) => {
12217
11100
  switch (status2) {
@@ -15141,423 +14024,6 @@ function SessionMemory({ memory }) {
15141
14024
  ] })
15142
14025
  ] });
15143
14026
  }
15144
- var tokens = {
15145
- cardBg: "rgba(16, 16, 20, 0.92)",
15146
- cardBorder: "rgba(255, 255, 255, 0.06)",
15147
- accentRed: "#ff5555",
15148
- accentRedDim: "rgba(255, 85, 85, 0.15)",
15149
- textPrimary: "#e8e8e8",
15150
- textSecondary: "rgba(255, 255, 255, 0.5)",
15151
- textTertiary: "rgba(255, 255, 255, 0.3)",
15152
- codeBg: "rgba(0, 0, 0, 0.35)",
15153
- codeBorder: "rgba(255, 255, 255, 0.05)",
15154
- fileHighlight: "#7dd3fc",
15155
- separator: "rgba(255, 255, 255, 0.06)",
15156
- mono: "'JetBrains Mono', 'Fira Code', 'Cascadia Code', ui-monospace, monospace",
15157
- sans: "'Inter', -apple-system, system-ui, sans-serif"
15158
- };
15159
- function parseStackFrames(stack) {
15160
- return stack.split("\n").filter((line) => line.trim().startsWith("at ")).map((line) => {
15161
- const trimmed = line.trim();
15162
- const parenMatch = trimmed.match(/^at\s+(.+?)\s+\((.+)\)$/);
15163
- if (parenMatch) {
15164
- return { fn: parenMatch[1], file: parenMatch[2], raw: trimmed };
15165
- }
15166
- const simpleMatch = trimmed.match(/^at\s+(.+)$/);
15167
- if (simpleMatch) {
15168
- return { fn: "", file: simpleMatch[1], raw: trimmed };
15169
- }
15170
- return { fn: "", file: "", raw: trimmed };
15171
- });
15172
- }
15173
- var COMPONENT_NOISE = /* @__PURE__ */ new Set([
15174
- "div",
15175
- "main",
15176
- "span",
15177
- "section",
15178
- "Lazy",
15179
- "Suspense",
15180
- "SafeFragment",
15181
- "MatchImpl",
15182
- "MatchInnerImpl",
15183
- "OutletImpl",
15184
- "CatchBoundaryImpl",
15185
- "CatchBoundary",
15186
- "MatchesInner",
15187
- "Matches",
15188
- "SplitComponent"
15189
- ]);
15190
- function isNoiseComponent(name) {
15191
- if (COMPONENT_NOISE.has(name)) return true;
15192
- if (name.startsWith("@mantine/") || name.startsWith("@tanstack/")) return true;
15193
- return false;
15194
- }
15195
- function parseComponentStack(stack) {
15196
- return stack.trim().split("\n").map((line) => line.trim()).filter((line) => line.startsWith("at ")).map((line) => {
15197
- const match = line.match(/^at\s+(\S+)/);
15198
- return match ? match[1] : line.replace(/^at\s+/, "");
15199
- }).filter((name) => !isNoiseComponent(name));
15200
- }
15201
- function SectionLabel({ children }) {
15202
- return /* @__PURE__ */ jsx(
15203
- "div",
15204
- {
15205
- style: {
15206
- fontSize: 10,
15207
- fontFamily: tokens.sans,
15208
- fontWeight: 600,
15209
- textTransform: "uppercase",
15210
- letterSpacing: "0.08em",
15211
- color: tokens.textTertiary,
15212
- marginBottom: 6
15213
- },
15214
- children
15215
- }
15216
- );
15217
- }
15218
- function CodeBlock({ children, style }) {
15219
- return /* @__PURE__ */ jsx(
15220
- "div",
15221
- {
15222
- style: {
15223
- background: tokens.codeBg,
15224
- border: `1px solid ${tokens.codeBorder}`,
15225
- borderRadius: 6,
15226
- padding: "10px 14px",
15227
- fontFamily: tokens.mono,
15228
- fontSize: 12,
15229
- lineHeight: 1.6,
15230
- color: tokens.textPrimary,
15231
- overflowX: "auto",
15232
- ...style
15233
- },
15234
- children
15235
- }
15236
- );
15237
- }
15238
- function StackFrameRow({ frame }) {
15239
- return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: 8, alignItems: "baseline" }, children: [
15240
- frame.fn && /* @__PURE__ */ jsx("span", { style: { color: tokens.textPrimary, flexShrink: 0 }, children: frame.fn }),
15241
- /* @__PURE__ */ jsx("span", { style: { color: tokens.fileHighlight, opacity: 0.7, fontSize: 11 }, children: frame.file })
15242
- ] });
15243
- }
15244
- function Separator() {
15245
- return /* @__PURE__ */ jsx("div", { style: { height: 1, background: tokens.separator, margin: "4px 0" } });
15246
- }
15247
- function ErrorReportCard({
15248
- errorName,
15249
- errorMessage,
15250
- errorStack,
15251
- componentStack,
15252
- eventId,
15253
- url,
15254
- timestamp,
15255
- reportText,
15256
- appVersion
15257
- }) {
15258
- const [expanded, setExpanded] = useState(true);
15259
- const frames = errorStack ? parseStackFrames(errorStack) : [];
15260
- const components = componentStack ? parseComponentStack(componentStack) : [];
15261
- return /* @__PURE__ */ jsxs(
15262
- "div",
15263
- {
15264
- style: {
15265
- background: tokens.cardBg,
15266
- border: `1px solid ${tokens.cardBorder}`,
15267
- borderTop: `3px solid ${tokens.accentRed}`,
15268
- borderRadius: 10,
15269
- maxWidth: 720,
15270
- width: "100%",
15271
- fontFamily: tokens.sans,
15272
- backdropFilter: "blur(20px)",
15273
- boxShadow: "0 25px 60px rgba(0, 0, 0, 0.5), 0 0 40px rgba(255, 85, 85, 0.05)"
15274
- },
15275
- children: [
15276
- /* @__PURE__ */ jsxs("div", { style: { padding: "20px 24px 0" }, children: [
15277
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 12 }, children: [
15278
- /* @__PURE__ */ jsx("div", { style: { display: "flex", alignItems: "center", gap: 10 }, children: /* @__PURE__ */ jsx(
15279
- "span",
15280
- {
15281
- style: {
15282
- background: tokens.accentRedDim,
15283
- color: tokens.accentRed,
15284
- fontSize: 12,
15285
- fontWeight: 600,
15286
- fontFamily: tokens.mono,
15287
- padding: "3px 10px",
15288
- borderRadius: 4,
15289
- letterSpacing: "0.02em"
15290
- },
15291
- children: errorName
15292
- }
15293
- ) }),
15294
- /* @__PURE__ */ jsx(CopyButton, { value: reportText, timeout: 2e3, children: ({ copied, copy }) => /* @__PURE__ */ jsx(Tooltip, { label: copied ? "Copied!" : "Copy error report", position: "left", children: /* @__PURE__ */ jsxs(
15295
- "button",
15296
- {
15297
- onClick: copy,
15298
- style: {
15299
- background: copied ? "rgba(45, 212, 191, 0.15)" : "rgba(255, 255, 255, 0.06)",
15300
- border: `1px solid ${copied ? "rgba(45, 212, 191, 0.3)" : "rgba(255, 255, 255, 0.08)"}`,
15301
- borderRadius: 6,
15302
- padding: "5px 12px",
15303
- color: copied ? "#2dd4bf" : tokens.textSecondary,
15304
- cursor: "pointer",
15305
- display: "flex",
15306
- alignItems: "center",
15307
- gap: 6,
15308
- fontSize: 12,
15309
- fontFamily: tokens.sans,
15310
- transition: "all 0.15s ease"
15311
- },
15312
- children: [
15313
- copied ? /* @__PURE__ */ jsx(IconCheck, { size: 13 }) : /* @__PURE__ */ jsx(IconCopy, { size: 13 }),
15314
- copied ? "Copied" : "Copy"
15315
- ]
15316
- }
15317
- ) }) })
15318
- ] }),
15319
- /* @__PURE__ */ jsx(
15320
- "div",
15321
- {
15322
- style: {
15323
- fontSize: 16,
15324
- fontWeight: 500,
15325
- color: tokens.textPrimary,
15326
- lineHeight: 1.5,
15327
- marginBottom: 16
15328
- },
15329
- children: errorMessage
15330
- }
15331
- ),
15332
- /* @__PURE__ */ jsxs(
15333
- "div",
15334
- {
15335
- style: {
15336
- background: tokens.codeBg,
15337
- border: `1px solid ${tokens.codeBorder}`,
15338
- borderRadius: 6,
15339
- padding: "8px 12px",
15340
- fontFamily: tokens.mono,
15341
- fontSize: 12,
15342
- color: tokens.fileHighlight,
15343
- marginBottom: 16,
15344
- display: "flex",
15345
- alignItems: "center",
15346
- gap: 8
15347
- },
15348
- children: [
15349
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary, fontSize: 10, flexShrink: 0 }, children: "URL" }),
15350
- /* @__PURE__ */ jsx("span", { style: { opacity: 0.8 }, children: url })
15351
- ]
15352
- }
15353
- )
15354
- ] }),
15355
- /* @__PURE__ */ jsx("div", { style: { padding: "0 24px" }, children: /* @__PURE__ */ jsxs(
15356
- "button",
15357
- {
15358
- onClick: () => setExpanded((v) => !v),
15359
- style: {
15360
- background: "none",
15361
- border: "none",
15362
- color: tokens.textTertiary,
15363
- fontSize: 11,
15364
- fontFamily: tokens.sans,
15365
- cursor: "pointer",
15366
- padding: "4px 0",
15367
- display: "flex",
15368
- alignItems: "center",
15369
- gap: 4,
15370
- letterSpacing: "0.05em",
15371
- textTransform: "uppercase",
15372
- fontWeight: 600
15373
- },
15374
- children: [
15375
- expanded ? "- Hide" : "+ Show",
15376
- " details"
15377
- ]
15378
- }
15379
- ) }),
15380
- expanded && /* @__PURE__ */ jsxs("div", { style: { padding: "8px 24px 20px" }, children: [
15381
- frames.length > 0 && /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
15382
- /* @__PURE__ */ jsx(SectionLabel, { children: "Stack Trace" }),
15383
- /* @__PURE__ */ jsx(CodeBlock, { style: { maxHeight: 220, overflowY: "auto" }, children: frames.map((frame, i) => /* @__PURE__ */ jsx(StackFrameRow, { frame }, i)) })
15384
- ] }),
15385
- components.length > 0 && /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
15386
- /* @__PURE__ */ jsx(SectionLabel, { children: "Component Tree" }),
15387
- /* @__PURE__ */ jsx(CodeBlock, { style: { maxHeight: 120, overflowY: "auto" }, children: /* @__PURE__ */ jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: "2px 0", alignItems: "center" }, children: components.map((name, i) => /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center" }, children: [
15388
- /* @__PURE__ */ jsx(
15389
- "span",
15390
- {
15391
- style: {
15392
- color: i === 0 ? tokens.accentRed : tokens.textPrimary,
15393
- fontWeight: i === 0 ? 600 : 400
15394
- },
15395
- children: name
15396
- }
15397
- ),
15398
- i < components.length - 1 && /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary, margin: "0 6px", fontSize: 10 }, children: "\u203A" })
15399
- ] }, i)) }) })
15400
- ] }),
15401
- /* @__PURE__ */ jsx(Separator, {}),
15402
- /* @__PURE__ */ jsxs(
15403
- "div",
15404
- {
15405
- style: {
15406
- display: "grid",
15407
- gridTemplateColumns: "auto 1fr",
15408
- gap: "4px 16px",
15409
- fontSize: 11,
15410
- fontFamily: tokens.mono,
15411
- paddingTop: 12
15412
- },
15413
- children: [
15414
- appVersion && /* @__PURE__ */ jsxs(Fragment, { children: [
15415
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary }, children: "version" }),
15416
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textSecondary }, children: appVersion })
15417
- ] }),
15418
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary }, children: "timestamp" }),
15419
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textSecondary }, children: timestamp }),
15420
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary }, children: "viewport" }),
15421
- /* @__PURE__ */ jsxs("span", { style: { color: tokens.textSecondary }, children: [
15422
- window.innerWidth,
15423
- "x",
15424
- window.innerHeight
15425
- ] }),
15426
- eventId && /* @__PURE__ */ jsxs(Fragment, { children: [
15427
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textTertiary }, children: "sentry" }),
15428
- /* @__PURE__ */ jsx("span", { style: { color: tokens.textSecondary }, children: eventId })
15429
- ] })
15430
- ]
15431
- }
15432
- )
15433
- ] }),
15434
- /* @__PURE__ */ jsx(
15435
- "div",
15436
- {
15437
- style: {
15438
- borderTop: `1px solid ${tokens.separator}`,
15439
- padding: "12px 24px",
15440
- display: "flex",
15441
- justifyContent: "center"
15442
- },
15443
- children: /* @__PURE__ */ jsx(
15444
- "button",
15445
- {
15446
- onClick: () => window.location.reload(),
15447
- style: {
15448
- background: "none",
15449
- border: "none",
15450
- color: tokens.textTertiary,
15451
- fontSize: 12,
15452
- fontFamily: tokens.sans,
15453
- cursor: "pointer",
15454
- padding: "2px 8px",
15455
- textDecoration: "underline",
15456
- textUnderlineOffset: 3
15457
- },
15458
- children: "Reload page"
15459
- }
15460
- )
15461
- }
15462
- )
15463
- ]
15464
- }
15465
- );
15466
- }
15467
- function getErrorName(error) {
15468
- if (error instanceof Error) {
15469
- return error.constructor.name === "Error" ? "Error" : error.constructor.name;
15470
- }
15471
- return "Error";
15472
- }
15473
- function buildErrorReport(opts) {
15474
- const { error, componentStack, eventId } = opts;
15475
- const errorMessage = error instanceof Error ? error.message : String(error);
15476
- const errorStack = error instanceof Error ? error.stack : void 0;
15477
- const url = opts.url ?? window.location.href;
15478
- const sections = [
15479
- `## Error Report`,
15480
- `**Timestamp:** ${(/* @__PURE__ */ new Date()).toISOString()}`,
15481
- `**URL:** ${url}`,
15482
- opts.appVersion && `**App Version:** ${opts.appVersion}`,
15483
- eventId && `**Sentry Event ID:** ${eventId}`,
15484
- `**User Agent:** ${navigator.userAgent}`,
15485
- `**Viewport:** ${window.innerWidth}x${window.innerHeight}`,
15486
- "",
15487
- `### Error`,
15488
- "```",
15489
- `${getErrorName(error)}: ${errorMessage}`,
15490
- "```",
15491
- "",
15492
- errorStack && `### Stack Trace`,
15493
- errorStack && "```",
15494
- errorStack,
15495
- errorStack && "```",
15496
- errorStack && "",
15497
- componentStack && `### Component Stack`,
15498
- componentStack && "```",
15499
- componentStack?.trim(),
15500
- componentStack && "```"
15501
- ];
15502
- return sections.filter(Boolean).join("\n");
15503
- }
15504
- function CrashErrorFallback({ error, componentStack, eventId, appVersion }) {
15505
- const { background } = useAppearance();
15506
- const errorMessage = error instanceof Error ? error.message : String(error);
15507
- const errorStack = error instanceof Error ? error.stack : void 0;
15508
- const errorName = getErrorName(error);
15509
- const reportText = buildErrorReport({ error, componentStack, eventId, appVersion });
15510
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
15511
- return /* @__PURE__ */ jsxs(
15512
- "div",
15513
- {
15514
- style: {
15515
- position: "fixed",
15516
- inset: 0,
15517
- overflow: "auto",
15518
- background: "var(--color-background)",
15519
- display: "flex",
15520
- alignItems: "center",
15521
- justifyContent: "center",
15522
- padding: 24
15523
- },
15524
- children: [
15525
- background,
15526
- /* @__PURE__ */ jsx("div", { style: { position: "relative", zIndex: 1, width: "100%", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx(
15527
- ErrorReportCard,
15528
- {
15529
- errorName,
15530
- errorMessage,
15531
- errorStack,
15532
- componentStack,
15533
- eventId,
15534
- url: window.location.href,
15535
- timestamp,
15536
- reportText,
15537
- appVersion
15538
- }
15539
- ) })
15540
- ]
15541
- }
15542
- );
15543
- }
15544
- var AppErrorBoundary = class extends Component {
15545
- state = { error: null, componentStack: "" };
15546
- static getDerivedStateFromError(error) {
15547
- return { error };
15548
- }
15549
- componentDidCatch(error, errorInfo) {
15550
- this.setState({ componentStack: errorInfo.componentStack ?? "" });
15551
- this.props.onError?.(error, errorInfo);
15552
- }
15553
- render() {
15554
- if (this.state.error !== null) {
15555
- const props = { error: this.state.error, componentStack: this.state.componentStack };
15556
- return this.props.fallback ? this.props.fallback(props) : /* @__PURE__ */ jsx(CrashErrorFallback, { ...props, appVersion: this.props.appVersion });
15557
- }
15558
- return this.props.children;
15559
- }
15560
- };
15561
14027
  function RichTextEditor({ content, onChange, placeholder }) {
15562
14028
  const editor = useEditor({
15563
14029
  extensions: [
@@ -15857,13 +14323,123 @@ function DealKanbanCard({ deal, config, onClick, onDragStart, onDragEnd }) {
15857
14323
  );
15858
14324
  }
15859
14325
 
14326
+ // ../elevasis-core/src/organization-model/entities.ts
14327
+ var ENTITY_ENTRY_INPUTS = [
14328
+ {
14329
+ id: "crm.deal",
14330
+ order: 10,
14331
+ label: "Deal",
14332
+ description: "A CRM opportunity or sales pipeline record.",
14333
+ ownedBySystemId: "sales.crm",
14334
+ table: "crm_deals",
14335
+ stateCatalogId: "crm.pipeline",
14336
+ links: [{ toEntity: "crm.contact", kind: "has-many", via: "deal_contacts", label: "contacts" }]
14337
+ },
14338
+ {
14339
+ id: "crm.contact",
14340
+ order: 20,
14341
+ label: "CRM Contact",
14342
+ description: "A person associated with a CRM relationship or deal.",
14343
+ ownedBySystemId: "sales.crm",
14344
+ table: "crm_contacts"
14345
+ },
14346
+ {
14347
+ id: "leadgen.list",
14348
+ order: 30,
14349
+ label: "Lead List",
14350
+ description: "A prospecting list that groups companies and contacts for acquisition workflows.",
14351
+ ownedBySystemId: "sales.lead-gen",
14352
+ table: "acq_lists",
14353
+ links: [
14354
+ { toEntity: "leadgen.company", kind: "has-many", via: "acq_list_companies", label: "companies" },
14355
+ { toEntity: "leadgen.contact", kind: "has-many", via: "acq_list_members", label: "contacts" }
14356
+ ]
14357
+ },
14358
+ {
14359
+ id: "leadgen.company",
14360
+ order: 40,
14361
+ label: "Lead Company",
14362
+ description: "A company record sourced, enriched, and qualified during prospecting.",
14363
+ ownedBySystemId: "sales.lead-gen",
14364
+ table: "acq_list_companies",
14365
+ stateCatalogId: "lead-gen.company",
14366
+ links: [
14367
+ { toEntity: "leadgen.list", kind: "belongs-to", via: "list_id", label: "list" },
14368
+ { toEntity: "leadgen.contact", kind: "has-many", via: "company_id", label: "contacts" }
14369
+ ]
14370
+ },
14371
+ {
14372
+ id: "leadgen.contact",
14373
+ order: 50,
14374
+ label: "Lead Contact",
14375
+ description: "A prospect contact discovered or enriched during lead generation.",
14376
+ ownedBySystemId: "sales.lead-gen",
14377
+ table: "acq_list_members",
14378
+ stateCatalogId: "lead-gen.contact",
14379
+ links: [
14380
+ { toEntity: "leadgen.list", kind: "belongs-to", via: "list_id", label: "list" },
14381
+ { toEntity: "leadgen.company", kind: "belongs-to", via: "company_id", label: "company" }
14382
+ ]
14383
+ },
14384
+ {
14385
+ id: "delivery.project",
14386
+ order: 60,
14387
+ label: "Project",
14388
+ description: "A client delivery project.",
14389
+ ownedBySystemId: "projects",
14390
+ table: "projects",
14391
+ links: [
14392
+ { toEntity: "delivery.milestone", kind: "has-many", via: "project_id", label: "milestones" },
14393
+ { toEntity: "delivery.task", kind: "has-many", via: "project_id", label: "tasks" }
14394
+ ]
14395
+ },
14396
+ {
14397
+ id: "delivery.milestone",
14398
+ order: 70,
14399
+ label: "Milestone",
14400
+ description: "A delivery checkpoint within a project.",
14401
+ ownedBySystemId: "projects",
14402
+ table: "project_milestones",
14403
+ links: [
14404
+ { toEntity: "delivery.project", kind: "belongs-to", via: "project_id", label: "project" },
14405
+ { toEntity: "delivery.task", kind: "has-many", via: "milestone_id", label: "tasks" }
14406
+ ]
14407
+ },
14408
+ {
14409
+ id: "delivery.task",
14410
+ order: 80,
14411
+ label: "Task",
14412
+ description: "A delivery task that can move through the task status catalog.",
14413
+ ownedBySystemId: "projects",
14414
+ table: "project_tasks",
14415
+ stateCatalogId: "delivery.task",
14416
+ links: [
14417
+ { toEntity: "delivery.project", kind: "belongs-to", via: "project_id", label: "project" },
14418
+ { toEntity: "delivery.milestone", kind: "belongs-to", via: "milestone_id", label: "milestone" }
14419
+ ]
14420
+ }
14421
+ ];
14422
+ var ELEVASIS_ORGANIZATION_MODEL_ENTITIES = defineEntities(ENTITY_ENTRY_INPUTS);
14423
+
15860
14424
  // ../elevasis-core/src/organization-model/identity.ts
15861
14425
  var platformBranding = {
15862
14426
  organizationName: "Elevasis",
15863
14427
  productName: "Elevasis Command Center",
15864
- shortName: "Elevasis"
14428
+ shortName: "Elevasis",
14429
+ voice: "Clear, practical, and grounded in the work SMB teams actually need to automate. Elevasis explains complex AI orchestration in plain language, with a bias toward useful outcomes, operational trust, and human control.",
14430
+ tagline: "AI orchestration for SMB teams ready to automate complex work with intelligent agents and workflows.",
14431
+ values: [
14432
+ "Make automation practical for real business work",
14433
+ "Keep humans in control of consequential decisions",
14434
+ "Earn trust through clear systems and observable workflows",
14435
+ "Design agents around outcomes, not novelty",
14436
+ "Respect the constraints of growing SMB teams"
14437
+ ]
15865
14438
  };
15866
14439
  var platformIdentity = {
14440
+ organizationName: "Elevasis",
14441
+ productName: "Elevasis Command Center",
14442
+ shortName: "Elevasis",
15867
14443
  mission: "Help SMBs automate complex work using intelligent AI agents and workflows.",
15868
14444
  vision: "Become the operating system for the modern AI-driven business.",
15869
14445
  legalName: "Elevasis",
@@ -18316,7 +16892,7 @@ var workflowDisplayMetadataByResourceId = {
18316
16892
  function titleFromResourceId(resourceId) {
18317
16893
  return resourceId.replace(/-workflow$/, "").replace(/[-_]+/g, " ").replace(/\b\w/g, (character) => character.toUpperCase());
18318
16894
  }
18319
- var platformWorkflowResources = platformWorkflowResourceSeeds.map(([id, systemPath2, buildActionKey], index) => {
16895
+ var platformWorkflowResources = platformWorkflowResourceSeeds.map(([id, systemPath, buildActionKey], index) => {
18320
16896
  const codeRefs = platformWorkflowCodeRefs[id];
18321
16897
  const ontology = buildActionKey !== void 0 ? workflowOntologyBindingsByBuildActionKey[buildActionKey] : void 0;
18322
16898
  const contract = workflowContractsByResourceId[id];
@@ -18330,10 +16906,10 @@ var platformWorkflowResources = platformWorkflowResourceSeeds.map(([id, systemPa
18330
16906
  id,
18331
16907
  order: (index + 1) * 10,
18332
16908
  kind: "workflow",
18333
- systemPath: systemPath2,
16909
+ systemPath,
18334
16910
  title,
18335
16911
  description: displayMetadata?.description ?? `Workflow resource for ${title}.`,
18336
- ownerRoleId: getPlatformOwnerRoleId(systemPath2),
16912
+ ownerRoleId: getPlatformOwnerRoleId(systemPath),
18337
16913
  status: "active",
18338
16914
  ...codeRefs ? { codeRefs } : {},
18339
16915
  ...ontologyWithContract ? { ontology: ontologyWithContract } : {}
@@ -19821,19 +18397,19 @@ function usesIntegration(key, from, to) {
19821
18397
  })
19822
18398
  ];
19823
18399
  }
19824
- function requestsApproval(key, from, checkpointId, systemPath2) {
18400
+ function requestsApproval(key, from, checkpointId, systemPath) {
19825
18401
  return [
19826
18402
  key,
19827
18403
  topologyRelationship.requestsApproval(resource(from), checkpointId, {
19828
- systemPath: systemPath2
18404
+ systemPath
19829
18405
  })
19830
18406
  ];
19831
18407
  }
19832
- function checkpointRoutesTo(key, checkpointId, to, systemPath2) {
18408
+ function checkpointRoutesTo(key, checkpointId, to, systemPath) {
19833
18409
  return [
19834
18410
  key,
19835
18411
  topologyRelationship.checkpointRoutesTo(checkpointId, resource(to), {
19836
- systemPath: systemPath2
18412
+ systemPath
19837
18413
  })
19838
18414
  ];
19839
18415
  }
@@ -19964,35 +18540,39 @@ function assignResponsibleRoles(systems) {
19964
18540
  }
19965
18541
  return applyToMap(systems);
19966
18542
  }
19967
- var canonicalOrganizationModel = resolveOrganizationModel({
19968
- version: 1,
19969
- // D7: domainMetadata for all 12 domain keys. Date reflects Wave 2 migration (2026-05-11).
19970
- domainMetadata: {
19971
- branding: { version: 1, lastModified: "2026-05-11" },
19972
- identity: { version: 1, lastModified: "2026-05-11" },
19973
- customers: { version: 1, lastModified: "2026-05-11" },
19974
- offerings: { version: 1, lastModified: "2026-05-11" },
19975
- roles: { version: 1, lastModified: "2026-05-11" },
19976
- goals: { version: 1, lastModified: "2026-05-11" },
19977
- systems: { version: 1, lastModified: "2026-05-11" },
19978
- resources: { version: 1, lastModified: "2026-05-11" },
19979
- actions: { version: 1, lastModified: "2026-05-11" },
19980
- entities: { version: 1, lastModified: "2026-05-11" },
19981
- policies: { version: 1, lastModified: "2026-05-11" },
19982
- knowledge: { version: 1, lastModified: "2026-05-11" },
19983
- topology: { version: 1, lastModified: "2026-05-14" }
19984
- },
19985
- branding: platformBranding,
19986
- navigation: platformNavigation,
19987
- identity: platformIdentity,
19988
- roles: platformRoles,
19989
- systems: assignResponsibleRoles(platformSystems),
19990
- actions: ELEVASIS_DEFAULT_ORGANIZATION_MODEL_ACTIONS,
19991
- resources: platformResourceDescriptors,
19992
- topology: platformTopology,
19993
- // D3: knowledge is a flat Record<id, OrgKnowledgeNode> — no wrapper object.
19994
- knowledge: platformKnowledgeNodes
19995
- }, { mergeDefaults: false });
18543
+ var canonicalOrganizationModel = resolveOrganizationModel(
18544
+ {
18545
+ version: 1,
18546
+ // D7: domainMetadata for all 12 domain keys. Date reflects Wave 2 migration (2026-05-11).
18547
+ domainMetadata: {
18548
+ branding: { version: 1, lastModified: "2026-05-11" },
18549
+ identity: { version: 1, lastModified: "2026-05-11" },
18550
+ customers: { version: 1, lastModified: "2026-05-11" },
18551
+ offerings: { version: 1, lastModified: "2026-05-11" },
18552
+ roles: { version: 1, lastModified: "2026-05-11" },
18553
+ goals: { version: 1, lastModified: "2026-05-11" },
18554
+ systems: { version: 1, lastModified: "2026-05-11" },
18555
+ resources: { version: 1, lastModified: "2026-05-11" },
18556
+ actions: { version: 1, lastModified: "2026-05-11" },
18557
+ entities: { version: 1, lastModified: "2026-05-11" },
18558
+ policies: { version: 1, lastModified: "2026-05-11" },
18559
+ knowledge: { version: 1, lastModified: "2026-05-11" },
18560
+ topology: { version: 1, lastModified: "2026-05-14" }
18561
+ },
18562
+ branding: platformBranding,
18563
+ navigation: platformNavigation,
18564
+ identity: platformIdentity,
18565
+ roles: platformRoles,
18566
+ systems: assignResponsibleRoles(platformSystems),
18567
+ actions: ELEVASIS_DEFAULT_ORGANIZATION_MODEL_ACTIONS,
18568
+ entities: ELEVASIS_ORGANIZATION_MODEL_ENTITIES,
18569
+ resources: platformResourceDescriptors,
18570
+ topology: platformTopology,
18571
+ // D3: knowledge is a flat Record<id, OrgKnowledgeNode> no wrapper object.
18572
+ knowledge: platformKnowledgeNodes
18573
+ },
18574
+ { mergeDefaults: false }
18575
+ );
19996
18576
  var canonicalSystemPaths = new Set(listAllSystems(canonicalOrganizationModel).map(({ path }) => path));
19997
18577
  for (const resource2 of Object.values(canonicalOrganizationModel.resources)) {
19998
18578
  if (!canonicalSystemPaths.has(resource2.systemPath)) {
@@ -22560,10 +21140,10 @@ function useDeleteLists() {
22560
21140
  const queryClient = useQueryClient();
22561
21141
  return useMutation({
22562
21142
  mutationFn: async (listIds) => {
22563
- const uniqueIds2 = [...new Set(listIds)].filter(Boolean);
22564
- if (uniqueIds2.length === 0) return;
21143
+ const uniqueIds = [...new Set(listIds)].filter(Boolean);
21144
+ if (uniqueIds.length === 0) return;
22565
21145
  await Promise.all(
22566
- uniqueIds2.map(
21146
+ uniqueIds.map(
22567
21147
  (listId) => apiRequest(`/acquisition/lists/${listId}`, {
22568
21148
  method: "DELETE"
22569
21149
  })
@@ -22580,12 +21160,17 @@ function useDeleteLists() {
22580
21160
  }
22581
21161
  });
22582
21162
  }
22583
- function actionMatchesExport(primaryAction) {
22584
- return primaryAction === "lead-gen.export.list" || primaryAction?.endsWith(":action/export.list") === true || primaryAction?.endsWith(".export.list") === true;
21163
+ function isLeadGenExportAction(action) {
21164
+ if (!action) return false;
21165
+ const ontologyActionSegment = action.split(":action/")[1];
21166
+ if (ontologyActionSegment) {
21167
+ return ontologyActionSegment === "export" || ontologyActionSegment.startsWith("export.") || ontologyActionSegment.startsWith("export-");
21168
+ }
21169
+ return action === "lead-gen.export.list" || action.includes(".export.");
22585
21170
  }
22586
21171
  function getLeadGenExportWorkflowId(model) {
22587
21172
  return Object.values(model.resources ?? {}).find(
22588
- (resource2) => resource2.kind === "workflow" && resource2.systemPath === "sales.lead-gen" && (actionMatchesExport(resource2.ontology?.primaryAction) || resource2.ontology?.actions?.some(actionMatchesExport) === true)
21173
+ (resource2) => resource2.kind === "workflow" && resource2.systemPath === "sales.lead-gen" && (isLeadGenExportAction(resource2.ontology?.primaryAction) || resource2.ontology?.actions?.some(isLeadGenExportAction) === true)
22589
21174
  )?.id;
22590
21175
  }
22591
21176
  function toBuildStepDefinition(step) {
@@ -24105,7 +22690,7 @@ function hasRunInput(run2) {
24105
22690
  return input !== void 0 && input !== null;
24106
22691
  }
24107
22692
  function sanitizeStepInput(value, actionKey) {
24108
- if (actionKey === "lead-gen.export.list") return value;
22693
+ if (isLeadGenExportAction(actionKey)) return value;
24109
22694
  const next = { ...value };
24110
22695
  delete next.mode;
24111
22696
  return next;
@@ -24765,7 +23350,7 @@ function StepRecordsPanel({
24765
23350
  const rows = recordsQuery.data?.data ?? [];
24766
23351
  const total = recordsQuery.data?.total ?? 0;
24767
23352
  const totalPages = Math.max(1, Math.ceil(total / RECORDS_PAGE_SIZE));
24768
- const isReviewExportStep = step.primaryEntity === "company" && (step.actionKey === "lead-gen.export.list" || step.action?.resourceId === exportWorkflowId);
23353
+ const isReviewExportStep = step.primaryEntity === "company" && (isLeadGenExportAction(step.actionKey) || step.action?.resourceId === exportWorkflowId);
24769
23354
  const approvedCompanyIds = Object.entries(approvalByCompanyId).filter(([, status]) => status === "approved").map(([companyId]) => companyId);
24770
23355
  const rejectedCompanyIds = Object.entries(approvalByCompanyId).filter(([, status]) => status === "rejected").map(([companyId]) => companyId);
24771
23356
  const setApproval = (companyId, status) => {
@@ -24909,7 +23494,7 @@ function BuildTab({
24909
23494
  const stepSchema = selectedStep?.action?.schema;
24910
23495
  const stepLayout = selectedStep?.action?.layout;
24911
23496
  const credentialRequirements = selectedStep?.credentialRequirements ?? [];
24912
- const selectedStepIsReviewExport = selectedStep?.primaryEntity === "company" && (selectedStep.actionKey === "lead-gen.export.list" || selectedStep.action?.resourceId === exportWorkflowId);
23497
+ const selectedStepIsReviewExport = selectedStep?.primaryEntity === "company" && (isLeadGenExportAction(selectedStep.actionKey) || selectedStep.action?.resourceId === exportWorkflowId);
24913
23498
  const selectedExportWorkflowId = selectedStep?.action?.resourceId ?? exportWorkflowId ?? "";
24914
23499
  const visibleStepLayout = useMemo(
24915
23500
  () => filterCredentialRequirementFields(stepLayout, credentialRequirements),
@@ -25228,7 +23813,7 @@ function BuildTab({
25228
23813
  onVerify: handleVerifyCredential
25229
23814
  }
25230
23815
  ),
25231
- selectedStep.actionKey === "lead-gen.export.list" || getClickUpRequirement(selectedStep) ? /* @__PURE__ */ jsx(
23816
+ isLeadGenExportAction(selectedStep.actionKey) || getClickUpRequirement(selectedStep) ? /* @__PURE__ */ jsx(
25232
23817
  TextInput,
25233
23818
  {
25234
23819
  label: "ClickUp List ID",
@@ -29971,127 +28556,6 @@ function CommandQueueDetailPage({
29971
28556
  ] });
29972
28557
  }
29973
28558
 
29974
- // src/features/operations/organization-graph/types.ts
29975
- var ORGANIZATION_GRAPH_NODE_KIND_ORDER = [
29976
- "organization",
29977
- "system",
29978
- "role",
29979
- "action",
29980
- "entity",
29981
- "event",
29982
- "policy",
29983
- "stage",
29984
- "resource",
29985
- "knowledge",
29986
- "customer-segment",
29987
- "offering",
29988
- "goal",
29989
- "surface",
29990
- "navigation-group",
29991
- "ontology"
29992
- ];
29993
- var ORGANIZATION_GRAPH_NODE_KIND_LABELS = {
29994
- organization: "Organization",
29995
- system: "System",
29996
- role: "Role",
29997
- action: "Action",
29998
- entity: "Entity",
29999
- event: "Event",
30000
- policy: "Policy",
30001
- stage: "Stage",
30002
- resource: "Resource",
30003
- knowledge: "Knowledge",
30004
- "customer-segment": "Customer segment",
30005
- offering: "Offering",
30006
- goal: "Goal",
30007
- surface: "Surface",
30008
- "navigation-group": "Navigation group",
30009
- ontology: "Ontology"
30010
- };
30011
- var ORGANIZATION_GRAPH_NODE_KIND_DETAIL_LABELS = {
30012
- organization: "Organization root",
30013
- system: "System",
30014
- role: "Role",
30015
- action: "Action",
30016
- entity: "Entity",
30017
- event: "Event",
30018
- policy: "Policy",
30019
- stage: "Stage",
30020
- resource: "Resource",
30021
- knowledge: "Knowledge",
30022
- "customer-segment": "Customer segment",
30023
- offering: "Offering",
30024
- goal: "Goal",
30025
- surface: "Surface",
30026
- "navigation-group": "Navigation group",
30027
- ontology: "Ontology record"
30028
- };
30029
- var ORGANIZATION_GRAPH_NODE_KIND_MEANINGS = {
30030
- organization: "The root of the shared organization model and the parent for every derived node.",
30031
- system: "A canonical Organization Model system for ownership, routing, and governance.",
30032
- role: "An Organization Model role that owns responsibilities and may govern systems.",
30033
- action: "A reusable action that can be attached to a system.",
30034
- entity: "A modeled business object or stateful data domain owned by the organization model.",
30035
- event: "A derived domain or runtime event emitted by entities, resources, or actions.",
30036
- policy: "A governance rule that applies to targets and may trigger effects across the graph.",
30037
- stage: "A lifecycle stage that records progress for an entity through a build pipeline.",
30038
- resource: "A concrete command-view or mapped resource that bridges execution topology into the model.",
30039
- knowledge: "An operational knowledge node that documents a process, strategy, or runbook in the org model.",
30040
- "customer-segment": "A defined segment of customers or prospects that the organization targets or serves.",
30041
- offering: "A product, service, or value proposition the organization delivers to customer segments.",
30042
- goal: "A strategic or operational objective that guides priorities and measures progress.",
30043
- surface: "A navigation surface (page or view) that is exposed through the platform shell.",
30044
- "navigation-group": "A logical grouping of navigation surfaces within the platform shell.",
30045
- ontology: "A compiled ontology record such as an object, action, catalog, value type, surface, or resource binding."
30046
- };
30047
- var ORGANIZATION_GRAPH_EDGE_KIND_LABELS = {
30048
- contains: "Containment",
30049
- references: "Reference",
30050
- maps_to: "Mapping",
30051
- uses: "Uses",
30052
- governs: "Governs",
30053
- links: "Links",
30054
- affects: "Affects",
30055
- emits: "Emits",
30056
- originates_from: "Originates from",
30057
- triggers: "Triggers",
30058
- approval: "Approval",
30059
- applies_to: "Applies to",
30060
- effects: "Effects",
30061
- actions: "Actions",
30062
- reads: "Reads",
30063
- writes: "Writes",
30064
- uses_catalog: "Uses catalog"
30065
- };
30066
- var ORGANIZATION_GRAPH_EDGE_KIND_MEANINGS = {
30067
- contains: "A hierarchy or ownership link inside the shared graph.",
30068
- references: "A semantic association or dependency between two graph nodes.",
30069
- maps_to: "An action is aligned to a concrete resource.",
30070
- uses: "A graph node depends on another node, resource, entity, or integration.",
30071
- governs: "A knowledge node, role, or policy provides authoritative guidance for another node.",
30072
- links: "Two modeled nodes are associated without stronger ownership or execution semantics.",
30073
- affects: "The source can influence the behavior, state, or outcome of the target.",
30074
- emits: "The source produces an event that can be inspected or traversed.",
30075
- originates_from: "The source is derived from or owned by the target origin.",
30076
- triggers: "The source can start or activate the target.",
30077
- approval: "The source requests or participates in an approval path.",
30078
- applies_to: "A policy or rule targets the node it applies to.",
30079
- effects: "A policy or event produces the target effect.",
30080
- actions: "The source is bound to the target ontology action contract.",
30081
- reads: "The source reads data described by the target ontology record.",
30082
- writes: "The source writes data described by the target ontology record.",
30083
- uses_catalog: "The source uses the target ontology catalog."
30084
- };
30085
- var DEFAULT_ORGANIZATION_GRAPH_FILTERS = {
30086
- search: "",
30087
- nodeKinds: [],
30088
- topologyPresence: "all",
30089
- environmentStatus: "all",
30090
- resourceTypes: [],
30091
- showIntegrations: true,
30092
- domainFilters: {}
30093
- };
30094
-
30095
28559
  // src/features/operations/organization-graph/organizationGraphDetail.ts
30096
28560
  var RELATIONSHIP_MEANINGS = {
30097
28561
  triggers: "Executable handoff: the source resource starts the target resource.",
@@ -34170,8 +32634,8 @@ function getRelativeLuminance(color) {
34170
32634
  };
34171
32635
  return 0.2126 * channel(parsed.r) + 0.7152 * channel(parsed.g) + 0.0722 * channel(parsed.b);
34172
32636
  }
34173
- function getReadableTextColor(background, tokens2) {
34174
- return getRelativeLuminance(background) > 0.38 ? tokens2.background : tokens2.text;
32637
+ function getReadableTextColor(background, tokens) {
32638
+ return getRelativeLuminance(background) > 0.38 ? tokens.background : tokens.text;
34175
32639
  }
34176
32640
  function readGraphThemeTokens() {
34177
32641
  if (typeof window === "undefined") {
@@ -34195,86 +32659,86 @@ function readGraphThemeTokens() {
34195
32659
  error: read("--color-error", FALLBACK_GRAPH_THEME.error)
34196
32660
  };
34197
32661
  }
34198
- function getNodeThemeByKind(tokens2) {
32662
+ function getNodeThemeByKind(tokens) {
34199
32663
  const accentByKind = {
34200
- organization: mixColors(tokens2.primary, tokens2.text, 0.35),
34201
- system: mixColors(tokens2.primary, tokens2.success, 0.48),
34202
- role: mixColors(tokens2.primary, tokens2.error, 0.4),
34203
- action: mixColors(tokens2.primary, tokens2.success, 0.72),
34204
- entity: mixColors(tokens2.success, tokens2.warning, 0.44),
34205
- event: mixColors(tokens2.warning, tokens2.error, 0.48),
34206
- policy: mixColors(tokens2.primary, tokens2.error, 0.62),
34207
- stage: mixColors(tokens2.primary, tokens2.warning, 0.32),
34208
- resource: mixColors(tokens2.primary, tokens2.warning, 0.58),
34209
- knowledge: mixColors(tokens2.primary, tokens2.text, 0.6),
34210
- "customer-segment": mixColors(tokens2.success, tokens2.text, 0.5),
34211
- offering: mixColors(tokens2.success, tokens2.primary, 0.36),
34212
- goal: mixColors(tokens2.primary, tokens2.error, 0.5),
34213
- surface: mixColors(tokens2.primary, tokens2.success, 0.55),
34214
- "navigation-group": mixColors(tokens2.primary, tokens2.text, 0.45),
34215
- ontology: mixColors(tokens2.primary, tokens2.warning, 0.44)
32664
+ organization: mixColors(tokens.primary, tokens.text, 0.35),
32665
+ system: mixColors(tokens.primary, tokens.success, 0.48),
32666
+ role: mixColors(tokens.primary, tokens.error, 0.4),
32667
+ action: mixColors(tokens.primary, tokens.success, 0.72),
32668
+ entity: mixColors(tokens.success, tokens.warning, 0.44),
32669
+ event: mixColors(tokens.warning, tokens.error, 0.48),
32670
+ policy: mixColors(tokens.primary, tokens.error, 0.62),
32671
+ stage: mixColors(tokens.primary, tokens.warning, 0.32),
32672
+ resource: mixColors(tokens.primary, tokens.warning, 0.58),
32673
+ knowledge: mixColors(tokens.primary, tokens.text, 0.6),
32674
+ "customer-segment": mixColors(tokens.success, tokens.text, 0.5),
32675
+ offering: mixColors(tokens.success, tokens.primary, 0.36),
32676
+ goal: mixColors(tokens.primary, tokens.error, 0.5),
32677
+ surface: mixColors(tokens.primary, tokens.success, 0.55),
32678
+ "navigation-group": mixColors(tokens.primary, tokens.text, 0.45),
32679
+ ontology: mixColors(tokens.primary, tokens.warning, 0.44)
34216
32680
  };
34217
32681
  return Object.fromEntries(
34218
32682
  Object.entries(accentByKind).map(([kind, accent]) => {
34219
- const background = mixColors(accent, tokens2.surface === "transparent" ? tokens2.background : tokens2.surface, 0.18);
34220
- const border = mixColors(accent, tokens2.border, 0.5);
32683
+ const background = mixColors(accent, tokens.surface === "transparent" ? tokens.background : tokens.surface, 0.18);
32684
+ const border = mixColors(accent, tokens.border, 0.5);
34221
32685
  return [
34222
32686
  kind,
34223
32687
  {
34224
32688
  background,
34225
32689
  border,
34226
- color: getReadableTextColor(background, tokens2)
32690
+ color: getReadableTextColor(background, tokens)
34227
32691
  }
34228
32692
  ];
34229
32693
  })
34230
32694
  );
34231
32695
  }
34232
- function getEdgeColor(edge, tokens2) {
34233
- if (edge.relationshipType === "triggers") return mixColors(tokens2.warning, tokens2.primary, 0.7);
34234
- if (edge.relationshipType === "uses") return mixColors(tokens2.success, tokens2.primary, 0.55);
34235
- if (edge.relationshipType === "approval") return mixColors(tokens2.warning, tokens2.text, 0.5);
32696
+ function getEdgeColor(edge, tokens) {
32697
+ if (edge.relationshipType === "triggers") return mixColors(tokens.warning, tokens.primary, 0.7);
32698
+ if (edge.relationshipType === "uses") return mixColors(tokens.success, tokens.primary, 0.55);
32699
+ if (edge.relationshipType === "approval") return mixColors(tokens.warning, tokens.text, 0.5);
34236
32700
  switch (edge.kind) {
34237
32701
  case "contains":
34238
- return mixColors(tokens2.textDimmed, tokens2.border, 0.45);
32702
+ return mixColors(tokens.textDimmed, tokens.border, 0.45);
34239
32703
  case "governs":
34240
32704
  case "applies_to":
34241
- return mixColors(tokens2.primary, tokens2.text, 0.45);
32705
+ return mixColors(tokens.primary, tokens.text, 0.45);
34242
32706
  case "maps_to":
34243
32707
  case "originates_from":
34244
32708
  case "actions":
34245
- return mixColors(tokens2.primary, tokens2.warning, 0.4);
32709
+ return mixColors(tokens.primary, tokens.warning, 0.4);
34246
32710
  case "uses":
34247
32711
  case "links":
34248
32712
  case "reads":
34249
32713
  case "writes":
34250
32714
  case "uses_catalog":
34251
- return mixColors(tokens2.success, tokens2.primary, 0.44);
32715
+ return mixColors(tokens.success, tokens.primary, 0.44);
34252
32716
  case "affects":
34253
32717
  case "effects":
34254
- return mixColors(tokens2.error, tokens2.primary, 0.42);
32718
+ return mixColors(tokens.error, tokens.primary, 0.42);
34255
32719
  case "emits":
34256
32720
  case "triggers":
34257
- return mixColors(tokens2.warning, tokens2.error, 0.5);
32721
+ return mixColors(tokens.warning, tokens.error, 0.5);
34258
32722
  case "references":
34259
32723
  default:
34260
- return mixColors(tokens2.primary, tokens2.success, 0.32);
32724
+ return mixColors(tokens.primary, tokens.success, 0.32);
34261
32725
  }
34262
32726
  }
34263
32727
  function getNodeHaloColor(node, fallback, graph) {
34264
32728
  const domain = getCommandViewNodeDomain(node, graph);
34265
32729
  return DOMAIN_ZONE_TINT_COLOR[domain] ?? fallback;
34266
32730
  }
34267
- function getExploreEdgeColor(sourceId, targetId, nodeById, tokens2, graph) {
32731
+ function getExploreEdgeColor(sourceId, targetId, nodeById, tokens, graph) {
34268
32732
  if (sourceId.startsWith("centroid:")) {
34269
32733
  const zone = sourceId.slice("centroid:".length);
34270
- return mixColors(DOMAIN_ZONE_TINT_COLOR[zone] ?? tokens2.primary, tokens2.textDimmed, 0.46);
32734
+ return mixColors(DOMAIN_ZONE_TINT_COLOR[zone] ?? tokens.primary, tokens.textDimmed, 0.46);
34271
32735
  }
34272
32736
  const sourceNode = nodeById.get(sourceId);
34273
32737
  const targetNode = nodeById.get(targetId);
34274
- const sourceTint = sourceNode ? getNodeHaloColor(sourceNode, tokens2.primary, graph) : null;
34275
- const targetTint = targetNode ? getNodeHaloColor(targetNode, tokens2.primary, graph) : null;
34276
- const tint = sourceTint ?? targetTint ?? tokens2.primary;
34277
- return mixColors(tint, tokens2.textDimmed, 0.42);
32738
+ const sourceTint = sourceNode ? getNodeHaloColor(sourceNode, tokens.primary, graph) : null;
32739
+ const targetTint = targetNode ? getNodeHaloColor(targetNode, tokens.primary, graph) : null;
32740
+ const tint = sourceTint ?? targetTint ?? tokens.primary;
32741
+ return mixColors(tint, tokens.textDimmed, 0.42);
34278
32742
  }
34279
32743
  function getNodeSize(kind) {
34280
32744
  if (kind === "organization") {
@@ -34301,17 +32765,17 @@ function getDegreeWeightedSize(kind, degree) {
34301
32765
  function getNodeScore(node, degreeByNodeId) {
34302
32766
  return Math.max(1, degreeByNodeId.get(node.id) ?? 0);
34303
32767
  }
34304
- function getCommandViewRingColor(level, tokens2) {
32768
+ function getCommandViewRingColor(level, tokens) {
34305
32769
  switch (level) {
34306
32770
  case "healthy":
34307
- return tokens2.success;
32771
+ return tokens.success;
34308
32772
  case "warning":
34309
- return tokens2.warning;
32773
+ return tokens.warning;
34310
32774
  case "critical":
34311
- return tokens2.error;
32775
+ return tokens.error;
34312
32776
  case "inactive":
34313
32777
  default:
34314
- return mixColors(tokens2.textDimmed, tokens2.border, 0.6);
32778
+ return mixColors(tokens.textDimmed, tokens.border, 0.6);
34315
32779
  }
34316
32780
  }
34317
32781
  function getDomainCardPosition(domain) {
@@ -34339,16 +32803,16 @@ var DOMAIN_DISPLAY_LABELS = {
34339
32803
  platform: "Platform",
34340
32804
  other: "Other"
34341
32805
  };
34342
- function toCytoscapeElementsWithHealth(graph, graphIndex, tokens2, commandViewHealthByNodeId, visualizationMode, selectedElement, expandedClusterDomains, parameters, expandedNodeIds) {
34343
- const nodeThemeByKind = getNodeThemeByKind(tokens2);
32806
+ function toCytoscapeElementsWithHealth(graph, graphIndex, tokens, commandViewHealthByNodeId, visualizationMode, selectedElement, expandedClusterDomains, parameters, expandedNodeIds) {
32807
+ const nodeThemeByKind = getNodeThemeByKind(tokens);
34344
32808
  if (visualizationMode === "explore") {
34345
32809
  const { syntheticNodes, backboneEdges, positions } = getExploreProjection(graph, expandedNodeIds);
34346
32810
  const elements = [];
34347
32811
  for (const sNode of syntheticNodes) {
34348
32812
  const isOmRoot = sNode.isOmRoot === true;
34349
- const fillColor = sNode.zoneTint ? mixColors(withAlpha(sNode.zoneTint, 0.22), tokens2.background, 0.22) : mixColors(tokens2.primary, tokens2.surface === "transparent" ? tokens2.background : tokens2.surface, 0.18);
34350
- const borderColor = sNode.zoneTint ? mixColors(sNode.zoneTint, tokens2.border, 0.48) : mixColors(tokens2.primary, tokens2.border, 0.52);
34351
- const haloColor = sNode.zoneTint ?? tokens2.primary;
32813
+ const fillColor = sNode.zoneTint ? mixColors(withAlpha(sNode.zoneTint, 0.22), tokens.background, 0.22) : mixColors(tokens.primary, tokens.surface === "transparent" ? tokens.background : tokens.surface, 0.18);
32814
+ const borderColor = sNode.zoneTint ? mixColors(sNode.zoneTint, tokens.border, 0.48) : mixColors(tokens.primary, tokens.border, 0.52);
32815
+ const haloColor = sNode.zoneTint ?? tokens.primary;
34352
32816
  elements.push({
34353
32817
  data: {
34354
32818
  id: sNode.id,
@@ -34359,7 +32823,7 @@ function toCytoscapeElementsWithHealth(graph, graphIndex, tokens2, commandViewHe
34359
32823
  zoneTint: sNode.zoneTint ?? void 0,
34360
32824
  fillColor,
34361
32825
  borderColor,
34362
- textColor: tokens2.text,
32826
+ textColor: tokens.text,
34363
32827
  haloColor,
34364
32828
  edgeHaloColor: withAlpha(haloColor, 0.1),
34365
32829
  hasChildren: isOmRoot ? "false" : "true",
@@ -34378,8 +32842,8 @@ function toCytoscapeElementsWithHealth(graph, graphIndex, tokens2, commandViewHe
34378
32842
  const size = getDegreeWeightedSize(node.kind, degree);
34379
32843
  const theme = nodeThemeByKind[node.kind];
34380
32844
  const health = commandViewHealthByNodeId?.get(node.id) ?? null;
34381
- const fillColor = health && node.kind === "resource" ? mixColors(tokens2.surfaceHover, tokens2.background, 0.76) : theme.background;
34382
- const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens2) : theme.border;
32845
+ const fillColor = health && node.kind === "resource" ? mixColors(tokens.surfaceHover, tokens.background, 0.76) : theme.background;
32846
+ const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens) : theme.border;
34383
32847
  const label = truncateGraphLabel(node.label, node.kind === "resource" ? 22 : 30);
34384
32848
  const displayLabel = health ? `${label}
34385
32849
  ${health.summaryLabel}` : label;
@@ -34395,7 +32859,7 @@ ${health.summaryLabel}` : label;
34395
32859
  label: displayLabel,
34396
32860
  fillColor,
34397
32861
  borderColor,
34398
- textColor: health ? tokens2.text : theme.color,
32862
+ textColor: health ? tokens.text : theme.color,
34399
32863
  zoneTint: zoneTint ?? void 0,
34400
32864
  haloColor,
34401
32865
  edgeHaloColor: withAlpha(haloColor, 0.08),
@@ -34413,8 +32877,8 @@ ${health.summaryLabel}` : label;
34413
32877
  target: edge.target,
34414
32878
  kind: "contains",
34415
32879
  label: "",
34416
- strokeColor: mixColors(tokens2.border, tokens2.textDimmed, 0.45),
34417
- edgeHaloColor: withAlpha(tokens2.primary, 0.05),
32880
+ strokeColor: mixColors(tokens.border, tokens.textDimmed, 0.45),
32881
+ edgeHaloColor: withAlpha(tokens.primary, 0.05),
34418
32882
  isExploreBackbone: "true"
34419
32883
  }
34420
32884
  });
@@ -34427,7 +32891,7 @@ ${health.summaryLabel}` : label;
34427
32891
  const edgeId = `expand:${nodeId}:${childId}`;
34428
32892
  if (addedPathNativeExpansionEdgeIds.has(edgeId)) continue;
34429
32893
  addedPathNativeExpansionEdgeIds.add(edgeId);
34430
- const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens2, graph);
32894
+ const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens, graph);
34431
32895
  elements.push({
34432
32896
  data: {
34433
32897
  id: edgeId,
@@ -34456,7 +32920,7 @@ ${health.summaryLabel}` : label;
34456
32920
  const edgeId2 = `expand:${nodeId}:${childId}`;
34457
32921
  if (!addedExpansionEdgeIds.has(edgeId2)) {
34458
32922
  addedExpansionEdgeIds.add(edgeId2);
34459
- const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens2, graph);
32923
+ const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens, graph);
34460
32924
  elements.push({
34461
32925
  data: {
34462
32926
  id: edgeId2,
@@ -34480,8 +32944,8 @@ ${health.summaryLabel}` : label;
34480
32944
  const size = getDegreeWeightedSize(node.kind, degree);
34481
32945
  const theme = nodeThemeByKind[node.kind];
34482
32946
  const health = commandViewHealthByNodeId?.get(node.id) ?? null;
34483
- const fillColor = health && node.kind === "resource" ? mixColors(tokens2.surfaceHover, tokens2.background, 0.76) : theme.background;
34484
- const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens2) : theme.border;
32947
+ const fillColor = health && node.kind === "resource" ? mixColors(tokens.surfaceHover, tokens.background, 0.76) : theme.background;
32948
+ const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens) : theme.border;
34485
32949
  const label = truncateGraphLabel(node.label, node.kind === "resource" ? 22 : 30);
34486
32950
  const displayLabel = health ? `${label}
34487
32951
  ${health.summaryLabel}` : label;
@@ -34497,7 +32961,7 @@ ${health.summaryLabel}` : label;
34497
32961
  label: displayLabel,
34498
32962
  fillColor,
34499
32963
  borderColor,
34500
- textColor: health ? tokens2.text : theme.color,
32964
+ textColor: health ? tokens.text : theme.color,
34501
32965
  zoneTint: zoneTint ?? void 0,
34502
32966
  haloColor,
34503
32967
  edgeHaloColor: withAlpha(haloColor, 0.08),
@@ -34508,7 +32972,7 @@ ${health.summaryLabel}` : label;
34508
32972
  const edgeId = `expand:${nodeId}:${childId}`;
34509
32973
  if (!addedExpansionEdgeIds.has(edgeId)) {
34510
32974
  addedExpansionEdgeIds.add(edgeId);
34511
- const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens2, graph);
32975
+ const strokeColor = getExploreEdgeColor(nodeId, childId, graphIndex.nodeById, tokens, graph);
34512
32976
  elements.push({
34513
32977
  data: {
34514
32978
  id: edgeId,
@@ -34558,9 +33022,9 @@ ${health.summaryLabel}` : label;
34558
33022
  }
34559
33023
  const domainCardElements = [];
34560
33024
  if (isCluster && domainGroups) {
34561
- const cardBackground = withAlpha(tokens2.surface === "transparent" ? tokens2.background : tokens2.surface, 0.92);
34562
- const cardBorder = mixColors(tokens2.border, tokens2.textDimmed, 0.35);
34563
- const cardText = tokens2.textDimmed;
33025
+ const cardBackground = withAlpha(tokens.surface === "transparent" ? tokens.background : tokens.surface, 0.92);
33026
+ const cardBorder = mixColors(tokens.border, tokens.textDimmed, 0.35);
33027
+ const cardText = tokens.textDimmed;
34564
33028
  for (const [domain, members] of domainGroups) {
34565
33029
  if (!expandedSet.has(domain)) {
34566
33030
  const position = getDomainCardPosition(domain);
@@ -34592,8 +33056,8 @@ ${members.length} node${members.length === 1 ? "" : "s"}`,
34592
33056
  const size = getDegreeWeightedSize(node.kind, degree);
34593
33057
  const theme = nodeThemeByKind[node.kind];
34594
33058
  const health = commandViewHealthByNodeId?.get(node.id) ?? null;
34595
- const fillColor = health && node.kind === "resource" ? mixColors(tokens2.surfaceHover, tokens2.background, 0.76) : theme.background;
34596
- const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens2) : theme.border;
33059
+ const fillColor = health && node.kind === "resource" ? mixColors(tokens.surfaceHover, tokens.background, 0.76) : theme.background;
33060
+ const borderColor = health ? getCommandViewRingColor(health.healthLevel, tokens) : theme.border;
34597
33061
  const maxLabelLength = node.kind === "resource" ? 22 : 30;
34598
33062
  const label = truncateGraphLabel(node.label, maxLabelLength);
34599
33063
  const displayLabel = health ? `${label}
@@ -34610,7 +33074,7 @@ ${health.summaryLabel}` : label;
34610
33074
  label: displayLabel,
34611
33075
  fillColor,
34612
33076
  borderColor,
34613
- textColor: health ? tokens2.text : theme.color,
33077
+ textColor: health ? tokens.text : theme.color,
34614
33078
  zoneTint: zoneTint ?? void 0,
34615
33079
  haloColor,
34616
33080
  edgeHaloColor: withAlpha(haloColor, 0.08),
@@ -34620,7 +33084,7 @@ ${health.summaryLabel}` : label;
34620
33084
  };
34621
33085
  });
34622
33086
  const edgeElements = graph.edges.filter((edge) => !hiddenBehindCardIds.has(edge.sourceId) && !hiddenBehindCardIds.has(edge.targetId)).map((edge) => {
34623
- const strokeColor = getEdgeColor(edge, tokens2);
33087
+ const strokeColor = getEdgeColor(edge, tokens);
34624
33088
  return {
34625
33089
  data: {
34626
33090
  id: edge.id,
@@ -34679,10 +33143,10 @@ function getLayoutOptions(mode, selectedElement, traceResult) {
34679
33143
  padding: 48
34680
33144
  };
34681
33145
  }
34682
- function createCytoscapeStyle(tokens2, visualizationMode) {
34683
- const selectedBorder = mixColors(tokens2.primary, tokens2.textDimmed, 0.58);
34684
- const traceBorder = mixColors(tokens2.warning, tokens2.border, 0.58);
34685
- const edgeLabelBackground = withAlpha(tokens2.background, 0.86);
33146
+ function createCytoscapeStyle(tokens, visualizationMode) {
33147
+ const selectedBorder = mixColors(tokens.primary, tokens.textDimmed, 0.58);
33148
+ const traceBorder = mixColors(tokens.warning, tokens.border, 0.58);
33149
+ const edgeLabelBackground = withAlpha(tokens.background, 0.86);
34686
33150
  const reducedMotion = shouldReduceGraphMotion();
34687
33151
  const baseEdgeOpacity = visualizationMode === "cluster" || visualizationMode === "swimlane" ? 0.16 : visualizationMode === "focus" ? 0.42 : 0.28;
34688
33152
  return [
@@ -34708,7 +33172,7 @@ function createCytoscapeStyle(tokens2, visualizationMode) {
34708
33172
  padding: "10px",
34709
33173
  "overlay-opacity": 0,
34710
33174
  "text-outline-width": 1,
34711
- "text-outline-color": tokens2.background,
33175
+ "text-outline-color": tokens.background,
34712
33176
  "text-outline-opacity": 0.56,
34713
33177
  "underlay-color": "data(haloColor)",
34714
33178
  "underlay-opacity": 0,
@@ -34879,7 +33343,7 @@ function createCytoscapeStyle(tokens2, visualizationMode) {
34879
33343
  style: {
34880
33344
  width: 1.05,
34881
33345
  label: "",
34882
- color: tokens2.text,
33346
+ color: tokens.text,
34883
33347
  "font-size": 10,
34884
33348
  "font-weight": 700,
34885
33349
  "curve-style": "bezier",
@@ -35040,7 +33504,7 @@ function createCytoscapeStyle(tokens2, visualizationMode) {
35040
33504
  selector: "node.is-trace-endpoint",
35041
33505
  style: {
35042
33506
  opacity: 1,
35043
- "border-color": mixColors(tokens2.warning, tokens2.textDimmed, 0.58),
33507
+ "border-color": mixColors(tokens.warning, tokens.textDimmed, 0.58),
35044
33508
  "border-width": 3
35045
33509
  }
35046
33510
  },
@@ -35075,7 +33539,7 @@ function createCytoscapeStyle(tokens2, visualizationMode) {
35075
33539
  selector: "node.is-expanded-node",
35076
33540
  style: {
35077
33541
  opacity: 1,
35078
- "border-color": mixColors(tokens2.primary, tokens2.warning, 0.42),
33542
+ "border-color": mixColors(tokens.primary, tokens.warning, 0.42),
35079
33543
  "border-width": 2.2,
35080
33544
  "background-opacity": 0.92,
35081
33545
  "underlay-opacity": 0.04,
@@ -38099,8 +36563,8 @@ function countByKind2(resources) {
38099
36563
  }
38100
36564
  return counts;
38101
36565
  }
38102
- function aggregateSystemMetrics(model, systemPath2) {
38103
- if (systemPath2 === "") {
36566
+ function aggregateSystemMetrics(model, systemPath) {
36567
+ if (systemPath === "") {
38104
36568
  const all = Object.values(model.resources ?? {});
38105
36569
  return {
38106
36570
  resourceCount: all.length,
@@ -38114,8 +36578,8 @@ function aggregateSystemMetrics(model, systemPath2) {
38114
36578
  descendantResources: []
38115
36579
  };
38116
36580
  }
38117
- const inclusive = getResourcesForSystem(model, systemPath2, { includeDescendants: true });
38118
- const direct = getResourcesForSystem(model, systemPath2, { includeDescendants: false });
36581
+ const inclusive = getResourcesForSystem(model, systemPath, { includeDescendants: true });
36582
+ const direct = getResourcesForSystem(model, systemPath, { includeDescendants: false });
38119
36583
  const directIds = new Set(direct.map((resource2) => resource2.id));
38120
36584
  const descendant = inclusive.filter((resource2) => !directIds.has(resource2.id));
38121
36585
  return {
@@ -38406,9 +36870,9 @@ function ontologyCounts(model) {
38406
36870
  diagnostics: compiled.diagnostics.length
38407
36871
  };
38408
36872
  }
38409
- function ontologyCountsForSystem(model, systemPath2) {
36873
+ function ontologyCountsForSystem(model, systemPath) {
38410
36874
  const compiled = compileOrganizationOntology(model);
38411
- const belongsToSystem = (ownerSystemId) => systemPath2 === "" || ownerSystemId === systemPath2 || ownerSystemId?.startsWith(`${systemPath2}.`);
36875
+ const belongsToSystem = (ownerSystemId) => systemPath === "" || ownerSystemId === systemPath || ownerSystemId?.startsWith(`${systemPath}.`);
38412
36876
  return {
38413
36877
  objects: Object.values(compiled.ontology.objectTypes).filter((record) => belongsToSystem(record.ownerSystemId)).length,
38414
36878
  actions: Object.values(compiled.ontology.actionTypes).filter((record) => belongsToSystem(record.ownerSystemId)).length,
@@ -38417,11 +36881,11 @@ function ontologyCountsForSystem(model, systemPath2) {
38417
36881
  diagnostics: compiled.diagnostics.length
38418
36882
  };
38419
36883
  }
38420
- function buildBreadcrumbs(model, systemPath2) {
36884
+ function buildBreadcrumbs(model, systemPath) {
38421
36885
  const items = [{ label: "Systems", path: "" }];
38422
- if (!systemPath2) return items;
38423
- const ancestors = getSystemAncestors(model, systemPath2);
38424
- const segments = systemPath2.split(".");
36886
+ if (!systemPath) return items;
36887
+ const ancestors = getSystemAncestors(model, systemPath);
36888
+ const segments = systemPath.split(".");
38425
36889
  for (let i = 0; i < ancestors.length; i++) {
38426
36890
  items.push({
38427
36891
  label: ancestors[i].label ?? ancestors[i].id,
@@ -38430,22 +36894,22 @@ function buildBreadcrumbs(model, systemPath2) {
38430
36894
  }
38431
36895
  return items;
38432
36896
  }
38433
- function kbPathForSystem(systemPath2) {
38434
- if (!systemPath2) return "/knowledge";
38435
- return `/knowledge/by-system/${systemPath2}`;
36897
+ function kbPathForSystem(systemPath) {
36898
+ if (!systemPath) return "/knowledge";
36899
+ return `/knowledge/by-system/${systemPath}`;
38436
36900
  }
38437
- function resourcesPathForSystem(systemPath2) {
38438
- const suffix = systemPath2 ? `?systemPath=${encodeURIComponent(systemPath2)}` : "";
36901
+ function resourcesPathForSystem(systemPath) {
36902
+ const suffix = systemPath ? `?systemPath=${encodeURIComponent(systemPath)}` : "";
38439
36903
  return `/operations/resources${suffix}`;
38440
36904
  }
38441
- function commandViewPathForSystem(systemPath2) {
38442
- const suffix = systemPath2 ? `?systemPath=${encodeURIComponent(systemPath2)}` : "";
36905
+ function commandViewPathForSystem(systemPath) {
36906
+ const suffix = systemPath ? `?systemPath=${encodeURIComponent(systemPath)}` : "";
38443
36907
  return `/knowledge/command-view${suffix}`;
38444
36908
  }
38445
- function childEntries(systemPath2, system, model) {
38446
- const systems = systemPath2 ? childSystemsOf(system) : model.systems;
36909
+ function childEntries(systemPath, system, model) {
36910
+ const systems = systemPath ? childSystemsOf(system) : model.systems;
38447
36911
  return Object.entries(systems).map(([localId, child]) => {
38448
- const path = systemPath2 ? `${systemPath2}.${localId}` : localId;
36912
+ const path = systemPath ? `${systemPath}.${localId}` : localId;
38449
36913
  return {
38450
36914
  path,
38451
36915
  system: child,
@@ -38574,15 +37038,15 @@ function SubsystemCard({
38574
37038
  ] })
38575
37039
  ] }) });
38576
37040
  }
38577
- function RelatedLinks({ systemPath: systemPath2 }) {
37041
+ function RelatedLinks({ systemPath }) {
38578
37042
  return /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
38579
- /* @__PURE__ */ jsx(Button, { component: "a", href: resourcesPathForSystem(systemPath2), variant: "light", size: "xs", children: "Resources" }),
38580
- /* @__PURE__ */ jsx(Button, { component: "a", href: commandViewPathForSystem(systemPath2), variant: "light", size: "xs", children: "Command View" }),
37043
+ /* @__PURE__ */ jsx(Button, { component: "a", href: resourcesPathForSystem(systemPath), variant: "light", size: "xs", children: "Resources" }),
37044
+ /* @__PURE__ */ jsx(Button, { component: "a", href: commandViewPathForSystem(systemPath), variant: "light", size: "xs", children: "Command View" }),
38581
37045
  /* @__PURE__ */ jsx(
38582
37046
  Button,
38583
37047
  {
38584
37048
  component: "a",
38585
- href: kbPathForSystem(systemPath2),
37049
+ href: kbPathForSystem(systemPath),
38586
37050
  target: "_blank",
38587
37051
  rel: "noreferrer",
38588
37052
  variant: "light",
@@ -38649,17 +37113,17 @@ function SystemsIndex({ model, onNavigate }) {
38649
37113
  }
38650
37114
  function SystemDetail({
38651
37115
  model,
38652
- systemPath: systemPath2,
37116
+ systemPath,
38653
37117
  onNavigate
38654
37118
  }) {
38655
- const currentSystem = getSystem(model, systemPath2);
37119
+ const currentSystem = getSystem(model, systemPath);
38656
37120
  const { timeRange = "30d" } = useElevasisSystems();
38657
37121
  const rollupMode = useSystemsViewState((state) => state.rollupMode);
38658
37122
  const resourceKinds = useSystemsViewState((state) => state.resourceKinds);
38659
- const metrics = aggregateSystemMetrics(model, systemPath2);
37123
+ const metrics = aggregateSystemMetrics(model, systemPath);
38660
37124
  const includeDescendants = rollupMode === "descendants";
38661
37125
  const systemHealthQuery = useSystemHealth({
38662
- systemPath: systemPath2,
37126
+ systemPath,
38663
37127
  timeRange,
38664
37128
  includeDescendants,
38665
37129
  directResources: metrics.directResources,
@@ -38670,11 +37134,11 @@ function SystemDetail({
38670
37134
  const visibleResources = metricResources(metrics, rollupMode).filter(
38671
37135
  (resource2) => resourceKinds.length === 0 || resourceKinds.includes(resource2.kind)
38672
37136
  );
38673
- const children = childEntries(systemPath2, currentSystem, model);
38674
- const breadcrumbs = buildBreadcrumbs(model, systemPath2);
38675
- const scopedOntologyCounts = ontologyCountsForSystem(model, systemPath2);
37137
+ const children = childEntries(systemPath, currentSystem, model);
37138
+ const breadcrumbs = buildBreadcrumbs(model, systemPath);
37139
+ const scopedOntologyCounts = ontologyCountsForSystem(model, systemPath);
38676
37140
  if (!currentSystem) {
38677
- return /* @__PURE__ */ jsx(EmptyState, { icon: IconRoute, title: "System not found", description: `No semantic system exists at ${systemPath2}.` });
37141
+ return /* @__PURE__ */ jsx(EmptyState, { icon: IconRoute, title: "System not found", description: `No semantic system exists at ${systemPath}.` });
38678
37142
  }
38679
37143
  return /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
38680
37144
  /* @__PURE__ */ jsx(Breadcrumbs$1, { children: breadcrumbs.map((crumb, idx) => {
@@ -38688,9 +37152,9 @@ function SystemDetail({
38688
37152
  /* @__PURE__ */ jsx(Title, { order: 1, size: "h3", children: currentSystem.label ?? currentSystem.id }),
38689
37153
  statusBadge(metrics)
38690
37154
  ] }),
38691
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: currentSystem.description ?? systemPath2 })
37155
+ /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: currentSystem.description ?? systemPath })
38692
37156
  ] }),
38693
- /* @__PURE__ */ jsx(RelatedLinks, { systemPath: systemPath2 })
37157
+ /* @__PURE__ */ jsx(RelatedLinks, { systemPath })
38694
37158
  ] }),
38695
37159
  /* @__PURE__ */ jsxs(SimpleGrid, { cols: { base: 2, md: 4 }, spacing: "xs", children: [
38696
37160
  /* @__PURE__ */ jsx(
@@ -38759,11 +37223,11 @@ function SystemDetail({
38759
37223
  ] }) })
38760
37224
  ] });
38761
37225
  }
38762
- function SystemOpsView({ model, systemPath: systemPath2, onNavigate }) {
38763
- if (!systemPath2) {
37226
+ function SystemOpsView({ model, systemPath, onNavigate }) {
37227
+ if (!systemPath) {
38764
37228
  return /* @__PURE__ */ jsx(SystemsIndex, { model, onNavigate });
38765
37229
  }
38766
- return /* @__PURE__ */ jsx(SystemDetail, { model, systemPath: systemPath2, onNavigate });
37230
+ return /* @__PURE__ */ jsx(SystemDetail, { model, systemPath, onNavigate });
38767
37231
  }
38768
37232
  function ExecutionLogsPage({
38769
37233
  timeRange,
@@ -39242,15 +37706,15 @@ function ActivityFeed({
39242
37706
  function NotificationCenter({ pageSize = 20 }) {
39243
37707
  const { page, setPage, offset, totalPages } = usePaginationState(pageSize);
39244
37708
  const { data, isLoading } = useNotifications({ limit: pageSize, offset });
39245
- const notifications17 = data?.notifications ?? [];
37709
+ const notifications15 = data?.notifications ?? [];
39246
37710
  const markAllAsRead = useMarkAllAsRead();
39247
- const hasUnread = notifications17.some((n) => !n.read);
37711
+ const hasUnread = notifications15.some((n) => !n.read);
39248
37712
  const handleMarkAllAsRead = async () => {
39249
37713
  await markAllAsRead.mutateAsync();
39250
37714
  };
39251
37715
  return /* @__PURE__ */ jsxs(Fragment, { children: [
39252
37716
  hasUnread && /* @__PURE__ */ jsx(Group, { justify: "flex-end", children: /* @__PURE__ */ jsx(Button, { variant: "light", size: "sm", onClick: handleMarkAllAsRead, loading: markAllAsRead.isPending, children: "Mark all as read" }) }),
39253
- /* @__PURE__ */ jsx(Paper, { children: /* @__PURE__ */ jsx(NotificationList, { notifications: notifications17, isLoading }) }),
37717
+ /* @__PURE__ */ jsx(Paper, { children: /* @__PURE__ */ jsx(NotificationList, { notifications: notifications15, isLoading }) }),
39254
37718
  totalPages(data?.total ?? 0) > 1 && /* @__PURE__ */ jsx(Group, { justify: "flex-start", children: /* @__PURE__ */ jsx(Pagination, { value: page, onChange: setPage, total: totalPages(data?.total ?? 0), size: "sm", boundaries: 1 }) })
39255
37719
  ] });
39256
37720
  }
@@ -40040,21 +38504,14 @@ function MemberAccessModal({ opened, onClose, orgId, member, defaultTab = "roles
40040
38504
  ] }),
40041
38505
  /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: member.email })
40042
38506
  ] }),
40043
- /* @__PURE__ */ jsxs(Tabs, { value: activeTab, onChange: (v) => setActiveTab(v ?? "roles"), children: [
40044
- /* @__PURE__ */ jsxs(Tabs.List, { children: [
40045
- /* @__PURE__ */ jsx(Tabs.Tab, { value: "roles", leftSection: /* @__PURE__ */ jsx(IconShieldLock, { size: 14 }), children: "Roles" }),
40046
- /* @__PURE__ */ jsx(Tabs.Tab, { value: "features", leftSection: /* @__PURE__ */ jsx(IconAdjustments, { size: 14 }), children: "Feature access" })
40047
- ] }),
40048
- /* @__PURE__ */ jsx(Tabs.Panel, { value: "roles", pt: "md", children: /* @__PURE__ */ jsx(RolesTabPanel, { orgId, member, onSaved: onClose }) }),
40049
- /* @__PURE__ */ jsx(Tabs.Panel, { value: "features", pt: "md", children: /* @__PURE__ */ jsx(FeaturesTabPanel, { member, onSaved: onClose }) })
40050
- ] })
38507
+ activeTab === "roles" && /* @__PURE__ */ jsx(RolesTabPanel, { orgId, member, onSaved: onClose })
40051
38508
  ] }) });
40052
38509
  }
40053
38510
  function RolesTabPanel({ orgId, member, onSaved }) {
40054
38511
  const { data: rolesData, isLoading: rolesLoading } = useOrgRoles(orgId ?? void 0);
40055
38512
  const assignMutation = useAssignRole();
40056
38513
  const revokeMutation = useRevokeRole();
40057
- const canManagePrivileged = useHasPermission("roles.manage");
38514
+ const canManagePrivileged = useAccess(AccessKeys.rolesManage).allowed;
40058
38515
  const allRoles = rolesData?.roles ?? [];
40059
38516
  const currentRoleIds = useMemo(() => {
40060
38517
  const matched = allRoles.find((r) => r.slug === member.role);
@@ -40124,43 +38581,6 @@ function RolesTabPanel({ orgId, member, onSaved }) {
40124
38581
  ] })
40125
38582
  ] });
40126
38583
  }
40127
- function FeaturesTabPanel({ member, onSaved }) {
40128
- const [localConfig, setLocalConfig] = useState(member.config);
40129
- const mutation = useUpdateMemberConfig();
40130
- useEffect(() => {
40131
- setLocalConfig(member.config);
40132
- }, [member.config, member.id]);
40133
- const handleSave = async () => {
40134
- if (!localConfig) {
40135
- onSaved();
40136
- return;
40137
- }
40138
- try {
40139
- await mutation.mutateAsync({
40140
- membershipId: member.id,
40141
- config: localConfig
40142
- });
40143
- showSuccessNotification("Feature access updated");
40144
- onSaved();
40145
- } catch {
40146
- }
40147
- };
40148
- return /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
40149
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: "Override which features and surfaces this member can see in the Command Center. Defaults follow the organization's feature configuration." }),
40150
- /* @__PURE__ */ jsx(
40151
- MembershipFeaturePanel,
40152
- {
40153
- currentConfig: localConfig ?? member.config,
40154
- onConfigChange: (newConfig) => setLocalConfig(newConfig),
40155
- disabled: mutation.isPending
40156
- }
40157
- ),
40158
- /* @__PURE__ */ jsxs(Group, { justify: "flex-end", mt: "md", children: [
40159
- /* @__PURE__ */ jsx(Button, { variant: "default", onClick: onSaved, disabled: mutation.isPending, children: "Cancel" }),
40160
- /* @__PURE__ */ jsx(Button, { leftSection: /* @__PURE__ */ jsx(IconCheck, { size: 14 }), loading: mutation.isPending, onClick: handleSave, children: "Save feature access" })
40161
- ] })
40162
- ] });
40163
- }
40164
38584
  function transformMemberForModal(member) {
40165
38585
  const firstName = member.user?.firstName || "";
40166
38586
  const lastName = member.user?.lastName || "";
@@ -40169,8 +38589,7 @@ function transformMemberForModal(member) {
40169
38589
  id: member.id,
40170
38590
  name,
40171
38591
  email: member.user?.email || "Unknown",
40172
- role: member.role.slug,
40173
- config: member.config
38592
+ role: member.role.slug
40174
38593
  };
40175
38594
  }
40176
38595
  function OrgMembersList({ orgId }) {
@@ -40304,60 +38723,6 @@ function OrganizationSettings({ user, currentMembership, isOrgAdmin }) {
40304
38723
  ] }) })
40305
38724
  ] });
40306
38725
  }
40307
- function MemberConfigModal({ opened, onClose, member }) {
40308
- const [localConfig, setLocalConfig] = useState(void 0);
40309
- const mutation = useUpdateMemberConfig();
40310
- useEffect(() => {
40311
- if (member) {
40312
- setLocalConfig(member.config);
40313
- }
40314
- }, [member]);
40315
- useEffect(() => {
40316
- if (!opened) {
40317
- setLocalConfig(void 0);
40318
- }
40319
- }, [opened]);
40320
- if (!member) return null;
40321
- const handleSave = async () => {
40322
- if (!localConfig) {
40323
- onClose();
40324
- return;
40325
- }
40326
- try {
40327
- await mutation.mutateAsync({
40328
- membershipId: member.id,
40329
- config: localConfig
40330
- });
40331
- onClose();
40332
- } catch {
40333
- }
40334
- };
40335
- const handleClose = () => {
40336
- if (!mutation.isPending) {
40337
- onClose();
40338
- }
40339
- };
40340
- return /* @__PURE__ */ jsx(CustomModal, { opened, onClose: handleClose, size: "md", loading: mutation.isPending, children: /* @__PURE__ */ jsxs(Stack, { children: [
40341
- /* @__PURE__ */ jsx(Title, { order: 3, children: "Configure Member Access" }),
40342
- /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
40343
- /* @__PURE__ */ jsx(Text, { fw: 500, children: member.name }),
40344
- /* @__PURE__ */ jsx(Badge, { variant: "light", size: "sm", children: member.role })
40345
- ] }),
40346
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: member.email }),
40347
- /* @__PURE__ */ jsx(
40348
- MembershipFeaturePanel,
40349
- {
40350
- currentConfig: localConfig ?? member.config,
40351
- onConfigChange: (newConfig) => setLocalConfig(newConfig),
40352
- disabled: mutation.isPending
40353
- }
40354
- ),
40355
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mt: "md", children: [
40356
- /* @__PURE__ */ jsx(Button, { variant: "light", onClick: handleClose, disabled: mutation.isPending, children: "Cancel" }),
40357
- /* @__PURE__ */ jsx(Button, { onClick: handleSave, loading: mutation.isPending, children: "Save Changes" })
40358
- ] })
40359
- ] }) });
40360
- }
40361
38726
  var OAUTH_COMPLETION_CHANNEL = "elevasis-oauth";
40362
38727
  var OAUTH_COMPLETION_STORAGE_KEY = "elevasis:oauth-complete";
40363
38728
  function useOAuthFlow({ apiUrl }) {
@@ -40934,10 +39299,10 @@ function createUseOrganizations(useStore) {
40934
39299
  };
40935
39300
  };
40936
39301
  }
40937
- function createUseOrgInitialization(useOrganizations, useApiClient2) {
39302
+ function createUseOrgInitialization(useOrganizations, useApiClient) {
40938
39303
  return function useOrgInitialization() {
40939
39304
  const { user, organizationId: workosOrgId } = useAuthContext();
40940
- const { apiRequest } = useApiClient2();
39305
+ const { apiRequest } = useApiClient();
40941
39306
  const { profile } = useUserProfile();
40942
39307
  const {
40943
39308
  currentWorkOSOrganizationId,
@@ -41098,4 +39463,4 @@ function createUseOrgInitialization(useOrganizations, useApiClient2) {
41098
39463
  };
41099
39464
  }
41100
39465
 
41101
- export { AbsoluteScheduleForm, AccountSettings, ActionModal, ActivityCard, ActivityFeed, ActivityFeedWidget, ActivityFilters, ActivityLog, ActivityTable, AgentDefinitionDisplay, AgentExecutionLogs, AgentExecutionPanel, AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, AgentSessionGroup, AllTasksPage, ApiKeyDisplayModal, ApiKeyList, ApiKeyService, ApiKeySettings, AppErrorBoundary, AppearanceSettings, BaseEdge, BaseExecutionLogs, BaseExecutionLogsHeader, BaseExecutionLogsStates, BaseNode, Breadcrumbs, BusinessImpactCard, CRM_ITEMS, Can, Checklist, CheckpointGroup, CollapsibleJsonSection, CommandQueueDetailPage, CommandQueuePage, CommandQueueShell, CommandQueueSidebar, CommandQueueSidebarMiddle, CommandQueueSidebarTop, CommandQueueTaskRow, CommandViewPage, CompanyDetailPage, ConfigCard, ConfirmationInputModal, ConfirmationModal, ContactDetailPage, ContentSections, ContextUsageBadge, ContractDisplay, ConversationThread, CostAnalytics, CostBreakdownCard, CostByModelTable, CostMetricsCard, CrashErrorFallback, CreateApiKeyModal, CreateCredentialModal, CreateDeliveryEntityModal, CreateRoleModal, CreateScheduleModal, CreateWebhookEndpointModal, CredentialList, CredentialService, CredentialSettings, CrmActionsProvider, CrmOverview, CrmSettingsPage, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, CustomModal, DEAL_STAGES, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DEFAULT_KANBAN_CONFIG, DELIVERY_COMMUNICATION_ITEMS, DELIVERY_PROJECT_ITEMS, DELIVERY_WORK_ITEMS, Dashboard, DashboardOperationsOverview, DealDetailPage, DealKanbanCard, DealsListPage, DeleteScheduleModal, DeploymentDetailModal, DeploymentList, DeploymentService, DeploymentSettings, DeploymentStatusBadge, EMPTY_LIST_ACTIONS, EditApiKeyModal, EditCredentialModal, EditWebhookEndpointModal, ElevasisCoreProvider, ElevasisSystemsProvider, ElevasisUIProvider, EmptyVisualizer, ErrorAnalysisCard, ErrorBreakdownTable, ErrorDetailsModal, ErrorReportCard, ExecuteWorkflowModal, ExecutionBreakdownTable, ExecutionErrorSection, ExecutionHealth, ExecutionHealthCard, ExecutionLogsFilters, ExecutionLogsPage, ExecutionLogsTable, ExecutionPanel, ExecutionStats, ExecutionStatusBadge, FilterBar, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, HealthStatusCard, KanbanBoard, LEAD_GEN_ITEMS, LEAD_GEN_ROUTE_LINKS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, ListActionsProvider, ListBuilderIndexPage, ListBuilderPage, LogEntry, LogGroup, MdxRenderer, MemberAccessModal, MemberConfigModal, MembershipFeaturePanel, MembershipStatusBadge, MetricsStrip, MilestoneTimeline, MyTasksPanel, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, NoAccessState, NotificationBell, NotificationCenter, NotificationItem, NotificationList, NotificationPanel, NotificationProvider, OAuthConnectModal, OAuthIntegrationsCard, ORGANIZATION_GRAPH_NODE_KIND_LABELS, ORPHAN_STAGE_ORDER, OperationsOverview, OperationsService, OperationsSidebar, OperationsSidebarMiddle, OperationsSidebarTop, OrgMembersList, OrganizationGraphPage, OrganizationMembershipService, OrganizationMembershipsList, OrganizationProvider, OrganizationSettings, OrganizationSwitcher, OrganizationSwitcherConnected, PIPELINE_FUNNEL_ORDER, PermissionMatrix, PipelineFunnelWidget, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, QuickCreateActions, RecentExecutionsByResource, RecurringScheduleForm, RelativeScheduleForm, ResourceDefinitionSection, ResourceDetailPage, ResourceErrorState, ResourceFilter, ResourceHeader, ResourceHealthChart, ResourceHealthPanel, ResourceNotFoundState, ResourceOverview, ResourcesPage, ResourcesSidebar, RichTextEditor, RoleBadge, RunResourceButton, SAVED_VIEW_PRESETS, SavedViewsPanel, ScheduleCard, ScheduleDetailModal, ScheduleTypeSelector, SessionChatArea, SessionChatInterface, SessionChatPage, SessionDetailsSidebar, SessionExecutionLogs, SessionHeader, SessionListItem, SessionMemory, SessionsPage, SessionsSidebar, SortableHeader, StepConfigForm, SystemOpsView, SystemShell, TabSection, TableSelectionToolbar, TaskCard, TaskScheduler, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, ToolsListDisplay, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, UnresolvedErrorsTeaser, UpcomingMilestonesPage, VisualizerContainer, WebhookEndpointList, WebhookEndpointService, WebhookEndpointSettings, WebhookUrlDisplayModal, WorkflowDefinitionDisplay, WorkflowExecutionLogs, WorkflowExecutionPanel, WorkflowExecutionTimeline, ZodFormRenderer, acquisitionListKeys, aggregateSystemMetrics, buildErrorReport, calculateProgress, clientsKeys, collectResourceFilterFacets, companyKeys, contactKeys, createFeatureAccessHook, createOrganizationsSlice, createTestSystemsProvider, createUseOrgInitialization, createUseOrganizations, crmManifest, crmPrioritySettingsKeys, dealKeys, dealNoteKeys, dealTaskKeys, deliveryManifest, deriveBusinessProgress, executionsKeys, filterByDomainFilters, findListActionByAction, formatDate3 as formatDate, formatDealStageLabel, formatResourceAttribution, formatStatusLabel, getEnrichmentColor, getEnrichmentStatus, getExecutionStatusConfig, getGraphBackgroundStyles, getHealthColor, getIcon, getListActionWorkflowId, getLogLevelConfig, getResourceFilterFacetIds, getStateKeyColor, getStatusColor4 as getStatusColor, getStepActionLabel, iconMap, isSessionCapable, labelResourceFilterFacet, leadGenArtifactKeys, leadGenListCompanyKeys, leadGenListMemberKeys, leadGenManifest, mdxComponents, milestoneKeys, milestoneStatusColors, monitoringManifest, noteKeys, noteTypeColors, operationsKeys, operationsManifest, projectActivityKeys, projectKeys, projectStatusColors, requestsKeys, resolveBuildPlanSteps, resolveBuildState, scheduleKeys, sessionsKeys, settingsManifest, showApiErrorNotification, showAuthError, showErrorNotification, showInfoNotification, showSuccessNotification, showWarningNotification, sortData, sortStageKeys, taskKeys, taskStatusColors, taskTypeColors, useActivateDeployment, useActivities, useActivitiesRealtime, useActivityFilters, useActivityTrend, useAddCompaniesToList, useAddContactsToList, useArchiveSession, useArchivedLogs, useArtifacts, useAssignRole, useBatchDelete, useBatchTelemetry, useBatchedResourcesHealth, useBreadcrumbs, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useClient, useClientStatus, useClients, useCommandQueue, useCommandQueueTotals, useCommandViewData, useCommandViewDomainFilters, useCommandViewStats, useCommandViewStore, useCompanies, useCompany, useCompanyFacets, useCompleteDealTask, useContact, useContacts, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateApiKey, useCreateArtifact, useCreateClient, useCreateCompany, useCreateContact, useCreateCredential, useCreateDealNote, useCreateDealTask, useCreateList, useCreateMilestone, useCreateNote, useCreateOrgRole, useCreateProject, useCreateSchedule, useCreateSession, useCreateTask, useCreateWebhookEndpoint, useCredentials, useCrmActions, useCrmPipelineSummary, useCrmPrioritySettings, useCrmQuickMetrics, useDashboardMetrics, useDeactivateDeployment, useDeactivateMembership, useDealDetail, useDealNotes, useDealTasks, useDealTasksDue, useDeals, useDealsLookup, useDealsSummary, useDeleteApiKey, useDeleteClient, useDeleteCompanies, useDeleteContacts, useDeleteCredential, useDeleteDeal, useDeleteDeployment, useDeleteExecution, useDeleteList, useDeleteLists, useDeleteMilestone, useDeleteOrgRole, useDeleteProject, useDeleteRequest, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeleteTask2, useDeleteWebhookEndpoint, useDeriveActions, useEffectivePermissions, useElevasisSystems, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useExecuteAction, useExecuteAsync, useExecuteResource, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionLogsFilters, useExecutionPanelState, useExecutionSSE, useExecutions, useGetExecutionHistory, useGetSchedule, useGraphBackgroundStyles, useGraphTheme, useHasPermission, useInFlightExecutions, useLeadGenConfig, useList, useListActions, useListApiKeys, useListDeployments, useListExecutions, useListMember, useListMembers, useListProgress, useListRecords, useListSchedules, useListWebhookEndpoints, useLists, useListsTelemetry, useMarkAllAsRead, useMarkAsRead, useMilestones, useNewKnowledgeMapLayout, useNotificationAdapter, useNotificationCount, useNotifications, useOptionalElevasisSystems, useOrgRoles, useOrganizationMembers, useOrganizationPermissions, usePaginationState, usePatchTask, usePauseSchedule, usePermissionCatalog, useProject, useProjectActivities, useProjectMilestones, useProjectNotes, useProjectRealtime, useProjectTasks, useProjects, useReactivateMembership, useRecentCrmActivity, useRecentExecutionsByResource, useRemoveCompaniesFromList, useRequest, useRequestsList, useResetCrmPrioritySettings, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResolvedOrganizationModel, useResourceDefinition, useResourceErrors, useResourceExecutions, useResourceSearch, useResources, useResourcesDomainFilters, useResourcesHealth, useResumeSchedule, useRetryExecution, useRevokeRole, useSSEConnection, useScheduledTasks, useSession, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useStatusFilter, useSubmitAction, useSuccessNotification, useSystemHealth, useTableSelection, useTableSort, useTasks, useTestNotification, useTimeRangeDates, useTopFailingResources, useTransitionItem, useTransitionListCompany, useTransitionListMember, useTransitionState, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateApiKey, useUpdateClient, useUpdateCompany, useUpdateContact, useUpdateCredential, useUpdateCrmPrioritySettings, useUpdateList, useUpdateListConfig, useUpdateListStatus, useUpdateMemberConfig, useUpdateMilestone, useUpdateOrgRole, useUpdateProject, useUpdateRequestStatus, useUpdateSchedule, useUpdateTask, useUpdateWebhookEndpoint, useUserMemberships, useVerifyCredential, useVisibleResources, useWarningNotification, useWorkflowExecution };
39466
+ export { AbsoluteScheduleForm, AccountSettings, ActionModal, ActivityCard, ActivityFeed, ActivityFeedWidget, ActivityFilters, ActivityLog, ActivityTable, AgentDefinitionDisplay, AgentExecutionLogs, AgentExecutionPanel, AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, AgentSessionGroup, AllTasksPage, ApiKeyDisplayModal, ApiKeyList, ApiKeyService, ApiKeySettings, AppearanceSettings, BaseEdge, BaseExecutionLogs, BaseExecutionLogsHeader, BaseExecutionLogsStates, BaseNode, Breadcrumbs, BusinessImpactCard, CRM_ITEMS, Checklist, CheckpointGroup, CollapsibleJsonSection, CommandQueueDetailPage, CommandQueuePage, CommandQueueShell, CommandQueueSidebar, CommandQueueSidebarMiddle, CommandQueueSidebarTop, CommandQueueTaskRow, CommandViewPage, CompanyDetailPage, ConfigCard, ConfirmationInputModal, ConfirmationModal, ContactDetailPage, ContentSections, ContextUsageBadge, ContractDisplay, ConversationThread, CostAnalytics, CostBreakdownCard, CostByModelTable, CostMetricsCard, CreateApiKeyModal, CreateCredentialModal, CreateDeliveryEntityModal, CreateRoleModal, CreateScheduleModal, CreateWebhookEndpointModal, CredentialList, CredentialService, CredentialSettings, CrmOverview, CrmSettingsPage, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, CustomModal, DEAL_STAGES, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DEFAULT_KANBAN_CONFIG, DELIVERY_COMMUNICATION_ITEMS, DELIVERY_PROJECT_ITEMS, DELIVERY_WORK_ITEMS, Dashboard, DashboardOperationsOverview, DealDetailPage, DealKanbanCard, DealsListPage, DeleteScheduleModal, DeploymentDetailModal, DeploymentList, DeploymentService, DeploymentSettings, DeploymentStatusBadge, EditApiKeyModal, EditCredentialModal, EditWebhookEndpointModal, EmptyVisualizer, ErrorAnalysisCard, ErrorBreakdownTable, ErrorDetailsModal, ExecuteWorkflowModal, ExecutionBreakdownTable, ExecutionErrorSection, ExecutionHealth, ExecutionHealthCard, ExecutionLogsFilters, ExecutionLogsPage, ExecutionLogsTable, ExecutionPanel, ExecutionStats, ExecutionStatusBadge, FilterBar, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, HealthStatusCard, KanbanBoard, LEAD_GEN_ITEMS, LEAD_GEN_ROUTE_LINKS, LeadGenCompaniesPage, LeadGenContactsPage, LeadGenListDetailPage, LeadGenListsPage, LeadGenOverviewPage, LeadGenRouteShell, LeadGenSidebar, LeadGenSidebarMiddle, LeadGenSidebarTop, ListBuilderIndexPage, ListBuilderPage, LogEntry, LogGroup, MdxRenderer, MemberAccessModal, MembershipStatusBadge, MetricsStrip, MilestoneTimeline, MyTasksPanel, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, NoAccessState, NotificationBell, NotificationCenter, NotificationItem, NotificationList, NotificationPanel, OAuthConnectModal, OAuthIntegrationsCard, ORPHAN_STAGE_ORDER, OperationsOverview, OperationsService, OperationsSidebar, OperationsSidebarMiddle, OperationsSidebarTop, OrgMembersList, OrganizationGraphPage, OrganizationMembershipService, OrganizationMembershipsList, OrganizationSettings, OrganizationSwitcher, OrganizationSwitcherConnected, PIPELINE_FUNNEL_ORDER, PermissionMatrix, PipelineFunnelWidget, ProjectDetailPage, ProjectsListPage, ProjectsSidebar, ProjectsSidebarMiddle, ProjectsSidebarTop, QuickCreateActions, RecentExecutionsByResource, RecurringScheduleForm, RelativeScheduleForm, ResourceDefinitionSection, ResourceDetailPage, ResourceErrorState, ResourceFilter, ResourceHeader, ResourceHealthChart, ResourceHealthPanel, ResourceNotFoundState, ResourceOverview, ResourcesPage, ResourcesSidebar, RichTextEditor, RoleBadge, RunResourceButton, SAVED_VIEW_PRESETS, SavedViewsPanel, ScheduleCard, ScheduleDetailModal, ScheduleTypeSelector, SessionChatArea, SessionChatInterface, SessionChatPage, SessionDetailsSidebar, SessionExecutionLogs, SessionHeader, SessionListItem, SessionMemory, SessionsPage, SessionsSidebar, SortableHeader, StepConfigForm, SystemOpsView, TabSection, TableSelectionToolbar, TaskCard, TaskScheduler, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, ToolsListDisplay, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, UnresolvedErrorsTeaser, UpcomingMilestonesPage, VisualizerContainer, WebhookEndpointList, WebhookEndpointService, WebhookEndpointSettings, WebhookUrlDisplayModal, WorkflowDefinitionDisplay, WorkflowExecutionLogs, WorkflowExecutionPanel, WorkflowExecutionTimeline, ZodFormRenderer, acquisitionListKeys, aggregateSystemMetrics, calculateProgress, clientsKeys, collectResourceFilterFacets, companyKeys, contactKeys, createOrganizationsSlice, createUseOrgInitialization, createUseOrganizations, crmManifest, crmPrioritySettingsKeys, dealKeys, dealNoteKeys, dealTaskKeys, deliveryManifest, deriveBusinessProgress, executionsKeys, filterByDomainFilters, formatDate3 as formatDate, formatDealStageLabel, formatResourceAttribution, formatStatusLabel, getEnrichmentColor, getEnrichmentStatus, getExecutionStatusConfig, getGraphBackgroundStyles, getHealthColor, getIcon, getLeadGenExportWorkflowId, getLogLevelConfig, getResourceFilterFacetIds, getStateKeyColor, getStatusColor4 as getStatusColor, getStepActionLabel, iconMap, isLeadGenExportAction, isSessionCapable, labelResourceFilterFacet, leadGenArtifactKeys, leadGenListCompanyKeys, leadGenListMemberKeys, leadGenManifest, mdxComponents, milestoneKeys, milestoneStatusColors, monitoringManifest, noteKeys, noteTypeColors, operationsKeys, operationsManifest, projectActivityKeys, projectKeys, projectStatusColors, requestsKeys, resolveBuildPlanSteps, resolveBuildState, scheduleKeys, sessionsKeys, settingsManifest, showApiErrorNotification, showAuthError, showErrorNotification, showInfoNotification, showSuccessNotification, showWarningNotification, sortData, sortStageKeys, taskKeys, taskStatusColors, taskTypeColors, useActivateDeployment, useActivities, useActivitiesRealtime, useActivityFilters, useActivityTrend, useAddCompaniesToList, useAddContactsToList, useArchiveSession, useArchivedLogs, useArtifacts, useAssignRole, useBatchDelete, useBatchTelemetry, useBatchedResourcesHealth, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useClient, useClientStatus, useClients, useCommandQueue, useCommandQueueTotals, useCommandViewData, useCommandViewDomainFilters, useCommandViewStats, useCommandViewStore, useCompanies, useCompany, useCompanyFacets, useCompleteDealTask, useContact, useContacts, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateApiKey, useCreateArtifact, useCreateClient, useCreateCompany, useCreateContact, useCreateCredential, useCreateDealNote, useCreateDealTask, useCreateList, useCreateMilestone, useCreateNote, useCreateOrgRole, useCreateProject, useCreateSchedule, useCreateSession, useCreateTask, useCreateWebhookEndpoint, useCredentials, useCrmPipelineSummary, useCrmPrioritySettings, useCrmQuickMetrics, useDashboardMetrics, useDeactivateDeployment, useDeactivateMembership, useDealDetail, useDealNotes, useDealTasks, useDealTasksDue, useDeals, useDealsLookup, useDealsSummary, useDeleteApiKey, useDeleteClient, useDeleteCompanies, useDeleteContacts, useDeleteCredential, useDeleteDeal, useDeleteDeployment, useDeleteExecution, useDeleteList, useDeleteLists, useDeleteMilestone, useDeleteOrgRole, useDeleteProject, useDeleteRequest, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeleteTask2, useDeleteWebhookEndpoint, useDeriveActions, useEffectivePermissions, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useExecuteAction, useExecuteAsync, useExecuteResource, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionLogsFilters, useExecutionPanelState, useExecutionSSE, useExecutions, useGetExecutionHistory, useGetSchedule, useGraphBackgroundStyles, useGraphTheme, useInFlightExecutions, useLeadGenConfig, useList, useListApiKeys, useListDeployments, useListExecutions, useListMember, useListMembers, useListProgress, useListRecords, useListSchedules, useListWebhookEndpoints, useLists, useListsTelemetry, useMarkAllAsRead, useMarkAsRead, useMilestones, useNewKnowledgeMapLayout, useNotificationCount, useNotifications, useOrgRoles, useOrganizationMembers, usePaginationState, usePatchTask, usePauseSchedule, usePermissionCatalog, useProject, useProjectActivities, useProjectMilestones, useProjectNotes, useProjectRealtime, useProjectTasks, useProjects, useReactivateMembership, useRecentCrmActivity, useRecentExecutionsByResource, useRemoveCompaniesFromList, useRequest, useRequestsList, useResetCrmPrioritySettings, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResourceDefinition, useResourceErrors, useResourceExecutions, useResourceSearch, useResources, useResourcesDomainFilters, useResourcesHealth, useResumeSchedule, useRetryExecution, useRevokeRole, useSSEConnection, useScheduledTasks, useSession, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useStatusFilter, useSubmitAction, useSuccessNotification, useSystemHealth, useTableSelection, useTableSort, useTasks, useTestNotification, useTimeRangeDates, useTopFailingResources, useTransitionItem, useTransitionListCompany, useTransitionListMember, useTransitionState, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateApiKey, useUpdateClient, useUpdateCompany, useUpdateContact, useUpdateCredential, useUpdateCrmPrioritySettings, useUpdateList, useUpdateListConfig, useUpdateListStatus, useUpdateMilestone, useUpdateOrgRole, useUpdateProject, useUpdateRequestStatus, useUpdateSchedule, useUpdateTask, useUpdateWebhookEndpoint, useUserMemberships, useVerifyCredential, useVisibleResources, useWarningNotification, useWorkflowExecution };