@elevasis/ui 2.10.2 → 2.12.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 (46) hide show
  1. package/dist/app/index.js +2 -2
  2. package/dist/{chunk-YQLE5HR5.js → chunk-235RO24Z.js} +2 -2
  3. package/dist/chunk-3ZMAGTWF.js +18 -0
  4. package/dist/{chunk-AT5XCBTU.js → chunk-7PLBPEBW.js} +2 -2
  5. package/dist/chunk-BRXELOHC.js +47 -0
  6. package/dist/{chunk-KYOF6NYW.js → chunk-ETWKPFOO.js} +1 -1
  7. package/dist/{chunk-M6ZZ2FW5.js → chunk-F6SMVMFC.js} +3 -3
  8. package/dist/{chunk-GJVGV7QZ.js → chunk-GHCYUZZE.js} +276 -5
  9. package/dist/{chunk-XA34RETF.js → chunk-GHIPBT5V.js} +1 -14
  10. package/dist/{chunk-TSX4I3NW.js → chunk-ISVFJCPP.js} +1 -1
  11. package/dist/{chunk-WHQXDETX.js → chunk-MISBW6WW.js} +124 -5
  12. package/dist/{chunk-LPSBID5V.js → chunk-PXFV47B3.js} +1 -1
  13. package/dist/{chunk-CLXMNMIS.js → chunk-TXZXMTZB.js} +652 -110
  14. package/dist/{chunk-6PNHW4X2.js → chunk-TYWZABTP.js} +115 -137
  15. package/dist/{chunk-E3IFHX6A.js → chunk-WM7JTTPX.js} +494 -311
  16. package/dist/{chunk-CYT4PORT.js → chunk-ZKCQEHEJ.js} +7 -51
  17. package/dist/components/index.d.ts +241 -3
  18. package/dist/components/index.js +20 -18
  19. package/dist/execution/index.js +2 -1
  20. package/dist/features/auth/index.d.ts +85 -0
  21. package/dist/features/crm/index.d.ts +94 -2
  22. package/dist/features/crm/index.js +6 -4
  23. package/dist/features/dashboard/index.js +7 -5
  24. package/dist/features/delivery/index.d.ts +132 -13
  25. package/dist/features/delivery/index.js +6 -4
  26. package/dist/features/lead-gen/index.js +10 -8
  27. package/dist/features/monitoring/index.js +8 -6
  28. package/dist/features/operations/index.js +9 -7
  29. package/dist/features/settings/index.d.ts +85 -0
  30. package/dist/features/settings/index.js +7 -5
  31. package/dist/hooks/index.d.ts +426 -52
  32. package/dist/hooks/index.js +5 -3
  33. package/dist/hooks/published.d.ts +426 -52
  34. package/dist/hooks/published.js +5 -3
  35. package/dist/index.d.ts +387 -23
  36. package/dist/index.js +7 -5
  37. package/dist/initialization/index.d.ts +85 -0
  38. package/dist/profile/index.d.ts +85 -0
  39. package/dist/provider/index.js +2 -2
  40. package/dist/supabase/index.d.ts +166 -0
  41. package/dist/supabase/index.js +2 -47
  42. package/dist/theme/index.js +2 -2
  43. package/dist/types/index.d.ts +86 -1
  44. package/dist/zustand/index.d.ts +0 -4
  45. package/dist/zustand/index.js +0 -10
  46. package/package.json +4 -4
package/dist/app/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { ElevasisUIProvider } from '../chunk-LPSBID5V.js';
2
- import '../chunk-6PNHW4X2.js';
1
+ import { ElevasisUIProvider } from '../chunk-PXFV47B3.js';
2
+ import '../chunk-TYWZABTP.js';
3
3
  import '../chunk-F4TPY6YL.js';
4
4
  import '../chunk-R7WLWGPO.js';
5
5
  import '../chunk-SZHARWKU.js';
@@ -2,8 +2,8 @@ import { FilterBar } from './chunk-PDHTXPSF.js';
2
2
  import { CustomModal } from './chunk-GBMNCNHX.js';
3
3
  import { CyberAreaChart, CostTrendChart, ActivityTrendChart } from './chunk-STZJ7SY5.js';
4
4
  import { AppShellLoader } from './chunk-YEX4MQSY.js';
5
- import { formatDuration } from './chunk-XA34RETF.js';
6
- import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogsFilters, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useTimeRangeDates, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityFilters, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead, useTestNotification } from './chunk-E3IFHX6A.js';
5
+ import { formatDuration } from './chunk-GHIPBT5V.js';
6
+ import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead, useExecutionLogsFilters, useExecutionLogs, useExecutionHealth, useErrorAnalysis, useTimeRangeDates, useErrorDetail, useResolveErrorsByExecution, useResources, useCostTrends, useCostSummary, useCostByModel, useCostBreakdown, useActivityFilters, useActivityTrend, useActivities, useNotifications, useMarkAllAsRead, useTestNotification } from './chunk-WM7JTTPX.js';
7
7
  import { formatBucketTime, getTimeRangeDates } from './chunk-LXHZYSMQ.js';
8
8
  import { CenteredErrorState, CardHeader, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, EmptyState, PageTitleCaption, JsonViewer } from './chunk-SQQGLGHW.js';
9
9
  import { PAGE_SIZE_DEFAULT } from './chunk-IOKL7BKE.js';
