@replicated/portal-components 0.0.11 → 0.0.13

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 (81) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/datadog/tracer.d.ts +3 -0
  4. package/datadog/tracer.js +82 -0
  5. package/datadog/tracer.ts +101 -0
  6. package/dist/actions/index.d.mts +26 -4
  7. package/dist/actions/index.d.ts +26 -4
  8. package/dist/actions/index.js +171 -124
  9. package/dist/actions/index.js.map +1 -1
  10. package/dist/airgap-instances.js.map +1 -1
  11. package/dist/esm/actions/index.js +170 -124
  12. package/dist/esm/actions/index.js.map +1 -1
  13. package/dist/esm/airgap-instances.js.map +1 -1
  14. package/dist/esm/helm-install-wizard.js +15 -9
  15. package/dist/esm/helm-install-wizard.js.map +1 -1
  16. package/dist/esm/index.js +204 -158
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/install-actions.js +42 -47
  19. package/dist/esm/install-actions.js.map +1 -1
  20. package/dist/esm/install-card.js +8 -21
  21. package/dist/esm/install-card.js.map +1 -1
  22. package/dist/esm/instance-card.js.map +1 -1
  23. package/dist/esm/license-card.js +8 -12
  24. package/dist/esm/license-card.js.map +1 -1
  25. package/dist/esm/license-details.js +21 -11
  26. package/dist/esm/license-details.js.map +1 -1
  27. package/dist/esm/linux-install-wizard.js +26 -47
  28. package/dist/esm/linux-install-wizard.js.map +1 -1
  29. package/dist/esm/online-instance-list.js.map +1 -1
  30. package/dist/esm/support-card.js +22 -55
  31. package/dist/esm/support-card.js.map +1 -1
  32. package/dist/esm/team-settings-card.js +8 -13
  33. package/dist/esm/team-settings-card.js.map +1 -1
  34. package/dist/esm/top-nav.js +69 -47
  35. package/dist/esm/top-nav.js.map +1 -1
  36. package/dist/esm/update-layout.js +69 -47
  37. package/dist/esm/update-layout.js.map +1 -1
  38. package/dist/esm/updates-card.js +8 -14
  39. package/dist/esm/updates-card.js.map +1 -1
  40. package/dist/esm/utils/index.js +14 -10
  41. package/dist/esm/utils/index.js.map +1 -1
  42. package/dist/esm/utils/observability/index.js +193 -0
  43. package/dist/esm/utils/observability/index.js.map +1 -0
  44. package/dist/helm-install-wizard.js +15 -9
  45. package/dist/helm-install-wizard.js.map +1 -1
  46. package/dist/index.d.mts +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.js +203 -156
  49. package/dist/index.js.map +1 -1
  50. package/dist/install-actions.js +43 -48
  51. package/dist/install-actions.js.map +1 -1
  52. package/dist/install-card.js +8 -21
  53. package/dist/install-card.js.map +1 -1
  54. package/dist/instance-card.js.map +1 -1
  55. package/dist/license-card.js +8 -12
  56. package/dist/license-card.js.map +1 -1
  57. package/dist/license-details.js +21 -11
  58. package/dist/license-details.js.map +1 -1
  59. package/dist/linux-install-wizard.js +26 -47
  60. package/dist/linux-install-wizard.js.map +1 -1
  61. package/dist/online-instance-list.js.map +1 -1
  62. package/dist/styles.css +2 -2
  63. package/dist/support-card.js +22 -55
  64. package/dist/support-card.js.map +1 -1
  65. package/dist/team-settings-card.js +8 -13
  66. package/dist/team-settings-card.js.map +1 -1
  67. package/dist/top-nav.js +69 -47
  68. package/dist/top-nav.js.map +1 -1
  69. package/dist/update-layout.js +69 -47
  70. package/dist/update-layout.js.map +1 -1
  71. package/dist/updates-card.js +8 -14
  72. package/dist/updates-card.js.map +1 -1
  73. package/dist/utils/index.js +14 -10
  74. package/dist/utils/index.js.map +1 -1
  75. package/dist/utils/observability/index.d.mts +13 -0
  76. package/dist/utils/observability/index.d.ts +13 -0
  77. package/dist/utils/observability/index.js +198 -0
  78. package/dist/utils/observability/index.js.map +1 -0
  79. package/instrumentation.d.ts +8 -0
  80. package/instrumentation.js +22 -0
  81. package/package.json +16 -3
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ var Link__default = /*#__PURE__*/_interopDefault(Link);
16
16
 
17
17
  // package.json
18
18
  var package_default = {
19
- version: "0.0.11"};
19
+ version: "0.0.13"};
20
20
 
21
21
  // src/tokens/index.ts