@@ -0,0 +1,18 @@
1
+ import { useMemo } from 'react';
2
+
3
+ // src/execution/hooks/useMergedExecution.ts
4
+ function useMergedExecution(fetchedExecution, streamingLogs) {
5
+ return useMemo(() => {
6
+ if (!fetchedExecution) return void 0;
7
+ if (!streamingLogs || streamingLogs.length === 0) return fetchedExecution;
8
+ const existingKeys = new Set(fetchedExecution.executionLogs.map((log) => `${log.timestamp}:${log.message}`));
9
+ const newLogs = streamingLogs.filter((log) => !existingKeys.has(`${log.timestamp}:${log.message}`));
10
+ if (newLogs.length === 0) return fetchedExecution;
11
+ return {
12
+ ...fetchedExecution,
13
+ executionLogs: [...fetchedExecution.executionLogs, ...newLogs].sort((a, b) => a.timestamp - b.timestamp)
14
+ };
15
+ }, [fetchedExecution, streamingLogs]);
16
+ }
17
+
18
+ export { useMergedExecution };
@@ -1,11 +1,11 @@
1
- import { ResourceExecuteDialog } from './chunk-CYT4PORT.js';
1
+ import { ResourceExecuteDialog } from './chunk-ZKCQEHEJ.js';
2
2
  import { TableSelectionToolbar, SortableHeader } from './chunk-TUMSNGTX.js';
3
3
  import { PageContainer } from './chunk-BZZCNLT6.js';
4
4
  import { SubshellNavItem } from './chunk-CEWTOKE7.js';
5
5
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
6
6
  import { FilterBar } from './chunk-PDHTXPSF.js';
7
7
  import { CustomModal } from './chunk-GBMNCNHX.js';
8
- import { showApiErrorNotification, acquisitionListKeys, showSuccessNotification, useListsTelemetry, useLists, useCreateList, useTableSort, sortData, usePaginationState, useTableSelection, useList, useListProgress, useListExecutions, useResourceDefinition, useCompanies, useDeleteCompanies, useContacts, useDeleteContacts } from './chunk-E3IFHX6A.js';
8
+ import { showApiErrorNotification, acquisitionListKeys, showSuccessNotification, useListsTelemetry, useLists, useCreateList, useTableSort, sortData, usePaginationState, useTableSelection, useList, useListProgress, useListExecutions, useResourceDefinition, useCompanies, useDeleteCompanies, useContacts, useDeleteContacts } from './chunk-WM7JTTPX.js';
9
9
  import { SubshellContentContainer } from './chunk-RX4UWZZR.js';
10
10
  import { PageTitleCaption, CenteredErrorState, StatCard, EmptyState } from './chunk-SQQGLGHW.js';
11
11
  import { useElevasisServices } from './chunk-QEPXAWE2.js';
@@ -0,0 +1,47 @@
1
+ import { useAuthContext } from './chunk-BRJ3QZ4E.js';
2
+ import { createClient } from '@supabase/supabase-js';
3
+ import { useMemo } from 'react';
4
+
5
+ function getSupabaseConfig() {
6
+ const url = import.meta.env?.VITE_SUPABASE_URL;
7
+ const anonKey = import.meta.env?.VITE_SUPABASE_ANON_KEY;
8
+ if (!url || !anonKey) {
9
+ throw new Error("Missing Supabase environment variables (VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY)");
10
+ }
11
+ return { url, anonKey };
12
+ }
13
+ var _supabase = null;
14
+ function getSupabaseClient() {
15
+ if (!_supabase) {
16
+ const { url, anonKey } = getSupabaseConfig();
17
+ _supabase = createClient(url, anonKey);
18
+ }
19
+ return _supabase;
20
+ }
21
+ var useSupabase = () => {
22
+ const { getAccessToken } = useAuthContext();
23
+ const { url, anonKey } = getSupabaseConfig();
24
+ return useMemo(
25
+ () => createClient(url, anonKey, {
26
+ global: {
27
+ headers: {
28
+ // Additional headers if needed
29
+ }
30
+ },
31
+ accessToken: async () => {
32
+ try {
33
+ const token = await getAccessToken();
34
+ if (!token) {
35
+ return null;
36
+ }
37
+ return token;
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+ }),
43
+ [getAccessToken, url, anonKey]
44
+ );
45
+ };
46
+
47
+ export { getSupabaseClient, useSupabase };
@@ -1,4 +1,4 @@
1
- import { usePresetsContext } from './chunk-6PNHW4X2.js';
1
+ import { usePresetsContext } from './chunk-TYWZABTP.js';
2
2
  import { useMemo } from 'react';
3
3
 
4
4
  var BUILT_IN_NAMES = /* @__PURE__ */ new Set([
@@ -1,8 +1,8 @@
1
1
  import { FilterBar } from './chunk-PDHTXPSF.js';
2
2
  import { CustomModal } from './chunk-GBMNCNHX.js';
3
3
  import { AppShellLoader } from './chunk-YEX4MQSY.js';
4
- import { useAvailablePresets } from './chunk-KYOF6NYW.js';
5
- import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useResources, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas, showErrorNotification } from './chunk-E3IFHX6A.js';
4
+ import { useAvailablePresets } from './chunk-ETWKPFOO.js';
5
+ import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, useUserMemberships, useUpdateWebhookEndpoint, useResources, useDeleteWebhookEndpoint, useCreateWebhookEndpoint, useListWebhookEndpoints, useUpdateMemberConfig, useOrganizationMembers, useUpdateCredential, CredentialSchemas, showErrorNotification } from './chunk-WM7JTTPX.js';
6
6
  import { ListSkeleton, EmptyState, PageTitleCaption, CardHeader, APIErrorAlert, StatCard } from './chunk-SQQGLGHW.js';
7
7
  import { formatDateTime, OAUTH_POPUP_CHECK_INTERVAL, OAUTH_FLOW_TIMEOUT } from './chunk-IOKL7BKE.js';
8
8
  import { useInitialization } from './chunk-TUXTSEAF.js';
@@ -1444,7 +1444,7 @@ function WebhookEndpointSettings({ apiUrl }) {
1444
1444
  };
1445
1445
  const activeCount = endpoints.filter((e) => e.status === "active").length;
1446
1446
  const totalRequests = endpoints.reduce((sum, e) => sum + e.requestCount, 0);
1447
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1447
+ return /* @__PURE__ */ jsxs(Stack, { children: [
1448
1448
  /* @__PURE__ */ jsx(
1449
1449
  PageTitleCaption,
1450
1450
  {
@@ -1,21 +1,24 @@
1
1
  import { ResourceHealthChart } from './chunk-LGKLC5MG.js';
2
2
  import { useCyberColors, HeroStatsRow } from './chunk-STZJ7SY5.js';
3
3
  import { AppShellCenteredContainer, AppShellLoader } from './chunk-YEX4MQSY.js';
4
- import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent } from './chunk-XA34RETF.js';
5
- import { useDashboardMetrics, useResources, useTimeRangeDates, useUnresolvedErrors, useRecentExecutionsByResource, useCommandQueue, useScheduledTasks, useResourcesHealth } from './chunk-E3IFHX6A.js';
4
+ import { STATUS_COLORS, getStatusIcon, formatDuration, getStatusColors, AGENT_CONSTANTS, shouldAnimateEdge, TIMELINE_CONSTANTS, calculateBarPosition, CONTAINER_CONSTANTS, useExecutionPath, useUnifiedWorkflowLayout, WORKFLOW_CONSTANTS, useReactFlowAgent } from './chunk-GHIPBT5V.js';
5
+ import { useExecuteResource, useDashboardMetrics, useResources, useTimeRangeDates, useUnresolvedErrors, useRecentExecutionsByResource, useCommandQueue, useScheduledTasks, useResourcesHealth } from './chunk-WM7JTTPX.js';
6
6
  import { getTimeRangeDates } from './chunk-LXHZYSMQ.js';
7
7
  import { Graph_module_css_default, useDirectedChainHighlighting, useNodeSelection, useFitViewTrigger } from './chunk-22UVE3RA.js';
8
- import { glassBase } from './chunk-6PNHW4X2.js';
8
+ import { glassBase } from './chunk-TYWZABTP.js';
9
9
  import { GlowDot, CardHeader, EmptyState, PageTitleCaption, TabCountBadge } from './chunk-SQQGLGHW.js';
10
10
  import { ResourceStatusColors } from './chunk-ELJIFLCB.js';
11
11
  import { formatTimeAgo, formatRelativeTime } from './chunk-IOKL7BKE.js';
12
12
  import { useInitialization } from './chunk-TUXTSEAF.js';
13
13
  import { memo, useMemo, useEffect, useState, useCallback, Fragment } from 'react';
14
- import { Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Card, ActionIcon, Loader, SegmentedControl, Center, SimpleGrid, Title, Tabs, Grid, ThemeIcon } from '@mantine/core';
14
+ import { Paper, Stack, Text, Group, Badge, Box, useComputedColorScheme, Card, ActionIcon, Loader, SegmentedControl, TextInput, Textarea, Radio, Checkbox, Select, NumberInput, Button, Modal, Center, SimpleGrid, Title, Tabs, Grid, ThemeIcon } from '@mantine/core';
15
15
  import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
16
16
  import { Position, Handle, getSmoothStepPath, BaseEdge as BaseEdge$1, EdgeLabelRenderer, Panel, useReactFlow, Controls, ReactFlowProvider, ReactFlow } from '@xyflow/react';
17
17
  import { IconPlayerPlay, IconPlayerStop, IconArrowsSplit, IconSquare, IconFocus2, IconArrowUpRight, IconLayoutDashboard, IconActivity, IconAlertTriangle, IconHandStop, IconCalendarEvent, IconCircleCheck, IconBrain, IconGitBranch } from '@tabler/icons-react';
18
18
  import '@xyflow/react/dist/style.css';
19
+ import { z } from 'zod';
20
+ import { notifications } from '@mantine/notifications';
21
+ import { useForm } from '@mantine/form';
19
22
  import '@mantine/charts/styles.css';
20
23
 
21
24
  var DOMAIN_COLORS = {
@@ -1192,6 +1195,274 @@ function AgentExecutionTimeline({ iterationData, selectedIterationId }) {
1192
1195
  )
1193
1196
  ] });
1194
1197
  }
1198
+ function FormFieldRenderer({ field, form, richTextRenderer }) {
1199
+ const commonProps = {
1200
+ label: field.label,
1201
+ description: field.description,
1202
+ placeholder: field.placeholder,
1203
+ required: field.required,
1204
+ ...form.getInputProps(field.name)
1205
+ };
1206
+ switch (field.type) {
1207
+ case "text":
1208
+ return /* @__PURE__ */ jsx(TextInput, { ...commonProps });
1209
+ case "textarea":
1210
+ return /* @__PURE__ */ jsx(Textarea, { ...commonProps, minRows: 3, autosize: true });
1211
+ case "number":
1212
+ return /* @__PURE__ */ jsx(NumberInput, { ...commonProps, min: field.min, max: field.max });
1213
+ case "select":
1214
+ return /* @__PURE__ */ jsx(
1215
+ Select,
1216
+ {
1217
+ ...commonProps,
1218
+ data: field.options?.map((opt) => ({
1219
+ label: opt.label,
1220
+ value: String(opt.value)
1221
+ })) || []
1222
+ }
1223
+ );
1224
+ case "checkbox":
1225
+ return /* @__PURE__ */ jsx(Checkbox, { ...commonProps, ...form.getInputProps(field.name, { type: "checkbox" }) });
1226
+ case "radio":
1227
+ return /* @__PURE__ */ jsx(Radio.Group, { ...commonProps, children: /* @__PURE__ */ jsx(Stack, { gap: "xs", children: field.options?.map((opt) => /* @__PURE__ */ jsx(Radio, { value: String(opt.value), label: opt.label }, opt.value)) }) });
1228
+ case "richtext": {
1229
+ const inputProps = form.getInputProps(field.name);
1230
+ if (richTextRenderer) {
1231
+ return richTextRenderer({
1232
+ content: inputProps.value || "",
1233
+ onChange: (content) => form.setFieldValue(field.name, content),
1234
+ placeholder: field.placeholder
1235
+ });
1236
+ }
1237
+ return /* @__PURE__ */ jsx(Textarea, { ...commonProps, minRows: 5, autosize: true });
1238
+ }
1239
+ default:
1240
+ return /* @__PURE__ */ jsx(TextInput, { ...commonProps });
1241
+ }
1242
+ }
1243
+ function getTypeName(schema) {
1244
+ return schema._def.typeName;
1245
+ }
1246
+ function unwrapOptionalOrNullable(schema) {
1247
+ const name = getTypeName(schema);
1248
+ if (name === "ZodOptional" || name === "ZodNullable") {
1249
+ return unwrapOptionalOrNullable(schema._def.innerType);
1250
+ }
1251
+ if (name === "ZodDefault") {
1252
+ return unwrapOptionalOrNullable(schema._def.innerType);
1253
+ }
1254
+ return schema;
1255
+ }
1256
+ function getDefaultValue(schema) {
1257
+ const name = getTypeName(schema);
1258
+ if (name === "ZodDefault") {
1259
+ const def = schema._def;
1260
+ return def.defaultValue();
1261
+ }
1262
+ if (name === "ZodOptional" || name === "ZodNullable") {
1263
+ return getDefaultValue(schema._def.innerType);
1264
+ }
1265
+ return void 0;
1266
+ }
1267
+ function zodTypeToFormField(name, fieldSchema, required) {
1268
+ const inner = unwrapOptionalOrNullable(fieldSchema);
1269
+ const typeName = getTypeName(inner);
1270
+ const label = name.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase());
1271
+ switch (typeName) {
1272
+ case "ZodString": {
1273
+ const checks = inner._def.checks ?? [];
1274
+ const maxCheck = checks.find((c) => c.kind === "max");
1275
+ const isLong = maxCheck ? (maxCheck.value ?? 0) > 200 : false;
1276
+ return {
1277
+ name,
1278
+ label,
1279
+ type: isLong ? "textarea" : "text",
1280
+ required,
1281
+ placeholder: "",
1282
+ description: "",
1283
+ defaultValue: ""
1284
+ };
1285
+ }
1286
+ case "ZodNumber":
1287
+ return {
1288
+ name,
1289
+ label,
1290
+ type: "number",
1291
+ required,
1292
+ placeholder: "",
1293
+ description: "",
1294
+ defaultValue: 0
1295
+ };
1296
+ case "ZodBoolean":
1297
+ return {
1298
+ name,
1299
+ label,
1300
+ type: "checkbox",
1301
+ required,
1302
+ placeholder: "",
1303
+ description: "",
1304
+ defaultValue: false
1305
+ };
1306
+ case "ZodEnum": {
1307
+ const values = inner._def.values;
1308
+ return {
1309
+ name,
1310
+ label,
1311
+ type: "select",
1312
+ required,
1313
+ placeholder: "",
1314
+ description: "",
1315
+ options: values.map((v) => ({ label: v, value: v })),
1316
+ defaultValue: values[0] ?? ""
1317
+ };
1318
+ }
1319
+ default:
1320
+ return null;
1321
+ }
1322
+ }
1323
+ function ZodFormRenderer({
1324
+ schema,
1325
+ defaults,
1326
+ onSubmit,
1327
+ submitLabel = "Submit",
1328
+ isPending = false
1329
+ }) {
1330
+ const typeName = getTypeName(schema);
1331
+ const fields = [];
1332
+ const initialValues = {};
1333
+ if (typeName === "ZodObject") {
1334
+ const shape = schema.shape;
1335
+ for (const [fieldName, fieldSchema] of Object.entries(shape)) {
1336
+ const isRequired = getTypeName(fieldSchema) !== "ZodOptional" && getTypeName(fieldSchema) !== "ZodNullable";
1337
+ const formField = zodTypeToFormField(fieldName, fieldSchema, isRequired);
1338
+ const defaultForField = defaults?.[fieldName];
1339
+ const fieldDefault = defaultForField ?? getDefaultValue(fieldSchema);
1340
+ if (formField) {
1341
+ fields.push(formField);
1342
+ initialValues[fieldName] = fieldDefault ?? formField.defaultValue;
1343
+ } else {
1344
+ const raw = fieldDefault !== void 0 ? JSON.stringify(fieldDefault, null, 2) : "";
1345
+ fields.push({ name: fieldName, label: fieldName, fallback: true });
1346
+ initialValues[fieldName] = raw;
1347
+ }
1348
+ }
1349
+ } else {
1350
+ const raw = defaults !== void 0 ? JSON.stringify(defaults, null, 2) : "";
1351
+ fields.push({ name: "__input__", label: "Input (JSON)", fallback: true });
1352
+ initialValues["__input__"] = raw;
1353
+ }
1354
+ const form = useForm({ initialValues });
1355
+ const handleSubmit = (values) => {
1356
+ const coerced = {};
1357
+ for (const field of fields) {
1358
+ const raw = values[field.name];
1359
+ if ("fallback" in field) {
1360
+ try {
1361
+ coerced[field.name] = raw !== "" && raw !== void 0 ? JSON.parse(raw) : void 0;
1362
+ } catch {
1363
+ coerced[field.name] = raw;
1364
+ }
1365
+ } else {
1366
+ coerced[field.name] = raw;
1367
+ }
1368
+ }
1369
+ const payload = typeName === "ZodObject" ? coerced : coerced["__input__"] ?? coerced;
1370
+ const parsed = schema.safeParse(payload);
1371
+ if (!parsed.success) {
1372
+ for (const issue of parsed.error.issues) {
1373
+ const path = issue.path.join(".");
1374
+ if (path) form.setFieldError(path, issue.message);
1375
+ }
1376
+ return;
1377
+ }
1378
+ void onSubmit(parsed.data);
1379
+ };
1380
+ return /* @__PURE__ */ jsx("form", { onSubmit: form.onSubmit(handleSubmit), children: /* @__PURE__ */ jsxs(Stack, { children: [
1381
+ fields.map((field) => {
1382
+ if ("fallback" in field) {
1383
+ const label = field.label.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase());
1384
+ return /* @__PURE__ */ jsx(
1385
+ Textarea,
1386
+ {
1387
+ label,
1388
+ placeholder: "Enter JSON value",
1389
+ minRows: 3,
1390
+ autosize: true,
1391
+ ...form.getInputProps(field.name),
1392
+ error: form.errors[field.name]
1393
+ },
1394
+ field.name
1395
+ );
1396
+ }
1397
+ return /* @__PURE__ */ jsx(FormFieldRenderer, { field, form }, field.name);
1398
+ }),
1399
+ /* @__PURE__ */ jsx(Button, { type: "submit", loading: isPending, fullWidth: true, children: submitLabel })
1400
+ ] }) });
1401
+ }
1402
+ var isZodSchema = (value) => value instanceof z.ZodType;
1403
+ function RunResourceButton({
1404
+ resourceId,
1405
+ resourceType,
1406
+ getInput,
1407
+ label,
1408
+ icon,
1409
+ color,
1410
+ organizationModel,
1411
+ onSuccess,
1412
+ onError
1413
+ }) {
1414
+ const [modalState, setModalState] = useState(null);
1415
+ const { execute, isPending } = useExecuteResource({ resourceId, resourceType });
1416
+ const mapping = organizationModel?.resourceMappings?.find((m) => m.resourceId === resourceId);
1417
+ const resolvedLabel = label ?? mapping?.label ?? "Run";
1418
+ const resolvedColor = color ?? mapping?.color ?? void 0;
1419
+ const handleExecute = useCallback(
1420
+ async (input) => {
1421
+ try {
1422
+ const result = await execute(input);
1423
+ setModalState(null);
1424
+ notifications.show({
1425
+ title: "Execution started",
1426
+ message: `Execution ${result.executionId} started`,
1427
+ color: "green"
1428
+ });
1429
+ onSuccess?.(result);
1430
+ } catch (err) {
1431
+ const error = err instanceof Error ? err : new Error(String(err));
1432
+ notifications.show({
1433
+ title: "Execution failed",
1434
+ message: error.message,
1435
+ color: "red"
1436
+ });
1437
+ onError?.(error);
1438
+ }
1439
+ },
1440
+ [execute, onSuccess, onError]
1441
+ );
1442
+ const handleClick = useCallback(() => {
1443
+ const result = getInput();
1444
+ const maybeSchema = result.schema;
1445
+ if (isZodSchema(maybeSchema)) {
1446
+ const defaults = result.defaults;
1447
+ setModalState({ schema: maybeSchema, defaults });
1448
+ } else {
1449
+ void handleExecute(result);
1450
+ }
1451
+ }, [getInput, handleExecute]);
1452
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1453
+ /* @__PURE__ */ jsx(Button, { leftSection: icon, color: resolvedColor, loading: isPending, onClick: handleClick, children: resolvedLabel }),
1454
+ /* @__PURE__ */ jsx(Modal, { opened: modalState !== null, onClose: () => setModalState(null), children: modalState !== null && /* @__PURE__ */ jsx(
1455
+ ZodFormRenderer,
1456
+ {
1457
+ schema: modalState.schema,
1458
+ defaults: modalState.defaults,
1459
+ isPending,
1460
+ submitLabel: resolvedLabel,
1461
+ onSubmit: (data) => handleExecute(data)
1462
+ }
1463
+ ) })
1464
+ ] });
1465
+ }
1195
1466
  var DEFAULT_LIMIT = 6;