22
22
  var baseTokens = {
@@ -193,7 +193,7 @@ var initiateLogin = defineServerAction({
193
193
  visibility: "customer",
194
194
  tags: ["auth", "login", "session"],
195
195
  async run(input) {
196
- const endpoint = `${getApiOrigin()}/v3/login/magic-link`;
196
+ const endpoint = `${getApiOrigin()}/enterprise-portal/auth/magic-link`;
197
197
  const appSlug = process.env.PORTAL_APP_SLUG;
198
198
  if (!appSlug) {
199
199
  throw new Error("PORTAL_APP_SLUG is not configured");
@@ -243,7 +243,7 @@ var verifyMagicLink = defineServerAction({
243
243
  visibility: "customer",
244
244
  tags: ["auth", "login", "verify"],
245
245
  async run({ nonce }) {
246
- const endpoint = `${getApiOrigin()}/v3/login/magic-link/verify`;
246
+ const endpoint = `${getApiOrigin()}/enterprise-portal/auth/magic-link/verify`;
247
247
  if (process.env.NODE_ENV !== "production") {
248
248
  console.debug(
249
249
  "[portal-components] verifying magic link via %s",
@@ -299,12 +299,12 @@ var fetchCustomBrandingImpl = async () => {
299
299
  if (!appSlug) {
300
300
  throw new Error("PORTAL_APP_SLUG is not configured");
301
301
  }
302
- const url = `${getApiOrigin()}/v3/custom-branding?app_slug=${encodeURIComponent(
302
+ const url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
303
303
  appSlug
304
304
  )}`;
305
305
  if (process.env.NODE_ENV !== "production") {
306
306
  console.debug(
307
- "[portal-components] fetching custom branding via %s",
307
+ "[portal-components] fetching custom branding via %s (Enterprise Portal API)",
308
308
  url
309
309
  );
310
310
  }
@@ -319,13 +319,18 @@ var fetchCustomBrandingImpl = async () => {
319
319
  );
320
320
  }
321
321
  const payload = await response.json();
322
- const brandingData = payload?.branding_data;
323
- if (typeof brandingData !== "string") {
324
- throw new Error("Custom branding response missing branding_data string");
325
- }
322
+ const brandingObject = {
323
+ logo: payload.logoUrl,
324
+ title: payload.appName,
325
+ customColor1: payload.primaryColor,
326
+ customColor2: payload.secondaryColor,
327
+ favicon: payload.faviconUrl
328
+ };
329
+ const brandingData = buffer.Buffer.from(JSON.stringify(brandingObject)).toString("base64");
326
330
  return {
327
331
  brandingData,
328
- documentation: payload?.documentation ?? null
332
+ documentation: null
333
+ // Documentation not included in new API's public endpoint
329
334
  };
330
335
  };
331
336
  var fetchCustomBranding = react.cache(fetchCustomBrandingImpl);
@@ -342,7 +347,7 @@ var decodeJwtPayload = (token) => {
342
347
  payloadSegment.length + (4 - payloadSegment.length % 4) % 4,
343
348
  "="
344
349
  );
345
- const decoded = Buffer.from(padded, "base64").toString("utf-8");
350
+ const decoded = buffer.Buffer.from(padded, "base64").toString("utf-8");
346
351
  return JSON.parse(decoded);
347
352
  };
348
353
  var getCustomerIdFromToken = (token) => {
@@ -353,22 +358,6 @@ var getCustomerIdFromToken = (token) => {
353
358
  }
354
359
  return customerId.trim();
355
360
  };
356
- var resolveSupportBundlesEndpoint = () => {
357
- const fallback = `${getApiOrigin()}/v3/supportbundles`;
358
- const explicit = process.env.SUPPORT_BUNDLES_ENDPOINT;
359
- if (!explicit) {
360
- return new URL(fallback);
361
- }
362
- try {
363
- return new URL(explicit);
364
- } catch (error) {
365
- console.warn(
366
- `[portal-components] invalid SUPPORT_BUNDLES_ENDPOINT, using fallback`,
367
- error
368
- );
369
- return new URL(fallback);
370
- }
371
- };
372
361
  var listSupportBundles = defineServerAction({
373
362
  id: "support/list-bundles",
374
363
  description: "Fetches support bundles associated with the customer found in the portal session JWT.",
@@ -378,17 +367,11 @@ var listSupportBundles = defineServerAction({
378
367
  if (!token || typeof token !== "string") {
379
368
  throw new Error("Support bundle listing requires a session token");
380
369
  }
381
- const payload = decodeJwtPayload(token);
382
- const customerId = payload?.customer_id;
383
- if (typeof customerId !== "string" || !customerId.trim()) {
384
- throw new Error("Unable to determine customer_id from session token");
385
- }
386
- const url = resolveSupportBundlesEndpoint();
387
- url.searchParams.set("customer_id", customerId.trim());
370
+ const url = `${getApiOrigin()}/enterprise-portal/support-bundles`;
388
371
  if (process.env.NODE_ENV !== "production") {
389
- console.debug("[portal-components] fetching support bundles via %s", url);
372
+ console.debug("[portal-components] fetching support bundles via %s (Enterprise Portal API)", url);
390
373
  }
391
- const response = await authenticatedFetch(url.toString(), {
374
+ const response = await authenticatedFetch(url, {
392
375
  token,
393
376
  headers: {
394
377
  accept: "application/json"
@@ -403,7 +386,8 @@ var listSupportBundles = defineServerAction({
403
386
  `Support bundles request failed (${response.status} ${response.statusText})`
404
387
  );
405
388
  }
406
- const raw = await response.json();
389
+ const payload = await response.json();
390
+ const raw = payload.data;
407
391
  const rawRecord = raw && typeof raw === "object" ? raw : void 0;
408
392
  const parseInsights = (raw2) => {
409
393
  if (!Array.isArray(raw2)) return void 0;
@@ -494,12 +478,8 @@ var downloadSupportBundle = defineServerAction({
494
478
  if (!bundleId || typeof bundleId !== "string") {
495
479
  throw new Error("Support bundle download requires a bundle ID");
496
480
  }
497
- const payload = decodeJwtPayload(token);
498
- const customerId = payload?.customer_id;
499
- if (typeof customerId !== "string" || !customerId.trim()) {
500
- throw new Error("Unable to determine customer_id from session token");
501
- }
502
- const endpoint = `${getApiOrigin()}/v3/supportbundle/${encodeURIComponent(bundleId)}/download?customer_id=${encodeURIComponent(customerId.trim())}`;
481
+ const customerId = getCustomerIdFromToken(token);
482
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/${encodeURIComponent(bundleId)}/download?customer_id=${encodeURIComponent(customerId)}`;
503
483
  if (process.env.NODE_ENV !== "production") {
504
484
  console.debug("[portal-components] getting support bundle download URL via %s", endpoint);
505
485
  }
@@ -537,12 +517,8 @@ var deleteSupportBundle = defineServerAction({
537
517
  if (!bundleId || typeof bundleId !== "string") {
538
518
  throw new Error("Support bundle deletion requires a bundle ID");
539
519
  }
540
- const payload = decodeJwtPayload(token);
541
- const customerId = payload?.customer_id;
542
- if (typeof customerId !== "string" || !customerId.trim()) {
543
- throw new Error("Unable to determine customer_id from session token");
544
- }
545
- const endpoint = `${getApiOrigin()}/v3/supportbundle/${encodeURIComponent(bundleId)}?customer_id=${encodeURIComponent(customerId.trim())}`;
520
+ const customerId = getCustomerIdFromToken(token);
521
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/${encodeURIComponent(bundleId)}?customer_id=${encodeURIComponent(customerId)}`;
546
522
  if (process.env.NODE_ENV !== "production") {
547
523
  console.debug("[portal-components] deleting support bundle via %s", endpoint);
548
524
  }
@@ -581,7 +557,7 @@ var uploadSupportBundle = defineServerAction({
581
557
  if (!fileContent || !(fileContent instanceof ArrayBuffer)) {
582
558
  throw new Error("Support bundle upload requires file content");
583
559
  }
584
- const endpoint = `${getApiOrigin()}/v3/supportbundle/upload/${encodeURIComponent(appId)}`;
560
+ const endpoint = `${getApiOrigin()}/enterprise-portal/support-bundles/upload/${encodeURIComponent(appId)}`;
585
561
  if (process.env.NODE_ENV !== "production") {
586
562
  console.debug("[portal-components] uploading support bundle via %s", endpoint);
587
563
  }
@@ -609,7 +585,7 @@ var uploadSupportBundle = defineServerAction({
609
585
  }
610
586
  });
611
587
  var getSupportBundleUploadUrl = (appId) => {
612
- return `${getApiOrigin()}/v3/supportbundle/upload/${encodeURIComponent(appId)}`;
588
+ return `${getApiOrigin()}/enterprise-portal/support-bundles/upload/${encodeURIComponent(appId)}`;
613
589
  };
614
590
  var listReleases = defineServerAction({
615
591
  id: "releases/list",
@@ -620,10 +596,10 @@ var listReleases = defineServerAction({
620
596
  if (!token || typeof token !== "string") {
621
597
  throw new Error("List releases requires a session token");
622
598
  }
623
- const endpoint = `${getApiOrigin()}/v3/release-history`;
624
- console.log("[portal-components] listReleases request", {
625
- endpoint
626
- });
599
+ const endpoint = `${getApiOrigin()}/enterprise-portal/releases`;
600
+ if (process.env.NODE_ENV !== "production") {
601
+ console.debug("[portal-components] fetching releases via %s (Enterprise Portal API)", endpoint);
602
+ }
627
603
  const response = await authenticatedFetch(endpoint, {
628
604
  method: "GET",
629
605
  token,
@@ -636,7 +612,6 @@ var listReleases = defineServerAction({
636
612
  console.warn("[portal-components] listReleases read error", error);
637
613
  return null;
638
614
  });
639
- console.log("[portal-components] listReleases response", response.status, bodyText);
640
615
  if (!response.ok) {
641
616
  throw new Error(
642
617
  `List releases request failed (${response.status} ${response.statusText})`
@@ -933,7 +908,10 @@ var fetchLicenseDetails = defineServerAction({
933
908
  if (typeof token !== "string" || token.trim().length === 0) {
934
909
  throw new Error("fetchLicenseDetails requires a non-empty token");
935
910
  }
936
- const endpoint = `${getApiOrigin()}/v3/license`;
911
+ const endpoint = `${getApiOrigin()}/enterprise-portal/license`;
912
+ if (process.env.NODE_ENV !== "production") {
913
+ console.debug("[portal-components] fetching license via %s (Enterprise Portal API)", endpoint);
914
+ }
937
915
  const response = await authenticatedFetch(endpoint, {
938
916
  method: "GET",
939
917
  token,
@@ -948,10 +926,11 @@ var fetchLicenseDetails = defineServerAction({
948
926
  );
949
927
  }
950
928
  const payload = await response.json();
951
- const license = normalizeLicensePayload(payload);
929
+ const licenseData = payload.data;
930
+ const license = normalizeLicensePayload(licenseData);
952
931
  return {
953
932
  license,
954
- raw: payload ?? null
933
+ raw: licenseData ?? null
955
934
  };
956
935
  }
957
936
  });
@@ -964,16 +943,14 @@ var getSecurityInfo = defineServerAction({
964
943
  if (!token || typeof token !== "string") {
965
944
  throw new Error("Security info request requires a session token");
966
945
  }
967
- const customerId = getCustomerIdFromToken(token);
968
946
  const params = new URLSearchParams({
969
- customer_id: customerId,
970
947
  install_type: installType,
971
948
  channel_sequence: channelSequence.toString(),
972
949
  is_airgap: isAirgap.toString()
973
950
  });
974
- const url = `${getApiOrigin()}/v3/security-info?${params.toString()}`;
951
+ const url = `${getApiOrigin()}/enterprise-portal/security?${params.toString()}`;
975
952
  if (process.env.NODE_ENV !== "production") {
976
- console.debug("[portal-components] fetching security info via %s", url);
953
+ console.debug("[portal-components] fetching security info via %s (Enterprise Portal API)", url);
977
954
  }
978
955
  const response = await authenticatedFetch(url, {
979
956
  token,
@@ -985,8 +962,8 @@ var getSecurityInfo = defineServerAction({
985
962
  `Security info request failed (${response.status} ${response.statusText})`
986
963
  );
987
964
  }
988
- const data = await response.json();
989
- return data;
965
+ const payload = await response.json();
966
+ return payload.data;
990
967
  }
991
968
  });
992
969
  var getSecurityInfoDiff = defineServerAction({
@@ -998,15 +975,13 @@ var getSecurityInfoDiff = defineServerAction({
998
975
  if (!token || typeof token !== "string") {
999
976
  throw new Error("Security info diff request requires a session token");
1000
977
  }
1001
- const customerId = getCustomerIdFromToken(token);
1002
978
  const params = new URLSearchParams({
1003
- customer_id: customerId,
1004
979
  install_type: installType,
1005
980
  from_channel_sequence: fromChannelSequence.toString(),
1006
981
  to_channel_sequence: toChannelSequence.toString(),
1007
982
  is_airgap: isAirgap.toString()
1008
983
  });
1009
- const url = `${getApiOrigin()}/v3/security-info-diff?${params.toString()}`;
984
+ const url = `${getApiOrigin()}/enterprise-portal/security-diff?${params.toString()}`;
1010
985
  if (process.env.NODE_ENV !== "production") {
1011
986
  console.debug("[portal-components] fetching security info diff via %s", url);
1012
987
  }
@@ -1020,8 +995,8 @@ var getSecurityInfoDiff = defineServerAction({
1020
995
  `Security info diff request failed (${response.status} ${response.statusText})`
1021
996
  );
1022
997
  }
1023
- const data = await response.json();
1024
- return data;
998
+ const envelope = await response.json();
999
+ return envelope.data;
1025
1000
  }
1026
1001
  });
1027
1002
  var getSecurityInfoSBOM = defineServerAction({
@@ -1033,15 +1008,13 @@ var getSecurityInfoSBOM = defineServerAction({
1033
1008
  if (!token || typeof token !== "string") {
1034
1009
  throw new Error("Security SBOM request requires a session token");
1035
1010
  }
1036
- const customerId = getCustomerIdFromToken(token);
1037
1011
  const params = new URLSearchParams({
1038
- customer_id: customerId,
1039
1012
  install_type: installType,
1040
1013
  channel_sequence: channelSequence.toString(),
1041
1014
  is_airgap: isAirgap.toString(),
1042
1015
  unified_sbom: unifiedSbom.toString()
1043
1016
  });
1044
- const url = `${getApiOrigin()}/v3/security-info-sbom?${params.toString()}`;
1017
+ const url = `${getApiOrigin()}/enterprise-portal/security-sbom?${params.toString()}`;
1045
1018
  if (process.env.NODE_ENV !== "production") {
1046
1019
  console.debug("[portal-components] fetching security SBOM via %s", url);
1047
1020
  }
@@ -1058,8 +1031,77 @@ var getSecurityInfoSBOM = defineServerAction({
1058
1031
  `Security SBOM request failed (${response.status} ${response.statusText})`
1059
1032
  );
1060
1033
  }
1061
- const data = await response.json();
1062
- return data;
1034
+ const envelope = await response.json();
1035
+ return envelope.data;
1036
+ }
1037
+ });
1038
+ var fetchDashboardComposite = defineServerAction({
1039
+ id: "dashboard/fetch-composite",
1040
+ description: "Fetches all dashboard data from the composite Enterprise Portal API endpoint",
1041
+ visibility: "customer",
1042
+ tags: ["dashboard", "enterprise-portal-api"],
1043
+ async run({ token }, context) {
1044
+ if (!token || typeof token !== "string") {
1045
+ throw new Error("Dashboard request requires a session token");
1046
+ }
1047
+ const origin = getApiOrigin();
1048
+ const url = `${origin}/enterprise-portal/dashboard`;
1049
+ if (process.env.NODE_ENV !== "production") {
1050
+ console.debug("[portal-components] fetching dashboard via %s (Enterprise Portal API)", url);
1051
+ }
1052
+ const response = await authenticatedFetch(url, {
1053
+ method: "GET",
1054
+ token,
1055
+ headers: { accept: "application/json" },
1056
+ signal: context?.signal
1057
+ });
1058
+ if (!response.ok) {
1059
+ throw new Error(
1060
+ `Dashboard request failed (${response.status} ${response.statusText})`
1061
+ );
1062
+ }
1063
+ const payload = await response.json();
1064
+ const data = payload.data;
1065
+ const allInstances = data?.instances || [];
1066
+ const channelReleases = data?.channelReleases || [];
1067
+ const licenseData = data?.license || {};
1068
+ const teamStats = data?.teamStats || {};
1069
+ const onlineInstances = allInstances.filter((i) => !i.isAirgap);
1070
+ const airgapInstances = allInstances.filter((i) => i.isAirgap);
1071
+ const twentyFourHoursAgo = Date.now() - 24 * 60 * 60 * 1e3;
1072
+ const activeOnlineInstances = onlineInstances.filter((instance) => {
1073
+ const lastCheckin = instance.lastCheckin ? new Date(instance.lastCheckin).getTime() : 0;
1074
+ return lastCheckin > twentyFourHoursAgo;
1075
+ });
1076
+ const onlineActiveCount = activeOnlineInstances.length;
1077
+ const airgapCount = airgapInstances.length;
1078
+ const calculateUpdates = (instances) => {
1079
+ if (!channelReleases.length) return 0;
1080
+ let numUpdates = 0;
1081
+ for (const instance of instances) {
1082
+ const instanceSequence = instance.channelSequence ?? 0;
1083
+ const matchingReleases = channelReleases.filter(
1084
+ (release) => release.channelId === instance.channelId
1085
+ );
1086
+ for (const release of matchingReleases) {
1087
+ if ((release.channelSequence ?? 0) > instanceSequence) {
1088
+ numUpdates++;
1089
+ }
1090
+ }
1091
+ }
1092
+ return numUpdates;
1093
+ };
1094
+ const onlineUpdates = calculateUpdates(activeOnlineInstances);
1095
+ const airgapUpdates = calculateUpdates(airgapInstances);
1096
+ return {
1097
+ onlineActiveCount,
1098
+ airgapCount,
1099
+ onlineUpdates,
1100
+ airgapUpdates,
1101
+ // Additional data available from the composite endpoint
1102
+ license: licenseData,
1103
+ teamStats
1104
+ };
1063
1105
  }
1064
1106
  });
1065
1107
  var fetchCurrentUser = defineServerAction({
@@ -1071,7 +1113,7 @@ var fetchCurrentUser = defineServerAction({
1071
1113
  if (!token || typeof token !== "string") {
1072
1114
  throw new Error("Fetch current user requires a session token");
1073
1115
  }
1074
- const endpoint = `${getApiOrigin()}/v3/user`;
1116
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
1075
1117
  if (process.env.NODE_ENV !== "production") {
1076
1118
  console.debug("[portal-components] fetching current user via %s", endpoint);
1077
1119
  }
@@ -1108,7 +1150,7 @@ var updateUser = defineServerAction({
1108
1150
  if (!firstName && !lastName) {
1109
1151
  throw new Error("At least one of firstName or lastName must be provided");
1110
1152
  }
1111
- const endpoint = `${getApiOrigin()}/v3/user`;
1153
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/profile`;
1112
1154
  if (process.env.NODE_ENV !== "production") {
1113
1155
  console.debug("[portal-components] updating user via %s", endpoint);
1114
1156
  }
@@ -1116,7 +1158,7 @@ var updateUser = defineServerAction({
1116
1158
  if (firstName !== void 0) body.firstName = firstName;
1117
1159
  if (lastName !== void 0) body.lastName = lastName;
1118
1160
  const response = await authenticatedFetch(endpoint, {
1119
- method: "POST",
1161
+ method: "PUT",
1120
1162
  token,
1121
1163
  headers: {
1122
1164
  "content-type": "application/json",
@@ -1144,9 +1186,9 @@ var fetchNotifications = defineServerAction({
1144
1186
  throw new Error("Fetch notifications requires a session token");
1145
1187
  }
1146
1188
  if (!customerId || typeof customerId !== "string") {
1147
- throw new Error("Fetch notifications requires a customerId");
1189
+ throw new Error("Fetch notifications requires a valid customerId");
1148
1190
  }
1149
- const endpoint = `${getApiOrigin()}/v3/notifications?customer_id=${encodeURIComponent(customerId)}`;
1191
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
1150
1192
  if (process.env.NODE_ENV !== "production") {
1151
1193
  console.debug("[portal-components] fetching notifications via %s", endpoint);
1152
1194
  }
@@ -1177,12 +1219,12 @@ var updateNotifications = defineServerAction({
1177
1219
  throw new Error("Update notifications requires a session token");
1178
1220
  }
1179
1221
  if (!customerId || typeof customerId !== "string") {
1180
- throw new Error("Update notifications requires a customerId");
1222
+ throw new Error("Update notifications requires a valid customerId");
1181
1223
  }
1182
1224
  if (!Array.isArray(notifications)) {
1183
1225
  throw new Error("Update notifications requires a notifications array");
1184
1226
  }
1185
- const endpoint = `${getApiOrigin()}/v3/notifications?customer_id=${encodeURIComponent(customerId)}`;
1227
+ const endpoint = `${getApiOrigin()}/enterprise-portal/user/notifications?customer_id=${encodeURIComponent(customerId)}`;
1186
1228
  if (process.env.NODE_ENV !== "production") {
1187
1229
  console.debug("[portal-components] updating notifications via %s", endpoint);
1188
1230
  }
@@ -1453,7 +1495,7 @@ var LicenseDetails = async ({
1453
1495
  console.debug("[portal-components] license response", response.raw);
1454
1496
  const { license } = response;
1455
1497
  const rows = buildPrimaryRows(license);
1456
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1498
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1457
1499
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-col border-b border-gray-100 pb-6", children: [
1458
1500
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl font-bold text-gray-900", children: title }),
1459
1501
  description ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-gray-600", children: description }) : null
@@ -1467,7 +1509,6 @@ var LicenseDetails = async ({
1467
1509
  ] })
1468
1510
  ] });
1469
1511
  };
1470
- var defaultHiddenLabels = ["Download"];
1471
1512
  var defaultTopNavLinks = [
1472
1513
  {
1473
1514
  label: "Dashboard",
@@ -1480,16 +1521,21 @@ var defaultTopNavLinks = [
1480
1521
  className: "h-4 w-4",
1481
1522
  fill: "none",
1482
1523
  stroke: "currentColor",
1483
- strokeWidth: "1.5",
1524
+ strokeWidth: "2",
1525
+ strokeLinecap: "round",
1526
+ strokeLinejoin: "round",
1484
1527
  children: [
1485
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 13h6V3H4z" }),
1486
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M14 21h6V3h-6z" })
1528
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "7", height: "9", x: "3", y: "3", rx: "1" }),
1529
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "7", height: "5", x: "14", y: "3", rx: "1" }),
1530
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "7", height: "9", x: "14", y: "12", rx: "1" }),
1531
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "7", height: "5", x: "3", y: "16", rx: "1" })
1487
1532
  ]
1488
1533
  }
1489
1534
  )
1490
1535
  },
1491
1536
  {
1492
- label: "Download",
1537
+ label: "Install",
1538
+ href: "/install",
1493
1539
  icon: /* @__PURE__ */ jsxRuntime.jsxs(
1494
1540
  "svg",
1495
1541
  {
@@ -1498,18 +1544,20 @@ var defaultTopNavLinks = [
1498
1544
  className: "h-4 w-4",
1499
1545
  fill: "none",
1500
1546
  stroke: "currentColor",
1501
- strokeWidth: "1.5",
1547
+ strokeWidth: "2",
1548
+ strokeLinecap: "round",
1549
+ strokeLinejoin: "round",
1502
1550
  children: [
1503
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 3v12" }),
1504
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m7 11 5 5 5-5" }),
1505
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 21h14" })
1551
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
1552
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "7 10 12 15 17 10" }),
1553
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", x2: "12", y1: "15", y2: "3" })
1506
1554
  ]
1507
1555
  }
1508
1556
  )
1509
1557
  },
1510
1558
  {
1511
- label: "Install",
1512
- href: "/install",
1559
+ label: "Update",
1560
+ href: "/update",
1513
1561
  icon: /* @__PURE__ */ jsxRuntime.jsxs(
1514
1562
  "svg",
1515
1563
  {
@@ -1518,18 +1566,20 @@ var defaultTopNavLinks = [
1518
1566
  className: "h-4 w-4",
1519
1567
  fill: "none",
1520
1568
  stroke: "currentColor",
1521
- strokeWidth: "1.5",
1569
+ strokeWidth: "2",
1570
+ strokeLinecap: "round",
1571
+ strokeLinejoin: "round",
1522
1572
  children: [
1523
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 5v14" }),
1524
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 12h14" })
1573
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }),
1574
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 3v5h-5" })
1525
1575
  ]
1526
1576
  }
1527
1577
  )
1528
1578
  },
1529
1579
  {
1530
- label: "Update",
1531
- href: "/update",
1532
- icon: /* @__PURE__ */ jsxRuntime.jsxs(
1580
+ label: "Security",
1581
+ href: "/security",
1582
+ icon: /* @__PURE__ */ jsxRuntime.jsx(
1533
1583
  "svg",
1534
1584
  {
1535
1585
  xmlns: "http://www.w3.org/2000/svg",
@@ -1537,12 +1587,10 @@ var defaultTopNavLinks = [
1537
1587
  className: "h-4 w-4",
1538
1588
  fill: "none",
1539
1589
  stroke: "currentColor",
1540
- strokeWidth: "1.5",
1541
- children: [
1542
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 4v6h6" }),
1543
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 20v-6h-6" }),
1544
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4 10c1.5-4 6-6 10-4m6 4c-1.5 4-6 6-10 4" })
1545
- ]
1590
+ strokeWidth: "2",
1591
+ strokeLinecap: "round",
1592
+ strokeLinejoin: "round",
1593
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" })
1546
1594
  }
1547
1595
  )
1548
1596
  },
@@ -1557,10 +1605,15 @@ var defaultTopNavLinks = [
1557
1605
  className: "h-4 w-4",
1558
1606
  fill: "none",
1559
1607
  stroke: "currentColor",
1560
- strokeWidth: "1.5",
1608
+ strokeWidth: "2",
1609
+ strokeLinecap: "round",
1610
+ strokeLinejoin: "round",
1561
1611
  children: [
1562
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 8v4l3 2" }),
1563
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9" })
1612
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
1613
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
1614
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 9H8" }),
1615
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 13H8" }),
1616
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 17H8" })
1564
1617
  ]
1565
1618
  }
1566
1619
  )
@@ -1576,12 +1629,13 @@ var defaultTopNavLinks = [
1576
1629
  className: "h-4 w-4",
1577
1630
  fill: "none",
1578
1631
  stroke: "currentColor",
1579
- strokeWidth: "1.5",
1632
+ strokeWidth: "2",
1633
+ strokeLinecap: "round",
1634
+ strokeLinejoin: "round",
1580
1635
  children: [
1581
- /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "14", height: "18", x: "5", y: "3", rx: "2" }),
1582
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 7h6" }),
1583
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 11h6" }),
1584
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 15h6" })
1636
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
1637
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m21 2-9.6 9.6" }),
1638
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })
1585
1639
  ]
1586
1640
  }
1587
1641
  )
@@ -1597,10 +1651,16 @@ var defaultTopNavLinks = [
1597
1651
  className: "h-4 w-4",
1598
1652
  fill: "none",
1599
1653
  stroke: "currentColor",
1600
- strokeWidth: "1.5",
1654
+ strokeWidth: "2",
1655
+ strokeLinecap: "round",
1656
+ strokeLinejoin: "round",
1601
1657
  children: [
1602
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 16a6 6 0 1 0-12 0v2h12Z" }),
1603
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "7", r: "4" })
1658
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
1659
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m4.93 4.93 4.24 4.24" }),
1660
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m14.83 9.17 4.24-4.24" }),
1661
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m14.83 14.83 4.24 4.24" }),
1662
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9.17 14.83-4.24 4.24" }),
1663
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "4" })
1604
1664
  ]
1605
1665
  }
1606
1666
  )
@@ -1686,8 +1746,7 @@ var TopNav = async ({
1686
1746
  console.debug("[portal-components] branding fetch failed", error);
1687
1747
  }
1688
1748
  const baseLinks = links ?? defaultTopNavLinks;
1689
- const computedHiddenLabels = hiddenLabels ? hiddenLabels : links ? void 0 : defaultHiddenLabels;
1690
- const hiddenSet = computedHiddenLabels ? new Set(computedHiddenLabels) : null;
1749
+ const hiddenSet = hiddenLabels ? new Set(hiddenLabels) : null;
1691
1750
  let resolvedLinks = baseLinks.filter(
1692
1751
  (link) => !hiddenSet?.has(link.label)
1693
1752
  );
@@ -1700,7 +1759,7 @@ var TopNav = async ({
1700
1759
  return /* @__PURE__ */ jsxRuntime.jsx(
1701
1760
  "div",
1702
1761
  {
1703
- className: "relative flex h-[165px] w-full items-start justify-center",
1762
+ className: "relative flex h-[280px] w-full items-start justify-center",
1704
1763
  style: {
1705
1764
  backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0) 33%), linear-gradient(${gradientStart}, ${gradientEnd})`,
1706
1765
  backgroundRepeat: "no-repeat",
@@ -1727,7 +1786,7 @@ var TopNav = async ({
1727
1786
  brandTitle ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold text-gray-900", children: brandTitle }) : null
1728
1787
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", {}),
1729
1788
  /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "group relative", children: [
1730
- /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 list-none", children: [
1789
+ /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 list-none", children: [
1731
1790
  /* @__PURE__ */ jsxRuntime.jsxs(
1732
1791
  "svg",
1733
1792
  {
@@ -1799,12 +1858,12 @@ var TopNav = async ({
1799
1858
  const className = `flex items-center gap-2 px-4 py-1 transition text-gray-500 ${isActive ? "underline underline-offset-8 decoration-2" : ""}`;
1800
1859
  if (href) {
1801
1860
  return /* @__PURE__ */ jsxRuntime.jsxs(Link__default.default, { href, className, children: [
1802
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1861
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1803
1862
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
1804
1863
  ] }, label);
1805
1864
  }
1806
1865
  return /* @__PURE__ */ jsxRuntime.jsxs("button", { className, type: "button", children: [
1807
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1866
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1808
1867
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
1809
1868
  ] }, label);
1810
1869
  }) })
@@ -1812,7 +1871,7 @@ var TopNav = async ({
1812
1871
  }
1813
1872
  );
1814
1873
  };
1815
- var GlobeIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1874
+ var GlobeIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
1816
1875
  "svg",
1817
1876
  {
1818
1877
  xmlns: "http://www.w3.org/2000/svg",
@@ -1820,16 +1879,14 @@ var GlobeIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1820
1879
  fill: "none",
1821
1880
  stroke: "currentColor",
1822
1881
  strokeWidth: 1.5,
1882
+ strokeLinecap: "round",
1883
+ strokeLinejoin: "round",
1823
1884
  "aria-hidden": "true",
1824
1885
  ...props,
1825
- children: [
1826
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 12, cy: 12, r: 10 }),
1827
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 12h20" }),
1828
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10Z" })
1829
- ]
1886
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" })
1830
1887
  }
1831
1888
  );
1832
- var AirGapIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1889
+ var AirGapIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
1833
1890
  "svg",
1834
1891
  {
1835
1892
  xmlns: "http://www.w3.org/2000/svg",
@@ -1837,15 +1894,11 @@ var AirGapIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1837
1894
  fill: "none",
1838
1895
  stroke: "currentColor",
1839
1896
  strokeWidth: 1.5,
1897
+ strokeLinecap: "round",
1898
+ strokeLinejoin: "round",
1840
1899
  "aria-hidden": "true",
1841
1900
  ...props,
1842
- children: [
1843
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m4 4 16 16" }),
1844
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.5 4.5a8 8 0 0 1 9 0" }),
1845
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4.5 7.5a8 8 0 0 0 0 9" }),
1846
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.5 19.5a8 8 0 0 0 0-9" }),
1847
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 12a5 5 0 0 0 5 5" })
1848
- ]
1901
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M13.181 8.68a4.503 4.503 0 0 1 1.903 6.405m-9.768-2.782L3.56 14.06a4.5 4.5 0 0 0 6.364 6.365l3.129-3.129m5.614-5.615 1.757-1.757a4.5 4.5 0 0 0-6.364-6.365l-4.5 4.5c-.258.26-.479.541-.661.84m1.903 6.405a4.495 4.495 0 0 1-1.242-.88 4.483 4.483 0 0 1-1.062-1.683m6.587 2.345 5.907 5.907m-5.907-5.907L8.898 8.898M2.991 2.99 8.898 8.9" })
1849
1902
  }
1850
1903
  );
1851
1904
  var baseCardClass = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -1886,7 +1939,7 @@ var UpdatesCard = ({
1886
1939
  /* @__PURE__ */ jsxRuntime.jsx("footer", { className: footerClass, children: /* @__PURE__ */ jsxRuntime.jsx(Link__default.default, { href: "/update", children: "View updates \u2192" }) })
1887
1940
  ] });
1888
1941
  UpdatesCard.displayName = "UpdatesCard";
1889
- var UploadIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1942
+ var UploadIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
1890
1943
  "svg",
1891
1944
  {
1892
1945
  xmlns: "http://www.w3.org/2000/svg",
@@ -1894,13 +1947,11 @@ var UploadIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
1894
1947
  fill: "none",
1895
1948
  stroke: "currentColor",
1896
1949
  strokeWidth: 1.5,
1950
+ strokeLinecap: "round",
1951
+ strokeLinejoin: "round",
1897
1952
  "aria-hidden": "true",
1898
1953
  ...props,
1899
- children: [
1900
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 16V3" }),
1901
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 7l4-4 4 4" }),
1902
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 21h14" })
1903
- ]
1954
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" })
1904
1955
  }
1905
1956
  );
1906
1957
  var baseCardClass2 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -2307,7 +2358,7 @@ var UserSettingsCard = () => /* @__PURE__ */ jsxRuntime.jsxs("section", { classN
2307
2358
  /* @__PURE__ */ jsxRuntime.jsx("footer", { className: footerClass3, children: /* @__PURE__ */ jsxRuntime.jsx(Link__default.default, { href: "/user-settings", children: "View user settings \u2192" }) })
2308
2359
  ] });
2309
2360
  UserSettingsCard.displayName = "UserSettingsCard";
2310
- var UsersIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
2361
+ var UsersIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
2311
2362
  "svg",
2312
2363
  {
2313
2364
  xmlns: "http://www.w3.org/2000/svg",
@@ -2315,17 +2366,14 @@ var UsersIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
2315
2366
  fill: "none",
2316
2367
  stroke: "currentColor",
2317
2368
  strokeWidth: 1.5,
2369
+ strokeLinecap: "round",
2370
+ strokeLinejoin: "round",
2318
2371
  "aria-hidden": "true",
2319
2372
  ...props,
2320
- children: [
2321
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }),
2322
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 10, cy: 8, r: 4 }),
2323
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 21v-2a4 4 0 0 0-3-3.87" }),
2324
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17 3a4 4 0 0 1 0 8" })
2325
- ]
2373
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" })
2326
2374
  }
2327
2375
  );
2328
- var KeyIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
2376
+ var KeyIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
2329
2377
  "svg",
2330
2378
  {
2331
2379
  xmlns: "http://www.w3.org/2000/svg",
@@ -2333,13 +2381,11 @@ var KeyIcon = (props) => /* @__PURE__ */ jsxRuntime.jsxs(
2333
2381
  fill: "none",
2334
2382
  stroke: "currentColor",
2335
2383
  strokeWidth: 1.5,
2384
+ strokeLinecap: "round",
2385
+ strokeLinejoin: "round",
2336
2386
  "aria-hidden": "true",
2337
2387
  ...props,
2338
- children: [
2339
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: 7, cy: 15, r: 4 }),
2340
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m10.85 12.15 4.3-4.3a2 2 0 0 1 2.83 0l.47.47a2 2 0 0 1 0 2.83l-4.3 4.3" }),
2341
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 11l1.5 1.5" })
2342
- ]
2388
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z" })
2343
2389
  }
2344
2390
  );
2345
2391
  var baseCardClass4 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -2402,6 +2448,7 @@ exports.deleteSupportBundle = deleteSupportBundle;
2402
2448
  exports.downloadSupportBundle = downloadSupportBundle;
2403
2449
  exports.fetchCurrentUser = fetchCurrentUser;
2404
2450
  exports.fetchCustomBranding = fetchCustomBranding;
2451
+ exports.fetchDashboardComposite = fetchDashboardComposite;
2405
2452
  exports.fetchLicenseDetails = fetchLicenseDetails;
2406
2453
  exports.fetchNotifications = fetchNotifications;
2407
2454
  exports.getCustomerIdFromToken = getCustomerIdFromToken;