1196
1467
  var typeIcons = {
1197
1468
  workflow: IconGitBranch,
@@ -1801,4 +2072,4 @@ function UnresolvedErrorsTeaser({ timeRange, onNavigateToAllErrors }) {
1801
2072
  );
1802
2073
  }
1803
2074
 
1804
- export { AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, BaseEdge, BaseNode, Dashboard, EmptyVisualizer, ExecutionStats, ExecutionStatusBadge, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, OperationsOverview, RecentExecutionsByResource, ResourceOverview, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, UnresolvedErrorsTeaser, VisualizerContainer, WorkflowExecutionTimeline, getGraphBackgroundStyles, useGraphBackgroundStyles, useGraphTheme };
2075
+ export { AgentExecutionTimeline, AgentExecutionVisualizer, AgentIterationEdge, AgentIterationNode, BaseEdge, BaseNode, Dashboard, EmptyVisualizer, ExecutionStats, ExecutionStatusBadge, FormFieldRenderer, GraphBackground, GraphContainer, GraphFitViewButton, GraphFitViewHandler, GraphLegend, OperationsOverview, RecentExecutionsByResource, ResourceOverview, RunResourceButton, TimelineAxis, TimelineBar, TimelineContainer, TimelineRow, UnifiedWorkflowEdge, UnifiedWorkflowGraph, UnifiedWorkflowNode, UnresolvedErrorsTeaser, VisualizerContainer, WorkflowExecutionTimeline, ZodFormRenderer, getGraphBackgroundStyles, useGraphBackgroundStyles, useGraphTheme };
@@ -4,19 +4,6 @@ import dagre from '@dagrejs/dagre';
4
4
  import { IconCircleDot, IconLoader, IconAlertTriangle, IconX, IconCheck } from '@tabler/icons-react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
 
7
- function useMergedExecution(fetchedExecution, streamingLogs) {
8
- return useMemo(() => {
9
- if (!fetchedExecution) return void 0;
10
- if (!streamingLogs || streamingLogs.length === 0) return fetchedExecution;
11
- const existingKeys = new Set(fetchedExecution.executionLogs.map((log) => `${log.timestamp}:${log.message}`));
12
- const newLogs = streamingLogs.filter((log) => !existingKeys.has(`${log.timestamp}:${log.message}`));
13
- if (newLogs.length === 0) return fetchedExecution;
14
- return {
15
- ...fetchedExecution,
16
- executionLogs: [...fetchedExecution.executionLogs, ...newLogs].sort((a, b) => a.timestamp - b.timestamp)
17
- };
18
- }, [fetchedExecution, streamingLogs]);
19
- }
20
7
  function useExecutionPath(executionLogs, workflowDefinition) {
21
8
  return useMemo(() => {
22
9
  if (!executionLogs || executionLogs.length === 0) {
@@ -818,4 +805,4 @@ function calculateBarPosition(startTime, endTime, executionStart, executionEnd)
818
805
  };
819
806
  }
820
807
 
821
- export { AGENT_CONSTANTS, CONTAINER_CONSTANTS, SHARED_VIZ_CONSTANTS, STATUS_COLORS, TIMELINE_CONSTANTS, WORKFLOW_CONSTANTS, calculateBarPosition, formatDuration, getEdgeColor, getEdgeOpacity, getResourceStatusColor, getStatusColors, getStatusIcon, shouldAnimateEdge, useAgentIterationData, useExecutionPath, useMergedExecution, useReactFlowAgent, useTimelineData, useUnifiedWorkflowLayout, useWorkflowStepsLayout };
808
+ export { AGENT_CONSTANTS, CONTAINER_CONSTANTS, SHARED_VIZ_CONSTANTS, STATUS_COLORS, TIMELINE_CONSTANTS, WORKFLOW_CONSTANTS, calculateBarPosition, formatDuration, getEdgeColor, getEdgeOpacity, getResourceStatusColor, getStatusColors, getStatusIcon, shouldAnimateEdge, useAgentIterationData, useExecutionPath, useReactFlowAgent, useTimelineData, useUnifiedWorkflowLayout, useWorkflowStepsLayout };
@@ -1,5 +1,5 @@
1
1
  import { useCyberColors, CyberLegendItem, CyberAreaChart } from './chunk-STZJ7SY5.js';
2
- import { useResourcesHealth } from './chunk-E3IFHX6A.js';
2
+ import { useResourcesHealth } from './chunk-WM7JTTPX.js';
3
3
  import { getTimeRangeDates, formatBucketTime } from './chunk-LXHZYSMQ.js';
4
4
  import { CardHeader, EmptyState } from './chunk-SQQGLGHW.js';
5
5
  import { Paper, Center, Loader, Group } from '@mantine/core';
@@ -4,14 +4,14 @@ import { SubshellNavItem } from './chunk-CEWTOKE7.js';
4
4
  import { SubshellSidebarSection } from './chunk-IIMU5YAJ.js';
5
5
  import { FilterBar } from './chunk-PDHTXPSF.js';
6
6
  import { CustomModal } from './chunk-GBMNCNHX.js';
7
- import { useDealTasksDue, useDeals, useCreateDealTask, useDeleteDeal, useTableSort, sortData, usePaginationState, useTableSelection, useDealDetail } from './chunk-E3IFHX6A.js';
7
+ import { useDealTasksDue, useDeals, useCreateDealTask, useDeleteDeal, useTableSort, sortData, usePaginationState, useTableSelection, useDealDetail, useCompany } from './chunk-WM7JTTPX.js';
8
8
  import { SubshellContentContainer } from './chunk-RX4UWZZR.js';
9
9
  import { CenteredErrorState, CardHeader, PageTitleCaption, EmptyState, ActivityTimeline } from './chunk-SQQGLGHW.js';
10
10
  import { PAGE_SIZE_DEFAULT, formatTimeAgo } from './chunk-IOKL7BKE.js';
11
11
  import { useElevasisServices } from './chunk-QEPXAWE2.js';
12
12
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
13
- import { Box, Stack, Group, Text, Badge, Center, Loader, UnstyledButton, Button, Modal, Select, TextInput, Textarea, Paper, Alert, SimpleGrid, Table, Checkbox, Pagination, Title, ActionIcon, Tabs, Card, Code, Divider, Anchor } from '@mantine/core';
14
- import { IconLayoutGrid, IconColumns, IconFileInvoice, IconAddressBook, IconTrophy, IconClockExclamation, IconUser, IconPlus, IconChecklist, IconAlertCircle, IconHistory, IconSearch, IconTargetArrow, IconAlertTriangle, IconArrowLeft, IconFileText, IconTrash, IconX, IconCheckbox, IconCalendar, IconMail, IconPhone, IconArrowRight, IconNote } from '@tabler/icons-react';
13
+ import { Box, Stack, Group, Text, Badge, Center, Loader, UnstyledButton, Button, Modal, Title, Select, TextInput, Textarea, Paper, Alert, SimpleGrid, Table, Checkbox, Pagination, ActionIcon, Tabs, Card, Code, Divider, Anchor } from '@mantine/core';
14
+ import { IconLayoutGrid, IconColumns, IconFileInvoice, IconAddressBook, IconTrophy, IconClockExclamation, IconUser, IconPlus, IconChecklist, IconAlertCircle, IconHistory, IconSearch, IconTargetArrow, IconAlertTriangle, IconArrowLeft, IconFileText, IconTrash, IconX, IconBuilding, IconCheckbox, IconCalendar, IconMail, IconPhone, IconArrowRight, IconNote } from '@tabler/icons-react';
15
15
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
16
16
  import { useState, useMemo, useEffect } from 'react';
17
17
  import { useQuery, useQueryClient } from '@tanstack/react-query';
@@ -209,8 +209,9 @@ function QuickCreateActions({ showSectionLabel = true }) {
209
209
  showSectionLabel && /* @__PURE__ */ jsx(Text, { fz: "xs", tt: "uppercase", c: "dimmed", fw: 600, children: "TASKS" }),
210
210
  /* @__PURE__ */ jsx(Button, { variant: "light", size: "xs", leftSection: /* @__PURE__ */ jsx(IconPlus, { size: 14 }), fullWidth: true, onClick: () => setOpen(true), children: "New Task" })
211
211
  ] }),
212
- /* @__PURE__ */ jsxs(Modal, { opened: open, onClose: handleClose, title: "New Task", size: "md", children: [
212
+ /* @__PURE__ */ jsxs(Modal, { opened: open, onClose: handleClose, size: "md", children: [
213
213
  /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
214
+ /* @__PURE__ */ jsx(Title, { order: 3, children: "New Task" }),
214
215
  /* @__PURE__ */ jsx(
215
216
  Select,
216
217
  {
@@ -1108,5 +1109,123 @@ function DealDetailPage({ dealId, renderActions, onDealLoaded }) {
1108
1109
  ] }) })
1109
1110
  ] }) });
1110
1111
  }
1112
+ function CompanyDetailPage({ companyId }) {
1113
+ const navigate = useNavigate();
1114
+ const { data: company, isLoading, error } = useCompany(companyId);
1115
+ const title = company ? company.name : "Company Detail";
1116
+ const headerActions = /* @__PURE__ */ jsx(
1117
+ Button,
1118
+ {
1119
+ variant: "light",
1120
+ size: "sm",
1121
+ leftSection: /* @__PURE__ */ jsx(IconArrowLeft, { size: 16 }),
1122
+ onClick: () => navigate({ to: "/crm" }),
1123
+ children: "CRM"
1124
+ }
1125
+ );
1126
+ if (isLoading) {
1127
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsxs(PageContainer, { children: [
1128
+ /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(PageTitleCaption, { title, caption: "Loading company details...", rightSection: headerActions }) }),
1129
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) })
1130
+ ] }) });
1131
+ }
1132
+ if (error) {
1133
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsxs(PageContainer, { children: [
1134
+ /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(PageTitleCaption, { title, caption: "Unable to load company details", rightSection: headerActions }) }),
1135
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(CenteredErrorState, { error, title: "Failed to load company" }) })
1136
+ ] }) });
1137
+ }
1138
+ if (!company) {
1139
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsxs(PageContainer, { children: [
1140
+ /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(PageTitleCaption, { title, caption: "Company not found", rightSection: headerActions }) }),
1141
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(
1142
+ EmptyState,
1143
+ {
1144
+ icon: IconBuilding,
1145
+ title: "Company not found",
1146
+ description: "The selected company no longer exists."
1147
+ }
1148
+ ) })
1149
+ ] }) });
1150
+ }
1151
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsxs(PageContainer, { children: [
1152
+ /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(
1153
+ PageTitleCaption,
1154
+ {
1155
+ title: company.name,
1156
+ caption: [company.domain, company.locationCity, company.locationState].filter(Boolean).join(" \xB7 ") || "Company",
1157
+ rightSection: headerActions
1158
+ }
1159
+ ) }),
1160
+ /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "md", p: "md", children: [
1161
+ /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
1162
+ /* @__PURE__ */ jsx(Title, { order: 4, children: "Overview" }),
1163
+ /* @__PURE__ */ jsxs(SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: [
1164
+ /* @__PURE__ */ jsxs(Group, { children: [
1165
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Name:" }),
1166
+ /* @__PURE__ */ jsx(Text, { children: company.name })
1167
+ ] }),
1168
+ /* @__PURE__ */ jsxs(Group, { children: [
1169
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Status:" }),
1170
+ /* @__PURE__ */ jsx(Badge, { variant: "light", color: "blue", children: company.status })
1171
+ ] }),
1172
+ company.domain && /* @__PURE__ */ jsxs(Group, { children: [
1173
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Domain:" }),
1174
+ /* @__PURE__ */ jsx(Text, { children: company.domain })
1175
+ ] }),
1176
+ company.website && /* @__PURE__ */ jsxs(Group, { children: [
1177
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Website:" }),
1178
+ /* @__PURE__ */ jsx(Text, { component: "a", href: company.website, target: "_blank", c: "blue", children: company.website })
1179
+ ] }),
1180
+ company.numEmployees != null && /* @__PURE__ */ jsxs(Group, { children: [
1181
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Employees:" }),
1182
+ /* @__PURE__ */ jsx(Text, { children: company.numEmployees.toLocaleString() })
1183
+ ] }),
1184
+ company.foundedYear != null && /* @__PURE__ */ jsxs(Group, { children: [
1185
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Founded:" }),
1186
+ /* @__PURE__ */ jsx(Text, { children: company.foundedYear })
1187
+ ] })
1188
+ ] })
1189
+ ] }) }),
1190
+ (company.locationCity || company.locationState) && /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
1191
+ /* @__PURE__ */ jsx(Title, { order: 4, children: "Location" }),
1192
+ /* @__PURE__ */ jsxs(SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: [
1193
+ company.locationCity && /* @__PURE__ */ jsxs(Group, { children: [
1194
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "City:" }),
1195
+ /* @__PURE__ */ jsx(Text, { children: company.locationCity })
1196
+ ] }),
1197
+ company.locationState && /* @__PURE__ */ jsxs(Group, { children: [
1198
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "State:" }),
1199
+ /* @__PURE__ */ jsx(Text, { children: company.locationState })
1200
+ ] })
1201
+ ] })
1202
+ ] }) }),
1203
+ company.linkedinUrl && /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
1204
+ /* @__PURE__ */ jsx(Title, { order: 4, children: "Social" }),
1205
+ /* @__PURE__ */ jsxs(Group, { children: [
1206
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "LinkedIn:" }),
1207
+ /* @__PURE__ */ jsx(Text, { component: "a", href: company.linkedinUrl, target: "_blank", c: "blue", children: "View Profile" })
1208
+ ] })
1209
+ ] }) }),
1210
+ (company.segment || company.category) && /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
1211
+ /* @__PURE__ */ jsx(Title, { order: 4, children: "Classification" }),
1212
+ /* @__PURE__ */ jsxs(SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: [
1213
+ company.segment && /* @__PURE__ */ jsxs(Group, { children: [
1214
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Segment:" }),
1215
+ /* @__PURE__ */ jsx(Text, { children: company.segment })
1216
+ ] }),
1217
+ company.category && /* @__PURE__ */ jsxs(Group, { children: [
1218
+ /* @__PURE__ */ jsx(Text, { fw: 500, children: "Category:" }),
1219
+ /* @__PURE__ */ jsx(Text, { children: company.category })
1220
+ ] })
1221
+ ] })
1222
+ ] }) }),
1223
+ company.verticalResearch && /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Stack, { gap: "sm", children: [
1224
+ /* @__PURE__ */ jsx(Title, { order: 4, children: "Vertical Research" }),
1225
+ /* @__PURE__ */ jsx(Text, { size: "sm", style: { whiteSpace: "pre-wrap" }, children: company.verticalResearch })
1226
+ ] }) })
1227
+ ] }) })
1228
+ ] }) });
1229
+ }
1111
1230
 
1112
- export { ActivityFeedWidget, CRM_ITEMS, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, formatDealStageLabel, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity };
1231
+ export { ActivityFeedWidget, CRM_ITEMS, CompanyDetailPage, CrmOverview, CrmSidebar, CrmSidebarMiddle, CrmSidebarTop, DEAL_STAGE_COLORS, DEAL_STAGE_OPTIONS, DealDetailPage, DealsListPage, MetricsStrip, MyTasksPanel, PIPELINE_FUNNEL_ORDER, PipelineFunnelWidget, QuickCreateActions, SAVED_VIEW_PRESETS, SavedViewsPanel, TasksDueWidget, crmManifest, formatDealStageLabel, useCrmPipelineSummary, useCrmQuickMetrics, useRecentCrmActivity };
@@ -1,4 +1,4 @@
1
- import { PRESETS, getPreset, generateShades, mantineThemeOverride, createCssVariablesResolver, PresetsProvider } from './chunk-6PNHW4X2.js';
1
+ import { PRESETS, getPreset, generateShades, mantineThemeOverride, createCssVariablesResolver, PresetsProvider } from './chunk-TYWZABTP.js';
2
2
  import { AppBackground } from './chunk-F4TPY6YL.js';
3
3
  import { ElevasisCoreProvider } from './chunk-R7WLWGPO.js';
4
4
  import { ElevasisLoader } from './chunk-SZHARWKU.js';